Skip to content
This repository was archived by the owner on Sep 15, 2025. It is now read-only.

Commit c491899

Browse files
authored
Merge pull request #145 from wordpress-mobile/fix/10277-move-jetpack-api
[Jetpack Remote Install] Refactor of JetpackServiceRemote
2 parents 18d0a92 + 7de4c40 commit c491899

22 files changed

+211
-134
lines changed

WordPressKit.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = "WordPressKit"
3-
s.version = "3.2.2"
3+
s.version = "4.0.0-beta.1"
44
s.summary = "WordPressKit offers a clean and simple WordPress.com and WordPress.org API."
55

66
s.description = <<-DESC

WordPressKit.xcodeproj/project.pbxproj

Lines changed: 76 additions & 64 deletions
Large diffs are not rendered by default.

WordPressKit/JetpackServiceRemote.h

Lines changed: 0 additions & 10 deletions
This file was deleted.

WordPressKit/JetpackServiceRemote.m

Lines changed: 0 additions & 32 deletions
This file was deleted.

WordPressKit/BlogServiceRemoteREST+Jetpack.swift renamed to WordPressKit/JetpackServiceRemote.swift

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import Foundation
2+
13
public enum JetpackInstallError: String, Error {
24
case invalidCredentials = "INVALID_CREDENTIALS"
35
case forbidden = "FORBIDDEN"
@@ -9,17 +11,40 @@ public enum JetpackInstallError: String, Error {
911
case activationResponseError = "ACTIVATION_RESPONSE_ERROR"
1012
case activationFailure = "ACTIVATION_FAILURE"
1113
case unknown
12-
14+
1315
init(error key: String) {
1416
self = JetpackInstallError(rawValue: key) ?? .unknown
1517
}
1618
}
1719

18-
public extension BlogServiceRemoteREST {
19-
func installJetpack(url: String,
20-
username: String,
21-
password: String,
22-
completion: @escaping (Bool, JetpackInstallError?) -> Void) {
20+
public class JetpackServiceRemote: ServiceRemoteWordPressComREST {
21+
public enum ResponseError: Error {
22+
case decodingFailed
23+
}
24+
25+
public func checkSiteHasJetpack(_ url: URL,
26+
success: @escaping (Bool) -> Void,
27+
failure: @escaping (Error?) -> Void) {
28+
let path = self.path(forEndpoint: "connect/site-info", withVersion: ._1_0)
29+
let parameters = ["url": url.absoluteString as AnyObject]
30+
wordPressComRestApi.GET(path,
31+
parameters: parameters,
32+
success: { [weak self] (response: AnyObject, httpResponse: HTTPURLResponse?) in
33+
do {
34+
let hasJetpack = try self?.hasJetpackMapping(object: response)
35+
success(hasJetpack ?? false)
36+
} catch {
37+
failure(error)
38+
}
39+
}) { (error: NSError, httpResponse: HTTPURLResponse?) in
40+
failure(error)
41+
}
42+
}
43+
44+
public func installJetpack(url: String,
45+
username: String,
46+
password: String,
47+
completion: @escaping (Bool, JetpackInstallError?) -> Void) {
2348
guard let escapedURL = url.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) else {
2449
completion(false, .unknown)
2550
return
@@ -48,6 +73,17 @@ public extension BlogServiceRemoteREST {
4873
}
4974

5075
private enum Constants {
76+
static let hasJetpack = "hasJetpack"
5177
static let status = "status"
5278
}
5379
}
80+
81+
private extension JetpackServiceRemote {
82+
func hasJetpackMapping(object: AnyObject) throws -> Bool {
83+
guard let response = object as? [String: AnyObject],
84+
let hasJetpack = response[Constants.hasJetpack] as? NSNumber else {
85+
throw ResponseError.decodingFailed
86+
}
87+
return hasJetpack.boolValue
88+
}
89+
}

WordPressKit/WordPressKit.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ FOUNDATION_EXPORT const unsigned char WordPressKitVersionString[];
2727
#import "CommentServiceRemote.h"
2828
#import "CommentServiceRemoteREST.h"
2929
#import "CommentServiceRemoteXMLRPC.h"
30-
#import "JetpackServiceRemote.h"
3130
#import "MediaServiceRemote.h"
3231
#import "MediaServiceRemoteREST.h"
3332
#import "MediaServiceRemoteXMLRPC.h"

WordPressKitTests/BlogServiceRemoteRESTTests+Jetpack.swift renamed to WordPressKitTests/JetpackServiceRemoteTests.swift

Lines changed: 83 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,45 +2,108 @@ import Foundation
22
import XCTest
33
@testable import WordPressKit
44

5-
class BlogServiceRemoteRESTTests_Jetpack: RemoteTestCase, RESTTestable {
6-
let siteId = 12345
5+
class JetpackServiceRemoteTests: RemoteTestCase, RESTTestable {
76
let url = "http://www.wordpress.com"
87
let encodedURL = "http%3A%2F%2Fwww.wordpress.com"
98
let username = "username"
109
let password = "qwertyuiop"
1110

12-
let jetpackRemoteSuccessMockFilename = "blog-service-jetpack-remote-success.json"
13-
let jetpackRemoteFailureMockFilename = "blog-service-jetpack-remote-failure.json"
14-
15-
let jetpackRemoteErrorUnknownMockFilename = "blog-service-jetpack-remote-error-unknown.json"
16-
let jetpackRemoteErrorInvalidCredentialsMockFilename = "blog-service-jetpack-remote-error-invalid-credentials.json"
17-
let jetpackRemoteErrorForbiddenMockFilename = "blog-service-jetpack-remote-error-forbidden.json"
18-
let jetpackRemoteErrorInstallFailureMockFilename = "blog-service-jetpack-remote-error-install-failure.json"
19-
let jetpackRemoteErrorInstallResponseMockFilename = "blog-service-jetpack-remote-error-install-response.json"
20-
let jetpackRemoteErrorLoginFailureMockFilename = "blog-service-jetpack-remote-error-login-failure.json"
21-
let jetpackRemoteErrorSiteIsJetpackMockFilename = "blog-service-jetpack-remote-error-site-is-jetpack.json"
22-
let jetpackRemoteErrorActivationInstallMockFilename = "blog-service-jetpack-remote-error-activation-install.json"
23-
let jetpackRemoteErrorActivationResponseMockFilename = "blog-service-jetpack-remote-error-activation-response.json"
24-
let jetpackRemoteErrorActivationFailureMockFilename = "blog-service-jetpack-remote-error-activation-failure.json"
11+
let jetpackRemoteSuccessMockFilename = "jetpack-service-success.json"
12+
let jetpackRemoteFailureMockFilename = "jetpack-service-failure.json"
2513

26-
var endpoint: String { return "jetpack-install/\(encodedURL)/" }
14+
let jetpackRemoteErrorUnknownMockFilename = "jetpack-service-error-unknown.json"
15+
let jetpackRemoteErrorInvalidCredentialsMockFilename = "jetpack-service-error-invalid-credentials.json"
16+
let jetpackRemoteErrorForbiddenMockFilename = "jetpack-service-error-forbidden.json"
17+
let jetpackRemoteErrorInstallFailureMockFilename = "jetpack-service-error-install-failure.json"
18+
let jetpackRemoteErrorInstallResponseMockFilename = "jetpack-service-error-install-response.json"
19+
let jetpackRemoteErrorLoginFailureMockFilename = "jetpack-service-error-login-failure.json"
20+
let jetpackRemoteErrorSiteIsJetpackMockFilename = "jetpack-service-error-site-is-jetpack.json"
21+
let jetpackRemoteErrorActivationInstallMockFilename = "jetpack-service-error-activation-install.json"
22+
let jetpackRemoteErrorActivationResponseMockFilename = "jetpack-service-error-activation-response.json"
23+
let jetpackRemoteErrorActivationFailureMockFilename = "jetpack-service-error-activation-failure.json"
2724

28-
var remote: BlogServiceRemoteREST!
25+
let jetpackRemoteCheckSiteSuccessMockFilename = "jetpack-service-check-site-success.json"
26+
let jetpackRemoteCheckSiteFailureMockFilename = "jetpack-service-check-site-success-no-jetpack.json"
27+
let jetpackRemoteCheckSiteDataFailureMockFilename = "jetpack-service-check-site-failure-data.json"
28+
29+
var endpoint: String { return "jetpack-install/\(encodedURL)/" }
30+
var checkSiteEndpoint: String { return "connect/site-info" }
31+
32+
var remote: JetpackServiceRemote!
2933

3034
// MARK: - Overridden Methods
3135

3236
override func setUp() {
3337
super.setUp()
34-
35-
remote = BlogServiceRemoteREST(wordPressComRestApi: getRestApi(), siteID: NSNumber(value: siteId))
38+
39+
remote = JetpackServiceRemote(wordPressComRestApi: getRestApi())
3640
}
3741

3842
override func tearDown() {
3943
super.tearDown()
4044

4145
remote = nil
4246
}
47+
48+
func testCheckSiteHasJetpackSuccess() {
49+
let expect = expectation(description: "Check if the site has Jetpack success")
50+
51+
stubRemoteResponse(checkSiteEndpoint, filename: jetpackRemoteCheckSiteSuccessMockFilename, contentType: .ApplicationJSON, status: 200)
52+
remote.checkSiteHasJetpack(URL(string: url)!, success: { (success) in
53+
XCTAssertTrue(success, "Success should be true")
54+
expect.fulfill()
55+
}) { (error) in
56+
XCTFail("This callback shouldn't get called")
57+
expect.fulfill()
58+
}
59+
60+
waitForExpectations(timeout: timeout, handler: nil)
61+
}
62+
63+
func testCheckSiteHasJetpackSuccessNoJetpack() {
64+
let expect = expectation(description: "Check if the site has Jetpack failure")
65+
66+
stubRemoteResponse(checkSiteEndpoint, filename: jetpackRemoteCheckSiteFailureMockFilename, contentType: .ApplicationJSON, status: 200)
67+
remote.checkSiteHasJetpack(URL(string: url)!, success: { (success) in
68+
XCTAssertFalse(success, "Success should be false")
69+
expect.fulfill()
70+
}) { (error) in
71+
XCTFail("This callback shouldn't get called")
72+
expect.fulfill()
73+
}
74+
waitForExpectations(timeout: timeout, handler: nil)
75+
}
76+
77+
func testCheckSiteHasJetpackFailureNetwork() {
78+
let expect = expectation(description: "Check if the site has Jetpack network failure")
79+
80+
stubRemoteResponse(checkSiteEndpoint, filename: jetpackRemoteCheckSiteSuccessMockFilename, contentType: .ApplicationJSON, status: 400)
81+
remote.checkSiteHasJetpack(URL(string: url)!, success: { (success) in
82+
XCTFail("This callback shouldn't get called")
83+
expect.fulfill()
84+
}) { (error) in
85+
XCTAssertNotNil(error, "Error shouldn't be nil")
86+
expect.fulfill()
87+
}
88+
89+
waitForExpectations(timeout: timeout, handler: nil)
90+
}
4391

92+
func testCheckSiteHasJetpackFailureData() {
93+
let expect = expectation(description: "Check if the site has Jetpack data failure")
94+
95+
stubRemoteResponse(checkSiteEndpoint, filename: jetpackRemoteCheckSiteDataFailureMockFilename, contentType: .ApplicationJSON, status: 200)
96+
remote.checkSiteHasJetpack(URL(string: url)!, success: { (success) in
97+
XCTFail("This callback shouldn't get called")
98+
expect.fulfill()
99+
}) { (error) in
100+
XCTAssertNotNil(error, "Error shouldn't be nil")
101+
expect.fulfill()
102+
}
103+
104+
waitForExpectations(timeout: timeout, handler: nil)
105+
}
106+
44107
func testJetpackRemoteInstallationSuccess() {
45108
let expect = expectation(description: "Install Jetpack success")
46109

@@ -100,7 +163,7 @@ class BlogServiceRemoteRESTTests_Jetpack: RemoteTestCase, RESTTestable {
100163
XCTAssertEqual(error, .forbidden)
101164
expect.fulfill()
102165
}
103-
166+
104167
waitForExpectations(timeout: timeout, handler: nil)
105168
}
106169

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"hasJetpack": "1"
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"hasJetpack": 0
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"hasJetpack": 1
3+
}

0 commit comments

Comments
 (0)