Skip to content

Commit 8a5e050

Browse files
committed
ToOne with json_serializable & freezed - generator integration tests
1 parent 3a3e5ce commit 8a5e050

File tree

4 files changed

+97
-9
lines changed

4 files changed

+97
-9
lines changed

generator/integration-tests/part-partof/1.dart

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import 'dart:io';
22

33
import 'package:test/test.dart';
44

5-
import '../test_env.dart';
65
import '../common.dart';
7-
import 'lib/json.dart';
6+
import '../test_env.dart';
87
import 'lib/frozen.dart';
8+
import 'lib/json.dart';
99
import 'lib/objectbox.g.dart';
1010

1111
void main() {
@@ -16,12 +16,23 @@ void main() {
1616
expect(File('lib/objectbox-model.json').existsSync(), true);
1717
});
1818

19-
setupTestsFor(JsonEntity(id: 0, str: 'foo', date: DateTime.now()));
20-
setupTestsFor(FrozenEntity(id: 1, str: 'foo', date: DateTime.now()));
19+
group('package:JsonSerializable', () {
20+
setupTestsFor(JsonEntity(id: 0, str: 'foo', date: DateTime.now()));
21+
setupRelTestsFor(JsonBook.fromJson({
22+
'author': {'name': 'Charles'}
23+
}));
24+
});
25+
26+
group('package:Freezed', () {
27+
setupTestsFor(FrozenEntity(id: 1, str: 'foo', date: DateTime.now()));
28+
final author = FrozenPerson(id: 1, name: 'Charles');
29+
setupRelTestsFor(
30+
FrozenBook(id: 1, author: ToOne<FrozenPerson>(target: author)), author);
31+
});
2132
}
2233

2334
void setupTestsFor<EntityT>(EntityT newObject) {
24-
group('${EntityT}', () {
35+
group(EntityT.toString(), () {
2536
late TestEnv<EntityT> env;
2637
setUp(() => env = TestEnv(getObjectBoxModel()));
2738
tearDown(() => env.close());
@@ -32,3 +43,24 @@ void setupTestsFor<EntityT>(EntityT newObject) {
3243
});
3344
});
3445
}
46+
47+
void setupRelTestsFor<BookEntityT, PersonEntityT>(BookEntityT book,
48+
[PersonEntityT? author]) {
49+
group(BookEntityT.toString(), () {
50+
late TestEnv<BookEntityT> env;
51+
setUp(() => env = TestEnv(getObjectBoxModel()));
52+
tearDown(() => env.close());
53+
54+
test('relations', () {
55+
if (author != null) {
56+
env.store.box<PersonEntityT>().put(author);
57+
(book as dynamic).author.target = author;
58+
}
59+
env.box.put(book);
60+
61+
final bookRead = env.box.get(1)! as dynamic;
62+
expect(bookRead.author.targetId, 1);
63+
expect(bookRead.author.target!.name, 'Charles');
64+
});
65+
});
66+
}

generator/integration-tests/part-partof/lib/frozen.dart

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import 'package:objectbox/objectbox.dart';
21
import 'package:freezed_annotation/freezed_annotation.dart';
2+
import 'package:objectbox/objectbox.dart';
33

44
part 'frozen.freezed.dart';
55

@@ -11,3 +11,19 @@ class FrozenEntity with _$FrozenEntity {
1111
required String str,
1212
required DateTime date}) = _FrozenEntity;
1313
}
14+
15+
@freezed
16+
class FrozenPerson with _$FrozenPerson {
17+
@Entity(realClass: FrozenPerson)
18+
factory FrozenPerson(
19+
{@Id(assignable: true) required int id,
20+
required String name}) = _FrozenPerson;
21+
}
22+
23+
@freezed
24+
class FrozenBook with _$FrozenBook {
25+
@Entity(realClass: FrozenBook)
26+
factory FrozenBook(
27+
{@Id(assignable: true) required int id,
28+
required ToOne<FrozenPerson> author}) = _FrozenBook;
29+
}

generator/integration-tests/part-partof/lib/json.dart

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import 'package:objectbox/objectbox.dart';
21
import 'package:json_annotation/json_annotation.dart';
2+
import 'package:objectbox/objectbox.dart';
33

44
part 'json.g.dart';
55

@@ -17,3 +17,44 @@ class JsonEntity {
1717

1818
Map<String, dynamic> toJson() => _$JsonEntityToJson(this);
1919
}
20+
21+
@Entity()
22+
@JsonSerializable()
23+
class JsonPerson {
24+
int? id;
25+
String name;
26+
27+
JsonPerson({required this.name});
28+
29+
factory JsonPerson.fromJson(Map<String, dynamic> json) =>
30+
_$JsonPersonFromJson(json);
31+
32+
Map<String, dynamic> toJson() => _$JsonPersonToJson(this);
33+
}
34+
35+
@Entity()
36+
@JsonSerializable()
37+
class JsonBook {
38+
int? id;
39+
40+
@_PersonRelToOneConverter()
41+
final ToOne<JsonPerson> author;
42+
43+
JsonBook({required this.author});
44+
45+
factory JsonBook.fromJson(Map<String, dynamic> json) => _$JsonBookFromJson(json);
46+
47+
Map<String, dynamic> toJson() => _$JsonBookToJson(this);
48+
}
49+
50+
class _PersonRelToOneConverter
51+
implements JsonConverter<ToOne<JsonPerson>, Map<String, dynamic>?> {
52+
const _PersonRelToOneConverter();
53+
54+
@override
55+
ToOne<JsonPerson> fromJson(Map<String, dynamic>? json) => ToOne<JsonPerson>(
56+
target: json == null ? null : JsonPerson.fromJson(json));
57+
58+
@override
59+
Map<String, dynamic>? toJson(ToOne<JsonPerson> rel) => rel.target?.toJson();
60+
}

generator/integration-tests/test_env.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,12 @@ export 'package:objectbox/internal.dart';
77
class TestEnv<Entity> {
88
static final dir = Directory('testdata');
99
late final Store store;
10-
late final Box<Entity> box;
10+
late final Box<Entity> box = store.box();
1111

1212
TestEnv(ModelDefinition defs) {
1313
if (dir.existsSync()) dir.deleteSync(recursive: true);
1414

1515
store = Store(defs, directory: dir.path);
16-
box = Box<Entity>(store);
1716
}
1817

1918
void close() {

0 commit comments

Comments
 (0)