e3600d70ef
closes TryGhost/Team#2007 - uses request context to add referrer source and medium for a new member - uses integration name as referrer medium if exists
189 lines
6.6 KiB
JavaScript
189 lines
6.6 KiB
JavaScript
// Switch these lines once there are useful utils
|
|
// const testUtils = require('./utils');
|
|
require('./utils');
|
|
const MemberAttributionService = require('../lib/service');
|
|
|
|
describe('MemberAttributionService', function () {
|
|
describe('Constructor', function () {
|
|
it('doesn\'t throw', function () {
|
|
new MemberAttributionService({});
|
|
});
|
|
});
|
|
|
|
describe('getAttributionFromContext', function () {
|
|
it('returns null if no context is provided', async function () {
|
|
const service = new MemberAttributionService({});
|
|
const attribution = await service.getAttributionFromContext();
|
|
|
|
should(attribution).be.null();
|
|
});
|
|
|
|
it('returns attribution for importer context', async function () {
|
|
const service = new MemberAttributionService({});
|
|
const attribution = await service.getAttributionFromContext({importer: true});
|
|
|
|
should(attribution).containEql({referrerSource: 'Imported', referrerMedium: 'Member Importer'});
|
|
});
|
|
|
|
it('returns attribution for admin context', async function () {
|
|
const service = new MemberAttributionService({});
|
|
const attribution = await service.getAttributionFromContext({user: 'abc'});
|
|
|
|
should(attribution).containEql({referrerSource: 'Created manually', referrerMedium: 'Ghost Admin'});
|
|
});
|
|
|
|
it('returns attribution for api without integration context', async function () {
|
|
const service = new MemberAttributionService({});
|
|
const attribution = await service.getAttributionFromContext({
|
|
api_key: 'abc'
|
|
});
|
|
|
|
should(attribution).containEql({referrerSource: 'Created via API', referrerMedium: 'Admin API'});
|
|
});
|
|
|
|
it('returns attribution for api with integration context', async function () {
|
|
const service = new MemberAttributionService({
|
|
models: {
|
|
Integration: {
|
|
findOne: () => {
|
|
return {
|
|
get: () => 'Test Integration'
|
|
};
|
|
}
|
|
}
|
|
}
|
|
});
|
|
const attribution = await service.getAttributionFromContext({
|
|
api_key: 'abc',
|
|
integration: {id: 'integration_1'}
|
|
});
|
|
|
|
should(attribution).containEql({referrerSource: 'Integration: Test Integration', referrerMedium: 'Admin API'});
|
|
});
|
|
});
|
|
|
|
describe('getEventAttribution', function () {
|
|
it('returns null if attribution_type is null', function () {
|
|
const service = new MemberAttributionService({
|
|
attributionBuilder: {
|
|
build(attribution) {
|
|
return {
|
|
...attribution,
|
|
getResource() {
|
|
return {
|
|
...attribution,
|
|
title: 'added'
|
|
};
|
|
}
|
|
};
|
|
}
|
|
}
|
|
});
|
|
const model = {
|
|
id: 'event_id',
|
|
get() {
|
|
return null;
|
|
}
|
|
};
|
|
should(service.getEventAttribution(model)).eql({
|
|
id: null,
|
|
url: null,
|
|
title: 'added',
|
|
type: null,
|
|
referrerSource: null,
|
|
referrerMedium: null,
|
|
referrerUrl: null
|
|
});
|
|
});
|
|
|
|
it('returns url attribution types', function () {
|
|
const service = new MemberAttributionService({
|
|
attributionBuilder: {
|
|
build(attribution) {
|
|
return {
|
|
...attribution,
|
|
getResource() {
|
|
return {
|
|
...attribution,
|
|
title: 'added'
|
|
};
|
|
}
|
|
};
|
|
}
|
|
}
|
|
});
|
|
const model = {
|
|
id: 'event_id',
|
|
get(name) {
|
|
if (name === 'attribution_type') {
|
|
return 'url';
|
|
}
|
|
if (name === 'attribution_url') {
|
|
return '/my/url/';
|
|
}
|
|
return null;
|
|
}
|
|
};
|
|
should(service.getEventAttribution(model)).eql({
|
|
id: null,
|
|
type: 'url',
|
|
url: '/my/url/',
|
|
title: 'added',
|
|
referrerMedium: null,
|
|
referrerSource: null,
|
|
referrerUrl: null
|
|
});
|
|
});
|
|
|
|
it('returns first loaded relation', function () {
|
|
const service = new MemberAttributionService({
|
|
attributionBuilder: {
|
|
build(attribution) {
|
|
return {
|
|
...attribution,
|
|
getResource() {
|
|
return {
|
|
...attribution,
|
|
title: 'added'
|
|
};
|
|
}
|
|
};
|
|
}
|
|
}
|
|
});
|
|
const model = {
|
|
id: 'event_id',
|
|
get(name) {
|
|
if (name === 'attribution_type') {
|
|
return 'user';
|
|
}
|
|
if (name === 'attribution_url') {
|
|
return '/my/url/';
|
|
}
|
|
if (name.startsWith('referrer')) {
|
|
return null;
|
|
}
|
|
return 'test_user_id';
|
|
},
|
|
related(name) {
|
|
if (name === 'userAttribution') {
|
|
return {
|
|
id: 'test_user_id'
|
|
};
|
|
}
|
|
return {};
|
|
}
|
|
};
|
|
should(service.getEventAttribution(model)).eql({
|
|
id: 'test_user_id',
|
|
type: 'user',
|
|
url: '/my/url/',
|
|
title: 'added',
|
|
referrerMedium: null,
|
|
referrerSource: null,
|
|
referrerUrl: null
|
|
});
|
|
});
|
|
});
|
|
});
|