Skip to content

Commit 2bea1db

Browse files
authored
Merge pull request #235 from line/coverage/open-chat-creating
Improve OpenChatCreatingController test coverage and simplify test structure
2 parents cb8d06e + e77ca26 commit 2bea1db

File tree

3 files changed

+507
-114
lines changed

3 files changed

+507
-114
lines changed

LineSDK/LineSDK/LineSDKUI/OpenChatUI/Public/OpenChatCreatingController.swift

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ public class OpenChatCreatingController {
9191
/// ```
9292
public func loadAndPresent(
9393
in viewController: UIViewController,
94+
navigationDismissAnimating: Bool = true,
9495
presentedHandler handler: ((Result<UIViewController, LineSDKError>) -> Void)? = nil
9596
)
9697
{
@@ -99,7 +100,11 @@ public class OpenChatCreatingController {
99100
do {
100101
let response = try await Session.shared.send(checkTermRequest)
101102
if response.agreed {
102-
self.presentCreatingViewController(in: viewController, handler: handler)
103+
self.presentCreatingViewController(
104+
in: viewController,
105+
navigationDismissAnimating: navigationDismissAnimating,
106+
handler: handler
107+
)
103108
} else {
104109
let shouldPreventAlert = self.delegate?.openChatCreatingController(
105110
self, shouldPreventUserTermAlertFrom: viewController)
@@ -144,14 +149,15 @@ public class OpenChatCreatingController {
144149

145150
func presentCreatingViewController(
146151
in viewController: UIViewController,
152+
navigationDismissAnimating: Bool = true,
147153
handler: ((Result<UIViewController, LineSDKError>) -> Void)?
148154
)
149155
{
150156
let (navigation, roomInfoFormViewController) = OpenChatRoomInfoViewController.createViewController(self)
151157
roomInfoFormViewController.suggestedCategory = suggestedCategory
152158

153159
roomInfoFormViewController.onClose.delegate(on: self) { (self, vc) in
154-
vc.dismiss(animated: true) {
160+
vc.dismiss(animated: navigationDismissAnimating) {
155161
self.delegate?.openChatCreatingControllerDidCancelCreating(self)
156162
}
157163
}
@@ -175,7 +181,7 @@ public class OpenChatCreatingController {
175181
let response = try await Session.shared.send(createRoomRequest)
176182
indicator.remove()
177183
UserDefaultsValue.cachedOpenChatUserProfileName = room.creatorDisplayName
178-
navigation.dismiss(animated: true) {
184+
navigation.dismiss(animated: navigationDismissAnimating) {
179185
self.delegate?.openChatCreatingController(
180186
self, didCreateChatRoom: response, withCreatingItem: room
181187
)

LineSDK/LineSDKTests/Login/LoginManagerTests.swift

Lines changed: 70 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,30 @@ class LoginManagerTests: XCTestCase, ViewControllerCompatibleTest {
3737

3838
var window: UIWindow!
3939

40-
private func setupSessionStub() {
40+
override func setUp() {
41+
let url = URL(string: "https://example.com/auth")
42+
LoginManager.shared.setup(channelID: "123", universalLinkURL: url)
43+
}
44+
45+
override func tearDown() async throws {
46+
LoginManager.shared.reset()
47+
resetViewController()
48+
}
49+
50+
func testSetupLoginManager() {
51+
XCTAssertNotNil(Session.shared)
52+
XCTAssertNotNil(AccessTokenStore.shared)
53+
XCTAssertNotNil(LoginConfiguration.shared)
54+
55+
XCTAssertTrue(LoginManager.shared.isSetupFinished)
56+
}
57+
58+
func testLoginAction() {
59+
let expect = expectation(description: "\(#file)_\(#line)")
60+
61+
XCTAssertFalse(LoginManager.shared.isAuthorized)
62+
XCTAssertFalse(LoginManager.shared.isAuthorizing)
63+
4164
let delegateStub = SessionDelegateStub(stubs: [
4265
.init(data: PostExchangeTokenRequest.successData, responseCode: 200),
4366
.init(data: GetUserProfileRequest.successData, responseCode: 200)
@@ -46,23 +69,9 @@ class LoginManagerTests: XCTestCase, ViewControllerCompatibleTest {
4669
configuration: LoginConfiguration.shared,
4770
delegate: delegateStub
4871
)
49-
}
50-
51-
private func performLoginTest(
52-
permissions: Set<LoginPermission>,
53-
expectOpenID: Bool,
54-
useNonIsolatedResumeURL: Bool = false,
55-
additionalAssertions: ((LoginResult, LoginProcess) -> Void)? = nil
56-
) {
57-
let expect = expectation(description: "\(#file)_\(#line)")
58-
59-
XCTAssertFalse(LoginManager.shared.isAuthorized)
60-
XCTAssertFalse(LoginManager.shared.isAuthorizing)
61-
62-
setupSessionStub()
6372

6473
var process: LoginProcess!
65-
process = LoginManager.shared.login(permissions: permissions, in: setupViewController()) {
74+
process = LoginManager.shared.login(permissions: [.profile], in: setupViewController()) {
6675
loginResult in
6776
XCTAssertNotNil(loginResult.value)
6877

@@ -73,86 +82,75 @@ class LoginManagerTests: XCTestCase, ViewControllerCompatibleTest {
7382
XCTAssertTrue(LoginManager.shared.isAuthorized)
7483
XCTAssertFalse(LoginManager.shared.isAuthorizing)
7584

76-
if expectOpenID {
77-
XCTAssertNotNil(result.IDTokenNonce)
78-
XCTAssertEqual(result.IDTokenNonce, process!.IDTokenNonce)
79-
} else {
80-
XCTAssertNil(result.IDTokenNonce)
81-
}
85+
// IDTokenNonce should be `nil` when `.openID` not required.
86+
XCTAssertNil(result.IDTokenNonce)
8287

83-
additionalAssertions?(result, process!)
88+
XCTAssertEqual(process.loginRoute, .appUniversalLink)
8489

8590
try! AccessTokenStore.shared.removeCurrentAccessToken()
8691
expect.fulfill()
8792
}!
8893

89-
if !expectOpenID {
90-
process.appUniversalLinkFlow = AppUniversalLinkFlow(parameter: sampleFlowParameters)
91-
}
94+
// Set a sample value for checking `loginRoute` in the result.
95+
process.appUniversalLinkFlow = AppUniversalLinkFlow(parameter: sampleFlowParameters)
9296

9397
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
9498

9599
XCTAssertFalse(LoginManager.shared.isAuthorized)
96100
XCTAssertTrue(LoginManager.shared.isAuthorizing)
97101

102+
// Simulate auth result
98103
let urlString = "\(Constant.thirdPartyAppReturnURL)?code=123&state=\(process.processID)"
99-
let handled: Bool
100-
if useNonIsolatedResumeURL {
101-
handled = process.nonisolatedResumeOpenURL(url: URL(string: urlString)!)
102-
} else {
103-
handled = process.resumeOpenURL(url: URL(string: urlString)!)
104-
}
104+
let handled = process.resumeOpenURL(url: URL(string: urlString)!)
105105
XCTAssertTrue(handled)
106106
}
107107

108108
waitForExpectations(timeout: 2, handler: nil)
109109
}
110-
111-
override func setUp() {
112-
let url = URL(string: "https://example.com/auth")
113-
LoginManager.shared.setup(channelID: "123", universalLinkURL: url)
114-
}
115-
116-
override func tearDown() async throws {
117-
LoginManager.shared.reset()
118-
resetViewController()
119-
}
120-
121-
func testSetupLoginManager() {
122-
XCTAssertNotNil(Session.shared)
123-
XCTAssertNotNil(AccessTokenStore.shared)
124-
XCTAssertNotNil(LoginConfiguration.shared)
125-
126-
XCTAssertTrue(LoginManager.shared.isSetupFinished)
127-
}
128-
129-
func testLoginAction() {
130-
performLoginTest(
131-
permissions: [.profile],
132-
expectOpenID: false
133-
) { result, process in
134-
XCTAssertEqual(process.loginRoute, .appUniversalLink)
135-
}
136-
}
137110

138111
func testLoginActionWithOpenID() {
139-
performLoginTest(
140-
permissions: [.profile, .openID],
141-
expectOpenID: true
112+
let expect = expectation(description: "\(#file)_\(#line)")
113+
114+
XCTAssertFalse(LoginManager.shared.isAuthorized)
115+
XCTAssertFalse(LoginManager.shared.isAuthorizing)
116+
117+
let delegateStub = SessionDelegateStub(stubs: [
118+
.init(data: PostExchangeTokenRequest.successData, responseCode: 200),
119+
.init(data: GetUserProfileRequest.successData, responseCode: 200)
120+
])
121+
Session._shared = Session(
122+
configuration: LoginConfiguration.shared,
123+
delegate: delegateStub
142124
)
143-
}
144125

145-
func testLoginActionWithNonIsolatedResumeOpenURL() {
146-
performLoginTest(
147-
permissions: [.profile],
148-
expectOpenID: false,
149-
useNonIsolatedResumeURL: true
150-
) { result, process in
151-
XCTAssertEqual(process.loginRoute, .appUniversalLink)
152-
}
153-
}
126+
var process: LoginProcess!
127+
process = LoginManager.shared.login(permissions: [.profile, .openID], in: setupViewController()) {
128+
loginResult in
129+
XCTAssertNotNil(loginResult.value)
154130

131+
let result = loginResult.value!
155132

133+
// IDTokenNonce should be `nil` when `.openID` not required.
134+
XCTAssertNotNil(result.IDTokenNonce)
135+
XCTAssertEqual(result.IDTokenNonce, process!.IDTokenNonce)
136+
137+
try! AccessTokenStore.shared.removeCurrentAccessToken()
138+
expect.fulfill()
139+
}!
140+
141+
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
142+
143+
XCTAssertFalse(LoginManager.shared.isAuthorized)
144+
XCTAssertTrue(LoginManager.shared.isAuthorizing)
145+
146+
let urlString = "\(Constant.thirdPartyAppReturnURL)?code=123&state=\(process.processID)"
147+
let handled = process.resumeOpenURL(url: URL(string: urlString)!)
148+
XCTAssertTrue(handled)
149+
}
150+
151+
waitForExpectations(timeout: 2, handler: nil)
152+
}
153+
156154
func testLogout() {
157155
let expect = expectation(description: "\(#file)_\(#line)")
158156

0 commit comments

Comments
 (0)