Skip to content

Commit 1c424b3

Browse files
committed
add .reset
1 parent 75ed6a8 commit 1c424b3

File tree

6 files changed

+73
-1
lines changed

6 files changed

+73
-1
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { test, expect } from '@playwright/test'
2+
import { waitForCondition } from '../../helpers/playwright-utils'
3+
import { IndexPage } from './index-page'
4+
import { pTimeout } from '@segment/analytics-core'
5+
6+
/**
7+
* If a signal is generated, the signal buffer should be reset
8+
* when the user clicks on the complex button.
9+
*/
10+
const basicEdgeFn = `const processSignal = (signal) => {
11+
12+
13+
// create a custom signal to echo out the current signal buffer
14+
if (signal.type === 'userDefined') {
15+
analytics.track('current signal buffer', { signalBuffer: signals.signalBuffer })
16+
}
17+
18+
// clicking the complex button to clear the signal buffer
19+
if (signal.type === 'interaction' && signal.data.eventType === 'click' && signal.data.target?.id === 'complex-button') {
20+
analytics.reset()
21+
}
22+
}`
23+
24+
test('calls analytics.reset, and resets the signalBuffer after clear', async ({
25+
page,
26+
}) => {
27+
const indexPage = await new IndexPage().loadAndWait(page, basicEdgeFn)
28+
29+
await indexPage.addUserDefinedSignal({ num: 1 })
30+
const resetCalled = page.evaluate<any>(() => {
31+
return new Promise((resolve) => {
32+
window.analytics.on('reset', resolve)
33+
})
34+
})
35+
36+
await waitForCondition(() => indexPage.trackingAPI.getEvents().length > 0, {
37+
errorMessage:
38+
'No track events found, should have an event with hasSignalsInBuffer: true',
39+
})
40+
const events = indexPage.trackingAPI.getEvents()
41+
const buffer = events[0].properties!.signalBuffer
42+
expect(buffer[0]).toMatchObject({ type: 'userDefined' })
43+
expect(buffer[1]).toMatchObject({ type: 'navigation' })
44+
45+
indexPage.trackingAPI.clear()
46+
await indexPage.clickComplexButton()
47+
await pTimeout(resetCalled, 5000)
48+
await indexPage.addUserDefinedSignal({ num: 2 })
49+
await waitForCondition(() => indexPage.trackingAPI.getEvents().length > 0, {
50+
errorMessage:
51+
'No track events found, should only have one event in the buffer (the current signal)',
52+
})
53+
const events2 = indexPage.trackingAPI.getEvents()
54+
const buffer2 = events2[0].properties!.signalBuffer
55+
expect(buffer2).toHaveLength(1)
56+
expect(buffer2[0]).toMatchObject({ type: 'userDefined' })
57+
})

packages/signals/signals/src/core/processor/sandbox.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ export type MethodName =
1818
/**
1919
* Buffer of any analytics calls made during the processing of a signal
2020
*/
21-
export type AnalyticsMethodCalls = Record<MethodName, any[]>
21+
export type AnalyticsMethodCalls = Record<MethodName, any[]> & {
22+
reset: unknown[]
23+
}
2224

2325
/**
2426
* Proxy around the analytics client
@@ -31,6 +33,7 @@ class AnalyticsRuntime implements AnalyticsRuntimePublicApi {
3133
alias: [],
3234
screen: [],
3335
group: [],
36+
reset: [],
3437
}
3538

3639
getCalls(): AnalyticsMethodCalls {
@@ -115,6 +118,10 @@ class AnalyticsRuntime implements AnalyticsRuntimePublicApi {
115118
console.error(err)
116119
}
117120
}
121+
122+
reset = () => {
123+
this.calls.reset.push([])
124+
}
118125
}
119126

120127
interface CodeSandbox {

packages/signals/signals/src/core/signals/signals.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ export class Signals implements ISignals {
8585
*/
8686
async start(analytics: AnyAnalytics): Promise<void> {
8787
const analyticsService = new AnalyticsService(analytics)
88+
analyticsService.instance.on('reset', () => {
89+
this.clearStorage()
90+
})
8891

8992
this.globalSettings.update({
9093
edgeFnDownloadURL: analyticsService.edgeFnSettings?.downloadURL,

packages/signals/signals/src/test-helpers/mocks/analytics-mock.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,6 @@ export const analyticsMock: jest.Mocked<AnyAnalytics> = {
2020
page: jest.fn(),
2121
track: jest.fn(),
2222
addSourceMiddleware: jest.fn(),
23+
reset: jest.fn(),
24+
on: jest.fn(),
2325
}

packages/signals/signals/src/types/analytics-api.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ export interface AnyAnalytics {
6666
group(...args: any[]): void
6767
alias(...args: any[]): void
6868
screen(...args: any[]): void
69+
reset(): void
70+
on(name: 'reset', fn: (...args: any[]) => void): void
6971
}
7072

7173
/**

packages/signals/signals/src/types/process-signal.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export interface AnalyticsRuntimePublicApi {
1414
group: (...args: any[]) => void
1515
page: (...args: any[]) => void
1616
screen: (...args: any[]) => void
17+
reset: () => void
1718
}
1819

1920
export type ProcessSignalScope = {

0 commit comments

Comments
 (0)