Skip to content

Commit 0604963

Browse files
committed
relation - test self-assigned ID on source
1 parent 59c20cd commit 0604963

File tree

3 files changed

+146
-134
lines changed

3 files changed

+146
-134
lines changed

objectbox/test/entity.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ class TestingUnknownAnnotation {
1212
@TestingUnknownAnnotation()
1313
class TestEntity {
1414
@TestingUnknownAnnotation()
15+
@Id(assignable: true)
1516
int id = 0;
1617

1718
// implicitly determined types

objectbox/test/objectbox-model.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"id": "1:1502777149103994787",
1313
"name": "id",
1414
"type": 6,
15-
"flags": 1
15+
"flags": 129
1616
},
1717
{
1818
"id": "6:8781628815078474903",

objectbox/test/relations_test.dart

Lines changed: 144 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -14,144 +14,145 @@ void main() {
1414

1515
tearDown(() => env.close());
1616

17-
test('to-one put', () {
18-
final src = TestEntity(tString: 'Hello');
19-
20-
expect(src.relA.hasValue, isFalse);
21-
expect(src.relA.target, isNull);
22-
src.relA.target = RelatedEntityA(tInt: 42);
23-
expect(src.relA.hasValue, isTrue);
24-
expect(src.relA.target, isNotNull);
25-
expect(src.relA.target!.tInt, 42);
26-
27-
// Can't access targetId on new objects (not coming from box) unless
28-
// attached manually.
29-
expect(
30-
() => src.relA.targetId,
31-
throwsA(predicate(
32-
(StateError e) => e.toString().contains('call attach('))));
33-
src.relA.attach(env.store);
34-
expect(src.relA.targetId, isZero);
35-
36-
src.relA.target!.relB.target = RelatedEntityB(tString: 'B1');
37-
38-
// use the same target on two relations - must insert only once
39-
src.relB.target = src.relA.target!.relB.target;
40-
41-
env.box.put(src);
42-
43-
var read = env.box.get(1)!;
44-
expect(read.tString, equals(src.tString));
45-
expect(read.relA.hasValue, isTrue);
46-
expect(read.relA.targetId, 1);
47-
var readRelA = read.relA;
48-
expect(readRelA.target!.tInt, 42);
49-
var readRelARelB = readRelA.target!.relB;
50-
expect(readRelARelB.target!.tString, equals('B1'));
51-
52-
// it's the same DB object ID but different instances (read twice)
53-
expect(read.relB.targetId, equals(readRelARelB.targetId));
54-
expect(read.relB.target, isNot(equals(readRelARelB.target)));
55-
56-
// attach an existing item
57-
var readRelARelBRelA = readRelARelB.target!.relA;
58-
expect(readRelARelBRelA.hasValue, isFalse);
59-
readRelARelBRelA.target = readRelA.target;
60-
expect(readRelARelBRelA.hasValue, isTrue);
61-
expect(readRelARelBRelA.targetId, readRelA.targetId);
62-
env.store.box<RelatedEntityB>().put(readRelARelB.target!);
63-
64-
read = env.box.get(1)!;
65-
readRelA = read.relA;
66-
readRelARelB = readRelA.target!.relB;
67-
readRelARelBRelA = readRelARelB.target!.relA;
68-
expect(readRelARelBRelA.targetId, readRelA.targetId);
69-
70-
// remove a relation, using [targetId]
71-
readRelARelB.targetId = 0;
72-
env.store.box<RelatedEntityA>().put(readRelA.target!);
73-
read = env.box.get(1)!;
74-
readRelA = read.relA;
75-
readRelARelB = readRelA.target!.relB;
76-
expect(readRelARelB.target, isNull);
77-
expect(readRelARelB.targetId, isZero);
78-
79-
// remove a relation, using [target]
80-
read.relA.target = null;
81-
env.store.box<TestEntity>().put(read);
82-
read = env.box.get(1)!;
83-
expect(read.relA.target, isNull);
84-
expect(read.relA.targetId, isZero);
85-
});
86-
87-
test('to-one lazy loading', () {
88-
final srcBox = env.box;
89-
final targetBox = env.store.box<RelatedEntityA>();
90-
final src = TestEntity(tString: 'Hello');
91-
final target = RelatedEntityA(tInt: 42);
92-
target.id = targetBox.put(target);
93-
94-
src.relA.target = target;
95-
srcBox.put(src);
96-
97-
final read = env.box.get(1)!;
98-
expect(read.relA.targetId, target.id);
99-
// to verify the target is loaded lazily, we update it before accessing
100-
target.tInt = 99;
101-
targetBox.put(target);
102-
expect(read.relA.target!.tInt, 99);
103-
});
17+
group('ToOne', () {
18+
test('put', () {
19+
final src = TestEntity(tString: 'Hello');
20+
expect(src.relA.hasValue, isFalse);
21+
expect(src.relA.target, isNull);
22+
src.relA.target = RelatedEntityA(tInt: 42);
23+
expect(src.relA.hasValue, isTrue);
24+
expect(src.relA.target, isNotNull);
25+
expect(src.relA.target!.tInt, 42);
26+
27+
// Can't access targetId on new objects (not coming from box) unless
28+
// attached manually.
29+
expect(
30+
() => src.relA.targetId,
31+
throwsA(predicate(
32+
(StateError e) => e.toString().contains('call attach('))));
33+
src.relA.attach(env.store);
34+
expect(src.relA.targetId, isZero);
35+
36+
src.relA.target!.relB.target = RelatedEntityB(tString: 'B1');
37+
38+
// use the same target on two relations - must insert only once
39+
src.relB.target = src.relA.target!.relB.target;
40+
41+
env.box.put(src);
42+
43+
var read = env.box.get(1)!;
44+
expect(read.tString, equals(src.tString));
45+
expect(read.relA.hasValue, isTrue);
46+
expect(read.relA.targetId, 1);
47+
var readRelA = read.relA;
48+
expect(readRelA.target!.tInt, 42);
49+
var readRelARelB = readRelA.target!.relB;
50+
expect(readRelARelB.target!.tString, equals('B1'));
51+
52+
// it's the same DB object ID but different instances (read twice)
53+
expect(read.relB.targetId, equals(readRelARelB.targetId));
54+
expect(read.relB.target, isNot(equals(readRelARelB.target)));
55+
56+
// attach an existing item
57+
var readRelARelBRelA = readRelARelB.target!.relA;
58+
expect(readRelARelBRelA.hasValue, isFalse);
59+
readRelARelBRelA.target = readRelA.target;
60+
expect(readRelARelBRelA.hasValue, isTrue);
61+
expect(readRelARelBRelA.targetId, readRelA.targetId);
62+
env.store.box<RelatedEntityB>().put(readRelARelB.target!);
63+
64+
read = env.box.get(1)!;
65+
readRelA = read.relA;
66+
readRelARelB = readRelA.target!.relB;
67+
readRelARelBRelA = readRelARelB.target!.relA;
68+
expect(readRelARelBRelA.targetId, readRelA.targetId);
69+
70+
// remove a relation, using [targetId]
71+
readRelARelB.targetId = 0;
72+
env.store.box<RelatedEntityA>().put(readRelA.target!);
73+
read = env.box.get(1)!;
74+
readRelA = read.relA;
75+
readRelARelB = readRelA.target!.relB;
76+
expect(readRelARelB.target, isNull);
77+
expect(readRelARelB.targetId, isZero);
78+
79+
// remove a relation, using [target]
80+
read.relA.target = null;
81+
env.store.box<TestEntity>().put(read);
82+
read = env.box.get(1)!;
83+
expect(read.relA.target, isNull);
84+
expect(read.relA.targetId, isZero);
85+
});
10486

105-
test('to-one putMany & simple ID query', () {
106-
final src = TestEntity(tString: 'Hello');
107-
src.relA.target = RelatedEntityA(tInt: 42);
108-
env.box.putMany([src, TestEntity(tString: 'there')]);
109-
expect(src.relA.targetId, 1);
110-
111-
var query = env.box.query(TestEntity_.relA.equals(1)).build();
112-
expect(query.count(), 1);
113-
var read = query.find()[0];
114-
expect(read.tString, equals('Hello'));
115-
expect(read.relA.targetId, equals(1));
116-
query.close();
117-
118-
query = env.box.query(TestEntity_.relA.equals(0)).build();
119-
expect(query.count(), 1);
120-
read = query.find()[0];
121-
expect(read.tString, equals('there'));
122-
expect(read.relA.targetId, equals(0));
123-
query.close();
124-
});
87+
test('lazy loading', () {
88+
final srcBox = env.box;
89+
final targetBox = env.store.box<RelatedEntityA>();
90+
final src = TestEntity(tString: 'Hello');
91+
final target = RelatedEntityA(tInt: 42);
92+
target.id = targetBox.put(target);
93+
94+
src.relA.target = target;
95+
srcBox.put(src);
96+
97+
final read = env.box.get(1)!;
98+
expect(read.relA.targetId, target.id);
99+
// to verify the target is loaded lazily, we update it before accessing
100+
target.tInt = 99;
101+
targetBox.put(target);
102+
expect(read.relA.target!.tInt, 99);
103+
});
125104

126-
test('to-one query link', () {
127-
final src1 = TestEntity(tString: 'foo');
128-
src1.relA.target = RelatedEntityA(tInt: 5);
129-
final src2 = TestEntity(tString: 'bar');
130-
src2.relA.target = RelatedEntityA(tInt: 10);
131-
src2.relA.target!.relB.target = RelatedEntityB(tString: 'deep');
132-
env.box.putMany([src1, src2]);
133-
134-
{
135-
final qb = env.box.query();
136-
qb.link(TestEntity_.relA, RelatedEntityA_.tInt.equals(10));
137-
final query = qb.build();
138-
final found = query.find();
139-
expect(found.length, 1);
140-
expect(found[0].tString, 'bar');
105+
test('putMany & simple ID query', () {
106+
final src = TestEntity(tString: 'Hello');
107+
src.relA.target = RelatedEntityA(tInt: 42);
108+
env.box.putMany([src, TestEntity(tString: 'there')]);
109+
expect(src.relA.targetId, 1);
110+
111+
var query = env.box.query(TestEntity_.relA.equals(1)).build();
112+
expect(query.count(), 1);
113+
var read = query.find()[0];
114+
expect(read.tString, equals('Hello'));
115+
expect(read.relA.targetId, equals(1));
141116
query.close();
142-
}
143117

144-
{
145-
final qb = env.box.query();
146-
qb
147-
.link(TestEntity_.relA)
148-
.link(RelatedEntityA_.relB, RelatedEntityB_.tString.equals('deep'));
149-
final query = qb.build();
150-
final found = query.find();
151-
expect(found.length, 1);
152-
expect(found[0].tString, 'bar');
118+
query = env.box.query(TestEntity_.relA.equals(0)).build();
119+
expect(query.count(), 1);
120+
read = query.find()[0];
121+
expect(read.tString, equals('there'));
122+
expect(read.relA.targetId, equals(0));
153123
query.close();
154-
}
124+
});
125+
126+
test('query link', () {
127+
final src1 = TestEntity(tString: 'foo');
128+
src1.relA.target = RelatedEntityA(tInt: 5);
129+
final src2 = TestEntity(tString: 'bar');
130+
src2.relA.target = RelatedEntityA(tInt: 10);
131+
src2.relA.target!.relB.target = RelatedEntityB(tString: 'deep');
132+
env.box.putMany([src1, src2]);
133+
134+
{
135+
final qb = env.box.query();
136+
qb.link(TestEntity_.relA, RelatedEntityA_.tInt.equals(10));
137+
final query = qb.build();
138+
final found = query.find();
139+
expect(found.length, 1);
140+
expect(found[0].tString, 'bar');
141+
query.close();
142+
}
143+
144+
{
145+
final qb = env.box.query();
146+
qb
147+
.link(TestEntity_.relA)
148+
.link(RelatedEntityA_.relB, RelatedEntityB_.tString.equals('deep'));
149+
final query = qb.build();
150+
final found = query.find();
151+
expect(found.length, 1);
152+
expect(found[0].tString, 'bar');
153+
query.close();
154+
}
155+
});
155156
});
156157

157158
group('ToMany list management', () {
@@ -244,6 +245,16 @@ void main() {
244245
check(src!.relManyA, items: [1, 3, 4], added: [], removed: []);
245246
});
246247

248+
// note: this requires box.attach() in Java/Kotlin, should not here.
249+
test('put: self-assigned ID on source', () {
250+
src!.id = 42;
251+
src!.relManyA.add(RelatedEntityA(tInt: 1));
252+
env.box.put(src!);
253+
254+
src = env.box.get(42);
255+
check(src!.relManyA, items: [1], added: [], removed: []);
256+
});
257+
247258
test("don't load old data when just adding", () {
248259
expect(src!.relManyA, isNotNull);
249260
src!.relManyA.add(RelatedEntityA(tInt: 1));

0 commit comments

Comments
 (0)