mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-12-18 16:01:40 +03:00
e658f7622a
refs https://github.com/TryGhost/Team/issues/1958 - Renamed wrapper service link-click-tracking to link-tracking to be consistent with the package name - Added unit tests for LinkClickTrackingService - Added DomainEvents dependency to LinkClickTrackingService - Fixes dependencies in link-tracking package
172 lines
6.0 KiB
JavaScript
172 lines
6.0 KiB
JavaScript
const LinkClickTrackingService = require('../lib/LinkClickTrackingService');
|
|
const sinon = require('sinon');
|
|
const assert = require('assert');
|
|
const ObjectID = require('bson-objectid').default;
|
|
const PostLink = require('../lib/PostLink');
|
|
const {RedirectEvent} = require('@tryghost/link-redirects');
|
|
|
|
describe('LinkClickTrackingService', function () {
|
|
it('exists', function () {
|
|
require('../');
|
|
});
|
|
|
|
describe('init', function () {
|
|
it('initialises only once', function () {
|
|
const subscribe = sinon.stub();
|
|
const service = new LinkClickTrackingService({
|
|
DomainEvents: {
|
|
subscribe
|
|
}
|
|
});
|
|
service.init();
|
|
assert.ok(subscribe.calledOnce);
|
|
service.init();
|
|
assert.ok(subscribe.calledOnce);
|
|
});
|
|
});
|
|
|
|
describe('getLinks', function () {
|
|
it('passes call to postLinkRepository', async function () {
|
|
const getAll = sinon.stub().resolves(['test']);
|
|
const service = new LinkClickTrackingService({
|
|
postLinkRepository: {
|
|
getAll
|
|
}
|
|
});
|
|
const links = await service.getLinks({filter: 'post_id:1'});
|
|
|
|
// Check called with filter
|
|
assert.ok(getAll.calledOnceWithExactly({filter: 'post_id:1'}));
|
|
|
|
// Check returned value
|
|
assert.deepStrictEqual(links, ['test']);
|
|
});
|
|
});
|
|
|
|
describe('addRedirectToUrl', function () {
|
|
it('Creates a redirect', async function () {
|
|
const getSlugUrl = sinon.stub().resolves(new URL('https://example.com/r/uniqueslug'));
|
|
const save = sinon.stub().resolves();
|
|
const linkId = new ObjectID();
|
|
const addRedirect = sinon.stub().resolves({link_id: linkId, to: new URL('https://example.com/destination'), from: new URL('https://example.com/r/uniqueslug')});
|
|
|
|
const service = new LinkClickTrackingService({
|
|
linkRedirectService: {
|
|
getSlugUrl,
|
|
addRedirect
|
|
},
|
|
postLinkRepository: {
|
|
save
|
|
}
|
|
});
|
|
|
|
const postId = new ObjectID().toHexString();
|
|
const updatedUrl = await service.addRedirectToUrl(new URL('https://example.com/destination'), {id: postId});
|
|
assert.equal(updatedUrl.toString(), 'https://example.com/r/uniqueslug');
|
|
|
|
// Check getSlugUrl called
|
|
assert(getSlugUrl.calledOnce);
|
|
|
|
// Check save called
|
|
assert(
|
|
save.calledOnceWithExactly(
|
|
new PostLink({
|
|
post_id: postId,
|
|
link_id: linkId
|
|
})
|
|
)
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('addTrackingToUrl', function () {
|
|
it('Creates a redirect', async function () {
|
|
const getSlugUrl = sinon.stub().resolves(new URL('https://example.com/r/uniqueslug'));
|
|
const save = sinon.stub().resolves();
|
|
const linkId = new ObjectID();
|
|
const addRedirect = sinon.stub().resolves({link_id: linkId, to: new URL('https://example.com/destination'), from: new URL('https://example.com/r/uniqueslug')});
|
|
|
|
const service = new LinkClickTrackingService({
|
|
linkRedirectService: {
|
|
getSlugUrl,
|
|
addRedirect
|
|
},
|
|
postLinkRepository: {
|
|
save
|
|
}
|
|
});
|
|
|
|
const postId = new ObjectID().toHexString();
|
|
const updatedUrl = await service.addTrackingToUrl(new URL('https://example.com/destination'), {id: postId}, '123');
|
|
assert.equal(updatedUrl.toString(), 'https://example.com/r/uniqueslug?m=123');
|
|
|
|
// Check getSlugUrl called
|
|
assert(getSlugUrl.calledOnce);
|
|
|
|
// Check save called
|
|
assert(
|
|
save.calledOnceWithExactly(
|
|
new PostLink({
|
|
post_id: postId,
|
|
link_id: linkId
|
|
})
|
|
)
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('subscribe', function () {
|
|
it('Ignores redirects without a member id', async function () {
|
|
const event = RedirectEvent.create({
|
|
url: new URL('https://example.com/destination'),
|
|
link: {}
|
|
});
|
|
const save = sinon.stub().resolves();
|
|
|
|
const service = new LinkClickTrackingService({
|
|
DomainEvents: {
|
|
subscribe: (eventType, callback) => {
|
|
assert.equal(eventType, RedirectEvent);
|
|
callback(event);
|
|
}
|
|
},
|
|
linkClickRepository: {
|
|
save
|
|
}
|
|
});
|
|
|
|
service.subscribe();
|
|
assert(!save.called);
|
|
});
|
|
|
|
it('Tracks redirects with a member id', async function () {
|
|
const linkId = new ObjectID();
|
|
const event = RedirectEvent.create({
|
|
url: new URL('https://example.com/destination?m=memberId'),
|
|
link: {
|
|
link_id: linkId
|
|
}
|
|
});
|
|
const save = sinon.stub().resolves();
|
|
|
|
const service = new LinkClickTrackingService({
|
|
DomainEvents: {
|
|
subscribe: (eventType, callback) => {
|
|
assert.equal(eventType, RedirectEvent);
|
|
callback(event);
|
|
}
|
|
},
|
|
linkClickRepository: {
|
|
save
|
|
}
|
|
});
|
|
|
|
service.subscribe();
|
|
assert(save.calledOnce);
|
|
|
|
assert.equal(save.firstCall.args[0].member_uuid, 'memberId');
|
|
assert.equal(save.firstCall.args[0].link_id, linkId);
|
|
});
|
|
});
|
|
});
|