Skip to content

Commit ba2f2b1

Browse files
authored
Signals analytics runtime (#1168)
1 parent 51167c0 commit ba2f2b1

File tree

73 files changed

+1495
-408
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

73 files changed

+1495
-408
lines changed

.changeset/proud-meals-cheat.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
'@segment/analytics-signals-runtime': major
3+
---
4+
Release analytics-signals-runtime

.changeset/proud-meals-ox.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
'@segment/analytics-signals': minor
3+
---
4+
Refactor runtime to use `@segment/analytics-signals-runtime`

meta-tests/check-dts.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,13 @@ import fs from 'fs'
1111
*/
1212
const execa = promisify(exec)
1313

14-
const allPublicPackageDirNames = ['browser', 'core', 'node'] as const
14+
const allPublicPackageDirNames = [
15+
'browser',
16+
'core',
17+
'node',
18+
'signals/signals',
19+
'signals/signals-runtime',
20+
] as const
1521

1622
type PackageDirName = typeof allPublicPackageDirNames[number]
1723

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"devDependencies": {
3737
"@changesets/changelog-github": "^0.4.5",
3838
"@changesets/cli": "^2.23.2",
39+
"@microsoft/api-extractor": "^7.47.9",
3940
"@npmcli/promise-spawn": "^7.0.0",
4041
"@types/express": "4",
4142
"@types/jest": "^29.5.11",

packages/signals/signals-integration-tests/src/helpers/base-page-object.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export class BasePage {
3131
*/
3232
async loadAndWait(...args: Parameters<BasePage['load']>) {
3333
await Promise.all([this.load(...args), this.waitForSettings()])
34+
return this
3435
}
3536

3637
/**
@@ -48,8 +49,12 @@ export class BasePage {
4849
this.edgeFn = edgeFn
4950
await this.setupMockedRoutes()
5051
const url = options.updateURL ? options.updateURL(this.url) : this.url
51-
await this.page.goto(url)
52-
void this.invokeAnalyticsLoad(signalSettings)
52+
await this.page.goto(url, { waitUntil: 'domcontentloaded' })
53+
void this.invokeAnalyticsLoad({
54+
flushInterval: 500,
55+
...signalSettings,
56+
})
57+
return this
5358
}
5459

5560
/**

packages/signals/signals-integration-tests/src/helpers/network-utils.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Page, Route, Request } from '@playwright/test'
22
import { SegmentEvent } from '@segment/analytics-next'
33
import { Signal } from '@segment/analytics-signals'
4+
import { waitForCondition } from './playwright-utils'
45

56
type FulfillOptions = Parameters<Route['fulfill']>['0']
67
export interface XHRRequestOptions {
@@ -160,6 +161,31 @@ export class TrackingAPIRequestBuffer {
160161
}
161162

162163
export class SignalAPIRequestBuffer extends TrackingAPIRequestBuffer {
164+
async waitForEvents(
165+
numberOfSignals: number,
166+
signalType?: Signal['type']
167+
): Promise<SegmentEvent[]> {
168+
await waitForCondition(
169+
() => this.getEvents(signalType).length >= numberOfSignals,
170+
{
171+
timeout: 5000,
172+
errorMessage: `Found ${
173+
this.getEvents(signalType).length
174+
} signals, expected ${numberOfSignals}`,
175+
}
176+
)
177+
const events = this.getEvents(signalType)
178+
if (events.length < numberOfSignals) {
179+
throw new Error(
180+
`Expected ${numberOfSignals} signals of type ${signalType}, but got ${
181+
this.getEvents(signalType).length
182+
}`
183+
)
184+
} else {
185+
return events
186+
}
187+
}
188+
163189
override getEvents(signalType?: Signal['type']): SegmentEvent[] {
164190
if (signalType) {
165191
return this.getEvents().filter((e) => e.properties!.type === signalType)

packages/signals/signals-integration-tests/src/tests/signals-vanilla/basic.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import { test, expect } from '@playwright/test'
22
import { IndexPage } from './index-page'
33

4-
const indexPage = new IndexPage()
5-
64
const basicEdgeFn = `
75
// this is a process signal function
86
const processSignal = (signal) => {
@@ -12,8 +10,10 @@ const basicEdgeFn = `
1210
}
1311
}`
1412

13+
let indexPage: IndexPage
14+
1515
test.beforeEach(async ({ page }) => {
16-
await indexPage.loadAndWait(page, basicEdgeFn)
16+
indexPage = await new IndexPage().loadAndWait(page, basicEdgeFn)
1717
})
1818

1919
test('network signals fetch', async () => {

packages/signals/signals-integration-tests/src/tests/signals-vanilla/button-click-complex.test.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
import { test, expect } from '@playwright/test'
22
import { IndexPage } from './index-page'
33

4-
const indexPage = new IndexPage()
5-
64
const basicEdgeFn = `const processSignal = (signal) => {}`
7-
5+
let indexPage: IndexPage
86
test.beforeEach(async ({ page }) => {
9-
await indexPage.loadAndWait(page, basicEdgeFn)
7+
indexPage = await new IndexPage().loadAndWait(page, basicEdgeFn)
108
})
119

1210
const data = {

packages/signals/signals-integration-tests/src/tests/signals-vanilla/change-input.test.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ import { test, expect } from '@playwright/test'
22
import { waitForCondition } from '../../helpers/playwright-utils'
33
import { IndexPage } from './index-page'
44

5-
const indexPage = new IndexPage()
6-
75
const basicEdgeFn = `const processSignal = (signal) => {}`
86

97
test('Collecting signals whenever a user enters text input', async ({
@@ -12,7 +10,7 @@ test('Collecting signals whenever a user enters text input', async ({
1210
/**
1311
* Input some text into the input field, see if the signal is emitted correctly
1412
*/
15-
await indexPage.loadAndWait(page, basicEdgeFn, {
13+
const indexPage = await new IndexPage().loadAndWait(page, basicEdgeFn, {
1614
disableSignalsRedaction: true,
1715
enableSignalsIngestion: true,
1816
})

packages/signals/signals-integration-tests/src/tests/signals-vanilla/network-signals-allow-list.test.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
import { test, expect } from '@playwright/test'
22
import { IndexPage } from './index-page'
33

4-
const indexPage = new IndexPage()
5-
64
const basicEdgeFn = `const processSignal = (signal) => {}`
75

86
test('network signals allow and disallow list', async ({ page }) => {
9-
await indexPage.loadAndWait(page, basicEdgeFn, {
7+
const indexPage = await new IndexPage().loadAndWait(page, basicEdgeFn, {
108
networkSignalsAllowList: ['allowed-api.com'],
119
networkSignalsDisallowList: ['https://disallowed-api.com/api/foo'],
1210
})

0 commit comments

Comments
 (0)