Skip to content

Commit 26dcd26

Browse files
committed
better ga and tests
1 parent 44f7a51 commit 26dcd26

File tree

6 files changed

+95
-27
lines changed

6 files changed

+95
-27
lines changed

config.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ module.exports = {
5050
SOCKET_API_URL: '"https://socket.tutorcruncher.com"',
5151
GRECAPTCHA_KEY: '"6LdyXRgUAAAAADUNhMVKJDXiRr6DUN8TGOgllqbt"',
5252
RAVEN_DSN: 'null',
53-
GA_ID: 'null',
54-
// GA_ID: '"UA-41117087-3"',
53+
// GA_ID: 'null',
54+
GA_ID: '"UA-41117087-3"',
5555
},
5656
port: 5000,
5757
build_dir: path.resolve(__dirname, 'dev'),

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "tutorcruncher-socket",
3-
"version": "0.0.10",
3+
"version": "0.0.11",
44
"description": "TutorCruncher socket",
55
"author": "Samuel Colvin <[email protected]>",
66
"private": false,

src/utils.js

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,11 @@ const add_script = url => {
4141
document.body.appendChild(s)
4242
}
4343

44-
/* istanbul ignore next */
4544
const init_ga = (router, config) => {
4645
const ga_prefixes = []
47-
if (process.env.GA_ID === null) {
48-
return ga_prefixes
49-
}
50-
const tcs_ga_name = `${config.mode}-tcs`
46+
const tcs_ga_name = `${config.mode.replace('-', '')}tcs`
5147
ga_prefixes.push(tcs_ga_name + '.')
48+
/* istanbul ignore next */
5249
if (window.ga === undefined) {
5350
// taken from https://developers.google.com/analytics/devguides/collection/analyticsjs/
5451
add_script('https://www.google-analytics.com/analytics.js')
@@ -59,23 +56,26 @@ const init_ga = (router, config) => {
5956
} else {
6057
ga_prefixes.push('')
6158
}
62-
window.ga('create', 'UA-41117087-3', 'auto', tcs_ga_name)
59+
window.ga('create', process.env.GA_ID || '-', 'auto', tcs_ga_name)
6360
window.ga(tcs_ga_name + '.set', 'dimension1', config.mode)
6461
window.ga(tcs_ga_name + '.set', 'dimension2', config.router_mode)
6562

6663
if (!window._tcs_ga) {
67-
// we only submit router changes for one socket instance to avoid duplicate page loads
68-
let initial_load = true
69-
router.afterEach(to => {
70-
const _prefixes = initial_load ? ['tcs.'] : ga_prefixes
71-
initial_load = false
72-
for (let prefix of _prefixes) {
64+
window.ga(tcs_ga_name + '.send', 'pageview')
65+
}
66+
window._tcs_ga = true
67+
68+
let initial_load = true
69+
router.afterEach(to => {
70+
// we don't submit the first router callback as this is the page load and is covered by above or their ga
71+
if (!initial_load) {
72+
for (let prefix of ga_prefixes) {
7373
window.ga(prefix + 'set', 'page', to.fullPath)
7474
window.ga(prefix + 'send', 'pageview')
7575
}
76-
})
77-
}
78-
window._tcs_ga = true
76+
}
77+
initial_load = false
78+
})
7979

8080
return ga_prefixes
8181
}

test/unit/specs/_shared.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,23 @@ function tick () {
8888
}
8989

9090
function sleep (delay) {
91-
return new Promise((resolve, reject) => setTimeout(resolve, delay))
91+
return new Promise((resolve, reject) => setTimeout(() => resolve(), delay))
92+
}
93+
94+
function prepare_ga (log) {
95+
window._tcs_ga = null
96+
const ga_data = []
97+
window.ga = function () {
98+
ga_data.push(Array.from(arguments).join())
99+
if (log) {
100+
console.log('ga:', arguments)
101+
}
102+
}
103+
return ga_data
104+
}
105+
106+
function teardown_ga () {
107+
delete window.ga_data
92108
}
93109

94110
export {
@@ -101,4 +117,6 @@ export {
101117
generate_vm,
102118
tick,
103119
sleep,
120+
prepare_ga,
121+
teardown_ga,
104122
}

test/unit/specs/enquiry.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ describe('enquiry-modal.vue', () => {
7979
it('should render modal enquiry form', async () => {
8080
const vm = generate_vm(modal_enquiry_router)
8181
vm.$router.push({name: 'enquiry-modal'})
82-
vm.$router.push({name: 'enquiry-modal'})
8382

8483
await tick()
8584
expect(vm.$el.querySelector('input').attributes['placeholder'].value).to.equal('Foobar')

test/unit/specs/main.js

Lines changed: 58 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
import socket from 'src/main'
2-
import {dft_response, TestConsole, enquiry_options, sleep} from './_shared'
2+
import {dft_response, TestConsole, enquiry_options, sleep, tick, prepare_ga, teardown_ga} from './_shared'
33

4-
describe('main.js', done => {
4+
describe('main.js', () => {
55
let server
66
before(() => {
77
server = sinon.fakeServer.create()
88
server.autoRespond = true
99
server.respondWith(dft_response)
10+
prepare_ga()
11+
})
12+
after(() => {
13+
server.restore()
14+
teardown_ga()
1015
})
11-
after(() => { server.restore() })
1216

1317
it('should initialise with different element name', done => {
1418
let outer = document.createElement('div')
@@ -78,6 +82,34 @@ describe('main.js', done => {
7882
vm.contractors = [{}]
7983
expect(vm.config.url_root).to.equal('/context.html')
8084
})
85+
86+
it('should do ga', async () => {
87+
// TODO currently window.ga gets contaminated by other tests if you use await sleep(50)
88+
const ga_data = prepare_ga()
89+
let el = document.createElement('div')
90+
el.setAttribute('id', 'socket')
91+
document.body.appendChild(el)
92+
const vm = socket('public_key', {url_root: '/'})
93+
vm.enquiry_form_info = 'foobar' // prevent get_enquiry making a GET request
94+
vm.contractors.push({name: 'Fred Bloggs', link: '123-fred-bloggs', tag_line: 'hello'})
95+
// ga already installed
96+
expect(ga_data).to.deep.equal([
97+
'create,-,auto,gridtcs', 'gridtcs.set,dimension1,grid', 'gridtcs.set,dimension2,hash', 'gridtcs.send,pageview'
98+
])
99+
await tick()
100+
101+
expect(vm.$el.querySelector('a').attributes['href'].value).to.equal('#/123-fred-bloggs')
102+
103+
vm.goto('con-modal', {link: '123-fred-bloggs'})
104+
await tick()
105+
expect(vm.$el.querySelector('h2').textContent).to.equal('Fred Bloggs')
106+
107+
expect(ga_data).to.deep.equal([
108+
'create,-,auto,gridtcs', 'gridtcs.set,dimension1,grid', 'gridtcs.set,dimension2,hash', 'gridtcs.send,pageview',
109+
'gridtcs.set,page,/123-fred-bloggs', 'gridtcs.send,pageview', 'set,page,/123-fred-bloggs', 'send,pageview'
110+
])
111+
vm.$el.querySelector('.tcs-extra button').click()
112+
})
81113
})
82114

83115
describe('main.js', () => {
@@ -87,8 +119,12 @@ describe('main.js', () => {
87119
server.autoRespond = true
88120
server.respondWith('/public_key/contractors', dft_response)
89121
server.respondWith('/public_key/enquiry', dft_response) // to prevent errors with get_enquiry
122+
prepare_ga()
123+
})
124+
after(() => {
125+
server.restore()
126+
teardown_ga()
90127
})
91-
after(() => { server.restore() })
92128

93129
it('should download contractors', async () => {
94130
let el = document.createElement('div')
@@ -110,8 +146,12 @@ describe('main.js', () => {
110146
server.autoRespond = true
111147
server.respondWith('/public_key/contractors', [404, {}, 'badness'])
112148
server.respondWith('/public_key/enquiry', dft_response) // to prevent errors with get_enquiry
149+
prepare_ga()
150+
})
151+
after(() => {
152+
server.restore()
153+
teardown_ga()
113154
})
114-
after(() => { server.restore() })
115155

116156
it('should show error with bad response', async () => {
117157
let el = document.createElement('div')
@@ -134,6 +174,9 @@ describe('main.js', () => {
134174
})
135175

136176
describe('main.js', () => {
177+
before(() => prepare_ga())
178+
after(() => teardown_ga())
179+
137180
it('should show connection error', async () => {
138181
let el = document.createElement('div')
139182
el.setAttribute('id', 'socket')
@@ -161,8 +204,12 @@ describe('main.js', () => {
161204
server.respondWith('/public-key/contractors', dft_response)
162205
server.respondWith('/public-key/enquiry', [200, {'Content-Type': 'application/json'}, '{"response": "ok"}'])
163206
server.respondWith('/foobar', [200, {'Content-Type': 'application/json'}, '{"the": "response"}'])
207+
prepare_ga()
208+
})
209+
after(() => {
210+
server.restore()
211+
teardown_ga()
164212
})
165-
after(() => { server.restore() })
166213

167214
it('should get enquiry info', async () => {
168215
let el = document.createElement('div')
@@ -219,8 +266,12 @@ describe('main.js', () => {
219266
expect(obj).to.deep.equal({first_field: 'foobar', attributes: {foo: 'X'}})
220267
xhr.respond(201, {'Content-Type': 'application/json'}, '{"response": "ok"}')
221268
})
269+
prepare_ga()
270+
})
271+
after(() => {
272+
server.restore()
273+
teardown_ga()
222274
})
223-
after(() => { server.restore() })
224275

225276
it('should post enquiry data', async () => {
226277
let el = document.createElement('div')

0 commit comments

Comments
 (0)