Skip to content

Commit dac0b0a

Browse files
committed
Refactor CI workflow to conditionally install specific React versions based on the matrix configuration, ensuring compatibility with legacy peer dependencies. Update tests to utilize a centralized waitForScheduled function for improved readability and consistency in asynchronous handling.
1 parent 1150e58 commit dac0b0a

File tree

7 files changed

+143
-88
lines changed

7 files changed

+143
-88
lines changed

.github/workflows/ci.yml

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,14 @@ jobs:
3030
run: npm ci
3131

3232
- name: Install specific React version
33-
run: npm install react@${{ matrix.react-version }} react-dom@${{ matrix.react-version }} @types/react@${{ matrix.react-version }} @types/react-dom@${{ matrix.react-version }} --legacy-peer-deps
33+
run: |
34+
if [ "${{ matrix.react-version }}" = "16.8.0" ]; then
35+
npm install [email protected] [email protected] @types/[email protected] @types/[email protected] --legacy-peer-deps
36+
elif [ "${{ matrix.react-version }}" = "17.0.2" ]; then
37+
npm install [email protected] [email protected] @types/[email protected] @types/[email protected] --legacy-peer-deps
38+
elif [ "${{ matrix.react-version }}" = "18.2.0" ]; then
39+
npm install [email protected] [email protected] @types/[email protected] @types/[email protected] --legacy-peer-deps
40+
fi
3441
if: matrix.react-version != '19.1.0'
3542

3643
- name: Install React 19 without types (using built-in types)
@@ -47,7 +54,11 @@ jobs:
4754
run: |
4855
cd examples/todomvc
4956
npm ci
50-
npm install react@${{ matrix.react-version }} react-dom@${{ matrix.react-version }} --legacy-peer-deps
57+
if [ "${{ matrix.react-version }}" != "19.1.0" ]; then
58+
npm install react@${{ matrix.react-version }} react-dom@${{ matrix.react-version }} --legacy-peer-deps
59+
else
60+
npm install [email protected] [email protected] --legacy-peer-deps
61+
fi
5162
npm run build
5263
5364
typecheck:

src/tests/cofx.test.ts

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { initAppDb, getAppDb } from '../db';
55
import { clearGlobalInterceptors } from '../settings';
66
import type { CoEffects, Context } from '../types';
77
import { consoleLog } from '../loggers';
8+
import { waitForScheduled } from './test-utils';
89

910
describe('regCofx - Co-Effects', () => {
1011
beforeEach(() => {
@@ -28,7 +29,7 @@ describe('regCofx - Co-Effects', () => {
2829
dispatch(['test-db-cofx']);
2930

3031
// Wait for async processing
31-
await new Promise(resolve => setTimeout(resolve, 0));
32+
await waitForScheduled();
3233

3334
// Verify db was injected
3435
expect(capturedCoeffects).not.toBeNull();
@@ -48,7 +49,7 @@ describe('regCofx - Co-Effects', () => {
4849
dispatch(['test-now-cofx']);
4950

5051
// Wait for async processing
51-
await new Promise(resolve => setTimeout(resolve, 0));
52+
await waitForScheduled();
5253

5354
const endTime = Date.now();
5455

@@ -71,7 +72,7 @@ describe('regCofx - Co-Effects', () => {
7172
dispatch(['test-random-cofx']);
7273

7374
// Wait for async processing
74-
await new Promise(resolve => setTimeout(resolve, 0));
75+
await waitForScheduled();
7576

7677
// Verify random was injected
7778
expect(capturedCoeffects).not.toBeNull();
@@ -95,7 +96,7 @@ describe('regCofx - Co-Effects', () => {
9596
dispatch(['test-multiple-cofx']);
9697

9798
// Wait for async processing
98-
await new Promise(resolve => setTimeout(resolve, 0));
99+
await waitForScheduled();
99100

100101
// Verify all co-effects were injected
101102
expect(capturedCoeffects).not.toBeNull();
@@ -128,7 +129,7 @@ describe('regCofx - Co-Effects', () => {
128129
dispatch(['test-custom-cofx']);
129130

130131
// Wait for async processing
131-
await new Promise(resolve => setTimeout(resolve, 0));
132+
await waitForScheduled();
132133

133134
// Verify custom co-effect was injected
134135
expect(capturedCoeffects).not.toBeNull();
@@ -157,7 +158,7 @@ describe('regCofx - Co-Effects', () => {
157158
dispatch(['test-param-cofx']);
158159

159160
// Wait for async processing
160-
await new Promise(resolve => setTimeout(resolve, 0));
161+
await waitForScheduled();
161162

162163
// Verify parameterized co-effect was injected
163164
expect(capturedCoeffects).not.toBeNull();
@@ -190,7 +191,7 @@ describe('regCofx - Co-Effects', () => {
190191
dispatch(['test-complex-cofx']);
191192

192193
// Wait for async processing
193-
await new Promise(resolve => setTimeout(resolve, 0));
194+
await waitForScheduled();
194195

195196
// Verify complex co-effect was injected
196197
expect(capturedCoeffects).not.toBeNull();
@@ -225,7 +226,7 @@ describe('regCofx - Co-Effects', () => {
225226
dispatch(['test-cofx-logic']);
226227

227228
// Wait for async processing
228-
await new Promise(resolve => setTimeout(resolve, 0));
229+
await waitForScheduled();
229230

230231
// Verify co-effects were used in business logic
231232
const updatedDb = getAppDb();
@@ -268,7 +269,7 @@ describe('regCofx - Co-Effects', () => {
268269
dispatch(['test-chained-cofx']);
269270

270271
// Wait for async processing
271-
await new Promise(resolve => setTimeout(resolve, 0));
272+
await waitForScheduled();
272273

273274
// Verify all co-effects were chained correctly
274275
expect(capturedCoeffects).not.toBeNull();
@@ -306,7 +307,7 @@ describe('regCofx - Co-Effects', () => {
306307
dispatch(['test-error-handling']);
307308

308309
// Wait for async processing
309-
await new Promise(resolve => setTimeout(resolve, 0));
310+
await waitForScheduled();
310311

311312
// Verify error was logged
312313
expectLogCall('error', '[reflex] Co-effect failed');
@@ -328,7 +329,7 @@ describe('regCofx - Co-Effects', () => {
328329
dispatch(['test-unregistered-cofx']);
329330

330331
// Wait for async processing
331-
await new Promise(resolve => setTimeout(resolve, 0));
332+
await waitForScheduled();
332333

333334
// Verify error was logged
334335
expectLogCall(
@@ -370,7 +371,7 @@ describe('regCofx - Co-Effects', () => {
370371
dispatch(['test-params-with-cofx', 'param1', { key: 'value' }, 123]);
371372

372373
// Wait for async processing
373-
await new Promise(resolve => setTimeout(resolve, 0));
374+
await waitForScheduled();
374375

375376
// Verify co-effects and parameters work together
376377
expect(capturedCoeffects).not.toBeNull();
@@ -407,7 +408,7 @@ describe('regCofx - Co-Effects', () => {
407408
dispatch(['test-no-cofx']);
408409

409410
// Wait for async processing
410-
await new Promise(resolve => setTimeout(resolve, 0));
411+
await waitForScheduled();
411412

412413
// Verify expensive co-effect was NOT called
413414
expect(cofxSpy).not.toHaveBeenCalled();
@@ -422,7 +423,7 @@ describe('regCofx - Co-Effects', () => {
422423
dispatch(['test-with-cofx']);
423424

424425
// Wait for async processing
425-
await new Promise(resolve => setTimeout(resolve, 0));
426+
await waitForScheduled();
426427

427428
// Verify expensive co-effect WAS called
428429
expect(cofxSpy).toHaveBeenCalledTimes(1);

src/tests/events.test.ts

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,7 @@ import { initAppDb, getAppDb } from '../db';
55
import { registerHandler, getHandler } from '../registrar';
66
import { regGlobalInterceptor, clearGlobalInterceptors } from '../settings';
77
import type { Interceptor, Context } from '../types';
8-
9-
// Helper to wait for all scheduled callbacks to complete
10-
const waitForScheduled = async () => {
11-
// Wait for multiple event loop cycles to ensure all scheduling mechanisms complete
12-
if (typeof (globalThis as any).setImmediate === 'function') {
13-
await new Promise(resolve => (globalThis as any).setImmediate(() => resolve(undefined)));
14-
}
15-
await new Promise(resolve => setTimeout(resolve, 0));
16-
await Promise.resolve();
17-
};
8+
import { waitForScheduled } from './test-utils';
189

1910
// Type definitions for testing type-safe event handlers
2011
interface EventTestState {
@@ -296,7 +287,7 @@ describe('Type-safe Event Handlers', () => {
296287
dispatch(['increment-counter']);
297288

298289
// Wait for async processing
299-
await new Promise(resolve => setTimeout(resolve, 0));
290+
await waitForScheduled();
300291

301292
const db = getAppDb<EventTestState>();
302293
expect(db.counter).toBe(1);
@@ -309,7 +300,7 @@ describe('Type-safe Event Handlers', () => {
309300
});
310301

311302
dispatch(['add-message', 'Hello World']);
312-
await new Promise(resolve => setTimeout(resolve, 0));
303+
await waitForScheduled();
313304

314305
const db = getAppDb<EventTestState>();
315306
expect(db.messages).toContain('Hello World');
@@ -324,7 +315,7 @@ describe('Type-safe Event Handlers', () => {
324315
});
325316

326317
dispatch(['update-user', 'John Doe', false]);
327-
await new Promise(resolve => setTimeout(resolve, 0));
318+
await waitForScheduled();
328319

329320
const db = getAppDb<EventTestState>();
330321
expect(db.user.name).toBe('John Doe');
@@ -339,14 +330,14 @@ describe('Type-safe Event Handlers', () => {
339330

340331
// Toggle from light to dark
341332
dispatch(['toggle-theme']);
342-
await new Promise(resolve => setTimeout(resolve, 0));
333+
await waitForScheduled();
343334

344335
let db = getAppDb<EventTestState>();
345336
expect(db.settings.theme).toBe('dark');
346337

347338
// Toggle back to light
348339
dispatch(['toggle-theme']);
349-
await new Promise(resolve => setTimeout(resolve, 0));
340+
await waitForScheduled();
350341

351342
db = getAppDb<EventTestState>();
352343
expect(db.settings.theme).toBe('light');
@@ -363,7 +354,7 @@ describe('Type-safe Event Handlers', () => {
363354
});
364355

365356
dispatch(['complex-update', 42, 'Complex User', ['msg1', 'msg2', 'msg3']]);
366-
await new Promise(resolve => setTimeout(resolve, 0));
357+
await waitForScheduled();
367358

368359
const db = getAppDb<EventTestState>();
369360
expect(db.user.id).toBe(42);
@@ -472,7 +463,7 @@ describe('regEvent with cofx', () => {
472463
}, [['now']]);
473464

474465
dispatch(['test-now-cofx']);
475-
await new Promise(resolve => setTimeout(resolve, 0));
466+
await waitForScheduled();
476467

477468
const db = getAppDb();
478469
expect(db.timestamp).toBeGreaterThan(0);
@@ -489,7 +480,7 @@ describe('regEvent with cofx', () => {
489480
}, [['random']]);
490481

491482
dispatch(['test-random-cofx']);
492-
await new Promise(resolve => setTimeout(resolve, 0));
483+
await waitForScheduled();
493484

494485
const db = getAppDb();
495486
expect(db.randomValue).toBeGreaterThanOrEqual(0);
@@ -507,7 +498,7 @@ describe('regEvent with cofx', () => {
507498
});
508499

509500
dispatch(['test-db-cofx']);
510-
await new Promise(resolve => setTimeout(resolve, 0));
501+
await waitForScheduled();
511502

512503
const db = getAppDb();
513504
expect(db.counter).toBe(5);
@@ -527,7 +518,7 @@ describe('regEvent with cofx', () => {
527518
}, [['now'], ['random']]);
528519

529520
dispatch(['test-multiple-cofx']);
530-
await new Promise(resolve => setTimeout(resolve, 0));
521+
await waitForScheduled();
531522

532523
const db = getAppDb();
533524
expect(db.timestamp).toBeGreaterThan(0);
@@ -566,7 +557,7 @@ describe('regEvent with cofx', () => {
566557
}, [['now']], [beforeInterceptor, afterInterceptor]);
567558

568559
dispatch(['test-cofx-with-interceptors']);
569-
await new Promise(resolve => setTimeout(resolve, 0));
560+
await waitForScheduled();
570561

571562
const db = getAppDb();
572563
expect(db.timestamp).toBeGreaterThan(0);
@@ -594,7 +585,7 @@ describe('regEvent with cofx', () => {
594585
}, [testInterceptor]);
595586

596587
dispatch(['test-backward-compat']);
597-
await new Promise(resolve => setTimeout(resolve, 0));
588+
await waitForScheduled();
598589

599590
const db = getAppDb();
600591
expect(db.counter).toBe(1);
@@ -608,7 +599,7 @@ describe('regEvent with cofx', () => {
608599
});
609600

610601
dispatch(['test-handler-only']);
611-
await new Promise(resolve => setTimeout(resolve, 0));
602+
await waitForScheduled();
612603

613604
const db = getAppDb();
614605
expect(db.counter).toBe(2);
@@ -623,7 +614,7 @@ describe('regEvent with cofx', () => {
623614
}, [['now', 'extra', 'invalid']]);
624615

625616
dispatch(['test-invalid-cofx']);
626-
await new Promise(resolve => setTimeout(resolve, 0));
617+
await waitForScheduled();
627618

628619
// Verify warning was logged
629620
expectLogCall(
@@ -649,7 +640,7 @@ describe('regEvent with cofx', () => {
649640
}, [['custom-test']]);
650641

651642
dispatch(['test-custom-cofx']);
652-
await new Promise(resolve => setTimeout(resolve, 0));
643+
await waitForScheduled();
653644

654645
const db = getAppDb();
655646
expect(db.messages).toContain('default-custom-value');
@@ -669,7 +660,7 @@ describe('regEvent with cofx', () => {
669660
}, [['custom-with-value', 'test-input']]);
670661

671662
dispatch(['test-custom-cofx-with-value']);
672-
await new Promise(resolve => setTimeout(resolve, 0));
663+
await waitForScheduled();
673664

674665
const db = getAppDb();
675666
expect(db.messages).toContain('processed-test-input');
@@ -839,6 +830,8 @@ describe('regEvent with cofx', () => {
839830

840831
dispatch(['test-fx-modification']);
841832
await waitForScheduled();
833+
// Wait for the dispatched effects to complete
834+
await waitForScheduled();
842835

843836
const db = getAppDb();
844837
expect(db.primaryProcessed).toBe(true);

0 commit comments

Comments
 (0)