Skip to content
This repository was archived by the owner on Sep 15, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
}