Skip to content

Commit

Permalink
Merge pull request #145 from wordpress-mobile/fix/10277-move-jetpack-api
Browse files Browse the repository at this point in the history
[Jetpack Remote Install] Refactor of JetpackServiceRemote
  • Loading branch information
danielebogo authored Apr 11, 2019
2 parents 18d0a92 + 7de4c40 commit c491899
Show file tree
Hide file tree
Showing 22 changed files with 211 additions and 134 deletions.
2 changes: 1 addition & 1 deletion WordPressKit.podspec
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = "WordPressKit"
s.version = "3.2.2"
s.version = "4.0.0-beta.1"
s.summary = "WordPressKit offers a clean and simple WordPress.com and WordPress.org API."

s.description = <<-DESC
Expand Down
140 changes: 76 additions & 64 deletions WordPressKit.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

10 changes: 0 additions & 10 deletions WordPressKit/JetpackServiceRemote.h

This file was deleted.

32 changes: 0 additions & 32 deletions WordPressKit/JetpackServiceRemote.m

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import Foundation

public enum JetpackInstallError: String, Error {
case invalidCredentials = "INVALID_CREDENTIALS"
case forbidden = "FORBIDDEN"
Expand All @@ -9,17 +11,40 @@ public enum JetpackInstallError: String, Error {
case activationResponseError = "ACTIVATION_RESPONSE_ERROR"
case activationFailure = "ACTIVATION_FAILURE"
case unknown

init(error key: String) {
self = JetpackInstallError(rawValue: key) ?? .unknown
}
}

public extension BlogServiceRemoteREST {
func installJetpack(url: String,
username: String,
password: String,
completion: @escaping (Bool, JetpackInstallError?) -> Void) {
public class JetpackServiceRemote: ServiceRemoteWordPressComREST {
public enum ResponseError: Error {
case decodingFailed
}

public func checkSiteHasJetpack(_ url: URL,
success: @escaping (Bool) -> Void,
failure: @escaping (Error?) -> Void) {
let path = self.path(forEndpoint: "connect/site-info", withVersion: ._1_0)
let parameters = ["url": url.absoluteString as AnyObject]
wordPressComRestApi.GET(path,
parameters: parameters,
success: { [weak self] (response: AnyObject, httpResponse: HTTPURLResponse?) in
do {
let hasJetpack = try self?.hasJetpackMapping(object: response)
success(hasJetpack ?? false)
} catch {
failure(error)
}
}) { (error: NSError, httpResponse: HTTPURLResponse?) in
failure(error)
}
}

public func installJetpack(url: String,
username: String,
password: String,
completion: @escaping (Bool, JetpackInstallError?) -> Void) {
guard let escapedURL = url.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) else {
completion(false, .unknown)
return
Expand Down Expand Up @@ -48,6 +73,17 @@ public extension BlogServiceRemoteREST {
}

private enum Constants {
static let hasJetpack = "hasJetpack"
static let status = "status"
}
}

private extension JetpackServiceRemote {
func hasJetpackMapping(object: AnyObject) throws -> Bool {
guard let response = object as? [String: AnyObject],
let hasJetpack = response[Constants.hasJetpack] as? NSNumber else {
throw ResponseError.decodingFailed
}
return hasJetpack.boolValue
}
}
1 change: 0 additions & 1 deletion WordPressKit/WordPressKit.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ FOUNDATION_EXPORT const unsigned char WordPressKitVersionString[];
#import "CommentServiceRemote.h"
#import "CommentServiceRemoteREST.h"
#import "CommentServiceRemoteXMLRPC.h"
#import "JetpackServiceRemote.h"
#import "MediaServiceRemote.h"
#import "MediaServiceRemoteREST.h"
#import "MediaServiceRemoteXMLRPC.h"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,45 +2,108 @@ import Foundation
import XCTest
@testable import WordPressKit

class BlogServiceRemoteRESTTests_Jetpack: RemoteTestCase, RESTTestable {
let siteId = 12345
class JetpackServiceRemoteTests: RemoteTestCase, RESTTestable {
let url = "http://www.wordpress.com"
let encodedURL = "http%3A%2F%2Fwww.wordpress.com"
let username = "username"
let password = "qwertyuiop"

let jetpackRemoteSuccessMockFilename = "blog-service-jetpack-remote-success.json"
let jetpackRemoteFailureMockFilename = "blog-service-jetpack-remote-failure.json"

let jetpackRemoteErrorUnknownMockFilename = "blog-service-jetpack-remote-error-unknown.json"
let jetpackRemoteErrorInvalidCredentialsMockFilename = "blog-service-jetpack-remote-error-invalid-credentials.json"
let jetpackRemoteErrorForbiddenMockFilename = "blog-service-jetpack-remote-error-forbidden.json"
let jetpackRemoteErrorInstallFailureMockFilename = "blog-service-jetpack-remote-error-install-failure.json"
let jetpackRemoteErrorInstallResponseMockFilename = "blog-service-jetpack-remote-error-install-response.json"
let jetpackRemoteErrorLoginFailureMockFilename = "blog-service-jetpack-remote-error-login-failure.json"
let jetpackRemoteErrorSiteIsJetpackMockFilename = "blog-service-jetpack-remote-error-site-is-jetpack.json"
let jetpackRemoteErrorActivationInstallMockFilename = "blog-service-jetpack-remote-error-activation-install.json"
let jetpackRemoteErrorActivationResponseMockFilename = "blog-service-jetpack-remote-error-activation-response.json"
let jetpackRemoteErrorActivationFailureMockFilename = "blog-service-jetpack-remote-error-activation-failure.json"
let jetpackRemoteSuccessMockFilename = "jetpack-service-success.json"
let jetpackRemoteFailureMockFilename = "jetpack-service-failure.json"

var endpoint: String { return "jetpack-install/\(encodedURL)/" }
let jetpackRemoteErrorUnknownMockFilename = "jetpack-service-error-unknown.json"
let jetpackRemoteErrorInvalidCredentialsMockFilename = "jetpack-service-error-invalid-credentials.json"
let jetpackRemoteErrorForbiddenMockFilename = "jetpack-service-error-forbidden.json"
let jetpackRemoteErrorInstallFailureMockFilename = "jetpack-service-error-install-failure.json"
let jetpackRemoteErrorInstallResponseMockFilename = "jetpack-service-error-install-response.json"
let jetpackRemoteErrorLoginFailureMockFilename = "jetpack-service-error-login-failure.json"
let jetpackRemoteErrorSiteIsJetpackMockFilename = "jetpack-service-error-site-is-jetpack.json"
let jetpackRemoteErrorActivationInstallMockFilename = "jetpack-service-error-activation-install.json"
let jetpackRemoteErrorActivationResponseMockFilename = "jetpack-service-error-activation-response.json"
let jetpackRemoteErrorActivationFailureMockFilename = "jetpack-service-error-activation-failure.json"

var remote: BlogServiceRemoteREST!
let jetpackRemoteCheckSiteSuccessMockFilename = "jetpack-service-check-site-success.json"
let jetpackRemoteCheckSiteFailureMockFilename = "jetpack-service-check-site-success-no-jetpack.json"
let jetpackRemoteCheckSiteDataFailureMockFilename = "jetpack-service-check-site-failure-data.json"

var endpoint: String { return "jetpack-install/\(encodedURL)/" }
var checkSiteEndpoint: String { return "connect/site-info" }

var remote: JetpackServiceRemote!

// MARK: - Overridden Methods

override func setUp() {
super.setUp()

remote = BlogServiceRemoteREST(wordPressComRestApi: getRestApi(), siteID: NSNumber(value: siteId))
remote = JetpackServiceRemote(wordPressComRestApi: getRestApi())
}

override func tearDown() {
super.tearDown()

remote = nil
}

func testCheckSiteHasJetpackSuccess() {
let expect = expectation(description: "Check if the site has Jetpack success")

stubRemoteResponse(checkSiteEndpoint, filename: jetpackRemoteCheckSiteSuccessMockFilename, contentType: .ApplicationJSON, status: 200)
remote.checkSiteHasJetpack(URL(string: url)!, success: { (success) in
XCTAssertTrue(success, "Success should be true")
expect.fulfill()
}) { (error) in
XCTFail("This callback shouldn't get called")
expect.fulfill()
}

waitForExpectations(timeout: timeout, handler: nil)
}

func testCheckSiteHasJetpackSuccessNoJetpack() {
let expect = expectation(description: "Check if the site has Jetpack failure")

stubRemoteResponse(checkSiteEndpoint, filename: jetpackRemoteCheckSiteFailureMockFilename, contentType: .ApplicationJSON, status: 200)
remote.checkSiteHasJetpack(URL(string: url)!, success: { (success) in
XCTAssertFalse(success, "Success should be false")
expect.fulfill()
}) { (error) in
XCTFail("This callback shouldn't get called")
expect.fulfill()
}
waitForExpectations(timeout: timeout, handler: nil)
}

func testCheckSiteHasJetpackFailureNetwork() {
let expect = expectation(description: "Check if the site has Jetpack network failure")

stubRemoteResponse(checkSiteEndpoint, filename: jetpackRemoteCheckSiteSuccessMockFilename, contentType: .ApplicationJSON, status: 400)
remote.checkSiteHasJetpack(URL(string: url)!, success: { (success) in
XCTFail("This callback shouldn't get called")
expect.fulfill()
}) { (error) in
XCTAssertNotNil(error, "Error shouldn't be nil")
expect.fulfill()
}

waitForExpectations(timeout: timeout, handler: nil)
}

func testCheckSiteHasJetpackFailureData() {
let expect = expectation(description: "Check if the site has Jetpack data failure")

stubRemoteResponse(checkSiteEndpoint, filename: jetpackRemoteCheckSiteDataFailureMockFilename, contentType: .ApplicationJSON, status: 200)
remote.checkSiteHasJetpack(URL(string: url)!, success: { (success) in
XCTFail("This callback shouldn't get called")
expect.fulfill()
}) { (error) in
XCTAssertNotNil(error, "Error shouldn't be nil")
expect.fulfill()
}

waitForExpectations(timeout: timeout, handler: nil)
}

func testJetpackRemoteInstallationSuccess() {
let expect = expectation(description: "Install Jetpack success")

Expand Down Expand Up @@ -100,7 +163,7 @@ class BlogServiceRemoteRESTTests_Jetpack: RemoteTestCase, RESTTestable {
XCTAssertEqual(error, .forbidden)
expect.fulfill()
}

waitForExpectations(timeout: timeout, handler: nil)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"hasJetpack": "1"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"hasJetpack": 0
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"hasJetpack": 1
}

0 comments on commit c491899

Please sign in to comment.