Skip to content

Commit b0751c6

Browse files
committed
complete mock_supabase_database
1 parent 96b96cc commit b0751c6

File tree

2 files changed

+152
-11
lines changed

2 files changed

+152
-11
lines changed

lib/src/mock_supabase_database.dart

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,57 @@
1-
/// A class that provides a Supabase-like interface for manipulating mock data
1+
/// A Supabase-client-like class to mutate the in-memory database within a rpc mocking.
2+
///
3+
/// Unlike the actual Supabase client, the `.select()`, `.insert()`, `.update()`,
4+
/// and `.delete()` methods is chained after the filter methods, and does not
5+
/// return a `Future`.
6+
///
7+
/// Example usage:
8+
///
9+
/// ```dart
10+
/// // Insert a single row
11+
/// final insertResult = db.from('users').insert({'id': 1, 'name': 'John', 'age': 30});
12+
/// // insertResult: [{'id': 1, 'name': 'John', 'age': 30}]
13+
///
14+
/// // Select all rows from a table
15+
/// final selectResult = db.from('users').select();
16+
/// // selectResult: [{'id': 1, 'name': 'John', 'age': 30}]
17+
///
18+
/// // Update a row
19+
/// final updateResult = db.from('users').eq('id', 1).update({'name': 'John Doe'});
20+
/// // updateResult: [{'id': 1, 'name': 'John Doe', 'age': 30}]
21+
///
22+
/// // Delete a row
23+
/// final deleteResult = db.from('users').eq('id', 1).delete();
24+
/// // deleteResult: [{'id': 1, 'name': 'John Doe', 'age': 30}]
25+
///
26+
/// // Using filters
27+
/// // Equal to
28+
/// final eqResult = db.from('users').eq('age', 30).select();
29+
/// // eqResult: [{'id': 1, 'name': 'John', 'age': 30}]
30+
///
31+
/// // Not equal to
32+
/// final neqResult = db.from('users').neq('name', 'Alice').select();
33+
/// // neqResult: [{'id': 1, 'name': 'John', 'age': 30}]
34+
///
35+
/// // Greater than
36+
/// final gtResult = db.from('users').gt('age', 25).select();
37+
/// // gtResult: [{'id': 1, 'name': 'John', 'age': 30}]
38+
///
39+
/// // Less than
40+
/// final ltResult = db.from('users').lt('age', 35).select();
41+
/// // ltResult: [{'id': 1, 'name': 'John', 'age': 30}]
42+
///
43+
/// // Greater than or equal to
44+
/// final gteResult = db.from('users').gte('age', 30).select();
45+
/// // gteResult: [{'id': 1, 'name': 'John', 'age': 30}]
46+
///
47+
/// // Less than or equal to
48+
/// final lteResult = db.from('users').lte('age', 30).select();
49+
/// // lteResult: [{'id': 1, 'name': 'John', 'age': 30}]
50+
///
51+
/// // Combining multiple filters
52+
/// final combinedResult = db.from('users').eq('name', 'John').gte('age', 30).select();
53+
/// // combinedResult: [{'id': 1, 'name': 'John', 'age': 30}]
54+
/// ```
255
class MockSupabaseDatabase {
356
final Map<String, List<Map<String, dynamic>>> _database;
457

test/mock_supabase_database_test.dart

Lines changed: 98 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,17 @@ void main() {
9595
group('filtering operations', () {
9696
setUp(() {
9797
db.from('users').insert([
98-
{'id': 1, 'name': 'John', 'age': 25},
99-
{'id': 2, 'name': 'Jane', 'age': 30},
100-
{'id': 3, 'name': 'Bob', 'age': 20},
98+
{'id': 1, 'name': 'John', 'age': 25, 'status': 'active', 'score': 100},
99+
{'id': 2, 'name': 'Jane', 'age': 30, 'status': 'active', 'score': 150},
100+
{'id': 3, 'name': 'Bob', 'age': 20, 'status': 'inactive', 'score': 80},
101+
{'id': 4, 'name': 'Alice', 'age': 25, 'status': 'active', 'score': 120},
102+
{
103+
'id': 5,
104+
'name': 'Charlie',
105+
'age': 35,
106+
'status': 'inactive',
107+
'score': 90
108+
},
101109
]);
102110
});
103111

@@ -109,14 +117,17 @@ void main() {
109117

110118
test('neq filter', () {
111119
final result = db.from('users').neq('name', 'John').select();
112-
expect(result.length, 2);
120+
expect(result.length, 4);
113121
expect(result.every((user) => user['name'] != 'John'), true);
114122
});
115123

116124
test('gt filter', () {
117125
final result = db.from('users').gt('age', 25).select();
118-
expect(result.length, 1);
119-
expect(result.first['name'], 'Jane');
126+
expect(result.length, 2);
127+
expect(
128+
result.map((user) => user['name']).toList(),
129+
containsAll(['Jane', 'Charlie']),
130+
);
120131
});
121132

122133
test('lt filter', () {
@@ -127,16 +138,93 @@ void main() {
127138

128139
test('gte filter', () {
129140
final result = db.from('users').gte('age', 25).select();
130-
expect(result.length, 2);
131-
expect(result.map((user) => user['name']).toList()..sort(),
132-
['Jane', 'John']);
141+
expect(result.length, 4);
142+
expect(
143+
result.map((user) => user['name']).toList(),
144+
containsAll(['Jane', 'John', 'Alice', 'Charlie']),
145+
);
133146
});
134147

135148
test('lte filter', () {
136149
final result = db.from('users').lte('age', 25).select();
150+
expect(result.length, 3);
151+
expect(
152+
result.map((user) => user['name']).toList(),
153+
containsAll(['Bob', 'John', 'Alice']),
154+
);
155+
});
156+
157+
test('multiple filters with eq and gt', () {
158+
final result =
159+
db.from('users').eq('status', 'active').gt('score', 100).select();
160+
137161
expect(result.length, 2);
138162
expect(
139-
result.map((user) => user['name']).toList()..sort(), ['Bob', 'John']);
163+
result.every(
164+
(user) => user['status'] == 'active' && user['score'] > 100),
165+
true);
166+
});
167+
168+
test('multiple filters with eq and lte', () {
169+
final result = db.from('users').eq('age', 25).lte('score', 120).select();
170+
171+
expect(result.length, 2);
172+
expect(result.every((user) => user['age'] == 25 && user['score'] <= 120),
173+
true);
174+
});
175+
176+
test('multiple filters with neq and gte', () {
177+
final result =
178+
db.from('users').neq('status', 'active').gte('age', 20).select();
179+
180+
expect(result.length, 2);
181+
expect(
182+
result
183+
.every((user) => user['status'] != 'active' && user['age'] >= 20),
184+
true);
185+
});
186+
187+
test('chaining three filters', () {
188+
final result = db
189+
.from('users')
190+
.eq('status', 'active')
191+
.gte('age', 25)
192+
.lt('score', 130)
193+
.select();
194+
195+
expect(result.length, 2);
196+
expect(
197+
result.map((user) => user['name']).toList(),
198+
containsAll(['John', 'Alice']),
199+
);
200+
});
201+
202+
test('multiple filters with update', () {
203+
final result = db
204+
.from('users')
205+
.eq('status', 'active')
206+
.gt('score', 100)
207+
.update({'status': 'premium'});
208+
209+
expect(result.length, 2);
210+
expect(
211+
result.every((user) => user['status'] == 'premium'),
212+
isTrue,
213+
);
214+
});
215+
216+
test('multiple filters with delete', () {
217+
final deleted =
218+
db.from('users').eq('status', 'inactive').lt('score', 100).delete();
219+
220+
expect(deleted.length, 2);
221+
expect(
222+
deleted.map((user) => user['name']).toList(),
223+
containsAll(['Bob', 'Charlie']),
224+
);
225+
226+
final remaining = db.from('users').select();
227+
expect(remaining.length, 3);
140228
});
141229
});
142230

0 commit comments

Comments
 (0)