Skip to content

Commit f42b9a8

Browse files
fix tests
1 parent bf8cd83 commit f42b9a8

File tree

2 files changed

+119
-103
lines changed

2 files changed

+119
-103
lines changed

packages/powersync/lib/src/streaming_sync.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,9 @@ class StreamingSyncImplementation {
158158
}
159159
}
160160
} finally {
161+
// The client should no longer be connected at this point
162+
// Adding this update allows for breaking out of an in-progress updateLoop
163+
_updateStatus(connected: false);
161164
_abort!.completeAbort();
162165
}
163166
}

packages/powersync/test/connected_test.dart

Lines changed: 116 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -14,115 +14,128 @@ import 'utils/test_utils_impl.dart';
1414
final testUtils = TestUtils();
1515

1616
void main() {
17-
late TestHttpServerHelper testServer;
18-
late String path;
19-
20-
setUp(() async {
21-
path = testUtils.dbPath();
22-
testServer = TestHttpServerHelper();
23-
await testServer.start();
24-
});
25-
26-
tearDown(() async {
27-
await testUtils.cleanDb(path: path);
28-
await testServer.stop();
29-
});
30-
31-
test('should connect to mock PowerSync instance', () async {
32-
final connector = TestConnector(() async {
33-
return PowerSyncCredentials(
34-
endpoint: testServer.uri.toString(),
35-
token: 'token not used here',
36-
expiresAt: DateTime.now());
17+
group('connected tests', () {
18+
late String path;
19+
setUp(() async {
20+
path = testUtils.dbPath();
3721
});
3822

39-
final db = PowerSyncDatabase.withFactory(
40-
await testUtils.testFactory(path: path),
41-
schema: defaultSchema,
42-
maxReaders: 3);
43-
await db.initialize();
44-
45-
final connectedCompleter = Completer();
46-
47-
db.statusStream.listen((status) {
48-
if (status.connected) {
49-
connectedCompleter.complete();
50-
}
23+
tearDown(() async {
24+
// await testUtils.cleanDb(path: path);
5125
});
5226

53-
// Add a basic command for the test server to send
54-
testServer.addEvent('{"token_expires_in": 3600}\n');
55-
56-
await db.connect(connector: connector);
57-
await connectedCompleter.future;
58-
59-
expect(db.connected, isTrue);
60-
});
61-
62-
test('should trigger uploads when connection is re-established', () async {
63-
int uploadCounter = 0;
64-
Completer uploadTriggeredCompleter = Completer();
65-
66-
final connector = TestConnector(() async {
67-
return PowerSyncCredentials(
68-
endpoint: testServer.uri.toString(),
69-
token: 'token not used here',
70-
expiresAt: DateTime.now());
71-
}, uploadData: (database) async {
72-
uploadCounter++;
73-
uploadTriggeredCompleter.complete();
74-
throw Exception('No uploads occur here');
27+
createTestServer() async {
28+
final testServer = TestHttpServerHelper();
29+
await testServer.start();
30+
return testServer;
31+
}
32+
33+
test('should connect to mock PowerSync instance', () async {
34+
final testServer = await createTestServer();
35+
// Cant do this inside the createTestServer function unfortunately
36+
addTearDown(() => testServer.stop());
37+
38+
final connector = TestConnector(() async {
39+
return PowerSyncCredentials(
40+
endpoint: testServer.uri.toString(),
41+
token: 'token not used here',
42+
expiresAt: DateTime.now());
43+
});
44+
45+
final db = PowerSyncDatabase.withFactory(
46+
await testUtils.testFactory(path: path),
47+
schema: defaultSchema,
48+
maxReaders: 3);
49+
await db.initialize();
50+
51+
final connectedCompleter = Completer();
52+
53+
db.statusStream.listen((status) {
54+
if (status.connected) {
55+
connectedCompleter.complete();
56+
}
57+
});
58+
59+
// Add a basic command for the test server to send
60+
testServer.addEvent('{"token_expires_in": 3600}\n');
61+
62+
await db.connect(connector: connector);
63+
await connectedCompleter.future;
64+
65+
expect(db.connected, isTrue);
66+
await db.disconnect();
7567
});
7668

77-
final db = PowerSyncDatabase.withFactory(
78-
await testUtils.testFactory(path: path),
79-
schema: defaultSchema,
80-
maxReaders: 3);
81-
await db.initialize();
82-
83-
// Create an item which should trigger an upload.
84-
await db.execute(
85-
'INSERT INTO customers (id, name) VALUES (uuid(), ?)', ['steven']);
86-
87-
// Create a new completer to await the next upload
88-
uploadTriggeredCompleter = Completer();
89-
90-
// Connect the PowerSync instance
91-
final connectedCompleter = Completer();
92-
// The first connection attempt will fail
93-
final connectedErroredCompleter = Completer();
94-
95-
db.statusStream.listen((status) {
96-
if (status.connected) {
97-
connectedCompleter.complete();
98-
}
99-
if (status.downloadError != null &&
100-
!connectedErroredCompleter.isCompleted) {
101-
connectedErroredCompleter.complete();
102-
}
69+
test('should trigger uploads when connection is re-established', () async {
70+
int uploadCounter = 0;
71+
Completer uploadTriggeredCompleter = Completer();
72+
final testServer = await createTestServer();
73+
// Cant do this inside the createTestServer function unfortunately
74+
addTearDown(() => testServer.stop());
75+
76+
final connector = TestConnector(() async {
77+
return PowerSyncCredentials(
78+
endpoint: testServer.uri.toString(),
79+
token: 'token not used here',
80+
expiresAt: DateTime.now());
81+
}, uploadData: (database) async {
82+
uploadCounter++;
83+
uploadTriggeredCompleter.complete();
84+
throw Exception('No uploads occur here');
85+
});
86+
87+
final db = PowerSyncDatabase.withFactory(
88+
await testUtils.testFactory(path: path),
89+
schema: defaultSchema,
90+
maxReaders: 3);
91+
await db.initialize();
92+
93+
// Create an item which should trigger an upload.
94+
await db.execute(
95+
'INSERT INTO customers (id, name) VALUES (uuid(), ?)', ['steven']);
96+
97+
// Create a new completer to await the next upload
98+
uploadTriggeredCompleter = Completer();
99+
100+
// Connect the PowerSync instance
101+
final connectedCompleter = Completer();
102+
// The first connection attempt will fail
103+
final connectedErroredCompleter = Completer();
104+
105+
db.statusStream.listen((status) {
106+
if (status.connected && !connectedCompleter.isCompleted) {
107+
connectedCompleter.complete();
108+
}
109+
if (status.downloadError != null &&
110+
!connectedErroredCompleter.isCompleted) {
111+
connectedErroredCompleter.complete();
112+
}
113+
});
114+
115+
// The first command will not be valid, this simulates a failed connection
116+
testServer.addEvent('asdf\n');
117+
await db.connect(connector: connector);
118+
119+
// The connect operation should have triggered an upload (even though it fails to connect)
120+
await uploadTriggeredCompleter.future;
121+
expect(uploadCounter, equals(1));
122+
// Create a new completer for the next iteration
123+
uploadTriggeredCompleter = Completer();
124+
125+
// Connection attempt should initially fail
126+
await connectedErroredCompleter.future;
127+
expect(db.currentStatus.anyError, isNotNull);
128+
129+
// Now send a valid command. Which will result in successful connection
130+
await testServer.clearEvents();
131+
testServer.addEvent('{"token_expires_in": 3600}\n');
132+
await connectedCompleter.future;
133+
expect(db.connected, isTrue);
134+
135+
await uploadTriggeredCompleter.future;
136+
expect(uploadCounter, equals(2));
137+
138+
await db.disconnect();
103139
});
104-
105-
// The first command will not be valid, this simulates a failed connection
106-
testServer.addEvent('asdf\n');
107-
await db.connect(connector: connector);
108-
109-
// The connect operation should have triggered an upload (even though it fails to connect)
110-
await uploadTriggeredCompleter.future;
111-
expect(uploadCounter, equals(1));
112-
// Create a new completer for the next iteration
113-
uploadTriggeredCompleter = Completer();
114-
115-
// Connection attempt should initially fail
116-
await connectedErroredCompleter.future;
117-
expect(db.currentStatus.anyError, isNotNull);
118-
119-
// Now send a valid command. Which will result in successful connection
120-
await testServer.clearEvents();
121-
testServer.addEvent('{"token_expires_in": 3600}\n');
122-
await connectedCompleter.future;
123-
expect(db.connected, isTrue);
124-
125-
await uploadTriggeredCompleter.future;
126-
expect(uploadCounter, equals(2));
127140
});
128141
}

0 commit comments

Comments
 (0)