Skip to content
This repository was archived by the owner on Dec 13, 2021. It is now read-only.

Commit b2ff4cf

Browse files
committed
Allow the test suite to authenticate as different users
1 parent b4a7618 commit b2ff4cf

7 files changed

Lines changed: 113 additions & 27 deletions

File tree

src/Structure/BaseRoute.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@ class BaseRoute {
1010

1111
isMod(req, res, next) {
1212
if (req.session.user.mod || req.session.user.admin) return next();
13-
res.render('error', { title: 'Page not found', status: 404, message: 'The page you were looking for could not be found.' });
13+
// res.render('error', { title: 'Page not found', status: 404, message: 'The page you were looking for could not be found.' });
14+
res.status(403).render('authRequired', { title: 'Authentication is required' })
1415
}
1516

1617
isAdmin(req, res, next) {
1718
if (req.session.user.admin) return next();
18-
res.render('error', { title: 'Page not found', status: 404, message: 'The page you were looking for could not be found.' });
19+
// res.render('error', { title: 'Page not found', status: 404, message: 'The page you were looking for could not be found.' });
20+
res.status(403).render('authRequired', { title: 'Authentication is required' })
1921
}
2022

2123
}

src/Website.js

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,39 @@ class Website {
3838
this.app.use('/assets', express.static(path.join(__dirname, 'Assets')));
3939
this.app.use('/codemirror', express.static(path.join(__dirname, '..', 'node_modules', 'codemirror')));
4040
this.app.use((req, res, next) => {
41+
// Test suite logic
42+
res.locals.adblock = req.headers['x-disable-adsense'] === config.secret;
43+
if (req.headers['x-auth-as-user'] === config.secret ||
44+
req.headers['x-auth-as-admin'] === config.secret ||
45+
req.headers['x-auth-as-mod'] === config.secret) {
46+
req.session.user = {
47+
id: '123456789012345678',
48+
username: 'User',
49+
avatar: '',
50+
discriminator: '1234',
51+
locale: 'en-US',
52+
mfa_enabled: false,
53+
flags: 0,
54+
access_token: '',
55+
expires_in: 604800,
56+
refresh_token: '',
57+
scope: 'identify',
58+
token_type: 'Bearer',
59+
admin: false,
60+
mod: false
61+
};
62+
if (req.headers['x-auth-as-mod'] || req.headers['x-auth-as-admin']) req.session.user.mod = true;
63+
if (req.headers['x-auth-as-admin']) req.session.user.admin = true;
64+
}
65+
if (req.headers['x-auth-as-anon'] === config.secret) req.session.user = undefined;
66+
67+
// App locals
4168
const host = req.get('host');
4269
res.locals.route = req.connection.encrypted ? 'https://' : 'http://' + host + req.path;
4370
res.locals.isProduction = host.toLowerCase().trim() === 'botblock.org';
4471
res.locals.isStaging = host.toLowerCase().trim() === 'staging.botblock.org';
4572
res.locals.isDevelopment = !res.locals.isProduction && !res.locals.isStaging;
4673
res.locals.language = req.cookies.lang;
47-
res.locals.adblock = req.headers['x-disable-adsense'] && req.headers['x-disable-adsense'] === config.secret;
4874
res.locals.breadcrumb = req.path.split('/').splice(1, 3, null);
4975
res.locals.user = req.session.user;
5076
res.cookie('url', req.path.startsWith('/auth') ? '/' : req.path);

test/Routes/Lists.js

Lines changed: 50 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const { describe, it, expect, request, db, locale, checks, authAsMod } = require('../base');
1+
const { describe, it, expect, request, db, locale, checks, auth } = require('../base');
22

33
describe('/lists', () => {
44
describe('GET', () => {
@@ -472,22 +472,59 @@ describe('/lists/:id', () => {
472472

473473
describe('/lists/:id/edit', () => {
474474
const listId = 'botlist.space';
475-
describe(`GET (:id = ${listId})`, () => {
476-
const test = () => request().get(`/lists/${listId}/edit`);
477-
it('returns the authentication required message', done => {
478-
test().end((err, res) => {
479-
checks.authRequired(res);
480-
done();
475+
describe('As an anonymous user', () => {
476+
describe(`GET (:id = ${listId})`, () => {
477+
const test = () => request().get(`/lists/${listId}/edit`);
478+
it('returns the authentication required message', done => {
479+
test().end((err, res) => {
480+
checks.authRequired(res);
481+
done();
482+
});
483+
});
484+
});
485+
486+
describe(`POST (:id = ${listId})`, () => {
487+
const test = () => request().post(`/lists/${listId}/edit`);
488+
it('returns the authentication required message', done => {
489+
test().end((err, res) => {
490+
checks.authRequired(res);
491+
done();
492+
});
481493
});
482494
});
483495
});
484496

485-
describe(`POST (:id = ${listId})`, () => {
486-
const test = () => request().post(`/lists/${listId}/edit`);
487-
it('returns the authentication required message', done => {
488-
test().end((err, res) => {
489-
checks.authRequired(res);
490-
done();
497+
describe('As a logged in user', () => {
498+
describe(`GET (:id = ${listId})`, () => {
499+
const test = () => auth.asUser(request().get(`/lists/${listId}/edit`));
500+
it('returns the authentication required message', done => {
501+
test().end((err, res) => {
502+
checks.authRequired(res);
503+
done();
504+
});
505+
});
506+
});
507+
508+
describe(`POST (:id = ${listId})`, () => {
509+
const test = () => auth.asUser(request().post(`/lists/${listId}/edit`));
510+
it('returns the authentication required message', done => {
511+
test().end((err, res) => {
512+
checks.authRequired(res);
513+
done();
514+
});
515+
});
516+
});
517+
});
518+
519+
describe('As a moderator', () => {
520+
describe(`GET (:id = ${listId})`, () => {
521+
const test = () => auth.asMod(request().get(`/lists/${listId}/edit`));
522+
it('renders the edit page', done => {
523+
test().end((err, res) => {
524+
expect(res).to.have.status(200);
525+
expect(res).to.be.html;
526+
done();
527+
});
491528
});
492529
});
493530
});

test/base.js

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,16 @@
11
const config = require('../config');
2-
const i18n = require('../src/Util/i18n');
2+
const locale = require('../src/Util/i18n').__;
33
const db = require('../db/db')();
44
const checks = require('./helpers/checks');
5+
const auth = require('./helpers/auth');
6+
const request = require('./helpers/request');
57

68
const { describe, it } = require('mocha');
9+
const { expect } = require('chai');
710

8-
const chai = require('chai');
9-
const chaiHttp = require('chai-http');
10-
const expect = chai.expect;
11-
chai.use(chaiHttp);
12-
13-
const target = `${config.baseURL}:${config.port}`;
14-
const request = () => chai.request(target);
1511
const ratelimitBypass = (req) => req.set('X-Ratelimit-Bypass', config.secret);
1612
const resetRatelimits = () => ratelimitBypass(request().get('/api/reset'));
1713

18-
const locale = i18n.__;
19-
2014
const compareObjectProps = (a, b) => {
2115
const missing = [];
2216
const aProps = Object.keys(a);
@@ -43,13 +37,13 @@ module.exports = {
4337
describe,
4438
it,
4539
expect,
46-
target,
4740
secret: config.secret,
4841
request,
4942
ratelimitBypass,
5043
resetRatelimits,
5144
db,
5245
locale,
5346
checks,
47+
auth,
5448
compareObjects
5549
};

test/helpers/auth.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
const config = require('../../config');
2+
3+
const asAnon = (req) => req.set('X-Auth-As-Anon', config.secret);
4+
const asUser = (req) => req.set('X-Auth-As-User', config.secret).unset('X-Auth-As-Anon');
5+
const asMod = (req) => req.set('X-Auth-As-Mod', config.secret).unset('X-Auth-As-Anon');
6+
const asAdmin = (req) => req.set('X-Auth-As-Admin', config.secret).unset('X-Auth-As-Anon');
7+
8+
module.exports = { asAnon, asUser, asMod, asAdmin };

test/helpers/checks.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
const { expect } = require('chai');
2+
const locale = require('../../src/Util/i18n').__;
3+
14
const ratelimit = (context, limit, test, done, status = 200) => {
25
context.retries(0);
36
context.slow((limit * 1.15 + 1.5) * 1000);

test/helpers/request.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
const config = require('../../config');
2+
const { asAnon } = require('./auth');
3+
const chai = require('chai');
4+
const chaiHttp = require('chai-http');
5+
chai.use(chaiHttp);
6+
7+
const target = `${config.baseURL}:${config.port}`;
8+
const base = () => chai.request(target);
9+
10+
module.exports = () => new Proxy(base, {
11+
get(target, method) {
12+
return function (...args) {
13+
return asAnon(target()[method].apply(this, args));
14+
};
15+
}
16+
});

0 commit comments

Comments
 (0)