Skip to content

Commit d288ea4

Browse files
test(DataStore): add local integration tests for datastore (#831)
* chore: add new model types for tests * test: add tests for model types * chore: update models for relationship tests * test: add tests for hasOne, belongsTo * chore: update models for hasMany tests * test: add tests for hasMany relationship * test: add query predicate test for string type * test: add test for updating an existing model * chore: skip flaky test on Android * chore: clean up string predicate tests * test: add integ tests for int/double query predicates * chore: remove unused model * chore: update tests after fix of #511 * chore: refactor model type tests * chore: add provisioning script * chore: update relationship tests * chore: remove skipped test in save * chore: add delay before clearing datastore * test: add bool query predicate tests * chore: update issue link for skipped test * chore: update test w/ fix of #834 * Apply suggestions from code review Co-authored-by: Chris F <[email protected]> * Update packages/amplify_datastore/example/integration_test/model_type_test.dart Co-authored-by: Chris F <[email protected]> * Update packages/amplify_datastore/example/integration_test/model_type_test.dart * chore: update testQueryPredicate for all models * chore: update comment in bool query tests * test: add test cases for unicode * chore: update bool model generation * chore: update testModelOperations to use getModelType * test: add edge cases for model type tests * chore: remove unneeded Map.from * test: add edge cases to query predicate tests * chore: update int/double predicate tests to use <>= * chore: remove unneeded configure calls * chore: update string between() test * chore: update relationship tests to check for single model * test: update observe tests to test all events * chore: add notes to equality checks * chore: remove const from test * chore: remove hard coded length Co-authored-by: Chris F <[email protected]>
1 parent 2384f9f commit d288ea4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+5356
-13
lines changed

packages/amplify_datastore/example/integration_test/main_test.dart

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ import 'package:integration_test/integration_test.dart';
1717
import 'package:flutter_test/flutter_test.dart';
1818

1919
import 'save_test.dart' as save_tests;
20-
import 'query_test.dart' as query_tests;
20+
import 'query_test/query_test.dart' as query_test;
21+
import 'model_type_test.dart' as model_type_tests;
22+
import 'relationship_type_test.dart' as relationship_type_tests;
23+
2124
import 'utils/setup_utils.dart';
2225

2326
void main() async {
@@ -29,6 +32,8 @@ void main() async {
2932
});
3033

3134
save_tests.main();
32-
query_tests.main();
35+
query_test.main();
36+
model_type_tests.main();
37+
relationship_type_tests.main();
3338
});
3439
}
Lines changed: 346 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,346 @@
1+
/*
2+
* Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License").
5+
* You may not use this file except in compliance with the License.
6+
* A copy of the License is located at
7+
*
8+
* http://aws.amazon.com/apache2.0
9+
*
10+
* or in the "license" file accompanying this file. This file is distributed
11+
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12+
* express or implied. See the License for the specific language governing
13+
* permissions and limitations under the License.
14+
*/
15+
16+
import 'dart:convert';
17+
import 'dart:math';
18+
19+
import 'package:amplify_datastore/amplify_datastore.dart';
20+
21+
import 'package:amplify_datastore_example/models/ModelProvider.dart';
22+
import 'package:integration_test/integration_test.dart';
23+
import 'package:flutter_test/flutter_test.dart';
24+
25+
import 'utils/constants.dart';
26+
import 'utils/model_test_operation_utils.dart';
27+
28+
void main() {
29+
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
30+
31+
group('a model with field of type', () {
32+
group('String', () {
33+
var values = ['', 'foo', 'bar', '!@#"', '\u{1F601}'];
34+
var models =
35+
values.map((value) => StringTypeModel(value: value)).toList();
36+
testModelOperations(models: models);
37+
});
38+
39+
group('String (with null value)', () {
40+
var models = List.generate(5, (_) => StringTypeModel());
41+
testModelOperations(models: models);
42+
});
43+
44+
group('List<String>', () {
45+
var list = List.generate(3, (i) => '$i');
46+
var models = List.generate(5, (_) => StringListTypeModel(value: list));
47+
testModelOperations(models: models);
48+
});
49+
50+
group('List<String> (with null value)', () {
51+
var models = List.generate(5, (_) => StringListTypeModel());
52+
testModelOperations(models: models);
53+
});
54+
55+
group('int', () {
56+
var values = [dataStoreMinInt, dataStoreMaxInt, 0, -1, 1];
57+
var models = values.map((value) => IntTypeModel(value: value)).toList();
58+
testModelOperations(models: models);
59+
});
60+
61+
group('int (with null value)', () {
62+
var models = List.generate(5, (i) => IntTypeModel());
63+
testModelOperations(models: models);
64+
});
65+
66+
group('List<int>', () {
67+
var list = List.generate(3, (i) => i);
68+
var models = List.generate(5, (_) => IntListTypeModel(value: list));
69+
testModelOperations(models: models);
70+
});
71+
72+
group(
73+
'List<int> (with null value)',
74+
() {
75+
var models = List.generate(5, (_) => IntListTypeModel());
76+
testModelOperations(models: models);
77+
},
78+
// unskip when https://github.com/aws-amplify/amplify-flutter/issues/813 is resolved
79+
skip: true,
80+
);
81+
82+
group('double', () {
83+
var values = [double.maxFinite, double.minPositive, pi, 0.0, 0.1];
84+
var models =
85+
values.map((value) => DoubleTypeModel(value: value)).toList();
86+
testModelOperations(models: models);
87+
});
88+
89+
group('double (with null value)', () {
90+
var models = List.generate(5, (i) => DoubleTypeModel());
91+
testModelOperations(models: models);
92+
});
93+
94+
group('List<double>', () {
95+
var list = List.generate(3, (i) => i.toDouble());
96+
var models = List.generate(5, (_) => DoubleListTypeModel(value: list));
97+
testModelOperations(models: models);
98+
});
99+
100+
group('List<double> (with null value)', () {
101+
var models = List.generate(5, (_) => DoubleListTypeModel());
102+
testModelOperations(models: models);
103+
});
104+
105+
group('bool', () {
106+
var models = List.generate(
107+
5, (i) => BoolTypeModel(value: i % 2 == 0 ? false : true));
108+
testModelOperations(models: models);
109+
});
110+
111+
group('bool (with null value)', () {
112+
var models = List.generate(5, (i) => BoolTypeModel());
113+
testModelOperations(models: models);
114+
});
115+
116+
group('List<bool>', () {
117+
var list = List.generate(3, (i) => i == 0 ? false : true);
118+
var models = List.generate(5, (_) => BoolListTypeModel(value: list));
119+
testModelOperations(models: models);
120+
});
121+
122+
group('List<bool> (with null value)', () {
123+
var models = List.generate(5, (_) => BoolListTypeModel());
124+
testModelOperations(models: models);
125+
});
126+
127+
group('AWSDate', () {
128+
var values = [
129+
DateTime(0000, 01, 01, 00, 00, 00),
130+
DateTime(1970, 01, 01, 00, 00, 00),
131+
DateTime(2020, 01, 01, 00, 00, 00),
132+
DateTime(2020, 01, 01, 23, 59, 59),
133+
DateTime(2999, 12, 31, 23, 59, 59, 999, 999),
134+
];
135+
var models = values
136+
.map((value) => DateTypeModel(value: TemporalDate(value)))
137+
.toList();
138+
testModelOperations(models: models);
139+
});
140+
141+
group('AWSDate (with null value)', () {
142+
var models = List.generate(5, (i) => DateTypeModel());
143+
testModelOperations(models: models);
144+
});
145+
146+
group('List<AWSDate>', () {
147+
var now = DateTime.now();
148+
var list =
149+
List.generate(3, (i) => TemporalDate(now.add(Duration(days: i))));
150+
var models = List.generate(5, (_) => DateListTypeModel(value: list));
151+
testModelOperations(models: models);
152+
});
153+
154+
group(
155+
'List<AWSDate> (with null value)',
156+
() {
157+
var models = List.generate(5, (_) => DateListTypeModel());
158+
testModelOperations(models: models);
159+
},
160+
// unskip when https://github.com/aws-amplify/amplify-flutter/issues/813 is resolved
161+
skip: true,
162+
);
163+
164+
group('AWSDateTime', () {
165+
var values = [
166+
DateTime(0000, 01, 01, 00, 00, 00),
167+
DateTime(1970, 01, 01, 00, 00, 00),
168+
DateTime(2020, 01, 01, 00, 00, 00),
169+
DateTime(2020, 01, 01, 23, 59, 59),
170+
DateTime(2999, 12, 31, 23, 59, 59),
171+
// TemporalDateTime values with milliseconds & microseconds are not parsed correctly on Android
172+
// see: https://github.com/aws-amplify/amplify-flutter/issues/817
173+
// DateTime(2999, 12, 31, 23, 59, 59, 999, 999),
174+
];
175+
var models = values
176+
.map((value) => DateTimeTypeModel(value: TemporalDateTime(value)))
177+
.toList();
178+
testModelOperations(models: models);
179+
testModelOperations(
180+
models: models,
181+
skips: {DataStoreOperation.query: true},
182+
);
183+
});
184+
185+
group('AWSDateTime (with null value)', () {
186+
var models = List.generate(5, (i) => DateTimeTypeModel());
187+
testModelOperations(models: models);
188+
});
189+
190+
group('List<AWSDateTime>', () {
191+
var now = DateTime.now();
192+
var list =
193+
List.generate(3, (i) => TemporalDateTime(now.add(Duration(days: i))));
194+
var models = List.generate(5, (_) => DateTimeListTypeModel(value: list));
195+
testModelOperations(models: models);
196+
});
197+
198+
group(
199+
'List<AWSDateTime> (with null value)',
200+
() {
201+
var models = List.generate(5, (_) => DateTimeListTypeModel());
202+
testModelOperations(models: models);
203+
},
204+
// unskip when https://github.com/aws-amplify/amplify-flutter/issues/813 is resolved
205+
skip: true,
206+
);
207+
208+
group('AWSTime', () {
209+
var values = [
210+
DateTime(0000, 01, 01, 00, 00, 00),
211+
DateTime(1970, 01, 01, 00, 00, 00),
212+
DateTime(2020, 01, 01, 00, 00, 00),
213+
DateTime(2020, 01, 01, 23, 59, 59),
214+
DateTime(2999, 12, 31, 23, 59, 59),
215+
// TemporalTime values with milliseconds & microseconds are not parsed correctly on Android
216+
// see: https://github.com/aws-amplify/amplify-flutter/issues/817
217+
// DateTime(2999, 12, 31, 23, 59, 59, 999, 999),
218+
];
219+
var models = values
220+
.map((value) => TimeTypeModel(value: TemporalTime(value)))
221+
.toList();
222+
testModelOperations(models: models);
223+
});
224+
225+
group('AWSTime (with null value)', () {
226+
var models = List.generate(5, (i) => TimeTypeModel());
227+
testModelOperations(models: models);
228+
});
229+
230+
group('List<AWSTime>', () {
231+
var now = DateTime.now();
232+
var list =
233+
List.generate(3, (i) => TemporalTime(now.add(Duration(days: i))));
234+
var models = List.generate(5, (_) => TimeListTypeModel(value: list));
235+
testModelOperations(models: models);
236+
});
237+
238+
group(
239+
'List<AWSTime> (with null value)',
240+
() {
241+
var models = List.generate(5, (_) => TimeListTypeModel());
242+
testModelOperations(models: models);
243+
},
244+
// unskip when https://github.com/aws-amplify/amplify-flutter/issues/813 is resolved
245+
skip: true,
246+
);
247+
248+
group('AWSTimestamp', () {
249+
var values = [
250+
DateTime(0000, 01, 01, 00, 00, 00),
251+
DateTime(1970, 01, 01, 00, 00, 00),
252+
DateTime(2020, 01, 01, 00, 00, 00),
253+
DateTime(2020, 01, 01, 23, 59, 59),
254+
DateTime(2999, 12, 31, 23, 59, 59, 999, 999),
255+
];
256+
var models = values
257+
.map((value) => TimestampTypeModel(value: TemporalTimestamp(value)))
258+
.toList();
259+
testModelOperations(models: models);
260+
});
261+
262+
group('AWSTimestamp (with null value)', () {
263+
var models = List.generate(5, (i) => TimestampTypeModel());
264+
testModelOperations(models: models);
265+
});
266+
267+
group(
268+
'List<AWSTimestamp>',
269+
() {
270+
var now = DateTime.now();
271+
var list = List.generate(
272+
3, (i) => TemporalTimestamp(now.add(Duration(days: i))));
273+
var models =
274+
List.generate(5, (_) => TimestampListTypeModel(value: list));
275+
testModelOperations(models: models);
276+
},
277+
// should be unskipped after https://github.com/aws-amplify/amplify-flutter/issues/814 is resolved
278+
skip: true,
279+
);
280+
281+
group(
282+
'List<AWSTimestamp> (with null value)',
283+
() {
284+
var models = List.generate(5, (_) => TimestampListTypeModel());
285+
testModelOperations(models: models);
286+
},
287+
// unskip when https://github.com/aws-amplify/amplify-flutter/issues/813 is resolved
288+
skip: true,
289+
);
290+
291+
group('AWSJSON', () {
292+
String json = jsonEncode({
293+
'string': 'foo',
294+
'bool': true,
295+
'int': 1,
296+
'double': 1.0,
297+
});
298+
var models = List.generate(5, (i) => JSONTypeModel(value: json));
299+
testModelOperations(models: models);
300+
});
301+
302+
group('AWSJSON (with null value)', () {
303+
var models = List.generate(5, (i) => JSONTypeModel());
304+
testModelOperations(models: models);
305+
});
306+
307+
group('List<AWSJSON>', () {
308+
String generateJson(int value) => jsonEncode(Map.from({
309+
'string': 'foo',
310+
'bool': true,
311+
'int': value,
312+
'double': value.toDouble()
313+
}));
314+
var list = List.generate(3, (i) => generateJson(i));
315+
var models = List.generate(5, (_) => JSONListTypeModel(value: list));
316+
testModelOperations(models: models);
317+
});
318+
319+
group('List<AWSJSON> (with null value)', () {
320+
var models = List.generate(5, (_) => JSONListTypeModel());
321+
testModelOperations(models: models);
322+
});
323+
324+
group('enum', () {
325+
var models = List.generate(5,
326+
(i) => EnumTypeModel(value: i == 0 ? EnumModel.no : EnumModel.yes));
327+
testModelOperations(models: models);
328+
});
329+
330+
group('enum (with null value)', () {
331+
var models = List.generate(5, (i) => EnumTypeModel());
332+
testModelOperations(models: models);
333+
});
334+
335+
group('List<enum>', () {
336+
var list = List.generate(3, (i) => i == 0 ? EnumModel.no : EnumModel.yes);
337+
var models = List.generate(5, (_) => EnumListTypeModel(value: list));
338+
testModelOperations(models: models);
339+
});
340+
341+
group('List<enum> (with null value)', () {
342+
var models = List.generate(5, (_) => EnumListTypeModel());
343+
testModelOperations(models: models);
344+
});
345+
});
346+
}

0 commit comments

Comments
 (0)