import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; import { getScenarioRuntime, RudderClient } from '../../src/client/RudderClient.js'; import { createFakeTokenStore } from '../helpers/FakeTokenStore.js'; import { createFakeGateway, type FakeGateway } from '../helpers/fakeGateway.js'; import { stubDeterministicUuid } from '../helpers/memoryPlanStore.js'; import { effect } from '../helpers/plan.js'; import type { StoreOfferEffect, WaitEffect } from '../../src/index.js'; const MINUTE = 60_000; describe('E2E: pending effects resume after a new login', () => { let gateway: FakeGateway; function makeClient(): RudderClient { return new RudderClient({ baseUrl: 'https://api.test.rudder.build', projectKey: 'test-project', tokenStore: createFakeTokenStore(), runtime: { loginEvent: null }, }); } beforeEach(() => { stubDeterministicUuid(); vi.useFakeTimers(); gateway = createFakeGateway({ stores: [{ slug: 'starter', name: 'Starter', offers: [{ id: 'pack_1', slug: 'pack-1', name: 'Pack' }] }], }); const now = Date.now(); const wait = effect('wait', {}, { scenarioSlug: 'offer_flow', runId: 'offer_flow-run', nodeId: 'wait_intro', waitDeadline: new Date(now + MINUTE).toISOString(), }); const offer = effect('store', { message: 'Limited starter pack!', storeSlug: 'starter' }, { scenarioSlug: 'offer_flow', runId: 'offer_flow-run', nodeId: 'offer', }); gateway.onEvent('session_start', wait); gateway.onCallback('wait_intro', 'onComplete', offer); gateway.install(); }); afterEach(() => { vi.useRealTimers(); vi.unstubAllGlobals(); }); it('a wait started before reload resumes from GET pending after login', async () => { const client1 = makeClient(); await client1.auth.loginWithDevice(); const runtime1 = await getScenarioRuntime(client1); await runtime1.send('session_start'); expect(runtime1.isRunning).toBe(true); const client2 = makeClient(); const resumedWaits: WaitEffect[] = []; let offer: StoreOfferEffect | undefined; client2.effects.onWait((s) => { resumedWaits.push(s); }); client2.effects.onStoreOffer((s) => { offer = s; }); await client2.auth.loginWithDevice(); expect(resumedWaits).toHaveLength(1); expect(offer).toBeUndefined(); await vi.advanceTimersByTimeAsync(MINUTE); await vi.waitFor(() => expect(offer).toBeDefined()); expect(offer!.message).toBe('Limited starter pack!'); }); });