Skip to content

Commit 39e7de3

Browse files
committed
chore(test): add API subscription integration test case for LazyLoading
1 parent 040647f commit 39e7de3

File tree

2 files changed

+536
-0
lines changed

2 files changed

+536
-0
lines changed

AmplifyPlugins/API/Tests/APIHostApp/AWSAPIPluginLazyLoadTests/LL12/DefaultPK/GraphQLLazyLoadDefaultPKTests.swift

Lines changed: 272 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,278 @@ final class GraphQLLazyLoadDefaultPKTests: GraphQLLazyLoadBaseTest {
101101
where: DefaultPKChild.keys.id == defaultPKChild.id))
102102
assertList(queriedChildren, state: .isLoaded(count: 1))
103103
}
104+
105+
/*
106+
- Given: Api category setup with DefaultPKModels
107+
- When:
108+
- Subscribe onCreate events of DefaultPKChild
109+
- Create new DefaultPKChild instance with API
110+
- Then:
111+
- the newly created instance is successfully created through API. onCreate event is received.
112+
*/
113+
func testSubscribeDefaultPKChildOnCreate() async throws {
114+
await setup(withModels: DefaultPKModels())
115+
let connected = asyncExpectation(description: "Subscription connected")
116+
let onCreate = asyncExpectation(description: "onCreate received")
117+
let child = DefaultPKChild()
118+
let subscription = Amplify.API.subscribe(request: .subscription(of: DefaultPKChild.self, type: .onCreate))
119+
Task {
120+
do {
121+
for try await subscriptionEvent in subscription {
122+
switch subscriptionEvent {
123+
case .connection(.connected):
124+
await connected.fulfill()
125+
case let .data(.success(newModel)):
126+
if newModel.identifier == child.identifier {
127+
await onCreate.fulfill()
128+
}
129+
case let .data(.failure(error)):
130+
XCTFail("Failed to create DefaultPKChild, error: \(error.errorDescription)")
131+
default: ()
132+
}
133+
}
134+
}
135+
}
136+
137+
await waitForExpectations([connected], timeout: 10)
138+
try await mutate(.create(child))
139+
await waitForExpectations([onCreate], timeout: 10)
140+
subscription.cancel()
141+
}
142+
143+
/*
144+
- Given: Api category setup with DefaultPKModels
145+
- When:
146+
- Subscribe onCreate events of DefaultPKParent
147+
- Create new DefaultPKChild and DefaultPKParent instances with API
148+
- Then:
149+
- the newly created parent is successfully created through API. onCreate event is received.
150+
*/
151+
func testSubscribeDefaultPKParentOnCreate() async throws {
152+
await setup(withModels: DefaultPKModels())
153+
let connected = asyncExpectation(description: "Subscription connected")
154+
let onCreate = asyncExpectation(description: "onCreate received")
155+
let parent = DefaultPKParent()
156+
let child = DefaultPKChild(parent: parent)
157+
let subscription = Amplify.API.subscribe(request: .subscription(of: DefaultPKParent.self, type: .onCreate))
158+
Task {
159+
do {
160+
for try await subscriptionEvent in subscription {
161+
switch subscriptionEvent {
162+
case .connection(.connected):
163+
await connected.fulfill()
164+
case let .data(.success(newModel)):
165+
try await newModel.children?.fetch()
166+
let associatedChilden = newModel.children?.loadedState
167+
if newModel.identifier == parent.identifier,
168+
case .some(.loaded(let associatedChilden)) = associatedChilden,
169+
associatedChilden.map(\.identifier).contains(child.identifier)
170+
{
171+
await onCreate.fulfill()
172+
}
173+
case let .data(.failure(error)):
174+
XCTFail("Failed to create DefaultPKParent, error: \(error.errorDescription)")
175+
default: ()
176+
}
177+
}
178+
}
179+
}
180+
181+
await waitForExpectations([connected], timeout: 10)
182+
try await mutate(.create(child))
183+
try await mutate(.create(parent))
184+
await waitForExpectations([onCreate], timeout: 10)
185+
subscription.cancel()
186+
}
187+
188+
/*
189+
- Given: Api category setup with DefaultPKModels
190+
- When:
191+
- Subscribe onUpdate events of DefaultPKChild
192+
- Create new DefaultPKChild instance with API
193+
- Update the newly created with API
194+
- Then:
195+
- an onUpdate event is received, the identifier is same to the updated one.
196+
*/
197+
func testSubscriptionDefaultPKChildOnUpdate() async throws {
198+
await setup(withModels: DefaultPKModels())
199+
let connected = asyncExpectation(description: "Subscription connected")
200+
let onUpdate = asyncExpectation(description: "onUpdate received")
201+
let child = DefaultPKChild()
202+
let subscription = Amplify.API.subscribe(request: .subscription(of: DefaultPKChild.self, type: .onUpdate))
203+
204+
Task {
205+
do {
206+
for try await subscriptionEvent in subscription {
207+
switch subscriptionEvent {
208+
case .connection(.connected):
209+
await connected.fulfill()
210+
case let .data(.success(newModel)):
211+
if newModel.identifier == child.identifier {
212+
await onUpdate.fulfill()
213+
}
214+
case let .data(.failure(error)):
215+
XCTFail("Failed to update DefaultPKChild, error: \(error.errorDescription)")
216+
default: ()
217+
}
218+
}
219+
}
220+
}
221+
222+
await waitForExpectations([connected], timeout: 10)
223+
try await mutate(.create(child))
224+
var updatingChild = child
225+
updatingChild.content = UUID().uuidString
226+
try await mutate(.update(updatingChild))
227+
await waitForExpectations([onUpdate], timeout: 10)
228+
subscription.cancel()
229+
}
230+
231+
/*
232+
- Given: Api category setup with DefaultPKModels
233+
- When:
234+
- Subscribe onUpdate events of HasOneParent
235+
- Create new DefaultPKChild instance with API
236+
- Create new DefaultPKParent instance with API
237+
- Update the newly created parent to another DefaultPKChild instance
238+
- Then:
239+
- an onUpdate event is received, the identifier is same to the updated one.
240+
*/
241+
func testSubscriptionDefaultPKParentOnUpdate() async throws {
242+
await setup(withModels: DefaultPKModels())
243+
let connected = asyncExpectation(description: "Subscription connected")
244+
let onUpdate = asyncExpectation(description: "onUpdate received")
245+
246+
let parent = DefaultPKParent()
247+
let child = DefaultPKChild(parent: parent)
248+
let anotherChild = DefaultPKChild(parent: parent)
249+
250+
let subscription = Amplify.API.subscribe(request: .subscription(of: DefaultPKParent.self, type: .onUpdate))
251+
252+
Task {
253+
do {
254+
for try await subscriptionEvent in subscription {
255+
switch subscriptionEvent {
256+
case .connection(.connected):
257+
await connected.fulfill()
258+
case let .data(.success(newModel)):
259+
try await newModel.children?.fetch()
260+
let associatedChilden = newModel.children?.loadedState
261+
if newModel.identifier == parent.identifier,
262+
case .some(.loaded(let associatedChilden)) = associatedChilden,
263+
associatedChilden.map(\.identifier).contains(child.identifier),
264+
associatedChilden.map(\.identifier).contains(anotherChild.identifier)
265+
{
266+
await onUpdate.fulfill()
267+
}
268+
case let .data(.failure(error)):
269+
XCTFail("Failed to update HasOneParent, error: \(error.errorDescription)")
270+
default: ()
271+
}
272+
}
273+
}
274+
}
275+
276+
await waitForExpectations([connected], timeout: 10)
277+
try await mutate(.create(child))
278+
try await mutate(.create(parent))
279+
try await mutate(.create(anotherChild))
280+
var updatingParent = parent
281+
updatingParent.content = UUID().uuidString
282+
try await mutate(.update(updatingParent))
283+
await waitForExpectations([onUpdate], timeout: 10)
284+
subscription.cancel()
285+
}
286+
287+
/*
288+
- Given: Api category setup with DefaultPKModels
289+
- When:
290+
- Subscribe onDelete events of DefaultPKChild
291+
- Create new DefaultPKChild instance with API
292+
- Delete the newly created one with API
293+
- Then:
294+
- an onDelete event is received, the identifier is same to the newly created one.
295+
*/
296+
func testSubscriptionDefaultPKChildOnDelete() async throws {
297+
await setup(withModels: DefaultPKModels())
298+
let connected = asyncExpectation(description: "Subscription connected")
299+
let onDelete = asyncExpectation(description: "onDelete received")
300+
let child = DefaultPKChild()
301+
let subscription = Amplify.API.subscribe(request: .subscription(of: DefaultPKChild.self, type: .onDelete))
302+
303+
Task {
304+
do {
305+
for try await subscriptionEvent in subscription {
306+
switch subscriptionEvent {
307+
case .connection(.connected):
308+
await connected.fulfill()
309+
case let .data(.success(newModel)):
310+
if newModel.identifier == child.identifier {
311+
await onDelete.fulfill()
312+
}
313+
case let .data(.failure(error)):
314+
XCTFail("Failed to delete DefaultPKChild, error: \(error.errorDescription)")
315+
default: ()
316+
}
317+
}
318+
}
319+
}
320+
321+
await waitForExpectations([connected], timeout: 10)
322+
try await mutate(.create(child))
323+
try await mutate(.delete(child))
324+
await waitForExpectations([onDelete], timeout: 10)
325+
subscription.cancel()
326+
}
327+
328+
/*
329+
- Given: Api category setup with DefaultPKModels
330+
- When:
331+
- Subscribe onDelete events of DefaultPKParent
332+
- Create new DefaultPKChild instance with API
333+
- Create new DefaultPKParent instance with API
334+
- Delete the newly created parent with API
335+
- Then:
336+
- an onDelete event is received, the identifier is same to the newly created one.
337+
*/
338+
func testSubscriptionDefaultPKParentOnDelete() async throws {
339+
await setup(withModels: DefaultPKModels())
340+
let connected = asyncExpectation(description: "Subscription connected")
341+
let onDelete = asyncExpectation(description: "onDelete received")
342+
let parent = DefaultPKParent()
343+
let child = DefaultPKChild(parent: parent)
344+
let subscription = Amplify.API.subscribe(request: .subscription(of: DefaultPKParent.self, type: .onDelete))
345+
346+
Task {
347+
do {
348+
for try await subscriptionEvent in subscription {
349+
switch subscriptionEvent {
350+
case .connection(.connected):
351+
await connected.fulfill()
352+
case let .data(.success(newModel)):
353+
try await newModel.children?.fetch()
354+
let associatedChilden = newModel.children?.loadedState
355+
if newModel.identifier == parent.identifier,
356+
case .some(.loaded(let associatedChildren)) = associatedChilden,
357+
associatedChildren.map(\.identifier).contains(child.identifier)
358+
{
359+
await onDelete.fulfill()
360+
}
361+
case let .data(.failure(error)):
362+
XCTFail("Failed to delete DefaultPKParent, error: \(error.errorDescription)")
363+
default: ()
364+
}
365+
}
366+
}
367+
}
368+
369+
await waitForExpectations([connected], timeout: 10)
370+
try await mutate(.create(child))
371+
try await mutate(.create(parent))
372+
try await mutate(.delete(parent))
373+
await waitForExpectations([onDelete], timeout: 10)
374+
subscription.cancel()
375+
}
104376
}
105377

106378
extension GraphQLLazyLoadDefaultPKTests: DefaultLogger { }

0 commit comments

Comments
 (0)