Skip to content

Commit 2770df4

Browse files
Fix Unit Tests (#497)
1 parent e190454 commit 2770df4

27 files changed

+1542
-2219
lines changed

.github/workflows/test.yml

+5
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ jobs:
4040
- name: Install dependencies
4141
run: pnpm install
4242

43+
- name: Configure Playwright
44+
run: |
45+
pnpm exec playwright install-deps
46+
pnpm exec playwright install
47+
4348
- name: Build
4449
run: pnpm build:packages
4550

README.md

+10-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<a href="https://www.powersync.com" target="_blank"><img src="https://github.com/powersync-ja/.github/assets/7372448/d2538c43-c1a0-4c47-9a76-41462dba484f"/></a>
33
</p>
44

5-
*[PowerSync](https://www.powersync.com) is a sync engine for building local-first apps with instantly-responsive UI/UX and simplified state transfer. Syncs between SQLite on the client-side and Postgres, MongoDB or MySQL on the server-side.*
5+
_[PowerSync](https://www.powersync.com) is a sync engine for building local-first apps with instantly-responsive UI/UX and simplified state transfer. Syncs between SQLite on the client-side and Postgres, MongoDB or MySQL on the server-side._
66

77
# PowerSync JavaScript SDKs
88

@@ -100,6 +100,15 @@ Build packages
100100
pnpm build:packages
101101
```
102102

103+
## Tests
104+
105+
Some packages use [Playwright](https://www.npmjs.com/package/playwright) for testing. Install Playwright dependencies with:
106+
107+
```bash
108+
pnpm exec playwright install-deps
109+
pnpm exec playwright install
110+
```
111+
103112
## Versioning
104113

105114
### Development Packages

package.json

+5-1
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,12 @@
3333
"@actions/core": "^1.10.1",
3434
"@changesets/cli": "2.27.2",
3535
"@pnpm/workspace.find-packages": "^4.0.2",
36+
"@vitest/browser": "^3.0.5",
3637
"husky": "^9.0.11",
3738
"lint-staged": "^15.2.2",
38-
"prettier": "^3.2.5"
39+
"playwright": "^1.50.1",
40+
"prettier": "^3.2.5",
41+
"typescript": "^5.7.2",
42+
"vitest": "^3.0.5"
3943
}
4044
}

packages/attachments/package.json

+3-8
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,9 @@
3232
"@powersync/common": "workspace:^1.18.1"
3333
},
3434
"devDependencies": {
35+
"@powersync/common": "workspace:*",
3536
"@types/node": "^20.17.6",
36-
"@vitest/browser": "^2.1.8",
37-
"ts-loader": "^9.5.1",
38-
"ts-node": "^10.9.2",
39-
"typescript": "^5.7.2",
40-
"vite": "^5.4.11",
41-
"vite-plugin-top-level-await": "^1.4.4",
42-
"vitest": "^2.1.8",
43-
"webdriverio": "^9.4.5"
37+
"vite": "^6.1.0",
38+
"vite-plugin-top-level-await": "^1.4.4"
4439
}
4540
}

packages/attachments/vitest.config.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,12 @@ const config: UserConfigExport = {
1010
browser: {
1111
enabled: true,
1212
headless: true,
13-
provider: 'webdriverio',
14-
name: 'chrome' // browser name is required
13+
provider: 'playwright',
14+
instances: [
15+
{
16+
browser: 'chromium'
17+
}
18+
]
1519
}
1620
}
1721
};

packages/common/package.json

-2
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,6 @@
5858
"rsocket-core": "1.0.0-alpha.3",
5959
"rsocket-websocket-client": "1.0.0-alpha.3",
6060
"text-encoding": "^0.7.0",
61-
"typescript": "^5.5.3",
62-
"vitest": "^2.0.5",
6361
"web-streams-polyfill": "3.2.1"
6462
}
6563
}

packages/common/src/client/sync/stream/AbstractRemote.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,21 @@ import { type fetch } from 'cross-fetch';
55
import Logger, { ILogger } from 'js-logger';
66
import { RSocket, RSocketConnector, Requestable } from 'rsocket-core';
77
import { WebsocketClientTransport } from 'rsocket-websocket-client';
8+
import PACKAGE from '../../../../package.json' with { type: 'json' };
89
import { AbortOperation } from '../../../utils/AbortOperation.js';
910
import { DataStream } from '../../../utils/DataStream.js';
1011
import { PowerSyncCredentials } from '../../connection/PowerSyncCredentials.js';
1112
import { StreamingSyncLine, StreamingSyncRequest } from './streaming-sync-types.js';
1213

13-
import { version as POWERSYNC_JS_VERSION } from '../../../../package.json';
14-
1514
export type BSONImplementation = typeof BSON;
1615

17-
const POWERSYNC_TRAILING_SLASH_MATCH = /\/+$/;
1816
export type RemoteConnector = {
1917
fetchCredentials: () => Promise<PowerSyncCredentials | null>;
2018
};
2119

20+
const POWERSYNC_TRAILING_SLASH_MATCH = /\/+$/;
21+
const POWERSYNC_JS_VERSION = PACKAGE.version;
22+
2223
// Refresh at least 30 sec before it expires
2324
const REFRESH_CREDENTIALS_SAFETY_PERIOD_MS = 30_000;
2425
const SYNC_QUEUE_REQUEST_LOW_WATER = 5;

packages/common/tsconfig.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
"outDir": "./lib",
99
"lib": ["esnext"],
1010
"declaration": true,
11-
"module": "node16",
12-
"moduleResolution": "node16",
11+
"module": "NodeNext",
12+
"moduleResolution": "nodenext",
1313
"preserveConstEnums": true,
1414
"esModuleInterop": false,
1515
"skipLibCheck": false,

packages/drizzle-driver/package.json

+2-8
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,9 @@
3333
"@powersync/web": "workspace:*",
3434
"@journeyapps/wa-sqlite": "^1.2.0",
3535
"@types/node": "^20.17.6",
36-
"@vitest/browser": "^2.1.4",
3736
"drizzle-orm": "^0.35.2",
38-
"ts-loader": "^9.5.1",
39-
"ts-node": "^10.9.2",
40-
"typescript": "^5.6.3",
41-
"vite": "^5.4.10",
37+
"vite": "^6.1.0",
4238
"vite-plugin-top-level-await": "^1.4.4",
43-
"vite-plugin-wasm": "^3.3.0",
44-
"vitest": "^2.1.4",
45-
"webdriverio": "^9.2.8"
39+
"vite-plugin-wasm": "^3.3.0"
4640
}
4741
}

packages/drizzle-driver/vitest.config.ts

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import wasm from 'vite-plugin-wasm';
21
import topLevelAwait from 'vite-plugin-top-level-await';
2+
import wasm from 'vite-plugin-wasm';
33
import { defineConfig, UserConfigExport } from 'vitest/config';
44

55
const config: UserConfigExport = {
@@ -20,8 +20,12 @@ const config: UserConfigExport = {
2020
browser: {
2121
enabled: true,
2222
headless: true,
23-
provider: 'webdriverio',
24-
name: 'chrome' // browser name is required
23+
provider: 'playwright',
24+
instances: [
25+
{
26+
browser: 'chromium'
27+
}
28+
]
2529
}
2630
}
2731
};

packages/kysely-driver/package.json

+2-8
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,8 @@
3535
"@powersync/web": "workspace:*",
3636
"@journeyapps/wa-sqlite": "^1.2.0",
3737
"@types/node": "^20.17.6",
38-
"@vitest/browser": "^2.1.4",
39-
"ts-loader": "^9.5.1",
40-
"ts-node": "^10.9.2",
41-
"typescript": "^5.6.3",
42-
"vite": "^5.4.10",
38+
"vite": "^6.1.0",
4339
"vite-plugin-top-level-await": "^1.4.4",
44-
"vite-plugin-wasm": "^3.3.0",
45-
"vitest": "^2.1.4",
46-
"webdriverio": "^9.2.8"
40+
"vite-plugin-wasm": "^3.3.0"
4741
}
4842
}

packages/kysely-driver/vitest.config.ts

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import wasm from 'vite-plugin-wasm';
21
import topLevelAwait from 'vite-plugin-top-level-await';
2+
import wasm from 'vite-plugin-wasm';
33
import { defineConfig, UserConfigExport } from 'vitest/config';
44

55
const config: UserConfigExport = {
@@ -20,8 +20,12 @@ const config: UserConfigExport = {
2020
browser: {
2121
enabled: true,
2222
headless: true,
23-
provider: 'webdriverio',
24-
name: 'chrome' // browser name is required
23+
provider: 'playwright',
24+
instances: [
25+
{
26+
browser: 'chromium'
27+
}
28+
]
2529
}
2630
}
2731
};

packages/powersync-op-sqlite/package.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,7 @@
8787
"react": "18.3.1",
8888
"react-native": "0.75.3",
8989
"react-native-builder-bob": "^0.30.2",
90-
"turbo": "^1.10.7",
91-
"typescript": "^5.2.2"
90+
"turbo": "^1.10.7"
9291
},
9392
"eslintIgnore": [
9493
"node_modules/",

packages/react-native/package.json

-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@
6262
"react-native-fetch-api": "^3.0.0",
6363
"rollup": "4.14.3",
6464
"text-encoding": "^0.7.0",
65-
"typescript": "^5.5.3",
6665
"web-streams-polyfill": "3.2.1"
6766
},
6867
"keywords": [

packages/react/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@
3333
"react": "*"
3434
},
3535
"devDependencies": {
36+
"@powersync/common": "workspace:*",
3637
"@testing-library/react": "^15.0.2",
3738
"@types/react": "^18.2.34",
3839
"jsdom": "^24.0.0",
3940
"react": "18.2.0",
40-
"react-error-boundary": "^4.1.0",
41-
"typescript": "^5.5.3"
41+
"react-error-boundary": "^4.1.0"
4242
}
4343
}

packages/react/tests/useQuery.test.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ describe('useQuery', () => {
106106

107107
await waitFor(
108108
async () => {
109-
expect(result.current.error).toEqual(Error('PowerSync failed to fetch data: some error'));
109+
expect(result.current.error?.message).equal('PowerSync failed to fetch data: some error');
110110
},
111111
{ timeout: 100 }
112112
);
@@ -131,7 +131,7 @@ describe('useQuery', () => {
131131

132132
await waitFor(
133133
async () => {
134-
expect(result.current.error).toEqual(Error('PowerSync failed to fetch data: some error'));
134+
expect(result.current.error?.message).equals('PowerSync failed to fetch data: some error');
135135
},
136136
{ timeout: 100 }
137137
);

packages/tanstack-react-query/package.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
"@testing-library/react": "^15.0.2",
4242
"@types/react": "^18.2.34",
4343
"jsdom": "^24.0.0",
44-
"react": "18.2.0",
45-
"typescript": "^5.5.3"
44+
"react": "18.2.0"
4645
}
4746
}

packages/vue/package.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,9 @@
3333
"@powersync/common": "workspace:^1.21.0"
3434
},
3535
"devDependencies": {
36+
"@powersync/common": "workspace:*",
3637
"flush-promises": "^1.0.2",
3738
"jsdom": "^24.0.0",
38-
"typescript": "^5.5.3",
39-
"vitest": "^1.5.1",
4039
"vue": "3.4.21"
4140
}
4241
}

packages/vue/tests/useQuery.test.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ describe('useQuery', () => {
2424

2525
const [{ data, isLoading, isFetching, error }] = withSetup(() => useQuery('SELECT * from lists'));
2626

27-
expect(error.value).toEqual(Error('PowerSync not configured.'));
27+
expect(error.value?.message).toEqual('PowerSync not configured.');
2828
expect(isFetching.value).toEqual(false);
2929
expect(isLoading.value).toEqual(false);
3030
expect(data.value).toEqual([]);
@@ -110,7 +110,7 @@ describe('useQuery', () => {
110110
const [{ error }] = withSetup(() => useQuery('SELECT * from lists', [], { runQueryOnce: true }));
111111
await flushPromises();
112112

113-
expect(error.value).toEqual(Error('PowerSync failed to fetch data: some error'));
113+
expect(error.value?.message).toEqual('PowerSync failed to fetch data: some error');
114114
});
115115

116116
it('should set error when error occurs', async () => {
@@ -125,7 +125,7 @@ describe('useQuery', () => {
125125
const [{ error }] = withSetup(() => useQuery('SELECT * from lists', []));
126126
await flushPromises();
127127

128-
expect(error.value).toEqual(Error('PowerSync failed to fetch data: some error'));
128+
expect(error.value?.message).toEqual('PowerSync failed to fetch data: some error');
129129
});
130130

131131
it('should accept compilable queries', async () => {
@@ -163,8 +163,8 @@ describe('useQuery', () => {
163163
useQuery({ execute: () => [] as any, compile: () => ({ sql: 'SELECT * from lists', parameters: [] }) }, ['x'])
164164
);
165165

166-
expect(error.value).toEqual(
167-
Error('PowerSync failed to fetch data: You cannot pass parameters to a compiled query.')
166+
expect(error.value?.message).toEqual(
167+
'PowerSync failed to fetch data: You cannot pass parameters to a compiled query.'
168168
);
169169
});
170170
});

packages/web/package.json

+2-6
Original file line numberDiff line numberDiff line change
@@ -74,20 +74,16 @@
7474
"devDependencies": {
7575
"@journeyapps/wa-sqlite": "^1.2.0",
7676
"@types/uuid": "^9.0.6",
77-
"@vitest/browser": "^2.1.4",
7877
"crypto-browserify": "^3.12.0",
7978
"p-defer": "^4.0.1",
8079
"source-map-loader": "^5.0.0",
8180
"stream-browserify": "^3.0.0",
8281
"terser-webpack-plugin": "^5.3.9",
83-
"typescript": "^5.5.3",
8482
"uuid": "^9.0.1",
85-
"vite": "^5.4.10",
86-
"vite-plugin-top-level-await": "^1.4.1",
83+
"vite": "^6.1.0",
84+
"vite-plugin-top-level-await": "^1.4.4",
8785
"vite-plugin-wasm": "^3.3.0",
88-
"vitest": "^2.1.4",
8986
"vm-browserify": "^1.1.2",
90-
"webdriverio": "^8.40.6",
9187
"webpack": "^5.90.1",
9288
"webpack-cli": "^5.1.4",
9389
"webpack-node-externals": "^3.0.0"

packages/web/tests/crud.test.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ describe('CRUD Tests', () => {
7979
expect(await powersync.get('SELECT count(*) AS count FROM assets')).deep.equals({ count: 1 });
8080

8181
// Make sure uniqueness is enforced
82-
expect(powersync.execute('INSERT INTO assets(id, description) VALUES(?, ?)', [testId, 'test3'])).rejects.toThrow(
82+
await expect(powersync.execute('INSERT INTO assets(id, description) VALUES(?, ?)', [testId, 'test3'])).rejects.toThrow(
8383
/UNIQUE constraint failed/
8484
);
8585
});
@@ -154,7 +154,7 @@ describe('CRUD Tests', () => {
154154

155155
it('UPSERT not supported', async () => {
156156
// Just shows that we cannot currently do this
157-
expect(
157+
await expect(
158158
powersync.execute('INSERT INTO assets(id, description) VALUES(?, ?) ON CONFLICT DO UPDATE SET description = ?', [
159159
testId,
160160
'test2',

0 commit comments

Comments
 (0)