From 5d5566722d96bcfed6666f9dcf824a14c0a09dc4 Mon Sep 17 00:00:00 2001 From: Daniele Bogo Date: Thu, 14 Mar 2019 15:52:40 +0100 Subject: [PATCH 1/9] Pod install --- Podfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Podfile.lock b/Podfile.lock index 29f42644..1bf4a746 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -68,4 +68,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 34d4f957f37c097c360d2863370ce2e5e06511cc -COCOAPODS: 1.5.3 +COCOAPODS: 1.6.1 From c52f2bc865c81a60da5d8d66cf95d891bc2a3f0d Mon Sep 17 00:00:00 2001 From: Daniele Bogo Date: Thu, 14 Mar 2019 15:52:51 +0100 Subject: [PATCH 2/9] Bump podspec --- WordPressKit.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPressKit.podspec b/WordPressKit.podspec index e43f028b..c2c6df01 100644 --- a/WordPressKit.podspec +++ b/WordPressKit.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "WordPressKit" - s.version = "3.1.0" + s.version = "3.2.0-beta.1" s.summary = "WordPressKit offers a clean and simple WordPress.com and WordPress.org API." s.description = <<-DESC From 30b1da56f1027a8967d470b6a5f8fbbaf4ecd91f Mon Sep 17 00:00:00 2001 From: Daniele Bogo Date: Thu, 14 Mar 2019 15:53:55 +0100 Subject: [PATCH 3/9] Add new extension --- WordPressKit.xcodeproj/project.pbxproj | 16 ++---- .../BlogServiceRemoteREST+Jetpack.swift | 55 +++++++++++++++++++ 2 files changed, 61 insertions(+), 10 deletions(-) create mode 100644 WordPressKit/BlogServiceRemoteREST+Jetpack.swift diff --git a/WordPressKit.xcodeproj/project.pbxproj b/WordPressKit.xcodeproj/project.pbxproj index 77b7a2db..5154cbe1 100644 --- a/WordPressKit.xcodeproj/project.pbxproj +++ b/WordPressKit.xcodeproj/project.pbxproj @@ -426,6 +426,7 @@ 9AB6D64B21872A0D0008F274 /* post-revisions-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 9AB6D648218722BB0008F274 /* post-revisions-success.json */; }; 9AB6D64E218731AB0008F274 /* post-revisions-mapping-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 9AB6D64D218731380008F274 /* post-revisions-mapping-success.json */; }; 9AB6D64F218731AB0008F274 /* post-revisions-failure.json in Resources */ = {isa = PBXBuildFile; fileRef = 9AB6D64C218730130008F274 /* post-revisions-failure.json */; }; + 9AD75C77223943C600AED6F4 /* BlogServiceRemoteREST+Jetpack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AD75C76223943C600AED6F4 /* BlogServiceRemoteREST+Jetpack.swift */; }; 9AEAA774215E774A00876E62 /* site-quick-start-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 9AEAA772215E71C000876E62 /* site-quick-start-success.json */; }; 9AEAA775215E774A00876E62 /* site-quick-start-failure.json in Resources */ = {isa = PBXBuildFile; fileRef = 9AEAA773215E723200876E62 /* site-quick-start-failure.json */; }; 9AF4F2FC218331DC00570E4B /* PostServiceRemoteREST+Revisions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AF4F2FB218331DC00570E4B /* PostServiceRemoteREST+Revisions.swift */; }; @@ -927,6 +928,7 @@ 9AB6D649218727D60008F274 /* PostServiceRemoteRESTRevisionsTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostServiceRemoteRESTRevisionsTest.swift; sourceTree = ""; }; 9AB6D64C218730130008F274 /* post-revisions-failure.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "post-revisions-failure.json"; sourceTree = ""; }; 9AB6D64D218731380008F274 /* post-revisions-mapping-success.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "post-revisions-mapping-success.json"; sourceTree = ""; }; + 9AD75C76223943C600AED6F4 /* BlogServiceRemoteREST+Jetpack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BlogServiceRemoteREST+Jetpack.swift"; sourceTree = ""; }; 9AEAA772215E71C000876E62 /* site-quick-start-success.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "site-quick-start-success.json"; sourceTree = ""; }; 9AEAA773215E723200876E62 /* site-quick-start-failure.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "site-quick-start-failure.json"; sourceTree = ""; }; 9AF4F2FB218331DC00570E4B /* PostServiceRemoteREST+Revisions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PostServiceRemoteREST+Revisions.swift"; sourceTree = ""; }; @@ -1361,6 +1363,7 @@ 74B5F0D31EF8299B00B411E7 /* BlogServiceRemoteREST.h */, 74B5F0D41EF8299B00B411E7 /* BlogServiceRemoteREST.m */, 74B5F0D51EF8299B00B411E7 /* BlogServiceRemoteXMLRPC.h */, + 9AD75C76223943C600AED6F4 /* BlogServiceRemoteREST+Jetpack.swift */, 74B5F0D61EF8299B00B411E7 /* BlogServiceRemoteXMLRPC.m */, 74BA04ED1F06DC0A00ED5CD8 /* CommentServiceRemote.h */, 74BA04EE1F06DC0A00ED5CD8 /* CommentServiceRemoteREST.h */, @@ -2254,16 +2257,12 @@ files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-WordPressKitTests/Pods-WordPressKitTests-frameworks.sh", + "${PODS_ROOT}/Target Support Files/Pods-WordPressKitTests/Pods-WordPressKitTests-frameworks.sh", "${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework", "${BUILT_PRODUCTS_DIR}/FormatterKit/FormatterKit.framework", "${BUILT_PRODUCTS_DIR}/WordPressShared/WordPressShared.framework", "${BUILT_PRODUCTS_DIR}/OCMock/OCMock.framework", "${BUILT_PRODUCTS_DIR}/OHHTTPStubs/OHHTTPStubs.framework", - "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework", - "${BUILT_PRODUCTS_DIR}/NSObject-SafeExpectations/NSObject_SafeExpectations.framework", - "${BUILT_PRODUCTS_DIR}/UIDeviceIdentifier/UIDeviceIdentifier.framework", - "${BUILT_PRODUCTS_DIR}/wpxmlrpc/wpxmlrpc.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( @@ -2272,14 +2271,10 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WordPressShared.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OCMock.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OHHTTPStubs.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/NSObject_SafeExpectations.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/UIDeviceIdentifier.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/wpxmlrpc.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-WordPressKitTests/Pods-WordPressKitTests-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-WordPressKitTests/Pods-WordPressKitTests-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -2299,6 +2294,7 @@ E1A6605F1FD694ED00BAC339 /* PluginDirectoryEntry.swift in Sources */, 7430C9CB1F192F260051B8E6 /* RemoteSourcePostAttribution.m in Sources */, 40819773221E10C900A298E4 /* StatsPublishedPostsTimeIntervalData.swift in Sources */, + 9AD75C77223943C600AED6F4 /* BlogServiceRemoteREST+Jetpack.swift in Sources */, 742362E11F1025B400BD0A7F /* RemoteMenuItem.m in Sources */, 436D56332118D7AA00CEAA33 /* TransactionsServiceRemote.swift in Sources */, 93BD27721EE737A9002BB00B /* ServiceRemoteWordPressXMLRPC.m in Sources */, diff --git a/WordPressKit/BlogServiceRemoteREST+Jetpack.swift b/WordPressKit/BlogServiceRemoteREST+Jetpack.swift new file mode 100644 index 00000000..c95c0abd --- /dev/null +++ b/WordPressKit/BlogServiceRemoteREST+Jetpack.swift @@ -0,0 +1,55 @@ +public enum JetpackInstallError: String, Error { + case invalidCredentials = "INVALID_CREDENTIALS" + case forbidden = "FORBIDDEN" + case installFailure = "INSTALL_FAILURE" + case installResponseError = "INSTALL_RESPONSE_ERROR" + case loginFailure = "LOGIN_FAILURE" + case siteIsJetpack = "SITE_IS_JETPACK" + case activationOnInstallFailure = "ACTIVATION_ON_INSTALL_FAILURE" + case activationResponseError = "ACTIVATION_RESPONSE_ERROR" + case activationFailure = "ACTIVATION_FAILURE" + case unknown + + init?(error code: String?) { + guard let code = code else { + self = .unknown + return + } + + self.init(rawValue: code) + } +} + +public extension BlogServiceRemoteREST { + public func installJetpack(with url: String, + username: String, + password: String, + completion: @escaping (Bool, JetpackInstallError?) -> Void) { + guard let escapedURL = url.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) else { + completion(false, .unknown) + return + } + let path = String(format: "jetpack-install/%@/?locale=en_US", escapedURL) + let requestUrl = self.path(forEndpoint: path, withVersion: ._1_0) + let parameters = ["user": username, + "password": password] + + wordPressComRestApi.POST(requestUrl, + parameters: parameters as [String : AnyObject], + success: { (response: AnyObject, httpResponse: HTTPURLResponse?) in + if let response = response as? [String: Bool], + let success = response[Constants.status] { + completion(success, nil) + } else { + completion(false, .installResponseError) + } + }) { (error: NSError, httpResponse: HTTPURLResponse?) in + let code = JetpackInstallError(error: error.userInfo[WordPressComRestApi.ErrorKeyErrorCode] as? String) + completion(false, code ?? .unknown) + } + } + + private enum Constants { + static let status = "status" + } +} From 499770ffcc7974ac8fe8dd1576e4df9d24ab3f5f Mon Sep 17 00:00:00 2001 From: Daniele Bogo Date: Fri, 15 Mar 2019 17:00:30 +0100 Subject: [PATCH 4/9] Fix method signature --- WordPressKit/BlogServiceRemoteREST+Jetpack.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPressKit/BlogServiceRemoteREST+Jetpack.swift b/WordPressKit/BlogServiceRemoteREST+Jetpack.swift index c95c0abd..a5c9605e 100644 --- a/WordPressKit/BlogServiceRemoteREST+Jetpack.swift +++ b/WordPressKit/BlogServiceRemoteREST+Jetpack.swift @@ -21,7 +21,7 @@ public enum JetpackInstallError: String, Error { } public extension BlogServiceRemoteREST { - public func installJetpack(with url: String, + public func installJetpack(url: String, username: String, password: String, completion: @escaping (Bool, JetpackInstallError?) -> Void) { From df3b328fbbe28759cdb2a30d5890b2a13f265325 Mon Sep 17 00:00:00 2001 From: Daniele Bogo Date: Fri, 15 Mar 2019 17:00:48 +0100 Subject: [PATCH 5/9] Add unit tests --- Podfile.lock | 6 +- WordPressKit.xcodeproj/project.pbxproj | 60 +++++- .../BlogServiceRemoteRESTTests+Jetpack.swift | 185 ++++++++++++++++++ ...tpack-remote-error-activation-failure.json | 4 + ...tpack-remote-error-activation-install.json | 4 + ...pack-remote-error-activation-response.json | 4 + ...ervice-jetpack-remote-error-forbidden.json | 4 + ...-jetpack-remote-error-install-failure.json | 4 + ...jetpack-remote-error-install-response.json | 4 + ...ce-jetpack-remote-error-login-failure.json | 4 + ...-jetpack-remote-error-site-is-jetpack.json | 4 + ...-service-jetpack-remote-error-unknown.json | 4 + .../blog-service-jetpack-remote-failure.json | 4 + .../blog-service-jetpack-remote-success.json | 3 + 14 files changed, 289 insertions(+), 5 deletions(-) create mode 100644 WordPressKitTests/BlogServiceRemoteRESTTests+Jetpack.swift create mode 100644 WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-activation-failure.json create mode 100644 WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-activation-install.json create mode 100644 WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-activation-response.json create mode 100644 WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-forbidden.json create mode 100644 WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-install-failure.json create mode 100644 WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-install-response.json create mode 100644 WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-login-failure.json create mode 100644 WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-site-is-jetpack.json create mode 100644 WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-unknown.json create mode 100644 WordPressKitTests/Mock Data/blog-service-jetpack-remote-failure.json create mode 100644 WordPressKitTests/Mock Data/blog-service-jetpack-remote-success.json diff --git a/Podfile.lock b/Podfile.lock index 1bf4a746..f6fb1255 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -27,7 +27,7 @@ PODS: - OHHTTPStubs/Swift (6.1.0): - OHHTTPStubs/Default - UIDeviceIdentifier (1.1.4) - - WordPressShared (1.7.0): + - WordPressShared (1.7.2): - CocoaLumberjack (~> 3.4) - FormatterKit/TimeIntervalFormatter (= 1.8.2) - wpxmlrpc (0.8.4) @@ -63,9 +63,9 @@ SPEC CHECKSUMS: OCMock: 43565190abc78977ad44a61c0d20d7f0784d35ab OHHTTPStubs: 1e21c7d2c084b8153fc53d48400d8919d2d432d0 UIDeviceIdentifier: 8f8a24b257a4d978c8d40ad1e7355b944ffbfa8c - WordPressShared: cfbda56868419842dd7a106a4e807069a0c17aa9 + WordPressShared: 63d57a4a07ad9f9a1ee5e8a7162e48fbb5192014 wpxmlrpc: 6ba55c773cfa27083ae4a2173e69b19f46da98e2 PODFILE CHECKSUM: 34d4f957f37c097c360d2863370ce2e5e06511cc -COCOAPODS: 1.6.1 +COCOAPODS: 1.5.3 diff --git a/WordPressKit.xcodeproj/project.pbxproj b/WordPressKit.xcodeproj/project.pbxproj index 5154cbe1..cabb35ac 100644 --- a/WordPressKit.xcodeproj/project.pbxproj +++ b/WordPressKit.xcodeproj/project.pbxproj @@ -421,12 +421,24 @@ 93F50A441F227CFB00B5BEBA /* UsersServiceRemoteXMLRPCTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93F50A431F227CFB00B5BEBA /* UsersServiceRemoteXMLRPCTests.swift */; }; 93F50A471F227F3600B5BEBA /* xmlrpc-response-getprofile.xml in Resources */ = {isa = PBXBuildFile; fileRef = 93F50A451F227F3600B5BEBA /* xmlrpc-response-getprofile.xml */; }; 93F50A481F227F3600B5BEBA /* xmlrpc-response-valid-but-unexpected-dictionary.xml in Resources */ = {isa = PBXBuildFile; fileRef = 93F50A461F227F3600B5BEBA /* xmlrpc-response-valid-but-unexpected-dictionary.xml */; }; + 9A88174C223C01E400A3AB20 /* blog-service-jetpack-remote-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 9AD75C7A223BEF7A00AED6F4 /* blog-service-jetpack-remote-success.json */; }; + 9A88174D223C01E400A3AB20 /* blog-service-jetpack-remote-failure.json in Resources */ = {isa = PBXBuildFile; fileRef = 9A881738223BFC8E00A3AB20 /* blog-service-jetpack-remote-failure.json */; }; + 9A88174E223C01E400A3AB20 /* blog-service-jetpack-remote-error-unknown.json in Resources */ = {isa = PBXBuildFile; fileRef = 9A88173A223BFE5100A3AB20 /* blog-service-jetpack-remote-error-unknown.json */; }; + 9A88174F223C01E400A3AB20 /* blog-service-jetpack-remote-error-forbidden.json in Resources */ = {isa = PBXBuildFile; fileRef = 9A88173C223BFF0400A3AB20 /* blog-service-jetpack-remote-error-forbidden.json */; }; + 9A881750223C01E400A3AB20 /* blog-service-jetpack-remote-error-install-failure.json in Resources */ = {isa = PBXBuildFile; fileRef = 9A88173E223C012900A3AB20 /* blog-service-jetpack-remote-error-install-failure.json */; }; + 9A881751223C01E400A3AB20 /* blog-service-jetpack-remote-error-install-response.json in Resources */ = {isa = PBXBuildFile; fileRef = 9A88173F223C014200A3AB20 /* blog-service-jetpack-remote-error-install-response.json */; }; + 9A881752223C01E400A3AB20 /* blog-service-jetpack-remote-error-login-failure.json in Resources */ = {isa = PBXBuildFile; fileRef = 9A881740223C015C00A3AB20 /* blog-service-jetpack-remote-error-login-failure.json */; }; + 9A881753223C01E400A3AB20 /* blog-service-jetpack-remote-error-site-is-jetpack.json in Resources */ = {isa = PBXBuildFile; fileRef = 9A881742223C017100A3AB20 /* blog-service-jetpack-remote-error-site-is-jetpack.json */; }; + 9A881754223C01E400A3AB20 /* blog-service-jetpack-remote-error-activation-install.json in Resources */ = {isa = PBXBuildFile; fileRef = 9A881741223C017100A3AB20 /* blog-service-jetpack-remote-error-activation-install.json */; }; + 9A881755223C01E400A3AB20 /* blog-service-jetpack-remote-error-activation-response.json in Resources */ = {isa = PBXBuildFile; fileRef = 9A881743223C017200A3AB20 /* blog-service-jetpack-remote-error-activation-response.json */; }; + 9A881756223C01E400A3AB20 /* blog-service-jetpack-remote-error-activation-failure.json in Resources */ = {isa = PBXBuildFile; fileRef = 9A881744223C017200A3AB20 /* blog-service-jetpack-remote-error-activation-failure.json */; }; 9AB6D647218705E90008F274 /* RemoteDiff.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AB6D646218705E90008F274 /* RemoteDiff.swift */; }; 9AB6D64A218727D60008F274 /* PostServiceRemoteRESTRevisionsTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AB6D649218727D60008F274 /* PostServiceRemoteRESTRevisionsTest.swift */; }; 9AB6D64B21872A0D0008F274 /* post-revisions-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 9AB6D648218722BB0008F274 /* post-revisions-success.json */; }; 9AB6D64E218731AB0008F274 /* post-revisions-mapping-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 9AB6D64D218731380008F274 /* post-revisions-mapping-success.json */; }; 9AB6D64F218731AB0008F274 /* post-revisions-failure.json in Resources */ = {isa = PBXBuildFile; fileRef = 9AB6D64C218730130008F274 /* post-revisions-failure.json */; }; 9AD75C77223943C600AED6F4 /* BlogServiceRemoteREST+Jetpack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AD75C76223943C600AED6F4 /* BlogServiceRemoteREST+Jetpack.swift */; }; + 9AD75C79223BEC5D00AED6F4 /* BlogServiceRemoteRESTTests+Jetpack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AD75C78223BEC5D00AED6F4 /* BlogServiceRemoteRESTTests+Jetpack.swift */; }; 9AEAA774215E774A00876E62 /* site-quick-start-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 9AEAA772215E71C000876E62 /* site-quick-start-success.json */; }; 9AEAA775215E774A00876E62 /* site-quick-start-failure.json in Resources */ = {isa = PBXBuildFile; fileRef = 9AEAA773215E723200876E62 /* site-quick-start-failure.json */; }; 9AF4F2FC218331DC00570E4B /* PostServiceRemoteREST+Revisions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AF4F2FB218331DC00570E4B /* PostServiceRemoteREST+Revisions.swift */; }; @@ -923,12 +935,24 @@ 93F50A431F227CFB00B5BEBA /* UsersServiceRemoteXMLRPCTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UsersServiceRemoteXMLRPCTests.swift; sourceTree = ""; }; 93F50A451F227F3600B5BEBA /* xmlrpc-response-getprofile.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "xmlrpc-response-getprofile.xml"; sourceTree = ""; }; 93F50A461F227F3600B5BEBA /* xmlrpc-response-valid-but-unexpected-dictionary.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "xmlrpc-response-valid-but-unexpected-dictionary.xml"; sourceTree = ""; }; + 9A881738223BFC8E00A3AB20 /* blog-service-jetpack-remote-failure.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "blog-service-jetpack-remote-failure.json"; sourceTree = ""; }; + 9A88173A223BFE5100A3AB20 /* blog-service-jetpack-remote-error-unknown.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "blog-service-jetpack-remote-error-unknown.json"; sourceTree = ""; }; + 9A88173C223BFF0400A3AB20 /* blog-service-jetpack-remote-error-forbidden.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "blog-service-jetpack-remote-error-forbidden.json"; sourceTree = ""; }; + 9A88173E223C012900A3AB20 /* blog-service-jetpack-remote-error-install-failure.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "blog-service-jetpack-remote-error-install-failure.json"; sourceTree = ""; }; + 9A88173F223C014200A3AB20 /* blog-service-jetpack-remote-error-install-response.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "blog-service-jetpack-remote-error-install-response.json"; sourceTree = ""; }; + 9A881740223C015C00A3AB20 /* blog-service-jetpack-remote-error-login-failure.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "blog-service-jetpack-remote-error-login-failure.json"; sourceTree = ""; }; + 9A881741223C017100A3AB20 /* blog-service-jetpack-remote-error-activation-install.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "blog-service-jetpack-remote-error-activation-install.json"; sourceTree = ""; }; + 9A881742223C017100A3AB20 /* blog-service-jetpack-remote-error-site-is-jetpack.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "blog-service-jetpack-remote-error-site-is-jetpack.json"; sourceTree = ""; }; + 9A881743223C017200A3AB20 /* blog-service-jetpack-remote-error-activation-response.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "blog-service-jetpack-remote-error-activation-response.json"; sourceTree = ""; }; + 9A881744223C017200A3AB20 /* blog-service-jetpack-remote-error-activation-failure.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "blog-service-jetpack-remote-error-activation-failure.json"; sourceTree = ""; }; 9AB6D646218705E90008F274 /* RemoteDiff.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteDiff.swift; sourceTree = ""; }; 9AB6D648218722BB0008F274 /* post-revisions-success.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "post-revisions-success.json"; sourceTree = ""; }; 9AB6D649218727D60008F274 /* PostServiceRemoteRESTRevisionsTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostServiceRemoteRESTRevisionsTest.swift; sourceTree = ""; }; 9AB6D64C218730130008F274 /* post-revisions-failure.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "post-revisions-failure.json"; sourceTree = ""; }; 9AB6D64D218731380008F274 /* post-revisions-mapping-success.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "post-revisions-mapping-success.json"; sourceTree = ""; }; 9AD75C76223943C600AED6F4 /* BlogServiceRemoteREST+Jetpack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BlogServiceRemoteREST+Jetpack.swift"; sourceTree = ""; }; + 9AD75C78223BEC5D00AED6F4 /* BlogServiceRemoteRESTTests+Jetpack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BlogServiceRemoteRESTTests+Jetpack.swift"; sourceTree = ""; }; + 9AD75C7A223BEF7A00AED6F4 /* blog-service-jetpack-remote-success.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "blog-service-jetpack-remote-success.json"; sourceTree = ""; }; 9AEAA772215E71C000876E62 /* site-quick-start-success.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "site-quick-start-success.json"; sourceTree = ""; }; 9AEAA773215E723200876E62 /* site-quick-start-failure.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "site-quick-start-failure.json"; sourceTree = ""; }; 9AF4F2FB218331DC00570E4B /* PostServiceRemoteREST+Revisions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PostServiceRemoteREST+Revisions.swift"; sourceTree = ""; }; @@ -1140,6 +1164,7 @@ isa = PBXGroup; children = ( 74B5F0DD1EF82A9600B411E7 /* BlogServiceRemoteRESTTests.m */, + 9AD75C78223BEC5D00AED6F4 /* BlogServiceRemoteRESTTests+Jetpack.swift */, ); name = Blog; sourceTree = ""; @@ -1597,6 +1622,17 @@ 93BD27461EE73442002BB00B /* auth-send-login-email-success.json */, 40F88F5F1F85723400AE3FAF /* auth-send-verification-email-already-verified-failure.json */, 40F88F611F85799A00AE3FAF /* auth-send-verification-email-success.json */, + 9AD75C7A223BEF7A00AED6F4 /* blog-service-jetpack-remote-success.json */, + 9A881738223BFC8E00A3AB20 /* blog-service-jetpack-remote-failure.json */, + 9A88173A223BFE5100A3AB20 /* blog-service-jetpack-remote-error-unknown.json */, + 9A88173C223BFF0400A3AB20 /* blog-service-jetpack-remote-error-forbidden.json */, + 9A88173E223C012900A3AB20 /* blog-service-jetpack-remote-error-install-failure.json */, + 9A88173F223C014200A3AB20 /* blog-service-jetpack-remote-error-install-response.json */, + 9A881740223C015C00A3AB20 /* blog-service-jetpack-remote-error-login-failure.json */, + 9A881742223C017100A3AB20 /* blog-service-jetpack-remote-error-site-is-jetpack.json */, + 9A881741223C017100A3AB20 /* blog-service-jetpack-remote-error-activation-install.json */, + 9A881743223C017200A3AB20 /* blog-service-jetpack-remote-error-activation-response.json */, + 9A881744223C017200A3AB20 /* blog-service-jetpack-remote-error-activation-failure.json */, 436D564B211CCCB900CEAA33 /* domain-contact-information-response-success.json */, 74585B931F0D53B800E7E667 /* domain-service-all-domain-types.json */, 74585B9E1F0D6E7500E7E667 /* domain-service-bad-json.json */, @@ -2028,6 +2064,7 @@ 74D67F331F15C3740010C5ED /* site-users-delete-auth-failure.json in Resources */, 40819785221F74B200A298E4 /* stats-post-details.json in Resources */, 436D563A2118DE3B00CEAA33 /* supported-countries-success.json in Resources */, + 9A881756223C01E400A3AB20 /* blog-service-jetpack-remote-error-activation-failure.json in Resources */, 740B23E71F17FB4200067A2A /* xmlrpc-metaweblog-newpost-success.xml in Resources */, 74FC6F411F191C1D00112505 /* notifications-last-seen.json in Resources */, 74C473BD1EF329CA009918F2 /* site-export-auth-failure.json in Resources */, @@ -2038,7 +2075,10 @@ E14694031F344F71004052C8 /* site-plugins-error.json in Resources */, 829BA4311FACF187003ADEEA /* activity-rewind-status-success.json in Resources */, 93BD27571EE73442002BB00B /* auth-send-login-email-no-user-failure.json in Resources */, + 9A88174C223C01E400A3AB20 /* blog-service-jetpack-remote-success.json in Resources */, 93AC8ED71ED32FD000900F5A /* stats-v1.1-top-posts-day-large.json in Resources */, + 9A881755223C01E400A3AB20 /* blog-service-jetpack-remote-error-activation-response.json in Resources */, + 9A88174D223C01E400A3AB20 /* blog-service-jetpack-remote-failure.json in Resources */, 93AC8EC71ED32FD000900F5A /* stats-v1.1-clicks-day.json in Resources */, 7403A2FB1EF06FEB00DED7DC /* me-settings-change-invalid-input-failure.json in Resources */, 93AC8EC91ED32FD000900F5A /* stats-v1.1-comments-day.json in Resources */, @@ -2056,6 +2096,7 @@ E6C1E8491EF21FC100D139D9 /* is-passwordless-account-no-account-found.json in Resources */, 93AC8ED91ED32FD000900F5A /* stats-v1.1-video-plays-day-no-data.json in Resources */, 7403A2F81EF06FEB00DED7DC /* me-settings-change-display-name-success.json in Resources */, + 9A881751223C01E400A3AB20 /* blog-service-jetpack-remote-error-install-response.json in Resources */, FFE247B420C891E6002DF3A2 /* WordPressComOAuthSuccess.json in Resources */, 404057D4221C5FC40060250C /* stats-countries-data.json in Resources */, 74D67F1F1F15C3240010C5ED /* people-send-invitation-success.json in Resources */, @@ -2074,6 +2115,7 @@ 7403A2FD1EF06FEB00DED7DC /* me-settings-change-primary-site-success.json in Resources */, 93AC8ED41ED32FD000900F5A /* stats-v1.1-summary.json in Resources */, 74C473B71EF3229B009918F2 /* site-delete-unexpected-json-failure.json in Resources */, + 9A88174E223C01E400A3AB20 /* blog-service-jetpack-remote-error-unknown.json in Resources */, 40819771221DFDB700A298E4 /* stats-posts-data.json in Resources */, 93AC8ECD1ED32FD000900F5A /* stats-v1.1-insights.json in Resources */, 740B23EE1F17FB7E00067A2A /* xmlrpc-malformed-request-xml-error.xml in Resources */, @@ -2099,6 +2141,7 @@ 9AB6D64F218731AB0008F274 /* post-revisions-failure.json in Resources */, 93F50A3C1F226C0100B5BEBA /* WordPressComRestApiFailThrottled.json in Resources */, 740B23ED1F17FB7E00067A2A /* xmlrpc-bad-username-password-error.xml in Resources */, + 9A881754223C01E400A3AB20 /* blog-service-jetpack-remote-error-activation-install.json in Resources */, 93BD275B1EE73442002BB00B /* is-available-username-failure.json in Resources */, FFE247B320C891E6002DF3A2 /* WordPressComOAuthNeeds2FAFail.json in Resources */, E13EE1491F332B8500C15787 /* site-plugins-success.json in Resources */, @@ -2128,6 +2171,7 @@ 74C473BF1EF32B64009918F2 /* site-export-bad-json-failure.json in Resources */, 40819775221E497D00A298E4 /* stats-published-posts.json in Resources */, 74D67F151F15C2D70010C5ED /* site-roles-success.json in Resources */, + 9A881753223C01E400A3AB20 /* blog-service-jetpack-remote-error-site-is-jetpack.json in Resources */, D8DB404221EF22B500B8238E /* site-segments-multiple.json in Resources */, 740B23E11F17FB4200067A2A /* xmlrpc-metaweblog-editpost-bad-xml-failure.xml in Resources */, 404057CB221B80BC0060250C /* stats-top-authors.json in Resources */, @@ -2139,6 +2183,7 @@ 93BD27611EE73442002BB00B /* me-sites-empty-success.json in Resources */, 40E4698D2017D2E30030DB5F /* plugin-directory-new.json in Resources */, 4081977C221F153B00A298E4 /* stats-visits-day.json in Resources */, + 9A881750223C01E400A3AB20 /* blog-service-jetpack-remote-error-install-failure.json in Resources */, 74FC6F431F191C1D00112505 /* notifications-load-all.json in Resources */, 74C473C11EF32C74009918F2 /* site-export-missing-status-failure.json in Resources */, 828A2400201B671F004F6859 /* activity-restore-success.json in Resources */, @@ -2184,6 +2229,7 @@ 74B335E21F06F6730053A184 /* WordPressComRestApiFailRequestInvalidToken.json in Resources */, 74C473BB1EF328D8009918F2 /* site-export-success.json in Resources */, 7403A2FE1EF06FEB00DED7DC /* me-settings-change-web-address-success.json in Resources */, + 9A88174F223C01E400A3AB20 /* blog-service-jetpack-remote-error-forbidden.json in Resources */, 93BD27621EE73442002BB00B /* me-sites-success.json in Resources */, 4081977E221F269A00A298E4 /* stats-visits-month.json in Resources */, 826016FB1F9FAF6300533B6C /* activity-log-auth-failure.json in Resources */, @@ -2204,6 +2250,7 @@ FFE247B520C891E6002DF3A2 /* WordPressComAuthenticateWithIDTokenExistingUserNeedsConnection.json in Resources */, 74D67F381F15C3740010C5ED /* site-viewers-delete-auth-failure.json in Resources */, 826016FA1F9FAF6300533B6C /* activity-log-success-1.json in Resources */, + 9A881752223C01E400A3AB20 /* blog-service-jetpack-remote-error-login-failure.json in Resources */, 93AC8EDB1ED32FD000900F5A /* stats-v1.1-visits-day-bad-date.json in Resources */, 93AC8ECB1ED32FD000900F5A /* stats-v1.1-followers-email-day.json in Resources */, 740B23E41F17FB4200067A2A /* xmlrpc-metaweblog-editpost-success.xml in Resources */, @@ -2257,12 +2304,16 @@ files = ( ); inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-WordPressKitTests/Pods-WordPressKitTests-frameworks.sh", + "${SRCROOT}/Pods/Target Support Files/Pods-WordPressKitTests/Pods-WordPressKitTests-frameworks.sh", "${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework", "${BUILT_PRODUCTS_DIR}/FormatterKit/FormatterKit.framework", "${BUILT_PRODUCTS_DIR}/WordPressShared/WordPressShared.framework", "${BUILT_PRODUCTS_DIR}/OCMock/OCMock.framework", "${BUILT_PRODUCTS_DIR}/OHHTTPStubs/OHHTTPStubs.framework", + "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework", + "${BUILT_PRODUCTS_DIR}/NSObject-SafeExpectations/NSObject_SafeExpectations.framework", + "${BUILT_PRODUCTS_DIR}/UIDeviceIdentifier/UIDeviceIdentifier.framework", + "${BUILT_PRODUCTS_DIR}/wpxmlrpc/wpxmlrpc.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( @@ -2271,10 +2322,14 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WordPressShared.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OCMock.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OHHTTPStubs.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/NSObject_SafeExpectations.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/UIDeviceIdentifier.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/wpxmlrpc.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-WordPressKitTests/Pods-WordPressKitTests-frameworks.sh\"\n"; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-WordPressKitTests/Pods-WordPressKitTests-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -2464,6 +2519,7 @@ 826017001F9FD60A00533B6C /* ActivityServiceRemoteTests.swift in Sources */, 93F50A3A1F226BB600B5BEBA /* WordPressComServiceRemoteRestTests.swift in Sources */, 93AC8EE01ED32FD000900F5A /* StatsStreakTests.m in Sources */, + 9AD75C79223BEC5D00AED6F4 /* BlogServiceRemoteRESTTests+Jetpack.swift in Sources */, E13EE14C1F332C4400C15787 /* PluginServiceRemoteTests.swift in Sources */, 736C971021E80D48007A4200 /* SiteVerticalsPromptResponseDecodingTests.swift in Sources */, 74B335D81F06F1CA0053A184 /* MockWordPressComRestApi.swift in Sources */, diff --git a/WordPressKitTests/BlogServiceRemoteRESTTests+Jetpack.swift b/WordPressKitTests/BlogServiceRemoteRESTTests+Jetpack.swift new file mode 100644 index 00000000..da4bf743 --- /dev/null +++ b/WordPressKitTests/BlogServiceRemoteRESTTests+Jetpack.swift @@ -0,0 +1,185 @@ +import Foundation +import XCTest +@testable import WordPressKit + +class BlogServiceRemoteRESTTests_Jetpack: RemoteTestCase, RESTTestable { + let siteId = 12345 + 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 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" + + var endpoint: String { return "jetpack-install/\(encodedURL)/?locale=en_US" } + + var remote: BlogServiceRemoteREST! + + // MARK: - Overridden Methods + + override func setUp() { + super.setUp() + + remote = BlogServiceRemoteREST(wordPressComRestApi: getRestApi(), siteID: NSNumber(value: siteId)) + } + + override func tearDown() { + super.tearDown() + + remote = nil + } + + func testJetpackRemoteInstallationSuccess() { + let expect = expectation(description: "Install Jetpack success") + + stubRemoteResponse(endpoint, filename: jetpackRemoteSuccessMockFilename, contentType: .ApplicationJSON, status: 200) + remote.installJetpack(url: url, username: username, password: password) { (success, error) in + XCTAssertTrue(success, "Success should be true") + expect.fulfill() + } + + waitForExpectations(timeout: timeout, handler: nil) + } + + func testJetpackRemoteInstallationFailure() { + let expect = expectation(description: "Install Jetpack failure") + + stubRemoteResponse(endpoint, filename: jetpackRemoteFailureMockFilename, contentType: .ApplicationJSON, status: 400) + remote.installJetpack(url: url, username: username, password: password) { (success, error) in + XCTAssertFalse(success, "Success should be false") + XCTAssertEqual(error, .invalidCredentials) + expect.fulfill() + } + + waitForExpectations(timeout: timeout, handler: nil) + } + + func testJetpackRemoteInstallationErrorUnknown() { + let expect = expectation(description: "Install Jetpack failure") + + stubRemoteResponse(endpoint, filename: jetpackRemoteErrorUnknownMockFilename, contentType: .ApplicationJSON, status: 400) + remote.installJetpack(url: url, username: username, password: password) { (success, error) in + XCTAssertFalse(success, "Success should be false") + XCTAssertEqual(error, .unknown) + expect.fulfill() + } + + waitForExpectations(timeout: timeout, handler: nil) + } + + func testJetpackRemoteInstallationErrorForbidden() { + let expect = expectation(description: "Install Jetpack failure") + + stubRemoteResponse(endpoint, filename: jetpackRemoteErrorForbiddenMockFilename, contentType: .ApplicationJSON, status: 400) + remote.installJetpack(url: url, username: username, password: password) { (success, error) in + XCTAssertFalse(success, "Success should be false") + XCTAssertEqual(error, .forbidden) + expect.fulfill() + } + + waitForExpectations(timeout: timeout, handler: nil) + } + + func testJetpackRemoteInstallationInstallFailure() { + let expect = expectation(description: "Install Jetpack failure") + + stubRemoteResponse(endpoint, filename: jetpackRemoteErrorInstallFailureMockFilename, contentType: .ApplicationJSON, status: 400) + remote.installJetpack(url: url, username: username, password: password) { (success, error) in + XCTAssertFalse(success, "Success should be false") + XCTAssertEqual(error, .installFailure) + expect.fulfill() + } + + waitForExpectations(timeout: timeout, handler: nil) + } + + func testJetpackRemoteInstallationInstallResponse() { + let expect = expectation(description: "Install Jetpack failure") + + stubRemoteResponse(endpoint, filename: jetpackRemoteErrorInstallResponseMockFilename, contentType: .ApplicationJSON, status: 400) + remote.installJetpack(url: url, username: username, password: password) { (success, error) in + XCTAssertFalse(success, "Success should be false") + XCTAssertEqual(error, .installResponseError) + expect.fulfill() + } + + waitForExpectations(timeout: timeout, handler: nil) + } + + func testJetpackRemoteInstallationLoginFailure() { + let expect = expectation(description: "Install Jetpack failure") + + stubRemoteResponse(endpoint, filename: jetpackRemoteErrorLoginFailureMockFilename, contentType: .ApplicationJSON, status: 400) + remote.installJetpack(url: url, username: username, password: password) { (success, error) in + XCTAssertFalse(success, "Success should be false") + XCTAssertEqual(error, .loginFailure) + expect.fulfill() + } + + waitForExpectations(timeout: timeout, handler: nil) + } + + func testJetpackRemoteInstallationSiteIsJetpack() { + let expect = expectation(description: "Install Jetpack failure") + + stubRemoteResponse(endpoint, filename: jetpackRemoteErrorSiteIsJetpackMockFilename, contentType: .ApplicationJSON, status: 400) + remote.installJetpack(url: url, username: username, password: password) { (success, error) in + XCTAssertFalse(success, "Success should be false") + XCTAssertEqual(error, .siteIsJetpack) + expect.fulfill() + } + + waitForExpectations(timeout: timeout, handler: nil) + } + + func testJetpackRemoteInstallationActivationInstall() { + let expect = expectation(description: "Install Jetpack failure") + + stubRemoteResponse(endpoint, filename: jetpackRemoteErrorActivationInstallMockFilename, contentType: .ApplicationJSON, status: 400) + remote.installJetpack(url: url, username: username, password: password) { (success, error) in + XCTAssertFalse(success, "Success should be false") + XCTAssertEqual(error, .activationOnInstallFailure) + expect.fulfill() + } + + waitForExpectations(timeout: timeout, handler: nil) + } + + func testJetpackRemoteInstallationActivationResponse() { + let expect = expectation(description: "Install Jetpack failure") + + stubRemoteResponse(endpoint, filename: jetpackRemoteErrorActivationResponseMockFilename, contentType: .ApplicationJSON, status: 400) + remote.installJetpack(url: url, username: username, password: password) { (success, error) in + XCTAssertFalse(success, "Success should be false") + XCTAssertEqual(error, .activationResponseError) + expect.fulfill() + } + + waitForExpectations(timeout: timeout, handler: nil) + } + + func testJetpackRemoteInstallationActivationFailure() { + let expect = expectation(description: "Install Jetpack failure") + + stubRemoteResponse(endpoint, filename: jetpackRemoteErrorActivationFailureMockFilename, contentType: .ApplicationJSON, status: 400) + remote.installJetpack(url: url, username: username, password: password) { (success, error) in + XCTAssertFalse(success, "Success should be false") + XCTAssertEqual(error, .activationFailure) + expect.fulfill() + } + + waitForExpectations(timeout: timeout, handler: nil) + } +} diff --git a/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-activation-failure.json b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-activation-failure.json new file mode 100644 index 00000000..57f9fdb3 --- /dev/null +++ b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-activation-failure.json @@ -0,0 +1,4 @@ +{ + "error": "ACTIVATION_FAILURE", + "message": "message" +} diff --git a/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-activation-install.json b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-activation-install.json new file mode 100644 index 00000000..2ba90359 --- /dev/null +++ b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-activation-install.json @@ -0,0 +1,4 @@ +{ + "error": "ACTIVATION_ON_INSTALL_FAILURE", + "message": "message" +} diff --git a/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-activation-response.json b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-activation-response.json new file mode 100644 index 00000000..edf33c98 --- /dev/null +++ b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-activation-response.json @@ -0,0 +1,4 @@ +{ + "error": "ACTIVATION_RESPONSE_ERROR", + "message": "message" +} diff --git a/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-forbidden.json b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-forbidden.json new file mode 100644 index 00000000..5f6c30b6 --- /dev/null +++ b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-forbidden.json @@ -0,0 +1,4 @@ +{ + "error": "FORBIDDEN", + "message": "message" +} diff --git a/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-install-failure.json b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-install-failure.json new file mode 100644 index 00000000..f8a2756b --- /dev/null +++ b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-install-failure.json @@ -0,0 +1,4 @@ +{ + "error": "INSTALL_FAILURE", + "message": "message" +} diff --git a/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-install-response.json b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-install-response.json new file mode 100644 index 00000000..e3f5e891 --- /dev/null +++ b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-install-response.json @@ -0,0 +1,4 @@ +{ + "error": "INSTALL_RESPONSE_ERROR", + "message": "message" +} diff --git a/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-login-failure.json b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-login-failure.json new file mode 100644 index 00000000..71edc46b --- /dev/null +++ b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-login-failure.json @@ -0,0 +1,4 @@ +{ + "error": "LOGIN_FAILURE", + "message": "message" +} diff --git a/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-site-is-jetpack.json b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-site-is-jetpack.json new file mode 100644 index 00000000..50da1965 --- /dev/null +++ b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-site-is-jetpack.json @@ -0,0 +1,4 @@ +{ + "error": "SITE_IS_JETPACK", + "message": "message" +} diff --git a/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-unknown.json b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-unknown.json new file mode 100644 index 00000000..144eafce --- /dev/null +++ b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-unknown.json @@ -0,0 +1,4 @@ +{ + "error": "UNKNOWN_ERROR", + "message": "message" +} diff --git a/WordPressKitTests/Mock Data/blog-service-jetpack-remote-failure.json b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-failure.json new file mode 100644 index 00000000..d1838b1d --- /dev/null +++ b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-failure.json @@ -0,0 +1,4 @@ +{ + "error": "INVALID_CREDENTIALS", + "message": "bad password" +} diff --git a/WordPressKitTests/Mock Data/blog-service-jetpack-remote-success.json b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-success.json new file mode 100644 index 00000000..a5e547b4 --- /dev/null +++ b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-success.json @@ -0,0 +1,3 @@ +{ + "status": true +} From d9ae027c77512da3a3ce4a4371ddef0e9ca89858 Mon Sep 17 00:00:00 2001 From: Daniele Bogo Date: Mon, 18 Mar 2019 09:31:52 +0100 Subject: [PATCH 6/9] Fix test --- WordPressKit.xcodeproj/project.pbxproj | 4 ++++ .../BlogServiceRemoteRESTTests+Jetpack.swift | 16 ++++++++++++++-- ...jetpack-remote-error-invalid-credentials.json | 4 ++++ .../blog-service-jetpack-remote-failure.json | 3 +-- 4 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-invalid-credentials.json diff --git a/WordPressKit.xcodeproj/project.pbxproj b/WordPressKit.xcodeproj/project.pbxproj index cabb35ac..f5febe68 100644 --- a/WordPressKit.xcodeproj/project.pbxproj +++ b/WordPressKit.xcodeproj/project.pbxproj @@ -437,6 +437,7 @@ 9AB6D64B21872A0D0008F274 /* post-revisions-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 9AB6D648218722BB0008F274 /* post-revisions-success.json */; }; 9AB6D64E218731AB0008F274 /* post-revisions-mapping-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 9AB6D64D218731380008F274 /* post-revisions-mapping-success.json */; }; 9AB6D64F218731AB0008F274 /* post-revisions-failure.json in Resources */ = {isa = PBXBuildFile; fileRef = 9AB6D64C218730130008F274 /* post-revisions-failure.json */; }; + 9ABE13EB223F8DA3006A8806 /* blog-service-jetpack-remote-error-invalid-credentials.json in Resources */ = {isa = PBXBuildFile; fileRef = 9ABE13EA223F8D62006A8806 /* blog-service-jetpack-remote-error-invalid-credentials.json */; }; 9AD75C77223943C600AED6F4 /* BlogServiceRemoteREST+Jetpack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AD75C76223943C600AED6F4 /* BlogServiceRemoteREST+Jetpack.swift */; }; 9AD75C79223BEC5D00AED6F4 /* BlogServiceRemoteRESTTests+Jetpack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AD75C78223BEC5D00AED6F4 /* BlogServiceRemoteRESTTests+Jetpack.swift */; }; 9AEAA774215E774A00876E62 /* site-quick-start-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 9AEAA772215E71C000876E62 /* site-quick-start-success.json */; }; @@ -950,6 +951,7 @@ 9AB6D649218727D60008F274 /* PostServiceRemoteRESTRevisionsTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostServiceRemoteRESTRevisionsTest.swift; sourceTree = ""; }; 9AB6D64C218730130008F274 /* post-revisions-failure.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "post-revisions-failure.json"; sourceTree = ""; }; 9AB6D64D218731380008F274 /* post-revisions-mapping-success.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "post-revisions-mapping-success.json"; sourceTree = ""; }; + 9ABE13EA223F8D62006A8806 /* blog-service-jetpack-remote-error-invalid-credentials.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "blog-service-jetpack-remote-error-invalid-credentials.json"; sourceTree = ""; }; 9AD75C76223943C600AED6F4 /* BlogServiceRemoteREST+Jetpack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BlogServiceRemoteREST+Jetpack.swift"; sourceTree = ""; }; 9AD75C78223BEC5D00AED6F4 /* BlogServiceRemoteRESTTests+Jetpack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BlogServiceRemoteRESTTests+Jetpack.swift"; sourceTree = ""; }; 9AD75C7A223BEF7A00AED6F4 /* blog-service-jetpack-remote-success.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "blog-service-jetpack-remote-success.json"; sourceTree = ""; }; @@ -1624,6 +1626,7 @@ 40F88F611F85799A00AE3FAF /* auth-send-verification-email-success.json */, 9AD75C7A223BEF7A00AED6F4 /* blog-service-jetpack-remote-success.json */, 9A881738223BFC8E00A3AB20 /* blog-service-jetpack-remote-failure.json */, + 9ABE13EA223F8D62006A8806 /* blog-service-jetpack-remote-error-invalid-credentials.json */, 9A88173A223BFE5100A3AB20 /* blog-service-jetpack-remote-error-unknown.json */, 9A88173C223BFF0400A3AB20 /* blog-service-jetpack-remote-error-forbidden.json */, 9A88173E223C012900A3AB20 /* blog-service-jetpack-remote-error-install-failure.json */, @@ -2135,6 +2138,7 @@ 74D67F181F15C2D70010C5ED /* site-users-update-role-unknown-site-failure.json in Resources */, 404057D8221C986A0060250C /* stats-clicks-data.json in Resources */, 436D56532121F60500CEAA33 /* supported-states-empty.json in Resources */, + 9ABE13EB223F8DA3006A8806 /* blog-service-jetpack-remote-error-invalid-credentials.json in Resources */, 93AC8ED31ED32FD000900F5A /* stats-v1.1-streak.json in Resources */, 7403A2F91EF06FEB00DED7DC /* me-settings-change-email-success.json in Resources */, 439A44DC2107CE3C00795ED7 /* site-plans-v3-empty-failure.json in Resources */, diff --git a/WordPressKitTests/BlogServiceRemoteRESTTests+Jetpack.swift b/WordPressKitTests/BlogServiceRemoteRESTTests+Jetpack.swift index da4bf743..bd4da438 100644 --- a/WordPressKitTests/BlogServiceRemoteRESTTests+Jetpack.swift +++ b/WordPressKitTests/BlogServiceRemoteRESTTests+Jetpack.swift @@ -13,8 +13,8 @@ class BlogServiceRemoteRESTTests_Jetpack: RemoteTestCase, RESTTestable { 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" @@ -56,7 +56,19 @@ class BlogServiceRemoteRESTTests_Jetpack: RemoteTestCase, RESTTestable { func testJetpackRemoteInstallationFailure() { let expect = expectation(description: "Install Jetpack failure") - stubRemoteResponse(endpoint, filename: jetpackRemoteFailureMockFilename, contentType: .ApplicationJSON, status: 400) + stubRemoteResponse(endpoint, filename: jetpackRemoteFailureMockFilename, contentType: .ApplicationJSON, status: 200) + remote.installJetpack(url: url, username: username, password: password) { (success, error) in + XCTAssertFalse(success, "Success should be false") + expect.fulfill() + } + + waitForExpectations(timeout: timeout, handler: nil) + } + + func testJetpackRemoteInstallationErrorInvalidCredentials() { + let expect = expectation(description: "Install Jetpack failure") + + stubRemoteResponse(endpoint, filename: jetpackRemoteErrorInvalidCredentialsMockFilename, contentType: .ApplicationJSON, status: 400) remote.installJetpack(url: url, username: username, password: password) { (success, error) in XCTAssertFalse(success, "Success should be false") XCTAssertEqual(error, .invalidCredentials) diff --git a/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-invalid-credentials.json b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-invalid-credentials.json new file mode 100644 index 00000000..d1838b1d --- /dev/null +++ b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-error-invalid-credentials.json @@ -0,0 +1,4 @@ +{ + "error": "INVALID_CREDENTIALS", + "message": "bad password" +} diff --git a/WordPressKitTests/Mock Data/blog-service-jetpack-remote-failure.json b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-failure.json index d1838b1d..ad0b3e49 100644 --- a/WordPressKitTests/Mock Data/blog-service-jetpack-remote-failure.json +++ b/WordPressKitTests/Mock Data/blog-service-jetpack-remote-failure.json @@ -1,4 +1,3 @@ { - "error": "INVALID_CREDENTIALS", - "message": "bad password" + "status": false } From bd18946885bd8127329ad83158a4fb216ccc737f Mon Sep 17 00:00:00 2001 From: Daniele Bogo Date: Mon, 18 Mar 2019 10:22:21 +0100 Subject: [PATCH 7/9] Lint --- WordPressKit/BlogServiceRemoteREST+Jetpack.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPressKit/BlogServiceRemoteREST+Jetpack.swift b/WordPressKit/BlogServiceRemoteREST+Jetpack.swift index a5c9605e..6c645746 100644 --- a/WordPressKit/BlogServiceRemoteREST+Jetpack.swift +++ b/WordPressKit/BlogServiceRemoteREST+Jetpack.swift @@ -48,7 +48,7 @@ public extension BlogServiceRemoteREST { completion(false, code ?? .unknown) } } - + private enum Constants { static let status = "status" } From f0716af80d2803086816a9db4a3f716f6f8a3ede Mon Sep 17 00:00:00 2001 From: Daniele Bogo Date: Tue, 19 Mar 2019 12:32:08 +0100 Subject: [PATCH 8/9] Fix init method removing the guard let statement --- WordPressKit/BlogServiceRemoteREST+Jetpack.swift | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/WordPressKit/BlogServiceRemoteREST+Jetpack.swift b/WordPressKit/BlogServiceRemoteREST+Jetpack.swift index 6c645746..33d6f1d4 100644 --- a/WordPressKit/BlogServiceRemoteREST+Jetpack.swift +++ b/WordPressKit/BlogServiceRemoteREST+Jetpack.swift @@ -10,13 +10,8 @@ public enum JetpackInstallError: String, Error { case activationFailure = "ACTIVATION_FAILURE" case unknown - init?(error code: String?) { - guard let code = code else { - self = .unknown - return - } - - self.init(rawValue: code) + init(error key: String) { + self = JetpackInstallError(rawValue: key) ?? .unknown } } @@ -44,8 +39,11 @@ public extension BlogServiceRemoteREST { completion(false, .installResponseError) } }) { (error: NSError, httpResponse: HTTPURLResponse?) in - let code = JetpackInstallError(error: error.userInfo[WordPressComRestApi.ErrorKeyErrorCode] as? String) - completion(false, code ?? .unknown) + if let key = error.userInfo[WordPressComRestApi.ErrorKeyErrorCode] as? String { + completion(false, JetpackInstallError(error: key)) + } else { + completion(false, .unknown) + } } } From 35c2112d06177c01eb26bc0097d587734a6796e4 Mon Sep 17 00:00:00 2001 From: Daniele Bogo Date: Tue, 19 Mar 2019 12:35:03 +0100 Subject: [PATCH 9/9] Remove locale from the path --- WordPressKit/BlogServiceRemoteREST+Jetpack.swift | 2 +- WordPressKitTests/BlogServiceRemoteRESTTests+Jetpack.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/WordPressKit/BlogServiceRemoteREST+Jetpack.swift b/WordPressKit/BlogServiceRemoteREST+Jetpack.swift index 33d6f1d4..ccc011d4 100644 --- a/WordPressKit/BlogServiceRemoteREST+Jetpack.swift +++ b/WordPressKit/BlogServiceRemoteREST+Jetpack.swift @@ -24,7 +24,7 @@ public extension BlogServiceRemoteREST { completion(false, .unknown) return } - let path = String(format: "jetpack-install/%@/?locale=en_US", escapedURL) + let path = String(format: "jetpack-install/%@/", escapedURL) let requestUrl = self.path(forEndpoint: path, withVersion: ._1_0) let parameters = ["user": username, "password": password] diff --git a/WordPressKitTests/BlogServiceRemoteRESTTests+Jetpack.swift b/WordPressKitTests/BlogServiceRemoteRESTTests+Jetpack.swift index bd4da438..6e54ac9a 100644 --- a/WordPressKitTests/BlogServiceRemoteRESTTests+Jetpack.swift +++ b/WordPressKitTests/BlogServiceRemoteRESTTests+Jetpack.swift @@ -23,7 +23,7 @@ class BlogServiceRemoteRESTTests_Jetpack: RemoteTestCase, RESTTestable { let jetpackRemoteErrorActivationResponseMockFilename = "blog-service-jetpack-remote-error-activation-response.json" let jetpackRemoteErrorActivationFailureMockFilename = "blog-service-jetpack-remote-error-activation-failure.json" - var endpoint: String { return "jetpack-install/\(encodedURL)/?locale=en_US" } + var endpoint: String { return "jetpack-install/\(encodedURL)/" } var remote: BlogServiceRemoteREST!