/
NSManagedObjectContext+MagicalSavesTests.m
205 lines (142 loc) · 8.18 KB
/
NSManagedObjectContext+MagicalSavesTests.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
//
// Created by Tony Arnold on 25/03/2014.
// Copyright (c) 2014 Magical Panda Software LLC. All rights reserved.
//
#import "MagicalRecordTestBase.h"
#import "SingleEntityWithNoRelationships.h"
@interface NSManagedObjectContextMagicalSavesTests : MagicalRecordTestBase
@end
@implementation NSManagedObjectContextMagicalSavesTests
- (void)testSaveToSelfOnlyWhenSaveIsSynchronous
{
NSManagedObjectContext *parentContext = [NSManagedObjectContext MR_defaultContext];
NSManagedObjectContext *childContext = [NSManagedObjectContext MR_contextWithParent:parentContext];
SingleEntityWithNoRelationships *insertedObject = [SingleEntityWithNoRelationships MR_createEntityInContext:childContext];
expect([insertedObject hasChanges]).to.beTruthy();
NSError *obtainIDsError;
BOOL obtainIDsResult = [childContext obtainPermanentIDsForObjects:@[insertedObject] error:&obtainIDsError];
expect(obtainIDsResult).to.beTruthy();
expect(obtainIDsError).to.beNil();
NSManagedObjectID *insertedObjectID = [insertedObject objectID];
expect(insertedObjectID).toNot.beNil();
expect([insertedObjectID isTemporaryID]).to.beFalsy();
[childContext MR_saveOnlySelfAndWait];
NSManagedObject *parentContextFetchedObject = [parentContext objectRegisteredForID:insertedObjectID];
// Saving a child context moves the saved changes up to the parent, but does
// not save them, leaving the parent context with changes
expect(parentContextFetchedObject).toNot.beNil();
expect([parentContextFetchedObject hasChanges]).to.beTruthy();
NSManagedObject *childContextFetchedObject = [childContext objectRegisteredForID:insertedObjectID];
// The child context should not have changes after the save
expect(childContextFetchedObject).toNot.beNil();
expect([childContextFetchedObject hasChanges]).to.beFalsy();
}
- (void)testSaveToSelfOnlyWhenSaveIsAsynchronous
{
NSManagedObjectContext *parentContext = [NSManagedObjectContext MR_defaultContext];
NSManagedObjectContext *childContext = [NSManagedObjectContext MR_contextWithParent:parentContext];
SingleEntityWithNoRelationships *insertedObject = [SingleEntityWithNoRelationships MR_createEntityInContext:childContext];
expect([insertedObject hasChanges]).to.beTruthy();
NSError *obtainIDsError;
BOOL obtainIDsResult = [childContext obtainPermanentIDsForObjects:@[insertedObject] error:&obtainIDsError];
expect(obtainIDsResult).to.beTruthy();
expect(obtainIDsError).to.beNil();
NSManagedObjectID *insertedObjectID = [insertedObject objectID];
expect(insertedObjectID).toNot.beNil();
expect([insertedObjectID isTemporaryID]).to.beFalsy();
__block NSManagedObject *parentContextFetchedObject;
__block NSManagedObject *childContextFetchedObject;
[childContext MR_saveOnlySelfWithCompletion:^(BOOL success, NSError *error) {
expect(success).to.beTruthy();
expect(error).to.beNil();
parentContextFetchedObject = [parentContext objectRegisteredForID:insertedObjectID];
childContextFetchedObject = [childContext objectRegisteredForID:insertedObjectID];
}];
// Saving a child context moves the saved changes up to the parent, but does
// not save them, leaving the parent context with changes
expect(parentContextFetchedObject).willNot.beNil();
expect([parentContextFetchedObject hasChanges]).will.beTruthy();
// The child context should not have changes after the save
expect(childContextFetchedObject).willNot.beNil();
expect([childContextFetchedObject hasChanges]).will.beFalsy();
}
- (void)testSaveToSelfOnlyWhenSaveIsAsynchronousCallsMainThreadOnCompletion
{
NSManagedObjectContext *defaultContext = [NSManagedObjectContext MR_defaultContext];
__block BOOL completionBlockCalled = NO;
__block BOOL completionBlockIsOnMainThread = NO;
NSManagedObject *inserted = [SingleEntityWithNoRelationships MR_createEntityInContext:defaultContext];
expect([inserted hasChanges]).to.beTruthy();
[defaultContext MR_saveOnlySelfWithCompletion:^(BOOL success, NSError *error) {
completionBlockCalled = YES;
completionBlockIsOnMainThread = [NSThread isMainThread];
}];
expect(completionBlockCalled).will.beTruthy();
expect(completionBlockIsOnMainThread).will.beTruthy();
}
- (void)testSaveToPersistentStoreWhenSaveIsSynchronous
{
NSManagedObjectContext *parentContext = [NSManagedObjectContext MR_defaultContext];
NSManagedObjectContext *childContext = [NSManagedObjectContext MR_contextWithParent:parentContext];
SingleEntityWithNoRelationships *insertedObject = [SingleEntityWithNoRelationships MR_createEntityInContext:childContext];
expect([insertedObject hasChanges]).to.beTruthy();
NSError *obtainIDsError;
BOOL obtainIDsResult = [childContext obtainPermanentIDsForObjects:@[insertedObject] error:&obtainIDsError];
expect(obtainIDsResult).to.beTruthy();
expect(obtainIDsError).to.beNil();
NSManagedObjectID *insertedObjectID = [insertedObject objectID];
expect(insertedObjectID).toNot.beNil();
expect([insertedObjectID isTemporaryID]).to.beFalsy();
[childContext MR_saveToPersistentStoreAndWait];
NSError *fetchExistingObjectFromParentContextError;
NSManagedObject *parentContextFetchedObject = [parentContext existingObjectWithID:insertedObjectID error:&fetchExistingObjectFromParentContextError];
// Saving to the persistent store should save to all parent contexts,
// leaving no changes
expect(fetchExistingObjectFromParentContextError).to.beNil();
expect(parentContextFetchedObject).toNot.beNil();
expect([parentContextFetchedObject hasChanges]).to.beFalsy();
NSManagedObject *childContextFetchedObject = [childContext objectRegisteredForID:insertedObjectID];
// The child context should not have changes after the save
expect(childContextFetchedObject).toNot.beNil();
expect([childContextFetchedObject hasChanges]).to.beFalsy();
}
- (void)testSaveToPersistentStoreWhenSaveIsAsynchronous
{
NSManagedObjectContext *parentContext = [NSManagedObjectContext MR_defaultContext];
NSManagedObjectContext *childContext = [NSManagedObjectContext MR_contextWithParent:parentContext];
SingleEntityWithNoRelationships *insertedObject = [SingleEntityWithNoRelationships MR_createEntityInContext:childContext];
expect([insertedObject hasChanges]).to.beTruthy();
NSError *obtainIDsError;
BOOL obtainIDsResult = [childContext obtainPermanentIDsForObjects:@[insertedObject] error:&obtainIDsError];
expect(obtainIDsResult).to.beTruthy();
expect(obtainIDsError).to.beNil();
NSManagedObjectID *insertedObjectID = [insertedObject objectID];
expect(insertedObjectID).toNot.beNil();
expect([insertedObjectID isTemporaryID]).to.beFalsy();
__block NSManagedObject *parentContextFetchedObject;
__block NSManagedObject *childContextFetchedObject;
__block NSError *fetchExistingObjectFromParentContextError;
[childContext MR_saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) {
expect(success).to.beTruthy();
expect(error).to.beNil();
parentContextFetchedObject = [parentContext existingObjectWithID:insertedObjectID error:&fetchExistingObjectFromParentContextError];
childContextFetchedObject = [childContext objectRegisteredForID:insertedObjectID];
}];
// Saving to the persistent store should save to all parent contexts,
// leaving no changes
expect(fetchExistingObjectFromParentContextError).to.beNil();
expect(parentContextFetchedObject).willNot.beNil();
expect([parentContextFetchedObject hasChanges]).will.beFalsy();
// The child context should not have changes after the save
expect(childContextFetchedObject).willNot.beNil();
expect([childContextFetchedObject hasChanges]).will.beFalsy();
}
- (void)testThatSavedObjectsHavePermanentIDs
{
NSManagedObjectContext *defaultContext = [NSManagedObjectContext MR_defaultContext];
SingleEntityWithNoRelationships *entity = [SingleEntityWithNoRelationships MR_createEntityInContext:defaultContext];
expect([[entity objectID] isTemporaryID]).to.beTruthy();
[defaultContext MR_saveOnlySelfAndWait];
expect([[entity objectID] isTemporaryID]).to.beFalsy();
}
@end