Ghost/ghost/stats-service/test/lib/referrers.test.js
Rishabh Garg 45a301277d
Updated empty referrer source to null (#15456)
refs https://github.com/TryGhost/Team/issues/1939

- changes empty referrer source to null instead of explicit `Unavailable` in API
- makes it easier for clients/frontend to ignore empty referrers
2022-09-22 20:58:45 +05:30

130 lines
4.8 KiB
JavaScript

const knex = require('knex').default;
const assert = require('assert');
const ReferrersStatsService = require('../../lib/referrers');
describe('ReferrersStatsService', function () {
describe('getReferrerHistory', function () {
/** @type {import('knex').Knex} */
let db;
beforeEach(async function () {
db = knex({
client: 'sqlite3',
useNullAsDefault: true,
connection: {
filename: ':memory:'
}
});
await db.schema.createTable('members_created_events', function (table) {
table.string('referrer_source');
table.string('referrer_medium');
table.string('referrer_url');
table.date('created_at');
});
await db.schema.createTable('members_subscription_created_events', function (table) {
table.string('referrer_source');
table.string('referrer_medium');
table.string('referrer_url');
table.date('created_at');
});
});
afterEach(async function () {
await db.destroy();
});
async function insertEvents(sources) {
const {DateTime} = require('luxon');
const signupInsert = [];
const paidInsert = [];
for (let index = 0; index < sources.length; index++) {
const day = DateTime.fromISO('1970-01-01').plus({days: index}).toISODate();
if (index > 0) {
signupInsert.push({
referrer_source: sources[index],
referrer_medium: null,
referrer_url: null,
created_at: day
});
}
paidInsert.push({
referrer_source: sources[index],
referrer_medium: null,
referrer_url: null,
created_at: day
});
}
// Insert null referrer data for signups
signupInsert.push(...[
{
referrer_source: null,
referrer_medium: null,
referrer_url: null,
created_at: '1970-01-09'
},
{
referrer_source: null,
referrer_medium: null,
referrer_url: null,
created_at: '1970-01-09'
}
]);
// Insert null referrer data for paid conversions
paidInsert.push(...[
{
referrer_source: null,
referrer_medium: null,
referrer_url: null,
created_at: '1970-01-09'
},
{
referrer_source: null,
referrer_medium: null,
referrer_url: null,
created_at: '1970-01-09'
}
]);
await db('members_created_events').insert(signupInsert);
await db('members_subscription_created_events').insert(paidInsert);
}
it('Responds with correct data', async function () {
const sources = ['Twitter', 'Ghost Newsletter', 'Ghost Explore', 'Product Hunt', 'Reddit', 'Facebook', 'Google', 'Direct', 'Other'];
await insertEvents(sources);
const stats = new ReferrersStatsService({knex: db});
const results = await stats.getReferrersHistory();
const finder = (source, date) => (result) => {
return result.date === date && result.source === source;
};
// Is sorted by date
assert.deepStrictEqual(results.data.map(result => result.date), ['1970-01-01', '1970-01-02', '1970-01-03', '1970-01-04', '1970-01-05', '1970-01-06', '1970-01-07', '1970-01-08', '1970-01-09', '1970-01-09']);
const firstDayCounts = results.data.find(finder('Twitter', '1970-01-01'));
const secondDayCounts = results.data.find(finder('Ghost Newsletter', '1970-01-02'));
const thirdDayCounts = results.data.find(finder('Ghost Explore', '1970-01-03'));
const nullReferrerCounts = results.data.find(finder(null, '1970-01-09'));
assert(firstDayCounts.signups === 0);
assert(firstDayCounts.paid_conversions === 1);
assert(secondDayCounts.signups === 1);
assert(secondDayCounts.paid_conversions === 1);
assert(thirdDayCounts.signups === 1);
assert(thirdDayCounts.paid_conversions === 1);
assert(nullReferrerCounts.signups === 2);
assert(nullReferrerCounts.paid_conversions === 2);
});
});
});