2022-08-18 18:38:42 +03:00
|
|
|
// Switch these lines once there are useful utils
|
|
|
|
// const testUtils = require('./utils');
|
|
|
|
require('./utils');
|
2023-05-02 23:43:47 +03:00
|
|
|
const MemberAttributionService = require('../lib/MemberAttributionService');
|
2022-08-18 18:38:42 +03:00
|
|
|
|
|
|
|
describe('MemberAttributionService', function () {
|
|
|
|
describe('Constructor', function () {
|
|
|
|
it('doesn\'t throw', function () {
|
|
|
|
new MemberAttributionService({});
|
|
|
|
});
|
|
|
|
});
|
2022-08-24 17:11:25 +03:00
|
|
|
|
2022-09-29 20:01:48 +03:00
|
|
|
describe('getAttributionFromContext', function () {
|
|
|
|
it('returns null if no context is provided', async function () {
|
2022-10-27 18:40:03 +03:00
|
|
|
const service = new MemberAttributionService({
|
2022-11-07 18:55:17 +03:00
|
|
|
getTrackingEnabled: () => true
|
2022-10-27 18:40:03 +03:00
|
|
|
});
|
|
|
|
const attribution = await service.getAttributionFromContext();
|
|
|
|
|
|
|
|
should(attribution).be.null();
|
|
|
|
});
|
|
|
|
|
|
|
|
it('returns null if tracking is disabled is provided', async function () {
|
|
|
|
const service = new MemberAttributionService({
|
|
|
|
isTrackingEnabled: false
|
|
|
|
});
|
2022-09-29 20:01:48 +03:00
|
|
|
const attribution = await service.getAttributionFromContext();
|
|
|
|
|
|
|
|
should(attribution).be.null();
|
|
|
|
});
|
|
|
|
|
|
|
|
it('returns attribution for importer context', async function () {
|
2022-10-27 18:40:03 +03:00
|
|
|
const service = new MemberAttributionService({
|
2022-11-07 18:55:17 +03:00
|
|
|
getTrackingEnabled: () => true
|
2022-10-27 18:40:03 +03:00
|
|
|
});
|
2022-09-29 20:01:48 +03:00
|
|
|
const attribution = await service.getAttributionFromContext({importer: true});
|
|
|
|
|
|
|
|
should(attribution).containEql({referrerSource: 'Imported', referrerMedium: 'Member Importer'});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('returns attribution for admin context', async function () {
|
2022-10-27 18:40:03 +03:00
|
|
|
const service = new MemberAttributionService({
|
2022-11-07 18:55:17 +03:00
|
|
|
getTrackingEnabled: () => true
|
2022-10-27 18:40:03 +03:00
|
|
|
});
|
2022-09-29 20:01:48 +03:00
|
|
|
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 () {
|
2022-10-27 18:40:03 +03:00
|
|
|
const service = new MemberAttributionService({
|
2022-11-07 18:55:17 +03:00
|
|
|
getTrackingEnabled: () => true
|
2022-10-27 18:40:03 +03:00
|
|
|
});
|
2022-09-29 20:01:48 +03:00
|
|
|
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'
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
2022-10-27 18:40:03 +03:00
|
|
|
},
|
2022-11-07 18:55:17 +03:00
|
|
|
getTrackingEnabled: () => true
|
2022-09-29 20:01:48 +03:00
|
|
|
});
|
|
|
|
const attribution = await service.getAttributionFromContext({
|
|
|
|
api_key: 'abc',
|
|
|
|
integration: {id: 'integration_1'}
|
|
|
|
});
|
|
|
|
|
|
|
|
should(attribution).containEql({referrerSource: 'Integration: Test Integration', referrerMedium: 'Admin API'});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2022-08-24 17:11:25 +03:00
|
|
|
describe('getEventAttribution', function () {
|
|
|
|
it('returns null if attribution_type is null', function () {
|
2022-09-29 20:01:48 +03:00
|
|
|
const service = new MemberAttributionService({
|
|
|
|
attributionBuilder: {
|
|
|
|
build(attribution) {
|
|
|
|
return {
|
|
|
|
...attribution,
|
|
|
|
getResource() {
|
|
|
|
return {
|
|
|
|
...attribution,
|
|
|
|
title: 'added'
|
|
|
|
};
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
2022-10-27 18:40:03 +03:00
|
|
|
},
|
2022-11-07 18:55:17 +03:00
|
|
|
getTrackingEnabled: () => true
|
2022-09-29 20:01:48 +03:00
|
|
|
});
|
2022-08-24 17:11:25 +03:00
|
|
|
const model = {
|
|
|
|
id: 'event_id',
|
|
|
|
get() {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
};
|
2022-09-29 20:01:48 +03:00
|
|
|
should(service.getEventAttribution(model)).eql({
|
|
|
|
id: null,
|
|
|
|
url: null,
|
|
|
|
title: 'added',
|
|
|
|
type: null,
|
|
|
|
referrerSource: null,
|
|
|
|
referrerMedium: null,
|
|
|
|
referrerUrl: null
|
|
|
|
});
|
2022-08-24 17:11:25 +03:00
|
|
|
});
|
|
|
|
|
|
|
|
it('returns url attribution types', function () {
|
|
|
|
const service = new MemberAttributionService({
|
|
|
|
attributionBuilder: {
|
|
|
|
build(attribution) {
|
|
|
|
return {
|
|
|
|
...attribution,
|
|
|
|
getResource() {
|
|
|
|
return {
|
|
|
|
...attribution,
|
|
|
|
title: 'added'
|
|
|
|
};
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
2022-10-27 18:40:03 +03:00
|
|
|
},
|
2022-11-07 18:55:17 +03:00
|
|
|
getTrackingEnabled: () => true
|
2022-08-24 17:11:25 +03:00
|
|
|
});
|
|
|
|
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/',
|
2022-09-23 18:19:51 +03:00
|
|
|
title: 'added',
|
2022-09-27 22:28:06 +03:00
|
|
|
referrerMedium: null,
|
|
|
|
referrerSource: null,
|
|
|
|
referrerUrl: null
|
2022-08-24 17:11:25 +03:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('returns first loaded relation', function () {
|
|
|
|
const service = new MemberAttributionService({
|
|
|
|
attributionBuilder: {
|
|
|
|
build(attribution) {
|
|
|
|
return {
|
|
|
|
...attribution,
|
|
|
|
getResource() {
|
|
|
|
return {
|
|
|
|
...attribution,
|
|
|
|
title: 'added'
|
|
|
|
};
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
2022-10-27 18:40:03 +03:00
|
|
|
},
|
2022-11-07 18:55:17 +03:00
|
|
|
getTrackingEnabled: () => true
|
2022-08-24 17:11:25 +03:00
|
|
|
});
|
|
|
|
const model = {
|
|
|
|
id: 'event_id',
|
|
|
|
get(name) {
|
|
|
|
if (name === 'attribution_type') {
|
|
|
|
return 'user';
|
|
|
|
}
|
|
|
|
if (name === 'attribution_url') {
|
|
|
|
return '/my/url/';
|
|
|
|
}
|
2022-09-23 18:19:51 +03:00
|
|
|
if (name.startsWith('referrer')) {
|
|
|
|
return null;
|
|
|
|
}
|
2022-08-24 17:11:25 +03:00
|
|
|
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/',
|
2022-09-23 18:19:51 +03:00
|
|
|
title: 'added',
|
2022-09-27 22:28:06 +03:00
|
|
|
referrerMedium: null,
|
|
|
|
referrerSource: null,
|
|
|
|
referrerUrl: null
|
2022-08-24 17:11:25 +03:00
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
2022-08-18 18:38:42 +03:00
|
|
|
});
|