Skip to content

Commit 794a275

Browse files
committed
wip
1 parent f92b8d6 commit 794a275

File tree

2 files changed

+75
-1
lines changed

2 files changed

+75
-1
lines changed
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import { sleep } from '@segment/analytics-core'
2+
import { createInteractionSignal } from '../../../../types/factories'
3+
import { SignalEmitter } from '../../../emitter'
4+
import { OnChangeGenerator } from '../change-gen'
5+
6+
describe('OnChangeGenerator', () => {
7+
let onChangeGenerator: OnChangeGenerator
8+
let emitter: SignalEmitter
9+
let unregister: () => void
10+
beforeEach(() => {
11+
onChangeGenerator = new OnChangeGenerator()
12+
emitter = new SignalEmitter()
13+
})
14+
15+
afterEach(() => {
16+
unregister()
17+
})
18+
19+
it('should emit a signal on change event', async () => {
20+
const emitSpy = jest.spyOn(emitter, 'emit')
21+
const target = document.createElement('input')
22+
target.type = 'text'
23+
target.value = 'new value'
24+
25+
const event = new Event('change', { bubbles: true })
26+
Object.defineProperty(event, 'target', { value: target })
27+
28+
unregister = onChangeGenerator.register(emitter)
29+
document.dispatchEvent(event)
30+
31+
await sleep(100)
32+
33+
expect(emitSpy).toHaveBeenCalledWith(
34+
createInteractionSignal({
35+
eventType: 'change',
36+
listener: 'onchange',
37+
target: expect.any(Object),
38+
change: { value: 'new value' },
39+
})
40+
)
41+
})
42+
43+
it('should not emit a signal for ignored elements', () => {
44+
const emitSpy = jest.spyOn(emitter, 'emit')
45+
const target = document.createElement('input')
46+
target.type = 'password'
47+
48+
const event = new Event('change', { bubbles: true })
49+
Object.defineProperty(event, 'target', { value: target })
50+
51+
unregister = onChangeGenerator.register(emitter)
52+
document.dispatchEvent(event)
53+
54+
expect(emitSpy).not.toHaveBeenCalled()
55+
})
56+
57+
it('should not emit a signal for elements handled by mutation observer', () => {
58+
const emitSpy = jest.spyOn(emitter, 'emit')
59+
const target = document.createElement('input')
60+
target.type = 'text'
61+
target.setAttribute('value', 'initial value')
62+
63+
const event = new Event('change', { bubbles: true })
64+
Object.defineProperty(event, 'target', { value: target })
65+
66+
unregister = onChangeGenerator.register(emitter)
67+
document.dispatchEvent(event)
68+
69+
expect(emitSpy).not.toHaveBeenCalled()
70+
})
71+
})

packages/signals/signals/src/core/signal-generators/dom-gen/change-gen.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,10 @@ export class OnChangeGenerator implements SignalGenerator {
6767
const parseChange = (target: HTMLElement): ChangedEvent | undefined => {
6868
if (target instanceof HTMLSelectElement) {
6969
return {
70-
selectedOptions: Array.from(target.selectedOptions),
70+
selectedOptions: Array.from(target.selectedOptions).map((option) => ({
71+
value: option.value,
72+
label: option.label,
73+
})),
7174
}
7275
}
7376
if (target instanceof HTMLTextAreaElement) {

0 commit comments

Comments
 (0)