1+ import { beforeEach , describe , expect , it , vi } from 'vitest' ;
2+ import { waitProperty } from '../../src/core' ;
3+
4+ describe ( 'wait property' , ( ) => {
5+ beforeEach ( ( ) => {
6+ vi . useFakeTimers ( ) ;
7+ } ) ;
8+
9+ it ( 'resolves immediately if property already exists' , async ( ) => {
10+ const obj = { foo : 123 } ;
11+
12+ const promise = waitProperty < number > ( obj , 'foo' ) ;
13+
14+ await expect ( promise ) . resolves . toBe ( 123 ) ;
15+ } ) ;
16+
17+ it ( 'resolves when property appears later' , async ( ) => {
18+ const obj : Record < string , unknown > = { } ;
19+
20+ const promise = waitProperty < string > ( obj , 'bar' , {
21+ interval : 10 ,
22+ timeout : 100 ,
23+ } ) ;
24+
25+ setTimeout ( ( ) => {
26+ obj . bar = 'hello' ;
27+ } , 30 ) ;
28+
29+ vi . advanceTimersByTime ( 30 ) ;
30+ await Promise . resolve ( ) ;
31+
32+ await expect ( promise ) . resolves . toBe ( 'hello' ) ;
33+ } ) ;
34+
35+ it ( 'rejects on timeout' , async ( ) => {
36+ const obj = { } ;
37+
38+ const promise = waitProperty ( obj , 'missing' , {
39+ interval : 10 ,
40+ timeout : 50 ,
41+ } ) ;
42+
43+ vi . advanceTimersByTime ( 60 ) ;
44+ await Promise . resolve ( ) ;
45+
46+ await expect ( promise ) . rejects . toThrow (
47+ 'Property "missing" was not defined within 50ms'
48+ ) ;
49+ } ) ;
50+
51+ it ( 'resolves multiple waiters when property appears' , async ( ) => {
52+ const obj : Record < string , unknown > = { } ;
53+
54+ const p1 = waitProperty < string > ( obj , 'shared' , { interval : 10 } ) ;
55+ const p2 = waitProperty < string > ( obj , 'shared' , { interval : 10 } ) ;
56+
57+ setTimeout ( ( ) => {
58+ obj . shared = 'ok' ;
59+ } , 20 ) ;
60+
61+ vi . advanceTimersByTime ( 20 ) ;
62+ await Promise . resolve ( ) ;
63+
64+ const [ v1 , v2 ] = await Promise . all ( [ p1 , p2 ] ) ;
65+
66+ expect ( v1 ) . toBe ( 'ok' ) ;
67+ expect ( v2 ) . toBe ( 'ok' ) ;
68+ } ) ;
69+ } ) ;
0 commit comments