roles -> role, null -> COMMENTER for user roles

This commit is contained in:
Wyatt Johnson
2017-11-27 11:53:40 -07:00
parent 9386912b9b
commit 13865ff29e
38 changed files with 206 additions and 199 deletions
+1 -1
View File
@@ -13,7 +13,7 @@ describe('graph.Context', () => {
let c;
beforeEach(() => {
c = new Context({user: new User({id: '1', roles: ['ADMIN']})});
c = new Context({user: new User({id: '1', role: 'ADMIN'})});
});
it('creates a context with a user', (done) => {
+2 -2
View File
@@ -46,7 +46,7 @@ describe('graph.loaders.Metrics', () => {
beforeEach(() => ActionModel.create(actions));
it(`returns the correct amount of metrics flagged=${flagged}`, () => {
const context = new Context({user: new UserModel({roles: ['ADMIN']})});
const context = new Context({user: new UserModel({role: 'ADMIN'})});
return graphql(schema, query, {}, context, {
from: (new Date()).setMinutes((new Date()).getMinutes() - 5),
@@ -112,7 +112,7 @@ describe('graph.loaders.Metrics', () => {
beforeEach(() => ActionModel.create(actions));
it(`returns the correct amount of metrics flagged=${flagged}`, () => {
const context = new Context({user: new UserModel({roles: ['ADMIN']})});
const context = new Context({user: new UserModel({role: 'ADMIN'})});
return graphql(schema, query, {}, context, {
from: (new Date()).setMinutes((new Date()).getMinutes() - 5),
+2 -2
View File
@@ -31,7 +31,7 @@ describe('graph.mutations.addTag', () => {
`;
it('moderators can add tags to comments', async () => {
const user = new UserModel({roles: ['MODERATOR']});
const user = new UserModel({role: 'MODERATOR'});
const context = new Context({user});
const res = await graphql(schema, query, {}, context, {id: comment.id, asset_id: asset.id, name: 'BEST'}, 'AddCommentTag');
if (res.errors && res.errors.length) {
@@ -48,7 +48,7 @@ describe('graph.mutations.addTag', () => {
Object.entries({
'anonymous': undefined,
'regular commenter': new UserModel({}),
'banned moderator': new UserModel({roles: ['MODERATOR'], banned: true})
'banned moderator': new UserModel({role: 'MODERATOR', banned: true})
}).forEach(([ userDescription, user ]) => {
it(userDescription, async () => {
const context = new Context({user});
+11 -8
View File
@@ -47,16 +47,19 @@ describe('graph.mutations.changeUsername', () => {
`;
[
{roles: null},
{roles: ['STAFF']},
{roles: []},
{roles: ['MODERATOR']},
{roles: ['ADMIN']},
{roles: ['ADMIN', 'MODERATOR']},
].forEach(({roles}) => {
it(`can change the username with roles ${roles && roles.length ? roles : JSON.stringify(roles)}`, async () => {
{role: 'COMMENTER'},
{role: 'STAFF'},
{role: 'COMMENTER'},
{role: 'MODERATOR'},
{role: 'ADMIN'},
].forEach(({role}) => {
it(`can change the username with roles ${role}`, async () => {
let username = 'spock';
// Update the user role.
await UsersService.setRole(user.id, role);
user.role = role;
let ctx = new Context({user});
let res = await graphql(schema, changeUsernameMutation, {}, ctx, {
+6 -7
View File
@@ -208,15 +208,14 @@ describe('graph.mutations.createComment', () => {
beforeEach(() => AssetModel.create({id: '123'}));
[
{roles: [], tag: null},
{roles: ['ADMIN'], tag: 'STAFF'},
{roles: ['MODERATOR'], tag: 'STAFF'},
{roles: ['ADMIN', 'MODERATOR'], tag: 'STAFF'}
].forEach(({roles, tag}) => {
describe(`user.roles=${JSON.stringify(roles)}`, () => {
{role: 'COMMENTER', tag: null},
{role: 'ADMIN', tag: 'STAFF'},
{role: 'MODERATOR', tag: 'STAFF'},
].forEach(({role, tag}) => {
describe(`user.role=${JSON.stringify(role)}`, () => {
it(`creates comment ${tag ? `with tag=${tag}` : 'without tags'}`, async () => {
const context = new Context({user: new UserModel({roles})});
const context = new Context({user: new UserModel({role})});
const {data, errors} = await graphql(schema, query, {}, context);
+2 -2
View File
@@ -34,7 +34,7 @@ describe('graph.mutations.removeTag', () => {
`;
it('moderators can add remove tags from comments', async () => {
const user = new UserModel({roles: ['MODERATOR']});
const user = new UserModel({role: 'MODERATOR'});
const context = new Context({user});
// add a tag first
@@ -66,7 +66,7 @@ describe('graph.mutations.removeTag', () => {
Object.entries({
'anonymous': undefined,
'regular commenter': new UserModel({}),
'banned moderator': new UserModel({roles: ['MODERATOR'], banned: true})
'banned moderator': new UserModel({role: 'MODERATOR', banned: true})
}).forEach(([userDescription, user]) => {
it(userDescription, async function () {
const context = new Context({user});
+11 -12
View File
@@ -57,18 +57,17 @@ describe('graph.mutations.banUser', () => {
`;
[
{self: true, error: 'NOT_AUTHORIZED', roles: null},
{self: true, error: 'NOT_AUTHORIZED', roles: ['STAFF']},
{self: true, error: 'NOT_AUTHORIZED', roles: []},
{error: 'NOT_AUTHORIZED', roles: null},
{error: 'NOT_AUTHORIZED', roles: ['STAFF']},
{error: 'NOT_AUTHORIZED', roles: []},
{error: false, roles: ['MODERATOR']},
{error: false, roles: ['ADMIN']},
{error: false, roles: ['ADMIN', 'MODERATOR']},
].forEach(({self, error, roles}) => {
it(`${error ? 'can not' : 'can'} ban ${self ? 'themself' : 'another user'} as a user with roles ${roles && roles.length ? roles : JSON.stringify(roles)}`, async () => {
const actor = new UserModel({roles});
{self: true, error: 'NOT_AUTHORIZED', role: 'COMMENTER'},
{self: true, error: 'NOT_AUTHORIZED', role: 'STAFF'},
{self: true, error: 'NOT_AUTHORIZED', role: 'COMMENTER'},
{error: 'NOT_AUTHORIZED', role: 'COMMENTER'},
{error: 'NOT_AUTHORIZED', role: 'STAFF'},
{error: 'NOT_AUTHORIZED', role: 'COMMENTER'},
{error: false, role: 'MODERATOR'},
{error: false, role: 'ADMIN'},
].forEach(({self, error, role}) => {
it(`${error ? 'can not' : 'can'} ban ${self ? 'themself' : 'another user'} as a user with role=${role}`, async () => {
const actor = new UserModel({role});
// If we're testing self assign, set the id of the actor to the user
// we're acting on.
@@ -60,18 +60,17 @@ describe('graph.mutations.suspendUser', () => {
`;
[
{self: true, error: 'NOT_AUTHORIZED', roles: null},
{self: true, error: 'NOT_AUTHORIZED', roles: ['STAFF']},
{self: true, error: 'NOT_AUTHORIZED', roles: []},
{error: 'NOT_AUTHORIZED', roles: null},
{error: 'NOT_AUTHORIZED', roles: ['STAFF']},
{error: 'NOT_AUTHORIZED', roles: []},
{error: false, roles: ['MODERATOR']},
{error: false, roles: ['ADMIN']},
{error: false, roles: ['ADMIN', 'MODERATOR']},
].forEach(({self, error, roles}) => {
it(`${error ? 'can not' : 'can'} suspend ${self ? 'themself' : 'another user'} as a user with roles ${roles && roles.length ? roles : JSON.stringify(roles)}`, async () => {
const actor = new UserModel({roles});
{self: true, error: 'NOT_AUTHORIZED', role: 'COMMENTER'},
{self: true, error: 'NOT_AUTHORIZED', role: 'STAFF'},
{self: true, error: 'NOT_AUTHORIZED', role: 'COMMENTER'},
{error: 'NOT_AUTHORIZED', role: 'COMMENTER'},
{error: 'NOT_AUTHORIZED', role: 'STAFF'},
{error: 'NOT_AUTHORIZED', role: 'COMMENTER'},
{error: false, role: 'MODERATOR'},
{error: false, role: 'ADMIN'},
].forEach(({self, error, role}) => {
it(`${error ? 'can not' : 'can'} suspend ${self ? 'themself' : 'another user'} as a user with role ${role}`, async () => {
const actor = new UserModel({role});
// If we're testing self assign, set the id of the actor to the user
// we're acting on.
@@ -33,18 +33,17 @@ const {expect} = chai;
`;
[
{self: true, error: 'NOT_AUTHORIZED', roles: null},
{self: true, error: 'NOT_AUTHORIZED', roles: ['STAFF']},
{self: true, error: 'NOT_AUTHORIZED', roles: []},
{error: 'NOT_AUTHORIZED', roles: null},
{error: 'NOT_AUTHORIZED', roles: ['STAFF']},
{error: 'NOT_AUTHORIZED', roles: []},
{error: false, roles: ['MODERATOR']},
{error: false, roles: ['ADMIN']},
{error: false, roles: ['ADMIN', 'MODERATOR']},
].forEach(({self, error, roles}) => {
it(`${error ? 'can not' : 'can'} ${name} a username with the user roles ${roles && roles.length ? roles : JSON.stringify(roles)}${self ? ' on themself' : ''}`, async () => {
const actor = new UserModel({roles});
{self: true, error: 'NOT_AUTHORIZED', role: 'COMMENTER'},
{self: true, error: 'NOT_AUTHORIZED', role: 'STAFF'},
{self: true, error: 'NOT_AUTHORIZED', role: 'COMMENTER'},
{error: 'NOT_AUTHORIZED', role: 'COMMENTER'},
{error: 'NOT_AUTHORIZED', role: 'STAFF'},
{error: 'NOT_AUTHORIZED', role: 'COMMENTER'},
{error: false, role: 'MODERATOR'},
{error: false, role: 'ADMIN'},
].forEach(({self, error, role}) => {
it(`${error ? 'can not' : 'can'} ${name} a username with the user role ${role}${self ? ' on themself' : ''}`, async () => {
const actor = new UserModel({role});
// If we're testing self assign, set the id of the actor to the user
// we're acting on.
@@ -27,12 +27,13 @@ describe('graph.mutations.updateAssetSettings', () => {
describe('context with different user roles', () => {
[
{error: 'NOT_AUTHORIZED'},
{roles: ['ADMIN', 'MODERATOR']},
{roles: ['MODERATOR']},
].forEach(({roles, error}) => {
it(roles ? roles.join(', ') : '<None>', async () => {
const user = new UserModel({roles});
{role: 'COMMENTER', error: 'NOT_AUTHORIZED'},
{role: 'STAFF', error: 'NOT_AUTHORIZED'},
{role: 'ADMIN'},
{role: 'MODERATOR'},
].forEach(({role, error}) => {
it(`role = ${role}`, async () => {
const user = new UserModel({role});
const ctx = new Context({user});
const settings = {
@@ -28,12 +28,12 @@ describe('graph.mutations.updateAssetStatus', () => {
describe('context with different user roles', () => {
[
{error: 'NOT_AUTHORIZED'},
{roles: ['ADMIN', 'MODERATOR']},
{roles: ['MODERATOR']},
].forEach(({roles, error}) => {
it(roles ? roles.join(', ') : '<None>', async () => {
const user = new UserModel({roles});
{role: 'COMMENTER', error: 'NOT_AUTHORIZED'},
{role: 'ADMIN'},
{role: 'MODERATOR'},
].forEach(({role, error}) => {
it(`role = ${role}`, async () => {
const user = new UserModel({role});
const ctx = new Context({user});
const closedAt = (new Date()).toISOString();
+7 -12
View File
@@ -26,17 +26,12 @@ describe('graph.mutations.updateSettings', () => {
describe('context with different user roles', () => {
[
{error: 'NOT_AUTHORIZED'},
{error: 'NOT_AUTHORIZED', roles: []},
{roles: ['ADMIN']},
{roles: ['ADMIN', 'MODERATOR']},
{roles: ['MODERATOR']},
].forEach(({roles, error}) => {
it(roles ? roles.join(', ') : '<None>', async () => {
let user;
if (roles != null) {
user = new UserModel({roles});
}
{error: 'NOT_AUTHORIZED', role: 'COMMENTER'},
{role: 'ADMIN'},
{role: 'MODERATOR'},
].forEach(({role, error}) => {
it(`role = ${role}`, async () => {
const user = new UserModel({role});
const ctx = new Context({user});
const newSettings = {
@@ -74,7 +69,7 @@ describe('graph.mutations.updateSettings', () => {
});
describe('nested objects', () => {
const user = new UserModel({roles: ['ADMIN']});
const user = new UserModel({role: 'ADMIN'});
const ctx = new Context({user});
it('should handle nested objects', async () => {
+6 -12
View File
@@ -56,18 +56,12 @@ describe('graph.queries.settings', () => {
];
[
{bl: true},
{bl: true, roles: []},
{bl: false, roles: ['ADMIN']},
{bl: false, roles: ['ADMIN', 'MODERATOR']},
{bl: false, roles: ['MODERATOR']},
].forEach(({bl, roles}) => {
it(roles && roles.length > 0 ? roles.join(', ') : '<None>', async () => {
let user;
if (roles != null) {
user = new UserModel({roles});
}
{bl: true, role: 'COMMENTER'},
{bl: false, role: 'ADMIN'},
{bl: false, role: 'MODERATOR'},
].forEach(({bl, role}) => {
it(`role = ${role}`, async () => {
let user = new UserModel({role});
const ctx = new Context({user});
const res = await graphql(schema, QUERY, {}, ctx);
+7 -7
View File
@@ -60,13 +60,13 @@ describe('graph.queries.user', () => {
`;
[
{roles: [], can: false},
{roles: ['STAFF'], can: false},
{roles: ['STAFF', 'MODERATOR'], can: true},
{roles: ['STAFF', 'MODERATOR', 'ADMIN'], can: true},
].forEach(({roles, can}) => {
it(`${can ? 'can' : 'can not'} query with roles = ${roles.length > 0 ? roles : '<none>'}`, async () => {
const actor = new UserModel({roles});
{role: 'COMMENTER', can: false},
{role: 'STAFF', can: false},
{role: 'MODERATOR', can: true},
{role: 'ADMIN', can: true},
].forEach(({role, can}) => {
it(`${can ? 'can' : 'can not'} query with role = ${role}`, async () => {
const actor = new UserModel({role});
const ctx = new Context({user: actor});
const {data, errors} = await graphql(schema, query, {}, ctx, {
+6 -6
View File
@@ -6,13 +6,13 @@ const authz = require('../../../middleware/authorization');
describe('middleware.authorization', () => {
describe('#has', () => {
it('allows if no roles are specified', () => {
expect(authz.has({roles: []})).to.be.true;
expect(authz.has({role: 'COMMENTER'})).to.be.true;
});
it('allows if the correct roles are met', () => {
expect(authz.has({roles: ['ADMIN']}, 'ADMIN', 'MODERATOR')).to.be.true;
expect(authz.has({role: 'ADMIN'}, 'ADMIN', 'MODERATOR')).to.be.true;
});
it('disallows if the role required is missing', () => {
expect(authz.has({roles: []}, 'ADMIN', 'MODERATOR')).to.be.false;
expect(authz.has({role: 'COMMENTER'}, 'ADMIN', 'MODERATOR')).to.be.false;
});
});
@@ -24,17 +24,17 @@ describe('middleware.authorization', () => {
};
it('allows if no roles are specified', () => {
needed()({user: {roles: []}}, {}, (err) => {
needed()({user: {role: 'COMMENTER'}}, {}, (err) => {
expect(err).to.be.undefined;
});
});
it('allows if the correct roles are met', () => {
needed()({user: {roles: ['ADMIN']}}, {}, (err) => {
needed()({user: {role: 'ADMIN'}}, {}, (err) => {
expect(err).to.be.undefined;
});
});
it('disallows if the role required is missing', () => {
needed('ADMIN', 'MODERATOR')({user: {roles: []}}, {}, (err) => {
needed('ADMIN', 'MODERATOR')({user: {role: 'COMMENTER'}}, {}, (err) => {
expect(err).to.not.be.undefined;
});
});
+7 -7
View File
@@ -40,7 +40,7 @@ describe('/api/v1/assets', () => {
for (const role of ['ADMIN', 'MODERATOR']) {
const res = await chai.request(app)
.get('/api/v1/assets')
.set(passport.inject({roles: [role]}));
.set(passport.inject({role}));
const body = res.body;
@@ -57,7 +57,7 @@ describe('/api/v1/assets', () => {
for (const role of ['ADMIN', 'MODERATOR']) {
const res = await chai.request(app)
.get('/api/v1/assets?value=term2')
.set(passport.inject({roles: [role]}));
.set(passport.inject({role}));
const body = res.body;
@@ -79,7 +79,7 @@ describe('/api/v1/assets', () => {
for (const role of ['ADMIN', 'MODERATOR']) {
const res = await chai.request(app)
.get('/api/v1/assets?value=term3')
.set(passport.inject({roles: [role]}));
.set(passport.inject({role}));
const body = res.body;
expect(body).to.have.property('count', 0);
@@ -93,7 +93,7 @@ describe('/api/v1/assets', () => {
for (const role of ['ADMIN', 'MODERATOR']) {
const res = await chai.request(app)
.get('/api/v1/assets?filter=closed')
.set(passport.inject({roles: [role]}));
.set(passport.inject({role}));
const body = res.body;
expect(body).to.have.property('count', 1);
@@ -109,7 +109,7 @@ describe('/api/v1/assets', () => {
for (const role of ['ADMIN', 'MODERATOR']) {
const res = await chai.request(app)
.get('/api/v1/assets?filter=open')
.set(passport.inject({roles: [role]}));
.set(passport.inject({role}));
const body = res.body;
expect(body).to.have.property('count', 1);
@@ -134,7 +134,7 @@ describe('/api/v1/assets', () => {
const res = await chai.request(app)
.put(`/api/v1/assets/${asset.id}/status`)
.set(passport.inject({roles: ['ADMIN']}))
.set(passport.inject({role: 'ADMIN'}))
.send({closedAt: today});
expect(res).to.have.status(204);
@@ -153,7 +153,7 @@ describe('/api/v1/assets', () => {
const promise = chai.request(app)
.put(`/api/v1/assets/${asset.id}/status`)
.set(passport.inject({roles: ['MODERATOR']}))
.set(passport.inject({role: 'MODERATOR'}))
.send({closedAt: today});
await expect(promise).to.eventually.be.rejected;
});
+3 -5
View File
@@ -20,9 +20,7 @@ describe('/api/v1/settings', () => {
for (let role of ['ADMIN', 'MODERATOR']) {
const res = await chai.request(app)
.get('/api/v1/settings')
.set(passport.inject({
roles: [role]
}));
.set(passport.inject({role}));
expect(res).to.have.status(200);
expect(res).to.be.json;
expect(res.body).to.have.property('moderation', 'PRE');
@@ -35,7 +33,7 @@ describe('/api/v1/settings', () => {
it('should update the settings', () => {
return chai.request(app)
.put('/api/v1/settings')
.set(passport.inject({roles: ['ADMIN']}))
.set(passport.inject({role: 'ADMIN'}))
.send({moderation: 'POST'})
.then((res) => {
expect(res).to.have.status(204);
@@ -50,7 +48,7 @@ describe('/api/v1/settings', () => {
it('should require ADMIN role', () => {
const promise = chai.request(app)
.put('/api/v1/settings')
.set(passport.inject({roles: ['MODERATOR']}))
.set(passport.inject({role: 'MODERATOR'}))
.send({moderation: 'POST'});
return expect(promise).to.eventually.be.rejected;
});
+2 -2
View File
@@ -30,7 +30,7 @@ describe('/api/v1/users/:user_id/email/confirm', () => {
return chai.request(app)
.post(`/api/v1/users/${mockUser.id}/email/confirm`)
.set(passport.inject({roles: ['ADMIN']}))
.set(passport.inject({role: 'ADMIN'}))
.then((res) => {
expect(res).to.have.status(204);
expect(mailer.task.tasks).to.have.length(1);
@@ -40,7 +40,7 @@ describe('/api/v1/users/:user_id/email/confirm', () => {
it('should send a 404 on not matching a user', () => {
return chai.request(app)
.post(`/api/v1/users/${mockUser.id}/email/confirm`)
.set(passport.inject({roles: ['ADMIN']}))
.set(passport.inject({role: 'ADMIN'}))
.then((res) => {
expect(res).to.have.status(204);
expect(mailer.task.tasks).to.have.length(1);
+1 -1
View File
@@ -168,7 +168,7 @@ describe('services.UsersService', () => {
it('should not ignore a staff member', async () => {
const user = mockUsers[0];
const usersToIgnore = [mockUsers[1]];
await UsersService.addRoleToUser(usersToIgnore[0].id, 'STAFF');
await UsersService.setRole(usersToIgnore[0].id, 'STAFF');
try {
await UsersService.ignoreUsers(user.id, usersToIgnore.map((u) => u.id));