Skip to content

Commit 5c1cf9c

Browse files
authored
test: add failing test cases for #12681
1 parent 22dcbf3 commit 5c1cf9c

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

packages/reactivity/__tests__/watch.spec.ts

+40
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
type WatchOptions,
66
type WatchScheduler,
77
computed,
8+
onScopeDispose,
89
onWatcherCleanup,
910
ref,
1011
watch,
@@ -277,4 +278,43 @@ describe('watch', () => {
277278

278279
expect(dummy).toEqual([1, 2, 3])
279280
})
281+
282+
// #12681
283+
test('onScopeDispose inside non-immediate watcher that ran', () => {
284+
const cleanupSpy = vi.fn()
285+
const cbSpy = vi.fn(() => {
286+
onScopeDispose(cleanupSpy)
287+
})
288+
const scope = new EffectScope()
289+
290+
scope.run(() => {
291+
const signal = ref(false)
292+
watch(signal, cbSpy)
293+
signal.value = true
294+
})
295+
296+
scope.stop()
297+
298+
expect(cbSpy).toBeCalledTimes(1)
299+
expect(cleanupSpy).toBeCalledTimes(1)
300+
})
301+
302+
// #12681
303+
test('onScopeDispose inside non-immediate watcher that did not run the callback', () => {
304+
const cleanupSpy = vi.fn()
305+
const cbSpy = vi.fn(() => {
306+
onScopeDispose(cleanupSpy)
307+
})
308+
const scope = new EffectScope()
309+
310+
scope.run(() => {
311+
const signal = ref(false)
312+
watch(signal, cbSpy)
313+
})
314+
315+
scope.stop()
316+
317+
expect(cbSpy).toBeCalledTimes(1)
318+
expect(cleanupSpy).toBeCalledTimes(1)
319+
})
280320
})

packages/runtime-core/__tests__/apiWatch.spec.ts

+39
Original file line numberDiff line numberDiff line change
@@ -2010,4 +2010,43 @@ describe('api: watch', () => {
20102010
createApp(App).mount(root)
20112011
expect(onCleanup).toBeCalledTimes(0)
20122012
})
2013+
2014+
// #12681
2015+
test('onScopeDispose inside non-immediate watcher that ran', () => {
2016+
const cleanupSpy = vi.fn()
2017+
const cbSpy = vi.fn(() => {
2018+
onScopeDispose(cleanupSpy)
2019+
})
2020+
const scope = effectScope()
2021+
2022+
scope.run(() => {
2023+
const signal = ref(false)
2024+
watch(signal, cbSpy)
2025+
signal.value = true
2026+
})
2027+
2028+
scope.stop()
2029+
2030+
expect(cbSpy).toBeCalledTimes(1)
2031+
expect(cleanupSpy).toBeCalledTimes(1)
2032+
})
2033+
2034+
// #12681
2035+
test('onScopeDispose inside non-immediate watcher that did not run the callback', () => {
2036+
const cleanupSpy = vi.fn()
2037+
const cbSpy = vi.fn(() => {
2038+
onScopeDispose(cleanupSpy)
2039+
})
2040+
const scope = effectScope()
2041+
2042+
scope.run(() => {
2043+
const signal = ref(false)
2044+
watch(signal, cbSpy)
2045+
})
2046+
2047+
scope.stop()
2048+
2049+
expect(cbSpy).toBeCalledTimes(1)
2050+
expect(cleanupSpy).toBeCalledTimes(1)
2051+
})
20132052
})

0 commit comments

Comments
 (0)