Skip to content

Commit 1d32bbf

Browse files
committed
Move finalizeConnection to SiteRemote
1 parent c008be8 commit 1d32bbf

File tree

5 files changed

+97
-79
lines changed

5 files changed

+97
-79
lines changed

Modules/Sources/Networking/Remote/JetpackConnectionRemote.swift

Lines changed: 7 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public final class JetpackConnectionRemote: Remote {
6767
guard let components = URLComponents(string: authorizationURL),
6868
let blogID = components.queryItems?.first(where: { $0.name == Constants.clientID })?.value as? String,
6969
let numericID = Int64(blogID) else {
70-
throw ConnectionError.invalidAuthorizationURL
70+
throw JetpackConnectionError.invalidAuthorizationURL
7171
}
7272
return numericID
7373
}
@@ -80,43 +80,14 @@ public final class JetpackConnectionRemote: Remote {
8080
let mapper = JetpackConnectionProvisionMapper()
8181
return try await enqueue(request, mapper: mapper)
8282
}
83-
84-
/// Finalizes the connection by sending a request to WPCom.
85-
///
86-
public func finalizeConnection(siteID: Int64, provisionResponse: JetpackConnectionProvisionResponse) async throws {
87-
let parameters: [String: Any] = [
88-
Parameters.secret: provisionResponse.secret,
89-
Parameters.scope: provisionResponse.scope,
90-
Parameters.externalUserID: provisionResponse.userId,
91-
Parameters.redirectURI: siteURL
92-
]
93-
let request = JetpackRequest(wooApiVersion: .mark2,
94-
method: .post,
95-
siteID: siteID,
96-
path: Path.wpcomConnection,
97-
parameters: parameters,
98-
availableAsRESTRequest: false)
99-
let mapper = JetpackConnectionResultMapper()
100-
let result = try await enqueue(request, mapper: mapper)
101-
switch result.code {
102-
case Constants.success:
103-
return
104-
case Constants.alreadyConnected:
105-
throw ConnectionError.alreadyConnected
106-
default:
107-
throw ConnectionError.connectionRequestFailed(message: result.message)
108-
}
109-
}
11083
}
11184

112-
public extension JetpackConnectionRemote {
113-
enum ConnectionError: Error, Equatable {
114-
case malformedURL
115-
case accountConnectionURLNotFound
116-
case invalidAuthorizationURL
117-
case alreadyConnected
118-
case connectionRequestFailed(message: String)
119-
}
85+
public enum JetpackConnectionError: Error, Equatable {
86+
case malformedURL
87+
case accountConnectionURLNotFound
88+
case invalidAuthorizationURL
89+
case alreadyConnected
90+
case connectionRequestFailed(message: String)
12091
}
12192

12293
private extension JetpackConnectionRemote {
@@ -125,7 +96,6 @@ private extension JetpackConnectionRemote {
12596
static let jetpackConnectionData = "/jetpack/v4/connection/data"
12697
static let jetpackConnectionRegister = "/jetpack/v4/connection/register"
12798
static let jetpackConnectionProvision = "/jetpack/v4/remote_provision"
128-
static let wpcomConnection = "jetpack-remote-connect-user"
12999
static let plugins = "/wp/v2/plugins"
130100
static let jetpackModule = "/jetpack/v4/module"
131101
}
@@ -141,14 +111,5 @@ private extension JetpackConnectionRemote {
141111
static let jetpackPluginSlug = "jetpack"
142112
static let activeStatus = "active"
143113
static let clientID = "client_id"
144-
static let success = "success"
145-
static let alreadyConnected = "already_connected"
146-
}
147-
148-
enum Parameters {
149-
static let secret = "secret"
150-
static let externalUserID = "external_user_id"
151-
static let redirectURI = "redirect_uri"
152-
static let scope = "scope"
153114
}
154115
}

Modules/Sources/Networking/Remote/SiteRemote.swift

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,15 @@ public protocol SiteRemoteProtocol {
3737
/// - title: The new title to be set for the site
3838
///
3939
func updateSiteTitle(siteID: Int64, title: String) async throws
40+
41+
/// Finalizes the Jetpack connection by sending a request to WPCom.
42+
/// - Parameters:
43+
/// - siteID: Remote ID of the site
44+
/// - siteURL: URL of the site
45+
/// - provisionResponse: Response from the provision connection call
46+
func finalizeJetpackConnection(siteID: Int64,
47+
siteURL: String,
48+
provisionResponse: JetpackConnectionProvisionResponse) async throws
4049
}
4150

4251
/// Site: Remote Endpoints
@@ -161,6 +170,33 @@ public class SiteRemote: Remote, SiteRemoteProtocol {
161170
availableAsRESTRequest: true)
162171
try await enqueue(request)
163172
}
173+
174+
/// Finalizes the Jetpack connection by sending a request to WPCom.
175+
///
176+
public func finalizeJetpackConnection(siteID: Int64,
177+
siteURL: String,
178+
provisionResponse: JetpackConnectionProvisionResponse) async throws {
179+
let parameters: [String: Any] = [
180+
ParameterKey.secret: provisionResponse.secret,
181+
ParameterKey.scope: provisionResponse.scope,
182+
ParameterKey.externalUserID: provisionResponse.userId,
183+
ParameterKey.redirectURI: siteURL
184+
]
185+
let request = DotcomRequest(wordpressApiVersion: .wpcomMark2,
186+
method: .post,
187+
path: String(format: Path.jetpackConnection, siteID),
188+
parameters: parameters)
189+
let mapper = JetpackConnectionResultMapper()
190+
let result = try await enqueue(request, mapper: mapper)
191+
switch result.code {
192+
case Constants.success:
193+
return
194+
case Constants.alreadyConnected:
195+
throw JetpackConnectionError.alreadyConnected
196+
default:
197+
throw JetpackConnectionError.connectionRequestFailed(message: result.message)
198+
}
199+
}
164200
}
165201

166202
/// Possible Site Creation Flows
@@ -329,8 +365,22 @@ private extension SiteRemote {
329365
static func siteSettings(siteID: Int64) -> String {
330366
"sites/\(siteID)/settings"
331367
}
368+
369+
static let jetpackConnection = "sites/%d/jetpack-remote-connect-user"
332370
}
333371
enum Fields {
334372
static let title = "title"
335373
}
374+
375+
enum Constants {
376+
static let success = "success"
377+
static let alreadyConnected = "already_connected"
378+
}
379+
380+
enum ParameterKey {
381+
static let secret = "secret"
382+
static let externalUserID = "external_user_id"
383+
static let redirectURI = "redirect_uri"
384+
static let scope = "scope"
385+
}
336386
}

Modules/Tests/NetworkingTests/Remote/JetpackConnectionRemoteTests.swift

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ final class JetpackConnectionRemoteTests: XCTestCase {
255255
_ = try await remote.registerSite()
256256
} catch {
257257
// Then
258-
XCTAssertEqual(error as? JetpackConnectionRemote.ConnectionError, .invalidAuthorizationURL)
258+
XCTAssertEqual(error as? JetpackConnectionError, .invalidAuthorizationURL)
259259
}
260260
}
261261

@@ -290,36 +290,4 @@ final class JetpackConnectionRemoteTests: XCTestCase {
290290
}
291291
}
292292

293-
func test_finalizeConnection_successfully_completes() async {
294-
// Given
295-
let remote = JetpackConnectionRemote(siteURL: siteURL, network: network)
296-
let siteID: Int64 = 12345
297-
let provisionResponse = JetpackConnectionProvisionResponse(userId: 123456789, scope: "administrator", secret: "secret_token_12345")
298-
let urlSuffix = "jetpack-remote-connect-user"
299-
network.simulateResponse(requestUrlSuffix: urlSuffix, filename: "jetpack-connection-finalize-success")
300-
301-
// When & Then
302-
do {
303-
try await remote.finalizeConnection(siteID: siteID, provisionResponse: provisionResponse)
304-
} catch {
305-
XCTFail("Unexpected failure: \(error)")
306-
}
307-
}
308-
309-
func test_finalizeConnection_properly_relays_errors() async {
310-
// Given
311-
let remote = JetpackConnectionRemote(siteURL: siteURL, network: network)
312-
let siteID: Int64 = 12345
313-
let provisionResponse = JetpackConnectionProvisionResponse(userId: 123456789, scope: "administrator", secret: "secret_token_12345")
314-
let urlSuffix = "jetpack-remote-connect-user"
315-
network.simulateResponse(requestUrlSuffix: urlSuffix, filename: "jetpack-connection-finalize-error")
316-
317-
do {
318-
// When
319-
_ = try await remote.finalizeConnection(siteID: siteID, provisionResponse: provisionResponse)
320-
} catch {
321-
// Then
322-
XCTAssertEqual(error as? JetpackConnectionRemote.ConnectionError, .alreadyConnected)
323-
}
324-
}
325293
}

Modules/Tests/NetworkingTests/Remote/SiteRemoteTests.swift

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,4 +323,39 @@ final class SiteRemoteTests: XCTestCase {
323323
message: "The Jetpack site is inaccessible or returned an error: parse error (local). not well formed [-32710]"
324324
)})
325325
}
326+
327+
// MARK: - `finalizeJetpackConnection`
328+
329+
func test_finalizeJetpackConnection_successfully_completes() async {
330+
// Given
331+
let siteID: Int64 = 12345
332+
let siteURL = "http://test.com"
333+
let provisionResponse = JetpackConnectionProvisionResponse(userId: 123456789, scope: "administrator", secret: "secret_token_12345")
334+
let urlSuffix = "sites/\(siteID)/jetpack-remote-connect-user"
335+
network.simulateResponse(requestUrlSuffix: urlSuffix, filename: "jetpack-connection-finalize-success")
336+
337+
// When & Then
338+
do {
339+
try await remote.finalizeJetpackConnection(siteID: siteID, siteURL: siteURL, provisionResponse: provisionResponse)
340+
} catch {
341+
XCTFail("Unexpected failure: \(error)")
342+
}
343+
}
344+
345+
func test_finalizeJetpackConnection_properly_relays_errors() async {
346+
// Given
347+
let siteID: Int64 = 12345
348+
let siteURL = "http://test.com"
349+
let provisionResponse = JetpackConnectionProvisionResponse(userId: 123456789, scope: "administrator", secret: "secret_token_12345")
350+
let urlSuffix = "sites/\(siteID)/jetpack-remote-connect-user"
351+
network.simulateResponse(requestUrlSuffix: urlSuffix, filename: "jetpack-connection-finalize-error")
352+
353+
do {
354+
// When
355+
try await remote.finalizeJetpackConnection(siteID: siteID, siteURL: siteURL, provisionResponse: provisionResponse)
356+
} catch {
357+
// Then
358+
XCTAssertEqual(error as? JetpackConnectionError, .alreadyConnected)
359+
}
360+
}
326361
}

Modules/Tests/YosemiteTests/Mocks/Networking/Remote/MockSiteRemote.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ final class MockSiteRemote {
5353
}
5454

5555
extension MockSiteRemote: SiteRemoteProtocol {
56+
func finalizeJetpackConnection(siteID: Int64, siteURL: String, provisionResponse: JetpackConnectionProvisionResponse) async throws {
57+
// no-op
58+
}
59+
5660
func createSite(name: String, flow: SiteCreationFlow) async throws -> SiteCreationResponse {
5761
guard let result = createSiteResult else {
5862
XCTFail("Could not find result for creating a site.")

0 commit comments

Comments
 (0)