Skip to content

Commit f4a369c

Browse files
authored
fix: Fix cancellation logic for AWSGraphQLSubscriptionOperation (#650)
1 parent d045aa4 commit f4a369c

File tree

3 files changed

+62
-12
lines changed

3 files changed

+62
-12
lines changed

AmplifyPlugins/API/APICategoryPlugin.xcodeproj/project.pbxproj

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@
132132
B4DFA5F9237A611D0013E17B /* AWSAPICategoryPlugin+URLSessionDelegateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4DFA5DF237A611D0013E17B /* AWSAPICategoryPlugin+URLSessionDelegateTests.swift */; };
133133
FA8EE785238632620097E4F1 /* AWSAPIPlugin+Log.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA8EE784238632620097E4F1 /* AWSAPIPlugin+Log.swift */; };
134134
FA97F5532386CCF500EE9EFE /* AnyModelIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA97F5522386CCF500EE9EFE /* AnyModelIntegrationTests.swift */; };
135+
FAA7A5AA24C0E01500CA863F /* AWSGraphQLSubscriptionOperationCancelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAA7A5A924C0E01500CA863F /* AWSGraphQLSubscriptionOperationCancelTests.swift */; };
135136
FAC5F9B1238B70EE00F70F02 /* APICategoryPluginConcurrencyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA9554DF238B6C0B00D42A43 /* APICategoryPluginConcurrencyTests.swift */; };
136137
/* End PBXBuildFile section */
137138

@@ -443,6 +444,7 @@
443444
FA8EE784238632620097E4F1 /* AWSAPIPlugin+Log.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AWSAPIPlugin+Log.swift"; sourceTree = "<group>"; };
444445
FA9554DF238B6C0B00D42A43 /* APICategoryPluginConcurrencyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APICategoryPluginConcurrencyTests.swift; sourceTree = "<group>"; };
445446
FA97F5522386CCF500EE9EFE /* AnyModelIntegrationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnyModelIntegrationTests.swift; sourceTree = "<group>"; };
447+
FAA7A5A924C0E01500CA863F /* AWSGraphQLSubscriptionOperationCancelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSGraphQLSubscriptionOperationCancelTests.swift; sourceTree = "<group>"; };
446448
FC6404420A9C03FAB55FA8B3 /* Pods-AWSAPICategoryPluginGraphQLAPIKeyIntegrationTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AWSAPICategoryPluginGraphQLAPIKeyIntegrationTests.debug.xcconfig"; path = "Target Support Files/Pods-AWSAPICategoryPluginGraphQLAPIKeyIntegrationTests/Pods-AWSAPICategoryPluginGraphQLAPIKeyIntegrationTests.debug.xcconfig"; sourceTree = "<group>"; };
447449
/* End PBXFileReference section */
448450

@@ -931,7 +933,7 @@
931933
B4DFA5D5237A611D0013E17B /* AWSAPICategoryPlugin+URLSessionBehaviorDelegateTests.swift */,
932934
B4DFA5DF237A611D0013E17B /* AWSAPICategoryPlugin+URLSessionDelegateTests.swift */,
933935
B4DFA5CB237A611D0013E17B /* AWSAPICategoryPluginTestBase.swift */,
934-
FA9554E1238B6C1200D42A43 /* Concurrency */,
936+
FAA7A5A924C0E01500CA863F /* AWSGraphQLSubscriptionOperationCancelTests.swift */,
935937
B4DFA5C6237A611D0013E17B /* Configuration */,
936938
B4DFA5D9237A611D0013E17B /* Interceptor */,
937939
B4DFA5BF237A611D0013E17B /* Mocks */,
@@ -1064,13 +1066,6 @@
10641066
path = Pods;
10651067
sourceTree = "<group>";
10661068
};
1067-
FA9554E1238B6C1200D42A43 /* Concurrency */ = {
1068-
isa = PBXGroup;
1069-
children = (
1070-
);
1071-
path = Concurrency;
1072-
sourceTree = "<group>";
1073-
};
10741069
FA99642D246EF8B40020E879 /* Resources */ = {
10751070
isa = PBXGroup;
10761071
children = (
@@ -2195,6 +2190,7 @@
21952190
B4DFA5E0237A611D0013E17B /* MockSessionFactory.swift in Sources */,
21962191
6B2E465A23AAA6AF0066EDCE /* NetworkReachabilityNotifierTests.swift in Sources */,
21972192
B4DFA5E1237A611D0013E17B /* MockURLSessionTask.swift in Sources */,
2193+
FAA7A5AA24C0E01500CA863F /* AWSGraphQLSubscriptionOperationCancelTests.swift in Sources */,
21982194
B4DFA5F8237A611D0013E17B /* AWSAPICategoryPlugin+ConfigureTests.swift in Sources */,
21992195
21E2E22A2451E6B5007D7767 /* GraphQLResponseDecoderDecodeErrorTests.swift in Sources */,
22002196
B4DFA5F1237A611D0013E17B /* AWSAPICategoryPlugin+URLSessionBehaviorDelegateTests.swift in Sources */,

AmplifyPlugins/API/AWSAPICategoryPlugin/Operation/AWSGraphQLSubscriptionOperation.swift

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,10 @@ final public class AWSGraphQLSubscriptionOperation<R: Decodable>: GraphQLSubscri
4343
subscriptionConnection.unsubscribe(item: subscriptionItem)
4444
let subscriptionEvent = SubscriptionEvent<GraphQLResponse<R>>.connection(.disconnected)
4545
dispatchInProcess(data: subscriptionEvent)
46-
dispatch(result: .successfulVoid)
47-
finish()
48-
} else {
49-
super.cancel()
5046
}
47+
super.cancel()
48+
dispatch(result: .successfulVoid)
49+
finish()
5150
}
5251

5352
override public func main() {
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
//
2+
// Copyright 2018-2020 Amazon.com,
3+
// Inc. or its affiliates. All Rights Reserved.
4+
//
5+
// SPDX-License-Identifier: Apache-2.0
6+
//
7+
8+
import XCTest
9+
10+
@testable import Amplify
11+
@testable import AWSAPICategoryPlugin
12+
@testable import AmplifyTestCommon
13+
14+
// swiftlint:disable:next type_name
15+
class AWSGraphQLSubscriptionOperationCancelTests: AWSAPICategoryPluginTestBase {
16+
17+
func testCancelSendsCompletion() {
18+
let request = GraphQLRequest(apiName: apiName,
19+
document: testDocument,
20+
variables: nil,
21+
responseType: JSONValue.self)
22+
23+
let receivedCompletion = expectation(description: "Received completion")
24+
let receivedFailure = expectation(description: "Received failure")
25+
receivedFailure.isInverted = true
26+
let receivedValue = expectation(description: "Received value")
27+
receivedValue.isInverted = true
28+
29+
let valueListener: GraphQLSubscriptionOperation<JSONValue>.InProcessListener = { _ in
30+
receivedValue.fulfill()
31+
}
32+
33+
let completionListener: GraphQLSubscriptionOperation<JSONValue>.ResultListener = { result in
34+
switch result {
35+
case .failure:
36+
receivedFailure.fulfill()
37+
case .success:
38+
receivedCompletion.fulfill()
39+
}
40+
}
41+
42+
let operation = apiPlugin.subscribe(
43+
request: request,
44+
valueListener: valueListener,
45+
completionListener: completionListener
46+
)
47+
48+
operation.cancel()
49+
50+
XCTAssert(operation.isCancelled)
51+
52+
waitForExpectations(timeout: 0.05)
53+
}
54+
55+
}

0 commit comments

Comments
 (0)