Skip to content

Commit fa912b3

Browse files
authored
Merge pull request #17 from jwelmac/bugfix/issue-16-error-on-select-after-delete-or-update
Bugfix/issue 16 error on select after delete or update
2 parents 70ec539 + b0116c6 commit fa912b3

File tree

2 files changed

+66
-5
lines changed

2 files changed

+66
-5
lines changed

lib/src/mock_supabase_http_client.dart

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -338,9 +338,10 @@ class MockSupabaseHttpClient extends BaseClient {
338338
if (!_database.containsKey(tableKey)) {
339339
_database[tableKey] = [];
340340
}
341+
341342
if (data is Map<String, dynamic>) {
342343
_database[tableKey]!.add(data);
343-
return _createResponse(data, request: request);
344+
return _createResponse([data], request: request);
344345
} else if (data is List) {
345346
final List<Map<String, dynamic>> items =
346347
List<Map<String, dynamic>>.from(data);
@@ -373,18 +374,22 @@ class MockSupabaseHttpClient extends BaseClient {
373374
final queryParams = request.url.queryParameters;
374375
var updated = false;
375376

377+
// Track updated rows
378+
final updatedRows = [];
379+
376380
// Update items that match the filters
377381
if (_database.containsKey(tableKey)) {
378382
for (var row in _database[tableKey]!) {
379383
if (_matchesFilters(row: row, filters: queryParams)) {
380384
row.addAll(data);
381385
updated = true;
386+
updatedRows.add(row);
382387
}
383388
}
384389
}
385390

386391
if (updated) {
387-
return _createResponse(data, request: request);
392+
return _createResponse(updatedRows, request: request);
388393
} else {
389394
return _createResponse({'error': 'Not found'},
390395
statusCode: 404, request: request);
@@ -464,12 +469,18 @@ class MockSupabaseHttpClient extends BaseClient {
464469
statusCode: 400, request: request);
465470
}
466471

472+
List removedItems = [];
467473
if (_database.containsKey(tableKey)) {
468-
_database[tableKey]!.removeWhere(
469-
(row) => _matchesFilters(row: row, filters: queryParams));
474+
_database[tableKey]!.removeWhere((row) {
475+
final matched = _matchesFilters(row: row, filters: queryParams);
476+
if (matched) {
477+
removedItems.add(row);
478+
}
479+
return matched;
480+
});
470481
}
471482

472-
return _createResponse({'message': 'Deleted'}, request: request);
483+
return _createResponse(removedItems, request: request);
473484
}
474485

475486
StreamedResponse _handleSelect(

test/mock_supabase_http_client_test.dart

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,15 @@ void main() {
3535
expect(posts.first, {'title': 'Hello, world!'});
3636
});
3737

38+
test('Insert then select', () async {
39+
// Test inserting a record
40+
final posts = await mockSupabase
41+
.from('posts')
42+
.insert({'title': 'Hello, world!'}).select();
43+
expect(posts.length, 1);
44+
expect(posts.first, {'title': 'Hello, world!'});
45+
});
46+
3847
test('Upsert', () async {
3948
// Test upserting a record
4049
await mockSupabase
@@ -50,6 +59,20 @@ void main() {
5059
expect(postsUfterUpdate.first, {'id': 1, 'title': 'Updated post'});
5160
});
5261

62+
test('Upsert then select', () async {
63+
// Test upserting a record
64+
await mockSupabase
65+
.from('posts')
66+
.upsert({'id': 1, 'title': 'Initial post'});
67+
final posts = await mockSupabase.from('posts').select();
68+
expect(posts.first, {'id': 1, 'title': 'Initial post'});
69+
final postsAfterUpdate = await mockSupabase
70+
.from('posts')
71+
.upsert({'id': 1, 'title': 'Updated post'}).select();
72+
expect(postsAfterUpdate.length, 1);
73+
expect(postsAfterUpdate.first, {'id': 1, 'title': 'Updated post'});
74+
});
75+
5376
test('Update', () async {
5477
// Test updating a record
5578
await mockSupabase
@@ -63,6 +86,20 @@ void main() {
6386
expect(posts.first, {'id': 1, 'title': 'Updated title'});
6487
});
6588

89+
test('Update then select', () async {
90+
// Test updating a record
91+
await mockSupabase
92+
.from('posts')
93+
.insert({'id': 1, 'title': 'Original title'});
94+
final posts = await mockSupabase
95+
.from('posts')
96+
.update({'title': 'Updated title'})
97+
.eq('id', 1)
98+
.select();
99+
expect(posts.length, 1);
100+
expect(posts.first, {'id': 1, 'title': 'Updated title'});
101+
});
102+
66103
test('Delete', () async {
67104
// Test deleting a record
68105
await mockSupabase
@@ -72,6 +109,19 @@ void main() {
72109
final posts = await mockSupabase.from('posts').select();
73110
expect(posts.length, 0);
74111
});
112+
113+
test('Delete then select', () async {
114+
// Test deleting a record
115+
await mockSupabase
116+
.from('posts')
117+
.insert({'id': 1, 'title': 'To be deleted'});
118+
final deleted =
119+
await mockSupabase.from('posts').delete().eq('id', 1).select();
120+
expect(deleted.length, 1);
121+
final posts = await mockSupabase.from('posts').select();
122+
expect(posts.length, 0);
123+
});
124+
75125
test('Select all columns', () async {
76126
// Test selecting all records
77127
await mockSupabase.from('posts').insert([

0 commit comments

Comments
 (0)