analytics-reporter
Version:
A lightweight command line tool for reporting and publishing analytics data from a Google Analytics account.
183 lines (159 loc) • 5.11 kB
JavaScript
const { ANALYTICS_DATA_TABLE_NAME } = require("../../src/publish/postgres")
const expect = require("chai").expect
const knex = require("knex")
const moment = require("moment-timezone")
const proxyquire = require("proxyquire")
const database = require("../support/database")
const resultsFixture = require("../support/fixtures/results")
proxyquire.noCallThru()
const config = {
postgres: database.connection,
timezone: "US/Eastern",
}
const PostgresPublisher = proxyquire("../../src/publish/postgres", {
"../config": config,
})
const databaseClient = knex({ client: "pg", connection: database.connection })
describe("PostgresPublisher", () => {
describe(".publish(results)", () => {
let results
beforeEach(done => {
results = Object.assign({}, resultsFixture)
database.resetSchema().then(() => {
done()
}).catch(done)
})
it("should insert a record for each results.data element", done => {
results.name = "report-name"
results.data = [
{
date: "2017-02-11",
name: "abc",
},
{
date: "2017-02-12",
name: "def",
},
]
PostgresPublisher.publish(results).then(() => {
return databaseClient(ANALYTICS_DATA_TABLE_NAME).orderBy("date_time", "asc").select()
}).then(rows => {
expect(rows).to.have.length(2)
rows.forEach((row, index) => {
const data = results.data[index]
expect(row.report_name).to.equal("report-name")
expect(row.data.name).to.equal(data.name)
expect(row.data.date).to.be.undefined
const date = moment.tz(data.date, config.timezone).toDate()
expect(row.date_time.getTime()).to.equal(date.getTime())
})
done()
}).catch(done)
})
it("should use the ga:hour dimension in the date if it is present", done => {
results.data = [{
date: "2017-02-15",
hour: "12",
}]
const date = moment.tz("2017-02-15T12:00:00", config.timezone).toDate()
PostgresPublisher.publish(results).then(() => {
return databaseClient.select().table(ANALYTICS_DATA_TABLE_NAME)
}).then(rows => {
const row = rows[0]
expect(row.date_time.getTime()).to.equal(date.getTime())
done()
}).catch(done)
})
it("should ignore reports that don't have a ga:date dimension", done => {
results.query = { dimensions: "ga:something,ga:somethingElse" }
PostgresPublisher.publish(results).then(() => {
return databaseClient.select().table(ANALYTICS_DATA_TABLE_NAME)
}).then(rows => {
expect(rows).to.have.length(0)
done()
}).catch(done)
})
it("should ignore data points that have already been inserted", done => {
firstResults = Object.assign({}, results)
secondResults = Object.assign({}, results)
firstResults.data = [
{
date: "2017-02-11",
visits: "123",
browser: "Chrome",
},
{
date: "2017-02-11",
visits: "456",
browser: "Safari"
},
]
secondResults.data = [
{
date: "2017-02-11",
visits: "456",
browser: "Safari",
},
{
date: "2017-02-11",
visits: "789",
browser: "Internet Explorer"
},
]
PostgresPublisher.publish(firstResults).then(() => {
return PostgresPublisher.publish(secondResults)
}).then(() => {
return databaseClient.select().table(ANALYTICS_DATA_TABLE_NAME)
}).then(rows => {
expect(rows).to.have.length(3)
done()
}).catch(done)
})
it("should overwrite existing data points if the number of visits or users has changed", done => {
firstResults = Object.assign({}, results)
secondResults = Object.assign({}, results)
firstResults.data = [
{
date: "2017-02-11",
visits: "100",
browser: "Safari",
},
]
secondResults.data = [
{
date: "2017-02-11",
visits: "200",
browser: "Safari",
},
]
PostgresPublisher.publish(firstResults).then(() => {
return PostgresPublisher.publish(secondResults)
}).then(() => {
return databaseClient.select().table(ANALYTICS_DATA_TABLE_NAME)
}).then(rows => {
expect(rows).to.have.length(1)
expect(rows[0].data.visits).to.equal("200")
done()
}).catch(done)
})
it("should not not insert a record if the date is invalid", done => {
results.data = [
{
date: "(other)",
visits: "123",
},
{
date: "2017-02-16",
visits: "456",
},
]
PostgresPublisher.publish(results).then(() => {
return databaseClient.select().table(ANALYTICS_DATA_TABLE_NAME)
}).then(rows => {
expect(rows).to.have.length(1)
expect(rows[0].data.visits).to.equal("456")
done()
}).catch(done)
})
})
})