Skip to content

Commit a87e7df

Browse files
committed
Added decision table-driven tests for discard.
1 parent ef5ad8c commit a87e7df

File tree

2 files changed

+153
-0
lines changed

2 files changed

+153
-0
lines changed

tests/services/discard-1.test.js

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
2+
const { assert } = require('chai');
3+
const { discard } = require('../../lib/services');
4+
5+
describe('common hook discard', () => {
6+
describe('removes fields', () => {
7+
/* eslint-disable */
8+
const beforeJohn = () => ({ type: 'before', data: { first: 'John', last: 'Doe' } });
9+
const beforeUndef = () => ({ type: 'before', data: { first: undefined, last: 'Doe' } });
10+
const beforeNull = () => ({ type: 'before', data: { first: null, last: 'Doe' } });
11+
const afterJane = () => ({ type: 'after', result: { first: 'Jane', last: 'Doe' } });
12+
const afterBoth = () => ({ type: 'after', result: [{ first: 'John', last: 'Doe' }, { first: 'Jane', last: 'Doe' }] });
13+
const afterPage = () => ({ type: 'after', result: { total: 2, skip: 0, data: [{ first: 'John', last: 'Doe' }, { first: 'Jane', last: 'Doe' }] } });
14+
15+
const decisionTable = [
16+
// desc, context, method, provider, args, result
17+
['before::create', beforeJohn(), 'create', null, ['first'], { last: 'Doe' } ],
18+
['after::find with paginate', afterPage(), 'find', null, ['last'], [{ first: 'John' }, { first: 'Jane' }] ],
19+
['after::find no paginate', afterBoth(), 'find', null, ['last'], [{ first: 'John' }, { first: 'Jane' }] ],
20+
['after', afterJane(), 'create', null, ['last'], { first: 'Jane'} ],
21+
['call internally on server', afterJane(), 'create', undefined, ['last'], { first: 'Jane'} ],
22+
['not throw field missing', beforeJohn(), 'create', 'rest', ['first', 'xx'], { last: 'Doe' } ],
23+
['not throw field undefined', beforeUndef(), 'create', 'rest', ['first'], { first: undefined, last: 'Doe' } ], // ???
24+
['not throw field null', beforeNull(), 'create', 'rest', ['first'], { last: 'Doe' } ],
25+
];
26+
/* eslint-enable */
27+
28+
decisionTable.forEach(([desc, context, method, provider, args, result]) => {
29+
it(desc, () => {
30+
context.method = method;
31+
if (provider !== null) {
32+
context.params = context.params || {};
33+
context.params.provider = provider;
34+
}
35+
36+
discard(...args)(context);
37+
assert.deepEqual(context.data ? context.data : context.result.data || context.result, result);
38+
});
39+
});
40+
});
41+
42+
describe('handles dot notation', () => {
43+
/* eslint-disable */
44+
const ctx = () => ({ type: 'before', method: 'create', data: { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' } });
45+
const ctx2 = () => ({ type: 'after', method: 'get', result: { property: null, foo: 'bar' } });
46+
47+
const decisionTable = [
48+
// desc, context, args, result
49+
['handles dots', ctx(), ['dept'], { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' } } ],
50+
['handle 1 dot', ctx(), ['empl.status'], { empl: { name: { first: 'John', last: 'Doe' } }, dept: 'Acct' } ],
51+
['handle 2 dot', ctx(), ['empl.name.first'], { empl: { name: { last: 'Doe' }, status: 'AA' }, dept: 'Acct' } ],
52+
['missing path', ctx(), ['empl.xx.first'], { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' } ],
53+
['missing no dot', ctx(), ['xx'], { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' } ],
54+
['2 fields', ctx(), ['empl.status', 'dept'], { empl: { name: { first: 'John', last: 'Doe' } } } ],
55+
['path not obj', ctx2(), ['property.secret'], { property: null, foo: 'bar' } ],
56+
];
57+
/* eslint-enable */
58+
59+
decisionTable.forEach(([desc, context, args, result]) => {
60+
it(desc, () => {
61+
discard(...args)(context);
62+
assert.deepEqual(context.data ? context.data : context.result.data || context.result, result);
63+
});
64+
});
65+
});
66+
});

tests/services/discard-2.test.js

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
2+
const { assert } = require('chai');
3+
const { discard } = require('../../lib/services');
4+
5+
describe('common hook discard', () => {
6+
describe('removes fields', () => {
7+
/* eslint-disable */
8+
const beforeJohn = () => ({ type: 'before', data: { first: 'John', last: 'Doe' } });
9+
const beforeUndef = () => ({ type: 'before', data: { first: undefined, last: 'Doe' } });
10+
const beforeNull = () => ({ type: 'before', data: { first: null, last: 'Doe' } });
11+
const afterJane = () => ({ type: 'after', result: { first: 'Jane', last: 'Doe' } });
12+
const afterBoth = () => ({ type: 'after', result: [{ first: 'John', last: 'Doe' }, { first: 'Jane', last: 'Doe' }] });
13+
const afterPage = () => ({ type: 'after', result: { total: 2, skip: 0, data: [{ first: 'John', last: 'Doe' }, { first: 'Jane', last: 'Doe' }] } });
14+
15+
const decisionTable = [
16+
// desc, context, method, provider, args, result
17+
['before::create', beforeJohn(), 'create', undefined, ['first'], { last: 'Doe' } ],
18+
['before::create', beforeJohn(), 'create', 'rest', ['first'], { last: 'Doe' } ],
19+
['before::create', beforeJohn(), 'create', 'socketio',['first'], { last: 'Doe' } ],
20+
['before::create', beforeJohn(), 'create', 'primus', ['first'], { last: 'Doe' } ],
21+
['after::find with paginate', afterPage(), 'find', undefined, ['last'], [{ first: 'John' }, { first: 'Jane' }] ],
22+
['after::find with paginate', afterPage(), 'find', 'rest', ['last'], [{ first: 'John' }, { first: 'Jane' }] ],
23+
['after::find with paginate', afterPage(), 'find', 'socketio',['last'], [{ first: 'John' }, { first: 'Jane' }] ],
24+
['after::find with paginate', afterPage(), 'find', 'primus', ['last'], [{ first: 'John' }, { first: 'Jane' }] ],
25+
['after::find no paginate', afterBoth(), 'find', undefined, ['last'], [{ first: 'John' }, { first: 'Jane' }] ],
26+
['after::find no paginate', afterBoth(), 'find', 'rest', ['last'], [{ first: 'John' }, { first: 'Jane' }] ],
27+
['after::find no paginate', afterBoth(), 'find', 'socketio',['last'], [{ first: 'John' }, { first: 'Jane' }] ],
28+
['after::find no paginate', afterBoth(), 'find', 'primus', ['last'], [{ first: 'John' }, { first: 'Jane' }] ],
29+
['after', afterJane(), 'create', undefined, ['last'], { first: 'Jane'} ],
30+
['after', afterJane(), 'create', 'rest', ['last'], { first: 'Jane'} ],
31+
['after', afterJane(), 'create', 'socketio',['last'], { first: 'Jane'} ],
32+
['after', afterJane(), 'create', 'primus', ['last'], { first: 'Jane'} ],
33+
['call internally on server', afterJane(), 'create', undefined, ['last'], { first: 'Jane'} ],
34+
['not throw field missing', beforeJohn(), 'create', undefined, ['first', 'xx'], { last: 'Doe' } ],
35+
['not throw field missing', beforeJohn(), 'create', 'rest', ['first', 'xx'], { last: 'Doe' } ],
36+
['not throw field missing', beforeJohn(), 'create', 'socketio',['first', 'xx'], { last: 'Doe' } ],
37+
['not throw field missing', beforeJohn(), 'create', 'primus', ['first', 'xx'], { last: 'Doe' } ],
38+
['not throw field undefined', beforeUndef(), 'create', undefined, ['first'], { first: undefined, last: 'Doe' } ], // ???
39+
['not throw field undefined', beforeUndef(), 'create', 'rest', ['first'], { first: undefined, last: 'Doe' } ], // ???
40+
['not throw field undefined', beforeUndef(), 'create', 'socketio',['first'], { first: undefined, last: 'Doe' } ], // ???
41+
['not throw field undefined', beforeUndef(), 'create', 'primus', ['first'], { first: undefined, last: 'Doe' } ], // ???
42+
['not throw field null', beforeNull(), 'create', undefined, ['first'], { last: 'Doe' } ],
43+
['not throw field null', beforeNull(), 'create', 'rest', ['first'], { last: 'Doe' } ],
44+
['not throw field null', beforeNull(), 'create', 'socketio',['first'], { last: 'Doe' } ],
45+
['not throw field null', beforeNull(), 'create', 'promus', ['first'], { last: 'Doe' } ],
46+
];
47+
/* eslint-enable */
48+
49+
decisionTable.forEach(([desc, context, method, provider, args, result]) => {
50+
it(desc, () => {
51+
context.method = method;
52+
if (provider !== null) {
53+
context.params = context.params || {};
54+
context.params.provider = provider;
55+
}
56+
57+
discard(...args)(context);
58+
assert.deepEqual(context.data ? context.data : context.result.data || context.result, result);
59+
});
60+
});
61+
});
62+
63+
describe('handles dot notation', () => {
64+
/* eslint-disable */
65+
const ctx = () => ({ type: 'before', method: 'create', data: { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' } });
66+
const ctx2 = () => ({ type: 'after', method: 'get', result: { property: null, foo: 'bar' } });
67+
68+
const decisionTable = [
69+
// desc, context, args, result
70+
['handles dots', ctx(), ['dept'], { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' } } ],
71+
['handle 1 dot', ctx(), ['empl.status'], { empl: { name: { first: 'John', last: 'Doe' } }, dept: 'Acct' } ],
72+
['handle 2 dot', ctx(), ['empl.name.first'], { empl: { name: { last: 'Doe' }, status: 'AA' }, dept: 'Acct' } ],
73+
['missing path', ctx(), ['empl.xx.first'], { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' } ],
74+
['missing no dot', ctx(), ['xx'], { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' } ],
75+
['2 fields', ctx(), ['empl.status', 'dept'], { empl: { name: { first: 'John', last: 'Doe' } } } ],
76+
['path not obj', ctx2(), ['property.secret'], { property: null, foo: 'bar' } ],
77+
];
78+
/* eslint-enable */
79+
80+
decisionTable.forEach(([desc, context, args, result]) => {
81+
it(desc, () => {
82+
discard(...args)(context);
83+
assert.deepEqual(context.data ? context.data : context.result.data || context.result, result);
84+
});
85+
});
86+
});
87+
});

0 commit comments

Comments
 (0)