Skip to content

Commit 182c6a6

Browse files
chore: Custom Primary key API sync based integ tests (#1246)
Refactor code for different mutations Reuse queryCustomerOrder() for querying after delete Co-authored-by: Diego Costantino <[email protected]>
1 parent 6d30310 commit 182c6a6

File tree

4 files changed

+233
-7
lines changed

4 files changed

+233
-7
lines changed

AmplifyPlugins/API/APICategoryPlugin.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
/* Begin PBXBuildFile section */
1010
13066F229854831AA628ECEC /* Pods_HostApp_AWSAPICategoryPluginTestCommon_RESTWithUserPoolIntegrationTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DD6386039136045F18D44AC /* Pods_HostApp_AWSAPICategoryPluginTestCommon_RESTWithUserPoolIntegrationTests.framework */; };
1111
210E217E265E9BB000D90ED8 /* GraphQLModelBasedTests+Concurrency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 210E217D265E9BB000D90ED8 /* GraphQLModelBasedTests+Concurrency.swift */; };
12+
210E2180265EFD6800D90ED8 /* GraphQLSyncCustomPrimaryKeyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 210E217F265EFD6800D90ED8 /* GraphQLSyncCustomPrimaryKeyTests.swift */; };
1213
211BEDF025E5904E004F367A /* AWSHTTPURLResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211BEDEF25E5904E004F367A /* AWSHTTPURLResponse.swift */; };
1314
211BEDFB25E59DC8004F367A /* AWSHTTPURLResponseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211BEDFA25E59DC8004F367A /* AWSHTTPURLResponseTests.swift */; };
1415
21233D032469B06B00039337 /* SocialNote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21233D022469B06B00039337 /* SocialNote.swift */; };
@@ -310,6 +311,7 @@
310311
1B30959CE873C097E54BDFD6 /* Pods-GraphQLWithAPIKeyIntegrationTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GraphQLWithAPIKeyIntegrationTests.release.xcconfig"; path = "Target Support Files/Pods-GraphQLWithAPIKeyIntegrationTests/Pods-GraphQLWithAPIKeyIntegrationTests.release.xcconfig"; sourceTree = "<group>"; };
311312
1FDC07084023DEF205FF6598 /* Pods-AWSAPICategoryPlugin-AWSAPICategoryPluginTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AWSAPICategoryPlugin-AWSAPICategoryPluginTests.debug.xcconfig"; path = "Target Support Files/Pods-AWSAPICategoryPlugin-AWSAPICategoryPluginTests/Pods-AWSAPICategoryPlugin-AWSAPICategoryPluginTests.debug.xcconfig"; sourceTree = "<group>"; };
312313
210E217D265E9BB000D90ED8 /* GraphQLModelBasedTests+Concurrency.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "GraphQLModelBasedTests+Concurrency.swift"; sourceTree = "<group>"; };
314+
210E217F265EFD6800D90ED8 /* GraphQLSyncCustomPrimaryKeyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GraphQLSyncCustomPrimaryKeyTests.swift; sourceTree = "<group>"; };
313315
211BEDEF25E5904E004F367A /* AWSHTTPURLResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSHTTPURLResponse.swift; sourceTree = "<group>"; };
314316
211BEDFA25E59DC8004F367A /* AWSHTTPURLResponseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSHTTPURLResponseTests.swift; sourceTree = "<group>"; };
315317
21233D022469B06B00039337 /* SocialNote.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialNote.swift; sourceTree = "<group>"; };
@@ -709,6 +711,7 @@
709711
children = (
710712
21F40A2923A0423C0074678E /* GraphQLSyncBasedTests-amplifyconfiguration.json */,
711713
216201E223920A6200AB2E10 /* GraphQLSyncBasedTests.swift */,
714+
210E217F265EFD6800D90ED8 /* GraphQLSyncCustomPrimaryKeyTests.swift */,
712715
21598CEE23A00F6A00529F29 /* README.md */,
713716
);
714717
path = GraphQLSyncBased;
@@ -2296,6 +2299,7 @@
22962299
210E217E265E9BB000D90ED8 /* GraphQLModelBasedTests+Concurrency.swift in Sources */,
22972300
212B298B2592519800593ED5 /* GraphQLConnectionScenario3Tests+List.swift in Sources */,
22982301
217D60022578369F009F0639 /* GraphQLConnectionScenario1Tests.swift in Sources */,
2302+
210E2180265EFD6800D90ED8 /* GraphQLSyncCustomPrimaryKeyTests.swift in Sources */,
22992303
21A90541261644F700EC141D /* GraphQLScalarTests.swift in Sources */,
23002304
212B299F259251F100593ED5 /* GraphQLModelBasedTests+List.swift in Sources */,
23012305
);

AmplifyPlugins/API/APICategoryPlugin.xcodeproj/xcshareddata/xcschemes/AWSAPICategoryPluginFunctionalTests.xcscheme

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,6 @@
3838
<Test
3939
Identifier = "GraphQLConnectionScenario1Tests/testListProjectsByTeamID()">
4040
</Test>
41-
<Test
42-
Identifier = "GraphQLSyncBasedTests">
43-
</Test>
4441
</SkippedTests>
4542
</TestableReference>
4643
</Testables>
Lines changed: 220 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
1+
//
2+
// Copyright Amazon.com Inc. or its affiliates.
3+
// All Rights Reserved.
4+
//
5+
// SPDX-License-Identifier: Apache-2.0
6+
//
7+
8+
import XCTest
9+
@testable import AWSAPICategoryPlugin
10+
@testable import Amplify
11+
@testable import AmplifyTestCommon
12+
@testable import AWSAPICategoryPluginTestCommon
13+
import AWSPluginsCore
14+
15+
class GraphQLSyncCustomPrimaryKeyTests: XCTestCase {
16+
17+
static let amplifyConfiguration = "GraphQLSyncBasedTests-amplifyconfiguration"
18+
19+
override func setUp() {
20+
Amplify.reset()
21+
let plugin = AWSAPIPlugin()
22+
23+
do {
24+
try Amplify.add(plugin: plugin)
25+
26+
let amplifyConfig = try TestConfigHelper.retrieveAmplifyConfiguration(
27+
forResource: GraphQLSyncBasedTests.amplifyConfiguration)
28+
try Amplify.configure(amplifyConfig)
29+
30+
ModelRegistry.register(modelType: CustomerOrder.self)
31+
32+
} catch {
33+
XCTFail("Error during setup: \(error)")
34+
}
35+
}
36+
37+
override func tearDown() {
38+
Amplify.reset()
39+
}
40+
41+
/// Test for deletion of model with custom primary keys
42+
///
43+
/// - Given: A customer order
44+
/// - When:
45+
/// - The customer order is queried for, updated, deleted and queried for again
46+
/// - Then:
47+
/// - The customer order should be deleted
48+
///
49+
func testDelete() throws {
50+
51+
/// Create order
52+
let customerOrder = CustomerOrder(orderId: UUID().uuidString, email: "[email protected]")
53+
guard let createMutationSyncResult = createCustomerOrder(customerOrder: customerOrder),
54+
let createdCustomerOrder = createMutationSyncResult.model.instance as? CustomerOrder else {
55+
XCTFail("Failed to create customer order")
56+
return
57+
}
58+
59+
/// Query order
60+
guard let queryMutationSyncResult = queryCustomerOrder(modelName: CustomerOrder.modelName,
61+
byId: createdCustomerOrder.id,
62+
orderId: createdCustomerOrder.orderId),
63+
var queriedCustomerOrder = queryMutationSyncResult.model.instance as? CustomerOrder else {
64+
XCTFail("Failed to query customer order")
65+
return
66+
}
67+
68+
XCTAssertEqual(customerOrder.id, queriedCustomerOrder.id)
69+
70+
/// Update order
71+
queriedCustomerOrder.email = "[email protected]"
72+
guard let updateMutationSyncResult = updateCustomerOrder(of: queriedCustomerOrder,
73+
modelSchema: queriedCustomerOrder.schema,
74+
version: queryMutationSyncResult.syncMetadata.version),
75+
let updatedCustomerOrder = updateMutationSyncResult.model.instance as? CustomerOrder else {
76+
XCTFail("Failed to update customer order")
77+
return
78+
}
79+
80+
XCTAssertEqual(customerOrder.id, updatedCustomerOrder.id)
81+
82+
/// Delete order
83+
guard let deleteMutationSyncResult = deleteCustomerOrder(of: updatedCustomerOrder,
84+
modelSchema: updatedCustomerOrder.schema,
85+
version: updateMutationSyncResult.syncMetadata.version),
86+
let deletedCustomerOrder = deleteMutationSyncResult.model.instance as? CustomerOrder else {
87+
XCTFail("Failed to update customer order")
88+
return
89+
}
90+
91+
XCTAssertEqual(customerOrder.id, deletedCustomerOrder.id)
92+
93+
/// Query after delete
94+
guard let queryAfterDeleteMutationSyncResult = queryCustomerOrder(modelName: CustomerOrder.modelName,
95+
byId: deletedCustomerOrder.id,
96+
orderId: deletedCustomerOrder.orderId),
97+
let queryDeletedCustomerOrder = queryAfterDeleteMutationSyncResult.model.instance as? CustomerOrder else {
98+
XCTFail("Failed to query customer order")
99+
return
100+
}
101+
102+
XCTAssertEqual(queryDeletedCustomerOrder.id, customerOrder.id)
103+
XCTAssertTrue(queryAfterDeleteMutationSyncResult.syncMetadata.deleted)
104+
}
105+
106+
// MARK: - Helpers
107+
108+
func createCustomerOrder(customerOrder: CustomerOrder) -> MutationSyncResult? {
109+
var result: MutationSyncResult?
110+
let completeInvoked = expectation(description: "request completed")
111+
112+
let request = GraphQLRequest<MutationSyncResult>.createMutation(of: customerOrder)
113+
_ = Amplify.API.mutate(request: request, listener: { event in
114+
switch event {
115+
case .success(let data):
116+
switch data {
117+
case .success(let post):
118+
result = post
119+
case .failure(let error):
120+
XCTFail("Failed to create post \(error)")
121+
}
122+
completeInvoked.fulfill()
123+
case .failure(let error):
124+
print(error)
125+
}
126+
})
127+
wait(for: [completeInvoked], timeout: TestCommonConstants.networkTimeout)
128+
return result
129+
}
130+
131+
func queryCustomerOrder(modelName: String,
132+
byId id: String,
133+
orderId: String) -> MutationSyncResult? {
134+
var documentBuilder = ModelBasedGraphQLDocumentBuilder(modelName: modelName, operationType: .query)
135+
documentBuilder.add(decorator: DirectiveNameDecorator(type: .get))
136+
documentBuilder.add(decorator: ModelIdDecorator(id: id, fields: ["orderId": orderId]))
137+
documentBuilder.add(decorator: ConflictResolutionDecorator())
138+
documentBuilder.add(decorator: AuthRuleDecorator(.query))
139+
let document = documentBuilder.build()
140+
141+
let queryRequest = GraphQLRequest<MutationSyncResult?>(document: document.stringValue,
142+
variables: document.variables,
143+
responseType: MutationSyncResult?.self,
144+
decodePath: document.name)
145+
var querySyncResult: MutationSyncResult?
146+
let querySuccess = expectation(description: "query successful")
147+
_ = Amplify.API.query(request: queryRequest) { event in
148+
switch event {
149+
case .success(let response):
150+
switch response {
151+
case .success(let mutationSync):
152+
querySyncResult = mutationSync
153+
case .failure(let graphQLError):
154+
XCTFail("\(graphQLError)")
155+
}
156+
querySuccess.fulfill()
157+
case .failure(let error):
158+
XCTFail("\(error)")
159+
}
160+
}
161+
wait(for: [querySuccess], timeout: TestCommonConstants.networkTimeout)
162+
return querySyncResult
163+
}
164+
165+
func updateCustomerOrder(of model: Model,
166+
modelSchema: ModelSchema,
167+
version: Int) -> MutationSyncResult? {
168+
let updateSuccess = expectation(description: "update successful")
169+
let updateRequest = GraphQLRequest<MutationSyncResult>.updateMutation(
170+
of: model,
171+
modelSchema: modelSchema,
172+
version: version)
173+
174+
var updateSyncResult: MutationSyncResult?
175+
_ = Amplify.API.mutate(request: updateRequest) { event in
176+
switch event {
177+
case .success(let response):
178+
switch response {
179+
case .success(let mutationSync):
180+
updateSyncResult = mutationSync
181+
case .failure(let graphQLError):
182+
XCTFail("\(graphQLError)")
183+
}
184+
updateSuccess.fulfill()
185+
case .failure(let error):
186+
XCTFail("\(error)")
187+
}
188+
}
189+
wait(for: [updateSuccess], timeout: TestCommonConstants.networkTimeout)
190+
return updateSyncResult
191+
}
192+
193+
func deleteCustomerOrder(of model: Model,
194+
modelSchema: ModelSchema,
195+
version: Int) -> MutationSyncResult? {
196+
let deleteSuccess = expectation(description: "delete successful")
197+
let deleteRequest = GraphQLRequest<MutationSyncResult>.deleteMutation(
198+
of: model,
199+
modelSchema: modelSchema,
200+
version: version)
201+
202+
var deleteSyncResult: MutationSyncResult?
203+
_ = Amplify.API.mutate(request: deleteRequest) { event in
204+
switch event {
205+
case .success(let response):
206+
switch response {
207+
case .success(let mutationSync):
208+
deleteSyncResult = mutationSync
209+
case .failure(let graphQLError):
210+
XCTFail("\(graphQLError)")
211+
}
212+
deleteSuccess.fulfill()
213+
case .failure(let error):
214+
XCTFail("\(error)")
215+
}
216+
}
217+
wait(for: [deleteSuccess], timeout: TestCommonConstants.networkTimeout)
218+
return deleteSyncResult
219+
}
220+
}

AmplifyPlugins/API/AWSAPICategoryPluginFunctionalTests/GraphQLSyncBased/README.md

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@ The following steps demonstrate how to set up an GraphQL endpoint with AppSync t
66

77
1. `amplify init`
88

9-
2. `export AMPLIFY_DATASTORE_SYNC=true`
10-
11-
3. `amplify add api`
9+
2. `amplify add api`
1210

1311
```perl
1412
? Please select from one of the below mentioned services: `GraphQL`
@@ -50,6 +48,13 @@ type Comment @model {
5048
createdAt: AWSDateTime!
5149
post: Post @connection(name: "PostComment")
5250
}
51+
52+
type CustomerOrder @model
53+
@key(fields: ["orderId","id"]) {
54+
id: ID!
55+
orderId: String!
56+
email: String!
57+
}
5358
```
5459

55-
4. `amplify push`
60+
3. `amplify push`

0 commit comments

Comments
 (0)