Added unit tests to link-redirects package

fixes https://github.com/TryGhost/Team/issues/1958
This commit is contained in:
Simon Backx 2022-09-26 18:11:32 +02:00
parent ac661c19b7
commit d132b723da
2 changed files with 118 additions and 3 deletions

View File

@ -7,7 +7,7 @@
"main": "index.js",
"scripts": {
"dev": "echo \"Implement me!\"",
"test:unit": "NODE_ENV=testing c8 --all --reporter text --reporter cobertura mocha './test/**/*.test.js'",
"test:unit": "NODE_ENV=testing c8 --all --check-coverage --reporter text --reporter cobertura mocha './test/**/*.test.js'",
"test": "yarn test:unit",
"lint:code": "eslint *.js lib/ --ext .js --cache",
"lint": "yarn lint:code && yarn lint:test",

View File

@ -1,5 +1,120 @@
const LinkRedirectsService = require('../lib/LinkRedirectsService');
const assert = require('assert');
const sinon = require('sinon');
const crypto = require('crypto');
describe('LinkRedirectsService', function () {
it('exists', function () {
require('../lib/LinkRedirectsService');
afterEach(function () {
sinon.restore();
});
it('exported', function () {
assert.equal(require('../index').LinkRedirectsService, LinkRedirectsService);
});
describe('getSlugUrl', function () {
it('works for first random slug that does not exist', async function () {
const instance = new LinkRedirectsService({
linkRedirectRepository: {
getByURL: () => Promise.resolve(undefined)
},
config: {
baseURL: new URL('https://localhost:2368/')
}
});
// stub crypto.randomBytes to return a known value toString
sinon.stub(crypto, 'randomBytes').returns(Buffer.from('00000000', 'hex'));
const url = await instance.getSlugUrl();
assert.equal(url, 'https://localhost:2368/r/00000000');
});
it('works when first random slug already exists', async function () {
const instance = new LinkRedirectsService({
linkRedirectRepository: {
getByURL: (url) => {
if (url.toString() === 'https://localhost:2368/r/00000000') {
return Promise.resolve({});
}
return Promise.resolve(undefined);
}
},
config: {
baseURL: new URL('https://localhost:2368/')
}
});
// stub crypto.randomBytes to return 00000000 first and something else
sinon.stub(crypto, 'randomBytes')
.onFirstCall().returns(Buffer.from('00000000', 'hex'))
.onSecondCall().returns(Buffer.from('11111111', 'hex'));
const url = await instance.getSlugUrl();
assert.equal(url, 'https://localhost:2368/r/11111111');
});
});
describe('addRedirect', function () {
it('saves', async function () {
const linkRedirectRepository = {
save: sinon.fake()
};
const instance = new LinkRedirectsService({
linkRedirectRepository,
config: {
baseURL: new URL('https://localhost:2368/')
}
});
await instance.addRedirect(new URL('https://localhost:2368/a'), new URL('https://localhost:2368/b'));
assert.equal(linkRedirectRepository.save.callCount, 1);
assert.equal(linkRedirectRepository.save.getCall(0).args[0].from.toString(), 'https://localhost:2368/a');
assert.equal(linkRedirectRepository.save.getCall(0).args[0].to.toString(), 'https://localhost:2368/b');
});
});
describe('handleRequest', function () {
it('redirects if found', async function () {
const linkRedirectRepository = {
getByURL: (url) => {
if (url.toString() === 'https://localhost:2368/a') {
return Promise.resolve({
to: new URL('https://localhost:2368/b')
});
}
return Promise.resolve(undefined);
}
};
const instance = new LinkRedirectsService({
linkRedirectRepository,
config: {
baseURL: new URL('https://localhost:2368/')
}
});
const req = {
originalUrl: '/a'
};
const res = {
redirect: sinon.fake()
};
await instance.handleRequest(req, res);
assert.equal(res.redirect.callCount, 1);
assert.equal(res.redirect.getCall(0).args[0], 'https://localhost:2368/b');
});
it('does not redirect if not found', async function () {
const linkRedirectRepository = {
getByURL: () => Promise.resolve(undefined)
};
const instance = new LinkRedirectsService({
linkRedirectRepository,
config: {
baseURL: new URL('https://localhost:2368/')
}
});
const req = {
url: '/a'
};
const res = {};
const next = sinon.fake();
await instance.handleRequest(req, res, next);
assert.equal(next.callCount, 1);
});
});
});