Ghost/ghost/stats-service/test/lib/referrers.test.js
Fabien "egg" O'Carroll 104f84f252 Added eslint rule for file naming convention
As discussed with the product team we want to enforce kebab-case file names for
all files, with the exception of files which export a single class, in which
case they should be PascalCase and reflect the class which they export.

This will help find classes faster, and should push better naming for them too.

Some files and packages have been excluded from this linting, specifically when
a library or framework depends on the naming of a file for the functionality
e.g. Ember, knex-migrator, adapter-manager
2023-05-09 12:34:34 -04:00

130 lines
4.8 KiB
JavaScript

const knex = require('knex').default;
const assert = require('assert');
const ReferrersStatsService = require('../../lib/ReferrersStatsService');
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);
});
});
});