|
1 | | -import { describe, it, expect, beforeEach, vi } from 'vitest' |
2 | | -import { PowerSyncDatabase, SharedWebStreamingSyncImplementation, WebStreamingSyncImplementation } from '../../../src' |
3 | | -import { SSRStreamingSyncImplementation } from '../../../src/db/sync/SSRWebStreamingSyncImplementation' |
4 | | -import { testSchema } from '../../utils/testDb' |
| 1 | +import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest'; |
| 2 | +import { AbstractPowerSyncDatabase, PowerSyncDatabase, SyncStreamConnectionMethod } from '../../../src'; |
| 3 | +import { testSchema } from '../../utils/testDb'; |
5 | 4 |
|
6 | | -vi.mock('../../../src/db/sync/WebStreamingSyncImplementation') |
7 | | -vi.mock('../../../src/db/sync/SharedWebStreamingSyncImplementation') |
8 | | -vi.mock('../../../src/db/sync/SSRWebStreamingSyncImplementation') |
9 | | - |
10 | | -describe('PowerSyncDatabase - generateSyncStreamImplementation', () => { |
11 | | - const mockConnector = { |
12 | | - uploadData: vi.fn(), |
13 | | - fetchCredentials: vi.fn() |
14 | | - } |
| 5 | +describe('PowerSyncDatabase', () => { |
| 6 | + let db: PowerSyncDatabase; |
| 7 | + let mockConnector: any; |
| 8 | + let mockLogger: any; |
| 9 | + let mockSyncImplementation: any; |
15 | 10 |
|
16 | 11 | beforeEach(() => { |
17 | | - vi.resetAllMocks() |
18 | | - }) |
19 | | - |
20 | | - it('uses SSRStreamingSyncImplementation when ssrMode is true', async () => { |
21 | | - // This is to prevent a false positive from the unhandled rejection |
22 | | - // of using SSR in this test. |
23 | | - const handler = (event: PromiseRejectionEvent) => { |
24 | | - event.preventDefault() |
25 | | - } |
26 | | - window.addEventListener('unhandledrejection', handler) |
| 12 | + mockLogger = { |
| 13 | + debug: vi.fn(), |
| 14 | + }; |
27 | 15 |
|
28 | | - const db = new PowerSyncDatabase({ |
| 16 | + // Initialize with minimal required options |
| 17 | + db = new PowerSyncDatabase({ |
29 | 18 | schema: testSchema, |
30 | 19 | database: { |
31 | 20 | dbFilename: 'test.db' |
32 | 21 | }, |
33 | | - flags: { |
34 | | - ssrMode: true, |
35 | | - }, |
36 | | - retryDelayMs: 1000, |
37 | | - crudUploadThrottleMs: 2000 |
38 | | - }) |
| 22 | + logger: mockLogger |
| 23 | + }); |
39 | 24 |
|
40 | | - db['generateSyncStreamImplementation'](mockConnector, { retryDelayMs: 1000, crudUploadThrottleMs: 2000 }) |
41 | | - expect(SSRStreamingSyncImplementation).toHaveBeenCalled() |
| 25 | + vi.spyOn(db as any, 'runExclusive').mockImplementation((cb: any) => cb()); |
42 | 26 |
|
43 | | - await setTimeout(() => window.removeEventListener('unhandledrejection', handler), 1) |
44 | | - }) |
| 27 | + vi.spyOn(AbstractPowerSyncDatabase.prototype, 'connect') |
| 28 | + .mockResolvedValue(undefined); |
| 29 | + }); |
45 | 30 |
|
46 | | - it('uses SharedWebStreamingSyncImplementation when enableMultiTabs is true', () => { |
47 | | - const db = new PowerSyncDatabase({ |
48 | | - schema: testSchema, |
49 | | - database: { dbFilename: 'test.db' }, |
50 | | - flags: { enableMultiTabs: true } |
51 | | - }) |
52 | | - db['generateSyncStreamImplementation'](mockConnector, { retryDelayMs: 1000, crudUploadThrottleMs: 2000 }) |
53 | | - expect(SharedWebStreamingSyncImplementation).toHaveBeenCalled() |
54 | | - }) |
| 31 | + afterEach(() => { |
| 32 | + vi.clearAllMocks(); |
| 33 | + }); |
55 | 34 |
|
56 | | - it('handles option overrides', () => { |
57 | | - const db = new PowerSyncDatabase({ |
58 | | - schema: testSchema, |
59 | | - database: { |
60 | | - dbFilename: 'test.db' |
61 | | - }, |
62 | | - flags: { |
63 | | - ssrMode: false, |
64 | | - enableMultiTabs: false, |
65 | | - }, |
66 | | - retryDelayMs: 1000, |
67 | | - crudUploadThrottleMs: 1000 |
68 | | - }) |
69 | | - |
70 | | - db['generateSyncStreamImplementation'](mockConnector, { crudUploadThrottleMs: 20000, retryDelayMs: 50000 }) |
71 | | - expect(WebStreamingSyncImplementation).toHaveBeenCalledWith( |
72 | | - expect.objectContaining({ |
73 | | - retryDelayMs: 50000, |
74 | | - crudUploadThrottleMs: 20000 |
75 | | - }) |
76 | | - ) |
77 | | - }) |
| 35 | + describe('connect', () => { |
| 36 | + it('should log debug message when attempting to connect', async () => { |
| 37 | + await db.connect(mockConnector); |
| 38 | + expect(mockLogger.debug).toHaveBeenCalledWith('Attempting to connect to PowerSync instance'); |
| 39 | + expect(db['runExclusive']).toHaveBeenCalled(); |
| 40 | + }); |
78 | 41 |
|
79 | | - // This test can be removed once retryDelay is removed and entirely replaced with retryDelayMs |
80 | | - it('works when using deprecated retryDelay instead of retryDelayMs', async () => { |
81 | | - const db = new PowerSyncDatabase({ |
82 | | - schema: testSchema, |
83 | | - database: { |
84 | | - dbFilename: 'test.db' |
85 | | - }, |
86 | | - flags: { |
87 | | - ssrMode: false, |
88 | | - enableMultiTabs: false, |
89 | | - }, |
90 | | - retryDelay: 11100, |
91 | | - }) |
| 42 | + it('should use connect with correct options', async () => { |
| 43 | + await db.connect(mockConnector, { |
| 44 | + retryDelayMs: 1000, |
| 45 | + crudUploadThrottleMs: 2000, |
| 46 | + params: { |
| 47 | + param1: 1 |
| 48 | + }, |
| 49 | + connectionMethod: SyncStreamConnectionMethod.HTTP |
| 50 | + }); |
92 | 51 |
|
93 | | - db['generateSyncStreamImplementation'](mockConnector, { crudUploadThrottleMs: 2000, retryDelayMs: 50000 }) |
94 | | - expect(WebStreamingSyncImplementation).toHaveBeenCalledWith( |
95 | | - expect.objectContaining({ |
96 | | - retryDelay: 11100, |
97 | | - }) |
98 | | - ) |
99 | | - }) |
100 | | -}) |
| 52 | + expect(AbstractPowerSyncDatabase.prototype.connect).toHaveBeenCalledWith( |
| 53 | + mockConnector, |
| 54 | + { |
| 55 | + retryDelayMs: 1000, |
| 56 | + crudUploadThrottleMs: 2000, |
| 57 | + connectionMethod: "http", |
| 58 | + params: { |
| 59 | + param1: 1, |
| 60 | + }, |
| 61 | + } |
| 62 | + ); |
| 63 | + }); |
| 64 | + }); |
| 65 | +}); |
0 commit comments