Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit a5449ac

Browse files
committed
refactor data manipulation of logs and add tests
1 parent 45aa257 commit a5449ac

File tree

7 files changed

+130
-54
lines changed

7 files changed

+130
-54
lines changed

app/.meteor/packages

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,4 @@ practicalmeteor:mocha
4444
semantic:ui-css@=2.1.2
4545
iandouglas:accounts-ui-semantic-ui
4646
useraccounts:flow-routing
47+
xolvio:cleaner

app/.meteor/versions

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,4 @@ useraccounts:[email protected]
127127
useraccounts:[email protected]
128128
129129
130+

app/client/templates/admin.html

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,21 @@
2727
</template>
2828

2929
<template name="admin_error_button">
30-
<button id="errorButton" class="button item" value={{orgLog._id}}>Show Error</button>
30+
<button id="errorButton" class="button item" value={{_id}}>Show Error</button>
3131
</template>
3232

3333
<template name="admin_success_status">
34-
{{#if isSuccess orgLog.statusCode}}
34+
<div>
35+
{{#if isSuccess statusCode}}
3536
<div class="ui label">
36-
<i class="big green checkmark icon"></i> {{orgLog.statusCode}}
37+
<i class="big green checkmark icon"></i> {{statusCode}}
3738
</div>
3839
{{else}}
3940
<div class="ui label">
40-
<i class="big red minus icon"></i> {{orgLog.statusCode}}
41+
<i class="big red minus icon"></i> {{statusCode}}
4142
</div>
4243
{{/if}}
44+
</div>
4345
</template>
4446

4547
<template name="admin_organisations">

app/client/templates/admin.js

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,13 @@ Template.admin_users.helpers({
5555
}
5656
});
5757

58-
Template.admin_organisations.helpers({
58+
Template.admin_success_status.helpers({
5959
isSuccess: function(statusCode) {
6060
return 200 == statusCode;
61-
},
61+
}
62+
});
6263

64+
Template.admin_organisations.helpers({
6365
settings: function() {
6466
return {
6567
onDelete: function(params) {
@@ -69,16 +71,15 @@ Template.admin_organisations.helpers({
6971
rowsPerPage: 10,
7072
showFilter: true,
7173
fields: [
72-
{ key: 'orgLog.statusCode', label: 'Success', tmpl: Template.admin_success_status },
73-
{ key: 'orgLog.lastSuccess', label: 'Last success' },
74-
{ key: 'orgLog.url', label: 'URL' },
75-
{ key: 'orgLog.statusCode', label: 'status code' },
76-
{ key: 'orgLog.error', label: 'Error', tmpl: Template.error_view },
74+
{ key: 'statusCode', label: 'Success', tmpl: Template.admin_success_status },
75+
{ key: 'lastSuccess', label: 'Last success' },
76+
{ key: 'url', label: 'URL' },
77+
{ key: 'error', label: 'Error', tmpl: Template.admin_error_button },
7778
]
7879
};
7980
},
8081
orgLogs: function() {
81-
return App.Collections.OrgLogs.find({}).fetch();
82+
return App.Collections.OrgLogs;
8283
}
8384
})
8485

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import { Meteor } from 'meteor/meteor';
2+
import { chai } from 'meteor/practicalmeteor:chai';
3+
import logs from '../../../lib/collections/OrgLogs.js';
4+
import { resetDatabase } from 'meteor/xolvio:cleaner';
5+
6+
const TEST_URL = 'http://example.com/api';
7+
8+
beforeEach(function() {
9+
resetDatabase();
10+
});
11+
12+
describe('OrgLogs', function () {
13+
function skip_client(name, callback) {
14+
if(!Meteor.isClient) {
15+
it(name, callback);
16+
}
17+
}
18+
19+
skip_client('adding a new successful log', function () {
20+
var newLog = logs.createNewSuccessLog(TEST_URL, {payload: 'some string'});
21+
logs.createOrUpdateLog(newLog);
22+
23+
var entry = logs.OrgLogs.findOne({url: TEST_URL});
24+
chai.assert.equal(entry.statusCode, 200);
25+
chai.assert.instanceOf(entry.lastSuccess, Date);
26+
});
27+
28+
skip_client('adding a new log with error', function () {
29+
var newLog = logs.createNewErrorLog(TEST_URL, {response: {statusCode: 404}});
30+
logs.createOrUpdateLog(newLog);
31+
var entry = logs.OrgLogs.findOne({url: TEST_URL});
32+
chai.assert.equal(entry.statusCode, 404);
33+
chai.assert.equal(entry.lastSuccess, null);
34+
});
35+
36+
skip_client('error log followed by successful log', function() {
37+
var errorLog = logs.createNewErrorLog(TEST_URL, {response: {statusCode: 404}});
38+
var successLog = logs.createNewSuccessLog(TEST_URL, {payload: 'some string'});
39+
40+
logs.createOrUpdateLog(errorLog);
41+
logs.createOrUpdateLog(successLog);
42+
43+
var entry = logs.OrgLogs.findOne({url: TEST_URL});
44+
chai.assert.equal(entry.statusCode, 200);
45+
chai.assert.instanceOf(entry.lastSuccess, Date);
46+
chai.assert.equal(entry.errorMessage, null);
47+
chai.assert.equal(entry.data.payload, 'some string');
48+
});
49+
50+
skip_client('failure count updated', function() {
51+
var errorLog = logs.createNewErrorLog(TEST_URL, {response: {statusCode: 404}});
52+
logs.createOrUpdateLog(errorLog);
53+
logs.createOrUpdateLog(errorLog);
54+
logs.createOrUpdateLog(errorLog);
55+
var entry = logs.OrgLogs.findOne({url: TEST_URL});
56+
chai.assert.equal(entry.failureCount, 3);
57+
});
58+
59+
});

app/lib/collections/OrgLogs.js

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,59 @@ var OrgLogsSchema = new SimpleSchema({
1717
},
1818
data: {
1919
type: Object,
20-
optional: true
20+
optional: true,
21+
blackbox: true
2122
},
2223
errorMessage: {
2324
type: Object,
2425
optional: true,
25-
defaultValue: {}
26+
blackbox: true
27+
},
28+
failureCount: {
29+
type: Number,
30+
optional: true,
31+
defaultValue: 0
2632
}
2733
});
2834

29-
App.Collections.OrgLogs = new Mongo.Collection('orgLogs');
35+
OrgLogs = new Mongo.Collection('orgLogs');
36+
OrgLogs.attachSchema(OrgLogsSchema);
37+
38+
function createNewSuccessLog(url, data) {
39+
return {
40+
statusCode: 200,
41+
url: url,
42+
data: data,
43+
errorMessage: null,
44+
lastSuccess: new Date()
45+
};
46+
}
47+
48+
function createNewErrorLog(url, e) {
49+
var statusCode = null;
50+
if (e.response) {
51+
statusCode = e.response.statusCode;
52+
}
53+
return {
54+
statusCode: statusCode,
55+
url: url,
56+
data: null,
57+
// clone to plain object to get rid of tricky native properties
58+
errorMessage: JSON.parse(JSON.stringify(e)),
59+
lastSuccess: null
60+
};
61+
}
62+
63+
function createOrUpdateLog(newLog) {
64+
OrgLogs.upsert({ url: newLog.url }, {$set: newLog});
65+
OrgLogs.update({url: newLog.url }, {$inc: {failureCount: 1}});
66+
}
67+
68+
App.Collections.OrgLogs = OrgLogs;
3069

31-
App.Collections.OrgLogs.attachSchema(OrgLogsSchema);
70+
export default {
71+
OrgLogs,
72+
createNewSuccessLog,
73+
createNewErrorLog,
74+
createOrUpdateLog
75+
};

app/server/init.js

Lines changed: 6 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import logs from '../lib/collections/OrgLogs.js';
2+
13
function oauthConfig(service, clientId, secret) {
24
check(service, String);
35
check(clientId, String);
@@ -16,50 +18,16 @@ function initOrgs() {
1618
var directory = Meteor.http.call("GET", "http://spaceapi.net/directory.json?api=0.13");
1719
var urls = Object.keys(directory.data).map(function(k) {
1820
if (!App.Collections.Orgs.findOne({ space: k })) {
19-
2021
Meteor.defer(function() {
21-
// Execute http calls asynchronously so we don't block execution for client inbound client request
22-
// Meteor.defer = Meteor.setTimeout(x, 0)
2322
var url = directory.data[k];
24-
25-
var newLog = {
26-
'statusCode': 200,
27-
'url': url,
28-
'data': null,
29-
'errorMessage': {},
30-
'lastSuccess': null
31-
};
32-
23+
var newLog;
3324
try {
3425
var result = Meteor.http.call("GET", url);
35-
newLog.data = JSON.parse(result.content);
36-
newLog.lastSuccess = new Date();
26+
newLog = logs.createNewSuccessLog(url, JSON.parse(result.content));
3727
} catch (e) {
38-
if (e.response) {
39-
newLog.statusCode = e.response.statusCode;
40-
} else {
41-
newLog.statusCode = undefined;
42-
}
43-
newLog.errorMessage = e;
44-
}
45-
46-
var oldLog = App.Collections.OrgLogs.findOne({ 'url': url });
47-
48-
if (!oldLog) {
49-
App.Collections.OrgLogs.insert(newLog);
50-
} else {
51-
var toUpdate = {
52-
'statusCode': newLog.statusCode,
53-
'errorMessage': newLog.errorMessage
54-
};
55-
if(newLog.data instanceof Object) {
56-
toUpdate.data = newLog.data;
57-
}
58-
if(newLog.statusCode == 200){
59-
toUpdate.lastSuccess = new Date();
60-
}
61-
App.Collections.OrgLogs.update({ 'url': url }, { $set: toUpdate });
28+
newLog = logs.createNewErrorLog(url, e);
6229
}
30+
logs.createOrUpdateLog(newLog);
6331

6432
return url;
6533
});

0 commit comments

Comments
 (0)