Skip to content

Commit 36307fd

Browse files
authored
Migrating tests for getAuthorizedFields (#19)
1 parent 7afd044 commit 36307fd

4 files changed

Lines changed: 130 additions & 49 deletions

File tree

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
const mongoose = require('mongoose');
2+
3+
const bareBonesSchema = new mongoose.Schema({});
4+
bareBonesSchema.permissions = {
5+
admin: {
6+
read: ['address', 'phone', 'birthday', 'does_not_exist'],
7+
write: ['address', 'phone', 'birthday', 'not_here_either'],
8+
create: true,
9+
remove: true,
10+
},
11+
};
12+
13+
module.exports = bareBonesSchema;
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
const mongoose = require('mongoose');
2+
3+
const goodSchema = new mongoose.Schema({
4+
name: String,
5+
address: String,
6+
phone: String,
7+
birthday: String,
8+
nested: { thing: String },
9+
});
10+
goodSchema.permissions = {
11+
defaults: {
12+
read: ['_id', 'name'],
13+
write: [],
14+
create: false,
15+
},
16+
admin: {
17+
read: ['address', 'phone', 'birthday'],
18+
write: ['address', 'phone', 'birthday'],
19+
create: true,
20+
remove: true,
21+
},
22+
self: {
23+
read: ['address', 'phone', 'birthday'],
24+
write: ['address', 'phone'],
25+
},
26+
stranger: {},
27+
hasVirtuals: {
28+
read: ['virtual_name'],
29+
},
30+
nested_top: {
31+
read: ['nested'],
32+
},
33+
nested_deep: {
34+
read: ['nested.thing'],
35+
},
36+
};
37+
goodSchema.virtual('virtual_name').get(function getVirtualName() {
38+
return `virtual${this.name}`;
39+
});
40+
goodSchema.getAuthLevel = function getAuthLevel(payload) {
41+
return payload && payload.authLevel;
42+
};
43+
44+
module.exports = goodSchema;
Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,75 @@
11
const test = require('ava');
2+
const goodSchema = require('./exampleSchemas/goodSchema');
3+
const bareBonesSchema = require('./exampleSchemas/bareBonesSchema');
4+
const getAuthorizedFields = require('../src/getAuthorizedFields');
25

3-
test.todo('Migrate tests for getAuthorizedFields');
6+
test('No authorized fields', (t) => {
7+
t.deepEqual(
8+
getAuthorizedFields(bareBonesSchema, 'foobar', 'read'),
9+
[],
10+
);
11+
});
12+
13+
test('Handles non-existent authLevels', (t) => {
14+
t.deepEqual(
15+
getAuthorizedFields(goodSchema, ['defaults', 'foobar'], 'read').sort(),
16+
['_id', 'name'].sort(),
17+
);
18+
});
19+
20+
test('Combines basic authLevel permissions', (t) => {
21+
t.deepEqual(
22+
getAuthorizedFields(goodSchema, ['defaults', 'admin'], 'read').sort(),
23+
['_id', 'name', 'address', 'phone', 'birthday'].sort(),
24+
);
25+
});
26+
27+
test('Handles authLevels that have no permissions specified', (t) => {
28+
t.deepEqual(
29+
getAuthorizedFields(goodSchema, ['defaults', 'stranger'], 'read').sort(),
30+
['_id', 'name'].sort(),
31+
);
32+
});
33+
34+
test('Correctly deduping fields that are mentioned in multiple authLevels', (t) => {
35+
t.deepEqual(
36+
getAuthorizedFields(goodSchema, ['defaults', 'self', 'admin'], 'read').sort(),
37+
['_id', 'name', 'address', 'phone', 'birthday'].sort(),
38+
);
39+
});
40+
41+
test('Handles basic write permissions', (t) => {
42+
t.deepEqual(
43+
getAuthorizedFields(goodSchema, ['defaults', 'self'], 'write').sort(),
44+
['address', 'phone'].sort(),
45+
);
46+
});
47+
48+
test('Handles authorized fields that are not in the schema', (t) => {
49+
t.deepEqual(
50+
getAuthorizedFields(bareBonesSchema, 'admin', 'write'),
51+
[],
52+
);
53+
});
54+
55+
test('Virtual fields are correctly returned', (t) => {
56+
t.deepEqual(
57+
getAuthorizedFields(goodSchema, ['defaults', 'hasVirtuals'], 'read').sort(),
58+
['_id', 'name', 'virtual_name'].sort(),
59+
);
60+
});
61+
62+
test('Top level nested field should be ok as authorized field', (t) => {
63+
t.deepEqual(
64+
getAuthorizedFields(goodSchema, ['defaults', 'nested_top'], 'read').sort(),
65+
['_id', 'name', 'nested'].sort(),
66+
'top level nested field should be ok as authorized field',
67+
);
68+
});
69+
test('Deeply nested field should be ok as authorized field', (t) => {
70+
t.deepEqual(
71+
getAuthorizedFields(goodSchema, ['defaults', 'nested_deep'], 'read').sort(),
72+
['_id', 'name', 'nested.thing'].sort(),
73+
'deeply nested field should be ok as authorized field',
74+
);
75+
});

test/helpers.test.js

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
const mongoose = require('mongoose');
22

33
const resolveAuthLevel = require('../src/resolveAuthLevel');
4-
const getAuthorizedFields = require('../src/getAuthorizedFields');
54
const hasPermission = require('../src/hasPermission');
65
const getUpdatePaths = require('../src/getUpdatePaths');
76

@@ -154,53 +153,6 @@ module.exports = {
154153
test.done();
155154
},
156155
},
157-
getAuthorizedFields(test) {
158-
test.deepEqual(
159-
getAuthorizedFields(bareBonesSchema, 'foobar', 'read'),
160-
[],
161-
);
162-
test.deepEqual(
163-
getAuthorizedFields(goodSchema, ['defaults', 'foobar'], 'read').sort(),
164-
['_id', 'name'].sort(),
165-
);
166-
test.deepEqual(
167-
getAuthorizedFields(goodSchema, ['defaults', 'admin'], 'read').sort(),
168-
['_id', 'name', 'address', 'phone', 'birthday'].sort(),
169-
);
170-
test.deepEqual(
171-
getAuthorizedFields(goodSchema, ['defaults', 'stranger'], 'read').sort(),
172-
['_id', 'name'].sort(),
173-
);
174-
test.deepEqual(
175-
getAuthorizedFields(goodSchema, ['defaults', 'self', 'admin'], 'read').sort(),
176-
['_id', 'name', 'address', 'phone', 'birthday'].sort(),
177-
);
178-
test.deepEqual(
179-
getAuthorizedFields(goodSchema, ['defaults', 'self'], 'write').sort(),
180-
['address', 'phone'].sort(),
181-
);
182-
test.deepEqual(
183-
getAuthorizedFields(bareBonesSchema, 'admin', 'write'),
184-
[],
185-
);
186-
test.deepEqual(
187-
getAuthorizedFields(goodSchema, ['defaults', 'hasVirtuals'], 'read').sort(),
188-
['_id', 'name', 'virtual_name'].sort(),
189-
'virtuals should be included in the list of fields',
190-
);
191-
test.deepEqual(
192-
getAuthorizedFields(goodSchema, ['defaults', 'nested_top'], 'read').sort(),
193-
['_id', 'name', 'nested'].sort(),
194-
'top level nested field should be ok as authorized field',
195-
);
196-
test.deepEqual(
197-
getAuthorizedFields(goodSchema, ['defaults', 'nested_deep'], 'read').sort(),
198-
['_id', 'name', 'nested.thing'].sort(),
199-
'deeply nested field should be ok as authorized field',
200-
);
201-
202-
test.done();
203-
},
204156
hasPermission(test) {
205157
test.equal(
206158
hasPermission(bareBonesSchema, undefined, 'create'),

0 commit comments

Comments
 (0)