diff --git a/.gitignore b/.gitignore index 8a141b64..d181e4ec 100644 --- a/.gitignore +++ b/.gitignore @@ -98,4 +98,7 @@ vendor/ iOSInjectionProject/ # SwiftLint Remote Config Cache -.swiftlint/RemoteConfigCache \ No newline at end of file +.swiftlint/RemoteConfigCache + +# SPM +.swiftpm diff --git a/.swiftlint.yml b/.swiftlint.yml index 99cf33ad..6bfb7143 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -3,6 +3,10 @@ swiftlint_version: 0.54.0 parent_config: https://raw.githubusercontent.com/Automattic/swiftlint-config/0f8ab6388bd8d15a04391825ab125f80cfb90704/.swiftlint.yml remote_timeout: 10.0 +excluded: + - .swiftpm + - .build + opt_in_rules: - overridden_super_call - discarded_notification_center_observer diff --git a/Gemfile.lock b/Gemfile.lock index cdbf7638..15f5435e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,9 +1,11 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.6) + CFPropertyList (3.0.7) + base64 + nkf rexml - activesupport (7.1.2) + activesupport (7.1.3.2) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) @@ -39,16 +41,16 @@ GEM aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) base64 (0.2.0) - bigdecimal (3.1.5) + bigdecimal (3.1.6) claide (1.1.0) claide-plugins (0.9.2) cork nap open4 (~> 1.3) - cocoapods (1.14.3) + cocoapods (1.15.2) addressable (~> 2.8) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.14.3) + cocoapods-core (= 1.15.2) cocoapods-deintegrate (>= 1.0.3, < 2.0) cocoapods-downloader (>= 2.1, < 3.0) cocoapods-plugins (>= 1.0.0, < 2.0) @@ -65,7 +67,7 @@ GEM xcodeproj (>= 1.23.0, < 2.0) cocoapods-check (1.1.0) cocoapods (~> 1.0) - cocoapods-core (1.14.3) + cocoapods-core (1.15.2) activesupport (>= 5.0, < 8) addressable (~> 2.8) algoliasearch (~> 1.0) @@ -88,7 +90,7 @@ GEM colored2 (3.1.2) commander (4.6.0) highline (~> 2.0.0) - concurrent-ruby (1.2.2) + concurrent-ruby (1.2.3) connection_pool (2.4.1) cork (0.3.0) colored2 (~> 3.1) @@ -272,7 +274,7 @@ GEM language_server-protocol (3.17.0.3) mini_magick (4.12.0) mini_mime (1.1.5) - minitest (5.20.0) + minitest (5.22.2) molinillo (0.8.0) multi_json (1.15.0) multipart-post (2.3.0) @@ -281,6 +283,7 @@ GEM nap (1.1.0) naturally (2.2.1) netrc (0.11.0) + nkf (0.2.0) no_proxy_fix (0.1.2) octokit (8.1.0) base64 @@ -354,7 +357,7 @@ GEM unicode-display_width (2.5.0) webrick (1.8.1) word_wrap (1.0.0) - xcodeproj (1.23.0) + xcodeproj (1.24.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) diff --git a/Package.resolved b/Package.resolved new file mode 100644 index 00000000..36a0b7c5 --- /dev/null +++ b/Package.resolved @@ -0,0 +1,41 @@ +{ + "pins" : [ + { + "identity" : "alamofire", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Alamofire/Alamofire", + "state" : { + "revision" : "3dc6a42c7727c49bf26508e29b0a0b35f9c7e1ad", + "version" : "5.8.1" + } + }, + { + "identity" : "ohhttpstubs", + "kind" : "remoteSourceControl", + "location" : "https://github.com/AliSoftware/OHHTTPStubs", + "state" : { + "revision" : "12f19662426d0434d6c330c6974d53e2eb10ecd9", + "version" : "9.1.0" + } + }, + { + "identity" : "wordpress-ios-shared", + "kind" : "remoteSourceControl", + "location" : "https://github.com/wordpress-mobile/WordPress-iOS-Shared.git", + "state" : { + "revision" : "f22f2bf5612b2d1f1b41bf27d646df5bd80c5dfa", + "version" : "2.3.0" + } + }, + { + "identity" : "wpxmlrpc", + "kind" : "remoteSourceControl", + "location" : "https://github.com/wordpress-mobile/wpxmlrpc", + "state" : { + "revision" : "bfc413d336bdeaab89e62dc483380baa99b2257e", + "version" : "0.10.0" + } + } + ], + "version" : 2 +} diff --git a/Package.swift b/Package.swift new file mode 100644 index 00000000..570b5c55 --- /dev/null +++ b/Package.swift @@ -0,0 +1,44 @@ +// swift-tools-version: 5.9 + +import PackageDescription + +let package = Package( + name: "WordPressKit", + platforms: [.iOS(.v13)], + products: [ + .library( + name: "CoreAPI", + targets: ["CoreAPI"] + ), + ], + dependencies: [ + .package(url: "https://github.com/wordpress-mobile/WordPress-iOS-Shared.git", from: "2.3.0"), + .package(url: "https://github.com/wordpress-mobile/wpxmlrpc", from: "0.10.0"), + // Test dependencies + .package(url: "https://github.com/AliSoftware/OHHTTPStubs", from: "9.1.0"), + .package(url: "https://github.com/Alamofire/Alamofire", from: "5.8.1"), + ], + targets: [ + .target( + name: "CoreAPI", + dependencies: [ + .product(name: "WordPressShared", package: "WordPress-iOS-Shared"), + "wpxmlrpc", + ], + path: "Sources/CoreAPI" + ), + .testTarget( + name: "CoreAPITests", + dependencies: [ + .target(name: "CoreAPI"), + .product(name: "OHHTTPStubs", package: "OHHTTPStubs"), + .product(name: "OHHTTPStubsSwift", package: "OHHTTPStubs"), + "Alamofire", + ], + path: "Tests/CoreAPITests", + resources: [ + .process("Stubs") // Relative to path + ] + ), + ] +) diff --git a/Podfile.lock b/Podfile.lock index d0ff8f04..83a6a853 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -56,4 +56,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 64af6d71574c7a92d01a9446aa874e066917ebe5 -COCOAPODS: 1.14.3 +COCOAPODS: 1.15.2 diff --git a/WordPressKit/AppTransportSecuritySettings.swift b/Sources/CoreAPI/AppTransportSecuritySettings.swift similarity index 100% rename from WordPressKit/AppTransportSecuritySettings.swift rename to Sources/CoreAPI/AppTransportSecuritySettings.swift diff --git a/WordPressKit/Either.swift b/Sources/CoreAPI/Either.swift similarity index 93% rename from WordPressKit/Either.swift rename to Sources/CoreAPI/Either.swift index 4b895f7a..1dea2bba 100644 --- a/WordPressKit/Either.swift +++ b/Sources/CoreAPI/Either.swift @@ -1,5 +1,3 @@ -import Foundation - enum Either { case left(L) case right(R) diff --git a/WordPressKit/HTTPAuthenticationAlertController.swift b/Sources/CoreAPI/HTTPAuthenticationAlertController.swift similarity index 99% rename from WordPressKit/HTTPAuthenticationAlertController.swift rename to Sources/CoreAPI/HTTPAuthenticationAlertController.swift index 3773ae3b..c588fa05 100644 --- a/WordPressKit/HTTPAuthenticationAlertController.swift +++ b/Sources/CoreAPI/HTTPAuthenticationAlertController.swift @@ -1,4 +1,5 @@ import Foundation +import UIKit /// URLAuthenticationChallenge Handler: It's up to the Host App to actually use this, whenever `WordPressOrgXMLRPCApi.onChallenge` is hit! /// diff --git a/WordPressKit/HTTPClient.swift b/Sources/CoreAPI/HTTPClient.swift similarity index 99% rename from WordPressKit/HTTPClient.swift rename to Sources/CoreAPI/HTTPClient.swift index feaf718a..ed43877a 100644 --- a/WordPressKit/HTTPClient.swift +++ b/Sources/CoreAPI/HTTPClient.swift @@ -42,7 +42,7 @@ extension URLSession { /// - parentProgress: A `Progress` instance that will be used as the parent progress of the HTTP request's overall /// progress. See the function documentation regarding requirements on this argument. /// - errorType: The concret endpoint error type. - func perform( + public func perform( request builder: HTTPRequestBuilder, acceptableStatusCodes: [ClosedRange] = [200...299], taskCreated: ((Int) -> Void)? = nil, diff --git a/WordPressKit/HTTPRequestBuilder.swift b/Sources/CoreAPI/HTTPRequestBuilder.swift similarity index 96% rename from WordPressKit/HTTPRequestBuilder.swift rename to Sources/CoreAPI/HTTPRequestBuilder.swift index 6c701b19..3d99a349 100644 --- a/WordPressKit/HTTPRequestBuilder.swift +++ b/Sources/CoreAPI/HTTPRequestBuilder.swift @@ -5,8 +5,8 @@ import wpxmlrpc /// /// Calling this class's url related functions (the ones that changes path, query, etc) does not modify the /// original URL string. The URL will be perserved in the final result that's returned by the `build` function. -final class HTTPRequestBuilder { - enum Method: String, CaseIterable { +public final class HTTPRequestBuilder { + public enum Method: String, CaseIterable { case get = "GET" case post = "POST" case put = "PUT" @@ -28,7 +28,7 @@ final class HTTPRequestBuilder { private(set) var multipartForm: [MultipartFormField]? private(set) var xmlrpcRequest: XMLRPCRequest? - init(url: URL) { + public init(url: URL) { assert(url.scheme == "http" || url.scheme == "https") assert(url.host != nil) @@ -43,7 +43,7 @@ final class HTTPRequestBuilder { /// Append path to the original URL. /// /// The argument will be appended to the original URL as it is. - func append(percentEncodedPath path: String) -> Self { + public func append(percentEncodedPath path: String) -> Self { assert(!path.contains("?") && !path.contains("#"), "Path should not have query or fragment: \(path)") appendedPath = Self.join(appendedPath, path) @@ -78,11 +78,11 @@ final class HTTPRequestBuilder { return self } - func query(name: String, value: String?, override: Bool = false) -> Self { + public func query(name: String, value: String?, override: Bool = false) -> Self { append(query: [URLQueryItem(name: name, value: value)], override: override) } - func query(_ parameters: [String: Any]) -> Self { + public func query(_ parameters: [String: Any]) -> Self { append(query: parameters.flatten(), override: false) } @@ -141,7 +141,7 @@ final class HTTPRequestBuilder { return self } - func build(encodeBody: Bool = false) throws -> URLRequest { + public func build(encodeBody: Bool = false) throws -> URLRequest { var components = original var newPath = Self.join(components.percentEncodedPath, appendedPath) diff --git a/WordPressKit/MultipartForm.swift b/Sources/CoreAPI/MultipartForm.swift similarity index 100% rename from WordPressKit/MultipartForm.swift rename to Sources/CoreAPI/MultipartForm.swift diff --git a/Sources/CoreAPI/NSDate+RFC3339.swift b/Sources/CoreAPI/NSDate+RFC3339.swift new file mode 100644 index 00000000..38d7ffd4 --- /dev/null +++ b/Sources/CoreAPI/NSDate+RFC3339.swift @@ -0,0 +1,30 @@ +import Foundation + +public extension NSDate { + + @objc + static func rfc3339DateFormatter() -> DateFormatter { + let formatter = DateFormatter() + formatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ssZ" + formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0) as TimeZone + formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") as Locale + return formatter + } + + /// Parses a date string + /// + /// Dates in the format specified in http://www.w3.org/TR/NOTE-datetime should be OK. + /// The kind of dates returned by the REST API should match that format, even if the doc promises ISO 8601. + /// + /// Parsing the full ISO 8601, or even RFC 3339 is more complex than this, and makes no sense right now. + /// @warning this method doesn't support fractional seconds or dates with leap seconds (23:59:60 turns into 23:59:00) + @objc(dateWithWordPressComJSONString:) + static func with(wordPressComJSONString jsonString: String) -> Date? { + self.rfc3339DateFormatter().date(from: jsonString) + } + + @objc + func WordPressComJSONString() -> String? { + NSDate.rfc3339DateFormatter().string(from: self as Date) + } +} diff --git a/WordPressKit/NonceRetrieval.swift b/Sources/CoreAPI/NonceRetrieval.swift similarity index 100% rename from WordPressKit/NonceRetrieval.swift rename to Sources/CoreAPI/NonceRetrieval.swift diff --git a/WordPressKit/Result+Callback.swift b/Sources/CoreAPI/Result+Callback.swift similarity index 94% rename from WordPressKit/Result+Callback.swift rename to Sources/CoreAPI/Result+Callback.swift index 0e3724e1..f34fcae8 100644 --- a/WordPressKit/Result+Callback.swift +++ b/Sources/CoreAPI/Result+Callback.swift @@ -1,4 +1,4 @@ -extension Swift.Result { +public extension Swift.Result { // Notice there are no explicit unit tests for this utility because it is implicitly tested via the consuming code's tests. func execute(onSuccess: (Success) -> Void, onFailure: (Failure) -> Void) { diff --git a/WordPressKit/SocialLogin2FANonceInfo.swift b/Sources/CoreAPI/SocialLogin2FANonceInfo.swift similarity index 100% rename from WordPressKit/SocialLogin2FANonceInfo.swift rename to Sources/CoreAPI/SocialLogin2FANonceInfo.swift diff --git a/Sources/CoreAPI/StringEncoding+IANA.swift b/Sources/CoreAPI/StringEncoding+IANA.swift new file mode 100644 index 00000000..c4d92d7e --- /dev/null +++ b/Sources/CoreAPI/StringEncoding+IANA.swift @@ -0,0 +1,44 @@ +import Foundation + +extension String.Encoding { + /// See: https://www.iana.org/assignments/character-sets/character-sets.xhtml + init?(ianaCharsetName: String) { + let encoding: CFStringEncoding = CFStringConvertIANACharSetNameToEncoding(ianaCharsetName as CFString) + guard encoding != kCFStringEncodingInvalidId, + let builtInEncoding = CFStringBuiltInEncodings(rawValue: encoding) + else { + return nil + } + + switch builtInEncoding { + case .macRoman: + self = .macOSRoman + case .windowsLatin1: + self = .windowsCP1252 + case .isoLatin1: + self = .isoLatin1 + case .nextStepLatin: + self = .nextstep + case .ASCII: + self = .ascii + case .unicode: + self = .unicode + case .UTF8: + self = .utf8 + case .nonLossyASCII: + self = .nonLossyASCII + case .UTF16BE: + self = .utf16BigEndian + case .UTF16LE: + self = .utf16LittleEndian + case .UTF32: + self = .utf32 + case .UTF32BE: + self = .utf32BigEndian + case .UTF32LE: + self = .utf32LittleEndian + @unknown default: + return nil + } + } +} diff --git a/WordPressKit/WebauthChallengeInfo.swift b/Sources/CoreAPI/WebauthChallengeInfo.swift similarity index 100% rename from WordPressKit/WebauthChallengeInfo.swift rename to Sources/CoreAPI/WebauthChallengeInfo.swift diff --git a/WordPressKit/WordPressAPIError+NSErrorBrdige.swift b/Sources/CoreAPI/WordPressAPIError+NSErrorBrdige.swift similarity index 100% rename from WordPressKit/WordPressAPIError+NSErrorBrdige.swift rename to Sources/CoreAPI/WordPressAPIError+NSErrorBrdige.swift diff --git a/WordPressKit/WordPressAPIError.swift b/Sources/CoreAPI/WordPressAPIError.swift similarity index 100% rename from WordPressKit/WordPressAPIError.swift rename to Sources/CoreAPI/WordPressAPIError.swift diff --git a/WordPressKit/WordPressComOAuthClient.swift b/Sources/CoreAPI/WordPressComOAuthClient.swift similarity index 98% rename from WordPressKit/WordPressComOAuthClient.swift rename to Sources/CoreAPI/WordPressComOAuthClient.swift index 38f58ed4..86c3b17d 100644 --- a/WordPressKit/WordPressComOAuthClient.swift +++ b/Sources/CoreAPI/WordPressComOAuthClient.swift @@ -187,7 +187,7 @@ public final class WordPressComOAuthClient: NSObject { .mapSuccess { response in let responseObject = try JSONSerialization.jsonObject(with: response.body) - WPKitLogVerbose("Received OAuth2 response: \(self.cleanedUpResponseForLogging(responseObject as AnyObject? ?? "nil" as AnyObject))") +// WPKitLogVerbose("Received OAuth2 response: \(self.cleanedUpResponseForLogging(responseObject as AnyObject? ?? "nil" as AnyObject))") guard let responseDictionary = responseObject as? [String: AnyObject] else { throw URLError(.cannotParseResponse) @@ -380,7 +380,7 @@ public final class WordPressComOAuthClient: NSObject { .perform(request: builder, errorType: AuthenticationFailure.self) .mapUnacceptableStatusCodeError(AuthenticationFailure.init(response:body:)) .mapSuccess { response in - WPKitLogVerbose("Received Social Login Oauth response.") +// WPKitLogVerbose("Received Social Login Oauth response.") // Make sure we received expected data. let responseObject = try? JSONSerialization.jsonObject(with: response.body) @@ -700,7 +700,7 @@ public final class WordPressComOAuthClient: NSObject { .mapSuccess { response in let responseObject = try JSONSerialization.jsonObject(with: response.body) - WPKitLogVerbose("Received Social Login Oauth response: \(self.cleanedUpResponseForLogging(responseObject as AnyObject? ?? "nil" as AnyObject))") +// WPKitLogVerbose("Received Social Login Oauth response: \(self.cleanedUpResponseForLogging(responseObject as AnyObject? ?? "nil" as AnyObject))") guard let responseDictionary = responseObject as? [String: AnyObject], let responseData = responseDictionary["data"] as? [String: AnyObject], let authToken = responseData["bearer_token"] as? String else { diff --git a/WordPressKit/WordPressComRestApi.swift b/Sources/CoreAPI/WordPressComRestApi.swift similarity index 99% rename from WordPressKit/WordPressComRestApi.swift rename to Sources/CoreAPI/WordPressComRestApi.swift index 2861da6b..740857dc 100644 --- a/WordPressKit/WordPressComRestApi.swift +++ b/Sources/CoreAPI/WordPressComRestApi.swift @@ -32,7 +32,7 @@ public typealias WordPressComRestApiError = WordPressComRestApiErrorCode public struct WordPressComRestApiEndpointError: Error { public var code: WordPressComRestApiErrorCode - var response: HTTPURLResponse? + public internal(set) var response: HTTPURLResponse? public var apiErrorCode: String? public var apiErrorMessage: String? @@ -365,7 +365,7 @@ open class WordPressComRestApi: NSObject { } } - func perform( + public func perform( _ method: HTTPRequestBuilder.Method, URLString: String, parameters: [String: AnyObject]? = nil, @@ -606,7 +606,7 @@ private extension WordPressComRestApi { // MARK: - POST encoding -extension WordPressAPIError { +public extension WordPressAPIError { func asNSError() -> NSError { // When encoutering `URLError`, return `URLError` to avoid potentially breaking existing error handling code in the apps. if case let .connection(urlError) = self { diff --git a/Sources/CoreAPI/WordPressComRestApiErrorDomain.swift b/Sources/CoreAPI/WordPressComRestApiErrorDomain.swift new file mode 100644 index 00000000..e2ec2922 --- /dev/null +++ b/Sources/CoreAPI/WordPressComRestApiErrorDomain.swift @@ -0,0 +1,5 @@ +/// Error domain of `NSError` instances that are converted from `WordPressComRestApiEndpointError` +/// and `WordPressAPIError` instances. +/// +/// See `extension WordPressComRestApiEndpointError: CustomNSError` for context. +let WordPressComRestApiErrorDomain = "WordPressKit.WordPressComRestApiError" diff --git a/WordPressKit/WordPressOrgRestApi.swift b/Sources/CoreAPI/WordPressOrgRestApi.swift similarity index 98% rename from WordPressKit/WordPressOrgRestApi.swift rename to Sources/CoreAPI/WordPressOrgRestApi.swift index 30adcb2d..a5535a5d 100644 --- a/WordPressKit/WordPressOrgRestApi.swift +++ b/Sources/CoreAPI/WordPressOrgRestApi.swift @@ -1,4 +1,5 @@ import Foundation +import WordPressShared public struct WordPressOrgRestApiError: LocalizedError, Decodable, HTTPURLResponseProviding { public enum CodingKeys: String, CodingKey { @@ -39,7 +40,7 @@ public final class WordPressOrgRestApi: NSObject { } } - enum Site { + public enum Site { case dotCom(siteID: UInt64, bearerToken: String, apiURL: URL) case selfHosted(apiURL: URL, credential: SelfHostedSiteCredential) } @@ -61,7 +62,7 @@ public final class WordPressOrgRestApi: NSObject { self.init(site: .selfHosted(apiURL: apiURL, credential: credential), userAgent: userAgent) } - init(site: Site, userAgent: String? = nil) { + public init(site: Site, userAgent: String? = nil) { self.site = site var additionalHeaders = [String: String]() @@ -120,7 +121,7 @@ public final class WordPressOrgRestApi: NSObject { await perform(.post, path: path, parameters: parameters, options: options) } - func perform( + public func perform( _ method: HTTPRequestBuilder.Method, path: String, parameters: [String: Any]? = nil, diff --git a/WordPressKit/WordPressOrgXMLRPCApi.swift b/Sources/CoreAPI/WordPressOrgXMLRPCApi.swift similarity index 100% rename from WordPressKit/WordPressOrgXMLRPCApi.swift rename to Sources/CoreAPI/WordPressOrgXMLRPCApi.swift diff --git a/WordPressKit/WordPressOrgXMLRPCValidator.swift b/Sources/CoreAPI/WordPressOrgXMLRPCValidator.swift similarity index 96% rename from WordPressKit/WordPressOrgXMLRPCValidator.swift rename to Sources/CoreAPI/WordPressOrgXMLRPCValidator.swift index 715ad5f4..68becc44 100644 --- a/WordPressKit/WordPressOrgXMLRPCValidator.swift +++ b/Sources/CoreAPI/WordPressOrgXMLRPCValidator.swift @@ -137,13 +137,13 @@ open class WordPressOrgXMLRPCValidator: NSObject { xmlrpcURL = try urlForXMLRPCFromURLString(nextSite, addXMLRPC: true) originalXMLRPCURL = try urlForXMLRPCFromURLString(nextSite, addXMLRPC: false) } catch let error as NSError { - WPKitLogError(error.localizedDescription) +// WPKitLogError(error.localizedDescription) errorHandler(error) return } validateXMLRPCURL(xmlrpcURL, success: success, failure: { (error) in - WPKitLogError(error.localizedDescription) +// WPKitLogError(error.localizedDescription) if (error.domain == NSURLErrorDomain && error.code == NSURLErrorUserCancelledAuthentication) || (error.domain == NSURLErrorDomain && error.code == NSURLErrorCannotFindHost) || (error.domain == NSURLErrorDomain && error.code == NSURLErrorNetworkConnectionLost) || @@ -152,12 +152,12 @@ open class WordPressOrgXMLRPCValidator: NSObject { return } // Try the original given url as an XML-RPC endpoint - WPKitLogError("Try the original given url as an XML-RPC endpoint: \(originalXMLRPCURL)") +// WPKitLogError("Try the original given url as an XML-RPC endpoint: \(originalXMLRPCURL)") self.validateXMLRPCURL(originalXMLRPCURL, success: success, failure: { (error) in - WPKitLogError(error.localizedDescription) +// WPKitLogError(error.localizedDescription) // Fetch the original url and look for the RSD link self.guessXMLRPCURLFromHTMLURL(originalXMLRPCURL, success: success, failure: { (error) in - WPKitLogError(error.localizedDescription) +// WPKitLogError(error.localizedDescription) errorHandler(error) }) @@ -193,7 +193,7 @@ open class WordPressOrgXMLRPCValidator: NSObject { if baseURL.lastPathComponent != "xmlrpc.php" && addXMLRPC { // Assume the given url is the home page and XML-RPC sits at /xmlrpc.php - WPKitLogInfo("Assume the given url is the home page and XML-RPC sits at /xmlrpc.php") +// WPKitLogInfo("Assume the given url is the home page and XML-RPC sits at /xmlrpc.php") resultURLString = "\(resultURLString)/xmlrpc.php" } @@ -263,7 +263,7 @@ open class WordPressOrgXMLRPCValidator: NSObject { private func guessXMLRPCURLFromHTMLURL(_ htmlURL: URL, success: @escaping (_ xmlrpcURL: URL) -> Void, failure: @escaping (_ error: NSError) -> Void) { - WPKitLogInfo("Fetch the original url and look for the RSD link by using RegExp") +// WPKitLogInfo("Fetch the original url and look for the RSD link by using RegExp") var isWpSite = false let session = URLSession(configuration: URLSessionConfiguration.ephemeral) @@ -338,7 +338,7 @@ open class WordPressOrgXMLRPCValidator: NSObject { private func guessXMLRPCURLFromRSD(_ rsd: String, success: @escaping (_ xmlrpcURL: URL) -> Void, failure: @escaping (_ error: NSError) -> Void) { - WPKitLogInfo("Parse the RSD document at the following URL: \(rsd)") +// WPKitLogInfo("Parse the RSD document at the following URL: \(rsd)") guard let rsdURL = URL(string: rsd) else { failure(WordPressOrgXMLRPCValidatorError.invalid as NSError) return @@ -358,7 +358,7 @@ open class WordPressOrgXMLRPCValidator: NSObject { failure(WordPressOrgXMLRPCValidatorError.invalid as NSError) return } - WPKitLogInfo("Bingo! We found the WordPress XML-RPC element: \(xmlrpcURL)") +// WPKitLogInfo("Bingo! We found the WordPress XML-RPC element: \(xmlrpcURL)") self.validateXMLRPCURL(xmlrpcURL, success: success, failure: failure) }) dataTask.resume() diff --git a/WordPressKit/WordPressRSDParser.swift b/Sources/CoreAPI/WordPressRSDParser.swift similarity index 96% rename from WordPressKit/WordPressRSDParser.swift rename to Sources/CoreAPI/WordPressRSDParser.swift index 29a4cf4f..d3c2daeb 100644 --- a/WordPressKit/WordPressRSDParser.swift +++ b/Sources/CoreAPI/WordPressRSDParser.swift @@ -47,7 +47,7 @@ open class WordPressRSDParser: NSObject, XMLParserDelegate { } open func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) { - WPKitLogInfo("Error parsing RSD: \(parseError)") +// WPKitLogInfo("Error parsing RSD: \(parseError)") } } diff --git a/WordPressKit/AccountServiceRemoteREST+SocialService.swift b/Sources/WordPressKit/Account/AccountServiceRemoteREST+SocialService.swift similarity index 100% rename from WordPressKit/AccountServiceRemoteREST+SocialService.swift rename to Sources/WordPressKit/Account/AccountServiceRemoteREST+SocialService.swift diff --git a/WordPressKit/AccountServiceRemote.h b/Sources/WordPressKit/AccountObjc/AccountServiceRemote.h similarity index 99% rename from WordPressKit/AccountServiceRemote.h rename to Sources/WordPressKit/AccountObjc/AccountServiceRemote.h index b9c02d06..33db5c7f 100644 --- a/WordPressKit/AccountServiceRemote.h +++ b/Sources/WordPressKit/AccountObjc/AccountServiceRemote.h @@ -1,5 +1,5 @@ #import -#import +#import "RemoteUser.h" @class WPAccount; diff --git a/WordPressKit/AccountServiceRemoteREST.h b/Sources/WordPressKit/AccountObjc/AccountServiceRemoteREST.h similarity index 100% rename from WordPressKit/AccountServiceRemoteREST.h rename to Sources/WordPressKit/AccountObjc/AccountServiceRemoteREST.h diff --git a/WordPressKit/AccountServiceRemoteREST.m b/Sources/WordPressKit/AccountObjc/AccountServiceRemoteREST.m similarity index 100% rename from WordPressKit/AccountServiceRemoteREST.m rename to Sources/WordPressKit/AccountObjc/AccountServiceRemoteREST.m diff --git a/WordPressKit/AccountSettings.swift b/Sources/WordPressKit/AccountSettings.swift similarity index 100% rename from WordPressKit/AccountSettings.swift rename to Sources/WordPressKit/AccountSettings.swift diff --git a/WordPressKit/AccountSettingsRemote.swift b/Sources/WordPressKit/AccountSettingsRemote.swift similarity index 99% rename from WordPressKit/AccountSettingsRemote.swift rename to Sources/WordPressKit/AccountSettingsRemote.swift index 384c479a..881bed7b 100644 --- a/WordPressKit/AccountSettingsRemote.swift +++ b/Sources/WordPressKit/AccountSettingsRemote.swift @@ -1,4 +1,6 @@ -import Foundation +#if SWIFT_PACKAGE +import CoreAPI +#endif import WordPressShared public class AccountSettingsRemote: ServiceRemoteWordPressComREST { diff --git a/WordPressKit/Activity.swift b/Sources/WordPressKit/Activity.swift similarity index 100% rename from WordPressKit/Activity.swift rename to Sources/WordPressKit/Activity.swift diff --git a/WordPressKit/ActivityServiceRemote.swift b/Sources/WordPressKit/ActivityServiceRemote.swift similarity index 99% rename from WordPressKit/ActivityServiceRemote.swift rename to Sources/WordPressKit/ActivityServiceRemote.swift index c8c09ecd..22fbe512 100644 --- a/WordPressKit/ActivityServiceRemote.swift +++ b/Sources/WordPressKit/ActivityServiceRemote.swift @@ -1,4 +1,6 @@ -import Foundation +#if SWIFT_PACKAGE +import CoreAPI +#endif import WordPressShared open class ActivityServiceRemote: ServiceRemoteWordPressComREST { diff --git a/WordPressKit/ActivityServiceRemote_ApiVersion1_0.swift b/Sources/WordPressKit/ActivityServiceRemote_ApiVersion1_0.swift similarity index 100% rename from WordPressKit/ActivityServiceRemote_ApiVersion1_0.swift rename to Sources/WordPressKit/ActivityServiceRemote_ApiVersion1_0.swift diff --git a/WordPressKit/AnnouncementServiceRemote.swift b/Sources/WordPressKit/AnnouncementServiceRemote.swift similarity index 100% rename from WordPressKit/AnnouncementServiceRemote.swift rename to Sources/WordPressKit/AnnouncementServiceRemote.swift diff --git a/WordPressKit/AtomicAuthenticationServiceRemote.swift b/Sources/WordPressKit/AtomicAuthenticationServiceRemote.swift similarity index 100% rename from WordPressKit/AtomicAuthenticationServiceRemote.swift rename to Sources/WordPressKit/AtomicAuthenticationServiceRemote.swift diff --git a/WordPressKit/AtomicLogs.swift b/Sources/WordPressKit/AtomicLogs.swift similarity index 100% rename from WordPressKit/AtomicLogs.swift rename to Sources/WordPressKit/AtomicLogs.swift diff --git a/WordPressKit/AtomicSiteServiceRemote.swift b/Sources/WordPressKit/AtomicSiteServiceRemote.swift similarity index 100% rename from WordPressKit/AtomicSiteServiceRemote.swift rename to Sources/WordPressKit/AtomicSiteServiceRemote.swift diff --git a/WordPressKit/AutomatedTransferService.swift b/Sources/WordPressKit/AutomatedTransferService.swift similarity index 100% rename from WordPressKit/AutomatedTransferService.swift rename to Sources/WordPressKit/AutomatedTransferService.swift diff --git a/WordPressKit/AutomatedTransferStatus.swift b/Sources/WordPressKit/AutomatedTransferStatus.swift similarity index 100% rename from WordPressKit/AutomatedTransferStatus.swift rename to Sources/WordPressKit/AutomatedTransferStatus.swift diff --git a/WordPressKit/BlazeCampaign.swift b/Sources/WordPressKit/BlazeCampaign.swift similarity index 100% rename from WordPressKit/BlazeCampaign.swift rename to Sources/WordPressKit/BlazeCampaign.swift diff --git a/WordPressKit/BlazeCampaignsSearchResponse.swift b/Sources/WordPressKit/BlazeCampaignsSearchResponse.swift similarity index 100% rename from WordPressKit/BlazeCampaignsSearchResponse.swift rename to Sources/WordPressKit/BlazeCampaignsSearchResponse.swift diff --git a/WordPressKit/BlazeServiceRemote.swift b/Sources/WordPressKit/BlazeServiceRemote.swift similarity index 96% rename from WordPressKit/BlazeServiceRemote.swift rename to Sources/WordPressKit/BlazeServiceRemote.swift index 5ed721f1..a5b1d3e4 100644 --- a/WordPressKit/BlazeServiceRemote.swift +++ b/Sources/WordPressKit/BlazeServiceRemote.swift @@ -1,4 +1,6 @@ -import Foundation +#if SWIFT_PACKAGE +import CoreAPI +#endif open class BlazeServiceRemote: ServiceRemoteWordPressComREST { diff --git a/WordPressKit/BlockEditorSettingsServiceRemote.swift b/Sources/WordPressKit/BlockEditorSettingsServiceRemote.swift similarity index 97% rename from WordPressKit/BlockEditorSettingsServiceRemote.swift rename to Sources/WordPressKit/BlockEditorSettingsServiceRemote.swift index d8ddd37d..405ac6e0 100644 --- a/WordPressKit/BlockEditorSettingsServiceRemote.swift +++ b/Sources/WordPressKit/BlockEditorSettingsServiceRemote.swift @@ -1,4 +1,6 @@ -import Foundation +#if SWIFT_PACKAGE +import CoreAPI +#endif public class BlockEditorSettingsServiceRemote { let remoteAPI: WordPressOrgRestApi diff --git a/WordPressKit/BlogJetpackSettingsServiceRemote.swift b/Sources/WordPressKit/BlogJetpackSettingsServiceRemote.swift similarity index 100% rename from WordPressKit/BlogJetpackSettingsServiceRemote.swift rename to Sources/WordPressKit/BlogJetpackSettingsServiceRemote.swift diff --git a/WordPressKit/BlogServiceRemote.h b/Sources/WordPressKit/BlogServiceRemote.h similarity index 100% rename from WordPressKit/BlogServiceRemote.h rename to Sources/WordPressKit/BlogServiceRemote.h diff --git a/WordPressKit/BlogServiceRemoteREST.h b/Sources/WordPressKit/BlogServiceRemoteREST.h similarity index 100% rename from WordPressKit/BlogServiceRemoteREST.h rename to Sources/WordPressKit/BlogServiceRemoteREST.h diff --git a/WordPressKit/BlogServiceRemoteREST.m b/Sources/WordPressKit/BlogServiceRemoteREST.m similarity index 100% rename from WordPressKit/BlogServiceRemoteREST.m rename to Sources/WordPressKit/BlogServiceRemoteREST.m diff --git a/WordPressKit/BlogServiceRemoteXMLRPC.h b/Sources/WordPressKit/BlogServiceRemoteXMLRPC.h similarity index 100% rename from WordPressKit/BlogServiceRemoteXMLRPC.h rename to Sources/WordPressKit/BlogServiceRemoteXMLRPC.h diff --git a/WordPressKit/BlogServiceRemoteXMLRPC.m b/Sources/WordPressKit/BlogServiceRemoteXMLRPC.m similarity index 100% rename from WordPressKit/BlogServiceRemoteXMLRPC.m rename to Sources/WordPressKit/BlogServiceRemoteXMLRPC.m diff --git a/WordPressKit/BloggingPromptsServiceRemote.swift b/Sources/WordPressKit/BloggingPromptsServiceRemote.swift similarity index 99% rename from WordPressKit/BloggingPromptsServiceRemote.swift rename to Sources/WordPressKit/BloggingPromptsServiceRemote.swift index 861c66ae..4f718069 100644 --- a/WordPressKit/BloggingPromptsServiceRemote.swift +++ b/Sources/WordPressKit/BloggingPromptsServiceRemote.swift @@ -1,3 +1,7 @@ +#if SWIFT_PACKAGE +import CoreAPI +#endif + /// Encapsulates logic to fetch blogging prompts from the remote endpoint. /// open class BloggingPromptsServiceRemote: ServiceRemoteWordPressComREST { diff --git a/WordPressKit/ChecksumUtil.swift b/Sources/WordPressKit/ChecksumUtil.swift similarity index 100% rename from WordPressKit/ChecksumUtil.swift rename to Sources/WordPressKit/ChecksumUtil.swift diff --git a/WordPressKit/WordPressComServiceRemote.h b/Sources/WordPressKit/ComAPIBasic/WordPressComServiceRemote.h similarity index 100% rename from WordPressKit/WordPressComServiceRemote.h rename to Sources/WordPressKit/ComAPIBasic/WordPressComServiceRemote.h diff --git a/WordPressKit/WordPressComServiceRemote.m b/Sources/WordPressKit/ComAPIBasic/WordPressComServiceRemote.m similarity index 100% rename from WordPressKit/WordPressComServiceRemote.m rename to Sources/WordPressKit/ComAPIBasic/WordPressComServiceRemote.m diff --git a/WordPressKit/CommentServiceRemote.h b/Sources/WordPressKit/CommentServiceRemote.h similarity index 100% rename from WordPressKit/CommentServiceRemote.h rename to Sources/WordPressKit/CommentServiceRemote.h diff --git a/WordPressKit/CommentServiceRemoteREST+ApiV2.swift b/Sources/WordPressKit/CommentServiceRemoteREST+ApiV2.swift similarity index 98% rename from WordPressKit/CommentServiceRemoteREST+ApiV2.swift rename to Sources/WordPressKit/CommentServiceRemoteREST+ApiV2.swift index d6204448..30a1a892 100644 --- a/WordPressKit/CommentServiceRemoteREST+ApiV2.swift +++ b/Sources/WordPressKit/CommentServiceRemoteREST+ApiV2.swift @@ -1,3 +1,7 @@ +#if SWIFT_PACKAGE +import CoreAPI +#endif + public extension CommentServiceRemoteREST { /// Lists the available keys for the request parameter. enum RequestKeys: String { diff --git a/WordPressKit/CommentServiceRemoteREST.h b/Sources/WordPressKit/CommentServiceRemoteREST.h similarity index 100% rename from WordPressKit/CommentServiceRemoteREST.h rename to Sources/WordPressKit/CommentServiceRemoteREST.h diff --git a/WordPressKit/CommentServiceRemoteREST.m b/Sources/WordPressKit/CommentServiceRemoteREST.m similarity index 99% rename from WordPressKit/CommentServiceRemoteREST.m rename to Sources/WordPressKit/CommentServiceRemoteREST.m index 6a34e1ba..4e14c61e 100644 --- a/WordPressKit/CommentServiceRemoteREST.m +++ b/Sources/WordPressKit/CommentServiceRemoteREST.m @@ -2,7 +2,9 @@ #import "WPKit-Swift.h" #import "RemoteComment.h" #import "RemoteUser.h" - +#if SWIFT_PACKAGE +@import CoreAPI; +#endif @import NSObject_SafeExpectations; @import WordPressShared; diff --git a/WordPressKit/CommentServiceRemoteXMLRPC.h b/Sources/WordPressKit/CommentServiceRemoteXMLRPC.h similarity index 100% rename from WordPressKit/CommentServiceRemoteXMLRPC.h rename to Sources/WordPressKit/CommentServiceRemoteXMLRPC.h diff --git a/WordPressKit/CommentServiceRemoteXMLRPC.m b/Sources/WordPressKit/CommentServiceRemoteXMLRPC.m similarity index 100% rename from WordPressKit/CommentServiceRemoteXMLRPC.m rename to Sources/WordPressKit/CommentServiceRemoteXMLRPC.m diff --git a/WordPressKit/Constants.h b/Sources/WordPressKit/Constants.h similarity index 100% rename from WordPressKit/Constants.h rename to Sources/WordPressKit/Constants.h diff --git a/WordPressKit/Constants.m b/Sources/WordPressKit/Constants.m similarity index 83% rename from WordPressKit/Constants.m rename to Sources/WordPressKit/Constants.m index 87c8320f..e032be4c 100644 --- a/WordPressKit/Constants.m +++ b/Sources/WordPressKit/Constants.m @@ -4,4 +4,6 @@ /// and `WordPressAPIError` instances. /// /// See `extension WordPressComRestApiEndpointError: CustomNSError` for context. +// +// FIXME: This is now part of CoreAPI and should be removed, right? NSString *WordPressComRestApiErrorDomain = @"WordPressKit.WordPressComRestApiError"; diff --git a/WordPressKit/DashboardServiceRemote.swift b/Sources/WordPressKit/DashboardServiceRemote.swift similarity index 100% rename from WordPressKit/DashboardServiceRemote.swift rename to Sources/WordPressKit/DashboardServiceRemote.swift diff --git a/WordPressKit/Date+endOfDay.swift b/Sources/WordPressKit/Date+endOfDay.swift similarity index 100% rename from WordPressKit/Date+endOfDay.swift rename to Sources/WordPressKit/Date+endOfDay.swift diff --git a/WordPressKit/Decodable+Dictionary.swift b/Sources/WordPressKit/Decodable+Dictionary.swift similarity index 100% rename from WordPressKit/Decodable+Dictionary.swift rename to Sources/WordPressKit/Decodable+Dictionary.swift diff --git a/WordPressKit/DomainContactInformation.swift b/Sources/WordPressKit/DomainContactInformation.swift similarity index 100% rename from WordPressKit/DomainContactInformation.swift rename to Sources/WordPressKit/DomainContactInformation.swift diff --git a/WordPressKit/Domains/DomainsServiceRemote+AllDomains.swift b/Sources/WordPressKit/Domains/DomainsServiceRemote+AllDomains.swift similarity index 100% rename from WordPressKit/Domains/DomainsServiceRemote+AllDomains.swift rename to Sources/WordPressKit/Domains/DomainsServiceRemote+AllDomains.swift diff --git a/WordPressKit/Domains/DomainsServiceRemote.swift b/Sources/WordPressKit/Domains/DomainsServiceRemote.swift similarity index 100% rename from WordPressKit/Domains/DomainsServiceRemote.swift rename to Sources/WordPressKit/Domains/DomainsServiceRemote.swift diff --git a/WordPressKit/EditorServiceRemote.swift b/Sources/WordPressKit/EditorServiceRemote.swift similarity index 100% rename from WordPressKit/EditorServiceRemote.swift rename to Sources/WordPressKit/EditorServiceRemote.swift diff --git a/WordPressKit/EditorSettings.swift b/Sources/WordPressKit/EditorSettings.swift similarity index 100% rename from WordPressKit/EditorSettings.swift rename to Sources/WordPressKit/EditorSettings.swift diff --git a/WordPressKit/Enum+UnknownCaseRepresentable.swift b/Sources/WordPressKit/Enum+UnknownCaseRepresentable.swift similarity index 100% rename from WordPressKit/Enum+UnknownCaseRepresentable.swift rename to Sources/WordPressKit/Enum+UnknownCaseRepresentable.swift diff --git a/WordPressKit/FeatureFlag.swift b/Sources/WordPressKit/FeatureFlag.swift similarity index 100% rename from WordPressKit/FeatureFlag.swift rename to Sources/WordPressKit/FeatureFlag.swift diff --git a/WordPressKit/FeatureFlagRemote.swift b/Sources/WordPressKit/FeatureFlagRemote.swift similarity index 100% rename from WordPressKit/FeatureFlagRemote.swift rename to Sources/WordPressKit/FeatureFlagRemote.swift diff --git a/WordPressKit/GravatarServiceRemote.swift b/Sources/WordPressKit/GravatarServiceRemote.swift similarity index 100% rename from WordPressKit/GravatarServiceRemote.swift rename to Sources/WordPressKit/GravatarServiceRemote.swift diff --git a/WordPressKit/HTTPProtocolHelpers.swift b/Sources/WordPressKit/HTTPProtocolHelpers.swift similarity index 63% rename from WordPressKit/HTTPProtocolHelpers.swift rename to Sources/WordPressKit/HTTPProtocolHelpers.swift index b21feda1..b446e31d 100644 --- a/WordPressKit/HTTPProtocolHelpers.swift +++ b/Sources/WordPressKit/HTTPProtocolHelpers.swift @@ -1,48 +1,5 @@ import Foundation -extension String.Encoding { - /// See: https://www.iana.org/assignments/character-sets/character-sets.xhtml - init?(ianaCharsetName: String) { - let encoding: CFStringEncoding = CFStringConvertIANACharSetNameToEncoding(ianaCharsetName as CFString) - guard encoding != kCFStringEncodingInvalidId, - let builtInEncoding = CFStringBuiltInEncodings(rawValue: encoding) - else { - return nil - } - - switch builtInEncoding { - case .macRoman: - self = .macOSRoman - case .windowsLatin1: - self = .windowsCP1252 - case .isoLatin1: - self = .isoLatin1 - case .nextStepLatin: - self = .nextstep - case .ASCII: - self = .ascii - case .unicode: - self = .unicode - case .UTF8: - self = .utf8 - case .nonLossyASCII: - self = .nonLossyASCII - case .UTF16BE: - self = .utf16BigEndian - case .UTF16LE: - self = .utf16LittleEndian - case .UTF32: - self = .utf32 - case .UTF32BE: - self = .utf32BigEndian - case .UTF32LE: - self = .utf32LittleEndian - @unknown default: - return nil - } - } -} - extension HTTPURLResponse { /// Return parameter value in a header field. diff --git a/WordPressKit/HomepageSettingsServiceRemote.swift b/Sources/WordPressKit/HomepageSettingsServiceRemote.swift similarity index 100% rename from WordPressKit/HomepageSettingsServiceRemote.swift rename to Sources/WordPressKit/HomepageSettingsServiceRemote.swift diff --git a/WordPressKit/IPLocationRemote.swift b/Sources/WordPressKit/IPLocationRemote.swift similarity index 97% rename from WordPressKit/IPLocationRemote.swift rename to Sources/WordPressKit/IPLocationRemote.swift index ad65ee6e..7a747be5 100644 --- a/WordPressKit/IPLocationRemote.swift +++ b/Sources/WordPressKit/IPLocationRemote.swift @@ -1,3 +1,6 @@ +#if SWIFT_PACKAGE +import CoreAPI +#endif import Foundation /// Remote type to fetch the user's IP Location using the public `geo` API. diff --git a/WordPressKit/Info.plist b/Sources/WordPressKit/Info.plist similarity index 100% rename from WordPressKit/Info.plist rename to Sources/WordPressKit/Info.plist diff --git a/WordPressKit/Insights/StatsAllAnnualInsight.swift b/Sources/WordPressKit/Insights/StatsAllAnnualInsight.swift similarity index 100% rename from WordPressKit/Insights/StatsAllAnnualInsight.swift rename to Sources/WordPressKit/Insights/StatsAllAnnualInsight.swift diff --git a/WordPressKit/Insights/StatsAllTimesInsight.swift b/Sources/WordPressKit/Insights/StatsAllTimesInsight.swift similarity index 100% rename from WordPressKit/Insights/StatsAllTimesInsight.swift rename to Sources/WordPressKit/Insights/StatsAllTimesInsight.swift diff --git a/WordPressKit/Insights/StatsAnnualAndMostPopularTimeInsight.swift b/Sources/WordPressKit/Insights/StatsAnnualAndMostPopularTimeInsight.swift similarity index 100% rename from WordPressKit/Insights/StatsAnnualAndMostPopularTimeInsight.swift rename to Sources/WordPressKit/Insights/StatsAnnualAndMostPopularTimeInsight.swift diff --git a/WordPressKit/Insights/StatsCommentsInsight.swift b/Sources/WordPressKit/Insights/StatsCommentsInsight.swift similarity index 100% rename from WordPressKit/Insights/StatsCommentsInsight.swift rename to Sources/WordPressKit/Insights/StatsCommentsInsight.swift diff --git a/WordPressKit/Insights/StatsDotComFollowersInsight.swift b/Sources/WordPressKit/Insights/StatsDotComFollowersInsight.swift similarity index 100% rename from WordPressKit/Insights/StatsDotComFollowersInsight.swift rename to Sources/WordPressKit/Insights/StatsDotComFollowersInsight.swift diff --git a/WordPressKit/Insights/StatsEmailFollowersInsight.swift b/Sources/WordPressKit/Insights/StatsEmailFollowersInsight.swift similarity index 100% rename from WordPressKit/Insights/StatsEmailFollowersInsight.swift rename to Sources/WordPressKit/Insights/StatsEmailFollowersInsight.swift diff --git a/WordPressKit/Insights/StatsLastPostInsight.swift b/Sources/WordPressKit/Insights/StatsLastPostInsight.swift similarity index 100% rename from WordPressKit/Insights/StatsLastPostInsight.swift rename to Sources/WordPressKit/Insights/StatsLastPostInsight.swift diff --git a/WordPressKit/Insights/StatsPostingStreakInsight.swift b/Sources/WordPressKit/Insights/StatsPostingStreakInsight.swift similarity index 100% rename from WordPressKit/Insights/StatsPostingStreakInsight.swift rename to Sources/WordPressKit/Insights/StatsPostingStreakInsight.swift diff --git a/WordPressKit/Insights/StatsPublicizeInsight.swift b/Sources/WordPressKit/Insights/StatsPublicizeInsight.swift similarity index 100% rename from WordPressKit/Insights/StatsPublicizeInsight.swift rename to Sources/WordPressKit/Insights/StatsPublicizeInsight.swift diff --git a/WordPressKit/Insights/StatsTagsAndCategoriesInsight.swift b/Sources/WordPressKit/Insights/StatsTagsAndCategoriesInsight.swift similarity index 100% rename from WordPressKit/Insights/StatsTagsAndCategoriesInsight.swift rename to Sources/WordPressKit/Insights/StatsTagsAndCategoriesInsight.swift diff --git a/WordPressKit/Insights/StatsTodayInsight.swift b/Sources/WordPressKit/Insights/StatsTodayInsight.swift similarity index 100% rename from WordPressKit/Insights/StatsTodayInsight.swift rename to Sources/WordPressKit/Insights/StatsTodayInsight.swift diff --git a/WordPressKit/JSONDecoderExtension.swift b/Sources/WordPressKit/JSONDecoderExtension.swift similarity index 100% rename from WordPressKit/JSONDecoderExtension.swift rename to Sources/WordPressKit/JSONDecoderExtension.swift diff --git a/WordPressKit/Jetpack Scan/JetpackCredentials.swift b/Sources/WordPressKit/Jetpack Scan/JetpackCredentials.swift similarity index 100% rename from WordPressKit/Jetpack Scan/JetpackCredentials.swift rename to Sources/WordPressKit/Jetpack Scan/JetpackCredentials.swift diff --git a/WordPressKit/Jetpack Scan/JetpackScan.swift b/Sources/WordPressKit/Jetpack Scan/JetpackScan.swift similarity index 100% rename from WordPressKit/Jetpack Scan/JetpackScan.swift rename to Sources/WordPressKit/Jetpack Scan/JetpackScan.swift diff --git a/WordPressKit/Jetpack Scan/JetpackScanHistory.swift b/Sources/WordPressKit/Jetpack Scan/JetpackScanHistory.swift similarity index 100% rename from WordPressKit/Jetpack Scan/JetpackScanHistory.swift rename to Sources/WordPressKit/Jetpack Scan/JetpackScanHistory.swift diff --git a/WordPressKit/Jetpack Scan/JetpackScanThreat.swift b/Sources/WordPressKit/Jetpack Scan/JetpackScanThreat.swift similarity index 100% rename from WordPressKit/Jetpack Scan/JetpackScanThreat.swift rename to Sources/WordPressKit/Jetpack Scan/JetpackScanThreat.swift diff --git a/WordPressKit/Jetpack Scan/JetpackThreatFixStatus.swift b/Sources/WordPressKit/Jetpack Scan/JetpackThreatFixStatus.swift similarity index 100% rename from WordPressKit/Jetpack Scan/JetpackThreatFixStatus.swift rename to Sources/WordPressKit/Jetpack Scan/JetpackThreatFixStatus.swift diff --git a/WordPressKit/JetpackBackup.swift b/Sources/WordPressKit/JetpackBackup.swift similarity index 100% rename from WordPressKit/JetpackBackup.swift rename to Sources/WordPressKit/JetpackBackup.swift diff --git a/WordPressKit/JetpackBackupServiceRemote.swift b/Sources/WordPressKit/JetpackBackupServiceRemote.swift similarity index 100% rename from WordPressKit/JetpackBackupServiceRemote.swift rename to Sources/WordPressKit/JetpackBackupServiceRemote.swift diff --git a/WordPressKit/JetpackCapabilitiesServiceRemote.swift b/Sources/WordPressKit/JetpackCapabilitiesServiceRemote.swift similarity index 100% rename from WordPressKit/JetpackCapabilitiesServiceRemote.swift rename to Sources/WordPressKit/JetpackCapabilitiesServiceRemote.swift diff --git a/WordPressKit/JetpackProxyServiceRemote.swift b/Sources/WordPressKit/JetpackProxyServiceRemote.swift similarity index 100% rename from WordPressKit/JetpackProxyServiceRemote.swift rename to Sources/WordPressKit/JetpackProxyServiceRemote.swift diff --git a/WordPressKit/JetpackRestoreTypes.swift b/Sources/WordPressKit/JetpackRestoreTypes.swift similarity index 100% rename from WordPressKit/JetpackRestoreTypes.swift rename to Sources/WordPressKit/JetpackRestoreTypes.swift diff --git a/WordPressKit/JetpackScanServiceRemote.swift b/Sources/WordPressKit/JetpackScanServiceRemote.swift similarity index 100% rename from WordPressKit/JetpackScanServiceRemote.swift rename to Sources/WordPressKit/JetpackScanServiceRemote.swift diff --git a/WordPressKit/JetpackServiceRemote.swift b/Sources/WordPressKit/JetpackServiceRemote.swift similarity index 100% rename from WordPressKit/JetpackServiceRemote.swift rename to Sources/WordPressKit/JetpackServiceRemote.swift diff --git a/WordPressKit/JetpackSocialServiceRemote.swift b/Sources/WordPressKit/JetpackSocialServiceRemote.swift similarity index 97% rename from WordPressKit/JetpackSocialServiceRemote.swift rename to Sources/WordPressKit/JetpackSocialServiceRemote.swift index aa3fb53b..01cbc4ed 100644 --- a/WordPressKit/JetpackSocialServiceRemote.swift +++ b/Sources/WordPressKit/JetpackSocialServiceRemote.swift @@ -1,3 +1,7 @@ +#if SWIFT_PACKAGE +import CoreAPI +#endif + /// Encapsulates remote service logic related to Jetpack Social. public class JetpackSocialServiceRemote: ServiceRemoteWordPressComREST { diff --git a/WordPressKit/KeyringConnection.swift b/Sources/WordPressKit/KeyringConnection.swift similarity index 100% rename from WordPressKit/KeyringConnection.swift rename to Sources/WordPressKit/KeyringConnection.swift diff --git a/WordPressKit/KeyringConnectionExternalUser.swift b/Sources/WordPressKit/KeyringConnectionExternalUser.swift similarity index 100% rename from WordPressKit/KeyringConnectionExternalUser.swift rename to Sources/WordPressKit/KeyringConnectionExternalUser.swift diff --git a/WordPressKit/MediaServiceRemote.h b/Sources/WordPressKit/MediaServiceRemote.h similarity index 100% rename from WordPressKit/MediaServiceRemote.h rename to Sources/WordPressKit/MediaServiceRemote.h diff --git a/WordPressKit/MediaServiceRemoteREST.h b/Sources/WordPressKit/MediaServiceRemoteREST.h similarity index 100% rename from WordPressKit/MediaServiceRemoteREST.h rename to Sources/WordPressKit/MediaServiceRemoteREST.h diff --git a/WordPressKit/MediaServiceRemoteREST.m b/Sources/WordPressKit/MediaServiceRemoteREST.m similarity index 99% rename from WordPressKit/MediaServiceRemoteREST.m rename to Sources/WordPressKit/MediaServiceRemoteREST.m index c8509e79..b0e22446 100644 --- a/WordPressKit/MediaServiceRemoteREST.m +++ b/Sources/WordPressKit/MediaServiceRemoteREST.m @@ -1,6 +1,9 @@ #import "MediaServiceRemoteREST.h" #import "RemoteMedia.h" #import "WPKit-Swift.h" +#if SWIFT_PACKAGE +@import CoreAPI; +#endif @import WordPressShared; @import NSObject_SafeExpectations; diff --git a/WordPressKit/MediaServiceRemoteXMLRPC.h b/Sources/WordPressKit/MediaServiceRemoteXMLRPC.h similarity index 100% rename from WordPressKit/MediaServiceRemoteXMLRPC.h rename to Sources/WordPressKit/MediaServiceRemoteXMLRPC.h diff --git a/WordPressKit/MediaServiceRemoteXMLRPC.m b/Sources/WordPressKit/MediaServiceRemoteXMLRPC.m similarity index 100% rename from WordPressKit/MediaServiceRemoteXMLRPC.m rename to Sources/WordPressKit/MediaServiceRemoteXMLRPC.m diff --git a/WordPressKit/MenusServiceRemote.h b/Sources/WordPressKit/MenusServiceRemote.h similarity index 100% rename from WordPressKit/MenusServiceRemote.h rename to Sources/WordPressKit/MenusServiceRemote.h diff --git a/WordPressKit/MenusServiceRemote.m b/Sources/WordPressKit/MenusServiceRemote.m similarity index 100% rename from WordPressKit/MenusServiceRemote.m rename to Sources/WordPressKit/MenusServiceRemote.m diff --git a/WordPressKit/NSAttributedString+extensions.swift b/Sources/WordPressKit/NSAttributedString+extensions.swift similarity index 100% rename from WordPressKit/NSAttributedString+extensions.swift rename to Sources/WordPressKit/NSAttributedString+extensions.swift diff --git a/WordPressKit/NSCharacterSet+URLEncode.swift b/Sources/WordPressKit/NSCharacterSet+URLEncode.swift similarity index 100% rename from WordPressKit/NSCharacterSet+URLEncode.swift rename to Sources/WordPressKit/NSCharacterSet+URLEncode.swift diff --git a/WordPressKit/NSMutableDictionary+Helpers.h b/Sources/WordPressKit/NSMutableDictionary+Helpers.h similarity index 100% rename from WordPressKit/NSMutableDictionary+Helpers.h rename to Sources/WordPressKit/NSMutableDictionary+Helpers.h diff --git a/WordPressKit/NSMutableDictionary+Helpers.m b/Sources/WordPressKit/NSMutableDictionary+Helpers.m similarity index 100% rename from WordPressKit/NSMutableDictionary+Helpers.m rename to Sources/WordPressKit/NSMutableDictionary+Helpers.m diff --git a/WordPressKit/NSMutableParagraphStyle+extensions.swift b/Sources/WordPressKit/NSMutableParagraphStyle+extensions.swift similarity index 100% rename from WordPressKit/NSMutableParagraphStyle+extensions.swift rename to Sources/WordPressKit/NSMutableParagraphStyle+extensions.swift diff --git a/WordPressKit/NSString+MD5.h b/Sources/WordPressKit/NSString+MD5.h similarity index 100% rename from WordPressKit/NSString+MD5.h rename to Sources/WordPressKit/NSString+MD5.h diff --git a/WordPressKit/NSString+MD5.m b/Sources/WordPressKit/NSString+MD5.m similarity index 100% rename from WordPressKit/NSString+MD5.m rename to Sources/WordPressKit/NSString+MD5.m diff --git a/WordPressKit/NotificationSettingsServiceRemote.swift b/Sources/WordPressKit/NotificationSettingsServiceRemote.swift similarity index 100% rename from WordPressKit/NotificationSettingsServiceRemote.swift rename to Sources/WordPressKit/NotificationSettingsServiceRemote.swift diff --git a/WordPressKit/NotificationSyncServiceRemote.swift b/Sources/WordPressKit/NotificationSyncServiceRemote.swift similarity index 100% rename from WordPressKit/NotificationSyncServiceRemote.swift rename to Sources/WordPressKit/NotificationSyncServiceRemote.swift diff --git a/WordPressKit/ObjectValidation.swift b/Sources/WordPressKit/ObjectValidation.swift similarity index 100% rename from WordPressKit/ObjectValidation.swift rename to Sources/WordPressKit/ObjectValidation.swift diff --git a/WordPressKit/PageLayoutServiceRemote.swift b/Sources/WordPressKit/PageLayoutServiceRemote.swift similarity index 100% rename from WordPressKit/PageLayoutServiceRemote.swift rename to Sources/WordPressKit/PageLayoutServiceRemote.swift diff --git a/WordPressKit/PeopleServiceRemote.swift b/Sources/WordPressKit/PeopleServiceRemote.swift similarity index 100% rename from WordPressKit/PeopleServiceRemote.swift rename to Sources/WordPressKit/PeopleServiceRemote.swift diff --git a/WordPressKit/Plans/PlanServiceRemote.swift b/Sources/WordPressKit/Plans/PlanServiceRemote.swift similarity index 100% rename from WordPressKit/Plans/PlanServiceRemote.swift rename to Sources/WordPressKit/Plans/PlanServiceRemote.swift diff --git a/WordPressKit/Plans/PlanServiceRemote_ApiVersion1_3.swift b/Sources/WordPressKit/Plans/PlanServiceRemote_ApiVersion1_3.swift similarity index 100% rename from WordPressKit/Plans/PlanServiceRemote_ApiVersion1_3.swift rename to Sources/WordPressKit/Plans/PlanServiceRemote_ApiVersion1_3.swift diff --git a/WordPressKit/Plugin Management/JetpackPluginManagementClient.swift b/Sources/WordPressKit/Plugin Management/JetpackPluginManagementClient.swift similarity index 100% rename from WordPressKit/Plugin Management/JetpackPluginManagementClient.swift rename to Sources/WordPressKit/Plugin Management/JetpackPluginManagementClient.swift diff --git a/WordPressKit/Plugin Management/PluginManagementClient.swift b/Sources/WordPressKit/Plugin Management/PluginManagementClient.swift similarity index 100% rename from WordPressKit/Plugin Management/PluginManagementClient.swift rename to Sources/WordPressKit/Plugin Management/PluginManagementClient.swift diff --git a/WordPressKit/Plugin Management/SelfHostedPluginManagementClient.swift b/Sources/WordPressKit/Plugin Management/SelfHostedPluginManagementClient.swift similarity index 99% rename from WordPressKit/Plugin Management/SelfHostedPluginManagementClient.swift rename to Sources/WordPressKit/Plugin Management/SelfHostedPluginManagementClient.swift index cfb9e632..4186d5b9 100644 --- a/WordPressKit/Plugin Management/SelfHostedPluginManagementClient.swift +++ b/Sources/WordPressKit/Plugin Management/SelfHostedPluginManagementClient.swift @@ -1,3 +1,7 @@ +#if SWIFT_PACKAGE +import CoreAPI +#endif + public class SelfHostedPluginManagementClient: PluginManagementClient { private let remote: WordPressOrgRestApi diff --git a/WordPressKit/PluginDirectoryEntry.swift b/Sources/WordPressKit/PluginDirectoryEntry.swift similarity index 100% rename from WordPressKit/PluginDirectoryEntry.swift rename to Sources/WordPressKit/PluginDirectoryEntry.swift diff --git a/WordPressKit/PluginDirectoryFeedPage.swift b/Sources/WordPressKit/PluginDirectoryFeedPage.swift similarity index 100% rename from WordPressKit/PluginDirectoryFeedPage.swift rename to Sources/WordPressKit/PluginDirectoryFeedPage.swift diff --git a/WordPressKit/PluginDirectoryServiceRemote.swift b/Sources/WordPressKit/PluginDirectoryServiceRemote.swift similarity index 99% rename from WordPressKit/PluginDirectoryServiceRemote.swift rename to Sources/WordPressKit/PluginDirectoryServiceRemote.swift index 5dd800b7..c6d44eae 100644 --- a/WordPressKit/PluginDirectoryServiceRemote.swift +++ b/Sources/WordPressKit/PluginDirectoryServiceRemote.swift @@ -1,3 +1,6 @@ +#if SWIFT_PACKAGE +import CoreAPI +#endif import Foundation private struct PluginDirectoryRemoteConstants { diff --git a/WordPressKit/PluginServiceRemote.swift b/Sources/WordPressKit/PluginServiceRemote.swift similarity index 100% rename from WordPressKit/PluginServiceRemote.swift rename to Sources/WordPressKit/PluginServiceRemote.swift diff --git a/WordPressKit/PluginState.swift b/Sources/WordPressKit/PluginState.swift similarity index 100% rename from WordPressKit/PluginState.swift rename to Sources/WordPressKit/PluginState.swift diff --git a/WordPressKit/PostServiceRemote.h b/Sources/WordPressKit/PostServiceRemote.h similarity index 100% rename from WordPressKit/PostServiceRemote.h rename to Sources/WordPressKit/PostServiceRemote.h diff --git a/WordPressKit/PostServiceRemoteOptions.h b/Sources/WordPressKit/PostServiceRemoteOptions.h similarity index 100% rename from WordPressKit/PostServiceRemoteOptions.h rename to Sources/WordPressKit/PostServiceRemoteOptions.h diff --git a/WordPressKit/PostServiceRemoteREST+Revisions.swift b/Sources/WordPressKit/PostServiceRemoteREST+Revisions.swift similarity index 100% rename from WordPressKit/PostServiceRemoteREST+Revisions.swift rename to Sources/WordPressKit/PostServiceRemoteREST+Revisions.swift diff --git a/WordPressKit/PostServiceRemoteREST.h b/Sources/WordPressKit/PostServiceRemoteREST.h similarity index 100% rename from WordPressKit/PostServiceRemoteREST.h rename to Sources/WordPressKit/PostServiceRemoteREST.h diff --git a/WordPressKit/PostServiceRemoteREST.m b/Sources/WordPressKit/PostServiceRemoteREST.m similarity index 99% rename from WordPressKit/PostServiceRemoteREST.m rename to Sources/WordPressKit/PostServiceRemoteREST.m index a10d6624..7127b634 100644 --- a/WordPressKit/PostServiceRemoteREST.m +++ b/Sources/WordPressKit/PostServiceRemoteREST.m @@ -3,6 +3,9 @@ #import "RemotePostCategory.h" #import "RemoteUser.h" #import "WPKit-Swift.h" +#if SWIFT_PACKAGE +@import CoreAPI; +#endif @import WordPressShared; @import NSObject_SafeExpectations; diff --git a/WordPressKit/PostServiceRemoteXMLRPC.h b/Sources/WordPressKit/PostServiceRemoteXMLRPC.h similarity index 100% rename from WordPressKit/PostServiceRemoteXMLRPC.h rename to Sources/WordPressKit/PostServiceRemoteXMLRPC.h diff --git a/WordPressKit/PostServiceRemoteXMLRPC.m b/Sources/WordPressKit/PostServiceRemoteXMLRPC.m similarity index 100% rename from WordPressKit/PostServiceRemoteXMLRPC.m rename to Sources/WordPressKit/PostServiceRemoteXMLRPC.m diff --git a/WordPressKit/ProductServiceRemote.swift b/Sources/WordPressKit/ProductServiceRemote.swift similarity index 100% rename from WordPressKit/ProductServiceRemote.swift rename to Sources/WordPressKit/ProductServiceRemote.swift diff --git a/WordPressKit/PushAuthenticationServiceRemote.swift b/Sources/WordPressKit/PushAuthenticationServiceRemote.swift similarity index 100% rename from WordPressKit/PushAuthenticationServiceRemote.swift rename to Sources/WordPressKit/PushAuthenticationServiceRemote.swift diff --git a/WordPressKit/QR Login/QRLoginServiceRemote.swift b/Sources/WordPressKit/QR Login/QRLoginServiceRemote.swift similarity index 100% rename from WordPressKit/QR Login/QRLoginServiceRemote.swift rename to Sources/WordPressKit/QR Login/QRLoginServiceRemote.swift diff --git a/WordPressKit/QR Login/QRLoginValidationResponse.swift b/Sources/WordPressKit/QR Login/QRLoginValidationResponse.swift similarity index 100% rename from WordPressKit/QR Login/QRLoginValidationResponse.swift rename to Sources/WordPressKit/QR Login/QRLoginValidationResponse.swift diff --git a/WordPressKit/ReaderFeed.swift b/Sources/WordPressKit/ReaderFeed.swift similarity index 100% rename from WordPressKit/ReaderFeed.swift rename to Sources/WordPressKit/ReaderFeed.swift diff --git a/WordPressKit/ReaderPostServiceRemote+Cards.swift b/Sources/WordPressKit/ReaderPostServiceRemote+Cards.swift similarity index 100% rename from WordPressKit/ReaderPostServiceRemote+Cards.swift rename to Sources/WordPressKit/ReaderPostServiceRemote+Cards.swift diff --git a/WordPressKit/ReaderPostServiceRemote+RelatedPosts.swift b/Sources/WordPressKit/ReaderPostServiceRemote+RelatedPosts.swift similarity index 100% rename from WordPressKit/ReaderPostServiceRemote+RelatedPosts.swift rename to Sources/WordPressKit/ReaderPostServiceRemote+RelatedPosts.swift diff --git a/WordPressKit/ReaderPostServiceRemote+Subscriptions.swift b/Sources/WordPressKit/ReaderPostServiceRemote+Subscriptions.swift similarity index 100% rename from WordPressKit/ReaderPostServiceRemote+Subscriptions.swift rename to Sources/WordPressKit/ReaderPostServiceRemote+Subscriptions.swift diff --git a/WordPressKit/ReaderPostServiceRemote+V2.swift b/Sources/WordPressKit/ReaderPostServiceRemote+V2.swift similarity index 100% rename from WordPressKit/ReaderPostServiceRemote+V2.swift rename to Sources/WordPressKit/ReaderPostServiceRemote+V2.swift diff --git a/WordPressKit/ReaderPostServiceRemote.h b/Sources/WordPressKit/ReaderPostServiceRemote.h similarity index 100% rename from WordPressKit/ReaderPostServiceRemote.h rename to Sources/WordPressKit/ReaderPostServiceRemote.h diff --git a/WordPressKit/ReaderPostServiceRemote.m b/Sources/WordPressKit/ReaderPostServiceRemote.m similarity index 100% rename from WordPressKit/ReaderPostServiceRemote.m rename to Sources/WordPressKit/ReaderPostServiceRemote.m diff --git a/WordPressKit/ReaderServiceDeliveryFrequency.swift b/Sources/WordPressKit/ReaderServiceDeliveryFrequency.swift similarity index 100% rename from WordPressKit/ReaderServiceDeliveryFrequency.swift rename to Sources/WordPressKit/ReaderServiceDeliveryFrequency.swift diff --git a/WordPressKit/ReaderSiteSearchServiceRemote.swift b/Sources/WordPressKit/ReaderSiteSearchServiceRemote.swift similarity index 100% rename from WordPressKit/ReaderSiteSearchServiceRemote.swift rename to Sources/WordPressKit/ReaderSiteSearchServiceRemote.swift diff --git a/WordPressKit/ReaderSiteServiceRemote.h b/Sources/WordPressKit/ReaderSiteServiceRemote.h similarity index 100% rename from WordPressKit/ReaderSiteServiceRemote.h rename to Sources/WordPressKit/ReaderSiteServiceRemote.h diff --git a/WordPressKit/ReaderSiteServiceRemote.m b/Sources/WordPressKit/ReaderSiteServiceRemote.m similarity index 100% rename from WordPressKit/ReaderSiteServiceRemote.m rename to Sources/WordPressKit/ReaderSiteServiceRemote.m diff --git a/WordPressKit/ReaderTopicServiceError.swift b/Sources/WordPressKit/ReaderTopicServiceError.swift similarity index 100% rename from WordPressKit/ReaderTopicServiceError.swift rename to Sources/WordPressKit/ReaderTopicServiceError.swift diff --git a/WordPressKit/ReaderTopicServiceRemote+Interests.swift b/Sources/WordPressKit/ReaderTopicServiceRemote+Interests.swift similarity index 100% rename from WordPressKit/ReaderTopicServiceRemote+Interests.swift rename to Sources/WordPressKit/ReaderTopicServiceRemote+Interests.swift diff --git a/WordPressKit/ReaderTopicServiceRemote+Subscription.swift b/Sources/WordPressKit/ReaderTopicServiceRemote+Subscription.swift similarity index 100% rename from WordPressKit/ReaderTopicServiceRemote+Subscription.swift rename to Sources/WordPressKit/ReaderTopicServiceRemote+Subscription.swift diff --git a/WordPressKit/ReaderTopicServiceRemote.h b/Sources/WordPressKit/ReaderTopicServiceRemote.h similarity index 100% rename from WordPressKit/ReaderTopicServiceRemote.h rename to Sources/WordPressKit/ReaderTopicServiceRemote.h diff --git a/WordPressKit/ReaderTopicServiceRemote.m b/Sources/WordPressKit/ReaderTopicServiceRemote.m similarity index 100% rename from WordPressKit/ReaderTopicServiceRemote.m rename to Sources/WordPressKit/ReaderTopicServiceRemote.m diff --git a/WordPressKit/RemoteBlockEditorSettings.swift b/Sources/WordPressKit/RemoteBlockEditorSettings.swift similarity index 100% rename from WordPressKit/RemoteBlockEditorSettings.swift rename to Sources/WordPressKit/RemoteBlockEditorSettings.swift diff --git a/WordPressKit/RemoteBlog.swift b/Sources/WordPressKit/RemoteBlog.swift similarity index 100% rename from WordPressKit/RemoteBlog.swift rename to Sources/WordPressKit/RemoteBlog.swift diff --git a/WordPressKit/RemoteBlogJetpackModulesSettings.swift b/Sources/WordPressKit/RemoteBlogJetpackModulesSettings.swift similarity index 100% rename from WordPressKit/RemoteBlogJetpackModulesSettings.swift rename to Sources/WordPressKit/RemoteBlogJetpackModulesSettings.swift diff --git a/WordPressKit/RemoteBlogJetpackMonitorSettings.swift b/Sources/WordPressKit/RemoteBlogJetpackMonitorSettings.swift similarity index 100% rename from WordPressKit/RemoteBlogJetpackMonitorSettings.swift rename to Sources/WordPressKit/RemoteBlogJetpackMonitorSettings.swift diff --git a/WordPressKit/RemoteBlogJetpackSettings.swift b/Sources/WordPressKit/RemoteBlogJetpackSettings.swift similarity index 100% rename from WordPressKit/RemoteBlogJetpackSettings.swift rename to Sources/WordPressKit/RemoteBlogJetpackSettings.swift diff --git a/WordPressKit/RemoteBlogOptionsHelper.swift b/Sources/WordPressKit/RemoteBlogOptionsHelper.swift similarity index 100% rename from WordPressKit/RemoteBlogOptionsHelper.swift rename to Sources/WordPressKit/RemoteBlogOptionsHelper.swift diff --git a/WordPressKit/RemoteBlogSettings.swift b/Sources/WordPressKit/RemoteBlogSettings.swift similarity index 100% rename from WordPressKit/RemoteBlogSettings.swift rename to Sources/WordPressKit/RemoteBlogSettings.swift diff --git a/WordPressKit/RemoteBloggingPrompt.swift b/Sources/WordPressKit/RemoteBloggingPrompt.swift similarity index 100% rename from WordPressKit/RemoteBloggingPrompt.swift rename to Sources/WordPressKit/RemoteBloggingPrompt.swift diff --git a/WordPressKit/RemoteBloggingPromptsSettings.swift b/Sources/WordPressKit/RemoteBloggingPromptsSettings.swift similarity index 100% rename from WordPressKit/RemoteBloggingPromptsSettings.swift rename to Sources/WordPressKit/RemoteBloggingPromptsSettings.swift diff --git a/WordPressKit/RemoteComment.h b/Sources/WordPressKit/RemoteComment.h similarity index 100% rename from WordPressKit/RemoteComment.h rename to Sources/WordPressKit/RemoteComment.h diff --git a/WordPressKit/RemoteComment.m b/Sources/WordPressKit/RemoteComment.m similarity index 100% rename from WordPressKit/RemoteComment.m rename to Sources/WordPressKit/RemoteComment.m diff --git a/WordPressKit/RemoteCommentV2.swift b/Sources/WordPressKit/RemoteCommentV2.swift similarity index 96% rename from WordPressKit/RemoteCommentV2.swift rename to Sources/WordPressKit/RemoteCommentV2.swift index b407bf6d..8b3bd40c 100644 --- a/WordPressKit/RemoteCommentV2.swift +++ b/Sources/WordPressKit/RemoteCommentV2.swift @@ -1,3 +1,7 @@ +#if SWIFT_PACKAGE +import CoreAPI +#endif + /// Captures the JSON structure for Comments returned from API v2 endpoint. public struct RemoteCommentV2 { public var commentID: Int @@ -65,7 +69,7 @@ extension RemoteCommentV2: Decodable { // since `date_gmt` is already in GMT timezone, manually add the timezone string to make the rfc3339 formatter happy (or it will throw otherwise). guard let dateString = try? container.decode(String.self, forKey: .date), - let date = NSDate(wordPressComJSONString: dateString + "+00:00") as Date? else { + let date = NSDate.with(wordPressComJSONString: dateString + "+00:00") else { throw DecodingError.dataCorruptedError(forKey: .date, in: container, debugDescription: "Date parsing failed") } self.date = date diff --git a/WordPressKit/RemoteConfigRemote.swift b/Sources/WordPressKit/RemoteConfigRemote.swift similarity index 100% rename from WordPressKit/RemoteConfigRemote.swift rename to Sources/WordPressKit/RemoteConfigRemote.swift diff --git a/WordPressKit/RemoteDiff.swift b/Sources/WordPressKit/RemoteDiff.swift similarity index 100% rename from WordPressKit/RemoteDiff.swift rename to Sources/WordPressKit/RemoteDiff.swift diff --git a/WordPressKit/RemoteDomain.swift b/Sources/WordPressKit/RemoteDomain.swift similarity index 100% rename from WordPressKit/RemoteDomain.swift rename to Sources/WordPressKit/RemoteDomain.swift diff --git a/WordPressKit/RemoteGravatarProfile.swift b/Sources/WordPressKit/RemoteGravatarProfile.swift similarity index 100% rename from WordPressKit/RemoteGravatarProfile.swift rename to Sources/WordPressKit/RemoteGravatarProfile.swift diff --git a/WordPressKit/RemoteHomepageType.swift b/Sources/WordPressKit/RemoteHomepageType.swift similarity index 100% rename from WordPressKit/RemoteHomepageType.swift rename to Sources/WordPressKit/RemoteHomepageType.swift diff --git a/WordPressKit/RemoteInviteLink.swift b/Sources/WordPressKit/RemoteInviteLink.swift similarity index 100% rename from WordPressKit/RemoteInviteLink.swift rename to Sources/WordPressKit/RemoteInviteLink.swift diff --git a/WordPressKit/RemoteMedia.h b/Sources/WordPressKit/RemoteMedia.h similarity index 100% rename from WordPressKit/RemoteMedia.h rename to Sources/WordPressKit/RemoteMedia.h diff --git a/WordPressKit/RemoteMedia.m b/Sources/WordPressKit/RemoteMedia.m similarity index 100% rename from WordPressKit/RemoteMedia.m rename to Sources/WordPressKit/RemoteMedia.m diff --git a/WordPressKit/RemoteMenu.swift b/Sources/WordPressKit/RemoteMenu.swift similarity index 100% rename from WordPressKit/RemoteMenu.swift rename to Sources/WordPressKit/RemoteMenu.swift diff --git a/WordPressKit/RemoteMenuItem.swift b/Sources/WordPressKit/RemoteMenuItem.swift similarity index 100% rename from WordPressKit/RemoteMenuItem.swift rename to Sources/WordPressKit/RemoteMenuItem.swift diff --git a/WordPressKit/RemoteMenuLocation.swift b/Sources/WordPressKit/RemoteMenuLocation.swift similarity index 100% rename from WordPressKit/RemoteMenuLocation.swift rename to Sources/WordPressKit/RemoteMenuLocation.swift diff --git a/WordPressKit/RemoteNotification.swift b/Sources/WordPressKit/RemoteNotification.swift similarity index 100% rename from WordPressKit/RemoteNotification.swift rename to Sources/WordPressKit/RemoteNotification.swift diff --git a/WordPressKit/RemoteNotificationSettings.swift b/Sources/WordPressKit/RemoteNotificationSettings.swift similarity index 100% rename from WordPressKit/RemoteNotificationSettings.swift rename to Sources/WordPressKit/RemoteNotificationSettings.swift diff --git a/WordPressKit/RemotePageLayouts.swift b/Sources/WordPressKit/RemotePageLayouts.swift similarity index 100% rename from WordPressKit/RemotePageLayouts.swift rename to Sources/WordPressKit/RemotePageLayouts.swift diff --git a/WordPressKit/RemotePerson.swift b/Sources/WordPressKit/RemotePerson.swift similarity index 100% rename from WordPressKit/RemotePerson.swift rename to Sources/WordPressKit/RemotePerson.swift diff --git a/WordPressKit/RemotePlan_ApiVersion1_3.swift b/Sources/WordPressKit/RemotePlan_ApiVersion1_3.swift similarity index 100% rename from WordPressKit/RemotePlan_ApiVersion1_3.swift rename to Sources/WordPressKit/RemotePlan_ApiVersion1_3.swift diff --git a/WordPressKit/RemotePost.h b/Sources/WordPressKit/RemotePost.h similarity index 100% rename from WordPressKit/RemotePost.h rename to Sources/WordPressKit/RemotePost.h diff --git a/WordPressKit/RemotePost.m b/Sources/WordPressKit/RemotePost.m similarity index 100% rename from WordPressKit/RemotePost.m rename to Sources/WordPressKit/RemotePost.m diff --git a/WordPressKit/RemotePostAutosave.swift b/Sources/WordPressKit/RemotePostAutosave.swift similarity index 100% rename from WordPressKit/RemotePostAutosave.swift rename to Sources/WordPressKit/RemotePostAutosave.swift diff --git a/WordPressKit/RemotePostCategory.h b/Sources/WordPressKit/RemotePostCategory.h similarity index 100% rename from WordPressKit/RemotePostCategory.h rename to Sources/WordPressKit/RemotePostCategory.h diff --git a/WordPressKit/RemotePostCategory.m b/Sources/WordPressKit/RemotePostCategory.m similarity index 100% rename from WordPressKit/RemotePostCategory.m rename to Sources/WordPressKit/RemotePostCategory.m diff --git a/WordPressKit/RemotePostTag.h b/Sources/WordPressKit/RemotePostTag.h similarity index 100% rename from WordPressKit/RemotePostTag.h rename to Sources/WordPressKit/RemotePostTag.h diff --git a/WordPressKit/RemotePostTag.m b/Sources/WordPressKit/RemotePostTag.m similarity index 100% rename from WordPressKit/RemotePostTag.m rename to Sources/WordPressKit/RemotePostTag.m diff --git a/WordPressKit/RemotePostType.h b/Sources/WordPressKit/RemotePostType.h similarity index 100% rename from WordPressKit/RemotePostType.h rename to Sources/WordPressKit/RemotePostType.h diff --git a/WordPressKit/RemotePostType.m b/Sources/WordPressKit/RemotePostType.m similarity index 100% rename from WordPressKit/RemotePostType.m rename to Sources/WordPressKit/RemotePostType.m diff --git a/WordPressKit/RemoteProfile.swift b/Sources/WordPressKit/RemoteProfile.swift similarity index 100% rename from WordPressKit/RemoteProfile.swift rename to Sources/WordPressKit/RemoteProfile.swift diff --git a/WordPressKit/RemotePublicizeConnection.swift b/Sources/WordPressKit/RemotePublicizeConnection.swift similarity index 100% rename from WordPressKit/RemotePublicizeConnection.swift rename to Sources/WordPressKit/RemotePublicizeConnection.swift diff --git a/WordPressKit/RemotePublicizeInfo.swift b/Sources/WordPressKit/RemotePublicizeInfo.swift similarity index 100% rename from WordPressKit/RemotePublicizeInfo.swift rename to Sources/WordPressKit/RemotePublicizeInfo.swift diff --git a/WordPressKit/RemotePublicizeService.swift b/Sources/WordPressKit/RemotePublicizeService.swift similarity index 100% rename from WordPressKit/RemotePublicizeService.swift rename to Sources/WordPressKit/RemotePublicizeService.swift diff --git a/WordPressKit/RemoteReaderCard.swift b/Sources/WordPressKit/RemoteReaderCard.swift similarity index 100% rename from WordPressKit/RemoteReaderCard.swift rename to Sources/WordPressKit/RemoteReaderCard.swift diff --git a/WordPressKit/RemoteReaderCrossPostMeta.swift b/Sources/WordPressKit/RemoteReaderCrossPostMeta.swift similarity index 100% rename from WordPressKit/RemoteReaderCrossPostMeta.swift rename to Sources/WordPressKit/RemoteReaderCrossPostMeta.swift diff --git a/WordPressKit/RemoteReaderInterest.swift b/Sources/WordPressKit/RemoteReaderInterest.swift similarity index 100% rename from WordPressKit/RemoteReaderInterest.swift rename to Sources/WordPressKit/RemoteReaderInterest.swift diff --git a/WordPressKit/RemoteReaderPost.h b/Sources/WordPressKit/RemoteReaderPost.h similarity index 100% rename from WordPressKit/RemoteReaderPost.h rename to Sources/WordPressKit/RemoteReaderPost.h diff --git a/WordPressKit/RemoteReaderPost.m b/Sources/WordPressKit/RemoteReaderPost.m similarity index 100% rename from WordPressKit/RemoteReaderPost.m rename to Sources/WordPressKit/RemoteReaderPost.m diff --git a/WordPressKit/RemoteReaderPost.swift b/Sources/WordPressKit/RemoteReaderPost.swift similarity index 100% rename from WordPressKit/RemoteReaderPost.swift rename to Sources/WordPressKit/RemoteReaderPost.swift diff --git a/WordPressKit/RemoteReaderSimplePost.swift b/Sources/WordPressKit/RemoteReaderSimplePost.swift similarity index 100% rename from WordPressKit/RemoteReaderSimplePost.swift rename to Sources/WordPressKit/RemoteReaderSimplePost.swift diff --git a/WordPressKit/RemoteReaderSite.swift b/Sources/WordPressKit/RemoteReaderSite.swift similarity index 100% rename from WordPressKit/RemoteReaderSite.swift rename to Sources/WordPressKit/RemoteReaderSite.swift diff --git a/WordPressKit/RemoteReaderSiteInfo.swift b/Sources/WordPressKit/RemoteReaderSiteInfo.swift similarity index 100% rename from WordPressKit/RemoteReaderSiteInfo.swift rename to Sources/WordPressKit/RemoteReaderSiteInfo.swift diff --git a/WordPressKit/RemoteReaderSiteInfoSubscription.swift b/Sources/WordPressKit/RemoteReaderSiteInfoSubscription.swift similarity index 100% rename from WordPressKit/RemoteReaderSiteInfoSubscription.swift rename to Sources/WordPressKit/RemoteReaderSiteInfoSubscription.swift diff --git a/WordPressKit/RemoteReaderTopic.swift b/Sources/WordPressKit/RemoteReaderTopic.swift similarity index 100% rename from WordPressKit/RemoteReaderTopic.swift rename to Sources/WordPressKit/RemoteReaderTopic.swift diff --git a/WordPressKit/RemoteRevision.swift b/Sources/WordPressKit/RemoteRevision.swift similarity index 100% rename from WordPressKit/RemoteRevision.swift rename to Sources/WordPressKit/RemoteRevision.swift diff --git a/WordPressKit/RemoteShareAppContent.swift b/Sources/WordPressKit/RemoteShareAppContent.swift similarity index 100% rename from WordPressKit/RemoteShareAppContent.swift rename to Sources/WordPressKit/RemoteShareAppContent.swift diff --git a/WordPressKit/RemoteSharingButton.swift b/Sources/WordPressKit/RemoteSharingButton.swift similarity index 100% rename from WordPressKit/RemoteSharingButton.swift rename to Sources/WordPressKit/RemoteSharingButton.swift diff --git a/WordPressKit/RemoteSiteDesign.swift b/Sources/WordPressKit/RemoteSiteDesign.swift similarity index 100% rename from WordPressKit/RemoteSiteDesign.swift rename to Sources/WordPressKit/RemoteSiteDesign.swift diff --git a/WordPressKit/RemoteSourcePostAttribution.h b/Sources/WordPressKit/RemoteSourcePostAttribution.h similarity index 100% rename from WordPressKit/RemoteSourcePostAttribution.h rename to Sources/WordPressKit/RemoteSourcePostAttribution.h diff --git a/WordPressKit/RemoteSourcePostAttribution.m b/Sources/WordPressKit/RemoteSourcePostAttribution.m similarity index 100% rename from WordPressKit/RemoteSourcePostAttribution.m rename to Sources/WordPressKit/RemoteSourcePostAttribution.m diff --git a/WordPressKit/RemoteTaxonomyPaging.h b/Sources/WordPressKit/RemoteTaxonomyPaging.h similarity index 100% rename from WordPressKit/RemoteTaxonomyPaging.h rename to Sources/WordPressKit/RemoteTaxonomyPaging.h diff --git a/WordPressKit/RemoteTaxonomyPaging.m b/Sources/WordPressKit/RemoteTaxonomyPaging.m similarity index 100% rename from WordPressKit/RemoteTaxonomyPaging.m rename to Sources/WordPressKit/RemoteTaxonomyPaging.m diff --git a/WordPressKit/RemoteTheme.h b/Sources/WordPressKit/RemoteTheme.h similarity index 100% rename from WordPressKit/RemoteTheme.h rename to Sources/WordPressKit/RemoteTheme.h diff --git a/WordPressKit/RemoteTheme.m b/Sources/WordPressKit/RemoteTheme.m similarity index 100% rename from WordPressKit/RemoteTheme.m rename to Sources/WordPressKit/RemoteTheme.m diff --git a/WordPressKit/RemoteUser+Likes.swift b/Sources/WordPressKit/RemoteUser+Likes.swift similarity index 100% rename from WordPressKit/RemoteUser+Likes.swift rename to Sources/WordPressKit/RemoteUser+Likes.swift diff --git a/WordPressKit/RemoteUser.h b/Sources/WordPressKit/RemoteUser.h similarity index 100% rename from WordPressKit/RemoteUser.h rename to Sources/WordPressKit/RemoteUser.h diff --git a/WordPressKit/RemoteUser.m b/Sources/WordPressKit/RemoteUser.m similarity index 100% rename from WordPressKit/RemoteUser.m rename to Sources/WordPressKit/RemoteUser.m diff --git a/WordPressKit/RemoteVideoPressVideo.swift b/Sources/WordPressKit/RemoteVideoPressVideo.swift similarity index 100% rename from WordPressKit/RemoteVideoPressVideo.swift rename to Sources/WordPressKit/RemoteVideoPressVideo.swift diff --git a/WordPressKit/RemoteWpcomPlan.swift b/Sources/WordPressKit/RemoteWpcomPlan.swift similarity index 100% rename from WordPressKit/RemoteWpcomPlan.swift rename to Sources/WordPressKit/RemoteWpcomPlan.swift diff --git a/WordPressKit/ServiceRemoteWordPressComREST.h b/Sources/WordPressKit/ServiceRemoteWordPressComREST.h similarity index 96% rename from WordPressKit/ServiceRemoteWordPressComREST.h rename to Sources/WordPressKit/ServiceRemoteWordPressComREST.h index 7d7499ff..9f95b771 100644 --- a/WordPressKit/ServiceRemoteWordPressComREST.h +++ b/Sources/WordPressKit/ServiceRemoteWordPressComREST.h @@ -1,4 +1,7 @@ -#import +#if SWIFT_PACKAGE +@import CoreAPI; +#endif +@import Foundation; @class WordPressComRestApi; diff --git a/WordPressKit/ServiceRemoteWordPressComREST.m b/Sources/WordPressKit/ServiceRemoteWordPressComREST.m similarity index 100% rename from WordPressKit/ServiceRemoteWordPressComREST.m rename to Sources/WordPressKit/ServiceRemoteWordPressComREST.m diff --git a/WordPressKit/ServiceRemoteWordPressXMLRPC.h b/Sources/WordPressKit/ServiceRemoteWordPressXMLRPC.h similarity index 100% rename from WordPressKit/ServiceRemoteWordPressXMLRPC.h rename to Sources/WordPressKit/ServiceRemoteWordPressXMLRPC.h diff --git a/WordPressKit/ServiceRemoteWordPressXMLRPC.m b/Sources/WordPressKit/ServiceRemoteWordPressXMLRPC.m similarity index 100% rename from WordPressKit/ServiceRemoteWordPressXMLRPC.m rename to Sources/WordPressKit/ServiceRemoteWordPressXMLRPC.m diff --git a/WordPressKit/ServiceRequest.swift b/Sources/WordPressKit/ServiceRequest.swift similarity index 100% rename from WordPressKit/ServiceRequest.swift rename to Sources/WordPressKit/ServiceRequest.swift diff --git a/WordPressKit/SessionDetails.swift b/Sources/WordPressKit/SessionDetails.swift similarity index 100% rename from WordPressKit/SessionDetails.swift rename to Sources/WordPressKit/SessionDetails.swift diff --git a/WordPressKit/ShareAppContentServiceRemote.swift b/Sources/WordPressKit/ShareAppContentServiceRemote.swift similarity index 97% rename from WordPressKit/ShareAppContentServiceRemote.swift rename to Sources/WordPressKit/ShareAppContentServiceRemote.swift index a69e4f29..bf597c54 100644 --- a/WordPressKit/ShareAppContentServiceRemote.swift +++ b/Sources/WordPressKit/ShareAppContentServiceRemote.swift @@ -1,3 +1,7 @@ +#if SWIFT_PACKAGE +import CoreAPI +#endif + /// Encapsulates logic for fetching content to be shared by the user. /// open class ShareAppContentServiceRemote: ServiceRemoteWordPressComREST { diff --git a/WordPressKit/SharingServiceRemote.swift b/Sources/WordPressKit/SharingServiceRemote.swift similarity index 100% rename from WordPressKit/SharingServiceRemote.swift rename to Sources/WordPressKit/SharingServiceRemote.swift diff --git a/WordPressKit/SiteDesignServiceRemote.swift b/Sources/WordPressKit/SiteDesignServiceRemote.swift similarity index 100% rename from WordPressKit/SiteDesignServiceRemote.swift rename to Sources/WordPressKit/SiteDesignServiceRemote.swift diff --git a/WordPressKit/SiteManagementServiceRemote.swift b/Sources/WordPressKit/SiteManagementServiceRemote.swift similarity index 100% rename from WordPressKit/SiteManagementServiceRemote.swift rename to Sources/WordPressKit/SiteManagementServiceRemote.swift diff --git a/WordPressKit/SitePlugin.swift b/Sources/WordPressKit/SitePlugin.swift similarity index 100% rename from WordPressKit/SitePlugin.swift rename to Sources/WordPressKit/SitePlugin.swift diff --git a/WordPressKit/SitePluginCapabilities.swift b/Sources/WordPressKit/SitePluginCapabilities.swift similarity index 100% rename from WordPressKit/SitePluginCapabilities.swift rename to Sources/WordPressKit/SitePluginCapabilities.swift diff --git a/WordPressKit/SiteServiceRemoteWordPressComREST.h b/Sources/WordPressKit/SiteServiceRemoteWordPressComREST.h similarity index 100% rename from WordPressKit/SiteServiceRemoteWordPressComREST.h rename to Sources/WordPressKit/SiteServiceRemoteWordPressComREST.h diff --git a/WordPressKit/SiteServiceRemoteWordPressComREST.m b/Sources/WordPressKit/SiteServiceRemoteWordPressComREST.m similarity index 100% rename from WordPressKit/SiteServiceRemoteWordPressComREST.m rename to Sources/WordPressKit/SiteServiceRemoteWordPressComREST.m diff --git a/WordPressKit/StatsPostDetails.swift b/Sources/WordPressKit/StatsPostDetails.swift similarity index 100% rename from WordPressKit/StatsPostDetails.swift rename to Sources/WordPressKit/StatsPostDetails.swift diff --git a/WordPressKit/StatsServiceRemoteV2.swift b/Sources/WordPressKit/StatsServiceRemoteV2.swift similarity index 100% rename from WordPressKit/StatsServiceRemoteV2.swift rename to Sources/WordPressKit/StatsServiceRemoteV2.swift diff --git a/WordPressKit/TaxonomyServiceRemote.h b/Sources/WordPressKit/TaxonomyServiceRemote.h similarity index 100% rename from WordPressKit/TaxonomyServiceRemote.h rename to Sources/WordPressKit/TaxonomyServiceRemote.h diff --git a/WordPressKit/TaxonomyServiceRemoteREST.h b/Sources/WordPressKit/TaxonomyServiceRemoteREST.h similarity index 100% rename from WordPressKit/TaxonomyServiceRemoteREST.h rename to Sources/WordPressKit/TaxonomyServiceRemoteREST.h diff --git a/WordPressKit/TaxonomyServiceRemoteREST.m b/Sources/WordPressKit/TaxonomyServiceRemoteREST.m similarity index 100% rename from WordPressKit/TaxonomyServiceRemoteREST.m rename to Sources/WordPressKit/TaxonomyServiceRemoteREST.m diff --git a/WordPressKit/TaxonomyServiceRemoteXMLRPC.h b/Sources/WordPressKit/TaxonomyServiceRemoteXMLRPC.h similarity index 100% rename from WordPressKit/TaxonomyServiceRemoteXMLRPC.h rename to Sources/WordPressKit/TaxonomyServiceRemoteXMLRPC.h diff --git a/WordPressKit/TaxonomyServiceRemoteXMLRPC.m b/Sources/WordPressKit/TaxonomyServiceRemoteXMLRPC.m similarity index 100% rename from WordPressKit/TaxonomyServiceRemoteXMLRPC.m rename to Sources/WordPressKit/TaxonomyServiceRemoteXMLRPC.m diff --git a/WordPressKit/ThemeServiceRemote.h b/Sources/WordPressKit/ThemeServiceRemote.h similarity index 100% rename from WordPressKit/ThemeServiceRemote.h rename to Sources/WordPressKit/ThemeServiceRemote.h diff --git a/WordPressKit/ThemeServiceRemote.m b/Sources/WordPressKit/ThemeServiceRemote.m similarity index 100% rename from WordPressKit/ThemeServiceRemote.m rename to Sources/WordPressKit/ThemeServiceRemote.m diff --git a/WordPressKit/Time Interval/StatsFileDownloadsTimeIntervalData.swift b/Sources/WordPressKit/Time Interval/StatsFileDownloadsTimeIntervalData.swift similarity index 100% rename from WordPressKit/Time Interval/StatsFileDownloadsTimeIntervalData.swift rename to Sources/WordPressKit/Time Interval/StatsFileDownloadsTimeIntervalData.swift diff --git a/WordPressKit/Time Interval/StatsPublishedPostsTimeIntervalData.swift b/Sources/WordPressKit/Time Interval/StatsPublishedPostsTimeIntervalData.swift similarity index 100% rename from WordPressKit/Time Interval/StatsPublishedPostsTimeIntervalData.swift rename to Sources/WordPressKit/Time Interval/StatsPublishedPostsTimeIntervalData.swift diff --git a/WordPressKit/Time Interval/StatsSearchTermTimeIntervalData.swift b/Sources/WordPressKit/Time Interval/StatsSearchTermTimeIntervalData.swift similarity index 100% rename from WordPressKit/Time Interval/StatsSearchTermTimeIntervalData.swift rename to Sources/WordPressKit/Time Interval/StatsSearchTermTimeIntervalData.swift diff --git a/WordPressKit/Time Interval/StatsSummaryTimeIntervalData.swift b/Sources/WordPressKit/Time Interval/StatsSummaryTimeIntervalData.swift similarity index 100% rename from WordPressKit/Time Interval/StatsSummaryTimeIntervalData.swift rename to Sources/WordPressKit/Time Interval/StatsSummaryTimeIntervalData.swift diff --git a/WordPressKit/Time Interval/StatsTopAuthorsTimeIntervalData.swift b/Sources/WordPressKit/Time Interval/StatsTopAuthorsTimeIntervalData.swift similarity index 100% rename from WordPressKit/Time Interval/StatsTopAuthorsTimeIntervalData.swift rename to Sources/WordPressKit/Time Interval/StatsTopAuthorsTimeIntervalData.swift diff --git a/WordPressKit/Time Interval/StatsTopClicksTimeIntervalData.swift b/Sources/WordPressKit/Time Interval/StatsTopClicksTimeIntervalData.swift similarity index 100% rename from WordPressKit/Time Interval/StatsTopClicksTimeIntervalData.swift rename to Sources/WordPressKit/Time Interval/StatsTopClicksTimeIntervalData.swift diff --git a/WordPressKit/Time Interval/StatsTopCountryTimeIntervalData.swift b/Sources/WordPressKit/Time Interval/StatsTopCountryTimeIntervalData.swift similarity index 100% rename from WordPressKit/Time Interval/StatsTopCountryTimeIntervalData.swift rename to Sources/WordPressKit/Time Interval/StatsTopCountryTimeIntervalData.swift diff --git a/WordPressKit/Time Interval/StatsTopPostsTimeIntervalData.swift b/Sources/WordPressKit/Time Interval/StatsTopPostsTimeIntervalData.swift similarity index 100% rename from WordPressKit/Time Interval/StatsTopPostsTimeIntervalData.swift rename to Sources/WordPressKit/Time Interval/StatsTopPostsTimeIntervalData.swift diff --git a/WordPressKit/Time Interval/StatsTopReferrersTimeIntervalData.swift b/Sources/WordPressKit/Time Interval/StatsTopReferrersTimeIntervalData.swift similarity index 100% rename from WordPressKit/Time Interval/StatsTopReferrersTimeIntervalData.swift rename to Sources/WordPressKit/Time Interval/StatsTopReferrersTimeIntervalData.swift diff --git a/WordPressKit/Time Interval/StatsTopVideosTimeIntervalData.swift b/Sources/WordPressKit/Time Interval/StatsTopVideosTimeIntervalData.swift similarity index 100% rename from WordPressKit/Time Interval/StatsTopVideosTimeIntervalData.swift rename to Sources/WordPressKit/Time Interval/StatsTopVideosTimeIntervalData.swift diff --git a/WordPressKit/Time Interval/StatsTotalsSummaryData.swift b/Sources/WordPressKit/Time Interval/StatsTotalsSummaryData.swift similarity index 100% rename from WordPressKit/Time Interval/StatsTotalsSummaryData.swift rename to Sources/WordPressKit/Time Interval/StatsTotalsSummaryData.swift diff --git a/WordPressKit/TimeZoneServiceRemote.swift b/Sources/WordPressKit/TimeZoneServiceRemote.swift similarity index 100% rename from WordPressKit/TimeZoneServiceRemote.swift rename to Sources/WordPressKit/TimeZoneServiceRemote.swift diff --git a/WordPressKit/TransactionsServiceRemote.swift b/Sources/WordPressKit/TransactionsServiceRemote.swift similarity index 100% rename from WordPressKit/TransactionsServiceRemote.swift rename to Sources/WordPressKit/TransactionsServiceRemote.swift diff --git a/WordPressKit/UsersServiceRemoteXMLRPC.swift b/Sources/WordPressKit/UsersServiceRemoteXMLRPC.swift similarity index 100% rename from WordPressKit/UsersServiceRemoteXMLRPC.swift rename to Sources/WordPressKit/UsersServiceRemoteXMLRPC.swift diff --git a/WordPressKit/WPCountry.swift b/Sources/WordPressKit/WPCountry.swift similarity index 100% rename from WordPressKit/WPCountry.swift rename to Sources/WordPressKit/WPCountry.swift diff --git a/WordPressKit/WPState.swift b/Sources/WordPressKit/WPState.swift similarity index 100% rename from WordPressKit/WPState.swift rename to Sources/WordPressKit/WPState.swift diff --git a/WordPressKit/WPTimeZone.swift b/Sources/WordPressKit/WPTimeZone.swift similarity index 100% rename from WordPressKit/WPTimeZone.swift rename to Sources/WordPressKit/WPTimeZone.swift diff --git a/WordPressKit/Private/WPKit-Swift.h b/Sources/WordPressKit/WordPressAndJetpack/Private/WPKit-Swift.h similarity index 100% rename from WordPressKit/Private/WPKit-Swift.h rename to Sources/WordPressKit/WordPressAndJetpack/Private/WPKit-Swift.h diff --git a/WordPressKit/WPKitLogging.h b/Sources/WordPressKit/WordPressAndJetpack/Private/WPKitLogging.h similarity index 100% rename from WordPressKit/WPKitLogging.h rename to Sources/WordPressKit/WordPressAndJetpack/Private/WPKitLogging.h diff --git a/WordPressKit/WPKitLogging.m b/Sources/WordPressKit/WordPressAndJetpack/Private/WPKitLogging.m similarity index 100% rename from WordPressKit/WPKitLogging.m rename to Sources/WordPressKit/WordPressAndJetpack/Private/WPKitLogging.m diff --git a/WordPressKit/WPKitLogging.swift b/Sources/WordPressKit/WordPressAndJetpack/Private/WPKitLogging.swift similarity index 100% rename from WordPressKit/WPKitLogging.swift rename to Sources/WordPressKit/WordPressAndJetpack/Private/WPKitLogging.swift diff --git a/WordPressKit/WordPressComServiceRemote+SiteCreation.swift b/Sources/WordPressKit/WordPressComServiceRemote+SiteCreation.swift similarity index 100% rename from WordPressKit/WordPressComServiceRemote+SiteCreation.swift rename to Sources/WordPressKit/WordPressComServiceRemote+SiteCreation.swift diff --git a/WordPressKit/WordPressComServiceRemote+SiteSegments.swift b/Sources/WordPressKit/WordPressComServiceRemote+SiteSegments.swift similarity index 100% rename from WordPressKit/WordPressComServiceRemote+SiteSegments.swift rename to Sources/WordPressKit/WordPressComServiceRemote+SiteSegments.swift diff --git a/WordPressKit/WordPressComServiceRemote+SiteVerticals.swift b/Sources/WordPressKit/WordPressComServiceRemote+SiteVerticals.swift similarity index 100% rename from WordPressKit/WordPressComServiceRemote+SiteVerticals.swift rename to Sources/WordPressKit/WordPressComServiceRemote+SiteVerticals.swift diff --git a/WordPressKit/WordPressComServiceRemote+SiteVerticalsPrompt.swift b/Sources/WordPressKit/WordPressComServiceRemote+SiteVerticalsPrompt.swift similarity index 100% rename from WordPressKit/WordPressComServiceRemote+SiteVerticalsPrompt.swift rename to Sources/WordPressKit/WordPressComServiceRemote+SiteVerticalsPrompt.swift diff --git a/WordPressKit/WordPressKit.h b/Sources/WordPressKit/WordPressKit.h similarity index 97% rename from WordPressKit/WordPressKit.h rename to Sources/WordPressKit/WordPressKit.h index bec245f2..f498488e 100644 --- a/WordPressKit/WordPressKit.h +++ b/Sources/WordPressKit/WordPressKit.h @@ -47,7 +47,6 @@ FOUNDATION_EXPORT const unsigned char WordPressKitVersionString[]; #import #import -#import #import #import diff --git a/WordPressKit/ZendeskMetadata.swift b/Sources/WordPressKit/ZendeskMetadata.swift similarity index 100% rename from WordPressKit/ZendeskMetadata.swift rename to Sources/WordPressKit/ZendeskMetadata.swift diff --git a/WordPressKitTests/Utilities/AppTransportSecuritySettingsTests.swift b/Tests/CoreAPITests/AppTransportSecuritySettingsTests.swift similarity index 98% rename from WordPressKitTests/Utilities/AppTransportSecuritySettingsTests.swift rename to Tests/CoreAPITests/AppTransportSecuritySettingsTests.swift index 513596b8..59516b43 100644 --- a/WordPressKitTests/Utilities/AppTransportSecuritySettingsTests.swift +++ b/Tests/CoreAPITests/AppTransportSecuritySettingsTests.swift @@ -1,6 +1,9 @@ import XCTest +#if SWIFT_PACKAGE +@testable import CoreAPI +#else @testable import WordPressKit - +#endif final class AppTransportSecuritySettingsTests: XCTestCase { private var exampleURL = URL(string: "https://example.com")! diff --git a/Tests/CoreAPITests/Bundle+SPMSupport.swift b/Tests/CoreAPITests/Bundle+SPMSupport.swift new file mode 100644 index 00000000..0c3d02c2 --- /dev/null +++ b/Tests/CoreAPITests/Bundle+SPMSupport.swift @@ -0,0 +1,25 @@ +import Foundation + +extension Bundle { + /// Returns the `Bundle` for the target. + /// + /// If installed via CocoaPods, this will be `.bundle`, otherwise it will be the framework bundle. + @objc public class var coreAPITestsBundle: Bundle { +#if SWIFT_PACKAGE + return Bundle.module +#else + let defaultBundle = Bundle(for: BundleFinder.self) + + guard let bundleURL = defaultBundle.resourceURL, + let resourceBundle = Bundle(url: bundleURL.appendingPathComponent("CoreAPITests.bundle")) else { + return defaultBundle + } + + return resourceBundle +#endif + } +} + +#if !SWIFT_PACKAGE +private class BundleFinder: NSObject {} +#endif diff --git a/WordPressKitTests/Fakes/FakeInfoDictionaryObjectProvider.swift b/Tests/CoreAPITests/FakeInfoDictionaryObjectProvider.swift similarity index 88% rename from WordPressKitTests/Fakes/FakeInfoDictionaryObjectProvider.swift rename to Tests/CoreAPITests/FakeInfoDictionaryObjectProvider.swift index 405922f7..43411468 100644 --- a/WordPressKitTests/Fakes/FakeInfoDictionaryObjectProvider.swift +++ b/Tests/CoreAPITests/FakeInfoDictionaryObjectProvider.swift @@ -1,6 +1,8 @@ -import Foundation +#if SWIFT_PACKAGE +@testable import CoreAPI +#else @testable import WordPressKit - +#endif class FakeInfoDictionaryObjectProvider: InfoDictionaryObjectProvider { private let appTransportSecurity: [String: Any]? diff --git a/WordPressKitTests/Utilities/HTTPRequestBuilderTests.swift b/Tests/CoreAPITests/HTTPRequestBuilderTests.swift similarity index 99% rename from WordPressKitTests/Utilities/HTTPRequestBuilderTests.swift rename to Tests/CoreAPITests/HTTPRequestBuilderTests.swift index 12824e66..5170c0f5 100644 --- a/WordPressKitTests/Utilities/HTTPRequestBuilderTests.swift +++ b/Tests/CoreAPITests/HTTPRequestBuilderTests.swift @@ -1,9 +1,12 @@ +#if SWIFT_PACKAGE +@testable import CoreAPI +#else +@testable import WordPressKit +#endif import Foundation import XCTest import wpxmlrpc -@testable import WordPressKit - class HTTPRequestBuilderTests: XCTestCase { static let nestedParameters: [String: Any] = @@ -413,7 +416,7 @@ class HTTPRequestBuilderTests: XCTestCase { } func testXMLRPCUpload() throws { - let file = try XCTUnwrap(Bundle(for: type(of: self)).url(forResource: "me-settings-success", withExtension: "json")) + let file = try XCTUnwrap(Bundle.coreAPITestsBundle.url(forResource: "wp-pages", withExtension: "json")) let fileContentBase64 = try Data(contentsOf: file).base64EncodedString() let fileStream = try XCTUnwrap(InputStream(url: file)) let request = try HTTPRequestBuilder(url: URL(string: "https://w.org/xmlrpc.php")!) diff --git a/WordPressKitTests/Utilities/HTTPRequestHelpers.swift b/Tests/CoreAPITests/HTTPRequestHelpers.swift similarity index 100% rename from WordPressKitTests/Utilities/HTTPRequestHelpers.swift rename to Tests/CoreAPITests/HTTPRequestHelpers.swift diff --git a/WordPressKitTests/Utilities/MultipartFormTests.swift b/Tests/CoreAPITests/MultipartFormTests.swift similarity index 99% rename from WordPressKitTests/Utilities/MultipartFormTests.swift rename to Tests/CoreAPITests/MultipartFormTests.swift index f675261c..9ce456f7 100644 --- a/WordPressKitTests/Utilities/MultipartFormTests.swift +++ b/Tests/CoreAPITests/MultipartFormTests.swift @@ -1,9 +1,11 @@ -import Foundation import Alamofire -import XCTest -import CryptoKit - +#if SWIFT_PACKAGE +@testable import CoreAPI +#else @testable import WordPressKit +#endif +import CryptoKit +import XCTest class MutliparFormDataTests: XCTestCase { struct Form: Codable { diff --git a/WordPressKitTests/WordPressAPI/NonceRetrievalTests.swift b/Tests/CoreAPITests/NonceRetrievalTests.swift similarity index 80% rename from WordPressKitTests/WordPressAPI/NonceRetrievalTests.swift rename to Tests/CoreAPITests/NonceRetrievalTests.swift index 811dad8a..8803b6c7 100644 --- a/WordPressKitTests/WordPressAPI/NonceRetrievalTests.swift +++ b/Tests/CoreAPITests/NonceRetrievalTests.swift @@ -1,8 +1,14 @@ +#if SWIFT_PACKAGE +@testable import CoreAPI +#else +@testable import WordPressKit +#endif import Foundation -import XCTest import OHHTTPStubs - -@testable import WordPressKit +#if SWIFT_PACKAGE +import OHHTTPStubsSwift +#endif +import XCTest class NonceRetrievalTests: XCTestCase { @@ -53,11 +59,12 @@ class NonceRetrievalTests: XCTestCase { } private func stubNewPostPage(nonceScript: String? = nil, statusCode: Int32) { - let script = nonceScript ?? """ - wp.apiFetch.nonceMiddleware = wp.apiFetch.createNonceMiddleware( "\(Self.nonce)" ); - wp.apiFetch.use( wp.apiFetch.nonceMiddleware ); - wp.apiFetch.use( wp.apiFetch.mediaUploadMiddleware ); - """ + let script = + nonceScript ?? """ + wp.apiFetch.nonceMiddleware = wp.apiFetch.createNonceMiddleware( "\(Self.nonce)" ); + wp.apiFetch.use( wp.apiFetch.nonceMiddleware ); + wp.apiFetch.use( wp.apiFetch.mediaUploadMiddleware ); + """ let html = "\n\(script)\n" stub(condition: isAbsoluteURLString(Self.newPostURL.absoluteString)) { _ in HTTPStubsResponse(data: html.data(using: .utf8)!, statusCode: statusCode, headers: nil) @@ -66,7 +73,9 @@ class NonceRetrievalTests: XCTestCase { private func stubAjax(statusCode: Int32) { stub(condition: isAbsoluteURLString(Self.ajaxURL.absoluteString)) { _ in - HTTPStubsResponse(data: (statusCode == 200 ? Self.nonce : "...").data(using: .utf8)!, statusCode: statusCode, headers: nil) + HTTPStubsResponse( + data: (statusCode == 200 ? Self.nonce : "...").data(using: .utf8)!, + statusCode: statusCode, headers: nil) } } diff --git a/WordPressKitTests/Utilities/RSDParserTests.swift b/Tests/CoreAPITests/RSDParserTests.swift similarity index 97% rename from WordPressKitTests/Utilities/RSDParserTests.swift rename to Tests/CoreAPITests/RSDParserTests.swift index d73a3df8..bdd15a26 100644 --- a/WordPressKitTests/Utilities/RSDParserTests.swift +++ b/Tests/CoreAPITests/RSDParserTests.swift @@ -1,8 +1,10 @@ import Foundation import XCTest - +#if SWIFT_PACKAGE +@testable import CoreAPI +#else @testable import WordPressKit - +#endif class RSDParserTests: XCTestCase { func testSuccess() throws { diff --git a/WordPressKitTests/Mock Data/xmlrpc-response-invalid.html b/Tests/CoreAPITests/Stubs/HTML/xmlrpc-response-invalid.html similarity index 100% rename from WordPressKitTests/Mock Data/xmlrpc-response-invalid.html rename to Tests/CoreAPITests/Stubs/HTML/xmlrpc-response-invalid.html diff --git a/WordPressKitTests/Mock Data/xmlrpc-response-mobile-plugin-redirect.html b/Tests/CoreAPITests/Stubs/HTML/xmlrpc-response-mobile-plugin-redirect.html similarity index 100% rename from WordPressKitTests/Mock Data/xmlrpc-response-mobile-plugin-redirect.html rename to Tests/CoreAPITests/Stubs/HTML/xmlrpc-response-mobile-plugin-redirect.html diff --git a/WordPressKitTests/Mock Data/WordPressComAuthenticateWithIDToken2FANeededSuccess.json b/Tests/CoreAPITests/Stubs/JSON/WordPressComAuthenticateWithIDToken2FANeededSuccess.json similarity index 100% rename from WordPressKitTests/Mock Data/WordPressComAuthenticateWithIDToken2FANeededSuccess.json rename to Tests/CoreAPITests/Stubs/JSON/WordPressComAuthenticateWithIDToken2FANeededSuccess.json diff --git a/WordPressKitTests/Mock Data/WordPressComAuthenticateWithIDTokenBearerTokenSuccess.json b/Tests/CoreAPITests/Stubs/JSON/WordPressComAuthenticateWithIDTokenBearerTokenSuccess.json similarity index 100% rename from WordPressKitTests/Mock Data/WordPressComAuthenticateWithIDTokenBearerTokenSuccess.json rename to Tests/CoreAPITests/Stubs/JSON/WordPressComAuthenticateWithIDTokenBearerTokenSuccess.json diff --git a/WordPressKitTests/Mock Data/WordPressComAuthenticateWithIDTokenExistingUserNeedsConnection.json b/Tests/CoreAPITests/Stubs/JSON/WordPressComAuthenticateWithIDTokenExistingUserNeedsConnection.json similarity index 100% rename from WordPressKitTests/Mock Data/WordPressComAuthenticateWithIDTokenExistingUserNeedsConnection.json rename to Tests/CoreAPITests/Stubs/JSON/WordPressComAuthenticateWithIDTokenExistingUserNeedsConnection.json diff --git a/WordPressKitTests/Mock Data/WordPressComOAuthAuthenticateSignature.json b/Tests/CoreAPITests/Stubs/JSON/WordPressComOAuthAuthenticateSignature.json similarity index 100% rename from WordPressKitTests/Mock Data/WordPressComOAuthAuthenticateSignature.json rename to Tests/CoreAPITests/Stubs/JSON/WordPressComOAuthAuthenticateSignature.json diff --git a/WordPressKitTests/Mock Data/WordPressComOAuthNeeds2FAFail.json b/Tests/CoreAPITests/Stubs/JSON/WordPressComOAuthNeeds2FAFail.json similarity index 100% rename from WordPressKitTests/Mock Data/WordPressComOAuthNeeds2FAFail.json rename to Tests/CoreAPITests/Stubs/JSON/WordPressComOAuthNeeds2FAFail.json diff --git a/WordPressKitTests/Mock Data/WordPressComOAuthNeedsWebauthnMFA.json b/Tests/CoreAPITests/Stubs/JSON/WordPressComOAuthNeedsWebauthnMFA.json similarity index 100% rename from WordPressKitTests/Mock Data/WordPressComOAuthNeedsWebauthnMFA.json rename to Tests/CoreAPITests/Stubs/JSON/WordPressComOAuthNeedsWebauthnMFA.json diff --git a/WordPressKitTests/Mock Data/WordPressComOAuthRequestChallenge.json b/Tests/CoreAPITests/Stubs/JSON/WordPressComOAuthRequestChallenge.json similarity index 100% rename from WordPressKitTests/Mock Data/WordPressComOAuthRequestChallenge.json rename to Tests/CoreAPITests/Stubs/JSON/WordPressComOAuthRequestChallenge.json diff --git a/WordPressKitTests/Mock Data/WordPressComOAuthSuccess.json b/Tests/CoreAPITests/Stubs/JSON/WordPressComOAuthSuccess.json similarity index 100% rename from WordPressKitTests/Mock Data/WordPressComOAuthSuccess.json rename to Tests/CoreAPITests/Stubs/JSON/WordPressComOAuthSuccess.json diff --git a/WordPressKitTests/Mock Data/WordPressComOAuthWrongPasswordFail.json b/Tests/CoreAPITests/Stubs/JSON/WordPressComOAuthWrongPasswordFail.json similarity index 100% rename from WordPressKitTests/Mock Data/WordPressComOAuthWrongPasswordFail.json rename to Tests/CoreAPITests/Stubs/JSON/WordPressComOAuthWrongPasswordFail.json diff --git a/WordPressKitTests/Mock Data/WordPressComRestApiFailInvalidInput.json b/Tests/CoreAPITests/Stubs/JSON/WordPressComRestApiFailInvalidInput.json similarity index 100% rename from WordPressKitTests/Mock Data/WordPressComRestApiFailInvalidInput.json rename to Tests/CoreAPITests/Stubs/JSON/WordPressComRestApiFailInvalidInput.json diff --git a/WordPressKitTests/Mock Data/WordPressComRestApiFailInvalidJSON.json b/Tests/CoreAPITests/Stubs/JSON/WordPressComRestApiFailInvalidJSON.json similarity index 100% rename from WordPressKitTests/Mock Data/WordPressComRestApiFailInvalidJSON.json rename to Tests/CoreAPITests/Stubs/JSON/WordPressComRestApiFailInvalidJSON.json diff --git a/WordPressKitTests/Mock Data/WordPressComRestApiFailRequestInvalidToken.json b/Tests/CoreAPITests/Stubs/JSON/WordPressComRestApiFailRequestInvalidToken.json similarity index 100% rename from WordPressKitTests/Mock Data/WordPressComRestApiFailRequestInvalidToken.json rename to Tests/CoreAPITests/Stubs/JSON/WordPressComRestApiFailRequestInvalidToken.json diff --git a/WordPressKitTests/Mock Data/WordPressComRestApiFailThrottled.json b/Tests/CoreAPITests/Stubs/JSON/WordPressComRestApiFailThrottled.json similarity index 100% rename from WordPressKitTests/Mock Data/WordPressComRestApiFailThrottled.json rename to Tests/CoreAPITests/Stubs/JSON/WordPressComRestApiFailThrottled.json diff --git a/WordPressKitTests/Mock Data/WordPressComRestApiFailUnauthorized.json b/Tests/CoreAPITests/Stubs/JSON/WordPressComRestApiFailUnauthorized.json similarity index 100% rename from WordPressKitTests/Mock Data/WordPressComRestApiFailUnauthorized.json rename to Tests/CoreAPITests/Stubs/JSON/WordPressComRestApiFailUnauthorized.json diff --git a/WordPressKitTests/Mock Data/WordPressComRestApiMedia.json b/Tests/CoreAPITests/Stubs/JSON/WordPressComRestApiMedia.json similarity index 100% rename from WordPressKitTests/Mock Data/WordPressComRestApiMedia.json rename to Tests/CoreAPITests/Stubs/JSON/WordPressComRestApiMedia.json diff --git a/WordPressKitTests/Mock Data/WordPressComRestApiMultipleErrors.json b/Tests/CoreAPITests/Stubs/JSON/WordPressComRestApiMultipleErrors.json similarity index 100% rename from WordPressKitTests/Mock Data/WordPressComRestApiMultipleErrors.json rename to Tests/CoreAPITests/Stubs/JSON/WordPressComRestApiMultipleErrors.json diff --git a/WordPressKitTests/Mock Data/WordPressComSocial2FACodeSuccess.json b/Tests/CoreAPITests/Stubs/JSON/WordPressComSocial2FACodeSuccess.json similarity index 100% rename from WordPressKitTests/Mock Data/WordPressComSocial2FACodeSuccess.json rename to Tests/CoreAPITests/Stubs/JSON/WordPressComSocial2FACodeSuccess.json diff --git a/WordPressKitTests/me-settings-success.json b/Tests/CoreAPITests/Stubs/JSON/me-settings-success-.json similarity index 100% rename from WordPressKitTests/me-settings-success.json rename to Tests/CoreAPITests/Stubs/JSON/me-settings-success-.json diff --git a/WordPressKitTests/Mock Data/wp-forbidden.json b/Tests/CoreAPITests/Stubs/JSON/wp-forbidden.json similarity index 100% rename from WordPressKitTests/Mock Data/wp-forbidden.json rename to Tests/CoreAPITests/Stubs/JSON/wp-forbidden.json diff --git a/WordPressKitTests/Mock Data/wp-pages.json b/Tests/CoreAPITests/Stubs/JSON/wp-pages.json similarity index 100% rename from WordPressKitTests/Mock Data/wp-pages.json rename to Tests/CoreAPITests/Stubs/JSON/wp-pages.json diff --git a/WordPressKitTests/Mock Data/wp-reusable-blocks.json b/Tests/CoreAPITests/Stubs/JSON/wp-reusable-blocks.json similarity index 100% rename from WordPressKitTests/Mock Data/wp-reusable-blocks.json rename to Tests/CoreAPITests/Stubs/JSON/wp-reusable-blocks.json diff --git a/WordPressKitTests/Mock Data/xmlrpc-bad-username-password-error.xml b/Tests/CoreAPITests/Stubs/XML-stubs/xmlrpc-bad-username-or-password-error.xml similarity index 100% rename from WordPressKitTests/Mock Data/xmlrpc-bad-username-password-error.xml rename to Tests/CoreAPITests/Stubs/XML-stubs/xmlrpc-bad-username-or-password-error.xml diff --git a/WordPressKitTests/Mock Data/xmlrpc-response-getpost.xml b/Tests/CoreAPITests/Stubs/XML-stubs/xmlrpc-response-getpost.xml similarity index 100% rename from WordPressKitTests/Mock Data/xmlrpc-response-getpost.xml rename to Tests/CoreAPITests/Stubs/XML-stubs/xmlrpc-response-getpost.xml diff --git a/WordPressKitTests/Mock Data/xmlrpc-response-list-methods.xml b/Tests/CoreAPITests/Stubs/XML-stubs/xmlrpc-response-list-methods.xml similarity index 100% rename from WordPressKitTests/Mock Data/xmlrpc-response-list-methods.xml rename to Tests/CoreAPITests/Stubs/XML-stubs/xmlrpc-response-list-methods.xml diff --git a/WordPressKitTests/Utilities/URLSessionHelperTests.swift b/Tests/CoreAPITests/URLSessionHelperTests.swift similarity index 81% rename from WordPressKitTests/Utilities/URLSessionHelperTests.swift rename to Tests/CoreAPITests/URLSessionHelperTests.swift index 9866f397..b170b39f 100644 --- a/WordPressKitTests/Utilities/URLSessionHelperTests.swift +++ b/Tests/CoreAPITests/URLSessionHelperTests.swift @@ -1,8 +1,13 @@ -import Foundation -import XCTest -import OHHTTPStubs - +#if SWIFT_PACKAGE +@testable import CoreAPI +#else @testable import WordPressKit +#endif +import OHHTTPStubs +#if SWIFT_PACKAGE +import OHHTTPStubsSwift +#endif +import XCTest class URLSessionHelperTests: XCTestCase { @@ -16,11 +21,12 @@ class URLSessionHelperTests: XCTestCase { HTTPStubsResponse(error: URLError(.serverCertificateUntrusted)) } - let result = await URLSession.shared.perform(request: .init(url: URL(string: "https://wordpress.org/hello")!), errorType: TestError.self) + let result = await URLSession.shared.perform( + request: .init(url: URL(string: "https://wordpress.org/hello")!), errorType: TestError.self) do { _ = try result.get() XCTFail("The above call should throw") - } catch let WordPressAPIError.connection(error) { + } catch let WordPressAPIError < TestError>.connection(error) { XCTAssertEqual(error.code, URLError.Code.serverCertificateUntrusted) } catch { XCTFail("Unknown error: \(error)") @@ -32,7 +38,8 @@ class URLSessionHelperTests: XCTestCase { HTTPStubsResponse(data: "success".data(using: .utf8)!, statusCode: 200, headers: nil) } - let result = await URLSession.shared.perform(request: .init(url: URL(string: "https://wordpress.org/hello")!), errorType: TestError.self) + let result = await URLSession.shared.perform( + request: .init(url: URL(string: "https://wordpress.org/hello")!), errorType: TestError.self) // The result is a successful result. This line should not throw let response = try result.get() @@ -42,11 +49,13 @@ class URLSessionHelperTests: XCTestCase { func testUnacceptable500() async { stub(condition: isPath("/hello")) { _ in - HTTPStubsResponse(data: "Internal server error".data(using: .utf8)!, statusCode: 500, headers: nil) + HTTPStubsResponse( + data: "Internal server error".data(using: .utf8)!, statusCode: 500, headers: nil) } let result = await URLSession.shared - .perform(request: .init(url: URL(string: "https://wordpress.org/hello")!), errorType: TestError.self) + .perform( + request: .init(url: URL(string: "https://wordpress.org/hello")!), errorType: TestError.self) switch result { case let .failure(.unacceptableStatusCode(response, _)): @@ -78,7 +87,9 @@ class URLSessionHelperTests: XCTestCase { } let result = await URLSession.shared - .perform(request: .init(url: URL(string: "https://wordpress.org/hello")!), errorType: TestError.self) + .perform( + request: .init(url: URL(string: "https://wordpress.org/hello")!), errorType: TestError.self + ) .mapUnacceptableStatusCodeError { response, _ in XCTAssertEqual(response.statusCode, 404) return .postNotFound @@ -116,7 +127,9 @@ class URLSessionHelperTests: XCTestCase { XCTAssertEqual(progress.completedUnitCount, 0) XCTAssertEqual(progress.fractionCompleted, 0) - let _ = await URLSession.shared.perform(request: .init(url: URL(string: "https://wordpress.org/hello")!), fulfilling: progress, errorType: TestError.self) + let _ = await URLSession.shared.perform( + request: .init(url: URL(string: "https://wordpress.org/hello")!), fulfilling: progress, + errorType: TestError.self) XCTAssertEqual(progress.completedUnitCount, 20) XCTAssertEqual(progress.fractionCompleted, 1) } @@ -134,7 +147,9 @@ class URLSessionHelperTests: XCTestCase { progressReported.fulfill() } - let _ = await URLSession.shared.perform(request: .init(url: URL(string: "https://wordpress.org/hello")!), fulfilling: progress, errorType: TestError.self) + let _ = await URLSession.shared.perform( + request: .init(url: URL(string: "https://wordpress.org/hello")!), fulfilling: progress, + errorType: TestError.self) await fulfillment(of: [progressReported], timeout: 0.3) observer.invalidate() } @@ -142,7 +157,8 @@ class URLSessionHelperTests: XCTestCase { func testCancellation() async throws { // Give a slow HTTP request that takes 0.5 second to complete stub(condition: isPath("/hello")) { _ in - let response = HTTPStubsResponse(data: "success".data(using: .utf8)!, statusCode: 200, headers: nil) + let response = HTTPStubsResponse( + data: "success".data(using: .utf8)!, statusCode: 200, headers: nil) response.responseTime = 0.5 return response } @@ -154,7 +170,9 @@ class URLSessionHelperTests: XCTestCase { } // The result should be an cancellation result - let result = await URLSession.shared.perform(request: .init(url: URL(string: "https://wordpress.org/hello")!), fulfilling: progress, errorType: TestError.self) + let result = await URLSession.shared.perform( + request: .init(url: URL(string: "https://wordpress.org/hello")!), fulfilling: progress, + errorType: TestError.self) if case let .failure(.connection(urlError)) = result, urlError.code == .cancelled { // Do nothing } else { @@ -220,11 +238,12 @@ class URLSessionHelperTests: XCTestCase { $0[String(pair[0])] = String(pair[1]) } }["boundary"] - ) + ) let requestBody = try XCTUnwrap(request.httpBody ?? request.httpBodyStream?.readToEnd()) - let expectedBody = "--\(boundary)\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nvalue\r\n--\(boundary)--\r\n" + let expectedBody = + "--\(boundary)\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nvalue\r\n--\(boundary)--\r\n" XCTAssertEqual(String(data: requestBody, encoding: .utf8), expectedBody) } } diff --git a/WordPressKitTests/Utilities/WordPressAPIErrorTests.swift b/Tests/CoreAPITests/WordPressAPIErrorTests.swift similarity index 96% rename from WordPressKitTests/Utilities/WordPressAPIErrorTests.swift rename to Tests/CoreAPITests/WordPressAPIErrorTests.swift index 2af44e4e..fa5cc846 100644 --- a/WordPressKitTests/Utilities/WordPressAPIErrorTests.swift +++ b/Tests/CoreAPITests/WordPressAPIErrorTests.swift @@ -1,6 +1,10 @@ +#if SWIFT_PACKAGE +@testable import CoreAPI +#else +@testable import WordPressKit +#endif import Foundation import XCTest -@testable import WordPressKit class WordPressAPIErrorTests: XCTestCase { diff --git a/WordPressKitTests/WordPressComOAuthClientTests.swift b/Tests/CoreAPITests/WordPressComOAuthClientTests.swift similarity index 57% rename from WordPressKitTests/WordPressComOAuthClientTests.swift rename to Tests/CoreAPITests/WordPressComOAuthClientTests.swift index 1559e5c8..9715ac6d 100644 --- a/WordPressKitTests/WordPressComOAuthClientTests.swift +++ b/Tests/CoreAPITests/WordPressComOAuthClientTests.swift @@ -1,18 +1,27 @@ +#if SWIFT_PACKAGE +@testable import CoreAPI +#else +@testable import WordPressKit +#endif import Foundation -import XCTest import OHHTTPStubs - -@testable import WordPressKit +#if SWIFT_PACKAGE +import OHHTTPStubsSwift +#endif +import XCTest class WordPressComOAuthClientTests: XCTestCase { enum OAuthURL: String { case oAuthTokenUrl = "https://public-api.wordpress.com/oauth2/token" case socialLoginNewSMS2FA = "https://wordpress.com/wp-login.php?action=send-sms-code-endpoint" - case socialLogin2FA = "https://wordpress.com/wp-login.php?action=two-step-authentication-endpoint&version=1.0" + case socialLogin2FA = + "https://wordpress.com/wp-login.php?action=two-step-authentication-endpoint&version=1.0" case socialLogin = "https://wordpress.com/wp-login.php?action=social-login-endpoint&version=1.0" - case requestWebauthnChallenge = "https://wordpress.com/wp-login.php?action=webauthn-challenge-endpoint" - case verifySignature = "https://wordpress.com/wp-login.php?action=webauthn-authentication-endpoint" + case requestWebauthnChallenge = + "https://wordpress.com/wp-login.php?action=webauthn-challenge-endpoint" + case verifySignature = + "https://wordpress.com/wp-login.php?action=webauthn-authentication-endpoint" } override func tearDown() { @@ -26,10 +35,14 @@ class WordPressComOAuthClientTests: XCTestCase { } } - func testAuthenticateUsernameNo2FASuccessCase() { + func testAuthenticateUsernameNo2FASuccessCase() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComOAuthSuccess.json", Bundle.coreAPITestsBundle) + ) stub(condition: isOauthTokenRequest(url: .oAuthTokenUrl)) { _ in - let stubPath = OHPathForFile("WordPressComOAuthSuccess.json", type(of: self)) - return fixture(filePath: stubPath!, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) + return fixture( + filePath: stubPath, headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) } let expect = expectation(description: "One callback should be invoked") @@ -52,10 +65,14 @@ class WordPressComOAuthClientTests: XCTestCase { waitForExpectations(timeout: 2, handler: nil) } - func testAuthenticateUsernameNo2FASuccessCase_withMFAClosure() { + func testAuthenticateUsernameNo2FASuccessCase_withMFAClosure() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComOAuthSuccess.json", Bundle.coreAPITestsBundle) + ) stub(condition: isOauthTokenRequest(url: .oAuthTokenUrl)) { _ in - let stubPath = OHPathForFile("WordPressComOAuthSuccess.json", type(of: self)) - return fixture(filePath: stubPath!, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) + return fixture( + filePath: stubPath, headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) } let expect = expectation(description: "One callback should be invoked") @@ -81,10 +98,16 @@ class WordPressComOAuthClientTests: XCTestCase { waitForExpectations(timeout: 2, handler: nil) } - func testAuthenticateUsernameNo2FAFailureWrongPasswordCase() { + func testAuthenticateUsernameNo2FAFailureWrongPasswordCase() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComOAuthWrongPasswordFail.json", Bundle.coreAPITestsBundle) + ) stub(condition: isOauthTokenRequest(url: .oAuthTokenUrl)) { _ in - let stubPath = OHPathForFile("WordPressComOAuthWrongPasswordFail.json", type(of: self)) - return fixture(filePath: stubPath!, status: 400, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) + return fixture( + filePath: stubPath, + status: 400, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) } let expect = expectation(description: "One callback should be invoked") @@ -100,16 +123,23 @@ class WordPressComOAuthClientTests: XCTestCase { }, failure: { (error) in expect.fulfill() - XCTAssertEqual(error.authenticationFailureKind, .invalidRequest, "The code should be invalid request") + XCTAssertEqual( + error.authenticationFailureKind, .invalidRequest, "The code should be invalid request") } ) waitForExpectations(timeout: 2, handler: nil) } - func testAuthenticateUsernameNo2FAFailureWrongPasswordCase_withMFAClosure() { + func testAuthenticateUsernameNo2FAFailureWrongPasswordCase_withMFAClosure() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComOAuthWrongPasswordFail.json", Bundle.coreAPITestsBundle) + ) stub(condition: isOauthTokenRequest(url: .oAuthTokenUrl)) { _ in - let stubPath = OHPathForFile("WordPressComOAuthWrongPasswordFail.json", type(of: self)) - return fixture(filePath: stubPath!, status: 400, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) + return fixture( + filePath: stubPath, + status: 400, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) } let expect = expectation(description: "One callback should be invoked") @@ -128,16 +158,23 @@ class WordPressComOAuthClientTests: XCTestCase { }, failure: { (error) in expect.fulfill() - XCTAssertEqual(error.authenticationFailureKind, .invalidRequest, "The code should be invalid request") + XCTAssertEqual( + error.authenticationFailureKind, .invalidRequest, "The code should be invalid request") } ) waitForExpectations(timeout: 2, handler: nil) } - func testAuthenticateUsername2FAWrong2FACase() { + func testAuthenticateUsername2FAWrong2FACase() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComOAuthNeeds2FAFail.json", Bundle.coreAPITestsBundle) + ) stub(condition: isOauthTokenRequest(url: .oAuthTokenUrl)) { _ in - let stubPath = OHPathForFile("WordPressComOAuthNeeds2FAFail.json", type(of: self)) - return fixture(filePath: stubPath!, status: 400, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) + return fixture( + filePath: stubPath, + status: 400, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) } let expect = expectation(description: "Call should complete") @@ -153,7 +190,9 @@ class WordPressComOAuthClientTests: XCTestCase { }, failure: { (error) in expect.fulfill() - XCTAssertEqual(error.authenticationFailureKind, .needsMultifactorCode, "The code should 'be needs multifactor'") + XCTAssertEqual( + error.authenticationFailureKind, .needsMultifactorCode, + "The code should 'be needs multifactor'") } ) waitForExpectations(timeout: 2, handler: nil) @@ -173,16 +212,24 @@ class WordPressComOAuthClientTests: XCTestCase { }, failure: { (error) in expectation2.fulfill() - XCTAssertEqual(error.authenticationFailureKind, .needsMultifactorCode, "The code should be needs multifactor") + XCTAssertEqual( + error.authenticationFailureKind, .needsMultifactorCode, + "The code should be needs multifactor") } ) waitForExpectations(timeout: 2, handler: nil) } - func testAuthenticateUsername2FAWrong2FACase_withMFAClosure() { + func testAuthenticateUsername2FAWrong2FACase_withMFAClosure() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComOAuthNeeds2FAFail.json", Bundle.coreAPITestsBundle) + ) stub(condition: isOauthTokenRequest(url: .oAuthTokenUrl)) { _ in - let stubPath = OHPathForFile("WordPressComOAuthNeeds2FAFail.json", type(of: self)) - return fixture(filePath: stubPath!, status: 400, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) + return fixture( + filePath: stubPath, + status: 400, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) } let expect = expectation(description: "Call should complete") @@ -201,7 +248,9 @@ class WordPressComOAuthClientTests: XCTestCase { }, failure: { (error) in expect.fulfill() - XCTAssertEqual(error.authenticationFailureKind, .needsMultifactorCode, "The code should be needs multifactor") + XCTAssertEqual( + error.authenticationFailureKind, .needsMultifactorCode, + "The code should be needs multifactor") } ) waitForExpectations(timeout: 2, handler: nil) @@ -221,16 +270,23 @@ class WordPressComOAuthClientTests: XCTestCase { }, failure: { (error) in expectation2.fulfill() - XCTAssertEqual(error.authenticationFailureKind, .needsMultifactorCode, "The code should be needs multifactor") + XCTAssertEqual( + error.authenticationFailureKind, .needsMultifactorCode, + "The code should be needs multifactor") } ) waitForExpectations(timeout: 2, handler: nil) } - func testAuthenticateUsernameRequiresWebauthnMultifactorAuthentication() { + func testAuthenticateUsernameRequiresWebauthnMultifactorAuthentication() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComOAuthNeedsWebauthnMFA.json", Bundle.coreAPITestsBundle) + ) stub(condition: isOauthTokenRequest(url: .oAuthTokenUrl)) { _ in - let stubPath = OHPathForFile("WordPressComOAuthNeedsWebauthnMFA.json", type(of: self)) - return fixture(filePath: stubPath!, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) + return fixture( + filePath: stubPath, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) } let expect = expectation(description: "Call should complete") @@ -256,50 +312,66 @@ class WordPressComOAuthClientTests: XCTestCase { waitForExpectations(timeout: 2, handler: nil) } - func testRequestOneTimeCodeWithUsername() { + func testRequestOneTimeCodeWithUsername() throws { + let stubPath = try XCTUnwrap(OHPathForFileInBundle("WordPressComOAuthNeeds2FAFail.json", Bundle.coreAPITestsBundle)) stub(condition: isOauthTokenRequest(url: .oAuthTokenUrl)) { _ in - let stubPath = OHPathForFile("WordPressComOAuthNeeds2FAFail.json", type(of: self)) - return fixture(filePath: stubPath!, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) + return fixture( + filePath: stubPath, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) } let expect = expectation(description: "One callback should be invoked") let client = WordPressComOAuthClient(clientID: "Fake", secret: "Fake") - client.requestOneTimeCode(username: "fakeUser", password: "fakePassword", - success: { () in - expect.fulfill() - }, failure: { (_) in - expect.fulfill() - XCTFail("This call should be successful") - - }) + client.requestOneTimeCode( + username: "fakeUser", password: "fakePassword", + success: { () in + expect.fulfill() + }, + failure: { (_) in + expect.fulfill() + XCTFail("This call should be successful") + + }) waitForExpectations(timeout: 2, handler: nil) } - func testRequestSocial2FACodeWithUserID() { + func testRequestSocial2FACodeWithUserID() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComSocial2FACodeSuccess.json", Bundle.coreAPITestsBundle) + ) stub(condition: isOauthTokenRequest(url: .socialLoginNewSMS2FA)) { _ in - let stubPath = OHPathForFile("WordPressComSocial2FACodeSuccess.json", type(of: self)) - return fixture(filePath: stubPath!, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) + return fixture( + filePath: stubPath, headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) } let expect = expectation(description: "One callback should be invoked") let client = WordPressComOAuthClient(clientID: "Fake", secret: "Fake") - client.requestSocial2FACode(userID: 0, nonce: "nonce", - success: { (newNonce) in - expect.fulfill() - XCTAssert(!newNonce.isEmpty, "There should be a newNonce available") - XCTAssert(newNonce == "two_step_nonce_sms", "The newNonce should match") - }, failure: { (_, _) in - expect.fulfill() - XCTFail("This call should be successful") - - }) + client.requestSocial2FACode( + userID: 0, nonce: "nonce", + success: { (newNonce) in + expect.fulfill() + XCTAssert(!newNonce.isEmpty, "There should be a newNonce available") + XCTAssert(newNonce == "two_step_nonce_sms", "The newNonce should match") + }, + failure: { (_, _) in + expect.fulfill() + XCTFail("This call should be successful") + + }) waitForExpectations(timeout: 2, handler: nil) } - func testAuthenticateWithIDToken() { + func testAuthenticateWithIDToken() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComAuthenticateWithIDTokenBearerTokenSuccess.json", Bundle.coreAPITestsBundle) + ) stub(condition: isOauthTokenRequest(url: .socialLogin)) { _ in - let stubPath = OHPathForFile("WordPressComAuthenticateWithIDTokenBearerTokenSuccess.json", type(of: self)) - return fixture(filePath: stubPath!, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) + return fixture( + filePath: stubPath, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) } let expect = expectation(description: "One callback should be invoked") @@ -329,10 +401,15 @@ class WordPressComOAuthClientTests: XCTestCase { waitForExpectations(timeout: 2, handler: nil) } - func testAuthenticateWithIDToken2FANeeded() { + func testAuthenticateWithIDToken2FANeeded() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComAuthenticateWithIDToken2FANeededSuccess.json", Bundle.coreAPITestsBundle) + ) stub(condition: isOauthTokenRequest(url: .socialLogin)) { _ in - let stubPath = OHPathForFile("WordPressComAuthenticateWithIDToken2FANeededSuccess.json", type(of: self)) - return fixture(filePath: stubPath!, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) + return fixture( + filePath: stubPath, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) } let expect = expectation(description: "One callback should be invoked") @@ -363,10 +440,15 @@ class WordPressComOAuthClientTests: XCTestCase { waitForExpectations(timeout: 2, handler: nil) } - func testAuthenticateWithIDTokenUserNeedsConnection() { + func testAuthenticateWithIDTokenUserNeedsConnection() throws { + let stubPath = try XCTUnwrap( OHPathForFileInBundle("WordPressComAuthenticateWithIDTokenExistingUserNeedsConnection.json", Bundle.coreAPITestsBundle) + ) stub(condition: isOauthTokenRequest(url: .socialLogin)) { _ in - let stubPath = OHPathForFile("WordPressComAuthenticateWithIDTokenExistingUserNeedsConnection.json", type(of: self)) - return fixture(filePath: stubPath!, status: 400, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) + return fixture( + filePath: stubPath, + status: 400, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) } let expect = expectation(description: "One callback should be invoked") @@ -395,71 +477,95 @@ class WordPressComOAuthClientTests: XCTestCase { waitForExpectations(timeout: 2, handler: nil) } - func testAuthenticateSocialLoginUser() { + func testAuthenticateSocialLoginUser() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComAuthenticateWithIDTokenBearerTokenSuccess.json", Bundle.coreAPITestsBundle) + ) stub(condition: isOauthTokenRequest(url: .socialLogin2FA)) { _ in - let stubPath = OHPathForFile("WordPressComAuthenticateWithIDTokenBearerTokenSuccess.json", type(of: self)) - return fixture(filePath: stubPath!, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) + return fixture( + filePath: stubPath, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) } let expect = expectation(description: "One callback should be invoked") let client = WordPressComOAuthClient(clientID: "Fake", secret: "Fake") - client.authenticate(socialLoginUserID: 1, authType: "authenticator", twoStepCode: "two_step_code", twoStepNonce: "two_step_nonce", - success: { (token) in - expect.fulfill() - XCTAssert(!token!.isEmpty, "There should be a token available") - XCTAssert(token == "bearer_token", "The newNonce should match") - }, failure: { (_) in - expect.fulfill() - XCTFail("This call should be successful") - - }) + client.authenticate( + socialLoginUserID: 1, authType: "authenticator", twoStepCode: "two_step_code", + twoStepNonce: "two_step_nonce", + success: { (token) in + expect.fulfill() + XCTAssert(!token!.isEmpty, "There should be a token available") + XCTAssert(token == "bearer_token", "The newNonce should match") + }, + failure: { (_) in + expect.fulfill() + XCTFail("This call should be successful") + + }) waitForExpectations(timeout: 2, handler: nil) } - func testRequestWebauthnChallengeReturnsCompleteChallengeInfo() { + func testRequestWebauthnChallengeReturnsCompleteChallengeInfo() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComOAuthRequestChallenge.json", Bundle.coreAPITestsBundle) + ) stub(condition: isOauthTokenRequest(url: .requestWebauthnChallenge)) { _ in - let stubPath = OHPathForFile("WordPressComOAuthRequestChallenge.json", type(of: self)) - return fixture(filePath: stubPath!, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) + return fixture( + filePath: stubPath, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) } let expect = expectation(description: "One callback should be invoked") let client = WordPressComOAuthClient(clientID: "Fake", secret: "Fake") - client.requestWebauthnChallenge(userID: 123, twoStepNonce: "twoStepNonce", success: { challengeInfo in - expect.fulfill() - let expectedChallengeInfo = WebauthnChallengeInfo(challenge: "challenge", rpID: "wordpress.com", twoStepNonce: "two_step_nonce", allowedCredentialIDs: ["credential-id, credential-id-2"]) - XCTAssertEqual(challengeInfo.challenge, expectedChallengeInfo.challenge) - XCTAssertEqual(challengeInfo.rpID, expectedChallengeInfo.rpID) - XCTAssertEqual(challengeInfo.twoStepNonce, expectedChallengeInfo.twoStepNonce) - }, failure: { _ in - expect.fulfill() - XCTFail("This call should be successful") - }) + client.requestWebauthnChallenge( + userID: 123, twoStepNonce: "twoStepNonce", + success: { challengeInfo in + expect.fulfill() + let expectedChallengeInfo = WebauthnChallengeInfo( + challenge: "challenge", rpID: "wordpress.com", twoStepNonce: "two_step_nonce", + allowedCredentialIDs: ["credential-id, credential-id-2"]) + XCTAssertEqual(challengeInfo.challenge, expectedChallengeInfo.challenge) + XCTAssertEqual(challengeInfo.rpID, expectedChallengeInfo.rpID) + XCTAssertEqual(challengeInfo.twoStepNonce, expectedChallengeInfo.twoStepNonce) + }, + failure: { _ in + expect.fulfill() + XCTFail("This call should be successful") + }) waitForExpectations(timeout: 2, handler: nil) } - func testAuthenticateWebauthSignatureReturnsOauthToken() { + func testAuthenticateWebauthSignatureReturnsOauthToken() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComOAuthAuthenticateSignature.json", Bundle.coreAPITestsBundle) + ) stub(condition: isOauthTokenRequest(url: .verifySignature)) { _ in - let stubPath = OHPathForFile("WordPressComOAuthAuthenticateSignature.json", type(of: self)) - return fixture(filePath: stubPath!, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) + return fixture( + filePath: stubPath, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) } let expect = expectation(description: "One callback should be invoked") let client = WordPressComOAuthClient(clientID: "Fake", secret: "Fake") - client.authenticateWebauthnSignature(userID: 123, - twoStepNonce: "twoStepNOnce", - credentialID: "credential-id".data(using: .utf8) ?? Data(), - clientDataJson: "{}".data(using: .utf8) ?? Data(), - authenticatorData: "authenticator-data".data(using: .utf8) ?? Data(), - signature: "signature".data(using: .utf8) ?? Data(), - userHandle: "user-handle".data(using: .utf8) ?? Data(), - success: { token in - expect.fulfill() - XCTAssertEqual(token, "bearer_token") - }, - failure: { _ in - expect.fulfill() - XCTFail("This call should be successful") - }) + client.authenticateWebauthnSignature( + userID: 123, + twoStepNonce: "twoStepNOnce", + credentialID: "credential-id".data(using: .utf8) ?? Data(), + clientDataJson: "{}".data(using: .utf8) ?? Data(), + authenticatorData: "authenticator-data".data(using: .utf8) ?? Data(), + signature: "signature".data(using: .utf8) ?? Data(), + userHandle: "user-handle".data(using: .utf8) ?? Data(), + success: { token in + expect.fulfill() + XCTAssertEqual(token, "bearer_token") + }, + failure: { _ in + expect.fulfill() + XCTFail("This call should be successful") + }) waitForExpectations(timeout: 2, handler: nil) } } diff --git a/WordPressKitTests/WordPressComRestApiTests+Error.swift b/Tests/CoreAPITests/WordPressComRestApiTests+Error.swift similarity index 92% rename from WordPressKitTests/WordPressComRestApiTests+Error.swift rename to Tests/CoreAPITests/WordPressComRestApiTests+Error.swift index b8d3a58b..c7686da9 100644 --- a/WordPressKitTests/WordPressComRestApiTests+Error.swift +++ b/Tests/CoreAPITests/WordPressComRestApiTests+Error.swift @@ -1,8 +1,11 @@ +#if SWIFT_PACKAGE +@testable import CoreAPI +#else +@testable import WordPressKit +#endif import Foundation import XCTest -@testable import WordPressKit - class WordPressComRestApiErrorTests: XCTestCase { func testNSErrorBridging() { diff --git a/WordPressKitTests/WordPressComRestApiTests+Locale.swift b/Tests/CoreAPITests/WordPressComRestApiTests+Locale.swift similarity index 62% rename from WordPressKitTests/WordPressComRestApiTests+Locale.swift rename to Tests/CoreAPITests/WordPressComRestApiTests+Locale.swift index 2c5aa658..117dc885 100644 --- a/WordPressKitTests/WordPressComRestApiTests+Locale.swift +++ b/Tests/CoreAPITests/WordPressComRestApiTests+Locale.swift @@ -1,18 +1,25 @@ -import Foundation -import XCTest +#if SWIFT_PACKAGE +@testable import CoreAPI +#else +@testable import WordPressKit +#endif import OHHTTPStubs - +#if SWIFT_PACKAGE +import OHHTTPStubsSwift +#endif import WordPressShared -@testable import WordPressKit +import XCTest extension WordPressComRestApiTests { func testAddsLocaleToURLQueryByDefault() async throws { var request: URLRequest? - stub(condition: { _ in true }, response: { - request = $0 - return HTTPStubsResponse(error: URLError(.networkConnectionLost)) - }) + stub( + condition: { _ in true }, + response: { + request = $0 + return HTTPStubsResponse(error: URLError(.networkConnectionLost)) + }) let api = WordPressComRestApi() let _ = await api.perform(.get, URLString: "/path/path") @@ -23,10 +30,12 @@ extension WordPressComRestApiTests { func testAddsLocaleToURLQueryByDefaultAndMaintainsInputParameters() async throws { var request: URLRequest? - stub(condition: { _ in true }, response: { - request = $0 - return HTTPStubsResponse(error: URLError(.networkConnectionLost)) - }) + stub( + condition: { _ in true }, + response: { + request = $0 + return HTTPStubsResponse(error: URLError(.networkConnectionLost)) + }) let path = "/path/path" let params: [String: AnyObject] = [ @@ -43,10 +52,12 @@ extension WordPressComRestApiTests { func testThatLocaleIsNotAppendedIfAlreadyIncludedInPath() async { var request: URLRequest? - stub(condition: { _ in true }, response: { - request = $0 - return HTTPStubsResponse(error: URLError(.networkConnectionLost)) - }) + stub( + condition: { _ in true }, + response: { + request = $0 + return HTTPStubsResponse(error: URLError(.networkConnectionLost)) + }) let api = WordPressComRestApi() let _ = await api.perform(.get, URLString: "/path?locale=foo") @@ -56,23 +67,28 @@ extension WordPressComRestApiTests { func testThatAppendingLocaleIgnoresIfAlreadyIncludedInRequestParameters() async throws { var request: URLRequest? - stub(condition: { _ in true }, response: { - request = $0 - return HTTPStubsResponse(error: URLError(.networkConnectionLost)) - }) + stub( + condition: { _ in true }, + response: { + request = $0 + return HTTPStubsResponse(error: URLError(.networkConnectionLost)) + }) let api = WordPressComRestApi() - let _ = await api.perform(.get, URLString: "/path", parameters: ["locale": "foo"] as [String: AnyObject]) + let _ = await api.perform( + .get, URLString: "/path", parameters: ["locale": "foo"] as [String: AnyObject]) try XCTAssertEqual(XCTUnwrap(request?.url?.query), "locale=foo") } func testThatLocaleIsNotAppendedWhenDisabled() async { var request: URLRequest? - stub(condition: { _ in true }, response: { - request = $0 - return HTTPStubsResponse(error: URLError(.networkConnectionLost)) - }) + stub( + condition: { _ in true }, + response: { + request = $0 + return HTTPStubsResponse(error: URLError(.networkConnectionLost)) + }) let api = WordPressComRestApi() api.appendsPreferredLanguageLocale = false @@ -84,10 +100,12 @@ extension WordPressComRestApiTests { func testThatAlternateLocaleKeyIsHonoredWhenSpecified() async { var request: URLRequest? - stub(condition: { _ in true }, response: { - request = $0 - return HTTPStubsResponse(error: URLError(.networkConnectionLost)) - }) + stub( + condition: { _ in true }, + response: { + request = $0 + return HTTPStubsResponse(error: URLError(.networkConnectionLost)) + }) let api = WordPressComRestApi(localeKey: "foo") diff --git a/Tests/CoreAPITests/WordPressComRestApiTests.swift b/Tests/CoreAPITests/WordPressComRestApiTests.swift new file mode 100644 index 00000000..b049caf2 --- /dev/null +++ b/Tests/CoreAPITests/WordPressComRestApiTests.swift @@ -0,0 +1,684 @@ +#if SWIFT_PACKAGE +@testable import CoreAPI +#else +@testable import WordPressKit +#endif +import OHHTTPStubs +#if SWIFT_PACKAGE +import OHHTTPStubsSwift +#endif +import WordPressShared +import XCTest + +class WordPressComRestApiTests: XCTestCase { + + let scheme = "https" + let host = "public-api.wordpress.com" + let wordPressMediaRoutePath = "/rest/v1.1/sites/0/media/" + let wordPressMediaNewEndpointPath = "/rest/v1.1/sites/0/media/new" + + override func setUp() { + super.setUp() + } + + override func tearDown() { + super.tearDown() + HTTPStubs.removeAllStubs() + } + + private func isRestAPIRequest() -> HTTPStubsTestBlock { + return { request in + guard let requestURL = request.url, + let components = URLComponents(string: requestURL.absoluteString) + else { + return false + } + + let expectedScheme = self.scheme + let actualScheme = components.scheme + + let expectedHost = self.host + let actualHost = components.host + + let expectedPath = self.wordPressMediaRoutePath + let actualPath = components.path + + let result = + expectedScheme == actualScheme && expectedHost == actualHost && expectedPath == actualPath + return result + } + } + + private func isRestAPIMediaNewRequest() -> HTTPStubsTestBlock { + return { request in + guard let requestURL = request.url, + let components = URLComponents(string: requestURL.absoluteString) + else { + return false + } + + let expectedScheme = self.scheme + let actualScheme = components.scheme + + let expectedHost = self.host + let actualHost = components.host + + let expectedPath = self.wordPressMediaNewEndpointPath + let actualPath = components.path + + let result = + expectedScheme == actualScheme && expectedHost == actualHost && expectedPath == actualPath + return result + } + } + + func testHTTPMethod() async { + for method in HTTPRequestBuilder.Method.allCases { + let requestReceived = expectation(description: "HTTP request is received") + + var request: URLRequest? + stub(condition: { _ in true }) { + request = $0 + requestReceived.fulfill() + return HTTPStubsResponse(error: URLError(URLError.Code.networkConnectionLost)) + } + + let api = WordPressComRestApi(oAuthToken: "fakeToken") + _ = await api.perform(method, URLString: "test") + await fulfillment(of: [requestReceived], timeout: 0.3) + + XCTAssertEqual(request?.httpMethod?.uppercased(), method.rawValue.uppercased()) + } + } + + @available(iOS 16.0, *) + func testQuery() { + var requestURL: URL? + stub(condition: isRestAPIRequest()) { + requestURL = $0.url + return HTTPStubsResponse(error: URLError(URLError.Code.networkConnectionLost)) + } + + let expect = self.expectation(description: "One callback should be invoked") + let api = WordPressComRestApi(oAuthToken: "fakeToken") + api.GET( + wordPressMediaRoutePath, + parameters: HTTPRequestBuilderTests.nestedParameters as [String: AnyObject], + success: { _, _ in expect.fulfill() }, + failure: { (_, _) in expect.fulfill() } + ) + wait(for: [expect], timeout: 0.3) + + let query = + requestURL? + .query(percentEncoded: false)? + .split(separator: "&") + .reduce(into: Set()) { $0.insert(String($1)) } + ?? [] + let expected = HTTPRequestBuilderTests.nestedParametersEncoded + ["locale=en"] + + XCTAssertEqual(query.count, expected.count) + + for item in expected { + XCTAssertTrue(query.contains(item), "Missing query item: \(item)") + } + } + + func testSuccessfullCall() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComRestApiMedia.json", Bundle.coreAPITestsBundle) + ) + stub(condition: isRestAPIRequest()) { _ in + return fixture( + filePath: stubPath, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) + } + + let expect = self.expectation(description: "One callback should be invoked") + let api = WordPressComRestApi(oAuthToken: "fakeToken") + api.GET( + wordPressMediaRoutePath, parameters: nil, + success: { (responseObject: AnyObject, _: HTTPURLResponse?) in + expect.fulfill() + XCTAssert(responseObject is [String: AnyObject], "The response should be a dictionary") + }, + failure: { (_, _) in + expect.fulfill() + XCTFail("This call should be successfull") + } + ) + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testBaseUrl() async throws { + var request: URLRequest? + stub( + condition: { _ in true }, + response: { + request = $0 + return HTTPStubsResponse(error: URLError(.networkConnectionLost)) + }) + + let defaultApi = WordPressComRestApi() + XCTAssertEqual(defaultApi.baseURL.absoluteString, "https://public-api.wordpress.com/") + let _ = await defaultApi.perform(.get, URLString: "/path") + try XCTAssertTrue( + XCTUnwrap(request?.url?.absoluteString).hasPrefix("https://public-api.wordpress.com/path")) + + let localhostApi = WordPressComRestApi(baseURL: URL(string: "http://localhost:8080")!) + XCTAssertEqual(localhostApi.baseURL.absoluteString, "http://localhost:8080") + let _ = await localhostApi.perform(.get, URLString: "/local") + try XCTAssertTrue( + XCTUnwrap(request?.url?.absoluteString).hasPrefix("http://localhost:8080/local")) + } + + func testURLStringWithQuery() async { + let requestReceived = expectation(description: "HTTP request is received") + + var request: URLRequest? + stub(condition: { _ in true }) { + request = $0 + requestReceived.fulfill() + return HTTPStubsResponse(error: URLError(URLError.Code.networkConnectionLost)) + } + + let api = WordPressComRestApi(oAuthToken: "fakeToken") + _ = await api.perform(.get, URLString: "test?arg=value") + await fulfillment(of: [requestReceived], timeout: 0.3) + + XCTAssertEqual(request?.url?.path, "/test") + XCTAssertTrue(request?.url?.query?.contains("arg=value") == true) + } + + func testInvalidTokenFailedCall() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComRestApiFailRequestInvalidToken.json", Bundle.coreAPITestsBundle) + ) + stub(condition: isRestAPIRequest()) { _ in + return fixture( + filePath: stubPath, + status: 400, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) + } + + let expect = self.expectation(description: "One callback should be invoked") + let api = WordPressComRestApi(oAuthToken: "fakeToken") + api.GET( + wordPressMediaRoutePath, parameters: nil, + success: { (_: AnyObject, _: HTTPURLResponse?) in + expect.fulfill() + XCTFail("This call should fail") + }, + failure: { (error, _) in + expect.fulfill() + XCTAssert( + error.domain == "WordPressKit.WordPressComRestApiError", + "The error should a WordPressComRestApiError") + XCTAssert( + error.code == Int(WordPressComRestApiErrorCode.invalidToken.rawValue), + "The error code should be invalid token") + }) + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testInvalidJSONReceivedFailedCall() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComRestApiFailInvalidJSON.json", Bundle.coreAPITestsBundle) + ) + stub(condition: isRestAPIRequest()) { _ in + return fixture( + filePath: stubPath, + status: 200, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) + } + + let expect = self.expectation(description: "One callback should be invoked") + let api = WordPressComRestApi(oAuthToken: "fakeToken") + api.GET( + wordPressMediaRoutePath, parameters: nil, + success: { (_: AnyObject, _: HTTPURLResponse?) in + expect.fulfill() + XCTFail("This call should fail") + }, + failure: { (error, _) in + expect.fulfill() + XCTAssert( + error.domain == WordPressComRestApiErrorDomain, + "The error domain should be WordPressComRestApiErrorDomain") + XCTAssert( + error.code == Int(WordPressComRestApiErrorCode.responseSerializationFailed.rawValue), + "The code should be invalid response serialization") + }) + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testInvalidJSONSentFailedCall() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComRestApiFailInvalidInput.json", Bundle.coreAPITestsBundle) + ) + stub(condition: isRestAPIMediaNewRequest()) { _ in + return fixture( + filePath: stubPath, + status: 400, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) + } + + let expect = self.expectation(description: "One callback should be invoked") + let api = WordPressComRestApi(oAuthToken: "fakeToken") + api.POST( + wordPressMediaNewEndpointPath, parameters: nil, + success: { (_: AnyObject, _: HTTPURLResponse?) in + expect.fulfill() + XCTFail("This call should fail") + }, + failure: { (error, _) in + expect.fulfill() + XCTAssert( + error.domain == "WordPressKit.WordPressComRestApiError", + "The error domain should be WordPressComRestApiError") + XCTAssert( + error.code == Int(WordPressComRestApiErrorCode.invalidInput.rawValue), + "The error code should be invalid input") + }) + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testUnauthorizedFailedCall() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComRestApiFailUnauthorized.json", Bundle.coreAPITestsBundle) + ) + stub(condition: isRestAPIMediaNewRequest()) { _ in + return fixture( + filePath: stubPath, + status: 403, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) + } + + let expect = self.expectation(description: "One callback should be invoked") + let api = WordPressComRestApi(oAuthToken: "fakeToken") + api.POST( + wordPressMediaNewEndpointPath, parameters: nil, + success: { (_: AnyObject, _: HTTPURLResponse?) in + expect.fulfill() + XCTFail("This call should fail") + }, + failure: { (error, _) in + expect.fulfill() + XCTAssert( + error.domain == "WordPressKit.WordPressComRestApiError", + "The error domain should be WordPressComRestApiError") + XCTAssert( + error.code == Int(WordPressComRestApiErrorCode.authorizationRequired.rawValue), + "The error code should be AuthorizationRequired") + }) + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testMultipleErrorsFailedCall() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComRestApiMultipleErrors.json", Bundle.coreAPITestsBundle) + ) + stub(condition: isRestAPIMediaNewRequest()) { _ in + return fixture( + filePath: stubPath, + status: 403, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) + } + + let expect = self.expectation(description: "One callback should be invoked") + let api = WordPressComRestApi(oAuthToken: "fakeToken") + api.POST( + wordPressMediaNewEndpointPath, parameters: nil, + success: { (_: AnyObject, _: HTTPURLResponse?) in + expect.fulfill() + XCTFail("This call should fail") + }, + failure: { (error, _) in + expect.fulfill() + XCTAssert( + error.domain == "WordPressKit.WordPressComRestApiError", + "The error domain should be WordPressComRestApiError") + XCTAssert( + error.code == Int(WordPressComRestApiErrorCode.uploadFailed.rawValue), + "The error code should be AuthorizationRequired") + }) + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testMultipleErrorsFailedMultiPartPostCall() throws { + let stubPath = try XCTUnwrap(OHPathForFileInBundle("WordPressComRestApiMultipleErrors.json", Bundle.coreAPITestsBundle)) + stub(condition: isRestAPIMediaNewRequest()) { _ in + return fixture( + filePath: stubPath, + status: 403, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) + } + + let expect = self.expectation(description: "One callback should be invoked") + let api = WordPressComRestApi(oAuthToken: "fakeToken") + api.multipartPOST( + wordPressMediaNewEndpointPath, parameters: nil, fileParts: [], + success: { (_: AnyObject, _: HTTPURLResponse?) in + expect.fulfill() + XCTFail("This call should fail") + }, + failure: { (error, _) in + expect.fulfill() + XCTAssert( + error.domain == "WordPressKit.WordPressComRestApiError", + "The error domain should be WordPressComRestApiError") + XCTAssert( + error.code == Int(WordPressComRestApiErrorCode.uploadFailed.rawValue), + "The error code should be AuthorizationRequired") + }) + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testStreamMethodCallWithInvalidFile() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComRestApiMedia.json", Bundle.coreAPITestsBundle) + ) + stub(condition: isRestAPIMediaNewRequest()) { _ in + return fixture( + filePath: stubPath, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) + } + + let expect = self.expectation(description: "One callback should be invoked") + let api = WordPressComRestApi(oAuthToken: "fakeToken") + let filePart = FilePart( + parameterName: "file", url: URL(fileURLWithPath: "/a.txt") as URL, filename: "a.txt", + mimeType: "image/jpeg") + api.multipartPOST( + wordPressMediaNewEndpointPath, parameters: nil, fileParts: [filePart], + success: { (_: AnyObject, _: HTTPURLResponse?) in + expect.fulfill() + XCTFail("This call should fail") + }, + failure: { (_, _) in + expect.fulfill() + } + ) + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testStreamMethodParallelCalls() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComRestApiMedia.json", Bundle.coreAPITestsBundle) + ) + stub(condition: isRestAPIMediaNewRequest()) { _ in + return fixture( + filePath: stubPath, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) + } + + guard + let mediaPath = OHPathForFileInBundle("test-image.jpg", Bundle.coreAPITestsBundle) + else { + return + } + let mediaURL = URL(fileURLWithPath: mediaPath) + let expect = self.expectation(description: "One callback should be invoked") + let api = WordPressComRestApi(oAuthToken: "fakeToken") + let filePart = FilePart( + parameterName: "media[]", url: mediaURL as URL, filename: "test-image.jpg", + mimeType: "image/jpeg") + let progress1 = api.multipartPOST( + wordPressMediaNewEndpointPath, parameters: nil, fileParts: [filePart], + success: { (_: AnyObject, _: HTTPURLResponse?) in + XCTFail("This call should fail") + }, + failure: { (error, _) in + XCTAssert(error.domain == NSURLErrorDomain, "The error domain should be NSURLErrorDomain") + XCTAssert(error.code == NSURLErrorCancelled, "The error code should be NSURLErrorCancelled") + } + ) + progress1?.cancel() + api.multipartPOST( + wordPressMediaNewEndpointPath, parameters: nil, fileParts: [filePart], + success: { (_: AnyObject, _: HTTPURLResponse?) in + expect.fulfill() + + }, + failure: { (_, _) in + expect.fulfill() + XCTFail("This call should succesful") + } + ) + self.waitForExpectations(timeout: 5, handler: nil) + } + + func testCancelationOfRequest() { + stub(condition: isRestAPIMediaNewRequest()) { _ in + return HTTPStubsResponse.init( + error: NSError(domain: NSURLErrorDomain, code: NSURLErrorCancelled, userInfo: nil)) + } + let expect = self.expectation(description: "One callback should be invoked") + let api = WordPressComRestApi(oAuthToken: "fakeToken") + api.POST( + wordPressMediaNewEndpointPath, parameters: nil, + success: { (_: AnyObject, _: HTTPURLResponse?) in + expect.fulfill() + XCTFail("This call should fail") + }, + failure: { (error, _) in + expect.fulfill() + XCTAssertEqual( + error.domain, NSURLErrorDomain, "The error domain should be NSURLErrorDomain") + XCTAssertEqual( + error.code, NSURLErrorCancelled, "The error code should be NSURLErrorCancelled") + }) + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testSuccessfullCallCommonGETStructure() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComRestApiMedia.json", Bundle.coreAPITestsBundle) + ) + stub(condition: isRestAPIRequest()) { _ in + return fixture( + filePath: stubPath, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) + } + + let expect = self.expectation(description: "One callback should be invoked") + let api = WordPressComRestApi(oAuthToken: "fakeToken") + + api.GET( + wordPressMediaRoutePath, parameters: nil, + success: { responseObject, _ in + XCTAssert(responseObject is [String: AnyObject], "The response should be a dictionary") + expect.fulfill() + }, + failure: { _, _ in + XCTFail("This call should be successfull") + expect.fulfill() + }) + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testFailureCallCommonGETStructure() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComRestApiFailInvalidJSON.json", Bundle.coreAPITestsBundle) + ) + stub(condition: isRestAPIRequest()) { _ in + return fixture( + filePath: stubPath, + status: 200, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) + } + + let expect = self.expectation(description: "One callback should be invoked") + let api = WordPressComRestApi(oAuthToken: "fakeToken") + api.GET( + wordPressMediaRoutePath, parameters: nil, + success: { _, _ in + XCTFail("This call should fail") + expect.fulfill() + }, + failure: { err, _ in + let error = err as NSError + XCTAssert( + error.domain == WordPressComRestApiErrorDomain, + "The error domain should be WordPressComRestApiErrorDomain") + XCTAssert( + error.code == Int(WordPressComRestApiErrorCode.responseSerializationFailed.rawValue), + "The code should be invalid response serialization") + expect.fulfill() + }) + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testStatusCode500() { + stub(condition: isAbsoluteURLString("https://public-api.wordpress.com/rest/v1/foo?locale=en")) { + _ in + HTTPStubsResponse( + data: "Internal server error".data(using: .utf8)!, statusCode: 500, headers: nil) + } + + let api = WordPressComRestApi() + let complete = expectation(description: "API call completed") + api.GET( + "/rest/v1/foo", + parameters: nil, + success: { _, _ in + complete.fulfill() + XCTFail("The API call should complete with a failure") + }, + failure: { error, _ in + complete.fulfill() + XCTAssertEqual(error.domain, "WordPressKit.WordPressComRestApiError") + XCTAssertEqual(error.code, WordPressComRestApiErrorCode.unknown.rawValue) + } + ) + + wait(for: [complete], timeout: 0.3) + } + + func testStatusCode502() { + stub(condition: isAbsoluteURLString("https://public-api.wordpress.com/rest/v1/foo?locale=en")) { + _ in + HTTPStubsResponse(data: "Bad Gateway".data(using: .utf8)!, statusCode: 502, headers: nil) + } + + let api = WordPressComRestApi() + let complete = expectation(description: "API call completed") + api.GET( + "/rest/v1/foo", + parameters: nil, + success: { _, _ in + complete.fulfill() + XCTFail("The API call should complete with a failure") + }, + failure: { error, _ in + complete.fulfill() + + XCTAssertTrue(error is WordPressAPIError) + } + ) + + wait(for: [complete], timeout: 0.3) + } + + func testTooManyRequestError() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("WordPressComRestApiFailThrottled.json", Bundle.coreAPITestsBundle) + ) + stub(condition: isAbsoluteURLString("https://public-api.wordpress.com/rest/v1/foo?locale=en")) { _ in + return fixture( + filePath: stubPath, + status: 500, + headers: ["Content-Type" as NSObject: "application/html" as AnyObject] + ) + } + + let api = WordPressComRestApi() + let complete = expectation(description: "API call completed") + api.GET( + "/rest/v1/foo", + parameters: nil, + success: { _, _ in + complete.fulfill() + XCTFail("The API call should complete with a failure") + }, + failure: { error, _ in + complete.fulfill() + XCTAssertEqual(error.domain, "WordPressKit.WordPressComRestApiError") + XCTAssertEqual(error.code, WordPressComRestApiErrorCode.tooManyRequests.rawValue) + XCTAssertEqual( + error.userInfo[WordPressComRestApi.ErrorKeyErrorCode] as? String, "too_many_requests") + XCTAssertTrue(error.localizedDescription.contains("You can try again in 1 minute")) + } + ) + + wait(for: [complete], timeout: 0.3) + } + + func testPreconditionFailureError() { + stub(condition: isAbsoluteURLString("https://public-api.wordpress.com/rest/v1/foo?locale=en")) { + _ in + HTTPStubsResponse(jsonObject: ["code": "no_connected_jetpack"], statusCode: 412, headers: nil) + } + + let api = WordPressComRestApi() + let complete = expectation(description: "API call completed") + api.GET( + "/rest/v1/foo", + parameters: nil, + success: { _, _ in + complete.fulfill() + XCTFail("The API call should complete with a failure") + }, + failure: { error, _ in + complete.fulfill() + XCTAssertEqual(error.domain, "WordPressKit.WordPressComRestApiError") + XCTAssertEqual(error.code, WordPressComRestApiErrorCode.preconditionFailure.rawValue) + } + ) + + wait(for: [complete], timeout: 0.3) + } + + /// Verify that parameters in POST requests are sent as JSON. + func testPostParametersContent() throws { + var req: URLRequest? + stub(condition: isHost("public-api.wordpress.com")) { + req = $0 + return HTTPStubsResponse(error: URLError(.notConnectedToInternet)) + } + + let api = WordPressComRestApi() + let complete = expectation(description: "API call completed") + api.POST( + "/rest/v1/foo", + parameters: ["arg1": "value1"] as [String: AnyObject], + success: { _, _ in + complete.fulfill() + XCTFail("The API call should complete with a failure") + }, + failure: { error, _ in + complete.fulfill() + } + ) + + wait(for: [complete], timeout: 0.3) + + let request = try XCTUnwrap(req) + XCTAssertEqual(request.httpMethod?.uppercased(), "POST") + XCTAssertEqual( + request.url?.absoluteString, "https://public-api.wordpress.com/rest/v1/foo?locale=en") + XCTAssertEqual(request.value(forHTTPHeaderField: "Content-Type"), "application/json") + XCTAssertEqual(request.httpBodyText, #"{"arg1":"value1"}"#) + } +} diff --git a/WordPressKitTests/WordPressAPI/WordPressOrgAPITests.swift b/Tests/CoreAPITests/WordPressOrgAPITests.swift similarity index 67% rename from WordPressKitTests/WordPressAPI/WordPressOrgAPITests.swift rename to Tests/CoreAPITests/WordPressOrgAPITests.swift index 5521373a..8d2b8c85 100644 --- a/WordPressKitTests/WordPressAPI/WordPressOrgAPITests.swift +++ b/Tests/CoreAPITests/WordPressOrgAPITests.swift @@ -1,8 +1,13 @@ -import Foundation -import XCTest -import OHHTTPStubs - +#if SWIFT_PACKAGE +@testable import CoreAPI +#else @testable import WordPressKit +#endif +import OHHTTPStubs +#if SWIFT_PACKAGE +import OHHTTPStubsSwift +#endif +import XCTest class WordPressOrgAPITests: XCTestCase { @@ -20,49 +25,70 @@ class WordPressOrgAPITests: XCTestCase { func testSelfHostedSiteSimpleGet() async { let expectation = expectation(description: "matches request conditions") - stub(condition: isMethodGET() && isAbsoluteURLString("https://wordpress.org/wp-json/wp/v2/hello-world?foo=bar")) { _ in + stub( + condition: isMethodGET() + && isAbsoluteURLString("https://wordpress.org/wp-json/wp/v2/hello-world?foo=bar") + ) { _ in expectation.fulfill() return HTTPStubsResponse(data: Data(), statusCode: 200, headers: nil) } - let api = WordPressOrgRestApi(selfHostedSiteWPJSONURL: URL(string: "https://wordpress.org/wp-json/")!, credential: fakeCredential) - let _ = await api.get(path: "wp/v2/hello-world", parameters: ["foo": "bar"], type: AnyResponse.self) + let api = WordPressOrgRestApi( + selfHostedSiteWPJSONURL: URL(string: "https://wordpress.org/wp-json/")!, + credential: fakeCredential) + let _ = await api.get( + path: "wp/v2/hello-world", parameters: ["foo": "bar"], type: AnyResponse.self) await fulfillment(of: [expectation], timeout: 0.1) } func testSelfHostedSiteSimplePost() async { let expectation = expectation(description: "matches request conditions") - stub(condition: isMethodPOST() && isAbsoluteURLString("https://wordpress.org/wp-json/wp/v2/hello-world")) { request in + stub( + condition: isMethodPOST() + && isAbsoluteURLString("https://wordpress.org/wp-json/wp/v2/hello-world") + ) { request in XCTAssertEqual(request.httpBodyText, "foo=bar") expectation.fulfill() return HTTPStubsResponse(data: Data(), statusCode: 200, headers: nil) } - let api = WordPressOrgRestApi(selfHostedSiteWPJSONURL: URL(string: "https://wordpress.org/wp-json/")!, credential: fakeCredential) - let _ = await api.post(path: "wp/v2/hello-world", parameters: ["foo": "bar"], type: AnyResponse.self) + let api = WordPressOrgRestApi( + selfHostedSiteWPJSONURL: URL(string: "https://wordpress.org/wp-json/")!, + credential: fakeCredential) + let _ = await api.post( + path: "wp/v2/hello-world", parameters: ["foo": "bar"], type: AnyResponse.self) await fulfillment(of: [expectation], timeout: 0.1) } func testWPComSiteSimpleGet() async { let expectation = expectation(description: "matches request conditions") - stub(condition: isMethodGET() && isAbsoluteURLString("https://public-api.wordpress.com/wp/v2/sites/42/hello-world?foo=bar")) { request in + stub( + condition: isMethodGET() + && isAbsoluteURLString( + "https://public-api.wordpress.com/wp/v2/sites/42/hello-world?foo=bar") + ) { request in XCTAssertEqual(request.value(forHTTPHeaderField: "Authorization"), "Bearer faketoken") expectation.fulfill() return HTTPStubsResponse(data: Data(), statusCode: 200, headers: nil) } let api = WordPressOrgRestApi(dotComSiteID: 42, bearerToken: "faketoken") - let _ = await api.get(path: "wp/v2/hello-world", parameters: ["foo": "bar"], type: AnyResponse.self) + let _ = await api.get( + path: "wp/v2/hello-world", parameters: ["foo": "bar"], type: AnyResponse.self) await fulfillment(of: [expectation], timeout: 0.1) } func testWPComSiteSimplePost() async { let expectation = expectation(description: "matches request conditions") - stub(condition: isMethodPOST() && isAbsoluteURLString("https://public-api.wordpress.com/wp/v2/sites/42/hello-world")) { request in + stub( + condition: isMethodPOST() + && isAbsoluteURLString("https://public-api.wordpress.com/wp/v2/sites/42/hello-world") + ) { request in XCTAssertEqual(request.value(forHTTPHeaderField: "Authorization"), "Bearer faketoken") XCTAssertEqual(request.httpBodyText, "foo=bar") expectation.fulfill() return HTTPStubsResponse(data: Data(), statusCode: 200, headers: nil) } let api = WordPressOrgRestApi(dotComSiteID: 42, bearerToken: "faketoken") - let _ = await api.post(path: "wp/v2/hello-world", parameters: ["foo": "bar"], type: AnyResponse.self) + let _ = await api.post( + path: "wp/v2/hello-world", parameters: ["foo": "bar"], type: AnyResponse.self) await fulfillment(of: [expectation], timeout: 0.1) } @@ -75,10 +101,13 @@ class WordPressOrgAPITests: XCTestCase { return HTTPStubsResponse(data: Data(), statusCode: 200, headers: nil) } - let selfHostedSite = WordPressOrgRestApi(selfHostedSiteWPJSONURL: URL(string: "https://wordpress.org/wp-json/")!, credential: fakeCredential, userAgent: "fake-user-agent") + let selfHostedSite = WordPressOrgRestApi( + selfHostedSiteWPJSONURL: URL(string: "https://wordpress.org/wp-json/")!, + credential: fakeCredential, userAgent: "fake-user-agent") let _ = await selfHostedSite.get(path: "/wp/v2/hello-world", type: AnyResponse.self) - let dotComSite = WordPressOrgRestApi(dotComSiteID: 42, bearerToken: "faketoken", userAgent: "fake-user-agent") + let dotComSite = WordPressOrgRestApi( + dotComSiteID: 42, bearerToken: "faketoken", userAgent: "fake-user-agent") let _ = await dotComSite.get(path: "/wp/v2/hello-world", type: AnyResponse.self) await fulfillment(of: [expectation], timeout: 0.1) @@ -88,9 +117,11 @@ class WordPressOrgAPITests: XCTestCase { // The expected API call sequence. // [/wp/v2/hello-world|401] -> [nonce-from-ajax|200] -> [/wp/v2/hello-world|200] -> END - let unauthenticatedReuqest = expectation(description: "Call #1: call an endpoint with a unauthenticated request") + let unauthenticatedReuqest = expectation( + description: "Call #1: call an endpoint with a unauthenticated request") let ajaxNonceRequest = expectation(description: "Call #2: call ajax endpoint to get nonce") - let authenticatedReuqest = expectation(description: "Call #3: call an endpoint with an authenticated request") + let authenticatedReuqest = expectation( + description: "Call #3: call an endpoint with an authenticated request") stub(condition: { $0.url?.lastPathComponent == "hello-world" }) { request in if request.value(forHTTPHeaderField: "X-WP-Nonce") == "fakenonce" { @@ -107,16 +138,21 @@ class WordPressOrgAPITests: XCTestCase { return HTTPStubsResponse(data: "fakenonce".data(using: .utf8)!, statusCode: 200, headers: nil) } - let selfHostedSite = WordPressOrgRestApi(selfHostedSiteWPJSONURL: URL(string: "https://wordpress.org/wp-json/")!, credential: fakeCredential) + let selfHostedSite = WordPressOrgRestApi( + selfHostedSiteWPJSONURL: URL(string: "https://wordpress.org/wp-json/")!, + credential: fakeCredential) let result = await selfHostedSite.get(path: "/wp/v2/hello-world", type: AnyResponse.self) // This call should not throw _ = try result.get() - await fulfillment(of: [unauthenticatedReuqest, ajaxNonceRequest, authenticatedReuqest], timeout: 0.1, enforceOrder: true) + await fulfillment( + of: [unauthenticatedReuqest, ajaxNonceRequest, authenticatedReuqest], timeout: 0.1, + enforceOrder: true) // Remove added stubs and add a new one. - let requestsHasNonce = expectation(description: "Call an endpoint with an authenticated request") + let requestsHasNonce = expectation( + description: "Call an endpoint with an authenticated request") requestsHasNonce.expectedFulfillmentCount = 3 HTTPStubs.removeAllStubs() stub(condition: { $0.url?.lastPathComponent == "hello-world" }) { request in @@ -141,12 +177,15 @@ class WordPressOrgAPITests: XCTestCase { // The expected API call sequence. // [/wp/v2/hello-world|401] -> [nonce-from-ajax|401] -> [wp-login|401] -> [post-new|401] -> [wp-login|401] -> END. - let unauthenticatedReuqest = expectation(description: "Call #1: call an endpoint with a unauthenticated request") + let unauthenticatedReuqest = expectation( + description: "Call #1: call an endpoint with a unauthenticated request") let ajaxNonceRequest = expectation(description: "Call #2: call ajax endpoint to get nonce") let newPostWebpageRequest = expectation(description: "Call #3: get nonce from new post webpage") - let loginRequest = expectation(description: "Authenticate during fetching the ajax and new post webpage") + let loginRequest = expectation( + description: "Authenticate during fetching the ajax and new post webpage") loginRequest.expectedFulfillmentCount = 2 - let authenticatedReuqest = expectation(description: "[Should never happen] call an endpoint with an authenticated request") + let authenticatedReuqest = expectation( + description: "[Should never happen] call an endpoint with an authenticated request") authenticatedReuqest.isInverted = true stub(condition: { $0.url?.lastPathComponent == "hello-world" }) { request in @@ -174,7 +213,9 @@ class WordPressOrgAPITests: XCTestCase { return HTTPStubsResponse(jsonObject: [String: String](), statusCode: 401, headers: nil) } - let selfHostedSite = WordPressOrgRestApi(selfHostedSiteWPJSONURL: URL(string: "https://wordpress.org/wp-json/")!, credential: fakeCredential) + let selfHostedSite = WordPressOrgRestApi( + selfHostedSiteWPJSONURL: URL(string: "https://wordpress.org/wp-json/")!, + credential: fakeCredential) let result = await selfHostedSite.get(path: "/wp/v2/hello-world", type: AnyResponse.self) if case .failure = result { @@ -183,19 +224,26 @@ class WordPressOrgAPITests: XCTestCase { XCTFail("Unexpected result: \(result)") } - await fulfillment(of: [unauthenticatedReuqest, ajaxNonceRequest, newPostWebpageRequest, loginRequest], timeout: 0.1, enforceOrder: true) + await fulfillment( + of: [unauthenticatedReuqest, ajaxNonceRequest, newPostWebpageRequest, loginRequest], + timeout: 0.1, enforceOrder: true) await fulfillment(of: [authenticatedReuqest], timeout: 0.1) } func testNoRetryInWPComSite() async { let expectation = expectation(description: "matches request conditions") - stub(condition: isMethodGET() && isAbsoluteURLString("https://public-api.wordpress.com/wp/v2/sites/42/hello-world?foo=bar")) { request in + stub( + condition: isMethodGET() + && isAbsoluteURLString( + "https://public-api.wordpress.com/wp/v2/sites/42/hello-world?foo=bar") + ) { request in XCTAssertEqual(request.value(forHTTPHeaderField: "Authorization"), "Bearer faketoken") expectation.fulfill() return HTTPStubsResponse(jsonObject: [String: String](), statusCode: 401, headers: nil) } let api = WordPressOrgRestApi(dotComSiteID: 42, bearerToken: "faketoken") - let _ = await api.get(path: "wp/v2/hello-world", parameters: ["foo": "bar"], type: AnyResponse.self) + let _ = await api.get( + path: "wp/v2/hello-world", parameters: ["foo": "bar"], type: AnyResponse.self) await fulfillment(of: [expectation], timeout: 0.1) } diff --git a/WordPressKitTests/WordPressOrgRestApiTests.swift b/Tests/CoreAPITests/WordPressOrgRestApiTests.swift similarity index 61% rename from WordPressKitTests/WordPressOrgRestApiTests.swift rename to Tests/CoreAPITests/WordPressOrgRestApiTests.swift index a71aaa85..ab79f770 100644 --- a/WordPressKitTests/WordPressOrgRestApiTests.swift +++ b/Tests/CoreAPITests/WordPressOrgRestApiTests.swift @@ -1,7 +1,14 @@ +#if SWIFT_PACKAGE +@testable import CoreAPI +#else +@testable import WordPressKit +#endif import Foundation -import XCTest import OHHTTPStubs -@testable import WordPressKit +#if SWIFT_PACKAGE +import OHHTTPStubsSwift +#endif +import XCTest class WordPressOrgRestApiTests: XCTestCase { @@ -23,10 +30,17 @@ class WordPressOrgRestApiTests: XCTestCase { } func testUnauthorizedCall() async throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("wp-forbidden.json", Bundle.coreAPITestsBundle) + ) stub(condition: isAPIRequest()) { _ in - let stubPath = OHPathForFile("wp-forbidden.json", type(of: self)) - return fixture(filePath: stubPath!, status: 401, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) + return fixture( + filePath: stubPath, + status: 401, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) } + let api = WordPressOrgRestApi(apiBase: apiBase) let result = await api.get(path: "wp/v2/settings", type: AnyResponse.self) switch result { @@ -38,19 +52,30 @@ class WordPressOrgRestApiTests: XCTestCase { } func testSuccessfulGetCall() async throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("wp-pages.json", Bundle.coreAPITestsBundle) + ) stub(condition: isAPIRequest()) { _ in - let stubPath = OHPathForFile("wp-pages.json", type(of: self)) - return fixture(filePath: stubPath!, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) + return fixture( + filePath: stubPath, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) } + let api = WordPressOrgRestApi(apiBase: apiBase) let pages = try await api.get(path: "wp/v2/pages", type: [AnyResponse].self).get() XCTAssertEqual(pages.count, 10, "The API should return 10 pages") } func testSuccessfulPostCall() async throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("wp-reusable-blocks.json", Bundle.coreAPITestsBundle) + ) stub(condition: isAPIRequest()) { _ in - let stubPath = OHPathForFile("wp-reusable-blocks.json", type(of: self)) - return fixture(filePath: stubPath!, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) + return fixture( + filePath: stubPath, + headers: ["Content-Type" as NSObject: "application/json" as AnyObject] + ) } struct Response: Decodable { @@ -62,9 +87,12 @@ class WordPressOrgRestApiTests: XCTestCase { } let api = WordPressOrgRestApi(apiBase: apiBase) - let blockContent = "\n

Some text

\n\n\n\n
  • Item 1
  • Item 2
  • Item 3
\n" + let blockContent = + "\n

Some text

\n\n\n\n
  • Item 1
  • Item 2
  • Item 3
\n" let parameters: [String: String] = ["id": "6", "content": blockContent] - let response = try await api.post(path: "wp/v2/blocks/6", parameters: parameters, type: Response.self).get() + let response = try await api.post( + path: "wp/v2/blocks/6", parameters: parameters, type: Response.self + ).get() XCTAssertEqual(response.content.raw, blockContent, "The API should return the block") } @@ -84,7 +112,9 @@ class WordPressOrgRestApiTests: XCTestCase { let request = try XCTUnwrap(req) XCTAssertEqual(request.httpMethod?.uppercased(), "POST") XCTAssertEqual(request.url?.absoluteString, "https://wordpress.org/wp-json/rest/v1/foo") - XCTAssertEqual(request.value(forHTTPHeaderField: "Content-Type"), "application/x-www-form-urlencoded; charset=utf-8") + XCTAssertEqual( + request.value(forHTTPHeaderField: "Content-Type"), + "application/x-www-form-urlencoded; charset=utf-8") XCTAssertEqual(request.httpBodyText, "arg1=value1") } @@ -93,7 +123,9 @@ class WordPressOrgRestApiTests: XCTestCase { HTTPStubsResponse(jsonObject: [String: String](), statusCode: 200, headers: nil) } let api = WordPressOrgRestApi(site: .dotCom(siteID: 1001, bearerToken: "fakeToken")) - let _ = try await api.get(path: "/wp/v2/themes", parameters: ["status": "active"], type: AnyResponse.self).get() + let _ = try await api.get( + path: "/wp/v2/themes", parameters: ["status": "active"], type: AnyResponse.self + ).get() } func testRequestPathModificationsWPBlockEditor() async throws { @@ -106,12 +138,15 @@ class WordPressOrgRestApiTests: XCTestCase { func testSettingWPComAPIURL() async { var request: URLRequest? - stub(condition: { _ in true }, response: { - request = $0 - return HTTPStubsResponse(error: URLError(.networkConnectionLost)) - }) - - let api = WordPressOrgRestApi(dotComSiteID: 1001, bearerToken: "token", apiURL: URL(string: "http://localhost:8000")!) + stub( + condition: { _ in true }, + response: { + request = $0 + return HTTPStubsResponse(error: URLError(.networkConnectionLost)) + }) + + let api = WordPressOrgRestApi( + dotComSiteID: 1001, bearerToken: "token", apiURL: URL(string: "http://localhost:8000")!) let _ = await api.get(path: "/wp/v2/hello", type: AnyResponse.self) XCTAssertEqual(request?.url?.absoluteString, "http://localhost:8000/wp/v2/sites/1001/hello") } @@ -120,24 +155,34 @@ class WordPressOrgRestApiTests: XCTestCase { // and query. This unit test ensures WordPressKit doesn't break that feature. func testPathWithQuery() async { var request: URLRequest? - stub(condition: { _ in true }, response: { - request = $0 - return HTTPStubsResponse(error: URLError(.networkConnectionLost)) - }) + stub( + condition: { _ in true }, + response: { + request = $0 + return HTTPStubsResponse(error: URLError(.networkConnectionLost)) + }) let api = WordPressOrgRestApi(site: .dotCom(siteID: 1001, bearerToken: "fakeToken")) let _ = await api.get(path: "/wp/v2/get-decodable?context=mobile", type: AnyResponse.self) - XCTAssertEqual(request?.url?.absoluteString, "https://public-api.wordpress.com/wp/v2/sites/1001/get-decodable?context=mobile") + XCTAssertEqual( + request?.url?.absoluteString, + "https://public-api.wordpress.com/wp/v2/sites/1001/get-decodable?context=mobile") let _ = await api.post(path: "/wp/v2/post-decodable?context=mobile", type: AnyResponse.self) - XCTAssertEqual(request?.url?.absoluteString, "https://public-api.wordpress.com/wp/v2/sites/1001/post-decodable?context=mobile") + XCTAssertEqual( + request?.url?.absoluteString, + "https://public-api.wordpress.com/wp/v2/sites/1001/post-decodable?context=mobile") let _ = await api.get(path: "/wp/v2/get-any-json?context=mobile") - XCTAssertEqual(request?.url?.absoluteString, "https://public-api.wordpress.com/wp/v2/sites/1001/get-any-json?context=mobile") + XCTAssertEqual( + request?.url?.absoluteString, + "https://public-api.wordpress.com/wp/v2/sites/1001/get-any-json?context=mobile") let _ = await api.post(path: "/wp/v2/post-any-json?context=mobile") - XCTAssertEqual(request?.url?.absoluteString, "https://public-api.wordpress.com/wp/v2/sites/1001/post-any-json?context=mobile") + XCTAssertEqual( + request?.url?.absoluteString, + "https://public-api.wordpress.com/wp/v2/sites/1001/post-any-json?context=mobile") } } @@ -145,7 +190,9 @@ extension WordPressOrgRestApi { convenience init(apiBase: URL) { self.init( selfHostedSiteWPJSONURL: apiBase, - credential: .init(loginURL: URL(string: "https://not-used.com")!, username: "user", password: "pass", adminURL: URL(string: "https://not-used.com")!) + credential: .init( + loginURL: URL(string: "https://not-used.com")!, username: "user", password: "pass", + adminURL: URL(string: "https://not-used.com")!) ) } } diff --git a/WordPressKitTests/WordPressOrgXMLRPCApiTests.swift b/Tests/CoreAPITests/WordPressOrgXMLRPCApiTests.swift similarity index 67% rename from WordPressKitTests/WordPressOrgXMLRPCApiTests.swift rename to Tests/CoreAPITests/WordPressOrgXMLRPCApiTests.swift index 8bab45d4..f1fd30bd 100644 --- a/WordPressKitTests/WordPressOrgXMLRPCApiTests.swift +++ b/Tests/CoreAPITests/WordPressOrgXMLRPCApiTests.swift @@ -1,14 +1,23 @@ +#if SWIFT_PACKAGE +@testable import CoreAPI +#else +@testable import WordPressKit +#endif import Foundation -import XCTest import OHHTTPStubs +#if SWIFT_PACKAGE +import OHHTTPStubsSwift +#endif +import XCTest import wpxmlrpc -@testable import WordPressKit class WordPressOrgXMLRPCApiTests: XCTestCase { let xmlrpcEndpoint = "http://wordpress.org/xmlrpc.php" let xmlContentTypeHeaders: [String: Any] = ["Content-Type": "application/xml"] + let badUsernameOrPasswordErrorPath = OHPathForFileInBundle("xmlrpc-bad-username-or-password-error.xml", Bundle.coreAPITestsBundle) + override func setUp() { super.setUp() } @@ -24,18 +33,23 @@ class WordPressOrgXMLRPCApiTests: XCTestCase { } } - func testSuccessfullCall() { + func testSuccessfullCall() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("xmlrpc-response-getpost.xml", Bundle.coreAPITestsBundle) + ) stub(condition: isXmlRpcAPIRequest()) { _ in - let stubPath = OHPathForFile("xmlrpc-response-getpost.xml", type(of: self)) - return fixture(filePath: stubPath!, headers: self.xmlContentTypeHeaders) + return fixture(filePath: stubPath, headers: self.xmlContentTypeHeaders) } let expect = self.expectation(description: "One callback should be invoked") let api = WordPressOrgXMLRPCApi(endpoint: URL(string: xmlrpcEndpoint)! as URL) - api.callMethod("wp.getPost", parameters: nil, success: { (responseObject: AnyObject, _: HTTPURLResponse?) in - expect.fulfill() - XCTAssert(responseObject is [String: AnyObject], "The response should be a dictionary") - }, failure: { (_, _) in + api.callMethod( + "wp.getPost", parameters: nil, + success: { (responseObject: AnyObject, _: HTTPURLResponse?) in + expect.fulfill() + XCTAssert(responseObject is [String: AnyObject], "The response should be a dictionary") + }, + failure: { (_, _) in expect.fulfill() XCTFail("This call should be successfull") } @@ -60,11 +74,17 @@ class WordPressOrgXMLRPCApiTests: XCTestCase { failure: { (error, _) in expect.fulfill() - XCTAssertEqual(error.domain, WordPressOrgXMLRPCApiErrorDomain) + // FIXME: SPM can't find this +#if SWIFT_PACKAGE +#else + XCTAssertEqual(error.domain, WordPressOrgXMLRPCApiErrorDomain) +#endif XCTAssertEqual(error.code, WordPressOrgXMLRPCApiError.httpErrorStatusCode.rawValue) XCTAssertEqual(error.localizedFailureReason, "An HTTP error code 404 was returned.") - XCTAssertNotNil(error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyData as String]) - XCTAssertNotNil(error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyStatusCode as String]) + XCTAssertNotNil( + error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyData as String]) + XCTAssertNotNil( + error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyStatusCode as String]) } ) wait(for: [expect], timeout: 0.3) @@ -88,11 +108,17 @@ class WordPressOrgXMLRPCApiTests: XCTestCase { expect.fulfill() XCTAssertFalse(error is WordPressOrgXMLRPCApiError) - XCTAssertEqual(error.domain, WordPressOrgXMLRPCApiErrorDomain) + // FIXME: SPM can't find this +#if SWIFT_PACKAGE +#else + XCTAssertEqual(error.domain, WordPressOrgXMLRPCApiErrorDomain) +#endif XCTAssertEqual(error.code, 403) XCTAssertEqual(error.localizedFailureReason, "An HTTP error code 403 was returned.") - XCTAssertNotNil(error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyData as String]) - XCTAssertNotNil(error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyStatusCode as String]) + XCTAssertNotNil( + error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyData as String]) + XCTAssertNotNil( + error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyStatusCode as String]) } ) wait(for: [expect], timeout: 0.3) @@ -116,11 +142,18 @@ class WordPressOrgXMLRPCApiTests: XCTestCase { expect.fulfill() XCTAssertTrue(error is WordPressOrgXMLRPCApiError) - XCTAssertEqual(error.domain, WordPressOrgXMLRPCApiErrorDomain) + // FIXME: SPM can't find this +#if SWIFT_PACKAGE +#else + XCTAssertEqual(error.domain, WordPressOrgXMLRPCApiErrorDomain) +#endif XCTAssertEqual(error.code, WordPressOrgXMLRPCApiError.unknown.rawValue) - XCTAssertEqual(error.localizedFailureReason, WordPressOrgXMLRPCApiError.unknown.failureReason) - XCTAssertNotNil(error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyData as String]) - XCTAssertNil(error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyStatusCode as String]) + XCTAssertEqual( + error.localizedFailureReason, WordPressOrgXMLRPCApiError.unknown.failureReason) + XCTAssertNotNil( + error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyData as String]) + XCTAssertNil( + error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyStatusCode as String]) } ) wait(for: [expect], timeout: 0.3) @@ -152,7 +185,7 @@ class WordPressOrgXMLRPCApiTests: XCTestCase { } func testFault() throws { - let responseFile = try XCTUnwrap(OHPathForFile("xmlrpc-bad-username-password-error.xml", WordPressOrgXMLRPCApiTests.self)) + let responseFile = try XCTUnwrap(badUsernameOrPasswordErrorPath) stub(condition: isXmlRpcAPIRequest()) { _ in fixture(filePath: responseFile, headers: self.xmlContentTypeHeaders) } @@ -172,15 +205,17 @@ class WordPressOrgXMLRPCApiTests: XCTestCase { XCTAssertEqual(error.domain, WPXMLRPCFaultErrorDomain) // 403 is the 'faultCode' in the HTTP response xml. XCTAssertEqual(error.code, 403) - XCTAssertNotNil(error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyData as String]) - XCTAssertNil(error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyStatusCode as String]) + XCTAssertNotNil( + error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyData as String]) + XCTAssertNil( + error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyStatusCode as String]) } ) wait(for: [expect], timeout: 0.3) } func testFault401() throws { - let responseFile = try XCTUnwrap(OHPathForFile("xmlrpc-bad-username-password-error.xml", WordPressOrgXMLRPCApiTests.self)) + let responseFile = try XCTUnwrap(badUsernameOrPasswordErrorPath) stub(condition: isXmlRpcAPIRequest()) { _ in fixture(filePath: responseFile, status: 401, headers: self.xmlContentTypeHeaders) } @@ -200,8 +235,10 @@ class WordPressOrgXMLRPCApiTests: XCTestCase { XCTAssertEqual(error.domain, WPXMLRPCFaultErrorDomain) // 403 is the 'faultCode' in the HTTP response xml. XCTAssertEqual(error.code, 403) - XCTAssertNil(error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyStatusCode as String]) - XCTAssertNotNil(error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyData as String]) + XCTAssertNil( + error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyStatusCode as String]) + XCTAssertNotNil( + error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyData as String]) } ) wait(for: [expect], timeout: 0.3) @@ -229,15 +266,19 @@ class WordPressOrgXMLRPCApiTests: XCTestCase { expect.fulfill() XCTAssertEqual(error.domain, XMLParser.errorDomain) - XCTAssertNotNil(error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyData as String]) - XCTAssertNil(error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyStatusCode as String]) + XCTAssertNotNil( + error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyData as String]) + XCTAssertNil( + error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyStatusCode as String]) } ) wait(for: [expect], timeout: 0.3) } func testInvalidXML() throws { - let responseFile = try XCTUnwrap(OHPathForFile("xmlrpc-response-invalid.html", WordPressOrgXMLRPCApiTests.self)) + let responseFile = try XCTUnwrap( + OHPathForFileInBundle("xmlrpc-response-invalid.html", Bundle.coreAPITestsBundle) + ) stub(condition: isXmlRpcAPIRequest()) { _ in fixture(filePath: responseFile, headers: self.xmlContentTypeHeaders) } @@ -256,17 +297,21 @@ class WordPressOrgXMLRPCApiTests: XCTestCase { XCTAssertEqual(error.domain, WPXMLRPCErrorDomain) XCTAssertEqual(error.code, WPXMLRPCError.invalidInputError.rawValue) - XCTAssertNotNil(error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyData as String]) - XCTAssertNil(error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyStatusCode as String]) + XCTAssertNotNil( + error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyData as String]) + XCTAssertNil( + error.userInfo[WordPressOrgXMLRPCApi.WordPressOrgXMLRPCApiErrorKeyStatusCode as String]) } ) wait(for: [expect], timeout: 0.3) } - func testProgressUpdate() { + func testProgressUpdate() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("xmlrpc-response-getpost.xml", Bundle.coreAPITestsBundle) + ) stub(condition: isXmlRpcAPIRequest()) { _ in - let stubPath = OHPathForFile("xmlrpc-response-getpost.xml", type(of: self)) - return fixture(filePath: stubPath!, headers: self.xmlContentTypeHeaders) + return fixture(filePath: stubPath, headers: self.xmlContentTypeHeaders) } let success = self.expectation(description: "The success callback should be invoked") @@ -280,10 +325,12 @@ class WordPressOrgXMLRPCApiTests: XCTestCase { let observerCalled = expectation(description: "Progress observer is called") observerCalled.assertForOverFulfill = false - let observer = progress?.observe(\.fractionCompleted, options: .new, changeHandler: { _, _ in - XCTAssertTrue(Thread.isMainThread) - observerCalled.fulfill() - }) + let observer = progress?.observe( + \.fractionCompleted, options: .new, + changeHandler: { _, _ in + XCTAssertTrue(Thread.isMainThread) + observerCalled.fulfill() + }) wait(for: [success, observerCalled], timeout: 0.3) observer?.invalidate() @@ -291,10 +338,10 @@ class WordPressOrgXMLRPCApiTests: XCTestCase { XCTAssertEqual(progress?.fractionCompleted, 1) } - func testProgressUpdateFailure() { + func testProgressUpdateFailure() throws { + let stubPath = try XCTUnwrap(badUsernameOrPasswordErrorPath) stub(condition: isXmlRpcAPIRequest()) { _ in - let stubPath = OHPathForFile("xmlrpc-bad-username-password-error.xml", type(of: self)) - return fixture(filePath: stubPath!, headers: self.xmlContentTypeHeaders) + return fixture(filePath: stubPath, headers: self.xmlContentTypeHeaders) } let failure = self.expectation(description: "The failure callback should be invoked") @@ -308,10 +355,12 @@ class WordPressOrgXMLRPCApiTests: XCTestCase { let observerCalled = expectation(description: "Progress observer is called") observerCalled.assertForOverFulfill = false - let observer = progress?.observe(\.fractionCompleted, options: .new, changeHandler: { _, _ in - XCTAssertTrue(Thread.isMainThread) - observerCalled.fulfill() - }) + let observer = progress?.observe( + \.fractionCompleted, options: .new, + changeHandler: { _, _ in + XCTAssertTrue(Thread.isMainThread) + observerCalled.fulfill() + }) wait(for: [failure, observerCalled], timeout: 0.3) observer?.invalidate() @@ -319,10 +368,12 @@ class WordPressOrgXMLRPCApiTests: XCTestCase { XCTAssertEqual(progress?.fractionCompleted, 1) } - func testProgressUpdateStreamAPI() { + func testProgressUpdateStreamAPI() throws { + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("xmlrpc-response-getpost.xml", Bundle.coreAPITestsBundle) + ) stub(condition: isXmlRpcAPIRequest()) { _ in - let stubPath = OHPathForFile("xmlrpc-response-getpost.xml", type(of: self)) - return fixture(filePath: stubPath!, headers: self.xmlContentTypeHeaders) + return fixture(filePath: stubPath, headers: self.xmlContentTypeHeaders) } let success = self.expectation(description: "The success callback should be invoked") @@ -336,10 +387,12 @@ class WordPressOrgXMLRPCApiTests: XCTestCase { let observerCalled = expectation(description: "Progress observer is called") observerCalled.assertForOverFulfill = false - let observer = progress?.observe(\.fractionCompleted, options: .new, changeHandler: { _, _ in - XCTAssertTrue(Thread.isMainThread) - observerCalled.fulfill() - }) + let observer = progress?.observe( + \.fractionCompleted, options: .new, + changeHandler: { _, _ in + XCTAssertTrue(Thread.isMainThread) + observerCalled.fulfill() + }) wait(for: [success, observerCalled], timeout: 0.3) observer?.invalidate() @@ -347,10 +400,10 @@ class WordPressOrgXMLRPCApiTests: XCTestCase { XCTAssertEqual(progress?.fractionCompleted, 1) } - func testProgressUpdateStreamAPIFailure() { + func testProgressUpdateStreamAPIFailure() throws { + let stubPath = try XCTUnwrap(badUsernameOrPasswordErrorPath) stub(condition: isXmlRpcAPIRequest()) { _ in - let stubPath = OHPathForFile("xmlrpc-bad-username-password-error.xml", type(of: self)) - return fixture(filePath: stubPath!, headers: self.xmlContentTypeHeaders) + return fixture(filePath: stubPath, headers: self.xmlContentTypeHeaders) } let failure = self.expectation(description: "The failure callback should be invoked") @@ -364,10 +417,12 @@ class WordPressOrgXMLRPCApiTests: XCTestCase { let observerCalled = expectation(description: "Progress observer is called") observerCalled.assertForOverFulfill = false - let observer = progress?.observe(\.fractionCompleted, options: .new, changeHandler: { _, _ in - XCTAssertTrue(Thread.isMainThread) - observerCalled.fulfill() - }) + let observer = progress?.observe( + \.fractionCompleted, options: .new, + changeHandler: { _, _ in + XCTAssertTrue(Thread.isMainThread) + observerCalled.fulfill() + }) wait(for: [failure, observerCalled], timeout: 0.3) observer?.invalidate() diff --git a/WordPressKitTests/WordPressAPI/WordPressOrgXMLRPCValidatorTests.swift b/Tests/CoreAPITests/WordPressOrgXMLRPCValidatorTests.swift similarity index 55% rename from WordPressKitTests/WordPressAPI/WordPressOrgXMLRPCValidatorTests.swift rename to Tests/CoreAPITests/WordPressOrgXMLRPCValidatorTests.swift index 0b4e086b..5ecea867 100644 --- a/WordPressKitTests/WordPressAPI/WordPressOrgXMLRPCValidatorTests.swift +++ b/Tests/CoreAPITests/WordPressOrgXMLRPCValidatorTests.swift @@ -1,12 +1,22 @@ -import XCTest -import OHHTTPStubs - +#if SWIFT_PACKAGE +@testable import CoreAPI +#else @testable import WordPressKit +#endif +import OHHTTPStubs +#if SWIFT_PACKAGE +import OHHTTPStubsSwift +#endif +import XCTest final class WordPressOrgXMLRPCValidatorTests: XCTestCase { private let exampleURLString = "http://example.com" + let responseInvalidHTML = OHPathForFileInBundle("xmlrpc-response-invalid.html", Bundle.coreAPITestsBundle) + + let responseListMethods = OHPathForFileInBundle("xmlrpc-response-list-methods.xml", Bundle.coreAPITestsBundle) + override func setUp() { super.setUp() @@ -26,25 +36,30 @@ final class WordPressOrgXMLRPCValidatorTests: XCTestCase { // Given var schemes = Set() // Stub all, we only care about the URL schemes that are being tested. - stub(condition: { request -> Bool in - if let scheme = request.url?.scheme { - schemes.insert(scheme) - } - return true - }, response: { _ in - let error = NSError(domain: "", code: NSURLErrorNotConnectedToInternet, userInfo: nil) - return HTTPStubsResponse(error: error) - }) + stub( + condition: { request -> Bool in + if let scheme = request.url?.scheme { + schemes.insert(scheme) + } + return true + }, + response: { _ in + let error = NSError(domain: "", code: NSURLErrorNotConnectedToInternet, userInfo: nil) + return HTTPStubsResponse(error: error) + }) let validator = WordPressOrgXMLRPCValidator() // When let expectation = self.expectation(description: "Wait for success or failure") - validator.guessXMLRPCURLForSite(exampleURLString, userAgent: "", success: { _ in - expectation.fulfill() - }, failure: { _ in - expectation.fulfill() - }) + validator.guessXMLRPCURLForSite( + exampleURLString, userAgent: "", + success: { _ in + expectation.fulfill() + }, + failure: { _ in + expectation.fulfill() + }) wait(for: [expectation], timeout: 2.0) @@ -61,25 +76,30 @@ final class WordPressOrgXMLRPCValidatorTests: XCTestCase { // Given var schemes = Set() // Stub all, we only care about the URL schemes that are being tested. - stub(condition: { request -> Bool in - if let scheme = request.url?.scheme { - schemes.insert(scheme) - } - return true - }, response: { _ in - let error = NSError(domain: "", code: NSURLErrorNotConnectedToInternet, userInfo: nil) - return HTTPStubsResponse(error: error) - }) + stub( + condition: { request -> Bool in + if let scheme = request.url?.scheme { + schemes.insert(scheme) + } + return true + }, + response: { _ in + let error = NSError(domain: "", code: NSURLErrorNotConnectedToInternet, userInfo: nil) + return HTTPStubsResponse(error: error) + }) let validator = WordPressOrgXMLRPCValidator(makeUnsecuredAppTransportSecuritySettings()) // When let expectation = self.expectation(description: "Wait for success or failure") - validator.guessXMLRPCURLForSite(exampleURLString, userAgent: "", success: { _ in - expectation.fulfill() - }, failure: { _ in - expectation.fulfill() - }) + validator.guessXMLRPCURLForSite( + exampleURLString, userAgent: "", + success: { _ in + expectation.fulfill() + }, + failure: { _ in + expectation.fulfill() + }) wait(for: [expectation], timeout: 2.0) @@ -87,21 +107,22 @@ final class WordPressOrgXMLRPCValidatorTests: XCTestCase { XCTAssertEqual(schemes, Set(arrayLiteral: "https", "http")) } - func testNotWordPressSiteError() { + func testNotWordPressSiteError() throws { // Create HTTP stubs to simulate a plain static website // - Return a plain HTML webpage for all GET requests // - Return a 405 method not allowed error for all POST requests + let stubPath = try XCTUnwrap(responseInvalidHTML) stub(condition: isHost("www.apple.com") && isMethodGET()) { _ in fixture( - filePath: OHPathForFile("xmlrpc-response-invalid.html", type(of: self))!, + filePath: stubPath, status: 200, headers: nil ) } stub(condition: isHost("www.apple.com") && isMethodPOST()) { _ in fixture( - filePath: OHPathForFile("xmlrpc-response-invalid.html", type(of: self))!, + filePath: stubPath, status: 405, headers: nil ) @@ -109,23 +130,29 @@ final class WordPressOrgXMLRPCValidatorTests: XCTestCase { let failure = self.expectation(description: "returns error") let validator = WordPressOrgXMLRPCValidator() - validator.guessXMLRPCURLForSite("https://www.apple.com/", userAgent: "test/1.0", success: { - XCTFail("Unexpected result: \($0)") - }) { error in + validator.guessXMLRPCURLForSite( + "https://www.apple.com/", userAgent: "test/1.0", + success: { + XCTFail("Unexpected result: \($0)") + } + ) { error in XCTAssertTrue(error is WordPressOrgXMLRPCValidatorError) let validatorError = error as? WordPressOrgXMLRPCValidatorError // Since the we simulate a plain static website in this test case, a 'notWordPressError' is the best error // case to represent the error. But the current implementation returns an 'invalid' error, which is true too. - XCTAssertTrue(validatorError == .invalid || validatorError == .notWordPressError, "Got an error: \(error)") + XCTAssertTrue( + validatorError == .invalid || validatorError == .notWordPressError, "Got an error: \(error)" + ) failure.fulfill() } wait(for: [failure], timeout: 0.3) } - func testSuccessWithSiteAddress() { + func testSuccessWithSiteAddress() throws { + let stubPath = try XCTUnwrap(responseListMethods) stub(condition: isHost("www.apple.com") && isPath("/blog/xmlrpc.php")) { _ in fixture( - filePath: OHPathForFile("xmlrpc-response-list-methods.xml", type(of: self))!, + filePath: stubPath, status: 200, headers: [ "Content-Type": "application/xml" @@ -135,34 +162,39 @@ final class WordPressOrgXMLRPCValidatorTests: XCTestCase { let success = self.expectation(description: "success result") let validator = WordPressOrgXMLRPCValidator() - validator.guessXMLRPCURLForSite("https://www.apple.com/blog", userAgent: "test/1.0", success: { - XCTAssertEqual($0.absoluteString, "https://www.apple.com/blog/xmlrpc.php") - success.fulfill() - }) { + validator.guessXMLRPCURLForSite( + "https://www.apple.com/blog", userAgent: "test/1.0", + success: { + XCTAssertEqual($0.absoluteString, "https://www.apple.com/blog/xmlrpc.php") + success.fulfill() + } + ) { XCTFail("Unexpected result: \($0)") } wait(for: [success], timeout: 0.3) } - func testSuccessWithIrregularXMLRPCAddress() { + func testSuccessWithIrregularXMLRPCAddress() throws { let apiCalls = [ expectation(description: "Request #1: call xmlrpc.php"), expectation(description: "Request #2: call the url argument"), ] + let stubPathInvalid = try XCTUnwrap(responseInvalidHTML) stub(condition: isHost("www.apple.com") && isPath("/blog/xmlrpc.php")) { _ in apiCalls[0].fulfill() return fixture( - filePath: OHPathForFile("xmlrpc-response-invalid.html", type(of: self))!, + filePath: stubPathInvalid, status: 403, headers: nil ) } + let stubPathList = try XCTUnwrap(responseListMethods) stub(condition: isHost("www.apple.com") && isPath("/blog")) { _ in apiCalls[1].fulfill() return fixture( - filePath: OHPathForFile("xmlrpc-response-list-methods.xml", type(of: self))!, + filePath: stubPathList, status: 200, headers: [ "Content-Type": "application/xml" @@ -172,19 +204,23 @@ final class WordPressOrgXMLRPCValidatorTests: XCTestCase { let success = self.expectation(description: "success result") let validator = WordPressOrgXMLRPCValidator() - validator.guessXMLRPCURLForSite("https://www.apple.com/blog", userAgent: "test/1.0", success: { - XCTAssertEqual($0.absoluteString, "https://www.apple.com/blog") - success.fulfill() - }) { + validator.guessXMLRPCURLForSite( + "https://www.apple.com/blog", userAgent: "test/1.0", + success: { + XCTAssertEqual($0.absoluteString, "https://www.apple.com/blog") + success.fulfill() + } + ) { XCTFail("Unexpected result: \($0)") } wait(for: apiCalls + [success], timeout: 0.3, enforceOrder: true) } - func testSuccessWithRSDLink() { + func testSuccessWithRSDLink() throws { + let stubPath = try XCTUnwrap(responseInvalidHTML) stub(condition: isHost("www.apple.com") && isPath("/blog/xmlrpc.php")) { _ in return fixture( - filePath: OHPathForFile("xmlrpc-response-invalid.html", type(of: self))!, + filePath: stubPath, status: 403, headers: nil ) @@ -192,36 +228,36 @@ final class WordPressOrgXMLRPCValidatorTests: XCTestCase { stub(condition: isHost("www.apple.com") && isPath("/blog")) { _ in let html = """ - - - - - test site - - hello world - - """ + + + + + test site + + hello world + + """ return HTTPStubsResponse(data: html.data(using: .utf8)!, statusCode: 200, headers: nil) } stub(condition: isAbsoluteURLString("https://www.apple.com/blog/rsd")) { _ in // Grabbed from https://developer.wordpress.org/xmlrpc.php?rsd let xml = """ - - - WordPress - https://wordpress.org/ - https://developer.wordpress.org - - - - - - - - - - """ + + + WordPress + https://wordpress.org/ + https://developer.wordpress.org + + + + + + + + + + """ return HTTPStubsResponse( data: xml.data(using: .utf8)!, statusCode: 200, @@ -231,9 +267,10 @@ final class WordPressOrgXMLRPCValidatorTests: XCTestCase { ) } + let listStubPath = try XCTUnwrap(responseListMethods) stub(condition: isHost("www.apple.com") && isPath("/blog-xmlrpc.php")) { _ in fixture( - filePath: OHPathForFile("xmlrpc-response-list-methods.xml", type(of: self))!, + filePath: listStubPath, status: 200, headers: [ "Content-Type": "application/xml" @@ -243,29 +280,36 @@ final class WordPressOrgXMLRPCValidatorTests: XCTestCase { let success = self.expectation(description: "success result") let validator = WordPressOrgXMLRPCValidator() - validator.guessXMLRPCURLForSite("https://www.apple.com/blog", userAgent: "test/1.0", success: { - XCTAssertEqual($0.absoluteString, "https://www.apple.com/blog-xmlrpc.php") - success.fulfill() - }) { + validator.guessXMLRPCURLForSite( + "https://www.apple.com/blog", userAgent: "test/1.0", + success: { + XCTAssertEqual($0.absoluteString, "https://www.apple.com/blog-xmlrpc.php") + success.fulfill() + } + ) { XCTFail("Unexpected result: \($0)") } wait(for: [success], timeout: 0.3) } - func testManyRedirectsError() { + func testManyRedirectsError() throws { // redirect 'POST /redirect/' to '/redirect/'. for number in 1...30 { stub(condition: isMethodPOST() && { $0.url!.path.hasPrefix("/redirect/\(number)-req") }) { - HTTPStubsResponse(data: Data(), statusCode: 302, headers: [ - "Location": $0.url!.absoluteString.replacingOccurrences(of: "/redirect/\(number)-req", with: "/redirect/\(number + 1)-req") - ]) + HTTPStubsResponse( + data: Data(), statusCode: 302, + headers: [ + "Location": $0.url!.absoluteString.replacingOccurrences( + of: "/redirect/\(number)-req", with: "/redirect/\(number + 1)-req") + ]) } } - // All GET requests get a html webpage. + // All GET requests get a HTML webpage. + let stubPath = try XCTUnwrap(responseInvalidHTML) stub(condition: isMethodGET()) { _ in fixture( - filePath: OHPathForFile("xmlrpc-response-invalid.html", type(of: self))!, + filePath: stubPath, status: 405, headers: nil ) @@ -273,14 +317,17 @@ final class WordPressOrgXMLRPCValidatorTests: XCTestCase { let failure = self.expectation(description: "returns error") let validator = WordPressOrgXMLRPCValidator() - validator.guessXMLRPCURLForSite("https://www.apple.com/redirect/1-req", userAgent: "test/1.0", success: { - XCTFail("Unexpected result: \($0)") - }) { error in + validator.guessXMLRPCURLForSite( + "https://www.apple.com/redirect/1-req", userAgent: "test/1.0", + success: { + XCTFail("Unexpected result: \($0)") + } + ) { error in // The test site here returns many redirection response, a 'httpTooManyRedirects' is the best error // case to represent the error. But the current implementation returns an 'invalid' error, which is true too. XCTAssertTrue( (error as? WordPressOrgXMLRPCValidatorError == .invalid) - || (error as? URLError) == URLError(URLError.Code.httpTooManyRedirects), + || (error as? URLError) == URLError(URLError.Code.httpTooManyRedirects), "Got an error: \(error)" ) failure.fulfill() @@ -288,26 +335,30 @@ final class WordPressOrgXMLRPCValidatorTests: XCTestCase { wait(for: [failure], timeout: 0.3) } - func testMobilePluginRedirectedError() { + func testMobilePluginRedirectedError() throws { // redirect 'POST /redirect/' to '/redirect/'. stub(condition: isMethodPOST() && isHost("www.apple.com")) { _ in - HTTPStubsResponse(data: Data(), statusCode: 302, headers: [ - "Location": "https://m.apple.com" - ]) + HTTPStubsResponse( + data: Data(), statusCode: 302, + headers: [ + "Location": "https://m.apple.com" + ]) } + let stubPath = try XCTUnwrap( + OHPathForFileInBundle("xmlrpc-response-mobile-plugin-redirect.html", Bundle.coreAPITestsBundle) + ) stub(condition: isMethodPOST() && isHost("m.apple.com")) { _ in - fixture( - filePath: OHPathForFile("xmlrpc-response-mobile-plugin-redirect.html", type(of: self))!, - status: 200, - headers: nil - ) + fixture(filePath: stubPath, status: 200, headers: nil) } let failure = self.expectation(description: "returns error") let validator = WordPressOrgXMLRPCValidator() - validator.guessXMLRPCURLForSite("https://www.apple.com/xmlrpc.php", userAgent: "test/1.0", success: { - XCTFail("Unexpected result: \($0)") - }) { error in + validator.guessXMLRPCURLForSite( + "https://www.apple.com/xmlrpc.php", userAgent: "test/1.0", + success: { + XCTFail("Unexpected result: \($0)") + } + ) { error in XCTAssertTrue(error is WordPressOrgXMLRPCValidatorError) // The test site here returns many redirection response, a 'httpTooManyRedirects' is the best error // case to represent the error. But the current implementation returns an 'invalid' error, which is true too. @@ -325,35 +376,42 @@ final class WordPressOrgXMLRPCValidatorTests: XCTestCase { let failure = self.expectation(description: "returns error") let validator = WordPressOrgXMLRPCValidator() - validator.guessXMLRPCURLForSite("https://www.apple.com/xmlrpc.php", userAgent: "test/1.0", success: { - XCTFail("Unexpected result: \($0)") - }) { error in + validator.guessXMLRPCURLForSite( + "https://www.apple.com/xmlrpc.php", userAgent: "test/1.0", + success: { + XCTFail("Unexpected result: \($0)") + } + ) { error in XCTAssertTrue(error is WordPressOrgXMLRPCValidatorError) let validatorError = error as? WordPressOrgXMLRPCValidatorError // The site returns 403 for all requests, a 'forbidden' error is the best error case to represent the error. // But the current implementation returns an 'invalid' error, which is true too. - XCTAssertTrue(validatorError == .invalid || validatorError == .forbidden, "Got an error: \(error)") + XCTAssertTrue( + validatorError == .invalid || validatorError == .forbidden, "Got an error: \(error)") failure.fulfill() } wait(for: [failure], timeout: 0.3) } func testXMLRPCMissingError() { - stub(condition: isAbsoluteURLString("https://www.apple.com/xmlrpc.php") || isAbsoluteURLString("http://www.apple.com/xmlrpc.php")) { _ in + stub( + condition: isAbsoluteURLString("https://www.apple.com/xmlrpc.php") + || isAbsoluteURLString("http://www.apple.com/xmlrpc.php") + ) { _ in HTTPStubsResponse(data: Data(), statusCode: 403, headers: nil) } stub(condition: isHost("www.apple.com") && isMethodGET()) { _ in let html = """ - - - - - test site - - hello world - - """ + + + + + test site + + hello world + + """ return HTTPStubsResponse(data: html.data(using: .utf8)!, statusCode: 200, headers: nil) } @@ -363,14 +421,18 @@ final class WordPressOrgXMLRPCValidatorTests: XCTestCase { let failure = self.expectation(description: "returns error") let validator = WordPressOrgXMLRPCValidator() - validator.guessXMLRPCURLForSite("https://www.apple.com/xmlrpc.php", userAgent: "test/1.0", success: { - XCTFail("Unexpected result: \($0)") - }) { error in + validator.guessXMLRPCURLForSite( + "https://www.apple.com/xmlrpc.php", userAgent: "test/1.0", + success: { + XCTFail("Unexpected result: \($0)") + } + ) { error in XCTAssertTrue(error is WordPressOrgXMLRPCValidatorError) let validatorError = error as? WordPressOrgXMLRPCValidatorError // The site returns provides a RSD link that returns 404. A 'xmlrpc_missing' error is the best error case // to represent the error. But the current implementation returns an 'invalid' error, which is true too. - XCTAssertTrue(validatorError == .xmlrpc_missing || validatorError == .invalid, "Got an error: \(error)") + XCTAssertTrue( + validatorError == .xmlrpc_missing || validatorError == .invalid, "Got an error: \(error)") failure.fulfill() } wait(for: [failure], timeout: 0.3) @@ -378,8 +440,8 @@ final class WordPressOrgXMLRPCValidatorTests: XCTestCase { } -private extension WordPressOrgXMLRPCValidatorTests { - func makeUnsecuredAppTransportSecuritySettings() -> AppTransportSecuritySettings { +extension WordPressOrgXMLRPCValidatorTests { + fileprivate func makeUnsecuredAppTransportSecuritySettings() -> AppTransportSecuritySettings { let provider = FakeInfoDictionaryObjectProvider(appTransportSecurity: [ "NSAllowsArbitraryLoads": true ]) diff --git a/WordPressKitTests/AccountServiceRemoteRESTTests.swift b/Tests/WordPressKitTests/AccountObjcTests/AccountServiceRemoteRESTTests.swift similarity index 100% rename from WordPressKitTests/AccountServiceRemoteRESTTests.swift rename to Tests/WordPressKitTests/AccountObjcTests/AccountServiceRemoteRESTTests.swift diff --git a/WordPressKitTests/AccountSettingsRemoteTests.swift b/Tests/WordPressKitTests/AccountSettingsRemoteTests.swift similarity index 100% rename from WordPressKitTests/AccountSettingsRemoteTests.swift rename to Tests/WordPressKitTests/AccountSettingsRemoteTests.swift diff --git a/WordPressKitTests/ActivityServiceRemoteTests.swift b/Tests/WordPressKitTests/ActivityServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/ActivityServiceRemoteTests.swift rename to Tests/WordPressKitTests/ActivityServiceRemoteTests.swift diff --git a/WordPressKitTests/ActivityTests.swift b/Tests/WordPressKitTests/ActivityTests.swift similarity index 100% rename from WordPressKitTests/ActivityTests.swift rename to Tests/WordPressKitTests/ActivityTests.swift diff --git a/WordPressKitTests/AllDomainsResultDomainTests.swift b/Tests/WordPressKitTests/AllDomainsResultDomainTests.swift similarity index 100% rename from WordPressKitTests/AllDomainsResultDomainTests.swift rename to Tests/WordPressKitTests/AllDomainsResultDomainTests.swift diff --git a/WordPressKitTests/AtomicAuthenticationServiceRemoteTests.swift b/Tests/WordPressKitTests/AtomicAuthenticationServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/AtomicAuthenticationServiceRemoteTests.swift rename to Tests/WordPressKitTests/AtomicAuthenticationServiceRemoteTests.swift diff --git a/WordPressKitTests/BlazeServiceRemoteTests.swift b/Tests/WordPressKitTests/BlazeServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/BlazeServiceRemoteTests.swift rename to Tests/WordPressKitTests/BlazeServiceRemoteTests.swift diff --git a/WordPressKitTests/BlockEditorSettingsServiceRemoteTests.swift b/Tests/WordPressKitTests/BlockEditorSettingsServiceRemoteTests.swift similarity index 99% rename from WordPressKitTests/BlockEditorSettingsServiceRemoteTests.swift rename to Tests/WordPressKitTests/BlockEditorSettingsServiceRemoteTests.swift index e81a8afc..badc4dc9 100644 --- a/WordPressKitTests/BlockEditorSettingsServiceRemoteTests.swift +++ b/Tests/WordPressKitTests/BlockEditorSettingsServiceRemoteTests.swift @@ -1,6 +1,9 @@ -import XCTest +#if SWIFT_PACKAGE +import CoreAPI +#endif import OHHTTPStubs @testable import WordPressKit +import XCTest class BlockEditorSettingsServiceRemoteTests: XCTestCase { private let blockSettingsNOTThemeJSONResponseFilename = "wp-block-editor-v1-settings-success-NotThemeJSON.json" diff --git a/WordPressKitTests/BlogServiceRemote+ActiveFeaturesTests.swift b/Tests/WordPressKitTests/BlogServiceRemote+ActiveFeaturesTests.swift similarity index 100% rename from WordPressKitTests/BlogServiceRemote+ActiveFeaturesTests.swift rename to Tests/WordPressKitTests/BlogServiceRemote+ActiveFeaturesTests.swift diff --git a/WordPressKitTests/BlogServiceRemoteRESTTests.m b/Tests/WordPressKitTests/BlogServiceRemoteRESTTests.m similarity index 100% rename from WordPressKitTests/BlogServiceRemoteRESTTests.m rename to Tests/WordPressKitTests/BlogServiceRemoteRESTTests.m diff --git a/WordPressKitTests/BloggingPromptsServiceRemoteTests.swift b/Tests/WordPressKitTests/BloggingPromptsServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/BloggingPromptsServiceRemoteTests.swift rename to Tests/WordPressKitTests/BloggingPromptsServiceRemoteTests.swift diff --git a/WordPressKitTests/WordPressComServiceRemoteRestTests.swift b/Tests/WordPressKitTests/ComAPIBasicTests/WordPressComServiceRemoteRestTests.swift similarity index 96% rename from WordPressKitTests/WordPressComServiceRemoteRestTests.swift rename to Tests/WordPressKitTests/ComAPIBasicTests/WordPressComServiceRemoteRestTests.swift index 6c01f502..6ae81eab 100644 --- a/WordPressKitTests/WordPressComServiceRemoteRestTests.swift +++ b/Tests/WordPressKitTests/ComAPIBasicTests/WordPressComServiceRemoteRestTests.swift @@ -45,7 +45,7 @@ class WordPressComServiceRemoteRestTests: XCTestCase { func testThrottledFailureCall() { stub(condition: isRestAPIUsersNewRequest()) { _ in - let stubPath = OHPathForFile("WordPressComRestApiFailThrottled.json", type(of: self)) + let stubPath = OHPathForFile("wp-com-rest-api-fail-throttled.json", type(of: self)) return fixture(filePath: stubPath!, status: 500, headers: ["Content-Type" as NSObject: "application/html" as AnyObject]) } diff --git a/WordPressKitTests/CommentServiceRemoteREST+APIv2Tests.swift b/Tests/WordPressKitTests/CommentServiceRemoteREST+APIv2Tests.swift similarity index 97% rename from WordPressKitTests/CommentServiceRemoteREST+APIv2Tests.swift rename to Tests/WordPressKitTests/CommentServiceRemoteREST+APIv2Tests.swift index 613959d6..6f4651cb 100644 --- a/WordPressKitTests/CommentServiceRemoteREST+APIv2Tests.swift +++ b/Tests/WordPressKitTests/CommentServiceRemoteREST+APIv2Tests.swift @@ -1,3 +1,6 @@ +#if SWIFT_PACKAGE +import CoreAPI +#endif import Foundation import XCTest import OHHTTPStubs @@ -41,7 +44,7 @@ final class CommentServiceRemoteREST_APIv2Tests: RemoteTestCase, RESTTestable { XCTAssertEqual(firstComment.authorID, 135) XCTAssertEqual(firstComment.authorName, "John Doe") XCTAssertEqual(firstComment.authorURL, "https://example.com/john-doe") - XCTAssertEqual(firstComment.date, NSDate(wordPressComJSONString: "2021-07-01T10:50:11+00:00") as Date) + XCTAssertEqual(firstComment.date, NSDate.with(wordPressComJSONString: "2021-07-01T10:50:11+00:00")) XCTAssertEqual(firstComment.content, "

Some example comment.

\n") XCTAssertEqual(firstComment.link, "https://example.com/2021/05/25/example-post/comment-page-1/#comment-2") XCTAssertEqual(firstComment.status, "approve") // verify that it's converted correctly. diff --git a/WordPressKitTests/CommentServiceRemoteRESTLikesTests.swift b/Tests/WordPressKitTests/CommentServiceRemoteRESTLikesTests.swift similarity index 100% rename from WordPressKitTests/CommentServiceRemoteRESTLikesTests.swift rename to Tests/WordPressKitTests/CommentServiceRemoteRESTLikesTests.swift diff --git a/WordPressKitTests/CommentServiceRemoteRESTTests.swift b/Tests/WordPressKitTests/CommentServiceRemoteRESTTests.swift similarity index 94% rename from WordPressKitTests/CommentServiceRemoteRESTTests.swift rename to Tests/WordPressKitTests/CommentServiceRemoteRESTTests.swift index cc1df856..32195782 100644 --- a/WordPressKitTests/CommentServiceRemoteRESTTests.swift +++ b/Tests/WordPressKitTests/CommentServiceRemoteRESTTests.swift @@ -1,3 +1,6 @@ +#if SWIFT_PACKAGE +import CoreAPI +#endif import Foundation import XCTest @@ -50,7 +53,7 @@ final class CommentServiceRemoteRESTTests: RemoteTestCase, RESTTestable { XCTAssertEqual(comment.authorEmail, "author@email.com") XCTAssertEqual(comment.authorUrl, "author URL") XCTAssertEqual(comment.authorIP, "000.0.00.000") - XCTAssertEqual(comment.date, NSDate(wordPressComJSONString: "2021-08-04T07:58:49+00:00") as Date) + XCTAssertEqual(comment.date, NSDate.with(wordPressComJSONString: "2021-08-04T07:58:49+00:00")) XCTAssertEqual(comment.link, "comment URL") XCTAssertEqual(comment.parentID, nil) XCTAssertEqual(comment.postID, NSNumber(value: 1)) @@ -91,7 +94,7 @@ final class CommentServiceRemoteRESTTests: RemoteTestCase, RESTTestable { XCTAssertEqual(comment.authorEmail, "author@email.com") XCTAssertEqual(comment.authorUrl, "author URL") XCTAssertEqual(comment.authorIP, "000.0.00.000") - XCTAssertEqual(comment.date, NSDate(wordPressComJSONString: "2021-08-04T07:58:49+00:00") as Date) + XCTAssertEqual(comment.date, NSDate.with(wordPressComJSONString: "2021-08-04T07:58:49+00:00")) XCTAssertEqual(comment.link, "comment URL") XCTAssertEqual(comment.parentID, nil) XCTAssertEqual(comment.postID, NSNumber(value: 1)) diff --git a/WordPressKitTests/CommentServiceRemoteXMLRPCTests.swift b/Tests/WordPressKitTests/CommentServiceRemoteXMLRPCTests.swift similarity index 100% rename from WordPressKitTests/CommentServiceRemoteXMLRPCTests.swift rename to Tests/WordPressKitTests/CommentServiceRemoteXMLRPCTests.swift diff --git a/WordPressKitTests/DashboardServiceRemoteTests.swift b/Tests/WordPressKitTests/DashboardServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/DashboardServiceRemoteTests.swift rename to Tests/WordPressKitTests/DashboardServiceRemoteTests.swift diff --git a/WordPressKitTests/DomainsServiceRemoteRESTTests.swift b/Tests/WordPressKitTests/DomainsServiceRemoteRESTTests.swift similarity index 100% rename from WordPressKitTests/DomainsServiceRemoteRESTTests.swift rename to Tests/WordPressKitTests/DomainsServiceRemoteRESTTests.swift diff --git a/WordPressKitTests/DynamicMockProvider.swift b/Tests/WordPressKitTests/DynamicMockProvider.swift similarity index 100% rename from WordPressKitTests/DynamicMockProvider.swift rename to Tests/WordPressKitTests/DynamicMockProvider.swift diff --git a/WordPressKitTests/EditorServiceRemoteTests.swift b/Tests/WordPressKitTests/EditorServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/EditorServiceRemoteTests.swift rename to Tests/WordPressKitTests/EditorServiceRemoteTests.swift diff --git a/WordPressKitTests/Extensions/Decodable+DictionaryTests.swift b/Tests/WordPressKitTests/Extensions/Decodable+DictionaryTests.swift similarity index 100% rename from WordPressKitTests/Extensions/Decodable+DictionaryTests.swift rename to Tests/WordPressKitTests/Extensions/Decodable+DictionaryTests.swift diff --git a/WordPressKitTests/IPLocationRemoteTests.swift b/Tests/WordPressKitTests/IPLocationRemoteTests.swift similarity index 100% rename from WordPressKitTests/IPLocationRemoteTests.swift rename to Tests/WordPressKitTests/IPLocationRemoteTests.swift diff --git a/WordPressKitTests/Info.plist b/Tests/WordPressKitTests/Info.plist similarity index 100% rename from WordPressKitTests/Info.plist rename to Tests/WordPressKitTests/Info.plist diff --git a/WordPressKitTests/JSONLoader.swift b/Tests/WordPressKitTests/JSONLoader.swift similarity index 100% rename from WordPressKitTests/JSONLoader.swift rename to Tests/WordPressKitTests/JSONLoader.swift diff --git a/WordPressKitTests/JetpackBackupServiceRemoteTests.swift b/Tests/WordPressKitTests/JetpackBackupServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/JetpackBackupServiceRemoteTests.swift rename to Tests/WordPressKitTests/JetpackBackupServiceRemoteTests.swift diff --git a/WordPressKitTests/JetpackCapabilitiesServiceRemoteTests.swift b/Tests/WordPressKitTests/JetpackCapabilitiesServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/JetpackCapabilitiesServiceRemoteTests.swift rename to Tests/WordPressKitTests/JetpackCapabilitiesServiceRemoteTests.swift diff --git a/WordPressKitTests/JetpackProxyServiceRemoteTests.swift b/Tests/WordPressKitTests/JetpackProxyServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/JetpackProxyServiceRemoteTests.swift rename to Tests/WordPressKitTests/JetpackProxyServiceRemoteTests.swift diff --git a/WordPressKitTests/JetpackServiceRemoteTests.swift b/Tests/WordPressKitTests/JetpackServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/JetpackServiceRemoteTests.swift rename to Tests/WordPressKitTests/JetpackServiceRemoteTests.swift diff --git a/WordPressKitTests/LoadMediaLibraryTests.swift b/Tests/WordPressKitTests/LoadMediaLibraryTests.swift similarity index 100% rename from WordPressKitTests/LoadMediaLibraryTests.swift rename to Tests/WordPressKitTests/LoadMediaLibraryTests.swift diff --git a/WordPressKitTests/MediaLibraryTestSupport.swift b/Tests/WordPressKitTests/MediaLibraryTestSupport.swift similarity index 100% rename from WordPressKitTests/MediaLibraryTestSupport.swift rename to Tests/WordPressKitTests/MediaLibraryTestSupport.swift diff --git a/WordPressKitTests/MediaServiceRemoteRESTTests.swift b/Tests/WordPressKitTests/MediaServiceRemoteRESTTests.swift similarity index 100% rename from WordPressKitTests/MediaServiceRemoteRESTTests.swift rename to Tests/WordPressKitTests/MediaServiceRemoteRESTTests.swift diff --git a/WordPressKitTests/MenusServiceRemoteTests.m b/Tests/WordPressKitTests/MenusServiceRemoteTests.m similarity index 100% rename from WordPressKitTests/MenusServiceRemoteTests.m rename to Tests/WordPressKitTests/MenusServiceRemoteTests.m diff --git a/WordPressKitTests/MockPluginDirectoryEntryProvider.swift b/Tests/WordPressKitTests/MockPluginDirectoryEntryProvider.swift similarity index 100% rename from WordPressKitTests/MockPluginDirectoryEntryProvider.swift rename to Tests/WordPressKitTests/MockPluginDirectoryEntryProvider.swift diff --git a/WordPressKitTests/MockPluginStateProvider.swift b/Tests/WordPressKitTests/MockPluginStateProvider.swift similarity index 100% rename from WordPressKitTests/MockPluginStateProvider.swift rename to Tests/WordPressKitTests/MockPluginStateProvider.swift diff --git a/WordPressKitTests/MockServiceRequest.swift b/Tests/WordPressKitTests/MockServiceRequest.swift similarity index 100% rename from WordPressKitTests/MockServiceRequest.swift rename to Tests/WordPressKitTests/MockServiceRequest.swift diff --git a/WordPressKitTests/MockWordPressComRestApi.swift b/Tests/WordPressKitTests/MockWordPressComRestApi.swift similarity index 100% rename from WordPressKitTests/MockWordPressComRestApi.swift rename to Tests/WordPressKitTests/MockWordPressComRestApi.swift diff --git a/WordPressKitTests/Models/RemotePersonTests.swift b/Tests/WordPressKitTests/Models/RemotePersonTests.swift similarity index 100% rename from WordPressKitTests/Models/RemotePersonTests.swift rename to Tests/WordPressKitTests/Models/RemotePersonTests.swift diff --git a/WordPressKitTests/Models/RemoteVideoPressVideoTests.swift b/Tests/WordPressKitTests/Models/RemoteVideoPressVideoTests.swift similarity index 100% rename from WordPressKitTests/Models/RemoteVideoPressVideoTests.swift rename to Tests/WordPressKitTests/Models/RemoteVideoPressVideoTests.swift diff --git a/WordPressKitTests/Models/Stats/V2/Insights/StatsDotComFollowersInsightTests.swift b/Tests/WordPressKitTests/Models/Stats/V2/Insights/StatsDotComFollowersInsightTests.swift similarity index 98% rename from WordPressKitTests/Models/Stats/V2/Insights/StatsDotComFollowersInsightTests.swift rename to Tests/WordPressKitTests/Models/Stats/V2/Insights/StatsDotComFollowersInsightTests.swift index a0825bb0..961aee89 100644 --- a/WordPressKitTests/Models/Stats/V2/Insights/StatsDotComFollowersInsightTests.swift +++ b/Tests/WordPressKitTests/Models/Stats/V2/Insights/StatsDotComFollowersInsightTests.swift @@ -1,5 +1,6 @@ -import XCTest +import Alamofire // for the URLComponents asURL() call @testable import WordPressKit +import XCTest class StatsDotComFollowersInsightTests: XCTestCase { diff --git a/WordPressKitTests/NotificationSyncServiceRemoteTests.swift b/Tests/WordPressKitTests/NotificationSyncServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/NotificationSyncServiceRemoteTests.swift rename to Tests/WordPressKitTests/NotificationSyncServiceRemoteTests.swift diff --git a/WordPressKitTests/PageLayoutServiceRemoteTests.swift b/Tests/WordPressKitTests/PageLayoutServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/PageLayoutServiceRemoteTests.swift rename to Tests/WordPressKitTests/PageLayoutServiceRemoteTests.swift diff --git a/WordPressKitTests/PeopleServiceRemoteTests.swift b/Tests/WordPressKitTests/PeopleServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/PeopleServiceRemoteTests.swift rename to Tests/WordPressKitTests/PeopleServiceRemoteTests.swift diff --git a/WordPressKitTests/PlanServiceRemoteTests.swift b/Tests/WordPressKitTests/PlanServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/PlanServiceRemoteTests.swift rename to Tests/WordPressKitTests/PlanServiceRemoteTests.swift diff --git a/WordPressKitTests/PluginDirectoryTests.swift b/Tests/WordPressKitTests/PluginDirectoryTests.swift similarity index 100% rename from WordPressKitTests/PluginDirectoryTests.swift rename to Tests/WordPressKitTests/PluginDirectoryTests.swift diff --git a/WordPressKitTests/PluginServiceRemoteTests.swift b/Tests/WordPressKitTests/PluginServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/PluginServiceRemoteTests.swift rename to Tests/WordPressKitTests/PluginServiceRemoteTests.swift diff --git a/WordPressKitTests/PluginStateTests.swift b/Tests/WordPressKitTests/PluginStateTests.swift similarity index 100% rename from WordPressKitTests/PluginStateTests.swift rename to Tests/WordPressKitTests/PluginStateTests.swift diff --git a/WordPressKitTests/PostServiceRemoteRESTAutosaveTests.swift b/Tests/WordPressKitTests/PostServiceRemoteRESTAutosaveTests.swift similarity index 95% rename from WordPressKitTests/PostServiceRemoteRESTAutosaveTests.swift rename to Tests/WordPressKitTests/PostServiceRemoteRESTAutosaveTests.swift index 8b85dfbd..a9606a6f 100644 --- a/WordPressKitTests/PostServiceRemoteRESTAutosaveTests.swift +++ b/Tests/WordPressKitTests/PostServiceRemoteRESTAutosaveTests.swift @@ -1,3 +1,6 @@ +#if SWIFT_PACKAGE +import CoreAPI +#endif import Foundation import XCTest @@ -41,7 +44,7 @@ class PostServiceRemoteRESTAutosaveTests: RemoteTestCase, RESTTestable { XCTAssertEqual(remotePost.autosave.content, "\n

Uno.

\n") XCTAssertEqual(remotePost.autosave.excerpt, "abc") XCTAssertEqual(remotePost.autosave.previewURL, "https://hello.wordpress.com/2019/10/28/hello-world/?preview=true&preview_nonce=07346f4e5d") - XCTAssertEqual(remotePost.autosave.modifiedDate, NSDate(wordPressComJSONString: "2019-10-28T02:06:39+00:00") as Date?) + XCTAssertEqual(remotePost.autosave.modifiedDate, NSDate.with(wordPressComJSONString: "2019-10-28T02:06:39+00:00")) expect.fulfill() }, failure: { _ in XCTFail("This callback shouldn't get called") diff --git a/WordPressKitTests/PostServiceRemoteRESTLikesTests.swift b/Tests/WordPressKitTests/PostServiceRemoteRESTLikesTests.swift similarity index 100% rename from WordPressKitTests/PostServiceRemoteRESTLikesTests.swift rename to Tests/WordPressKitTests/PostServiceRemoteRESTLikesTests.swift diff --git a/WordPressKitTests/PostServiceRemoteRESTRevisionsTest.swift b/Tests/WordPressKitTests/PostServiceRemoteRESTRevisionsTest.swift similarity index 100% rename from WordPressKitTests/PostServiceRemoteRESTRevisionsTest.swift rename to Tests/WordPressKitTests/PostServiceRemoteRESTRevisionsTest.swift diff --git a/WordPressKitTests/PostServiceRemoteRESTTests.m b/Tests/WordPressKitTests/PostServiceRemoteRESTTests.m similarity index 100% rename from WordPressKitTests/PostServiceRemoteRESTTests.m rename to Tests/WordPressKitTests/PostServiceRemoteRESTTests.m diff --git a/WordPressKitTests/PostServiceRemoteXMLRPCTests.swift b/Tests/WordPressKitTests/PostServiceRemoteXMLRPCTests.swift similarity index 100% rename from WordPressKitTests/PostServiceRemoteXMLRPCTests.swift rename to Tests/WordPressKitTests/PostServiceRemoteXMLRPCTests.swift diff --git a/WordPressKitTests/PushAuthenticationServiceRemoteTests.swift b/Tests/WordPressKitTests/PushAuthenticationServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/PushAuthenticationServiceRemoteTests.swift rename to Tests/WordPressKitTests/PushAuthenticationServiceRemoteTests.swift diff --git a/WordPressKitTests/RESTTestable.swift b/Tests/WordPressKitTests/RESTTestable.swift similarity index 100% rename from WordPressKitTests/RESTTestable.swift rename to Tests/WordPressKitTests/RESTTestable.swift diff --git a/WordPressKitTests/ReaderPostServiceRemote+CardsTests.swift b/Tests/WordPressKitTests/ReaderPostServiceRemote+CardsTests.swift similarity index 100% rename from WordPressKitTests/ReaderPostServiceRemote+CardsTests.swift rename to Tests/WordPressKitTests/ReaderPostServiceRemote+CardsTests.swift diff --git a/WordPressKitTests/ReaderPostServiceRemote+FetchEndpointTests.swift b/Tests/WordPressKitTests/ReaderPostServiceRemote+FetchEndpointTests.swift similarity index 100% rename from WordPressKitTests/ReaderPostServiceRemote+FetchEndpointTests.swift rename to Tests/WordPressKitTests/ReaderPostServiceRemote+FetchEndpointTests.swift diff --git a/WordPressKitTests/ReaderPostServiceRemote+RelatedPostsTests.swift b/Tests/WordPressKitTests/ReaderPostServiceRemote+RelatedPostsTests.swift similarity index 100% rename from WordPressKitTests/ReaderPostServiceRemote+RelatedPostsTests.swift rename to Tests/WordPressKitTests/ReaderPostServiceRemote+RelatedPostsTests.swift diff --git a/WordPressKitTests/ReaderPostServiceRemote+SubscriptionTests.swift b/Tests/WordPressKitTests/ReaderPostServiceRemote+SubscriptionTests.swift similarity index 100% rename from WordPressKitTests/ReaderPostServiceRemote+SubscriptionTests.swift rename to Tests/WordPressKitTests/ReaderPostServiceRemote+SubscriptionTests.swift diff --git a/WordPressKitTests/ReaderPostServiceRemoteTests.m b/Tests/WordPressKitTests/ReaderPostServiceRemoteTests.m similarity index 100% rename from WordPressKitTests/ReaderPostServiceRemoteTests.m rename to Tests/WordPressKitTests/ReaderPostServiceRemoteTests.m diff --git a/WordPressKitTests/ReaderSiteSearchServiceRemoteTests.swift b/Tests/WordPressKitTests/ReaderSiteSearchServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/ReaderSiteSearchServiceRemoteTests.swift rename to Tests/WordPressKitTests/ReaderSiteSearchServiceRemoteTests.swift diff --git a/WordPressKitTests/ReaderSiteServiceRemoteTests.swift b/Tests/WordPressKitTests/ReaderSiteServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/ReaderSiteServiceRemoteTests.swift rename to Tests/WordPressKitTests/ReaderSiteServiceRemoteTests.swift diff --git a/WordPressKitTests/ReaderTopicServiceRemote+InterestsTests.swift b/Tests/WordPressKitTests/ReaderTopicServiceRemote+InterestsTests.swift similarity index 100% rename from WordPressKitTests/ReaderTopicServiceRemote+InterestsTests.swift rename to Tests/WordPressKitTests/ReaderTopicServiceRemote+InterestsTests.swift diff --git a/WordPressKitTests/ReaderTopicServiceRemoteTest+Subscriptions.swift b/Tests/WordPressKitTests/ReaderTopicServiceRemoteTest+Subscriptions.swift similarity index 100% rename from WordPressKitTests/ReaderTopicServiceRemoteTest+Subscriptions.swift rename to Tests/WordPressKitTests/ReaderTopicServiceRemoteTest+Subscriptions.swift diff --git a/WordPressKitTests/ReaderTopicServiceRemoteTests.m b/Tests/WordPressKitTests/ReaderTopicServiceRemoteTests.m similarity index 100% rename from WordPressKitTests/ReaderTopicServiceRemoteTests.m rename to Tests/WordPressKitTests/ReaderTopicServiceRemoteTests.m diff --git a/WordPressKitTests/RemoteNotificationTests.swift b/Tests/WordPressKitTests/RemoteNotificationTests.swift similarity index 100% rename from WordPressKitTests/RemoteNotificationTests.swift rename to Tests/WordPressKitTests/RemoteNotificationTests.swift diff --git a/WordPressKitTests/RemoteReaderPostTests+V2.swift b/Tests/WordPressKitTests/RemoteReaderPostTests+V2.swift similarity index 100% rename from WordPressKitTests/RemoteReaderPostTests+V2.swift rename to Tests/WordPressKitTests/RemoteReaderPostTests+V2.swift diff --git a/WordPressKitTests/RemoteReaderPostTests.m b/Tests/WordPressKitTests/RemoteReaderPostTests.m similarity index 100% rename from WordPressKitTests/RemoteReaderPostTests.m rename to Tests/WordPressKitTests/RemoteReaderPostTests.m diff --git a/WordPressKitTests/RemoteReaderSiteInfoSubscriptionTests.swift b/Tests/WordPressKitTests/RemoteReaderSiteInfoSubscriptionTests.swift similarity index 100% rename from WordPressKitTests/RemoteReaderSiteInfoSubscriptionTests.swift rename to Tests/WordPressKitTests/RemoteReaderSiteInfoSubscriptionTests.swift diff --git a/WordPressKitTests/RemoteTestCase.swift b/Tests/WordPressKitTests/RemoteTestCase.swift similarity index 100% rename from WordPressKitTests/RemoteTestCase.swift rename to Tests/WordPressKitTests/RemoteTestCase.swift diff --git a/WordPressKitTests/Scan/JetpackScanServiceRemoteTests.swift b/Tests/WordPressKitTests/Scan/JetpackScanServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/Scan/JetpackScanServiceRemoteTests.swift rename to Tests/WordPressKitTests/Scan/JetpackScanServiceRemoteTests.swift diff --git a/WordPressKitTests/Scan/QRLoginServiceRemoteTests.swift b/Tests/WordPressKitTests/Scan/QRLoginServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/Scan/QRLoginServiceRemoteTests.swift rename to Tests/WordPressKitTests/Scan/QRLoginServiceRemoteTests.swift diff --git a/WordPressKitTests/SelfHostedPluginManagementClientTests.swift b/Tests/WordPressKitTests/SelfHostedPluginManagementClientTests.swift similarity index 84% rename from WordPressKitTests/SelfHostedPluginManagementClientTests.swift rename to Tests/WordPressKitTests/SelfHostedPluginManagementClientTests.swift index 5d278b7e..f2868dcf 100644 --- a/WordPressKitTests/SelfHostedPluginManagementClientTests.swift +++ b/Tests/WordPressKitTests/SelfHostedPluginManagementClientTests.swift @@ -1,8 +1,9 @@ -import Foundation -import XCTest +#if SWIFT_PACKAGE +import CoreAPI +#endif import OHHTTPStubs - @testable import WordPressKit +import XCTest class SelfHostedPluginManagementClientTests: XCTestCase { @@ -112,3 +113,22 @@ class SelfHostedPluginManagementClientTests: XCTestCase { } } + +#if SWIFT_PACKAGE +// FIXME: Duplicated from CoreAPITests. Investigate whether appropriate or if we should add a test helper or something. +extension WordPressOrgRestApi { + convenience init(apiBase: URL) { + self.init( + selfHostedSiteWPJSONURL: apiBase, + credential: .init(loginURL: URL(string: "https://not-used.com")!, username: "user", password: "pass", adminURL: URL(string: "https://not-used.com")!) + ) + } +} + +// FIXME: Duplicated from CoreAPITests. Investigate whether appropriate or if we should add a test helper or something. +extension WordPressOrgRestApi.Site { + static func dotCom(siteID: UInt64, bearerToken: String) -> Self { + .dotCom(siteID: siteID, bearerToken: bearerToken, apiURL: WordPressComRestApi.apiBaseURL) + } +} +#endif diff --git a/WordPressKitTests/ServiceRemoteRESTTests.m b/Tests/WordPressKitTests/ServiceRemoteRESTTests.m similarity index 100% rename from WordPressKitTests/ServiceRemoteRESTTests.m rename to Tests/WordPressKitTests/ServiceRemoteRESTTests.m diff --git a/WordPressKitTests/ServiceRequestTest.swift b/Tests/WordPressKitTests/ServiceRequestTest.swift similarity index 100% rename from WordPressKitTests/ServiceRequestTest.swift rename to Tests/WordPressKitTests/ServiceRequestTest.swift diff --git a/WordPressKitTests/ShareAppContentServiceRemoteTests.swift b/Tests/WordPressKitTests/ShareAppContentServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/ShareAppContentServiceRemoteTests.swift rename to Tests/WordPressKitTests/ShareAppContentServiceRemoteTests.swift diff --git a/WordPressKitTests/SharingServiceRemoteTests.swift b/Tests/WordPressKitTests/SharingServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/SharingServiceRemoteTests.swift rename to Tests/WordPressKitTests/SharingServiceRemoteTests.swift diff --git a/WordPressKitTests/SiteCreationRequestEncodingTests.swift b/Tests/WordPressKitTests/SiteCreationRequestEncodingTests.swift similarity index 100% rename from WordPressKitTests/SiteCreationRequestEncodingTests.swift rename to Tests/WordPressKitTests/SiteCreationRequestEncodingTests.swift diff --git a/WordPressKitTests/SiteCreationResponseDecodingTests.swift b/Tests/WordPressKitTests/SiteCreationResponseDecodingTests.swift similarity index 100% rename from WordPressKitTests/SiteCreationResponseDecodingTests.swift rename to Tests/WordPressKitTests/SiteCreationResponseDecodingTests.swift diff --git a/WordPressKitTests/SiteCreationSegmentsTests.swift b/Tests/WordPressKitTests/SiteCreationSegmentsTests.swift similarity index 100% rename from WordPressKitTests/SiteCreationSegmentsTests.swift rename to Tests/WordPressKitTests/SiteCreationSegmentsTests.swift diff --git a/WordPressKitTests/SiteDesignServiceRemoteTests.swift b/Tests/WordPressKitTests/SiteDesignServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/SiteDesignServiceRemoteTests.swift rename to Tests/WordPressKitTests/SiteDesignServiceRemoteTests.swift diff --git a/WordPressKitTests/SiteManagementServiceRemoteTests.swift b/Tests/WordPressKitTests/SiteManagementServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/SiteManagementServiceRemoteTests.swift rename to Tests/WordPressKitTests/SiteManagementServiceRemoteTests.swift diff --git a/WordPressKitTests/SitePluginTests.swift b/Tests/WordPressKitTests/SitePluginTests.swift similarity index 100% rename from WordPressKitTests/SitePluginTests.swift rename to Tests/WordPressKitTests/SitePluginTests.swift diff --git a/WordPressKitTests/SiteSegmentsResponseDecodingTests.swift b/Tests/WordPressKitTests/SiteSegmentsResponseDecodingTests.swift similarity index 100% rename from WordPressKitTests/SiteSegmentsResponseDecodingTests.swift rename to Tests/WordPressKitTests/SiteSegmentsResponseDecodingTests.swift diff --git a/WordPressKitTests/SiteVerticalsPromptResponseDecodingTests.swift b/Tests/WordPressKitTests/SiteVerticalsPromptResponseDecodingTests.swift similarity index 100% rename from WordPressKitTests/SiteVerticalsPromptResponseDecodingTests.swift rename to Tests/WordPressKitTests/SiteVerticalsPromptResponseDecodingTests.swift diff --git a/WordPressKitTests/SiteVerticalsRequestEncodingTests.swift b/Tests/WordPressKitTests/SiteVerticalsRequestEncodingTests.swift similarity index 100% rename from WordPressKitTests/SiteVerticalsRequestEncodingTests.swift rename to Tests/WordPressKitTests/SiteVerticalsRequestEncodingTests.swift diff --git a/WordPressKitTests/SiteVerticalsResponseDecodingTests.swift b/Tests/WordPressKitTests/SiteVerticalsResponseDecodingTests.swift similarity index 100% rename from WordPressKitTests/SiteVerticalsResponseDecodingTests.swift rename to Tests/WordPressKitTests/SiteVerticalsResponseDecodingTests.swift diff --git a/WordPressKitTests/Social/JetpackSocialServiceRemoteTests.swift b/Tests/WordPressKitTests/Social/JetpackSocialServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/Social/JetpackSocialServiceRemoteTests.swift rename to Tests/WordPressKitTests/Social/JetpackSocialServiceRemoteTests.swift diff --git a/WordPressKitTests/StatsAnnualAndMostPopularTimeInsightDecodingTests.swift b/Tests/WordPressKitTests/StatsAnnualAndMostPopularTimeInsightDecodingTests.swift similarity index 100% rename from WordPressKitTests/StatsAnnualAndMostPopularTimeInsightDecodingTests.swift rename to Tests/WordPressKitTests/StatsAnnualAndMostPopularTimeInsightDecodingTests.swift diff --git a/WordPressKitTests/StatsRemoteV2Tests.swift b/Tests/WordPressKitTests/StatsRemoteV2Tests.swift similarity index 100% rename from WordPressKitTests/StatsRemoteV2Tests.swift rename to Tests/WordPressKitTests/StatsRemoteV2Tests.swift diff --git a/WordPressKitTests/TaxonomyServiceRemoteRESTTests.m b/Tests/WordPressKitTests/TaxonomyServiceRemoteRESTTests.m similarity index 100% rename from WordPressKitTests/TaxonomyServiceRemoteRESTTests.m rename to Tests/WordPressKitTests/TaxonomyServiceRemoteRESTTests.m diff --git a/WordPressKitTests/TestCollector+Constants.swift b/Tests/WordPressKitTests/TestCollector+Constants.swift similarity index 100% rename from WordPressKitTests/TestCollector+Constants.swift rename to Tests/WordPressKitTests/TestCollector+Constants.swift diff --git a/WordPressKitTests/ThemeServiceRemoteTests.m b/Tests/WordPressKitTests/ThemeServiceRemoteTests.m similarity index 100% rename from WordPressKitTests/ThemeServiceRemoteTests.m rename to Tests/WordPressKitTests/ThemeServiceRemoteTests.m diff --git a/WordPressKitTests/TimeZoneServiceRemoteTests.swift b/Tests/WordPressKitTests/TimeZoneServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/TimeZoneServiceRemoteTests.swift rename to Tests/WordPressKitTests/TimeZoneServiceRemoteTests.swift diff --git a/WordPressKitTests/TransactionsServiceRemoteTests.swift b/Tests/WordPressKitTests/TransactionsServiceRemoteTests.swift similarity index 100% rename from WordPressKitTests/TransactionsServiceRemoteTests.swift rename to Tests/WordPressKitTests/TransactionsServiceRemoteTests.swift diff --git a/WordPressKitTests/UnitTests.xctestplan b/Tests/WordPressKitTests/UnitTests.xctestplan similarity index 100% rename from WordPressKitTests/UnitTests.xctestplan rename to Tests/WordPressKitTests/UnitTests.xctestplan diff --git a/WordPressKitTests/UsersServiceRemoteXMLRPCTests.swift b/Tests/WordPressKitTests/UsersServiceRemoteXMLRPCTests.swift similarity index 100% rename from WordPressKitTests/UsersServiceRemoteXMLRPCTests.swift rename to Tests/WordPressKitTests/UsersServiceRemoteXMLRPCTests.swift diff --git a/WordPressKitTests/Utilities/ChecksumUtilTests.swift b/Tests/WordPressKitTests/Utilities/ChecksumUtilTests.swift similarity index 100% rename from WordPressKitTests/Utilities/ChecksumUtilTests.swift rename to Tests/WordPressKitTests/Utilities/ChecksumUtilTests.swift diff --git a/WordPressKitTests/Utilities/FeatureFlagRemoteTests.swift b/Tests/WordPressKitTests/Utilities/FeatureFlagRemoteTests.swift similarity index 100% rename from WordPressKitTests/Utilities/FeatureFlagRemoteTests.swift rename to Tests/WordPressKitTests/Utilities/FeatureFlagRemoteTests.swift diff --git a/WordPressKitTests/Utilities/FeatureFlagSerializationTest.swift b/Tests/WordPressKitTests/Utilities/FeatureFlagSerializationTest.swift similarity index 100% rename from WordPressKitTests/Utilities/FeatureFlagSerializationTest.swift rename to Tests/WordPressKitTests/Utilities/FeatureFlagSerializationTest.swift diff --git a/WordPressKitTests/Utilities/HTTPBodyEncodingTests.swift b/Tests/WordPressKitTests/Utilities/HTTPBodyEncodingTests.swift similarity index 88% rename from WordPressKitTests/Utilities/HTTPBodyEncodingTests.swift rename to Tests/WordPressKitTests/Utilities/HTTPBodyEncodingTests.swift index 896b64b3..7ceaab0a 100644 --- a/WordPressKitTests/Utilities/HTTPBodyEncodingTests.swift +++ b/Tests/WordPressKitTests/Utilities/HTTPBodyEncodingTests.swift @@ -1,6 +1,8 @@ -import Foundation -import XCTest +#if SWIFT_PACKAGE +@testable import CoreAPI // FIXME: Not sure whether this is appropriate. Kit should only interface via public API. +#endif @testable import WordPressKit +import XCTest class HTTPBodyEncodingTests: XCTestCase { diff --git a/WordPressKitTests/Utilities/HTTPHeaderValueParserTests.swift b/Tests/WordPressKitTests/Utilities/HTTPHeaderValueParserTests.swift similarity index 100% rename from WordPressKitTests/Utilities/HTTPHeaderValueParserTests.swift rename to Tests/WordPressKitTests/Utilities/HTTPHeaderValueParserTests.swift diff --git a/WordPressKitTests/Utilities/LoggingTests.m b/Tests/WordPressKitTests/Utilities/LoggingTests.m similarity index 100% rename from WordPressKitTests/Utilities/LoggingTests.m rename to Tests/WordPressKitTests/Utilities/LoggingTests.m diff --git a/WordPressKitTests/Utilities/LoggingTests.swift b/Tests/WordPressKitTests/Utilities/LoggingTests.swift similarity index 100% rename from WordPressKitTests/Utilities/LoggingTests.swift rename to Tests/WordPressKitTests/Utilities/LoggingTests.swift diff --git a/WordPressKitTests/Utilities/RemoteConfigRemoteTests.swift b/Tests/WordPressKitTests/Utilities/RemoteConfigRemoteTests.swift similarity index 100% rename from WordPressKitTests/Utilities/RemoteConfigRemoteTests.swift rename to Tests/WordPressKitTests/Utilities/RemoteConfigRemoteTests.swift diff --git a/WordPressKitTests/Mock Data/BlockEditorSettings/get_wp_v2_themes_twentytwentyone-no-colors.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/BlockEditorSettings/get_wp_v2_themes_twentytwentyone-no-colors.json similarity index 100% rename from WordPressKitTests/Mock Data/BlockEditorSettings/get_wp_v2_themes_twentytwentyone-no-colors.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/BlockEditorSettings/get_wp_v2_themes_twentytwentyone-no-colors.json diff --git a/WordPressKitTests/Mock Data/BlockEditorSettings/get_wp_v2_themes_twentytwentyone.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/BlockEditorSettings/get_wp_v2_themes_twentytwentyone.json similarity index 100% rename from WordPressKitTests/Mock Data/BlockEditorSettings/get_wp_v2_themes_twentytwentyone.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/BlockEditorSettings/get_wp_v2_themes_twentytwentyone.json diff --git a/WordPressKitTests/Mock Data/BlockEditorSettings/wp-block-editor-v1-settings-success-NotThemeJSON.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/BlockEditorSettings/wp-block-editor-v1-settings-success-NotThemeJSON.json similarity index 100% rename from WordPressKitTests/Mock Data/BlockEditorSettings/wp-block-editor-v1-settings-success-NotThemeJSON.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/BlockEditorSettings/wp-block-editor-v1-settings-success-NotThemeJSON.json diff --git a/WordPressKitTests/Mock Data/BlockEditorSettings/wp-block-editor-v1-settings-success-ThemeJSON.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/BlockEditorSettings/wp-block-editor-v1-settings-success-ThemeJSON.json similarity index 100% rename from WordPressKitTests/Mock Data/BlockEditorSettings/wp-block-editor-v1-settings-success-ThemeJSON.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/BlockEditorSettings/wp-block-editor-v1-settings-success-ThemeJSON.json diff --git a/WordPressKitTests/Mock Data/Domains/get-all-domains-response.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/Domains/get-all-domains-response.json similarity index 100% rename from WordPressKitTests/Mock Data/Domains/get-all-domains-response.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/Domains/get-all-domains-response.json diff --git a/WordPressKitTests/Mock Data/activity-groups-bad-json-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-groups-bad-json-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/activity-groups-bad-json-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-groups-bad-json-failure.json diff --git a/WordPressKitTests/Mock Data/activity-groups-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-groups-success.json similarity index 100% rename from WordPressKitTests/Mock Data/activity-groups-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-groups-success.json diff --git a/WordPressKitTests/Mock Data/activity-log-auth-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-log-auth-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/activity-log-auth-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-log-auth-failure.json diff --git a/WordPressKitTests/Mock Data/activity-log-bad-json-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-log-bad-json-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/activity-log-bad-json-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-log-bad-json-failure.json diff --git a/WordPressKitTests/Mock Data/activity-log-success-1.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-log-success-1.json similarity index 100% rename from WordPressKitTests/Mock Data/activity-log-success-1.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-log-success-1.json diff --git a/WordPressKitTests/Mock Data/activity-log-success-2.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-log-success-2.json similarity index 100% rename from WordPressKitTests/Mock Data/activity-log-success-2.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-log-success-2.json diff --git a/WordPressKitTests/Mock Data/activity-log-success-3.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-log-success-3.json similarity index 100% rename from WordPressKitTests/Mock Data/activity-log-success-3.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-log-success-3.json diff --git a/WordPressKitTests/Mock Data/activity-restore-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-restore-success.json similarity index 100% rename from WordPressKitTests/Mock Data/activity-restore-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-restore-success.json diff --git a/WordPressKitTests/Mock Data/activity-rewind-status-restore-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-rewind-status-restore-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/activity-rewind-status-restore-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-rewind-status-restore-failure.json diff --git a/WordPressKitTests/Mock Data/activity-rewind-status-restore-finished.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-rewind-status-restore-finished.json similarity index 100% rename from WordPressKitTests/Mock Data/activity-rewind-status-restore-finished.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-rewind-status-restore-finished.json diff --git a/WordPressKitTests/Mock Data/activity-rewind-status-restore-in-progress.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-rewind-status-restore-in-progress.json similarity index 100% rename from WordPressKitTests/Mock Data/activity-rewind-status-restore-in-progress.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-rewind-status-restore-in-progress.json diff --git a/WordPressKitTests/Mock Data/activity-rewind-status-restore-queued.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-rewind-status-restore-queued.json similarity index 100% rename from WordPressKitTests/Mock Data/activity-rewind-status-restore-queued.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-rewind-status-restore-queued.json diff --git a/WordPressKitTests/Mock Data/activity-rewind-status-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-rewind-status-success.json similarity index 100% rename from WordPressKitTests/Mock Data/activity-rewind-status-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/activity-rewind-status-success.json diff --git a/WordPressKitTests/Mock Data/atomic-get-auth-cookie-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/atomic-get-auth-cookie-success.json similarity index 100% rename from WordPressKitTests/Mock Data/atomic-get-auth-cookie-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/atomic-get-auth-cookie-success.json diff --git a/WordPressKitTests/Mock Data/auth-send-login-email-invalid-client-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/auth-send-login-email-invalid-client-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/auth-send-login-email-invalid-client-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/auth-send-login-email-invalid-client-failure.json diff --git a/WordPressKitTests/Mock Data/auth-send-login-email-invalid-secret-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/auth-send-login-email-invalid-secret-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/auth-send-login-email-invalid-secret-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/auth-send-login-email-invalid-secret-failure.json diff --git a/WordPressKitTests/Mock Data/auth-send-login-email-no-user-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/auth-send-login-email-no-user-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/auth-send-login-email-no-user-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/auth-send-login-email-no-user-failure.json diff --git a/WordPressKitTests/Mock Data/auth-send-login-email-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/auth-send-login-email-success.json similarity index 100% rename from WordPressKitTests/Mock Data/auth-send-login-email-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/auth-send-login-email-success.json diff --git a/WordPressKitTests/Mock Data/auth-send-verification-email-already-verified-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/auth-send-verification-email-already-verified-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/auth-send-verification-email-already-verified-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/auth-send-verification-email-already-verified-failure.json diff --git a/WordPressKitTests/Mock Data/auth-send-verification-email-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/auth-send-verification-email-success.json similarity index 100% rename from WordPressKitTests/Mock Data/auth-send-verification-email-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/auth-send-verification-email-success.json diff --git a/WordPressKitTests/Mock Data/backup-get-backup-status-complete-without-download-id-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/backup-get-backup-status-complete-without-download-id-success.json similarity index 100% rename from WordPressKitTests/Mock Data/backup-get-backup-status-complete-without-download-id-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/backup-get-backup-status-complete-without-download-id-success.json diff --git a/WordPressKitTests/Mock Data/blaze-campaigns-search.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/blaze-campaigns-search.json similarity index 100% rename from WordPressKitTests/Mock Data/blaze-campaigns-search.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/blaze-campaigns-search.json diff --git a/WordPressKitTests/Mock Data/blogging-prompts-settings-fetch-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/blogging-prompts-settings-fetch-success.json similarity index 100% rename from WordPressKitTests/Mock Data/blogging-prompts-settings-fetch-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/blogging-prompts-settings-fetch-success.json diff --git a/WordPressKitTests/Mock Data/blogging-prompts-settings-update-empty-response.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/blogging-prompts-settings-update-empty-response.json similarity index 100% rename from WordPressKitTests/Mock Data/blogging-prompts-settings-update-empty-response.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/blogging-prompts-settings-update-empty-response.json diff --git a/WordPressKitTests/Mock Data/blogging-prompts-settings-update-with-response.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/blogging-prompts-settings-update-with-response.json similarity index 100% rename from WordPressKitTests/Mock Data/blogging-prompts-settings-update-with-response.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/blogging-prompts-settings-update-with-response.json diff --git a/WordPressKitTests/Mock Data/blogging-prompts-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/blogging-prompts-success.json similarity index 100% rename from WordPressKitTests/Mock Data/blogging-prompts-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/blogging-prompts-success.json diff --git a/WordPressKitTests/Mock Data/comment-likes-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/comment-likes-success.json similarity index 100% rename from WordPressKitTests/Mock Data/comment-likes-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/comment-likes-success.json diff --git a/WordPressKitTests/Mock Data/comments-v2-edit-context-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/comments-v2-edit-context-success.json similarity index 100% rename from WordPressKitTests/Mock Data/comments-v2-edit-context-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/comments-v2-edit-context-success.json diff --git a/WordPressKitTests/Mock Data/comments-v2-view-context-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/comments-v2-view-context-success.json similarity index 100% rename from WordPressKitTests/Mock Data/comments-v2-view-context-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/comments-v2-view-context-success.json diff --git a/WordPressKitTests/Mock Data/common-starter-site-designs-empty-designs.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/common-starter-site-designs-empty-designs.json similarity index 100% rename from WordPressKitTests/Mock Data/common-starter-site-designs-empty-designs.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/common-starter-site-designs-empty-designs.json diff --git a/WordPressKitTests/Mock Data/common-starter-site-designs-malformed.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/common-starter-site-designs-malformed.json similarity index 100% rename from WordPressKitTests/Mock Data/common-starter-site-designs-malformed.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/common-starter-site-designs-malformed.json diff --git a/WordPressKitTests/Mock Data/common-starter-site-designs-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/common-starter-site-designs-success.json similarity index 100% rename from WordPressKitTests/Mock Data/common-starter-site-designs-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/common-starter-site-designs-success.json diff --git a/WordPressKitTests/Mock Data/dashboard-200-with-drafts-and-scheduled-posts.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/dashboard-200-with-drafts-and-scheduled-posts.json similarity index 100% rename from WordPressKitTests/Mock Data/dashboard-200-with-drafts-and-scheduled-posts.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/dashboard-200-with-drafts-and-scheduled-posts.json diff --git a/WordPressKitTests/Mock Data/dashboard-400-invalid-card.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/dashboard-400-invalid-card.json similarity index 100% rename from WordPressKitTests/Mock Data/dashboard-400-invalid-card.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/dashboard-400-invalid-card.json diff --git a/WordPressKitTests/Mock Data/domain-contact-information-response-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/domain-contact-information-response-success.json similarity index 100% rename from WordPressKitTests/Mock Data/domain-contact-information-response-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/domain-contact-information-response-success.json diff --git a/WordPressKitTests/Mock Data/domain-service-all-domain-types.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/domain-service-all-domain-types.json similarity index 100% rename from WordPressKitTests/Mock Data/domain-service-all-domain-types.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/domain-service-all-domain-types.json diff --git a/WordPressKitTests/Mock Data/domain-service-bad-json.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/domain-service-bad-json.json similarity index 100% rename from WordPressKitTests/Mock Data/domain-service-bad-json.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/domain-service-bad-json.json diff --git a/WordPressKitTests/Mock Data/domain-service-empty.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/domain-service-empty.json similarity index 100% rename from WordPressKitTests/Mock Data/domain-service-empty.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/domain-service-empty.json diff --git a/WordPressKitTests/Mock Data/domain-service-invalid-query.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/domain-service-invalid-query.json similarity index 100% rename from WordPressKitTests/Mock Data/domain-service-invalid-query.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/domain-service-invalid-query.json diff --git a/WordPressKitTests/Mock Data/empty-array.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/empty-array.json similarity index 100% rename from WordPressKitTests/Mock Data/empty-array.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/empty-array.json diff --git a/WordPressKitTests/Mock Data/empty.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/empty.json similarity index 100% rename from WordPressKitTests/Mock Data/empty.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/empty.json diff --git a/WordPressKitTests/Mock Data/get-multiple-themes-v1.2.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/get-multiple-themes-v1.2.json similarity index 100% rename from WordPressKitTests/Mock Data/get-multiple-themes-v1.2.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/get-multiple-themes-v1.2.json diff --git a/WordPressKitTests/Mock Data/get-purchased-themes-v1.1.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/get-purchased-themes-v1.1.json similarity index 100% rename from WordPressKitTests/Mock Data/get-purchased-themes-v1.1.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/get-purchased-themes-v1.1.json diff --git a/WordPressKitTests/Mock Data/get-single-theme-v1.1.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/get-single-theme-v1.1.json similarity index 100% rename from WordPressKitTests/Mock Data/get-single-theme-v1.1.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/get-single-theme-v1.1.json diff --git a/WordPressKitTests/Mock Data/is-available-email-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/is-available-email-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/is-available-email-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/is-available-email-failure.json diff --git a/WordPressKitTests/Mock Data/is-available-email-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/is-available-email-success.json similarity index 100% rename from WordPressKitTests/Mock Data/is-available-email-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/is-available-email-success.json diff --git a/WordPressKitTests/Mock Data/is-available-username-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/is-available-username-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/is-available-username-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/is-available-username-failure.json diff --git a/WordPressKitTests/Mock Data/is-available-username-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/is-available-username-success.json similarity index 100% rename from WordPressKitTests/Mock Data/is-available-username-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/is-available-username-success.json diff --git a/WordPressKitTests/Mock Data/is-passwordless-account-no-account-found.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/is-passwordless-account-no-account-found.json similarity index 100% rename from WordPressKitTests/Mock Data/is-passwordless-account-no-account-found.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/is-passwordless-account-no-account-found.json diff --git a/WordPressKitTests/Mock Data/is-passwordless-account-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/is-passwordless-account-success.json similarity index 100% rename from WordPressKitTests/Mock Data/is-passwordless-account-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/is-passwordless-account-success.json diff --git a/WordPressKitTests/Mock Data/jetpack-capabilities-107159616-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-capabilities-107159616-success.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-capabilities-107159616-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-capabilities-107159616-success.json diff --git a/WordPressKitTests/Mock Data/jetpack-capabilities-34197361-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-capabilities-34197361-success.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-capabilities-34197361-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-capabilities-34197361-success.json diff --git a/WordPressKitTests/Mock Data/jetpack-capabilities-malformed.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-capabilities-malformed.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-capabilities-malformed.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-capabilities-malformed.json diff --git a/WordPressKitTests/Mock Data/jetpack-scan-enqueue-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-scan-enqueue-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-scan-enqueue-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-scan-enqueue-failure.json diff --git a/WordPressKitTests/Mock Data/jetpack-scan-enqueue-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-scan-enqueue-success.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-scan-enqueue-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-scan-enqueue-success.json diff --git a/WordPressKitTests/Mock Data/jetpack-scan-idle-success-no-threats.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-scan-idle-success-no-threats.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-scan-idle-success-no-threats.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-scan-idle-success-no-threats.json diff --git a/WordPressKitTests/Mock Data/jetpack-scan-idle-success-threats.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-scan-idle-success-threats.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-scan-idle-success-threats.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-scan-idle-success-threats.json diff --git a/WordPressKitTests/Mock Data/jetpack-scan-in-progress.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-scan-in-progress.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-scan-in-progress.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-scan-in-progress.json diff --git a/WordPressKitTests/Mock Data/jetpack-scan-unavailable.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-scan-unavailable.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-scan-unavailable.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-scan-unavailable.json diff --git a/WordPressKitTests/Mock Data/jetpack-service-check-site-failure-data.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-check-site-failure-data.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-service-check-site-failure-data.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-check-site-failure-data.json diff --git a/WordPressKitTests/Mock Data/jetpack-service-check-site-success-no-jetpack.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-check-site-success-no-jetpack.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-service-check-site-success-no-jetpack.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-check-site-success-no-jetpack.json diff --git a/WordPressKitTests/Mock Data/jetpack-service-check-site-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-check-site-success.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-service-check-site-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-check-site-success.json diff --git a/WordPressKitTests/Mock Data/jetpack-service-error-activation-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-error-activation-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-service-error-activation-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-error-activation-failure.json diff --git a/WordPressKitTests/Mock Data/jetpack-service-error-activation-install.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-error-activation-install.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-service-error-activation-install.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-error-activation-install.json diff --git a/WordPressKitTests/Mock Data/jetpack-service-error-activation-response.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-error-activation-response.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-service-error-activation-response.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-error-activation-response.json diff --git a/WordPressKitTests/Mock Data/jetpack-service-error-forbidden.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-error-forbidden.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-service-error-forbidden.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-error-forbidden.json diff --git a/WordPressKitTests/Mock Data/jetpack-service-error-install-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-error-install-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-service-error-install-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-error-install-failure.json diff --git a/WordPressKitTests/Mock Data/jetpack-service-error-install-response.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-error-install-response.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-service-error-install-response.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-error-install-response.json diff --git a/WordPressKitTests/Mock Data/jetpack-service-error-invalid-credentials.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-error-invalid-credentials.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-service-error-invalid-credentials.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-error-invalid-credentials.json diff --git a/WordPressKitTests/Mock Data/jetpack-service-error-login-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-error-login-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-service-error-login-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-error-login-failure.json diff --git a/WordPressKitTests/Mock Data/jetpack-service-error-site-is-jetpack.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-error-site-is-jetpack.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-service-error-site-is-jetpack.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-error-site-is-jetpack.json diff --git a/WordPressKitTests/Mock Data/jetpack-service-error-unknown.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-error-unknown.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-service-error-unknown.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-error-unknown.json diff --git a/WordPressKitTests/Mock Data/jetpack-service-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-service-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-failure.json diff --git a/WordPressKitTests/Mock Data/jetpack-service-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-success.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-service-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-service-success.json diff --git a/WordPressKitTests/Mock Data/jetpack-social-403.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-social-403.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-social-403.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-social-403.json diff --git a/WordPressKitTests/Mock Data/jetpack-social-no-publicize.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-social-no-publicize.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-social-no-publicize.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-social-no-publicize.json diff --git a/WordPressKitTests/Mock Data/jetpack-social-with-publicize.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-social-with-publicize.json similarity index 100% rename from WordPressKitTests/Mock Data/jetpack-social-with-publicize.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/jetpack-social-with-publicize.json diff --git a/WordPressKitTests/Mock Data/me-auth-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-auth-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/me-auth-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-auth-failure.json diff --git a/WordPressKitTests/Mock Data/me-bad-json-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-bad-json-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/me-bad-json-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-bad-json-failure.json diff --git a/WordPressKitTests/me-settings-change-email-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-settings-change-email-success.json similarity index 100% rename from WordPressKitTests/me-settings-change-email-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-settings-change-email-success.json diff --git a/WordPressKitTests/Mock Data/me-settings-close-account-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-settings-close-account-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/me-settings-close-account-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-settings-close-account-failure.json diff --git a/WordPressKitTests/Mock Data/me-settings-close-account-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-settings-close-account-success.json similarity index 100% rename from WordPressKitTests/Mock Data/me-settings-close-account-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-settings-close-account-success.json diff --git a/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-settings-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-settings-success.json new file mode 100644 index 00000000..84815e3f --- /dev/null +++ b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-settings-success.json @@ -0,0 +1,48 @@ +{ + "enable_translator": false, + "surprise_me": true, + "post_post_flag": true, + "holidaysnow": true, + "user_login": "jimthetester", + "password": "", + "display_name": "Jim Tester", + "first_name": "Jim", + "last_name": "Tester", + "description": "Happy go lucky kind of tester.", + "user_email": "jimthetester@thetestemail.org", + "user_email_change_pending": false, + "new_user_email": "", + "user_URL": "http:\/\/jimthetester.blog", + "language": "en", + "avatar_URL": "https:\/\/2.gravatar.com\/avatar\/5c78d333444a3c12345ed8ff0e567890?s=200&d=mm", + "primary_site_ID": 321, + "comment_like_notification": true, + "mentions_notification": true, + "subscription_delivery_email_default": "instantly", + "subscription_delivery_jabber_default": false, + "subscription_delivery_mail_option": "html", + "subscription_delivery_day": 1, + "subscription_delivery_hour": 6, + "subscription_delivery_email_blocked": true, + "two_step_enabled": true, + "two_step_sms_enabled": false, + "two_step_backup_codes_printed": true, + "two_step_sms_country": "US", + "two_step_sms_phone_number": "2623536462", + "user_login_can_be_changed": false, + "calypso_preferences": { + "editor-mode": "html", + "editorAdvancedVisible": true, + "mediaModalGalleryInstructionsDismissed": true, + "recentSites": [ + 1234, + 56789, + 100234 + ] + }, + "jetpack_connect": [], + "is_desktop_app_user": true, + "locale_variant": false, + "tracks_opt_out": false +} + diff --git a/WordPressKitTests/Mock Data/me-sites-auth-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-sites-auth-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/me-sites-auth-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-sites-auth-failure.json diff --git a/WordPressKitTests/Mock Data/me-sites-bad-json-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-sites-bad-json-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/me-sites-bad-json-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-sites-bad-json-failure.json diff --git a/WordPressKitTests/Mock Data/me-sites-empty-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-sites-empty-success.json similarity index 100% rename from WordPressKitTests/Mock Data/me-sites-empty-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-sites-empty-success.json diff --git a/WordPressKitTests/Mock Data/me-sites-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-sites-success.json similarity index 100% rename from WordPressKitTests/Mock Data/me-sites-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-sites-success.json diff --git a/WordPressKitTests/Mock Data/me-sites-visibility-bad-json-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-sites-visibility-bad-json-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/me-sites-visibility-bad-json-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-sites-visibility-bad-json-failure.json diff --git a/WordPressKitTests/Mock Data/me-sites-visibility-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-sites-visibility-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/me-sites-visibility-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-sites-visibility-failure.json diff --git a/WordPressKitTests/Mock Data/me-sites-visibility-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-sites-visibility-success.json similarity index 100% rename from WordPressKitTests/Mock Data/me-sites-visibility-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-sites-visibility-success.json diff --git a/WordPressKitTests/Mock Data/me-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-success.json similarity index 100% rename from WordPressKitTests/Mock Data/me-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/me-success.json diff --git a/WordPressKitTests/Mock Data/notifications-last-seen.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/notifications-last-seen.json similarity index 100% rename from WordPressKitTests/Mock Data/notifications-last-seen.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/notifications-last-seen.json diff --git a/WordPressKitTests/Mock Data/notifications-load-all.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/notifications-load-all.json similarity index 100% rename from WordPressKitTests/Mock Data/notifications-load-all.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/notifications-load-all.json diff --git a/WordPressKitTests/Mock Data/notifications-load-hash.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/notifications-load-hash.json similarity index 100% rename from WordPressKitTests/Mock Data/notifications-load-hash.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/notifications-load-hash.json diff --git a/WordPressKitTests/Mock Data/notifications-mark-as-read.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/notifications-mark-as-read.json similarity index 100% rename from WordPressKitTests/Mock Data/notifications-mark-as-read.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/notifications-mark-as-read.json diff --git a/WordPressKitTests/Mock Data/page-layout-blog-layouts-malformed.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/page-layout-blog-layouts-malformed.json similarity index 100% rename from WordPressKitTests/Mock Data/page-layout-blog-layouts-malformed.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/page-layout-blog-layouts-malformed.json diff --git a/WordPressKitTests/Mock Data/page-layout-blog-layouts-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/page-layout-blog-layouts-success.json similarity index 100% rename from WordPressKitTests/Mock Data/page-layout-blog-layouts-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/page-layout-blog-layouts-success.json diff --git a/WordPressKitTests/Mock Data/people-send-invitation-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/people-send-invitation-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/people-send-invitation-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/people-send-invitation-failure.json diff --git a/WordPressKitTests/Mock Data/people-send-invitation-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/people-send-invitation-success.json similarity index 100% rename from WordPressKitTests/Mock Data/people-send-invitation-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/people-send-invitation-success.json diff --git a/WordPressKitTests/Mock Data/people-validate-invitation-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/people-validate-invitation-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/people-validate-invitation-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/people-validate-invitation-failure.json diff --git a/WordPressKitTests/Mock Data/people-validate-invitation-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/people-validate-invitation-success.json similarity index 100% rename from WordPressKitTests/Mock Data/people-validate-invitation-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/people-validate-invitation-success.json diff --git a/WordPressKitTests/Mock Data/plans-me-sites-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plans-me-sites-success.json similarity index 100% rename from WordPressKitTests/Mock Data/plans-me-sites-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plans-me-sites-success.json diff --git a/WordPressKitTests/Mock Data/plans-mobile-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plans-mobile-success.json similarity index 100% rename from WordPressKitTests/Mock Data/plans-mobile-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plans-mobile-success.json diff --git a/WordPressKitTests/Mock Data/plugin-directory-jetpack-beta.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-directory-jetpack-beta.json similarity index 100% rename from WordPressKitTests/Mock Data/plugin-directory-jetpack-beta.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-directory-jetpack-beta.json diff --git a/WordPressKitTests/Mock Data/plugin-directory-jetpack.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-directory-jetpack.json similarity index 100% rename from WordPressKitTests/Mock Data/plugin-directory-jetpack.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-directory-jetpack.json diff --git a/WordPressKitTests/Mock Data/plugin-directory-new.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-directory-new.json similarity index 100% rename from WordPressKitTests/Mock Data/plugin-directory-new.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-directory-new.json diff --git a/WordPressKitTests/Mock Data/plugin-directory-popular.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-directory-popular.json similarity index 100% rename from WordPressKitTests/Mock Data/plugin-directory-popular.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-directory-popular.json diff --git a/WordPressKitTests/Mock Data/plugin-directory-rename-xml-rpc.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-directory-rename-xml-rpc.json similarity index 100% rename from WordPressKitTests/Mock Data/plugin-directory-rename-xml-rpc.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-directory-rename-xml-rpc.json diff --git a/WordPressKitTests/Mock Data/plugin-install-already-installed.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-install-already-installed.json similarity index 100% rename from WordPressKitTests/Mock Data/plugin-install-already-installed.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-install-already-installed.json diff --git a/WordPressKitTests/Mock Data/plugin-install-generic-error.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-install-generic-error.json similarity index 100% rename from WordPressKitTests/Mock Data/plugin-install-generic-error.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-install-generic-error.json diff --git a/WordPressKitTests/Mock Data/plugin-install-succeeds.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-install-succeeds.json similarity index 100% rename from WordPressKitTests/Mock Data/plugin-install-succeeds.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-install-succeeds.json diff --git a/WordPressKitTests/Mock Data/plugin-modify-malformed-response.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-modify-malformed-response.json similarity index 100% rename from WordPressKitTests/Mock Data/plugin-modify-malformed-response.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-modify-malformed-response.json diff --git a/WordPressKitTests/Mock Data/plugin-service-remote-auth-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-service-remote-auth-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/plugin-service-remote-auth-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-service-remote-auth-failure.json diff --git a/WordPressKitTests/Mock Data/plugin-service-remote-featured-malformed.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-service-remote-featured-malformed.json similarity index 100% rename from WordPressKitTests/Mock Data/plugin-service-remote-featured-malformed.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-service-remote-featured-malformed.json diff --git a/WordPressKitTests/Mock Data/plugin-service-remote-featured-plugins-invalid.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-service-remote-featured-plugins-invalid.json similarity index 100% rename from WordPressKitTests/Mock Data/plugin-service-remote-featured-plugins-invalid.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-service-remote-featured-plugins-invalid.json diff --git a/WordPressKitTests/Mock Data/plugin-service-remote-featured.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-service-remote-featured.json similarity index 100% rename from WordPressKitTests/Mock Data/plugin-service-remote-featured.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-service-remote-featured.json diff --git a/WordPressKitTests/Mock Data/plugin-state-contact-form-7.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-state-contact-form-7.json similarity index 100% rename from WordPressKitTests/Mock Data/plugin-state-contact-form-7.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-state-contact-form-7.json diff --git a/WordPressKitTests/Mock Data/plugin-state-jetpack.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-state-jetpack.json similarity index 100% rename from WordPressKitTests/Mock Data/plugin-state-jetpack.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-state-jetpack.json diff --git a/WordPressKitTests/Mock Data/plugin-update-gutenberg-needs-update.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-update-gutenberg-needs-update.json similarity index 100% rename from WordPressKitTests/Mock Data/plugin-update-gutenberg-needs-update.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-update-gutenberg-needs-update.json diff --git a/WordPressKitTests/Mock Data/plugin-update-jetpack-already-updated.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-update-jetpack-already-updated.json similarity index 100% rename from WordPressKitTests/Mock Data/plugin-update-jetpack-already-updated.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-update-jetpack-already-updated.json diff --git a/WordPressKitTests/Mock Data/plugin-update-response-malformed.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-update-response-malformed.json similarity index 100% rename from WordPressKitTests/Mock Data/plugin-update-response-malformed.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/plugin-update-response-malformed.json diff --git a/WordPressKitTests/Mock Data/post-autosave-mapping-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/post-autosave-mapping-success.json similarity index 100% rename from WordPressKitTests/Mock Data/post-autosave-mapping-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/post-autosave-mapping-success.json diff --git a/WordPressKitTests/Mock Data/post-likes-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/post-likes-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/post-likes-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/post-likes-failure.json diff --git a/WordPressKitTests/Mock Data/post-likes-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/post-likes-success.json similarity index 100% rename from WordPressKitTests/Mock Data/post-likes-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/post-likes-success.json diff --git a/WordPressKitTests/Mock Data/post-revisions-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/post-revisions-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/post-revisions-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/post-revisions-failure.json diff --git a/WordPressKitTests/Mock Data/post-revisions-mapping-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/post-revisions-mapping-success.json similarity index 100% rename from WordPressKitTests/Mock Data/post-revisions-mapping-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/post-revisions-mapping-success.json diff --git a/WordPressKitTests/Mock Data/post-revisions-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/post-revisions-success.json similarity index 100% rename from WordPressKitTests/Mock Data/post-revisions-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/post-revisions-success.json diff --git a/WordPressKitTests/Mock Data/qrlogin-authenticate-200.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/qrlogin-authenticate-200.json similarity index 100% rename from WordPressKitTests/Mock Data/qrlogin-authenticate-200.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/qrlogin-authenticate-200.json diff --git a/WordPressKitTests/Mock Data/qrlogin-authenticate-failed-400.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/qrlogin-authenticate-failed-400.json similarity index 100% rename from WordPressKitTests/Mock Data/qrlogin-authenticate-failed-400.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/qrlogin-authenticate-failed-400.json diff --git a/WordPressKitTests/Mock Data/qrlogin-validate-200.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/qrlogin-validate-200.json similarity index 100% rename from WordPressKitTests/Mock Data/qrlogin-validate-200.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/qrlogin-validate-200.json diff --git a/WordPressKitTests/Mock Data/qrlogin-validate-400.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/qrlogin-validate-400.json similarity index 100% rename from WordPressKitTests/Mock Data/qrlogin-validate-400.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/qrlogin-validate-400.json diff --git a/WordPressKitTests/Mock Data/qrlogin-validate-expired-401.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/qrlogin-validate-expired-401.json similarity index 100% rename from WordPressKitTests/Mock Data/qrlogin-validate-expired-401.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/qrlogin-validate-expired-401.json diff --git a/WordPressKitTests/Mock Data/reader-cards-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-cards-success.json similarity index 100% rename from WordPressKitTests/Mock Data/reader-cards-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-cards-success.json diff --git a/WordPressKitTests/Mock Data/reader-interests-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-interests-success.json similarity index 100% rename from WordPressKitTests/Mock Data/reader-interests-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-interests-success.json diff --git a/WordPressKitTests/Mock Data/reader-post-comments-subscribe-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-post-comments-subscribe-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/reader-post-comments-subscribe-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-post-comments-subscribe-failure.json diff --git a/WordPressKitTests/Mock Data/reader-post-comments-subscribe-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-post-comments-subscribe-success.json similarity index 100% rename from WordPressKitTests/Mock Data/reader-post-comments-subscribe-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-post-comments-subscribe-success.json diff --git a/WordPressKitTests/Mock Data/reader-post-comments-subscription-status-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-post-comments-subscription-status-success.json similarity index 100% rename from WordPressKitTests/Mock Data/reader-post-comments-subscription-status-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-post-comments-subscription-status-success.json diff --git a/WordPressKitTests/Mock Data/reader-post-comments-unsubscribe-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-post-comments-unsubscribe-success.json similarity index 100% rename from WordPressKitTests/Mock Data/reader-post-comments-unsubscribe-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-post-comments-unsubscribe-success.json diff --git a/WordPressKitTests/Mock Data/reader-post-comments-update-notification-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-post-comments-update-notification-success.json similarity index 100% rename from WordPressKitTests/Mock Data/reader-post-comments-update-notification-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-post-comments-update-notification-success.json diff --git a/WordPressKitTests/Mock Data/reader-post-related-posts-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-post-related-posts-success.json similarity index 100% rename from WordPressKitTests/Mock Data/reader-post-related-posts-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-post-related-posts-success.json diff --git a/WordPressKitTests/Mock Data/reader-posts-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-posts-success.json similarity index 100% rename from WordPressKitTests/Mock Data/reader-posts-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-posts-success.json diff --git a/WordPressKitTests/Mock Data/reader-site-search-blog-id-fallback.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-site-search-blog-id-fallback.json similarity index 100% rename from WordPressKitTests/Mock Data/reader-site-search-blog-id-fallback.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-site-search-blog-id-fallback.json diff --git a/WordPressKitTests/Mock Data/reader-site-search-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-site-search-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/reader-site-search-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-site-search-failure.json diff --git a/WordPressKitTests/Mock Data/reader-site-search-no-blog-or-feed-id.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-site-search-no-blog-or-feed-id.json similarity index 100% rename from WordPressKitTests/Mock Data/reader-site-search-no-blog-or-feed-id.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-site-search-no-blog-or-feed-id.json diff --git a/WordPressKitTests/Mock Data/reader-site-search-success-hasmore.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-site-search-success-hasmore.json similarity index 100% rename from WordPressKitTests/Mock Data/reader-site-search-success-hasmore.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-site-search-success-hasmore.json diff --git a/WordPressKitTests/Mock Data/reader-site-search-success-no-data.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-site-search-success-no-data.json similarity index 100% rename from WordPressKitTests/Mock Data/reader-site-search-success-no-data.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-site-search-success-no-data.json diff --git a/WordPressKitTests/Mock Data/reader-site-search-success-no-icon.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-site-search-success-no-icon.json similarity index 100% rename from WordPressKitTests/Mock Data/reader-site-search-success-no-icon.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-site-search-success-no-icon.json diff --git a/WordPressKitTests/Mock Data/reader-site-search-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-site-search-success.json similarity index 100% rename from WordPressKitTests/Mock Data/reader-site-search-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/reader-site-search-success.json diff --git a/WordPressKitTests/Mock Data/remote-notification.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/remote-notification.json similarity index 100% rename from WordPressKitTests/Mock Data/remote-notification.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/remote-notification.json diff --git a/WordPressKitTests/Mock Data/rest-site-settings.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/rest-site-settings.json similarity index 100% rename from WordPressKitTests/Mock Data/rest-site-settings.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/rest-site-settings.json diff --git a/WordPressKitTests/Mock Data/self-hosted-plugins-get.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/self-hosted-plugins-get.json similarity index 100% rename from WordPressKitTests/Mock Data/self-hosted-plugins-get.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/self-hosted-plugins-get.json diff --git a/WordPressKitTests/Mock Data/self-hosted-plugins-install.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/self-hosted-plugins-install.json similarity index 100% rename from WordPressKitTests/Mock Data/self-hosted-plugins-install.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/self-hosted-plugins-install.json diff --git a/WordPressKitTests/Mock Data/share-app-content-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/share-app-content-success.json similarity index 100% rename from WordPressKitTests/Mock Data/share-app-content-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/share-app-content-success.json diff --git a/WordPressKitTests/Mock Data/site-active-purchases-auth-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-active-purchases-auth-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-active-purchases-auth-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-active-purchases-auth-failure.json diff --git a/WordPressKitTests/Mock Data/site-active-purchases-bad-json-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-active-purchases-bad-json-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-active-purchases-bad-json-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-active-purchases-bad-json-failure.json diff --git a/WordPressKitTests/Mock Data/site-active-purchases-empty-response.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-active-purchases-empty-response.json similarity index 100% rename from WordPressKitTests/Mock Data/site-active-purchases-empty-response.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-active-purchases-empty-response.json diff --git a/WordPressKitTests/Mock Data/site-active-purchases-none-active-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-active-purchases-none-active-success.json similarity index 100% rename from WordPressKitTests/Mock Data/site-active-purchases-none-active-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-active-purchases-none-active-success.json diff --git a/WordPressKitTests/Mock Data/site-active-purchases-two-active-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-active-purchases-two-active-success.json similarity index 100% rename from WordPressKitTests/Mock Data/site-active-purchases-two-active-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-active-purchases-two-active-success.json diff --git a/WordPressKitTests/Mock Data/site-comment-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-comment-success.json similarity index 100% rename from WordPressKitTests/Mock Data/site-comment-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-comment-success.json diff --git a/WordPressKitTests/Mock Data/site-comments-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-comments-success.json similarity index 100% rename from WordPressKitTests/Mock Data/site-comments-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-comments-success.json diff --git a/WordPressKitTests/Mock Data/site-creation-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-creation-success.json similarity index 100% rename from WordPressKitTests/Mock Data/site-creation-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-creation-success.json diff --git a/WordPressKitTests/Mock Data/site-delete-auth-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-delete-auth-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-delete-auth-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-delete-auth-failure.json diff --git a/WordPressKitTests/Mock Data/site-delete-bad-json-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-delete-bad-json-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-delete-bad-json-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-delete-bad-json-failure.json diff --git a/WordPressKitTests/Mock Data/site-delete-missing-status-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-delete-missing-status-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-delete-missing-status-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-delete-missing-status-failure.json diff --git a/WordPressKitTests/Mock Data/site-delete-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-delete-success.json similarity index 100% rename from WordPressKitTests/Mock Data/site-delete-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-delete-success.json diff --git a/WordPressKitTests/Mock Data/site-delete-unexpected-json-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-delete-unexpected-json-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-delete-unexpected-json-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-delete-unexpected-json-failure.json diff --git a/WordPressKitTests/Mock Data/site-email-followers-get-auth-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-email-followers-get-auth-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-email-followers-get-auth-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-email-followers-get-auth-failure.json diff --git a/WordPressKitTests/Mock Data/site-email-followers-get-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-email-followers-get-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-email-followers-get-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-email-followers-get-failure.json diff --git a/WordPressKitTests/Mock Data/site-email-followers-get-success-more-pages.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-email-followers-get-success-more-pages.json similarity index 100% rename from WordPressKitTests/Mock Data/site-email-followers-get-success-more-pages.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-email-followers-get-success-more-pages.json diff --git a/WordPressKitTests/Mock Data/site-email-followers-get-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-email-followers-get-success.json similarity index 100% rename from WordPressKitTests/Mock Data/site-email-followers-get-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-email-followers-get-success.json diff --git a/WordPressKitTests/Mock Data/site-export-auth-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-export-auth-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-export-auth-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-export-auth-failure.json diff --git a/WordPressKitTests/Mock Data/site-export-bad-json-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-export-bad-json-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-export-bad-json-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-export-bad-json-failure.json diff --git a/WordPressKitTests/Mock Data/site-export-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-export-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-export-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-export-failure.json diff --git a/WordPressKitTests/Mock Data/site-export-missing-status-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-export-missing-status-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-export-missing-status-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-export-missing-status-failure.json diff --git a/WordPressKitTests/Mock Data/site-export-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-export-success.json similarity index 100% rename from WordPressKitTests/Mock Data/site-export-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-export-success.json diff --git a/WordPressKitTests/Mock Data/site-followers-delete-auth-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-followers-delete-auth-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-followers-delete-auth-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-followers-delete-auth-failure.json diff --git a/WordPressKitTests/Mock Data/site-followers-delete-bad-json-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-followers-delete-bad-json-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-followers-delete-bad-json-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-followers-delete-bad-json-failure.json diff --git a/WordPressKitTests/Mock Data/site-followers-delete-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-followers-delete-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-followers-delete-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-followers-delete-failure.json diff --git a/WordPressKitTests/Mock Data/site-followers-delete-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-followers-delete-success.json similarity index 100% rename from WordPressKitTests/Mock Data/site-followers-delete-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-followers-delete-success.json diff --git a/WordPressKitTests/Mock Data/site-plans-bad-json-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-plans-bad-json-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-plans-bad-json-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-plans-bad-json-failure.json diff --git a/WordPressKitTests/Mock Data/site-plans-v3-bad-json-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-plans-v3-bad-json-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-plans-v3-bad-json-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-plans-v3-bad-json-failure.json diff --git a/WordPressKitTests/Mock Data/site-plans-v3-empty-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-plans-v3-empty-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-plans-v3-empty-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-plans-v3-empty-failure.json diff --git a/WordPressKitTests/Mock Data/site-plans-v3-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-plans-v3-success.json similarity index 100% rename from WordPressKitTests/Mock Data/site-plans-v3-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-plans-v3-success.json diff --git a/WordPressKitTests/Mock Data/site-plugins-error.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-plugins-error.json similarity index 100% rename from WordPressKitTests/Mock Data/site-plugins-error.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-plugins-error.json diff --git a/WordPressKitTests/Mock Data/site-plugins-malformed.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-plugins-malformed.json similarity index 100% rename from WordPressKitTests/Mock Data/site-plugins-malformed.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-plugins-malformed.json diff --git a/WordPressKitTests/Mock Data/site-plugins-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-plugins-success.json similarity index 100% rename from WordPressKitTests/Mock Data/site-plugins-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-plugins-success.json diff --git a/WordPressKitTests/Mock Data/site-quick-start-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-quick-start-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-quick-start-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-quick-start-failure.json diff --git a/WordPressKitTests/Mock Data/site-quick-start-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-quick-start-success.json similarity index 100% rename from WordPressKitTests/Mock Data/site-quick-start-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-quick-start-success.json diff --git a/WordPressKitTests/Mock Data/site-roles-auth-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-roles-auth-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-roles-auth-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-roles-auth-failure.json diff --git a/WordPressKitTests/Mock Data/site-roles-bad-json-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-roles-bad-json-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-roles-bad-json-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-roles-bad-json-failure.json diff --git a/WordPressKitTests/Mock Data/site-roles-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-roles-success.json similarity index 100% rename from WordPressKitTests/Mock Data/site-roles-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-roles-success.json diff --git a/WordPressKitTests/Mock Data/site-segments-multiple.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-segments-multiple.json similarity index 100% rename from WordPressKitTests/Mock Data/site-segments-multiple.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-segments-multiple.json diff --git a/WordPressKitTests/Mock Data/site-segments-single.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-segments-single.json similarity index 100% rename from WordPressKitTests/Mock Data/site-segments-single.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-segments-single.json diff --git a/WordPressKitTests/Mock Data/site-users-delete-auth-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-users-delete-auth-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-users-delete-auth-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-users-delete-auth-failure.json diff --git a/WordPressKitTests/Mock Data/site-users-delete-bad-json-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-users-delete-bad-json-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-users-delete-bad-json-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-users-delete-bad-json-failure.json diff --git a/WordPressKitTests/Mock Data/site-users-delete-not-member-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-users-delete-not-member-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-users-delete-not-member-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-users-delete-not-member-failure.json diff --git a/WordPressKitTests/Mock Data/site-users-delete-site-owner-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-users-delete-site-owner-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-users-delete-site-owner-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-users-delete-site-owner-failure.json diff --git a/WordPressKitTests/Mock Data/site-users-delete-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-users-delete-success.json similarity index 100% rename from WordPressKitTests/Mock Data/site-users-delete-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-users-delete-success.json diff --git a/WordPressKitTests/Mock Data/site-users-update-role-bad-json-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-users-update-role-bad-json-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-users-update-role-bad-json-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-users-update-role-bad-json-failure.json diff --git a/WordPressKitTests/Mock Data/site-users-update-role-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-users-update-role-success.json similarity index 100% rename from WordPressKitTests/Mock Data/site-users-update-role-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-users-update-role-success.json diff --git a/WordPressKitTests/Mock Data/site-users-update-role-unknown-site-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-users-update-role-unknown-site-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-users-update-role-unknown-site-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-users-update-role-unknown-site-failure.json diff --git a/WordPressKitTests/Mock Data/site-users-update-role-unknown-user-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-users-update-role-unknown-user-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-users-update-role-unknown-user-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-users-update-role-unknown-user-failure.json diff --git a/WordPressKitTests/Mock Data/site-verticals-empty.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-verticals-empty.json similarity index 100% rename from WordPressKitTests/Mock Data/site-verticals-empty.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-verticals-empty.json diff --git a/WordPressKitTests/Mock Data/site-verticals-multiple.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-verticals-multiple.json similarity index 100% rename from WordPressKitTests/Mock Data/site-verticals-multiple.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-verticals-multiple.json diff --git a/WordPressKitTests/Mock Data/site-verticals-prompt.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-verticals-prompt.json similarity index 100% rename from WordPressKitTests/Mock Data/site-verticals-prompt.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-verticals-prompt.json diff --git a/WordPressKitTests/Mock Data/site-verticals-single.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-verticals-single.json similarity index 100% rename from WordPressKitTests/Mock Data/site-verticals-single.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-verticals-single.json diff --git a/WordPressKitTests/Mock Data/site-viewers-delete-auth-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-viewers-delete-auth-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-viewers-delete-auth-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-viewers-delete-auth-failure.json diff --git a/WordPressKitTests/Mock Data/site-viewers-delete-bad-json.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-viewers-delete-bad-json.json similarity index 100% rename from WordPressKitTests/Mock Data/site-viewers-delete-bad-json.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-viewers-delete-bad-json.json diff --git a/WordPressKitTests/Mock Data/site-viewers-delete-failure.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-viewers-delete-failure.json similarity index 100% rename from WordPressKitTests/Mock Data/site-viewers-delete-failure.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-viewers-delete-failure.json diff --git a/WordPressKitTests/Mock Data/site-viewers-delete-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-viewers-delete-success.json similarity index 100% rename from WordPressKitTests/Mock Data/site-viewers-delete-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/site-viewers-delete-success.json diff --git a/WordPressKitTests/Mock Data/sites-external-services.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/sites-external-services.json similarity index 100% rename from WordPressKitTests/Mock Data/sites-external-services.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/sites-external-services.json diff --git a/WordPressKitTests/Mock Data/sites-invites-links-disable-empty.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/sites-invites-links-disable-empty.json similarity index 100% rename from WordPressKitTests/Mock Data/sites-invites-links-disable-empty.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/sites-invites-links-disable-empty.json diff --git a/WordPressKitTests/Mock Data/sites-invites-links-disable.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/sites-invites-links-disable.json similarity index 100% rename from WordPressKitTests/Mock Data/sites-invites-links-disable.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/sites-invites-links-disable.json diff --git a/WordPressKitTests/Mock Data/sites-invites-links-generate.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/sites-invites-links-generate.json similarity index 100% rename from WordPressKitTests/Mock Data/sites-invites-links-generate.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/sites-invites-links-generate.json diff --git a/WordPressKitTests/Mock Data/sites-invites.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/sites-invites.json similarity index 100% rename from WordPressKitTests/Mock Data/sites-invites.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/sites-invites.json diff --git a/WordPressKitTests/Mock Data/sites-site-active-features.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/sites-site-active-features.json similarity index 100% rename from WordPressKitTests/Mock Data/sites-site-active-features.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/sites-site-active-features.json diff --git a/WordPressKitTests/Mock Data/sites-site-no-active-features.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/sites-site-no-active-features.json similarity index 100% rename from WordPressKitTests/Mock Data/sites-site-no-active-features.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/sites-site-no-active-features.json diff --git a/WordPressKitTests/Mock Data/stats-clicks-data.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-clicks-data.json similarity index 100% rename from WordPressKitTests/Mock Data/stats-clicks-data.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-clicks-data.json diff --git a/WordPressKitTests/Mock Data/stats-countries-data.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-countries-data.json similarity index 100% rename from WordPressKitTests/Mock Data/stats-countries-data.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-countries-data.json diff --git a/WordPressKitTests/Mock Data/stats-file-downloads.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-file-downloads.json similarity index 100% rename from WordPressKitTests/Mock Data/stats-file-downloads.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-file-downloads.json diff --git a/WordPressKitTests/Mock Data/stats-post-details.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-post-details.json similarity index 100% rename from WordPressKitTests/Mock Data/stats-post-details.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-post-details.json diff --git a/WordPressKitTests/Mock Data/stats-posts-data.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-posts-data.json similarity index 100% rename from WordPressKitTests/Mock Data/stats-posts-data.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-posts-data.json diff --git a/WordPressKitTests/Mock Data/stats-published-posts.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-published-posts.json similarity index 100% rename from WordPressKitTests/Mock Data/stats-published-posts.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-published-posts.json diff --git a/WordPressKitTests/Mock Data/stats-referrer-data.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-referrer-data.json similarity index 100% rename from WordPressKitTests/Mock Data/stats-referrer-data.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-referrer-data.json diff --git a/WordPressKitTests/Mock Data/stats-referrer-mark-as-spam.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-referrer-mark-as-spam.json similarity index 100% rename from WordPressKitTests/Mock Data/stats-referrer-mark-as-spam.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-referrer-mark-as-spam.json diff --git a/WordPressKitTests/Mock Data/stats-search-term-result.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-search-term-result.json similarity index 100% rename from WordPressKitTests/Mock Data/stats-search-term-result.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-search-term-result.json diff --git a/WordPressKitTests/Mock Data/stats-streak-result.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-streak-result.json similarity index 100% rename from WordPressKitTests/Mock Data/stats-streak-result.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-streak-result.json diff --git a/WordPressKitTests/Mock Data/stats-summary.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-summary.json similarity index 100% rename from WordPressKitTests/Mock Data/stats-summary.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-summary.json diff --git a/WordPressKitTests/Mock Data/stats-top-authors.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-top-authors.json similarity index 100% rename from WordPressKitTests/Mock Data/stats-top-authors.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-top-authors.json diff --git a/WordPressKitTests/Mock Data/stats-videos-data.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-videos-data.json similarity index 100% rename from WordPressKitTests/Mock Data/stats-videos-data.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-videos-data.json diff --git a/WordPressKitTests/Mock Data/stats-visits-day.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-visits-day.json similarity index 100% rename from WordPressKitTests/Mock Data/stats-visits-day.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-visits-day.json diff --git a/WordPressKitTests/Mock Data/stats-visits-month-unit-week.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-visits-month-unit-week.json similarity index 100% rename from WordPressKitTests/Mock Data/stats-visits-month-unit-week.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-visits-month-unit-week.json diff --git a/WordPressKitTests/Mock Data/stats-visits-month.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-visits-month.json similarity index 100% rename from WordPressKitTests/Mock Data/stats-visits-month.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-visits-month.json diff --git a/WordPressKitTests/Mock Data/stats-visits-week.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-visits-week.json similarity index 100% rename from WordPressKitTests/Mock Data/stats-visits-week.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/stats-visits-week.json diff --git a/WordPressKitTests/Mock Data/supported-countries-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/supported-countries-success.json similarity index 100% rename from WordPressKitTests/Mock Data/supported-countries-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/supported-countries-success.json diff --git a/WordPressKitTests/Mock Data/supported-states-empty.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/supported-states-empty.json similarity index 100% rename from WordPressKitTests/Mock Data/supported-states-empty.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/supported-states-empty.json diff --git a/WordPressKitTests/Mock Data/supported-states-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/supported-states-success.json similarity index 100% rename from WordPressKitTests/Mock Data/supported-states-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/supported-states-success.json diff --git a/WordPressKitTests/Mock Data/timezones.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/timezones.json similarity index 100% rename from WordPressKitTests/Mock Data/timezones.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/timezones.json diff --git a/WordPressKitTests/Mock Data/validate-domain-contact-information-response-fail.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/validate-domain-contact-information-response-fail.json similarity index 100% rename from WordPressKitTests/Mock Data/validate-domain-contact-information-response-fail.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/validate-domain-contact-information-response-fail.json diff --git a/WordPressKitTests/Mock Data/validate-domain-contact-information-response-success.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/validate-domain-contact-information-response-success.json similarity index 100% rename from WordPressKitTests/Mock Data/validate-domain-contact-information-response-success.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/validate-domain-contact-information-response-success.json diff --git a/WordPressKitTests/Mock Data/videopress-private-video.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/videopress-private-video.json similarity index 100% rename from WordPressKitTests/Mock Data/videopress-private-video.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/videopress-private-video.json diff --git a/WordPressKitTests/Mock Data/videopress-public-video.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/videopress-public-video.json similarity index 100% rename from WordPressKitTests/Mock Data/videopress-public-video.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/videopress-public-video.json diff --git a/WordPressKitTests/Mock Data/videopress-site-default-video.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/videopress-site-default-video.json similarity index 100% rename from WordPressKitTests/Mock Data/videopress-site-default-video.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/videopress-site-default-video.json diff --git a/WordPressKitTests/Mock Data/videopress-token.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/videopress-token.json similarity index 100% rename from WordPressKitTests/Mock Data/videopress-token.json rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/videopress-token.json diff --git a/WordPressKitTests/Mock Data/wp-admin-post-new.html b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/wp-admin-post-new.html similarity index 100% rename from WordPressKitTests/Mock Data/wp-admin-post-new.html rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/wp-admin-post-new.html diff --git a/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/wp-com-rest-api-fail-throttled.json b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/wp-com-rest-api-fail-throttled.json new file mode 100644 index 00000000..89bd200e --- /dev/null +++ b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/wp-com-rest-api-fail-throttled.json @@ -0,0 +1,3 @@ + +Limit reached + \ No newline at end of file diff --git a/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-bad-username-password-error.xml b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-bad-username-password-error.xml new file mode 100644 index 00000000..37e8cb0d --- /dev/null +++ b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-bad-username-password-error.xml @@ -0,0 +1,17 @@ + + + + + + + faultCode + 403 + + + faultString + Incorrect username or password. + + + + + diff --git a/WordPressKitTests/Mock Data/xmlrpc-malformed-request-xml-error.xml b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-malformed-request-xml-error.xml similarity index 100% rename from WordPressKitTests/Mock Data/xmlrpc-malformed-request-xml-error.xml rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-malformed-request-xml-error.xml diff --git a/WordPressKitTests/Mock Data/xmlrpc-metaweblog-editpost-bad-xml-failure.xml b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-metaweblog-editpost-bad-xml-failure.xml similarity index 100% rename from WordPressKitTests/Mock Data/xmlrpc-metaweblog-editpost-bad-xml-failure.xml rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-metaweblog-editpost-bad-xml-failure.xml diff --git a/WordPressKitTests/Mock Data/xmlrpc-metaweblog-editpost-change-format-failure.xml b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-metaweblog-editpost-change-format-failure.xml similarity index 100% rename from WordPressKitTests/Mock Data/xmlrpc-metaweblog-editpost-change-format-failure.xml rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-metaweblog-editpost-change-format-failure.xml diff --git a/WordPressKitTests/Mock Data/xmlrpc-metaweblog-editpost-change-type-failure.xml b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-metaweblog-editpost-change-type-failure.xml similarity index 100% rename from WordPressKitTests/Mock Data/xmlrpc-metaweblog-editpost-change-type-failure.xml rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-metaweblog-editpost-change-type-failure.xml diff --git a/WordPressKitTests/Mock Data/xmlrpc-metaweblog-editpost-success.xml b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-metaweblog-editpost-success.xml similarity index 100% rename from WordPressKitTests/Mock Data/xmlrpc-metaweblog-editpost-success.xml rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-metaweblog-editpost-success.xml diff --git a/WordPressKitTests/Mock Data/xmlrpc-metaweblog-newpost-bad-xml-failure.xml b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-metaweblog-newpost-bad-xml-failure.xml similarity index 100% rename from WordPressKitTests/Mock Data/xmlrpc-metaweblog-newpost-bad-xml-failure.xml rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-metaweblog-newpost-bad-xml-failure.xml diff --git a/WordPressKitTests/Mock Data/xmlrpc-metaweblog-newpost-invalid-posttype-failure.xml b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-metaweblog-newpost-invalid-posttype-failure.xml similarity index 100% rename from WordPressKitTests/Mock Data/xmlrpc-metaweblog-newpost-invalid-posttype-failure.xml rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-metaweblog-newpost-invalid-posttype-failure.xml diff --git a/WordPressKitTests/Mock Data/xmlrpc-metaweblog-newpost-success.xml b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-metaweblog-newpost-success.xml similarity index 100% rename from WordPressKitTests/Mock Data/xmlrpc-metaweblog-newpost-success.xml rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-metaweblog-newpost-success.xml diff --git a/WordPressKitTests/Mock Data/xmlrpc-response-getprofile.xml b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-response-getprofile.xml similarity index 100% rename from WordPressKitTests/Mock Data/xmlrpc-response-getprofile.xml rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-response-getprofile.xml diff --git a/WordPressKitTests/Mock Data/xmlrpc-response-valid-but-unexpected-dictionary.xml b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-response-valid-but-unexpected-dictionary.xml similarity index 100% rename from WordPressKitTests/Mock Data/xmlrpc-response-valid-but-unexpected-dictionary.xml rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-response-valid-but-unexpected-dictionary.xml diff --git a/WordPressKitTests/Mock Data/xmlrpc-site-comment-success.xml b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-site-comment-success.xml similarity index 100% rename from WordPressKitTests/Mock Data/xmlrpc-site-comment-success.xml rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-site-comment-success.xml diff --git a/WordPressKitTests/Mock Data/xmlrpc-site-comments-success.xml b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-site-comments-success.xml similarity index 100% rename from WordPressKitTests/Mock Data/xmlrpc-site-comments-success.xml rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-site-comments-success.xml diff --git a/WordPressKitTests/Mock Data/xmlrpc-wp-getpost-bad-xml-failure.xml b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-wp-getpost-bad-xml-failure.xml similarity index 100% rename from WordPressKitTests/Mock Data/xmlrpc-wp-getpost-bad-xml-failure.xml rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-wp-getpost-bad-xml-failure.xml diff --git a/WordPressKitTests/Mock Data/xmlrpc-wp-getpost-invalid-id-failure.xml b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-wp-getpost-invalid-id-failure.xml similarity index 100% rename from WordPressKitTests/Mock Data/xmlrpc-wp-getpost-invalid-id-failure.xml rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-wp-getpost-invalid-id-failure.xml diff --git a/WordPressKitTests/Mock Data/xmlrpc-wp-getpost-success.xml b/Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-wp-getpost-success.xml similarity index 100% rename from WordPressKitTests/Mock Data/xmlrpc-wp-getpost-success.xml rename to Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-wp-getpost-success.xml diff --git a/WordPressKitTests/WordPressComServiceRemoteTests+SiteCreation.swift b/Tests/WordPressKitTests/WordPressComServiceRemoteTests+SiteCreation.swift similarity index 100% rename from WordPressKitTests/WordPressComServiceRemoteTests+SiteCreation.swift rename to Tests/WordPressKitTests/WordPressComServiceRemoteTests+SiteCreation.swift diff --git a/WordPressKitTests/WordPressComServiceRemoteTests+SiteVerticals.swift b/Tests/WordPressKitTests/WordPressComServiceRemoteTests+SiteVerticals.swift similarity index 100% rename from WordPressKitTests/WordPressComServiceRemoteTests+SiteVerticals.swift rename to Tests/WordPressKitTests/WordPressComServiceRemoteTests+SiteVerticals.swift diff --git a/WordPressKitTests/WordPressComServiceRemoteTests+SiteVerticalsPrompt.swift b/Tests/WordPressKitTests/WordPressComServiceRemoteTests+SiteVerticalsPrompt.swift similarity index 100% rename from WordPressKitTests/WordPressComServiceRemoteTests+SiteVerticalsPrompt.swift rename to Tests/WordPressKitTests/WordPressComServiceRemoteTests+SiteVerticalsPrompt.swift diff --git a/WordPressKitTests/WordPressKitTests-Bridging-Header.h b/Tests/WordPressKitTests/WordPressKitTests-Bridging-Header.h similarity index 100% rename from WordPressKitTests/WordPressKitTests-Bridging-Header.h rename to Tests/WordPressKitTests/WordPressKitTests-Bridging-Header.h diff --git a/WordPressKitTests/XMLRPCTestable.swift b/Tests/WordPressKitTests/XMLRPCTestable.swift similarity index 100% rename from WordPressKitTests/XMLRPCTestable.swift rename to Tests/WordPressKitTests/XMLRPCTestable.swift diff --git a/WordPressKitTests/backup-get-backup-status-complete-success.json b/Tests/WordPressKitTests/backup-get-backup-status-complete-success.json similarity index 100% rename from WordPressKitTests/backup-get-backup-status-complete-success.json rename to Tests/WordPressKitTests/backup-get-backup-status-complete-success.json diff --git a/WordPressKitTests/backup-get-backup-status-in-progress-success.json b/Tests/WordPressKitTests/backup-get-backup-status-in-progress-success.json similarity index 100% rename from WordPressKitTests/backup-get-backup-status-in-progress-success.json rename to Tests/WordPressKitTests/backup-get-backup-status-in-progress-success.json diff --git a/WordPressKitTests/backup-prepare-backup-success.json b/Tests/WordPressKitTests/backup-prepare-backup-success.json similarity index 100% rename from WordPressKitTests/backup-prepare-backup-success.json rename to Tests/WordPressKitTests/backup-prepare-backup-success.json diff --git a/WordPressKitTests/me-settings-auth-failure.json b/Tests/WordPressKitTests/me-settings-auth-failure.json similarity index 100% rename from WordPressKitTests/me-settings-auth-failure.json rename to Tests/WordPressKitTests/me-settings-auth-failure.json diff --git a/WordPressKitTests/me-settings-bad-json-failure.json b/Tests/WordPressKitTests/me-settings-bad-json-failure.json similarity index 100% rename from WordPressKitTests/me-settings-bad-json-failure.json rename to Tests/WordPressKitTests/me-settings-bad-json-failure.json diff --git a/WordPressKitTests/me-settings-change-aboutme-success.json b/Tests/WordPressKitTests/me-settings-change-aboutme-success.json similarity index 100% rename from WordPressKitTests/me-settings-change-aboutme-success.json rename to Tests/WordPressKitTests/me-settings-change-aboutme-success.json diff --git a/WordPressKitTests/me-settings-change-display-name-bad-json-failure.json b/Tests/WordPressKitTests/me-settings-change-display-name-bad-json-failure.json similarity index 100% rename from WordPressKitTests/me-settings-change-display-name-bad-json-failure.json rename to Tests/WordPressKitTests/me-settings-change-display-name-bad-json-failure.json diff --git a/WordPressKitTests/me-settings-change-display-name-success.json b/Tests/WordPressKitTests/me-settings-change-display-name-success.json similarity index 100% rename from WordPressKitTests/me-settings-change-display-name-success.json rename to Tests/WordPressKitTests/me-settings-change-display-name-success.json diff --git a/WordPressKitTests/me-settings-change-firstname-success.json b/Tests/WordPressKitTests/me-settings-change-firstname-success.json similarity index 100% rename from WordPressKitTests/me-settings-change-firstname-success.json rename to Tests/WordPressKitTests/me-settings-change-firstname-success.json diff --git a/WordPressKitTests/me-settings-change-invalid-input-failure.json b/Tests/WordPressKitTests/me-settings-change-invalid-input-failure.json similarity index 100% rename from WordPressKitTests/me-settings-change-invalid-input-failure.json rename to Tests/WordPressKitTests/me-settings-change-invalid-input-failure.json diff --git a/WordPressKitTests/me-settings-change-lastname-success.json b/Tests/WordPressKitTests/me-settings-change-lastname-success.json similarity index 100% rename from WordPressKitTests/me-settings-change-lastname-success.json rename to Tests/WordPressKitTests/me-settings-change-lastname-success.json diff --git a/WordPressKitTests/me-settings-change-primary-site-success.json b/Tests/WordPressKitTests/me-settings-change-primary-site-success.json similarity index 100% rename from WordPressKitTests/me-settings-change-primary-site-success.json rename to Tests/WordPressKitTests/me-settings-change-primary-site-success.json diff --git a/WordPressKitTests/me-settings-change-web-address-success.json b/Tests/WordPressKitTests/me-settings-change-web-address-success.json similarity index 100% rename from WordPressKitTests/me-settings-change-web-address-success.json rename to Tests/WordPressKitTests/me-settings-change-web-address-success.json diff --git a/WordPressKitTests/me-settings-revert-email-success.json b/Tests/WordPressKitTests/me-settings-revert-email-success.json similarity index 100% rename from WordPressKitTests/me-settings-revert-email-success.json rename to Tests/WordPressKitTests/me-settings-revert-email-success.json diff --git a/WordPressKit.podspec b/WordPressKit.podspec index d7132ee7..a1527889 100644 --- a/WordPressKit.podspec +++ b/WordPressKit.podspec @@ -18,9 +18,9 @@ Pod::Spec.new do |s| s.swift_version = '5.0' s.source = { git: 'https://github.com/wordpress-mobile/WordPressKit-iOS.git', tag: s.version.to_s } - s.source_files = 'WordPressKit/**/*.{h,m,swift}' - s.private_header_files = 'WordPressKit/Private/*.h' - s.header_dir = 'WordPressKit' + s.source_files = 'Sources/**/*.{h,m,swift}' + s.public_header_files = 'Sources/WordPressKit/**/*.h', 'Sources/WordPressKit/WordPressKit.h' + s.private_header_files = 'Sources/WordPressKit/WordPressAndJetpack/Private/*.h' s.dependency 'NSObject-SafeExpectations', '~> 0.0.4' s.dependency 'wpxmlrpc', '~> 0.10' @@ -29,4 +29,30 @@ Pod::Spec.new do |s| # Use a loose restriction that allows both production and beta versions, up to the next major version. # If you want to update which of these is used, specify it in the host app. s.dependency 'WordPressShared', '~> 2.0-beta' + + # Test specs disabled because they also use Buildkite's test collector, which is not setup via CocoaPod. + # https://github.com/buildkite/test-collector-swift + # + # s.test_spec do |test_spec| + # test_spec.source_files = 'Tests/WordPressKitTests' + + # test_spec.dependency 'OHHTTPStubs', '~> 9.0' + # test_spec.dependency 'OHHTTPStubs/Swift', '~> 9.0' + # test_spec.dependency 'OCMock', '~> 3.4' + # test_spec.dependency 'Alamofire', '~> 5.0' + # end + + s.subspec 'CoreAPI' do |subspec| + subspec.source_files = 'Sources/CoreAPI' + + # Currently failing during `lib lint`. + # Will need to followup. + # + # subspec.test_spec do |test_spec| + # test_spec.source_files = 'Tests/CoreAPITests' + # test_spec.dependency 'OHHTTPStubs', '~> 9.0' + # test_spec.dependency 'OHHTTPStubs/Swift', '~> 9.0' + # test_spec.dependency 'Alamofire', '~> 5.0' + # end + end end diff --git a/WordPressKit.xcodeproj/project.pbxproj b/WordPressKit.xcodeproj/project.pbxproj index 694d1560..ae8596f1 100644 --- a/WordPressKit.xcodeproj/project.pbxproj +++ b/WordPressKit.xcodeproj/project.pbxproj @@ -7,9 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 01438D352B6A2B2C0097D60A /* stats-visits-month-unit-week.json in Sources */ = {isa = PBXBuildFile; fileRef = 01438D342B6A2B2C0097D60A /* stats-visits-month-unit-week.json */; }; 01438D362B6A31540097D60A /* stats-visits-month-unit-week.json in Resources */ = {isa = PBXBuildFile; fileRef = 01438D342B6A2B2C0097D60A /* stats-visits-month-unit-week.json */; }; - 01438D382B6A35FB0097D60A /* stats-summary.json in Sources */ = {isa = PBXBuildFile; fileRef = 01438D372B6A35FB0097D60A /* stats-summary.json */; }; 01438D392B6A361B0097D60A /* stats-summary.json in Resources */ = {isa = PBXBuildFile; fileRef = 01438D372B6A35FB0097D60A /* stats-summary.json */; }; 01438D3B2B6A36BF0097D60A /* StatsTotalsSummaryData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01438D3A2B6A36BF0097D60A /* StatsTotalsSummaryData.swift */; }; 0152100C28EDA9E400DD6783 /* StatsAnnualAndMostPopularTimeInsightDecodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0152100B28EDA9E400DD6783 /* StatsAnnualAndMostPopularTimeInsightDecodingTests.swift */; }; @@ -31,7 +29,6 @@ 17CE77F420C701C8001DEA5A /* ReaderSiteSearchServiceRemoteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17CE77F320C701C8001DEA5A /* ReaderSiteSearchServiceRemoteTests.swift */; }; 17D936252475D8AB008B2205 /* RemoteHomepageType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17D936242475D8AB008B2205 /* RemoteHomepageType.swift */; }; 1A4F98672279A87D00D86E8E /* WPKit-Swift.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A4F98662279A87D00D86E8E /* WPKit-Swift.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 1D969EB329D45745001FE37C /* wp-reusable-blocks.json in Resources */ = {isa = PBXBuildFile; fileRef = 1D969EB229D45745001FE37C /* wp-reusable-blocks.json */; }; 1DAC3D2629AF4F250068FE13 /* RemoteVideoPressVideo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DAC3D2529AF4F250068FE13 /* RemoteVideoPressVideo.swift */; }; 1DC837C229B9F04F009DCD4B /* RemoteVideoPressVideoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DC837C129B9F04F009DCD4B /* RemoteVideoPressVideoTests.swift */; }; 1DF972BA29B0DF8C007A72BC /* videopress-token.json in Resources */ = {isa = PBXBuildFile; fileRef = 1DF972B729B0DF8C007A72BC /* videopress-token.json */; }; @@ -40,10 +37,6 @@ 1DF972C129B107E7007A72BC /* videopress-site-default-video.json in Resources */ = {isa = PBXBuildFile; fileRef = 1DF972BE29B107E7007A72BC /* videopress-site-default-video.json */; }; 240315B0A1D6C2B981572B5B /* Pods_WordPressKitTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED05C8FF3E61D93CE5BA527E /* Pods_WordPressKitTests.framework */; }; 24ADA24E24F9B32D001B5DAE /* FeatureFlagSerializationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24ADA24D24F9B32D001B5DAE /* FeatureFlagSerializationTest.swift */; }; - 264E09B32AD0B3BB004B5A5F /* WebauthChallengeInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 264E09B22AD0B3BB004B5A5F /* WebauthChallengeInfo.swift */; }; - 264E09B52AD259FF004B5A5F /* WordPressComOAuthRequestChallenge.json in Resources */ = {isa = PBXBuildFile; fileRef = 264E09B42AD259FF004B5A5F /* WordPressComOAuthRequestChallenge.json */; }; - 264E09B72AD25ED9004B5A5F /* WordPressComOAuthAuthenticateSignature.json in Resources */ = {isa = PBXBuildFile; fileRef = 264E09B62AD25ED9004B5A5F /* WordPressComOAuthAuthenticateSignature.json */; }; - 264E09B92AD2709A004B5A5F /* WordPressComOAuthNeedsWebauthnMFA.json in Resources */ = {isa = PBXBuildFile; fileRef = 264E09B82AD2709A004B5A5F /* WordPressComOAuthNeedsWebauthnMFA.json */; }; 3236F77824AE34B40088E8F3 /* ReaderTopicServiceRemote+Interests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3236F77724AE34B40088E8F3 /* ReaderTopicServiceRemote+Interests.swift */; }; 3236F79A24AE406D0088E8F3 /* ReaderTopicServiceRemote+InterestsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3236F79924AE406D0088E8F3 /* ReaderTopicServiceRemote+InterestsTests.swift */; }; 3236F79C24AE413A0088E8F3 /* reader-interests-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 3236F79B24AE413A0088E8F3 /* reader-interests-success.json */; }; @@ -61,12 +54,80 @@ 32FC1D28255C91ED00CD0A7B /* JetpackScan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32FC1D26255C91ED00CD0A7B /* JetpackScan.swift */; }; 32FC1D29255C91ED00CD0A7B /* JetpackScanServiceRemote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32FC1D27255C91ED00CD0A7B /* JetpackScanServiceRemote.swift */; }; 32FC20CE255DCC6100CD0A7B /* JetpackScanThreat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32FC20CD255DCC6100CD0A7B /* JetpackScanThreat.swift */; }; + 3F21ECBE2B8DAAC500DCE8DD /* me-settings-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 3F21ECBD2B8DAAC500DCE8DD /* me-settings-success.json */; }; + 3F21ECC52B8DCDCF00DCE8DD /* xmlrpc-bad-username-password-error.xml in Resources */ = {isa = PBXBuildFile; fileRef = 3F21ECC42B8DCDCF00DCE8DD /* xmlrpc-bad-username-password-error.xml */; }; + 3F21ECC72B8DCE4500DCE8DD /* wp-com-rest-api-fail-throttled.json in Resources */ = {isa = PBXBuildFile; fileRef = 3F21ECC62B8DCE4500DCE8DD /* wp-com-rest-api-fail-throttled.json */; }; 3F3195AD266FF94B00397EE7 /* ZendeskMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F3195AC266FF94B00397EE7 /* ZendeskMetadata.swift */; }; - 3F391E1A2B50F3EB007975C4 /* Result+Callback.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F391E192B50F3EB007975C4 /* Result+Callback.swift */; }; 3F3C9E9C289A3E31009A1357 /* TestCollector+Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F3C9E9B289A3E31009A1357 /* TestCollector+Constants.swift */; }; 3F758FD324F6C68200BBA2FC /* AnnouncementServiceRemote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F758FD224F6C68200BBA2FC /* AnnouncementServiceRemote.swift */; }; 3F8308A729EE683500354497 /* ActivityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F8308A629EE683500354497 /* ActivityTests.swift */; }; 3FB8642C2888089F003A86BE /* BuildkiteTestCollector in Frameworks */ = {isa = PBXBuildFile; productRef = 3FB8642B2888089F003A86BE /* BuildkiteTestCollector */; }; + 3FF873F12B8F2C7100EB8AFA /* me-settings-change-email-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 3FF873F02B8F2C7100EB8AFA /* me-settings-change-email-success.json */; }; + 3FF873F52B8F3B5F00EB8AFA /* MultipartForm.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A11239F2B196821004690CF /* MultipartForm.swift */; }; + 3FF873F62B8F3B5F00EB8AFA /* Result+Callback.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F391E192B50F3EB007975C4 /* Result+Callback.swift */; }; + 3FF873F72B8F3B5F00EB8AFA /* HTTPClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A11239D2B1926D1004690CF /* HTTPClient.swift */; }; + 3FF873F82B8F3B5F00EB8AFA /* WordPressOrgRestApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A05E7992B2FDC3200C25E3B /* WordPressOrgRestApi.swift */; }; + 3FF873F92B8F3B5F00EB8AFA /* WordPressOrgXMLRPCValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93BD277A1EE73944002BB00B /* WordPressOrgXMLRPCValidator.swift */; }; + 3FF873FA2B8F3B5F00EB8AFA /* WordPressRSDParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93BD277B1EE73944002BB00B /* WordPressRSDParser.swift */; }; + 3FF873FB2B8F3B5F00EB8AFA /* SocialLogin2FANonceInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = E632D7771F6E047400297F6D /* SocialLogin2FANonceInfo.swift */; }; + 3FF873FC2B8F3B5F00EB8AFA /* Either.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F21EC702B8D8F7800DCE8DD /* Either.swift */; }; + 3FF873FD2B8F3B5F00EB8AFA /* StringEncoding+IANA.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F21EC6E2B8D8F3B00DCE8DD /* StringEncoding+IANA.swift */; }; + 3FF873FE2B8F3B5F00EB8AFA /* WordPressAPIError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A1123992B19269A004690CF /* WordPressAPIError.swift */; }; + 3FF873FF2B8F3B5F00EB8AFA /* WordPressComOAuthClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93BD27771EE73944002BB00B /* WordPressComOAuthClient.swift */; }; + 3FF874002B8F3B5F00EB8AFA /* WebauthChallengeInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 264E09B22AD0B3BB004B5A5F /* WebauthChallengeInfo.swift */; }; + 3FF874012B8F3B5F00EB8AFA /* NonceRetrieval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A05E7952B2FCB6400C25E3B /* NonceRetrieval.swift */; }; + 3FF874022B8F3B5F00EB8AFA /* WordPressOrgXMLRPCApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93BD27791EE73944002BB00B /* WordPressOrgXMLRPCApi.swift */; }; + 3FF874032B8F3B5F00EB8AFA /* HTTPRequestBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A11239B2B1926B7004690CF /* HTTPRequestBuilder.swift */; }; + 3FF874042B8F3B5F00EB8AFA /* NSDate+RFC3339.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF873F22B8F2F1800EB8AFA /* NSDate+RFC3339.swift */; }; + 3FF874052B8F3B5F00EB8AFA /* AppTransportSecuritySettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57BCD3D326209D9500292CB3 /* AppTransportSecuritySettings.swift */; }; + 3FF874062B8F3B5F00EB8AFA /* WordPressComRestApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93BD27781EE73944002BB00B /* WordPressComRestApi.swift */; }; + 3FF874072B8F3B5F00EB8AFA /* WordPressComRestApiErrorDomain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F21EC7C2B8D927000DCE8DD /* WordPressComRestApiErrorDomain.swift */; }; + 3FF874082B8F3B5F00EB8AFA /* HTTPAuthenticationAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93BD27741EE73944002BB00B /* HTTPAuthenticationAlertController.swift */; }; + 3FF874092B8F3B5F00EB8AFA /* WordPressAPIError+NSErrorBrdige.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A57A6822B54A326008D0660 /* WordPressAPIError+NSErrorBrdige.swift */; }; + 3FF8740A2B8F3B8800EB8AFA /* HTTPRequestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A05E79D2B30F3C500C25E3B /* HTTPRequestHelpers.swift */; }; + 3FF8740B2B8F3B8800EB8AFA /* MultipartFormTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A1123A12B19690C004690CF /* MultipartFormTests.swift */; }; + 3FF8740C2B8F3B8800EB8AFA /* AppTransportSecuritySettingsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46ABD0E9262EEE0400C7FF24 /* AppTransportSecuritySettingsTests.swift */; }; + 3FF8740D2B8F3B8800EB8AFA /* Bundle+SPMSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F21ECCA2B8EDE0F00DCE8DD /* Bundle+SPMSupport.swift */; }; + 3FF8740E2B8F3B8800EB8AFA /* RSDParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A05E7AB2B35048A00C25E3B /* RSDParserTests.swift */; }; + 3FF8740F2B8F3B8800EB8AFA /* NonceRetrievalTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A05E7972B2FCB9A00C25E3B /* NonceRetrievalTests.swift */; }; + 3FF874102B8F3B8800EB8AFA /* FakeInfoDictionaryObjectProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46ABD0E5262EEDAB00C7FF24 /* FakeInfoDictionaryObjectProvider.swift */; }; + 3FF874112B8F3B8800EB8AFA /* HTTPRequestBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A6B4A832B26974F00802316 /* HTTPRequestBuilderTests.swift */; }; + 3FF874122B8F3B8F00EB8AFA /* WordPressComOAuthClientTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFE247A620C891D1002DF3A2 /* WordPressComOAuthClientTests.swift */; }; + 3FF874132B8F3B8F00EB8AFA /* WordPressComRestApiTests+Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A57A6802B549144008D0660 /* WordPressComRestApiTests+Error.swift */; }; + 3FF874142B8F3B8F00EB8AFA /* WordPressComRestApiTests+Locale.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73B3DAD521FBB20D00B2CF18 /* WordPressComRestApiTests+Locale.swift */; }; + 3FF874152B8F3B8F00EB8AFA /* WordPressOrgAPITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A05E79B2B2FDC6100C25E3B /* WordPressOrgAPITests.swift */; }; + 3FF874162B8F3B8F00EB8AFA /* WordPressComRestApiTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74B335D91F06F3D60053A184 /* WordPressComRestApiTests.swift */; }; + 3FF874172B8F3B8F00EB8AFA /* WordPressOrgXMLRPCApiTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74B335DB1F06F4180053A184 /* WordPressOrgXMLRPCApiTests.swift */; }; + 3FF874182B8F3B9000EB8AFA /* URLSessionHelperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A6B4A852B269D0C00802316 /* URLSessionHelperTests.swift */; }; + 3FF874192B8F3B9000EB8AFA /* WordPressAPIErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A40F6542B2A5A1A0015DA77 /* WordPressAPIErrorTests.swift */; }; + 3FF8741A2B8F3B9000EB8AFA /* WordPressOrgRestApiTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F21ECC12B8DB30300DCE8DD /* WordPressOrgRestApiTests.swift */; }; + 3FF8741B2B8F3B9000EB8AFA /* WordPressOrgXMLRPCValidatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46ABD0DF262EED3D00C7FF24 /* WordPressOrgXMLRPCValidatorTests.swift */; }; + 3FF8741C2B8F3D0B00EB8AFA /* WordPressComRestApiFailInvalidInput.json in Resources */ = {isa = PBXBuildFile; fileRef = 74B335DF1F06F6290053A184 /* WordPressComRestApiFailInvalidInput.json */; }; + 3FF8741D2B8F3D0B00EB8AFA /* WordPressComAuthenticateWithIDToken2FANeededSuccess.json in Resources */ = {isa = PBXBuildFile; fileRef = FFE247A920C891E5002DF3A2 /* WordPressComAuthenticateWithIDToken2FANeededSuccess.json */; }; + 3FF8741E2B8F3D0B00EB8AFA /* me-settings-success-.json in Resources */ = {isa = PBXBuildFile; fileRef = 7403A2F31EF06FEB00DED7DC /* me-settings-success-.json */; }; + 3FF8741F2B8F3D0B00EB8AFA /* xmlrpc-response-getpost.xml in Resources */ = {isa = PBXBuildFile; fileRef = 74B335E91F06F76B0053A184 /* xmlrpc-response-getpost.xml */; }; + 3FF874202B8F3D0B00EB8AFA /* WordPressComRestApiMultipleErrors.json in Resources */ = {isa = PBXBuildFile; fileRef = 74B335E31F06F6B30053A184 /* WordPressComRestApiMultipleErrors.json */; }; + 3FF874212B8F3D0B00EB8AFA /* WordPressComRestApiMedia.json in Resources */ = {isa = PBXBuildFile; fileRef = 74B335E51F06F6E90053A184 /* WordPressComRestApiMedia.json */; }; + 3FF874222B8F3D0B00EB8AFA /* WordPressComOAuthWrongPasswordFail.json in Resources */ = {isa = PBXBuildFile; fileRef = FFE247A820C891E5002DF3A2 /* WordPressComOAuthWrongPasswordFail.json */; }; + 3FF874232B8F3D0B00EB8AFA /* xmlrpc-bad-username-or-password-error.xml in Resources */ = {isa = PBXBuildFile; fileRef = 740B23EB1F17FB7E00067A2A /* xmlrpc-bad-username-or-password-error.xml */; }; + 3FF874242B8F3D0B00EB8AFA /* WordPressComRestApiFailThrottled.json in Resources */ = {isa = PBXBuildFile; fileRef = 93F50A3B1F226C0100B5BEBA /* WordPressComRestApiFailThrottled.json */; }; + 3FF874252B8F3D0B00EB8AFA /* xmlrpc-response-list-methods.xml in Resources */ = {isa = PBXBuildFile; fileRef = 4A05E7A92B34FC4300C25E3B /* xmlrpc-response-list-methods.xml */; }; + 3FF874262B8F3D0B00EB8AFA /* WordPressComAuthenticateWithIDTokenBearerTokenSuccess.json in Resources */ = {isa = PBXBuildFile; fileRef = FFE247AB20C891E5002DF3A2 /* WordPressComAuthenticateWithIDTokenBearerTokenSuccess.json */; }; + 3FF874272B8F3D0B00EB8AFA /* xmlrpc-response-invalid.html in Resources */ = {isa = PBXBuildFile; fileRef = 4A05E7A52B34142200C25E3B /* xmlrpc-response-invalid.html */; }; + 3FF874282B8F3D0B00EB8AFA /* WordPressComOAuthRequestChallenge.json in Resources */ = {isa = PBXBuildFile; fileRef = 264E09B42AD259FF004B5A5F /* WordPressComOAuthRequestChallenge.json */; }; + 3FF874292B8F3D0B00EB8AFA /* WordPressComRestApiFailUnauthorized.json in Resources */ = {isa = PBXBuildFile; fileRef = 74B335E71F06F7200053A184 /* WordPressComRestApiFailUnauthorized.json */; }; + 3FF8742A2B8F3D0B00EB8AFA /* WordPressComOAuthNeedsWebauthnMFA.json in Resources */ = {isa = PBXBuildFile; fileRef = 264E09B82AD2709A004B5A5F /* WordPressComOAuthNeedsWebauthnMFA.json */; }; + 3FF8742B2B8F3D0B00EB8AFA /* wp-pages.json in Resources */ = {isa = PBXBuildFile; fileRef = FFA4D4AF2423B33800BF5180 /* wp-pages.json */; }; + 3FF8742C2B8F3D0B00EB8AFA /* xmlrpc-response-mobile-plugin-redirect.html in Resources */ = {isa = PBXBuildFile; fileRef = 4A05E7A72B34EAF400C25E3B /* xmlrpc-response-mobile-plugin-redirect.html */; }; + 3FF8742D2B8F3D0B00EB8AFA /* WordPressComSocial2FACodeSuccess.json in Resources */ = {isa = PBXBuildFile; fileRef = FFE247AA20C891E5002DF3A2 /* WordPressComSocial2FACodeSuccess.json */; }; + 3FF8742E2B8F3D0C00EB8AFA /* WordPressComAuthenticateWithIDTokenExistingUserNeedsConnection.json in Resources */ = {isa = PBXBuildFile; fileRef = FFE247AE20C891E6002DF3A2 /* WordPressComAuthenticateWithIDTokenExistingUserNeedsConnection.json */; }; + 3FF8742F2B8F3D0C00EB8AFA /* wp-reusable-blocks.json in Resources */ = {isa = PBXBuildFile; fileRef = 1D969EB229D45745001FE37C /* wp-reusable-blocks.json */; }; + 3FF874302B8F3D0C00EB8AFA /* WordPressComRestApiFailRequestInvalidToken.json in Resources */ = {isa = PBXBuildFile; fileRef = 74B335E11F06F6730053A184 /* WordPressComRestApiFailRequestInvalidToken.json */; }; + 3FF874312B8F3D0C00EB8AFA /* WordPressComRestApiFailInvalidJSON.json in Resources */ = {isa = PBXBuildFile; fileRef = 74B335DD1F06F5A50053A184 /* WordPressComRestApiFailInvalidJSON.json */; }; + 3FF874322B8F3D0C00EB8AFA /* WordPressComOAuthNeeds2FAFail.json in Resources */ = {isa = PBXBuildFile; fileRef = FFE247AC20C891E5002DF3A2 /* WordPressComOAuthNeeds2FAFail.json */; }; + 3FF874332B8F3D0C00EB8AFA /* WordPressComOAuthSuccess.json in Resources */ = {isa = PBXBuildFile; fileRef = FFE247AD20C891E5002DF3A2 /* WordPressComOAuthSuccess.json */; }; + 3FF874342B8F3D0C00EB8AFA /* WordPressComOAuthAuthenticateSignature.json in Resources */ = {isa = PBXBuildFile; fileRef = 264E09B62AD25ED9004B5A5F /* WordPressComOAuthAuthenticateSignature.json */; }; + 3FF874352B8F3D0C00EB8AFA /* wp-forbidden.json in Resources */ = {isa = PBXBuildFile; fileRef = FFA4D4AE2423B33800BF5180 /* wp-forbidden.json */; }; 40247DFA2120D8E100AE1C3C /* AutomatedTransferService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40247DF92120D8E100AE1C3C /* AutomatedTransferService.swift */; }; 40247DFC2120E69600AE1C3C /* AutomatedTransferStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40247DFB2120E69600AE1C3C /* AutomatedTransferStatus.swift */; }; 404057C5221B30400060250C /* StatsSearchTermTimeIntervalData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 404057C4221B30400060250C /* StatsSearchTermTimeIntervalData.swift */; }; @@ -143,34 +204,13 @@ 465F88B1263B3E8A00F4C950 /* get_wp_v2_themes_twentytwentyone.json in Resources */ = {isa = PBXBuildFile; fileRef = 465F88B0263B3E8A00F4C950 /* get_wp_v2_themes_twentytwentyone.json */; }; 465F88B7263B455300F4C950 /* get_wp_v2_themes_twentytwentyone-no-colors.json in Resources */ = {isa = PBXBuildFile; fileRef = 465F88B6263B455300F4C950 /* get_wp_v2_themes_twentytwentyone-no-colors.json */; }; 465F88BF263B54EE00F4C950 /* ChecksumUtilTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 465F88BE263B54EE00F4C950 /* ChecksumUtilTests.swift */; }; - 46ABD0E0262EED3D00C7FF24 /* WordPressOrgXMLRPCValidatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46ABD0DF262EED3D00C7FF24 /* WordPressOrgXMLRPCValidatorTests.swift */; }; - 46ABD0E6262EEDAB00C7FF24 /* FakeInfoDictionaryObjectProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46ABD0E5262EEDAB00C7FF24 /* FakeInfoDictionaryObjectProvider.swift */; }; - 46ABD0EA262EEE0400C7FF24 /* AppTransportSecuritySettingsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46ABD0E9262EEE0400C7FF24 /* AppTransportSecuritySettingsTests.swift */; }; - 4A05E7962B2FCB6400C25E3B /* NonceRetrieval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A05E7952B2FCB6400C25E3B /* NonceRetrieval.swift */; }; - 4A05E7982B2FCB9A00C25E3B /* NonceRetrievalTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A05E7972B2FCB9A00C25E3B /* NonceRetrievalTests.swift */; }; - 4A05E79A2B2FDC3200C25E3B /* WordPressOrgRestApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A05E7992B2FDC3200C25E3B /* WordPressOrgRestApi.swift */; }; - 4A05E79C2B2FDC6100C25E3B /* WordPressOrgAPITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A05E79B2B2FDC6100C25E3B /* WordPressOrgAPITests.swift */; }; - 4A05E79E2B30F3C500C25E3B /* HTTPRequestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A05E79D2B30F3C500C25E3B /* HTTPRequestHelpers.swift */; }; - 4A05E7A62B34142200C25E3B /* xmlrpc-response-invalid.html in Resources */ = {isa = PBXBuildFile; fileRef = 4A05E7A52B34142200C25E3B /* xmlrpc-response-invalid.html */; }; - 4A05E7A82B34EAF400C25E3B /* xmlrpc-response-mobile-plugin-redirect.html in Resources */ = {isa = PBXBuildFile; fileRef = 4A05E7A72B34EAF400C25E3B /* xmlrpc-response-mobile-plugin-redirect.html */; }; - 4A05E7AA2B34FC4300C25E3B /* xmlrpc-response-list-methods.xml in Resources */ = {isa = PBXBuildFile; fileRef = 4A05E7A92B34FC4300C25E3B /* xmlrpc-response-list-methods.xml */; }; - 4A05E7AC2B35048A00C25E3B /* RSDParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A05E7AB2B35048A00C25E3B /* RSDParserTests.swift */; }; - 4A11239A2B19269A004690CF /* WordPressAPIError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A1123992B19269A004690CF /* WordPressAPIError.swift */; }; - 4A11239C2B1926B7004690CF /* HTTPRequestBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A11239B2B1926B7004690CF /* HTTPRequestBuilder.swift */; }; - 4A11239E2B1926D1004690CF /* HTTPClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A11239D2B1926D1004690CF /* HTTPClient.swift */; }; - 4A1123A02B196821004690CF /* MultipartForm.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A11239F2B196821004690CF /* MultipartForm.swift */; }; - 4A1123A22B19690C004690CF /* MultipartFormTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A1123A12B19690C004690CF /* MultipartFormTests.swift */; }; 4A1DEF44293051BC00322608 /* LoggingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A1DEF43293051BC00322608 /* LoggingTests.swift */; }; 4A1DEF46293051C600322608 /* LoggingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A1DEF45293051C600322608 /* LoggingTests.m */; }; 4A3239642B73132B00EFD2A8 /* SelfHostedPluginManagementClientTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A3239632B73132B00EFD2A8 /* SelfHostedPluginManagementClientTests.swift */; }; 4A3239662B7314E200EFD2A8 /* self-hosted-plugins-get.json in Resources */ = {isa = PBXBuildFile; fileRef = 4A3239652B7314E200EFD2A8 /* self-hosted-plugins-get.json */; }; 4A3239682B74319400EFD2A8 /* self-hosted-plugins-install.json in Resources */ = {isa = PBXBuildFile; fileRef = 4A3239672B74319400EFD2A8 /* self-hosted-plugins-install.json */; }; - 4A40F6552B2A5A1A0015DA77 /* WordPressAPIErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A40F6542B2A5A1A0015DA77 /* WordPressAPIErrorTests.swift */; }; - 4A57A6812B549144008D0660 /* WordPressComRestApiTests+Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A57A6802B549144008D0660 /* WordPressComRestApiTests+Error.swift */; }; - 4A57A6832B54A326008D0660 /* WordPressAPIError+NSErrorBrdige.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A57A6822B54A326008D0660 /* WordPressAPIError+NSErrorBrdige.swift */; }; 4A57A6872B54C68C008D0660 /* Constants.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A57A6852B54C68C008D0660 /* Constants.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4A57A6882B54C68C008D0660 /* Constants.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A57A6862B54C68C008D0660 /* Constants.m */; }; - 4A5BC1A82B59DE6600C7D037 /* Either.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A5BC1A72B59DE6600C7D037 /* Either.swift */; }; 4A68E3CD29404181004AC3DC /* RemoteBlog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A68E3CC29404181004AC3DC /* RemoteBlog.swift */; }; 4A68E3CF29404289004AC3DC /* RemoteBlogOptionsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A68E3CE29404289004AC3DC /* RemoteBlogOptionsHelper.swift */; }; 4A68E3D329406AA0004AC3DC /* RemoteMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A68E3D029406AA0004AC3DC /* RemoteMenu.swift */; }; @@ -179,15 +219,12 @@ 4A68E3DD294070A7004AC3DC /* RemoteReaderSite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A68E3DC294070A7004AC3DC /* RemoteReaderSite.swift */; }; 4A68E3DF29407100004AC3DC /* RemoteReaderTopic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A68E3DE29407100004AC3DC /* RemoteReaderTopic.swift */; }; 4A68E3E1294076C1004AC3DC /* RemoteReaderSiteInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A68E3E0294076C1004AC3DC /* RemoteReaderSiteInfo.swift */; }; - 4A6B4A842B26974F00802316 /* HTTPRequestBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A6B4A832B26974F00802316 /* HTTPRequestBuilderTests.swift */; }; - 4A6B4A862B269D0C00802316 /* URLSessionHelperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A6B4A852B269D0C00802316 /* URLSessionHelperTests.swift */; }; 4AA5A1A32AA68F6B00969464 /* MediaLibraryTestSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AA5A1A22AA68F6B00969464 /* MediaLibraryTestSupport.swift */; }; 4AA5A1A52AA695D700969464 /* LoadMediaLibraryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AA5A1A42AA695D700969464 /* LoadMediaLibraryTests.swift */; }; 4AB6A3652B83191600769115 /* ReaderPostServiceRemote+FetchEndpointTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AB6A3642B83191600769115 /* ReaderPostServiceRemote+FetchEndpointTests.swift */; }; 4AE278442B2FAF6200E4D9B1 /* HTTPProtocolHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AE278432B2FAF6200E4D9B1 /* HTTPProtocolHelpers.swift */; }; 4AE278482B2FBF1100E4D9B1 /* HTTPBodyEncodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AE278472B2FBF1100E4D9B1 /* HTTPBodyEncodingTests.swift */; }; 4AE2784A2B2FC6C600E4D9B1 /* HTTPHeaderValueParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AE278492B2FC6C600E4D9B1 /* HTTPHeaderValueParserTests.swift */; }; - 57BCD3D426209D9500292CB3 /* AppTransportSecuritySettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57BCD3D326209D9500292CB3 /* AppTransportSecuritySettings.swift */; }; 730E869F21E44EFD00753E1A /* WordPressComServiceRemote+SiteVerticals.swift in Sources */ = {isa = PBXBuildFile; fileRef = 730E869E21E44EFD00753E1A /* WordPressComServiceRemote+SiteVerticals.swift */; }; 731BA83621DECD61000FDFCD /* SiteCreationRequestEncodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 731BA83521DECD61000FDFCD /* SiteCreationRequestEncodingTests.swift */; }; 731BA83821DECD97000FDFCD /* SiteCreationResponseDecodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 731BA83721DECD97000FDFCD /* SiteCreationResponseDecodingTests.swift */; }; @@ -199,7 +236,6 @@ 73A2F38A21E7F81E00388609 /* WordPressComServiceRemote+SiteVerticalsPrompt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A2F38921E7F81E00388609 /* WordPressComServiceRemote+SiteVerticalsPrompt.swift */; }; 73A2F38D21E7FC8200388609 /* WordPressComServiceRemoteTests+SiteVerticalsPrompt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A2F38C21E7FC8200388609 /* WordPressComServiceRemoteTests+SiteVerticalsPrompt.swift */; }; 73A2F38E21E7FD9B00388609 /* site-verticals-prompt.json in Resources */ = {isa = PBXBuildFile; fileRef = 73A2F38B21E7FC2A00388609 /* site-verticals-prompt.json */; }; - 73B3DAD621FBB20D00B2CF18 /* WordPressComRestApiTests+Locale.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73B3DAD521FBB20D00B2CF18 /* WordPressComRestApiTests+Locale.swift */; }; 73D592FB21E550D300E4CF84 /* site-verticals-multiple.json in Resources */ = {isa = PBXBuildFile; fileRef = 73D592F821E550D200E4CF84 /* site-verticals-multiple.json */; }; 73D592FC21E550D300E4CF84 /* site-verticals-single.json in Resources */ = {isa = PBXBuildFile; fileRef = 73D592F921E550D300E4CF84 /* site-verticals-single.json */; }; 73D592FD21E550D300E4CF84 /* site-verticals-empty.json in Resources */ = {isa = PBXBuildFile; fileRef = 73D592FA21E550D300E4CF84 /* site-verticals-empty.json */; }; @@ -213,14 +249,12 @@ 7403A2F61EF06FEB00DED7DC /* me-settings-change-aboutme-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 7403A2E91EF06FEB00DED7DC /* me-settings-change-aboutme-success.json */; }; 7403A2F71EF06FEB00DED7DC /* me-settings-change-display-name-bad-json-failure.json in Resources */ = {isa = PBXBuildFile; fileRef = 7403A2EA1EF06FEB00DED7DC /* me-settings-change-display-name-bad-json-failure.json */; }; 7403A2F81EF06FEB00DED7DC /* me-settings-change-display-name-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 7403A2EB1EF06FEB00DED7DC /* me-settings-change-display-name-success.json */; }; - 7403A2F91EF06FEB00DED7DC /* me-settings-change-email-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 7403A2EC1EF06FEB00DED7DC /* me-settings-change-email-success.json */; }; 7403A2FA1EF06FEB00DED7DC /* me-settings-change-firstname-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 7403A2ED1EF06FEB00DED7DC /* me-settings-change-firstname-success.json */; }; 7403A2FB1EF06FEB00DED7DC /* me-settings-change-invalid-input-failure.json in Resources */ = {isa = PBXBuildFile; fileRef = 7403A2EE1EF06FEB00DED7DC /* me-settings-change-invalid-input-failure.json */; }; 7403A2FC1EF06FEB00DED7DC /* me-settings-change-lastname-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 7403A2EF1EF06FEB00DED7DC /* me-settings-change-lastname-success.json */; }; 7403A2FD1EF06FEB00DED7DC /* me-settings-change-primary-site-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 7403A2F01EF06FEB00DED7DC /* me-settings-change-primary-site-success.json */; }; 7403A2FE1EF06FEB00DED7DC /* me-settings-change-web-address-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 7403A2F11EF06FEB00DED7DC /* me-settings-change-web-address-success.json */; }; 7403A2FF1EF06FEB00DED7DC /* me-settings-revert-email-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 7403A2F21EF06FEB00DED7DC /* me-settings-revert-email-success.json */; }; - 7403A3001EF06FEB00DED7DC /* me-settings-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 7403A2F31EF06FEB00DED7DC /* me-settings-success.json */; }; 7403A3021EF0726E00DED7DC /* AccountSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7403A3011EF0726E00DED7DC /* AccountSettings.swift */; }; 740B23B71F17EC7300067A2A /* PostServiceRemote.h in Headers */ = {isa = PBXBuildFile; fileRef = 740B23B21F17EC7300067A2A /* PostServiceRemote.h */; settings = {ATTRIBUTES = (Public, ); }; }; 740B23B81F17EC7300067A2A /* PostServiceRemoteREST.h in Headers */ = {isa = PBXBuildFile; fileRef = 740B23B31F17EC7300067A2A /* PostServiceRemoteREST.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -245,7 +279,6 @@ 740B23E81F17FB4200067A2A /* xmlrpc-wp-getpost-bad-xml-failure.xml in Resources */ = {isa = PBXBuildFile; fileRef = 740B23DE1F17FB4200067A2A /* xmlrpc-wp-getpost-bad-xml-failure.xml */; }; 740B23E91F17FB4200067A2A /* xmlrpc-wp-getpost-invalid-id-failure.xml in Resources */ = {isa = PBXBuildFile; fileRef = 740B23DF1F17FB4200067A2A /* xmlrpc-wp-getpost-invalid-id-failure.xml */; }; 740B23EA1F17FB4200067A2A /* xmlrpc-wp-getpost-success.xml in Resources */ = {isa = PBXBuildFile; fileRef = 740B23E01F17FB4200067A2A /* xmlrpc-wp-getpost-success.xml */; }; - 740B23ED1F17FB7E00067A2A /* xmlrpc-bad-username-password-error.xml in Resources */ = {isa = PBXBuildFile; fileRef = 740B23EB1F17FB7E00067A2A /* xmlrpc-bad-username-password-error.xml */; }; 740B23EE1F17FB7E00067A2A /* xmlrpc-malformed-request-xml-error.xml in Resources */ = {isa = PBXBuildFile; fileRef = 740B23EC1F17FB7E00067A2A /* xmlrpc-malformed-request-xml-error.xml */; }; 74155E251EF87DDF00A06AEA /* ServiceRemoteRESTTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 74155E241EF87DDF00A06AEA /* ServiceRemoteRESTTests.m */; }; 742362D61F10250600BD0A7F /* MenusServiceRemote.h in Headers */ = {isa = PBXBuildFile; fileRef = 742362D41F10250600BD0A7F /* MenusServiceRemote.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -288,15 +321,6 @@ 74A923B21F2BE2DF00EC8F92 /* RESTTestable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74A923B11F2BE2DF00EC8F92 /* RESTTestable.swift */; }; 74B040721EF8B366002C6258 /* rest-site-settings.json in Resources */ = {isa = PBXBuildFile; fileRef = 74B040711EF8B366002C6258 /* rest-site-settings.json */; }; 74B335D81F06F1CA0053A184 /* MockWordPressComRestApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74B335D71F06F1CA0053A184 /* MockWordPressComRestApi.swift */; }; - 74B335DA1F06F3D60053A184 /* WordPressComRestApiTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74B335D91F06F3D60053A184 /* WordPressComRestApiTests.swift */; }; - 74B335DC1F06F4180053A184 /* WordPressOrgXMLRPCApiTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74B335DB1F06F4180053A184 /* WordPressOrgXMLRPCApiTests.swift */; }; - 74B335DE1F06F5A50053A184 /* WordPressComRestApiFailInvalidJSON.json in Resources */ = {isa = PBXBuildFile; fileRef = 74B335DD1F06F5A50053A184 /* WordPressComRestApiFailInvalidJSON.json */; }; - 74B335E01F06F6290053A184 /* WordPressComRestApiFailInvalidInput.json in Resources */ = {isa = PBXBuildFile; fileRef = 74B335DF1F06F6290053A184 /* WordPressComRestApiFailInvalidInput.json */; }; - 74B335E21F06F6730053A184 /* WordPressComRestApiFailRequestInvalidToken.json in Resources */ = {isa = PBXBuildFile; fileRef = 74B335E11F06F6730053A184 /* WordPressComRestApiFailRequestInvalidToken.json */; }; - 74B335E41F06F6B30053A184 /* WordPressComRestApiMultipleErrors.json in Resources */ = {isa = PBXBuildFile; fileRef = 74B335E31F06F6B30053A184 /* WordPressComRestApiMultipleErrors.json */; }; - 74B335E61F06F6E90053A184 /* WordPressComRestApiMedia.json in Resources */ = {isa = PBXBuildFile; fileRef = 74B335E51F06F6E90053A184 /* WordPressComRestApiMedia.json */; }; - 74B335E81F06F7200053A184 /* WordPressComRestApiFailUnauthorized.json in Resources */ = {isa = PBXBuildFile; fileRef = 74B335E71F06F7200053A184 /* WordPressComRestApiFailUnauthorized.json */; }; - 74B335EA1F06F76B0053A184 /* xmlrpc-response-getpost.xml in Resources */ = {isa = PBXBuildFile; fileRef = 74B335E91F06F76B0053A184 /* xmlrpc-response-getpost.xml */; }; 74B5F0D71EF8299B00B411E7 /* BlogServiceRemoteREST.h in Headers */ = {isa = PBXBuildFile; fileRef = 74B5F0D31EF8299B00B411E7 /* BlogServiceRemoteREST.h */; settings = {ATTRIBUTES = (Public, ); }; }; 74B5F0D81EF8299B00B411E7 /* BlogServiceRemoteREST.m in Sources */ = {isa = PBXBuildFile; fileRef = 74B5F0D41EF8299B00B411E7 /* BlogServiceRemoteREST.m */; }; 74B5F0D91EF8299B00B411E7 /* BlogServiceRemoteXMLRPC.h in Headers */ = {isa = PBXBuildFile; fileRef = 74B5F0D51EF8299B00B411E7 /* BlogServiceRemoteXMLRPC.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -478,21 +502,12 @@ 93BD27701EE737A8002BB00B /* ServiceRemoteWordPressComREST.m in Sources */ = {isa = PBXBuildFile; fileRef = 93BD276C1EE737A8002BB00B /* ServiceRemoteWordPressComREST.m */; }; 93BD27711EE737A8002BB00B /* ServiceRemoteWordPressXMLRPC.h in Headers */ = {isa = PBXBuildFile; fileRef = 93BD276D1EE737A8002BB00B /* ServiceRemoteWordPressXMLRPC.h */; settings = {ATTRIBUTES = (Public, ); }; }; 93BD27721EE737A9002BB00B /* ServiceRemoteWordPressXMLRPC.m in Sources */ = {isa = PBXBuildFile; fileRef = 93BD276E1EE737A8002BB00B /* ServiceRemoteWordPressXMLRPC.m */; }; - 93BD277C1EE73944002BB00B /* HTTPAuthenticationAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93BD27741EE73944002BB00B /* HTTPAuthenticationAlertController.swift */; }; - 93BD277D1EE73944002BB00B /* NSDate+WordPressJSON.h in Headers */ = {isa = PBXBuildFile; fileRef = 93BD27751EE73944002BB00B /* NSDate+WordPressJSON.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 93BD277E1EE73944002BB00B /* NSDate+WordPressJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 93BD27761EE73944002BB00B /* NSDate+WordPressJSON.m */; }; - 93BD277F1EE73944002BB00B /* WordPressComOAuthClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93BD27771EE73944002BB00B /* WordPressComOAuthClient.swift */; }; - 93BD27801EE73944002BB00B /* WordPressComRestApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93BD27781EE73944002BB00B /* WordPressComRestApi.swift */; }; - 93BD27811EE73944002BB00B /* WordPressOrgXMLRPCApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93BD27791EE73944002BB00B /* WordPressOrgXMLRPCApi.swift */; }; - 93BD27821EE73944002BB00B /* WordPressOrgXMLRPCValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93BD277A1EE73944002BB00B /* WordPressOrgXMLRPCValidator.swift */; }; - 93BD27831EE73944002BB00B /* WordPressRSDParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93BD277B1EE73944002BB00B /* WordPressRSDParser.swift */; }; 93C674EE1EE834B700BFAF05 /* RemoteBlogSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93C674ED1EE834B700BFAF05 /* RemoteBlogSettings.swift */; }; 93C674F11EE8351E00BFAF05 /* NSMutableDictionary+Helpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 93C674EF1EE8351E00BFAF05 /* NSMutableDictionary+Helpers.h */; }; 93C674F21EE8351E00BFAF05 /* NSMutableDictionary+Helpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 93C674F01EE8351E00BFAF05 /* NSMutableDictionary+Helpers.m */; }; 93F50A371F226B9300B5BEBA /* WordPressComServiceRemote.h in Headers */ = {isa = PBXBuildFile; fileRef = 93F50A351F226B9300B5BEBA /* WordPressComServiceRemote.h */; settings = {ATTRIBUTES = (Public, ); }; }; 93F50A381F226B9300B5BEBA /* WordPressComServiceRemote.m in Sources */ = {isa = PBXBuildFile; fileRef = 93F50A361F226B9300B5BEBA /* WordPressComServiceRemote.m */; }; 93F50A3A1F226BB600B5BEBA /* WordPressComServiceRemoteRestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93F50A391F226BB600B5BEBA /* WordPressComServiceRemoteRestTests.swift */; }; - 93F50A3C1F226C0100B5BEBA /* WordPressComRestApiFailThrottled.json in Resources */ = {isa = PBXBuildFile; fileRef = 93F50A3B1F226C0100B5BEBA /* WordPressComRestApiFailThrottled.json */; }; 93F50A3F1F227C8900B5BEBA /* UsersServiceRemoteXMLRPC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93F50A3E1F227C8900B5BEBA /* UsersServiceRemoteXMLRPC.swift */; }; 93F50A411F227C9700B5BEBA /* RemoteProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93F50A401F227C9700B5BEBA /* RemoteProfile.swift */; }; 93F50A441F227CFB00B5BEBA /* UsersServiceRemoteXMLRPCTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93F50A431F227CFB00B5BEBA /* UsersServiceRemoteXMLRPCTests.swift */; }; @@ -618,7 +633,6 @@ E1E89C6A1FD6BDB1006E7A33 /* PluginDirectoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1E89C691FD6BDB1006E7A33 /* PluginDirectoryTests.swift */; }; E1EF5D5D1F9F329900B6D53E /* SitePluginCapabilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1EF5D5C1F9F329900B6D53E /* SitePluginCapabilities.swift */; }; E61A51A621B172A900A5F902 /* RemoteWpcomPlan.swift in Sources */ = {isa = PBXBuildFile; fileRef = E61A51A521B172A900A5F902 /* RemoteWpcomPlan.swift */; }; - E632D7781F6E047400297F6D /* SocialLogin2FANonceInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = E632D7771F6E047400297F6D /* SocialLogin2FANonceInfo.swift */; }; E670CD722277A85000E75735 /* plans-me-sites-success.json in Resources */ = {isa = PBXBuildFile; fileRef = E670CD712277A85000E75735 /* plans-me-sites-success.json */; }; E689431E21B0A1A800C5E4A7 /* plans-mobile-success.json in Resources */ = {isa = PBXBuildFile; fileRef = E689431D21B0A1A800C5E4A7 /* plans-mobile-success.json */; }; E6B0460925E5B4DD00DF6F4F /* RemoteInviteLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6B0460825E5B4DD00DF6F4F /* RemoteInviteLink.swift */; }; @@ -700,18 +714,7 @@ FEFFD99726C158F400F34231 /* share-app-content-success.json in Resources */ = {isa = PBXBuildFile; fileRef = FEFFD99626C158F400F34231 /* share-app-content-success.json */; }; FEFFD99B26C1598F00F34231 /* ShareAppContentServiceRemoteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEFFD99A26C1598F00F34231 /* ShareAppContentServiceRemoteTests.swift */; }; FF20AD2220B8471A00082398 /* WordPressKit.podspec in Resources */ = {isa = PBXBuildFile; fileRef = FF20AD2120B8471A00082398 /* WordPressKit.podspec */; }; - FFA4D4AA2423B10A00BF5180 /* WordPressOrgRestApiTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFA4D4A82423B10A00BF5180 /* WordPressOrgRestApiTests.swift */; }; FFA4D4AD2423B1FE00BF5180 /* wp-admin-post-new.html in Resources */ = {isa = PBXBuildFile; fileRef = FFA4D4AC2423B1FE00BF5180 /* wp-admin-post-new.html */; }; - FFA4D4B02423B33800BF5180 /* wp-forbidden.json in Resources */ = {isa = PBXBuildFile; fileRef = FFA4D4AE2423B33800BF5180 /* wp-forbidden.json */; }; - FFA4D4B12423B33800BF5180 /* wp-pages.json in Resources */ = {isa = PBXBuildFile; fileRef = FFA4D4AF2423B33800BF5180 /* wp-pages.json */; }; - FFE247A720C891D1002DF3A2 /* WordPressComOAuthClientTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFE247A620C891D1002DF3A2 /* WordPressComOAuthClientTests.swift */; }; - FFE247AF20C891E6002DF3A2 /* WordPressComOAuthWrongPasswordFail.json in Resources */ = {isa = PBXBuildFile; fileRef = FFE247A820C891E5002DF3A2 /* WordPressComOAuthWrongPasswordFail.json */; }; - FFE247B020C891E6002DF3A2 /* WordPressComAuthenticateWithIDToken2FANeededSuccess.json in Resources */ = {isa = PBXBuildFile; fileRef = FFE247A920C891E5002DF3A2 /* WordPressComAuthenticateWithIDToken2FANeededSuccess.json */; }; - FFE247B120C891E6002DF3A2 /* WordPressComSocial2FACodeSuccess.json in Resources */ = {isa = PBXBuildFile; fileRef = FFE247AA20C891E5002DF3A2 /* WordPressComSocial2FACodeSuccess.json */; }; - FFE247B220C891E6002DF3A2 /* WordPressComAuthenticateWithIDTokenBearerTokenSuccess.json in Resources */ = {isa = PBXBuildFile; fileRef = FFE247AB20C891E5002DF3A2 /* WordPressComAuthenticateWithIDTokenBearerTokenSuccess.json */; }; - FFE247B320C891E6002DF3A2 /* WordPressComOAuthNeeds2FAFail.json in Resources */ = {isa = PBXBuildFile; fileRef = FFE247AC20C891E5002DF3A2 /* WordPressComOAuthNeeds2FAFail.json */; }; - FFE247B420C891E6002DF3A2 /* WordPressComOAuthSuccess.json in Resources */ = {isa = PBXBuildFile; fileRef = FFE247AD20C891E5002DF3A2 /* WordPressComOAuthSuccess.json */; }; - FFE247B520C891E6002DF3A2 /* WordPressComAuthenticateWithIDTokenExistingUserNeedsConnection.json in Resources */ = {isa = PBXBuildFile; fileRef = FFE247AE20C891E6002DF3A2 /* WordPressComAuthenticateWithIDTokenExistingUserNeedsConnection.json */; }; FFE247BD20C9C88B002DF3A2 /* empty.json in Resources */ = {isa = PBXBuildFile; fileRef = FFE247BC20C9C88B002DF3A2 /* empty.json */; }; FFE247C220C9D749002DF3A2 /* reader-site-search-no-blog-or-feed-id.json in Resources */ = {isa = PBXBuildFile; fileRef = FFE247C020C9D748002DF3A2 /* reader-site-search-no-blog-or-feed-id.json */; }; FFE247C320C9D749002DF3A2 /* reader-site-search-blog-id-fallback.json in Resources */ = {isa = PBXBuildFile; fileRef = FFE247C120C9D749002DF3A2 /* reader-site-search-blog-id-fallback.json */; }; @@ -741,6 +744,7 @@ 0CB190642A2A7569004D3E80 /* BlazeCampaignsSearchResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlazeCampaignsSearchResponse.swift; sourceTree = ""; }; 0CED1FE72B617CF300E6DD52 /* AtomicSiteServiceRemote.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AtomicSiteServiceRemote.swift; sourceTree = ""; }; 0CED1FEA2B617D7D00E6DD52 /* AtomicLogs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AtomicLogs.swift; sourceTree = ""; }; + 158D49DD54ED25665161060B /* Pods_CoreAPITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CoreAPITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1769DEA924729AFF00F42EFC /* HomepageSettingsServiceRemote.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomepageSettingsServiceRemote.swift; sourceTree = ""; }; 17BF9A6B20C7DC3300BF57D2 /* reader-site-search-success.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "reader-site-search-success.json"; sourceTree = ""; }; 17BF9A6D20C7E18100BF57D2 /* reader-site-search-success-hasmore.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "reader-site-search-success-hasmore.json"; sourceTree = ""; }; @@ -760,6 +764,7 @@ 1DF972BD29B107E7007A72BC /* videopress-public-video.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "videopress-public-video.json"; sourceTree = ""; }; 1DF972BE29B107E7007A72BC /* videopress-site-default-video.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "videopress-site-default-video.json"; sourceTree = ""; }; 24ADA24D24F9B32D001B5DAE /* FeatureFlagSerializationTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeatureFlagSerializationTest.swift; sourceTree = ""; }; + 2584641ED9CC84CD2D92D33C /* Pods-CoreAPITests.release-alpha.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CoreAPITests.release-alpha.xcconfig"; path = "Pods/Target Support Files/Pods-CoreAPITests/Pods-CoreAPITests.release-alpha.xcconfig"; sourceTree = ""; }; 264E09B22AD0B3BB004B5A5F /* WebauthChallengeInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebauthChallengeInfo.swift; sourceTree = ""; }; 264E09B42AD259FF004B5A5F /* WordPressComOAuthRequestChallenge.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = WordPressComOAuthRequestChallenge.json; sourceTree = ""; }; 264E09B62AD25ED9004B5A5F /* WordPressComOAuthAuthenticateSignature.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = WordPressComOAuthAuthenticateSignature.json; sourceTree = ""; }; @@ -782,12 +787,24 @@ 32FC1D26255C91ED00CD0A7B /* JetpackScan.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JetpackScan.swift; sourceTree = ""; }; 32FC1D27255C91ED00CD0A7B /* JetpackScanServiceRemote.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JetpackScanServiceRemote.swift; sourceTree = ""; }; 32FC20CD255DCC6100CD0A7B /* JetpackScanThreat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JetpackScanThreat.swift; sourceTree = ""; }; + 3CAFAE2EC1B18EAF8B92FC96 /* Pods-CoreAPITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CoreAPITests.release.xcconfig"; path = "Pods/Target Support Files/Pods-CoreAPITests/Pods-CoreAPITests.release.xcconfig"; sourceTree = ""; }; + 3F21EC6E2B8D8F3B00DCE8DD /* StringEncoding+IANA.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "StringEncoding+IANA.swift"; sourceTree = ""; }; + 3F21EC702B8D8F7800DCE8DD /* Either.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Either.swift; sourceTree = ""; }; + 3F21EC7C2B8D927000DCE8DD /* WordPressComRestApiErrorDomain.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WordPressComRestApiErrorDomain.swift; sourceTree = ""; }; + 3F21ECBD2B8DAAC500DCE8DD /* me-settings-success.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "me-settings-success.json"; sourceTree = ""; }; + 3F21ECC12B8DB30300DCE8DD /* WordPressOrgRestApiTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WordPressOrgRestApiTests.swift; sourceTree = ""; }; + 3F21ECC42B8DCDCF00DCE8DD /* xmlrpc-bad-username-password-error.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = "xmlrpc-bad-username-password-error.xml"; path = "Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/xmlrpc-bad-username-password-error.xml"; sourceTree = SOURCE_ROOT; }; + 3F21ECC62B8DCE4500DCE8DD /* wp-com-rest-api-fail-throttled.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "wp-com-rest-api-fail-throttled.json"; path = "Tests/WordPressKitTests/WordPressAndJetpackTests/Mock Data/wp-com-rest-api-fail-throttled.json"; sourceTree = SOURCE_ROOT; }; + 3F21ECCA2B8EDE0F00DCE8DD /* Bundle+SPMSupport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bundle+SPMSupport.swift"; sourceTree = ""; }; 3F3195AC266FF94B00397EE7 /* ZendeskMetadata.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZendeskMetadata.swift; sourceTree = ""; }; 3F391E192B50F3EB007975C4 /* Result+Callback.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Result+Callback.swift"; sourceTree = ""; }; 3F3C9E9B289A3E31009A1357 /* TestCollector+Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TestCollector+Constants.swift"; sourceTree = ""; }; 3F758FD224F6C68200BBA2FC /* AnnouncementServiceRemote.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnnouncementServiceRemote.swift; sourceTree = ""; }; 3F8308A629EE683500354497 /* ActivityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityTests.swift; sourceTree = ""; }; 3FB8642D288813E9003A86BE /* UnitTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = UnitTests.xctestplan; sourceTree = ""; }; + 3FBA9CD51186225778FB365E /* Pods_CoreAPI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CoreAPI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3FF873F02B8F2C7100EB8AFA /* me-settings-change-email-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "me-settings-change-email-success.json"; sourceTree = ""; }; + 3FF873F22B8F2F1800EB8AFA /* NSDate+RFC3339.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSDate+RFC3339.swift"; sourceTree = ""; }; 40247DF92120D8E100AE1C3C /* AutomatedTransferService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutomatedTransferService.swift; sourceTree = ""; }; 40247DFB2120E69600AE1C3C /* AutomatedTransferStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutomatedTransferStatus.swift; sourceTree = ""; }; 404057C4221B30400060250C /* StatsSearchTermTimeIntervalData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatsSearchTermTimeIntervalData.swift; sourceTree = ""; }; @@ -867,6 +884,7 @@ 46ABD0DF262EED3D00C7FF24 /* WordPressOrgXMLRPCValidatorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WordPressOrgXMLRPCValidatorTests.swift; sourceTree = ""; }; 46ABD0E5262EEDAB00C7FF24 /* FakeInfoDictionaryObjectProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FakeInfoDictionaryObjectProvider.swift; sourceTree = ""; }; 46ABD0E9262EEE0400C7FF24 /* AppTransportSecuritySettingsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppTransportSecuritySettingsTests.swift; sourceTree = ""; }; + 498F613708CDBD562BFA0ADB /* Pods-CoreAPITests.release-internal.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CoreAPITests.release-internal.xcconfig"; path = "Pods/Target Support Files/Pods-CoreAPITests/Pods-CoreAPITests.release-internal.xcconfig"; sourceTree = ""; }; 4A05E7952B2FCB6400C25E3B /* NonceRetrieval.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NonceRetrieval.swift; sourceTree = ""; }; 4A05E7972B2FCB9A00C25E3B /* NonceRetrievalTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NonceRetrievalTests.swift; sourceTree = ""; }; 4A05E7992B2FDC3200C25E3B /* WordPressOrgRestApi.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WordPressOrgRestApi.swift; sourceTree = ""; }; @@ -891,7 +909,6 @@ 4A57A6822B54A326008D0660 /* WordPressAPIError+NSErrorBrdige.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WordPressAPIError+NSErrorBrdige.swift"; sourceTree = ""; }; 4A57A6852B54C68C008D0660 /* Constants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Constants.h; sourceTree = ""; }; 4A57A6862B54C68C008D0660 /* Constants.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Constants.m; sourceTree = ""; }; - 4A5BC1A72B59DE6600C7D037 /* Either.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Either.swift; sourceTree = ""; }; 4A68E3CC29404181004AC3DC /* RemoteBlog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RemoteBlog.swift; sourceTree = ""; }; 4A68E3CE29404289004AC3DC /* RemoteBlogOptionsHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RemoteBlogOptionsHelper.swift; sourceTree = ""; }; 4A68E3D029406AA0004AC3DC /* RemoteMenu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RemoteMenu.swift; sourceTree = ""; }; @@ -931,19 +948,19 @@ 73D5930421E5541200E4CF84 /* WordPressComServiceRemoteTests+SiteVerticals.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "WordPressComServiceRemoteTests+SiteVerticals.swift"; sourceTree = ""; }; 7403A2E31EF06ED500DED7DC /* AccountSettingsRemote.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountSettingsRemote.swift; sourceTree = ""; }; 7403A2E51EF06F7000DED7DC /* AccountSettingsRemoteTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountSettingsRemoteTests.swift; sourceTree = ""; }; - 7403A2E71EF06FEB00DED7DC /* me-settings-auth-failure.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-auth-failure.json"; path = "WordPressKitTests/me-settings-auth-failure.json"; sourceTree = SOURCE_ROOT; }; - 7403A2E81EF06FEB00DED7DC /* me-settings-bad-json-failure.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-bad-json-failure.json"; path = "WordPressKitTests/me-settings-bad-json-failure.json"; sourceTree = SOURCE_ROOT; }; - 7403A2E91EF06FEB00DED7DC /* me-settings-change-aboutme-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-change-aboutme-success.json"; path = "WordPressKitTests/me-settings-change-aboutme-success.json"; sourceTree = SOURCE_ROOT; }; - 7403A2EA1EF06FEB00DED7DC /* me-settings-change-display-name-bad-json-failure.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-change-display-name-bad-json-failure.json"; path = "WordPressKitTests/me-settings-change-display-name-bad-json-failure.json"; sourceTree = SOURCE_ROOT; }; - 7403A2EB1EF06FEB00DED7DC /* me-settings-change-display-name-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-change-display-name-success.json"; path = "WordPressKitTests/me-settings-change-display-name-success.json"; sourceTree = SOURCE_ROOT; }; - 7403A2EC1EF06FEB00DED7DC /* me-settings-change-email-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-change-email-success.json"; path = "WordPressKitTests/me-settings-change-email-success.json"; sourceTree = SOURCE_ROOT; }; - 7403A2ED1EF06FEB00DED7DC /* me-settings-change-firstname-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-change-firstname-success.json"; path = "WordPressKitTests/me-settings-change-firstname-success.json"; sourceTree = SOURCE_ROOT; }; - 7403A2EE1EF06FEB00DED7DC /* me-settings-change-invalid-input-failure.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-change-invalid-input-failure.json"; path = "WordPressKitTests/me-settings-change-invalid-input-failure.json"; sourceTree = SOURCE_ROOT; }; - 7403A2EF1EF06FEB00DED7DC /* me-settings-change-lastname-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-change-lastname-success.json"; path = "WordPressKitTests/me-settings-change-lastname-success.json"; sourceTree = SOURCE_ROOT; }; - 7403A2F01EF06FEB00DED7DC /* me-settings-change-primary-site-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-change-primary-site-success.json"; path = "WordPressKitTests/me-settings-change-primary-site-success.json"; sourceTree = SOURCE_ROOT; }; - 7403A2F11EF06FEB00DED7DC /* me-settings-change-web-address-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-change-web-address-success.json"; path = "WordPressKitTests/me-settings-change-web-address-success.json"; sourceTree = SOURCE_ROOT; }; - 7403A2F21EF06FEB00DED7DC /* me-settings-revert-email-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-revert-email-success.json"; path = "WordPressKitTests/me-settings-revert-email-success.json"; sourceTree = SOURCE_ROOT; }; - 7403A2F31EF06FEB00DED7DC /* me-settings-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-success.json"; path = "WordPressKitTests/me-settings-success.json"; sourceTree = SOURCE_ROOT; }; + 7403A2E71EF06FEB00DED7DC /* me-settings-auth-failure.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-auth-failure.json"; path = "Tests/WordPressKitTests/me-settings-auth-failure.json"; sourceTree = SOURCE_ROOT; }; + 7403A2E81EF06FEB00DED7DC /* me-settings-bad-json-failure.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-bad-json-failure.json"; path = "Tests/WordPressKitTests/me-settings-bad-json-failure.json"; sourceTree = SOURCE_ROOT; }; + 7403A2E91EF06FEB00DED7DC /* me-settings-change-aboutme-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-change-aboutme-success.json"; path = "Tests/WordPressKitTests/me-settings-change-aboutme-success.json"; sourceTree = SOURCE_ROOT; }; + 7403A2EA1EF06FEB00DED7DC /* me-settings-change-display-name-bad-json-failure.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-change-display-name-bad-json-failure.json"; path = "Tests/WordPressKitTests/me-settings-change-display-name-bad-json-failure.json"; sourceTree = SOURCE_ROOT; }; + 7403A2EB1EF06FEB00DED7DC /* me-settings-change-display-name-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-change-display-name-success.json"; path = "Tests/WordPressKitTests/me-settings-change-display-name-success.json"; sourceTree = SOURCE_ROOT; }; + 7403A2EC1EF06FEB00DED7DC /* me-settings-change-display-name-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-change-display-name-success.json"; path = "Tests/WordPressKitTests/me-settings-change-display-name-success.json"; sourceTree = SOURCE_ROOT; }; + 7403A2ED1EF06FEB00DED7DC /* me-settings-change-firstname-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-change-firstname-success.json"; path = "Tests/WordPressKitTests/me-settings-change-firstname-success.json"; sourceTree = SOURCE_ROOT; }; + 7403A2EE1EF06FEB00DED7DC /* me-settings-change-invalid-input-failure.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-change-invalid-input-failure.json"; path = "Tests/WordPressKitTests/me-settings-change-invalid-input-failure.json"; sourceTree = SOURCE_ROOT; }; + 7403A2EF1EF06FEB00DED7DC /* me-settings-change-lastname-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-change-lastname-success.json"; path = "Tests/WordPressKitTests/me-settings-change-lastname-success.json"; sourceTree = SOURCE_ROOT; }; + 7403A2F01EF06FEB00DED7DC /* me-settings-change-primary-site-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-change-primary-site-success.json"; path = "Tests/WordPressKitTests/me-settings-change-primary-site-success.json"; sourceTree = SOURCE_ROOT; }; + 7403A2F11EF06FEB00DED7DC /* me-settings-change-web-address-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-change-web-address-success.json"; path = "Tests/WordPressKitTests/me-settings-change-web-address-success.json"; sourceTree = SOURCE_ROOT; }; + 7403A2F21EF06FEB00DED7DC /* me-settings-revert-email-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-revert-email-success.json"; path = "Tests/WordPressKitTests/me-settings-revert-email-success.json"; sourceTree = SOURCE_ROOT; }; + 7403A2F31EF06FEB00DED7DC /* me-settings-success-.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "me-settings-success-.json"; path = "Tests/CoreAPITests/Stubs/JSON/me-settings-success-.json"; sourceTree = SOURCE_ROOT; }; 7403A3011EF0726E00DED7DC /* AccountSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountSettings.swift; sourceTree = ""; }; 740B23B21F17EC7300067A2A /* PostServiceRemote.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PostServiceRemote.h; sourceTree = ""; }; 740B23B31F17EC7300067A2A /* PostServiceRemoteREST.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PostServiceRemoteREST.h; sourceTree = ""; }; @@ -968,7 +985,7 @@ 740B23DE1F17FB4200067A2A /* xmlrpc-wp-getpost-bad-xml-failure.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "xmlrpc-wp-getpost-bad-xml-failure.xml"; sourceTree = ""; }; 740B23DF1F17FB4200067A2A /* xmlrpc-wp-getpost-invalid-id-failure.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "xmlrpc-wp-getpost-invalid-id-failure.xml"; sourceTree = ""; }; 740B23E01F17FB4200067A2A /* xmlrpc-wp-getpost-success.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "xmlrpc-wp-getpost-success.xml"; sourceTree = ""; }; - 740B23EB1F17FB7E00067A2A /* xmlrpc-bad-username-password-error.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "xmlrpc-bad-username-password-error.xml"; sourceTree = ""; }; + 740B23EB1F17FB7E00067A2A /* xmlrpc-bad-username-or-password-error.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "xmlrpc-bad-username-or-password-error.xml"; sourceTree = ""; }; 740B23EC1F17FB7E00067A2A /* xmlrpc-malformed-request-xml-error.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "xmlrpc-malformed-request-xml-error.xml"; sourceTree = ""; }; 74155E241EF87DDF00A06AEA /* ServiceRemoteRESTTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ServiceRemoteRESTTests.m; sourceTree = ""; }; 742362D41F10250600BD0A7F /* MenusServiceRemote.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MenusServiceRemote.h; sourceTree = ""; }; @@ -1148,6 +1165,7 @@ 8BFB4E6525B07905004D026E /* jetpack-capabilities-34197361-success.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "jetpack-capabilities-34197361-success.json"; sourceTree = ""; }; 8BFD71FD25CACCBF0094534E /* backup-get-backup-status-complete-without-download-id-success.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "backup-get-backup-status-complete-without-download-id-success.json"; sourceTree = ""; }; 8C5734F825681A6A005E61EE /* Enum+UnknownCaseRepresentable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Enum+UnknownCaseRepresentable.swift"; sourceTree = ""; }; + 8EFF804105F3799CCB95C197 /* Pods-CoreAPI.release-internal.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CoreAPI.release-internal.xcconfig"; path = "Pods/Target Support Files/Pods-CoreAPI/Pods-CoreAPI.release-internal.xcconfig"; sourceTree = ""; }; 9309994B1F1657C600F006A1 /* ThemeServiceRemote.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThemeServiceRemote.h; sourceTree = ""; }; 9309994C1F1657C600F006A1 /* ThemeServiceRemote.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ThemeServiceRemote.m; sourceTree = ""; }; 930999511F1658F800F006A1 /* ThemeServiceRemoteTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ThemeServiceRemoteTests.m; sourceTree = ""; }; @@ -1206,8 +1224,6 @@ 93BD276D1EE737A8002BB00B /* ServiceRemoteWordPressXMLRPC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServiceRemoteWordPressXMLRPC.h; sourceTree = ""; }; 93BD276E1EE737A8002BB00B /* ServiceRemoteWordPressXMLRPC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ServiceRemoteWordPressXMLRPC.m; sourceTree = ""; }; 93BD27741EE73944002BB00B /* HTTPAuthenticationAlertController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTTPAuthenticationAlertController.swift; sourceTree = ""; }; - 93BD27751EE73944002BB00B /* NSDate+WordPressJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDate+WordPressJSON.h"; sourceTree = ""; }; - 93BD27761EE73944002BB00B /* NSDate+WordPressJSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDate+WordPressJSON.m"; sourceTree = ""; }; 93BD27771EE73944002BB00B /* WordPressComOAuthClient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WordPressComOAuthClient.swift; sourceTree = ""; }; 93BD27781EE73944002BB00B /* WordPressComRestApi.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WordPressComRestApi.swift; sourceTree = ""; }; 93BD27791EE73944002BB00B /* WordPressOrgXMLRPCApi.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WordPressOrgXMLRPCApi.swift; sourceTree = ""; }; @@ -1271,6 +1287,7 @@ 9F3E0BAD20873835009CB5BA /* ReaderTopicServiceRemoteTest+Subscriptions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "ReaderTopicServiceRemoteTest+Subscriptions.swift"; sourceTree = ""; }; 9F4E51FF2088E38200424676 /* ObjectValidation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ObjectValidation.swift; sourceTree = ""; }; 9FCDD09620A5EF75004F0BF7 /* ReaderTopicServiceError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReaderTopicServiceError.swift; sourceTree = ""; }; + A9410AE028C24F85F4B28388 /* Pods-CoreAPI.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CoreAPI.debug.xcconfig"; path = "Pods/Target Support Files/Pods-CoreAPI/Pods-CoreAPI.debug.xcconfig"; sourceTree = ""; }; AB49D09225D1A85D0084905B /* PostServiceRemoteRESTLikesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostServiceRemoteRESTLikesTests.swift; sourceTree = ""; }; AB49D09625D1AC0A0084905B /* post-likes-success.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "post-likes-success.json"; sourceTree = ""; }; AB49D0B225D1B4D80084905B /* post-likes-failure.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "post-likes-failure.json"; sourceTree = ""; }; @@ -1279,9 +1296,9 @@ B56D96B0202C9B7500485233 /* WordPressUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = WordPressUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B5969E1920A49AC4005E9DF1 /* NSString+MD5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+MD5.h"; sourceTree = ""; }; B5969E1A20A49AC4005E9DF1 /* NSString+MD5.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+MD5.m"; sourceTree = ""; }; - B5A4822A20AC6C0B009D95F6 /* WPKitLogging.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WPKitLogging.swift; path = WordPressKit/WPKitLogging.swift; sourceTree = SOURCE_ROOT; }; - B5A4822C20AC6C19009D95F6 /* WPKitLogging.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WPKitLogging.m; path = WordPressKit/WPKitLogging.m; sourceTree = SOURCE_ROOT; }; - B5A4822D20AC6C1A009D95F6 /* WPKitLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WPKitLogging.h; path = WordPressKit/WPKitLogging.h; sourceTree = SOURCE_ROOT; }; + B5A4822A20AC6C0B009D95F6 /* WPKitLogging.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WPKitLogging.swift; sourceTree = ""; }; + B5A4822C20AC6C19009D95F6 /* WPKitLogging.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WPKitLogging.m; sourceTree = ""; }; + B5A4822D20AC6C1A009D95F6 /* WPKitLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WPKitLogging.h; sourceTree = ""; }; B5A78828202B421B007874FB /* WordPressUIKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = WordPressUIKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B76472D20711B6BE2ACDC332 /* Pods-WordPressKitTests.release-internal.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WordPressKitTests.release-internal.xcconfig"; path = "Pods/Target Support Files/Pods-WordPressKitTests/Pods-WordPressKitTests.release-internal.xcconfig"; sourceTree = ""; }; BA0637EC2492382200AF8419 /* PluginStateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PluginStateTests.swift; sourceTree = ""; }; @@ -1328,8 +1345,10 @@ D813437521F6D70D0060D99A /* SiteSegmentsResponseDecodingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SiteSegmentsResponseDecodingTests.swift; sourceTree = ""; }; D813437721F6D7DC0060D99A /* site-segments-single.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "site-segments-single.json"; sourceTree = ""; }; D816857021EDACD10049883E /* WordPressComServiceRemote+SiteSegments.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WordPressComServiceRemote+SiteSegments.swift"; sourceTree = ""; }; + D8B33C7A6868E4BF63AB1835 /* Pods-CoreAPI.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CoreAPI.release.xcconfig"; path = "Pods/Target Support Files/Pods-CoreAPI/Pods-CoreAPI.release.xcconfig"; sourceTree = ""; }; D8DB403F21EF222000B8238E /* SiteCreationSegmentsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SiteCreationSegmentsTests.swift; sourceTree = ""; }; D8DB404121EF22B500B8238E /* site-segments-multiple.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "site-segments-multiple.json"; sourceTree = ""; }; + E09386F79A154A0EF19B8E06 /* Pods-CoreAPI.release-alpha.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CoreAPI.release-alpha.xcconfig"; path = "Pods/Target Support Files/Pods-CoreAPI/Pods-CoreAPI.release-alpha.xcconfig"; sourceTree = ""; }; E11C2AD11FA77FB90023BDE2 /* SitePlugin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SitePlugin.swift; sourceTree = ""; }; E13EE1461F33258E00C15787 /* PluginServiceRemote.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PluginServiceRemote.swift; sourceTree = ""; }; E13EE1481F332B8500C15787 /* site-plugins-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "site-plugins-success.json"; sourceTree = ""; }; @@ -1360,6 +1379,7 @@ E6C1E8481EF21FC100D139D9 /* is-passwordless-account-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "is-passwordless-account-success.json"; sourceTree = ""; }; E6D0EE611F7EF9CE0064D3FC /* AccountServiceRemoteREST+SocialService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AccountServiceRemoteREST+SocialService.swift"; sourceTree = ""; }; ED05C8FF3E61D93CE5BA527E /* Pods_WordPressKitTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WordPressKitTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EFBA9859252AFE38AC4AC0F3 /* Pods-CoreAPITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CoreAPITests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-CoreAPITests/Pods-CoreAPITests.debug.xcconfig"; sourceTree = ""; }; EFF80A6E6EE37118CB1DA158 /* Pods_WordPressKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WordPressKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; F181EA0127184D3C00F26141 /* ProductServiceRemote.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProductServiceRemote.swift; sourceTree = ""; }; F194E1222417ED9F00874408 /* AtomicAuthenticationServiceRemoteTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AtomicAuthenticationServiceRemoteTests.swift; sourceTree = ""; }; @@ -1384,9 +1404,9 @@ FA42615D2570C712003A01E2 /* activity-groups-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "activity-groups-success.json"; sourceTree = ""; }; FA4261712570CC91003A01E2 /* activity-groups-bad-json-failure.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "activity-groups-bad-json-failure.json"; sourceTree = ""; }; FA68CD142993C6CD00FA4C29 /* BlazeServiceRemote.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlazeServiceRemote.swift; sourceTree = ""; }; - FA79F1852591730D00D235A9 /* backup-get-backup-status-complete-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "backup-get-backup-status-complete-success.json"; path = "WordPressKitTests/backup-get-backup-status-complete-success.json"; sourceTree = SOURCE_ROOT; }; - FA79F1862591730D00D235A9 /* backup-prepare-backup-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "backup-prepare-backup-success.json"; path = "WordPressKitTests/backup-prepare-backup-success.json"; sourceTree = SOURCE_ROOT; }; - FA79F1952591809C00D235A9 /* backup-get-backup-status-in-progress-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "backup-get-backup-status-in-progress-success.json"; path = "WordPressKitTests/backup-get-backup-status-in-progress-success.json"; sourceTree = SOURCE_ROOT; }; + FA79F1852591730D00D235A9 /* backup-get-backup-status-complete-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "backup-get-backup-status-complete-success.json"; path = "Tests/WordPressKitTests/backup-get-backup-status-complete-success.json"; sourceTree = SOURCE_ROOT; }; + FA79F1862591730D00D235A9 /* backup-prepare-backup-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "backup-prepare-backup-success.json"; path = "../../backup-prepare-backup-success.json"; sourceTree = ""; }; + FA79F1952591809C00D235A9 /* backup-get-backup-status-in-progress-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "backup-get-backup-status-in-progress-success.json"; path = "Tests/WordPressKitTests/backup-get-backup-status-in-progress-success.json"; sourceTree = SOURCE_ROOT; }; FA87FE0624EB39C4003FBEE3 /* ReaderPostServiceRemote+SubscriptionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ReaderPostServiceRemote+SubscriptionTests.swift"; sourceTree = ""; }; FA87FE0824EB3FEF003FBEE3 /* reader-post-comments-subscription-status-success.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "reader-post-comments-subscription-status-success.json"; sourceTree = ""; }; FA87FE0A24EB4419003FBEE3 /* reader-post-comments-subscribe-success.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "reader-post-comments-subscribe-success.json"; sourceTree = ""; }; @@ -1432,7 +1452,6 @@ FEFFD99626C158F400F34231 /* share-app-content-success.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "share-app-content-success.json"; sourceTree = ""; }; FEFFD99A26C1598F00F34231 /* ShareAppContentServiceRemoteTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareAppContentServiceRemoteTests.swift; sourceTree = ""; }; FF20AD2120B8471A00082398 /* WordPressKit.podspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = WordPressKit.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - FFA4D4A82423B10A00BF5180 /* WordPressOrgRestApiTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WordPressOrgRestApiTests.swift; sourceTree = ""; }; FFA4D4AC2423B1FE00BF5180 /* wp-admin-post-new.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "wp-admin-post-new.html"; sourceTree = ""; }; FFA4D4AE2423B33800BF5180 /* wp-forbidden.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "wp-forbidden.json"; sourceTree = ""; }; FFA4D4AF2423B33800BF5180 /* wp-pages.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "wp-pages.json"; sourceTree = ""; }; @@ -1525,10 +1544,186 @@ B5A78828202B421B007874FB /* WordPressUIKit.framework */, EFF80A6E6EE37118CB1DA158 /* Pods_WordPressKit.framework */, ED05C8FF3E61D93CE5BA527E /* Pods_WordPressKitTests.framework */, + 3FBA9CD51186225778FB365E /* Pods_CoreAPI.framework */, + 158D49DD54ED25665161060B /* Pods_CoreAPITests.framework */, ); name = Frameworks; sourceTree = ""; }; + 3F21E9F22B8D860800DCE8DD /* AccountObjc */ = { + isa = PBXGroup; + children = ( + 93BD27381EE73282002BB00B /* AccountServiceRemote.h */, + 93BD27391EE73282002BB00B /* AccountServiceRemoteREST.h */, + 93BD273A1EE73282002BB00B /* AccountServiceRemoteREST.m */, + ); + path = AccountObjc; + sourceTree = ""; + }; + 3F21EC202B8D866300DCE8DD /* Account */ = { + isa = PBXGroup; + children = ( + E6D0EE611F7EF9CE0064D3FC /* AccountServiceRemoteREST+SocialService.swift */, + ); + path = Account; + sourceTree = ""; + }; + 3F21EC212B8D867600DCE8DD /* AccountObjcTests */ = { + isa = PBXGroup; + children = ( + 93BD27401EE73311002BB00B /* AccountServiceRemoteRESTTests.swift */, + ); + path = AccountObjcTests; + sourceTree = ""; + }; + 3F21EC232B8D87FD00DCE8DD /* ComAPIBasic */ = { + isa = PBXGroup; + children = ( + 93F50A351F226B9300B5BEBA /* WordPressComServiceRemote.h */, + 93F50A361F226B9300B5BEBA /* WordPressComServiceRemote.m */, + ); + path = ComAPIBasic; + sourceTree = ""; + }; + 3F21EC242B8D885D00DCE8DD /* ComAPIBasicTests */ = { + isa = PBXGroup; + children = ( + 93F50A391F226BB600B5BEBA /* WordPressComServiceRemoteRestTests.swift */, + ); + path = ComAPIBasicTests; + sourceTree = ""; + }; + 3F21EC252B8D88BD00DCE8DD /* WordPressAndJetpack */ = { + isa = PBXGroup; + children = ( + B5A4821F20AC6B5C009D95F6 /* Private */, + 9368C79C1EC62EBD0092CE8E /* Models */, + 9368C79B1EC62EB70092CE8E /* Services */, + 93BD27871EE829B4002BB00B /* Utility */, + ); + path = WordPressAndJetpack; + sourceTree = ""; + }; + 3F21EC262B8D88D900DCE8DD /* WordPressAndJetpackTests */ = { + isa = PBXGroup; + children = ( + 93BD27421EE73384002BB00B /* Mock Data */, + 930F52BA1ECF8A67002F921B /* Tests */, + ); + path = WordPressAndJetpackTests; + sourceTree = ""; + }; + 3F21EC3E2B8D8E4100DCE8DD /* CoreAPI */ = { + isa = PBXGroup; + children = ( + 57BCD3D326209D9500292CB3 /* AppTransportSecuritySettings.swift */, + 3F21EC702B8D8F7800DCE8DD /* Either.swift */, + 93BD27741EE73944002BB00B /* HTTPAuthenticationAlertController.swift */, + 4A11239D2B1926D1004690CF /* HTTPClient.swift */, + 4A11239B2B1926B7004690CF /* HTTPRequestBuilder.swift */, + 4A11239F2B196821004690CF /* MultipartForm.swift */, + 4A05E7952B2FCB6400C25E3B /* NonceRetrieval.swift */, + 3FF873F22B8F2F1800EB8AFA /* NSDate+RFC3339.swift */, + 3F391E192B50F3EB007975C4 /* Result+Callback.swift */, + E632D7771F6E047400297F6D /* SocialLogin2FANonceInfo.swift */, + 3F21EC6E2B8D8F3B00DCE8DD /* StringEncoding+IANA.swift */, + 264E09B22AD0B3BB004B5A5F /* WebauthChallengeInfo.swift */, + 4A1123992B19269A004690CF /* WordPressAPIError.swift */, + 4A57A6822B54A326008D0660 /* WordPressAPIError+NSErrorBrdige.swift */, + 93BD27771EE73944002BB00B /* WordPressComOAuthClient.swift */, + 93BD27781EE73944002BB00B /* WordPressComRestApi.swift */, + 3F21EC7C2B8D927000DCE8DD /* WordPressComRestApiErrorDomain.swift */, + 4A05E7992B2FDC3200C25E3B /* WordPressOrgRestApi.swift */, + 93BD27791EE73944002BB00B /* WordPressOrgXMLRPCApi.swift */, + 93BD277A1EE73944002BB00B /* WordPressOrgXMLRPCValidator.swift */, + 93BD277B1EE73944002BB00B /* WordPressRSDParser.swift */, + ); + path = CoreAPI; + sourceTree = ""; + }; + 3F21EC482B8D8E4200DCE8DD /* CoreAPITests */ = { + isa = PBXGroup; + children = ( + 46ABD0E9262EEE0400C7FF24 /* AppTransportSecuritySettingsTests.swift */, + 3F21ECCA2B8EDE0F00DCE8DD /* Bundle+SPMSupport.swift */, + 46ABD0E5262EEDAB00C7FF24 /* FakeInfoDictionaryObjectProvider.swift */, + 4A6B4A832B26974F00802316 /* HTTPRequestBuilderTests.swift */, + 4A05E79D2B30F3C500C25E3B /* HTTPRequestHelpers.swift */, + 4A1123A12B19690C004690CF /* MultipartFormTests.swift */, + 4A05E7972B2FCB9A00C25E3B /* NonceRetrievalTests.swift */, + 4A05E7AB2B35048A00C25E3B /* RSDParserTests.swift */, + 3F21ECBA2B8DA9C800DCE8DD /* Stubs */, + 4A6B4A852B269D0C00802316 /* URLSessionHelperTests.swift */, + 4A40F6542B2A5A1A0015DA77 /* WordPressAPIErrorTests.swift */, + FFE247A620C891D1002DF3A2 /* WordPressComOAuthClientTests.swift */, + 74B335D91F06F3D60053A184 /* WordPressComRestApiTests.swift */, + 4A57A6802B549144008D0660 /* WordPressComRestApiTests+Error.swift */, + 73B3DAD521FBB20D00B2CF18 /* WordPressComRestApiTests+Locale.swift */, + 4A05E79B2B2FDC6100C25E3B /* WordPressOrgAPITests.swift */, + 3F21ECC12B8DB30300DCE8DD /* WordPressOrgRestApiTests.swift */, + 74B335DB1F06F4180053A184 /* WordPressOrgXMLRPCApiTests.swift */, + 46ABD0DF262EED3D00C7FF24 /* WordPressOrgXMLRPCValidatorTests.swift */, + ); + path = CoreAPITests; + sourceTree = ""; + }; + 3F21EC7F2B8DA53200DCE8DD /* JSON */ = { + isa = PBXGroup; + children = ( + 7403A2F31EF06FEB00DED7DC /* me-settings-success-.json */, + FFE247A920C891E5002DF3A2 /* WordPressComAuthenticateWithIDToken2FANeededSuccess.json */, + FFE247AB20C891E5002DF3A2 /* WordPressComAuthenticateWithIDTokenBearerTokenSuccess.json */, + FFE247AE20C891E6002DF3A2 /* WordPressComAuthenticateWithIDTokenExistingUserNeedsConnection.json */, + 264E09B62AD25ED9004B5A5F /* WordPressComOAuthAuthenticateSignature.json */, + FFE247AC20C891E5002DF3A2 /* WordPressComOAuthNeeds2FAFail.json */, + 264E09B82AD2709A004B5A5F /* WordPressComOAuthNeedsWebauthnMFA.json */, + 264E09B42AD259FF004B5A5F /* WordPressComOAuthRequestChallenge.json */, + FFE247AD20C891E5002DF3A2 /* WordPressComOAuthSuccess.json */, + FFE247A820C891E5002DF3A2 /* WordPressComOAuthWrongPasswordFail.json */, + 74B335DF1F06F6290053A184 /* WordPressComRestApiFailInvalidInput.json */, + 74B335DD1F06F5A50053A184 /* WordPressComRestApiFailInvalidJSON.json */, + 74B335E11F06F6730053A184 /* WordPressComRestApiFailRequestInvalidToken.json */, + 93F50A3B1F226C0100B5BEBA /* WordPressComRestApiFailThrottled.json */, + 74B335E71F06F7200053A184 /* WordPressComRestApiFailUnauthorized.json */, + 74B335E51F06F6E90053A184 /* WordPressComRestApiMedia.json */, + 74B335E31F06F6B30053A184 /* WordPressComRestApiMultipleErrors.json */, + FFE247AA20C891E5002DF3A2 /* WordPressComSocial2FACodeSuccess.json */, + FFA4D4AE2423B33800BF5180 /* wp-forbidden.json */, + FFA4D4AF2423B33800BF5180 /* wp-pages.json */, + 1D969EB229D45745001FE37C /* wp-reusable-blocks.json */, + ); + path = JSON; + sourceTree = ""; + }; + 3F21EC822B8DA61200DCE8DD /* XML-stubs */ = { + isa = PBXGroup; + children = ( + 4A05E7A92B34FC4300C25E3B /* xmlrpc-response-list-methods.xml */, + 740B23EB1F17FB7E00067A2A /* xmlrpc-bad-username-or-password-error.xml */, + 74B335E91F06F76B0053A184 /* xmlrpc-response-getpost.xml */, + ); + path = "XML-stubs"; + sourceTree = ""; + }; + 3F21ECBA2B8DA9C800DCE8DD /* Stubs */ = { + isa = PBXGroup; + children = ( + 3F21ECBB2B8DA9D500DCE8DD /* HTML */, + 3F21EC7F2B8DA53200DCE8DD /* JSON */, + 3F21EC822B8DA61200DCE8DD /* XML-stubs */, + ); + path = Stubs; + sourceTree = ""; + }; + 3F21ECBB2B8DA9D500DCE8DD /* HTML */ = { + isa = PBXGroup; + children = ( + 4A05E7A52B34142200C25E3B /* xmlrpc-response-invalid.html */, + 4A05E7A72B34EAF400C25E3B /* xmlrpc-response-mobile-plugin-redirect.html */, + ); + path = HTML; + sourceTree = ""; + }; 3F3195AB266FF91100397EE7 /* Plans */ = { isa = PBXGroup; children = ( @@ -1538,6 +1733,24 @@ path = Plans; sourceTree = ""; }; + 3FF873EE2B8EFFDD00EB8AFA /* Sources */ = { + isa = PBXGroup; + children = ( + 9368C77D1EC5EF1B0092CE8E /* WordPressKit */, + 3F21EC3E2B8D8E4100DCE8DD /* CoreAPI */, + ); + path = Sources; + sourceTree = ""; + }; + 3FF873EF2B8EFFE900EB8AFA /* Tests */ = { + isa = PBXGroup; + children = ( + 9368C7881EC5EF1B0092CE8E /* WordPressKitTests */, + 3F21EC482B8D8E4200DCE8DD /* CoreAPITests */, + ); + path = Tests; + sourceTree = ""; + }; 404057C3221B30140060250C /* Time Interval */ = { isa = PBXGroup; children = ( @@ -1627,24 +1840,6 @@ name = BlockEditorSettings; sourceTree = ""; }; - 57A38E502624F7D000472480 /* WordPressAPI */ = { - isa = PBXGroup; - children = ( - 46ABD0DF262EED3D00C7FF24 /* WordPressOrgXMLRPCValidatorTests.swift */, - 4A05E7972B2FCB9A00C25E3B /* NonceRetrievalTests.swift */, - 4A05E79B2B2FDC6100C25E3B /* WordPressOrgAPITests.swift */, - ); - path = WordPressAPI; - sourceTree = ""; - }; - 57A38E572624FF1000472480 /* Fakes */ = { - isa = PBXGroup; - children = ( - 46ABD0E5262EEDAB00C7FF24 /* FakeInfoDictionaryObjectProvider.swift */, - ); - path = Fakes; - sourceTree = ""; - }; 740B23D41F17F6D200067A2A /* Post */ = { isa = PBXGroup; children = ( @@ -1875,16 +2070,10 @@ 436D56362118DC2800CEAA33 /* Transactions */, 93F50A421F227CC400B5BEBA /* Users */, F9E56DF924EB18A300916770 /* Utilities */, - 57A38E502624F7D000472480 /* WordPressAPI */, - FFE247A620C891D1002DF3A2 /* WordPressComOAuthClientTests.swift */, - 74B335D91F06F3D60053A184 /* WordPressComRestApiTests.swift */, - 73B3DAD521FBB20D00B2CF18 /* WordPressComRestApiTests+Locale.swift */, - 4A57A6802B549144008D0660 /* WordPressComRestApiTests+Error.swift */, - FFA4D4A82423B10A00BF5180 /* WordPressOrgRestApiTests.swift */, - 74B335DB1F06F4180053A184 /* WordPressOrgXMLRPCApiTests.swift */, 740B23D51F17F7C100067A2A /* XMLRPCTestable.swift */, ); name = Tests; + path = ..; sourceTree = ""; }; 930F52BB1ECF8A78002F921B /* Stats */ = { @@ -1907,15 +2096,15 @@ 9368C7711EC5EF1B0092CE8E = { isa = PBXGroup; children = ( - FFE247CD20CB1245002DF3A2 /* LICENSE */, - FFE247CC20CB118A002DF3A2 /* README.md */, 0C3A2A412A2E7BA500FD91D6 /* CHANGELOG.md */, - FF20AD2120B8471A00082398 /* WordPressKit.podspec */, - 9368C77D1EC5EF1B0092CE8E /* WordPressKit */, - 9368C7881EC5EF1B0092CE8E /* WordPressKitTests */, - 9368C77C1EC5EF1B0092CE8E /* Products */, 38C6ABE94A27A12C9C4AD19D /* Frameworks */, + FFE247CD20CB1245002DF3A2 /* LICENSE */, E5EA953F7DD505CCED2E44CD /* Pods */, + 9368C77C1EC5EF1B0092CE8E /* Products */, + FFE247CC20CB118A002DF3A2 /* README.md */, + 3FF873EE2B8EFFDD00EB8AFA /* Sources */, + 3FF873EF2B8EFFE900EB8AFA /* Tests */, + FF20AD2120B8471A00082398 /* WordPressKit.podspec */, ); sourceTree = ""; }; @@ -1931,13 +2120,12 @@ 9368C77D1EC5EF1B0092CE8E /* WordPressKit */ = { isa = PBXGroup; children = ( - B5A4821F20AC6B5C009D95F6 /* Private */, - 9368C79C1EC62EBD0092CE8E /* Models */, - 9368C79B1EC62EB70092CE8E /* Services */, - 93BD27871EE829B4002BB00B /* Utility */, - 93BD27731EE7388E002BB00B /* WordPressAPI */, - 9368C77E1EC5EF1B0092CE8E /* WordPressKit.h */, + 3F21EC202B8D866300DCE8DD /* Account */, + 3F21E9F22B8D860800DCE8DD /* AccountObjc */, + 3F21EC232B8D87FD00DCE8DD /* ComAPIBasic */, 9368C77F1EC5EF1B0092CE8E /* Info.plist */, + 3F21EC252B8D88BD00DCE8DD /* WordPressAndJetpack */, + 9368C77E1EC5EF1B0092CE8E /* WordPressKit.h */, ); path = WordPressKit; sourceTree = ""; @@ -1945,11 +2133,11 @@ 9368C7881EC5EF1B0092CE8E /* WordPressKitTests */ = { isa = PBXGroup; children = ( - 57A38E572624FF1000472480 /* Fakes */, + 3F21EC212B8D867600DCE8DD /* AccountObjcTests */, + 3F21EC242B8D885D00DCE8DD /* ComAPIBasicTests */, 9368C78B1EC5EF1B0092CE8E /* Info.plist */, - 93BD27421EE73384002BB00B /* Mock Data */, - 930F52BA1ECF8A67002F921B /* Tests */, 3FB8642D288813E9003A86BE /* UnitTests.xctestplan */, + 3F21EC262B8D88D900DCE8DD /* WordPressAndJetpackTests */, 93BD273F1EE73310002BB00B /* WordPressKitTests-Bridging-Header.h */, ); path = WordPressKitTests; @@ -1959,10 +2147,6 @@ isa = PBXGroup; children = ( F4B0F4712ACAF47D003ABC61 /* Domains */, - 93BD27381EE73282002BB00B /* AccountServiceRemote.h */, - 93BD27391EE73282002BB00B /* AccountServiceRemoteREST.h */, - 93BD273A1EE73282002BB00B /* AccountServiceRemoteREST.m */, - E6D0EE611F7EF9CE0064D3FC /* AccountServiceRemoteREST+SocialService.swift */, 7403A2E31EF06ED500DED7DC /* AccountSettingsRemote.swift */, 7397F019220A072500C723F3 /* ActivityServiceRemote_ApiVersion1_0.swift */, 826016F01F9FA13A00533B6C /* ActivityServiceRemote.swift */, @@ -2060,8 +2244,6 @@ 436D56322118D7AA00CEAA33 /* TransactionsServiceRemote.swift */, 0CED1FE72B617CF300E6DD52 /* AtomicSiteServiceRemote.swift */, 93F50A3E1F227C8900B5BEBA /* UsersServiceRemoteXMLRPC.swift */, - 93F50A351F226B9300B5BEBA /* WordPressComServiceRemote.h */, - 93F50A361F226B9300B5BEBA /* WordPressComServiceRemote.m */, 7328420321CD786C00126755 /* WordPressComServiceRemote+SiteCreation.swift */, D816857021EDACD10049883E /* WordPressComServiceRemote+SiteSegments.swift */, 730E869E21E44EFD00753E1A /* WordPressComServiceRemote+SiteVerticals.swift */, @@ -2069,6 +2251,7 @@ 803DE80E28FFA787007D4E9C /* RemoteConfigRemote.swift */, ); name = Services; + path = ..; sourceTree = ""; }; 9368C79C1EC62EBD0092CE8E /* Models */ = { @@ -2148,8 +2331,6 @@ 9856BE952630B5C200C12FEB /* RemoteUser+Likes.swift */, 436D563B2118E18D00CEAA33 /* WPState.swift */, E1D6B555200E46F200325669 /* WPTimeZone.swift */, - E632D7771F6E047400297F6D /* SocialLogin2FANonceInfo.swift */, - 264E09B22AD0B3BB004B5A5F /* WebauthChallengeInfo.swift */, 17CE77F020C6EB41001DEA5A /* ReaderFeed.swift */, 32E1DD22236AA09A008914B0 /* RemotePostAutosave.swift */, F9E56DF524EB11EF00916770 /* FeatureFlag.swift */, @@ -2164,6 +2345,7 @@ F41D98E92B48602B004EC050 /* SessionDetails.swift */, ); name = Models; + path = ..; sourceTree = ""; }; 93BD273E1EE732CC002BB00B /* Accounts */ = { @@ -2171,9 +2353,7 @@ children = ( D813437521F6D70D0060D99A /* SiteSegmentsResponseDecodingTests.swift */, D8DB403F21EF222000B8238E /* SiteCreationSegmentsTests.swift */, - 93BD27401EE73311002BB00B /* AccountServiceRemoteRESTTests.swift */, 7403A2E51EF06F7000DED7DC /* AccountSettingsRemoteTests.swift */, - 93F50A391F226BB600B5BEBA /* WordPressComServiceRemoteRestTests.swift */, ); name = Accounts; sourceTree = ""; @@ -2181,9 +2361,6 @@ 93BD27421EE73384002BB00B /* Mock Data */ = { isa = PBXGroup; children = ( - F4B0F4742ACB4176003ABC61 /* Domains */, - 937250EB267A15060086075F /* stats-referrer-mark-as-spam.json */, - 465F8892263B094900F4C950 /* BlockEditorSettings */, FA4261712570CC91003A01E2 /* activity-groups-bad-json-failure.json */, FA42615D2570C712003A01E2 /* activity-groups-success.json */, 826016F61F9FAF6300533B6C /* activity-log-auth-failure.json */, @@ -2208,13 +2385,15 @@ 8BFD71FD25CACCBF0094534E /* backup-get-backup-status-complete-without-download-id-success.json */, FA79F1952591809C00D235A9 /* backup-get-backup-status-in-progress-success.json */, FA79F1862591730D00D235A9 /* backup-prepare-backup-success.json */, - FEEFD8B3280DD60200A3E261 /* blogging-prompts-success.json */, + 0CB1905F2A2A6943004D3E80 /* blaze-campaigns-search.json */, + 465F8892263B094900F4C950 /* BlockEditorSettings */, FE20A6A5282BC68D0025E975 /* blogging-prompts-settings-fetch-success.json */, - FE20A6A7282BC83A0025E975 /* blogging-prompts-settings-update-with-response.json */, FE20A6A9282BC8710025E975 /* blogging-prompts-settings-update-empty-response.json */, + FE20A6A7282BC83A0025E975 /* blogging-prompts-settings-update-with-response.json */, + FEEFD8B3280DD60200A3E261 /* blogging-prompts-success.json */, ABD95B8425DD6DA200735BEE /* comment-likes-success.json */, - FEE4EF5E2730334D003CDA3C /* comments-v2-view-context-success.json */, FEE4EF6027303361003CDA3C /* comments-v2-edit-context-success.json */, + FEE4EF5E2730334D003CDA3C /* comments-v2-view-context-success.json */, C92EFF7225E7444400E0308D /* common-starter-site-designs-empty-designs.json */, C92EFF6C25E741E900E0308D /* common-starter-site-designs-malformed.json */, C92EFF6825E7403F00E0308D /* common-starter-site-designs-success.json */, @@ -2225,8 +2404,9 @@ 74585B9E1F0D6E7500E7E667 /* domain-service-bad-json.json */, 74585BA01F0D6F5300E7E667 /* domain-service-empty.json */, C9F991B827D5A52600135131 /* domain-service-invalid-query.json */, - FFE247BC20C9C88B002DF3A2 /* empty.json */, + F4B0F4742ACB4176003ABC61 /* Domains */, FEE4EF5C2730315C003CDA3C /* empty-array.json */, + FFE247BC20C9C88B002DF3A2 /* empty.json */, 930999531F16598A00F006A1 /* get-multiple-themes-v1.2.json */, 930999541F16598A00F006A1 /* get-purchased-themes-v1.1.json */, 930999551F16598A00F006A1 /* get-single-theme-v1.1.json */, @@ -2260,9 +2440,9 @@ 9A88173A223BFE5100A3AB20 /* jetpack-service-error-unknown.json */, 9A881738223BFC8E00A3AB20 /* jetpack-service-failure.json */, 9AD75C7A223BEF7A00AED6F4 /* jetpack-service-success.json */, + FE5096692A30A4F900DDD071 /* jetpack-social-403.json */, FE5096622A309DE000DDD071 /* jetpack-social-no-publicize.json */, FE5096642A309DEE00DDD071 /* jetpack-social-with-publicize.json */, - FE5096692A30A4F900DDD071 /* jetpack-social-403.json */, 93BD274B1EE73442002BB00B /* me-auth-failure.json */, 93BD274C1EE73442002BB00B /* me-bad-json-failure.json */, 7403A2E71EF06FEB00DED7DC /* me-settings-auth-failure.json */, @@ -2270,7 +2450,7 @@ 7403A2E91EF06FEB00DED7DC /* me-settings-change-aboutme-success.json */, 7403A2EA1EF06FEB00DED7DC /* me-settings-change-display-name-bad-json-failure.json */, 7403A2EB1EF06FEB00DED7DC /* me-settings-change-display-name-success.json */, - 7403A2EC1EF06FEB00DED7DC /* me-settings-change-email-success.json */, + 3FF873F02B8F2C7100EB8AFA /* me-settings-change-email-success.json */, 7403A2ED1EF06FEB00DED7DC /* me-settings-change-firstname-success.json */, 7403A2EE1EF06FEB00DED7DC /* me-settings-change-invalid-input-failure.json */, 7403A2EF1EF06FEB00DED7DC /* me-settings-change-lastname-success.json */, @@ -2279,7 +2459,7 @@ 93AEA69226CE4EED009502D2 /* me-settings-close-account-failure.json */, 93A4232226CBC845004CCA31 /* me-settings-close-account-success.json */, 7403A2F21EF06FEB00DED7DC /* me-settings-revert-email-success.json */, - 7403A2F31EF06FEB00DED7DC /* me-settings-success.json */, + 3F21ECBD2B8DAAC500DCE8DD /* me-settings-success.json */, 93BD274D1EE73442002BB00B /* me-sites-auth-failure.json */, 93BD274E1EE73442002BB00B /* me-sites-bad-json-failure.json */, 93BD274F1EE73442002BB00B /* me-sites-empty-success.json */, @@ -2324,6 +2504,11 @@ 9AB6D64C218730130008F274 /* post-revisions-failure.json */, 9AB6D64D218731380008F274 /* post-revisions-mapping-success.json */, 9AB6D648218722BB0008F274 /* post-revisions-success.json */, + C738CAF628622B94001BE107 /* qrlogin-authenticate-200.json */, + C738CAF828622BB1001BE107 /* qrlogin-authenticate-failed-400.json */, + C738CAF0286224ED001BE107 /* qrlogin-validate-200.json */, + C738CAF2286226D6001BE107 /* qrlogin-validate-400.json */, + C738CAF428622953001BE107 /* qrlogin-validate-expired-401.json */, 8B2F4BEA24ABCA6F0056C08A /* reader-cards-success.json */, 3236F79B24AE413A0088E8F3 /* reader-interests-success.json */, CEAD827925E421DE00758DF2 /* reader-post-comments-subscribe-failure.json */, @@ -2342,14 +2527,16 @@ 17BF9A6B20C7DC3300BF57D2 /* reader-site-search-success.json */, 74A44DD71F13C7AC006CD8F4 /* remote-notification.json */, 74B040711EF8B366002C6258 /* rest-site-settings.json */, + 4A3239652B7314E200EFD2A8 /* self-hosted-plugins-get.json */, + 4A3239672B74319400EFD2A8 /* self-hosted-plugins-install.json */, FEFFD99626C158F400F34231 /* share-app-content-success.json */, 74C473CA1EF33696009918F2 /* site-active-purchases-auth-failure.json */, 74C473CC1EF336BD009918F2 /* site-active-purchases-bad-json-failure.json */, 74C473C81EF335B8009918F2 /* site-active-purchases-empty-response.json */, 74C473C61EF334D4009918F2 /* site-active-purchases-none-active-success.json */, 74C473C41EF33242009918F2 /* site-active-purchases-two-active-success.json */, - 98F884D526BC6909009ADF57 /* site-comments-success.json */, 98E1A60A27AB604600C61A7F /* site-comment-success.json */, + 98F884D526BC6909009ADF57 /* site-comments-success.json */, 731BA83921DECE93000FDFCD /* site-creation-success.json */, 74C473B21EF3204B009918F2 /* site-delete-auth-failure.json */, 74C473B41EF320CC009918F2 /* site-delete-bad-json-failure.json */, @@ -2358,14 +2545,13 @@ 74C473B61EF3229B009918F2 /* site-delete-unexpected-json-failure.json */, F3FF8A24279C960F00E5C90F /* site-email-followers-get-auth-failure.json */, F3FF8A26279C967200E5C90F /* site-email-followers-get-failure.json */, - F3FF8A22279C954100E5C90F /* site-email-followers-get-success.json */, F3FF8A28279C991B00E5C90F /* site-email-followers-get-success-more-pages.json */, + F3FF8A22279C954100E5C90F /* site-email-followers-get-success.json */, 74C473BC1EF329CA009918F2 /* site-export-auth-failure.json */, 74C473BE1EF32B64009918F2 /* site-export-bad-json-failure.json */, 74C473C21EF32DD7009918F2 /* site-export-failure.json */, 74C473C01EF32C74009918F2 /* site-export-missing-status-failure.json */, 74C473BA1EF328D8009918F2 /* site-export-success.json */, - FE5096552A13B7F200DDD071 /* sites-external-services.json */, 74D67F221F15C3740010C5ED /* site-followers-delete-auth-failure.json */, 74D67F231F15C3740010C5ED /* site-followers-delete-bad-json-failure.json */, 74D67F241F15C3740010C5ED /* site-followers-delete-failure.json */, @@ -2401,10 +2587,13 @@ 74D67F2C1F15C3740010C5ED /* site-viewers-delete-bad-json.json */, 74D67F2D1F15C3740010C5ED /* site-viewers-delete-failure.json */, 74D67F2E1F15C3740010C5ED /* site-viewers-delete-success.json */, + FE5096552A13B7F200DDD071 /* sites-external-services.json */, E6B0461125E5B6F500DF6F4F /* sites-invites-links-disable-empty.json */, E6B0460F25E5B6F500DF6F4F /* sites-invites-links-disable.json */, E6B0461025E5B6F500DF6F4F /* sites-invites-links-generate.json */, E6B0460E25E5B6F500DF6F4F /* sites-invites.json */, + FEE48EF72A4B3E43008A48E0 /* sites-site-active-features.json */, + FEE48EF92A4B3E50008A48E0 /* sites-site-no-active-features.json */, 404057D7221C98690060250C /* stats-clicks-data.json */, 404057D3221C5FC30060250C /* stats-countries-data.json */, 984E34F322EF9464005C3F92 /* stats-file-downloads.json */, @@ -2412,16 +2601,15 @@ 40819770221DFDB600A298E4 /* stats-posts-data.json */, 40819774221E497C00A298E4 /* stats-published-posts.json */, 404057DB221C9FD70060250C /* stats-referrer-data.json */, + 937250EB267A15060086075F /* stats-referrer-mark-as-spam.json */, 404057C6221B36070060250C /* stats-search-term-result.json */, - FEE48EF72A4B3E43008A48E0 /* sites-site-active-features.json */, - FEE48EF92A4B3E50008A48E0 /* sites-site-no-active-features.json */, 40F9880D221ACFB400B7B369 /* stats-streak-result.json */, + 01438D372B6A35FB0097D60A /* stats-summary.json */, 404057CA221B80BC0060250C /* stats-top-authors.json */, 404057CF221C46780060250C /* stats-videos-data.json */, 4081977A221F153A00A298E4 /* stats-visits-day.json */, - 01438D372B6A35FB0097D60A /* stats-summary.json */, - 4081977D221F269A00A298E4 /* stats-visits-month.json */, 01438D342B6A2B2C0097D60A /* stats-visits-month-unit-week.json */, + 4081977D221F269A00A298E4 /* stats-visits-month.json */, 40819779221F153A00A298E4 /* stats-visits-week.json */, 436D56392118DE3B00CEAA33 /* supported-countries-success.json */, 436D56522121F60400CEAA33 /* supported-states-empty.json */, @@ -2433,28 +2621,9 @@ 1DF972BD29B107E7007A72BC /* videopress-public-video.json */, 1DF972BE29B107E7007A72BC /* videopress-site-default-video.json */, 1DF972B729B0DF8C007A72BC /* videopress-token.json */, - FFE247A920C891E5002DF3A2 /* WordPressComAuthenticateWithIDToken2FANeededSuccess.json */, - FFE247AB20C891E5002DF3A2 /* WordPressComAuthenticateWithIDTokenBearerTokenSuccess.json */, - FFE247AE20C891E6002DF3A2 /* WordPressComAuthenticateWithIDTokenExistingUserNeedsConnection.json */, - FFE247AC20C891E5002DF3A2 /* WordPressComOAuthNeeds2FAFail.json */, - 264E09B82AD2709A004B5A5F /* WordPressComOAuthNeedsWebauthnMFA.json */, - 264E09B42AD259FF004B5A5F /* WordPressComOAuthRequestChallenge.json */, - 264E09B62AD25ED9004B5A5F /* WordPressComOAuthAuthenticateSignature.json */, - FFE247AD20C891E5002DF3A2 /* WordPressComOAuthSuccess.json */, - FFE247A820C891E5002DF3A2 /* WordPressComOAuthWrongPasswordFail.json */, - 74B335DF1F06F6290053A184 /* WordPressComRestApiFailInvalidInput.json */, - 74B335DD1F06F5A50053A184 /* WordPressComRestApiFailInvalidJSON.json */, - 74B335E11F06F6730053A184 /* WordPressComRestApiFailRequestInvalidToken.json */, - 93F50A3B1F226C0100B5BEBA /* WordPressComRestApiFailThrottled.json */, - 74B335E71F06F7200053A184 /* WordPressComRestApiFailUnauthorized.json */, - 74B335E51F06F6E90053A184 /* WordPressComRestApiMedia.json */, - 74B335E31F06F6B30053A184 /* WordPressComRestApiMultipleErrors.json */, - FFE247AA20C891E5002DF3A2 /* WordPressComSocial2FACodeSuccess.json */, FFA4D4AC2423B1FE00BF5180 /* wp-admin-post-new.html */, - FFA4D4AE2423B33800BF5180 /* wp-forbidden.json */, - FFA4D4AF2423B33800BF5180 /* wp-pages.json */, - 1D969EB229D45745001FE37C /* wp-reusable-blocks.json */, - 740B23EB1F17FB7E00067A2A /* xmlrpc-bad-username-password-error.xml */, + 3F21ECC62B8DCE4500DCE8DD /* wp-com-rest-api-fail-throttled.json */, + 3F21ECC42B8DCDCF00DCE8DD /* xmlrpc-bad-username-password-error.xml */, 740B23EC1F17FB7E00067A2A /* xmlrpc-malformed-request-xml-error.xml */, 740B23D71F17FB4200067A2A /* xmlrpc-metaweblog-editpost-bad-xml-failure.xml */, 740B23D81F17FB4200067A2A /* xmlrpc-metaweblog-editpost-change-format-failure.xml */, @@ -2463,50 +2632,18 @@ 740B23DB1F17FB4200067A2A /* xmlrpc-metaweblog-newpost-bad-xml-failure.xml */, 740B23DC1F17FB4200067A2A /* xmlrpc-metaweblog-newpost-invalid-posttype-failure.xml */, 740B23DD1F17FB4200067A2A /* xmlrpc-metaweblog-newpost-success.xml */, - 74B335E91F06F76B0053A184 /* xmlrpc-response-getpost.xml */, - 4A05E7A92B34FC4300C25E3B /* xmlrpc-response-list-methods.xml */, - 4A05E7A52B34142200C25E3B /* xmlrpc-response-invalid.html */, - 4A05E7A72B34EAF400C25E3B /* xmlrpc-response-mobile-plugin-redirect.html */, 93F50A451F227F3600B5BEBA /* xmlrpc-response-getprofile.xml */, 93F50A461F227F3600B5BEBA /* xmlrpc-response-valid-but-unexpected-dictionary.xml */, - 98EA910426BC96B8004098A1 /* xmlrpc-site-comments-success.xml */, 98E1A60C27AB621200C61A7F /* xmlrpc-site-comment-success.xml */, + 98EA910426BC96B8004098A1 /* xmlrpc-site-comments-success.xml */, 740B23DE1F17FB4200067A2A /* xmlrpc-wp-getpost-bad-xml-failure.xml */, 740B23DF1F17FB4200067A2A /* xmlrpc-wp-getpost-invalid-id-failure.xml */, 740B23E01F17FB4200067A2A /* xmlrpc-wp-getpost-success.xml */, - C738CAF0286224ED001BE107 /* qrlogin-validate-200.json */, - C738CAF2286226D6001BE107 /* qrlogin-validate-400.json */, - C738CAF428622953001BE107 /* qrlogin-validate-expired-401.json */, - C738CAF628622B94001BE107 /* qrlogin-authenticate-200.json */, - C738CAF828622BB1001BE107 /* qrlogin-authenticate-failed-400.json */, - 0CB1905F2A2A6943004D3E80 /* blaze-campaigns-search.json */, - 4A3239652B7314E200EFD2A8 /* self-hosted-plugins-get.json */, - 4A3239672B74319400EFD2A8 /* self-hosted-plugins-install.json */, + 7403A2EC1EF06FEB00DED7DC /* me-settings-change-display-name-success.json */, ); path = "Mock Data"; sourceTree = ""; }; - 93BD27731EE7388E002BB00B /* WordPressAPI */ = { - isa = PBXGroup; - children = ( - 4A05E7952B2FCB6400C25E3B /* NonceRetrieval.swift */, - 4A05E7992B2FDC3200C25E3B /* WordPressOrgRestApi.swift */, - 93BD27741EE73944002BB00B /* HTTPAuthenticationAlertController.swift */, - 93BD27751EE73944002BB00B /* NSDate+WordPressJSON.h */, - 93BD27761EE73944002BB00B /* NSDate+WordPressJSON.m */, - 93BD27771EE73944002BB00B /* WordPressComOAuthClient.swift */, - 93BD27781EE73944002BB00B /* WordPressComRestApi.swift */, - 93BD27791EE73944002BB00B /* WordPressOrgXMLRPCApi.swift */, - 93BD277A1EE73944002BB00B /* WordPressOrgXMLRPCValidator.swift */, - 93BD277B1EE73944002BB00B /* WordPressRSDParser.swift */, - 4A11239D2B1926D1004690CF /* HTTPClient.swift */, - 4A11239B2B1926B7004690CF /* HTTPRequestBuilder.swift */, - 4A1123992B19269A004690CF /* WordPressAPIError.swift */, - 4A57A6822B54A326008D0660 /* WordPressAPIError+NSErrorBrdige.swift */, - ); - name = WordPressAPI; - sourceTree = ""; - }; 93BD27871EE829B4002BB00B /* Utility */ = { isa = PBXGroup; children = ( @@ -2516,17 +2653,14 @@ 93C674EF1EE8351E00BFAF05 /* NSMutableDictionary+Helpers.h */, 93C674F01EE8351E00BFAF05 /* NSMutableDictionary+Helpers.m */, 9F4E51FF2088E38200424676 /* ObjectValidation.swift */, - 57BCD3D326209D9500292CB3 /* AppTransportSecuritySettings.swift */, 465F88A1263B325C00F4C950 /* ChecksumUtil.swift */, 3F3195AC266FF94B00397EE7 /* ZendeskMetadata.swift */, - 4A11239F2B196821004690CF /* MultipartForm.swift */, 4AE278432B2FAF6200E4D9B1 /* HTTPProtocolHelpers.swift */, - 3F391E192B50F3EB007975C4 /* Result+Callback.swift */, - 4A5BC1A72B59DE6600C7D037 /* Either.swift */, 4A57A6852B54C68C008D0660 /* Constants.h */, 4A57A6862B54C68C008D0660 /* Constants.m */, ); name = Utility; + path = ..; sourceTree = ""; }; 93F50A421F227CC400B5BEBA /* Users */ = { @@ -2642,6 +2776,14 @@ C5953994B3865AF409BA4210 /* Pods-WordPressKitTests.release.xcconfig */, 6F2E0CC4FA01B5475A378DA2 /* Pods-WordPressKitTests.release-alpha.xcconfig */, B76472D20711B6BE2ACDC332 /* Pods-WordPressKitTests.release-internal.xcconfig */, + A9410AE028C24F85F4B28388 /* Pods-CoreAPI.debug.xcconfig */, + D8B33C7A6868E4BF63AB1835 /* Pods-CoreAPI.release.xcconfig */, + E09386F79A154A0EF19B8E06 /* Pods-CoreAPI.release-alpha.xcconfig */, + 8EFF804105F3799CCB95C197 /* Pods-CoreAPI.release-internal.xcconfig */, + EFBA9859252AFE38AC4AC0F3 /* Pods-CoreAPITests.debug.xcconfig */, + 3CAFAE2EC1B18EAF8B92FC96 /* Pods-CoreAPITests.release.xcconfig */, + 2584641ED9CC84CD2D92D33C /* Pods-CoreAPITests.release-alpha.xcconfig */, + 498F613708CDBD562BFA0ADB /* Pods-CoreAPITests.release-internal.xcconfig */, ); name = Pods; sourceTree = ""; @@ -2708,21 +2850,14 @@ F9E56DF924EB18A300916770 /* Utilities */ = { isa = PBXGroup; children = ( - 46ABD0E9262EEE0400C7FF24 /* AppTransportSecuritySettingsTests.swift */, F9E56DFA24EB18C300916770 /* FeatureFlagRemoteTests.swift */, 24ADA24D24F9B32D001B5DAE /* FeatureFlagSerializationTest.swift */, 465F88BE263B54EE00F4C950 /* ChecksumUtilTests.swift */, 803DE81028FFA9C4007D4E9C /* RemoteConfigRemoteTests.swift */, 4A1DEF43293051BC00322608 /* LoggingTests.swift */, 4A1DEF45293051C600322608 /* LoggingTests.m */, - 4A1123A12B19690C004690CF /* MultipartFormTests.swift */, - 4A6B4A832B26974F00802316 /* HTTPRequestBuilderTests.swift */, - 4A6B4A852B269D0C00802316 /* URLSessionHelperTests.swift */, - 4A40F6542B2A5A1A0015DA77 /* WordPressAPIErrorTests.swift */, 4AE278472B2FBF1100E4D9B1 /* HTTPBodyEncodingTests.swift */, 4AE278492B2FC6C600E4D9B1 /* HTTPHeaderValueParserTests.swift */, - 4A05E7AB2B35048A00C25E3B /* RSDParserTests.swift */, - 4A05E79D2B30F3C500C25E3B /* HTTPRequestHelpers.swift */, ); path = Utilities; sourceTree = ""; @@ -2771,7 +2906,6 @@ 93BD273C1EE73282002BB00B /* AccountServiceRemoteREST.h in Headers */, 93BD27711EE737A8002BB00B /* ServiceRemoteWordPressXMLRPC.h in Headers */, 93BD276F1EE737A8002BB00B /* ServiceRemoteWordPressComREST.h in Headers */, - 93BD277D1EE73944002BB00B /* NSDate+WordPressJSON.h in Headers */, 93BD273B1EE73282002BB00B /* AccountServiceRemote.h in Headers */, 93BD27691EE736A8002BB00B /* RemoteUser.h in Headers */, 74B5F0DC1EF829B800B411E7 /* BlogServiceRemote.h in Headers */, @@ -2869,6 +3003,7 @@ 9368C7721EC5EF1B0092CE8E /* Project object */ = { isa = PBXProject; attributes = { + LastSwiftUpdateCheck = 1520; LastUpgradeCheck = 1200; ORGANIZATIONNAME = "Automattic Inc."; TargetAttributes = { @@ -2923,6 +3058,7 @@ 01438D392B6A361B0097D60A /* stats-summary.json in Resources */, 01438D362B6A31540097D60A /* stats-visits-month-unit-week.json in Resources */, 32A29A1F236BE4CC009488C2 /* post-autosave-mapping-success.json in Resources */, + 3FF874322B8F3D0C00EB8AFA /* WordPressComOAuthNeeds2FAFail.json in Resources */, CEAD827B25E421DE00758DF2 /* reader-post-comments-subscribe-failure.json in Resources */, 7403A2FC1EF06FEB00DED7DC /* me-settings-change-lastname-success.json in Resources */, 40F88F601F85723500AE3FAF /* auth-send-verification-email-already-verified-failure.json in Resources */, @@ -2931,13 +3067,11 @@ 3297E28D25647E0300287D21 /* jetpack-scan-enqueue-success.json in Resources */, FE50966A2A30A4F900DDD071 /* jetpack-social-403.json in Resources */, 7403A2F71EF06FEB00DED7DC /* me-settings-change-display-name-bad-json-failure.json in Resources */, - 74B335E41F06F6B30053A184 /* WordPressComRestApiMultipleErrors.json in Resources */, 740B23E61F17FB4200067A2A /* xmlrpc-metaweblog-newpost-invalid-posttype-failure.xml in Resources */, 73D592FC21E550D300E4CF84 /* site-verticals-single.json in Resources */, 74D67F2F1F15C3740010C5ED /* site-followers-delete-auth-failure.json in Resources */, 74C473B51EF320CC009918F2 /* site-delete-bad-json-failure.json in Resources */, 740B23E21F17FB4200067A2A /* xmlrpc-metaweblog-editpost-change-format-failure.xml in Resources */, - 264E09B52AD259FF004B5A5F /* WordPressComOAuthRequestChallenge.json in Resources */, FFE247BD20C9C88B002DF3A2 /* empty.json in Resources */, 1DF972BA29B0DF8C007A72BC /* videopress-token.json in Resources */, BA8EA71324A056C300D5CC9F /* plugin-service-remote-featured-malformed.json in Resources */, @@ -2955,25 +3089,29 @@ 3297E1EE2564694C00287D21 /* jetpack-scan-idle-success-threats.json in Resources */, 40819785221F74B200A298E4 /* stats-post-details.json in Resources */, 4625BAF1253E12C000C04AAD /* page-layout-blog-layouts-success.json in Resources */, + 3FF8741D2B8F3D0B00EB8AFA /* WordPressComAuthenticateWithIDToken2FANeededSuccess.json in Resources */, 436D563A2118DE3B00CEAA33 /* supported-countries-success.json in Resources */, 9A881756223C01E400A3AB20 /* jetpack-service-error-activation-failure.json in Resources */, 740B23E71F17FB4200067A2A /* xmlrpc-metaweblog-newpost-success.xml in Resources */, 74FC6F411F191C1D00112505 /* notifications-last-seen.json in Resources */, + 3FF8741C2B8F3D0B00EB8AFA /* WordPressComRestApiFailInvalidInput.json in Resources */, 74C473BD1EF329CA009918F2 /* site-export-auth-failure.json in Resources */, E6C1E84A1EF21FC100D139D9 /* is-passwordless-account-success.json in Resources */, + 3FF874352B8F3D0C00EB8AFA /* wp-forbidden.json in Resources */, + 3FF8742F2B8F3D0C00EB8AFA /* wp-reusable-blocks.json in Resources */, BA3F139224A0AB54006367A3 /* plugin-install-already-installed.json in Resources */, - FFA4D4B02423B33800BF5180 /* wp-forbidden.json in Resources */, 93BD27591EE73442002BB00B /* is-available-email-failure.json in Resources */, 74D67F171F15C2D70010C5ED /* site-users-update-role-success.json in Resources */, 74C473B11EF31A19009918F2 /* site-delete-success.json in Resources */, + 3F21ECC52B8DCDCF00DCE8DD /* xmlrpc-bad-username-password-error.xml in Resources */, 465F8894263B09AE00F4C950 /* wp-block-editor-v1-settings-success-NotThemeJSON.json in Resources */, 93AEA69326CE4EED009502D2 /* me-settings-close-account-failure.json in Resources */, E14694031F344F71004052C8 /* site-plugins-error.json in Resources */, C738CAF728622B94001BE107 /* qrlogin-authenticate-200.json in Resources */, 829BA4311FACF187003ADEEA /* activity-rewind-status-success.json in Resources */, - 1D969EB329D45745001FE37C /* wp-reusable-blocks.json in Resources */, 93BD27571EE73442002BB00B /* auth-send-login-email-no-user-failure.json in Resources */, 9A88174C223C01E400A3AB20 /* jetpack-service-success.json in Resources */, + 3FF874342B8F3D0C00EB8AFA /* WordPressComOAuthAuthenticateSignature.json in Resources */, 9A881755223C01E400A3AB20 /* jetpack-service-error-activation-response.json in Resources */, 9A88174D223C01E400A3AB20 /* jetpack-service-failure.json in Resources */, 7403A2FB1EF06FEB00DED7DC /* me-settings-change-invalid-input-failure.json in Resources */, @@ -2982,23 +3120,23 @@ FA79F1962591809C00D235A9 /* backup-get-backup-status-in-progress-success.json in Resources */, 4A3239662B7314E200EFD2A8 /* self-hosted-plugins-get.json in Resources */, 7403A2F51EF06FEB00DED7DC /* me-settings-bad-json-failure.json in Resources */, + 3FF874272B8F3D0B00EB8AFA /* xmlrpc-response-invalid.html in Resources */, 9AB6D64E218731AB0008F274 /* post-revisions-mapping-success.json in Resources */, 404057C7221B36070060250C /* stats-search-term-result.json in Resources */, 7403A2F41EF06FEB00DED7DC /* me-settings-auth-failure.json in Resources */, FA87FE0B24EB4419003FBEE3 /* reader-post-comments-subscribe-success.json in Resources */, 930999581F16598A00F006A1 /* get-single-theme-v1.1.json in Resources */, - 74B335E61F06F6E90053A184 /* WordPressComRestApiMedia.json in Resources */, 74FC6F421F191C1D00112505 /* notifications-load-hash.json in Resources */, 98F884D626BC6909009ADF57 /* site-comments-success.json in Resources */, 930999571F16598A00F006A1 /* get-purchased-themes-v1.1.json in Resources */, + 3FF8742D2B8F3D0B00EB8AFA /* WordPressComSocial2FACodeSuccess.json in Resources */, E6C1E8491EF21FC100D139D9 /* is-passwordless-account-no-account-found.json in Resources */, 7403A2F81EF06FEB00DED7DC /* me-settings-change-display-name-success.json in Resources */, 9A881751223C01E400A3AB20 /* jetpack-service-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 */, - FFE247B020C891E6002DF3A2 /* WordPressComAuthenticateWithIDToken2FANeededSuccess.json in Resources */, 8B2F4BEB24ABCA700056C08A /* reader-cards-success.json in Resources */, + 3FF874202B8F3D0B00EB8AFA /* WordPressComRestApiMultipleErrors.json in Resources */, 436D563E2118E34D00CEAA33 /* supported-states-success.json in Resources */, D813437821F6D7DC0060D99A /* site-segments-single.json in Resources */, 93BD27561EE73442002BB00B /* auth-send-login-email-invalid-secret-failure.json in Resources */, @@ -3007,6 +3145,7 @@ 436D564C211CCCB900CEAA33 /* domain-contact-information-response-success.json in Resources */, FFA4D4AD2423B1FE00BF5180 /* wp-admin-post-new.html in Resources */, C738CAF528622953001BE107 /* qrlogin-validate-expired-401.json in Resources */, + 3FF874222B8F3D0B00EB8AFA /* WordPressComOAuthWrongPasswordFail.json in Resources */, 937250EC267A15060086075F /* stats-referrer-mark-as-spam.json in Resources */, F3FF8A23279C954100E5C90F /* site-email-followers-get-success.json in Resources */, 465F889A263B09BF00F4C950 /* wp-block-editor-v1-settings-success-ThemeJSON.json in Resources */, @@ -3019,6 +3158,7 @@ 4625BAF7253E130900C04AAD /* page-layout-blog-layouts-malformed.json in Resources */, 73A2F38E21E7FD9B00388609 /* site-verticals-prompt.json in Resources */, 74D67F141F15C2D70010C5ED /* site-roles-bad-json-failure.json in Resources */, + 3FF874232B8F3D0B00EB8AFA /* xmlrpc-bad-username-or-password-error.xml in Resources */, 9A2D0B31225E1245009E585F /* jetpack-service-check-site-failure-data.json in Resources */, 40E4698B2017C2840030DB5F /* plugin-directory-popular.json in Resources */, 74C473B91EF325F6009918F2 /* site-delete-missing-status-failure.json in Resources */, @@ -3037,6 +3177,7 @@ 1DF972BF29B107E7007A72BC /* videopress-private-video.json in Resources */, 8B749E8A25AF819700023F03 /* jetpack-capabilities-malformed.json in Resources */, 93BD27551EE73442002BB00B /* auth-send-login-email-invalid-client-failure.json in Resources */, + 3FF874282B8F3D0B00EB8AFA /* WordPressComOAuthRequestChallenge.json in Resources */, 826016FD1F9FAF6300533B6C /* activity-log-bad-json-failure.json in Resources */, 74C473CD1EF336BD009918F2 /* site-active-purchases-bad-json-failure.json in Resources */, 436D5645211B801100CEAA33 /* validate-domain-contact-information-response-success.json in Resources */, @@ -3049,6 +3190,7 @@ 93BD27661EE73442002BB00B /* me-success.json in Resources */, 404057DC221C9FD80060250C /* stats-referrer-data.json in Resources */, FA87FE0924EB3FEF003FBEE3 /* reader-post-comments-subscription-status-success.json in Resources */, + 3FF874212B8F3D0B00EB8AFA /* WordPressComRestApiMedia.json in Resources */, E6B0461325E5B6F500DF6F4F /* sites-invites-links-disable.json in Resources */, 98E1A60D27AB621200C61A7F /* xmlrpc-site-comment-success.xml in Resources */, 74C473C71EF334D4009918F2 /* site-active-purchases-none-active-success.json in Resources */, @@ -3057,37 +3199,32 @@ 98E1A60B27AB604600C61A7F /* site-comment-success.json in Resources */, 829BA4321FACF187003ADEEA /* activity-rewind-status-restore-finished.json in Resources */, F3FF8A29279C991B00E5C90F /* site-email-followers-get-success-more-pages.json in Resources */, + 3FF873F12B8F2C7100EB8AFA /* me-settings-change-email-success.json in Resources */, 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 /* jetpack-service-error-invalid-credentials.json in Resources */, E670CD722277A85000E75735 /* plans-me-sites-success.json in Resources */, - 7403A2F91EF06FEB00DED7DC /* me-settings-change-email-success.json in Resources */, 439A44DC2107CE3C00795ED7 /* site-plans-v3-empty-failure.json in Resources */, 9AB6D64F218731AB0008F274 /* post-revisions-failure.json in Resources */, 0CB190612A2A6A13004D3E80 /* blaze-campaigns-search.json in Resources */, FA42615E2570C713003A01E2 /* activity-groups-success.json in Resources */, 984E34F422EF9465005C3F92 /* stats-file-downloads.json in Resources */, - 93F50A3C1F226C0100B5BEBA /* WordPressComRestApiFailThrottled.json in Resources */, - 740B23ED1F17FB7E00067A2A /* xmlrpc-bad-username-password-error.xml in Resources */, FA4261722570CC91003A01E2 /* activity-groups-bad-json-failure.json in Resources */, 3297E28C25647E0300287D21 /* jetpack-scan-enqueue-failure.json in Resources */, 9A881754223C01E400A3AB20 /* jetpack-service-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 */, 93BD27581EE73442002BB00B /* auth-send-login-email-success.json in Resources */, - 74B335E01F06F6290053A184 /* WordPressComRestApiFailInvalidInput.json in Resources */, F3FF8A27279C967200E5C90F /* site-email-followers-get-failure.json in Resources */, - 4A05E7A82B34EAF400C25E3B /* xmlrpc-response-mobile-plugin-redirect.html in Resources */, FE20A6A6282BC68D0025E975 /* blogging-prompts-settings-fetch-success.json in Resources */, FFE247C320C9D749002DF3A2 /* reader-site-search-blog-id-fallback.json in Resources */, C738CAF3286226D6001BE107 /* qrlogin-validate-400.json in Resources */, 93BD27651EE73442002BB00B /* me-sites-visibility-success.json in Resources */, 404057D0221C46790060250C /* stats-videos-data.json in Resources */, E1787DB0200E564B004CB3AF /* timezones.json in Resources */, + 3FF8741F2B8F3D0B00EB8AFA /* xmlrpc-response-getpost.xml in Resources */, 93BD275E1EE73442002BB00B /* me-bad-json-failure.json in Resources */, - FFE247AF20C891E6002DF3A2 /* WordPressComOAuthWrongPasswordFail.json in Resources */, F194E1252417EE7E00874408 /* atomic-get-auth-cookie-success.json in Resources */, 731BA83A21DED358000FDFCD /* site-creation-success.json in Resources */, FEFFD99726C158F400F34231 /* share-app-content-success.json in Resources */, @@ -3104,9 +3241,9 @@ FE5096632A309DE000DDD071 /* jetpack-social-no-publicize.json in Resources */, 9AB6D64B21872A0D0008F274 /* post-revisions-success.json in Resources */, 1DF972C029B107E7007A72BC /* videopress-public-video.json in Resources */, + 3FF874242B8F3D0B00EB8AFA /* WordPressComRestApiFailThrottled.json in Resources */, C92EFF6925E7403F00E0308D /* common-starter-site-designs-success.json in Resources */, 7433BC131EFC45C7002D9E92 /* site-plans-bad-json-failure.json in Resources */, - 74B335DE1F06F5A50053A184 /* WordPressComRestApiFailInvalidJSON.json in Resources */, 3297E1E42564683600287D21 /* jetpack-scan-in-progress.json in Resources */, E689431E21B0A1A800C5E4A7 /* plans-mobile-success.json in Resources */, BA8EA71724A0763900D5CC9F /* site-plugins-malformed.json in Resources */, @@ -3115,10 +3252,10 @@ 74585BA11F0D6F5300E7E667 /* domain-service-empty.json in Resources */, 74C473C51EF33242009918F2 /* site-active-purchases-two-active-success.json in Resources */, 4A3239682B74319400EFD2A8 /* self-hosted-plugins-install.json in Resources */, + 3F21ECC72B8DCE4500DCE8DD /* wp-com-rest-api-fail-throttled.json in Resources */, BA7366C62490CE3100BCAC94 /* plugin-service-remote-featured.json in Resources */, 74C473BF1EF32B64009918F2 /* site-export-bad-json-failure.json in Resources */, 40819775221E497D00A298E4 /* stats-published-posts.json in Resources */, - FFA4D4B12423B33800BF5180 /* wp-pages.json in Resources */, 74D67F151F15C2D70010C5ED /* site-roles-success.json in Resources */, 8BFB4E6625B07905004D026E /* jetpack-capabilities-34197361-success.json in Resources */, 9A881753223C01E400A3AB20 /* jetpack-service-error-site-is-jetpack.json in Resources */, @@ -3133,25 +3270,24 @@ 74B040721EF8B366002C6258 /* rest-site-settings.json in Resources */, 8B749E8625AF808600023F03 /* jetpack-capabilities-107159616-success.json in Resources */, 93BD27611EE73442002BB00B /* me-sites-empty-success.json in Resources */, - 264E09B72AD25ED9004B5A5F /* WordPressComOAuthAuthenticateSignature.json in Resources */, + 3FF874312B8F3D0C00EB8AFA /* WordPressComRestApiFailInvalidJSON.json in Resources */, + 3FF8741E2B8F3D0B00EB8AFA /* me-settings-success-.json in Resources */, 98EA910526BC96B8004098A1 /* xmlrpc-site-comments-success.xml in Resources */, 40E4698D2017D2E30030DB5F /* plugin-directory-new.json in Resources */, 4081977C221F153B00A298E4 /* stats-visits-day.json in Resources */, 9A881750223C01E400A3AB20 /* jetpack-service-error-install-failure.json in Resources */, 74FC6F431F191C1D00112505 /* notifications-load-all.json in Resources */, + 3FF8742C2B8F3D0B00EB8AFA /* xmlrpc-response-mobile-plugin-redirect.html in Resources */, + 3FF8742A2B8F3D0B00EB8AFA /* WordPressComOAuthNeedsWebauthnMFA.json in Resources */, 74C473C11EF32C74009918F2 /* site-export-missing-status-failure.json in Resources */, 1DF972C129B107E7007A72BC /* videopress-site-default-video.json in Resources */, - 264E09B92AD2709A004B5A5F /* WordPressComOAuthNeedsWebauthnMFA.json in Resources */, 828A2400201B671F004F6859 /* activity-restore-success.json in Resources */, 826016FC1F9FAF6300533B6C /* activity-log-success-2.json in Resources */, C738CAF928622BB1001BE107 /* qrlogin-authenticate-failed-400.json in Resources */, 74D67F1E1F15C3240010C5ED /* people-send-invitation-failure.json in Resources */, - 4A05E7A62B34142200C25E3B /* xmlrpc-response-invalid.html in Resources */, - 7403A3001EF06FEB00DED7DC /* me-settings-success.json in Resources */, F4B0F47C2ACB4B74003ABC61 /* get-all-domains-response.json in Resources */, FEE48EF82A4B3E43008A48E0 /* sites-site-active-features.json in Resources */, 439A44DE2107CF6F00795ED7 /* site-plans-v3-bad-json-failure.json in Resources */, - 74B335EA1F06F76B0053A184 /* xmlrpc-response-getpost.xml in Resources */, FEE4EF6127303361003CDA3C /* comments-v2-edit-context-success.json in Resources */, 740B23E91F17FB4200067A2A /* xmlrpc-wp-getpost-invalid-id-failure.xml in Resources */, 930999561F16598A00F006A1 /* get-multiple-themes-v1.2.json in Resources */, @@ -3168,7 +3304,6 @@ 740B23E31F17FB4200067A2A /* xmlrpc-metaweblog-editpost-change-type-failure.xml in Resources */, 9AEAA775215E774A00876E62 /* site-quick-start-failure.json in Resources */, 74D67F311F15C3740010C5ED /* site-followers-delete-failure.json in Resources */, - 74B335E81F06F7200053A184 /* WordPressComRestApiFailUnauthorized.json in Resources */, FFE247C220C9D749002DF3A2 /* reader-site-search-no-blog-or-feed-id.json in Resources */, C92EFF6D25E741E900E0308D /* common-starter-site-designs-malformed.json in Resources */, BA4BFC582498C04D005C83E7 /* plugin-update-jetpack-already-updated.json in Resources */, @@ -3183,15 +3318,17 @@ 40F88F621F85799A00AE3FAF /* auth-send-verification-email-success.json in Resources */, 740B23E81F17FB4200067A2A /* xmlrpc-wp-getpost-bad-xml-failure.xml in Resources */, 74585B951F0D53B800E7E667 /* domain-service-all-domain-types.json in Resources */, - FFE247B220C891E6002DF3A2 /* WordPressComAuthenticateWithIDTokenBearerTokenSuccess.json in Resources */, 74D67F371F15C3740010C5ED /* site-users-delete-success.json in Resources */, 74D67F341F15C3740010C5ED /* site-users-delete-bad-json-failure.json in Resources */, + 3FF874292B8F3D0B00EB8AFA /* WordPressComRestApiFailUnauthorized.json in Resources */, + 3FF874302B8F3D0C00EB8AFA /* WordPressComRestApiFailRequestInvalidToken.json in Resources */, 7403A2FF1EF06FEB00DED7DC /* me-settings-revert-email-success.json in Resources */, FEB7A88F271873BD00A8CF85 /* reader-post-comments-update-notification-success.json in Resources */, - 74B335E21F06F6730053A184 /* WordPressComRestApiFailRequestInvalidToken.json in Resources */, 74C473BB1EF328D8009918F2 /* site-export-success.json in Resources */, 7403A2FE1EF06FEB00DED7DC /* me-settings-change-web-address-success.json in Resources */, + 3F21ECBE2B8DAAC500DCE8DD /* me-settings-success.json in Resources */, 9A88174F223C01E400A3AB20 /* jetpack-service-error-forbidden.json in Resources */, + 3FF8742B2B8F3D0B00EB8AFA /* wp-pages.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 */, @@ -3205,16 +3342,17 @@ FE5096562A13B7F200DDD071 /* sites-external-services.json in Resources */, 93BD27601EE73442002BB00B /* me-sites-bad-json-failure.json in Resources */, 17BF9A7320C7E18200BF57D2 /* reader-site-search-failure.json in Resources */, - FFE247B120C891E6002DF3A2 /* WordPressComSocial2FACodeSuccess.json in Resources */, + 3FF8742E2B8F3D0C00EB8AFA /* WordPressComAuthenticateWithIDTokenExistingUserNeedsConnection.json in Resources */, 9AEAA774215E774A00876E62 /* site-quick-start-success.json in Resources */, 93BD275D1EE73442002BB00B /* me-auth-failure.json in Resources */, F3FF8A25279C960F00E5C90F /* site-email-followers-get-auth-failure.json in Resources */, C9F991B927D5A52600135131 /* domain-service-invalid-query.json in Resources */, + 3FF874252B8F3D0B00EB8AFA /* xmlrpc-response-list-methods.xml in Resources */, 74D67F361F15C3740010C5ED /* site-users-delete-site-owner-failure.json in Resources */, BA3F139424A0B783006367A3 /* plugin-modify-malformed-response.json in Resources */, 74C473CB1EF33696009918F2 /* site-active-purchases-auth-failure.json in Resources */, - FFE247B520C891E6002DF3A2 /* WordPressComAuthenticateWithIDTokenExistingUserNeedsConnection.json in Resources */, - 4A05E7AA2B34FC4300C25E3B /* xmlrpc-response-list-methods.xml in Resources */, + 3FF874332B8F3D0C00EB8AFA /* WordPressComOAuthSuccess.json in Resources */, + 3FF874262B8F3D0B00EB8AFA /* WordPressComAuthenticateWithIDTokenBearerTokenSuccess.json in Resources */, BA8EA71B24A07B2200D5CC9F /* plugin-service-remote-auth-failure.json in Resources */, FA79F1872591730D00D235A9 /* backup-get-backup-status-complete-success.json in Resources */, 74D67F381F15C3740010C5ED /* site-viewers-delete-auth-failure.json in Resources */, @@ -3326,6 +3464,7 @@ F181EA0227184D3D00F26141 /* ProductServiceRemote.swift in Sources */, 32E1DD23236AA09A008914B0 /* RemotePostAutosave.swift in Sources */, 464BAB0B262F6736006AEED5 /* RemoteBlockEditorSettings.swift in Sources */, + 3FF874052B8F3B5F00EB8AFA /* AppTransportSecuritySettings.swift in Sources */, FEFFD99126C1347D00F34231 /* ShareAppContentServiceRemote.swift in Sources */, 74585B8E1F0D51A100E7E667 /* DomainsServiceRemote.swift in Sources */, FEAE3AC7298AC2A300E05A24 /* JetpackProxyServiceRemote.swift in Sources */, @@ -3334,6 +3473,7 @@ 7430C9A41F1927180051B8E6 /* ReaderPostServiceRemote.m in Sources */, C797196D2679007B0072F984 /* JetpackPluginManagementClient.swift in Sources */, 408197882220A35000A298E4 /* StatsLastPostInsight.swift in Sources */, + 3FF874072B8F3B5F00EB8AFA /* WordPressComRestApiErrorDomain.swift in Sources */, 803DE80F28FFA787007D4E9C /* RemoteConfigRemote.swift in Sources */, F9E56DF624EB11EF00916770 /* FeatureFlag.swift in Sources */, 8B2F4BE724ABC8A90056C08A /* ReaderPostServiceRemote+Cards.swift in Sources */, @@ -3350,41 +3490,36 @@ E6B0460925E5B4DD00DF6F4F /* RemoteInviteLink.swift in Sources */, 436D56332118D7AA00CEAA33 /* TransactionsServiceRemote.swift in Sources */, 93BD27721EE737A9002BB00B /* ServiceRemoteWordPressXMLRPC.m in Sources */, - 4A05E79A2B2FDC3200C25E3B /* WordPressOrgRestApi.swift in Sources */, + 3FF873FF2B8F3B5F00EB8AFA /* WordPressComOAuthClient.swift in Sources */, C76F456825B9F30E00BFEC87 /* JetpackScanHistory.swift in Sources */, E1D6B556200E46F300325669 /* WPTimeZone.swift in Sources */, 93F50A3F1F227C8900B5BEBA /* UsersServiceRemoteXMLRPC.swift in Sources */, - 4A11239E2B1926D1004690CF /* HTTPClient.swift in Sources */, 8C5734F925681A6A005E61EE /* Enum+UnknownCaseRepresentable.swift in Sources */, 9F3E0BA32087345F009CB5BA /* ReaderTopicServiceRemote+Subscription.swift in Sources */, 9F3E0B9E208733C3009CB5BA /* ReaderServiceDeliveryFrequency.swift in Sources */, 74E2295E1F1E777B0085F7F2 /* RemoteSharingButton.swift in Sources */, - 4A05E7962B2FCB6400C25E3B /* NonceRetrieval.swift in Sources */, 93BD27701EE737A8002BB00B /* ServiceRemoteWordPressComREST.m in Sources */, E61A51A621B172A900A5F902 /* RemoteWpcomPlan.swift in Sources */, 0CED1FE82B617CF300E6DD52 /* AtomicSiteServiceRemote.swift in Sources */, - 93BD277F1EE73944002BB00B /* WordPressComOAuthClient.swift in Sources */, + 3FF874062B8F3B5F00EB8AFA /* WordPressComRestApi.swift in Sources */, 740B23B91F17EC7300067A2A /* PostServiceRemoteREST.m in Sources */, - 93BD27801EE73944002BB00B /* WordPressComRestApi.swift in Sources */, 404057D2221C56AB0060250C /* StatsTopCountryTimeIntervalData.swift in Sources */, E11C2AD21FA77FB90023BDE2 /* SitePlugin.swift in Sources */, 4A68E3DF29407100004AC3DC /* RemoteReaderTopic.swift in Sources */, + 3FF873F52B8F3B5F00EB8AFA /* MultipartForm.swift in Sources */, 74A44DCC1F13C533006CD8F4 /* NotificationSyncServiceRemote.swift in Sources */, 8BB66DB02523C181000B29DA /* ReaderPostServiceRemote+V2.swift in Sources */, 74E229501F1E741B0085F7F2 /* RemotePublicizeConnection.swift in Sources */, 40E7FEB722106A8D0032834E /* StatsCommentsInsight.swift in Sources */, 9856BE962630B5C200C12FEB /* RemoteUser+Likes.swift in Sources */, - 57BCD3D426209D9500292CB3 /* AppTransportSecuritySettings.swift in Sources */, 9311A6891F22625A00704AC9 /* TaxonomyServiceRemoteREST.m in Sources */, 9AB6D647218705E90008F274 /* RemoteDiff.swift in Sources */, - 93BD277C1EE73944002BB00B /* HTTPAuthenticationAlertController.swift in Sources */, 7433BC011EFC4505002D9E92 /* PlanServiceRemote.swift in Sources */, 4041405E220F9EF500CF7C5B /* StatsDotComFollowersInsight.swift in Sources */, 74650F721F0EA1A700188EDB /* GravatarServiceRemote.swift in Sources */, B5969E1D20A49AC4005E9DF1 /* NSString+MD5.m in Sources */, 01438D3B2B6A36BF0097D60A /* StatsTotalsSummaryData.swift in Sources */, 4A68E3E1294076C1004AC3DC /* RemoteReaderSiteInfo.swift in Sources */, - 3F391E1A2B50F3EB007975C4 /* Result+Callback.swift in Sources */, 8236EB4D2024B9F8007C7CF9 /* RemoteBlogJetpackModulesSettings.swift in Sources */, 73A2F38A21E7F81E00388609 /* WordPressComServiceRemote+SiteVerticalsPrompt.swift in Sources */, 740B23BB1F17EC7300067A2A /* PostServiceRemoteXMLRPC.m in Sources */, @@ -3397,12 +3532,13 @@ 4AE278442B2FAF6200E4D9B1 /* HTTPProtocolHelpers.swift in Sources */, FA68CD152993C6CD00FA4C29 /* BlazeServiceRemote.swift in Sources */, 4081976F221DDE9B00A298E4 /* StatsTopPostsTimeIntervalData.swift in Sources */, + 3FF873FD2B8F3B5F00EB8AFA /* StringEncoding+IANA.swift in Sources */, 9311A68B1F22625A00704AC9 /* TaxonomyServiceRemoteXMLRPC.m in Sources */, C797196E2679007B0072F984 /* SelfHostedPluginManagementClient.swift in Sources */, 40414060220F9F1F00CF7C5B /* StatsAllTimesInsight.swift in Sources */, - 93BD277E1EE73944002BB00B /* NSDate+WordPressJSON.m in Sources */, 8B2F4BED24ABCAEF0056C08A /* Decodable+Dictionary.swift in Sources */, E194CB731FBDEF6500B0A8B8 /* PluginState.swift in Sources */, + 3FF873FE2B8F3B5F00EB8AFA /* WordPressAPIError.swift in Sources */, 4A57A6882B54C68C008D0660 /* Constants.m in Sources */, 404057D6221C92660060250C /* StatsTopClicksTimeIntervalData.swift in Sources */, 9AF4F2FC218331DC00570E4B /* PostServiceRemoteREST+Revisions.swift in Sources */, @@ -3419,23 +3555,26 @@ 93F50A381F226B9300B5BEBA /* WordPressComServiceRemote.m in Sources */, 0CED1FEB2B617D7D00E6DD52 /* AtomicLogs.swift in Sources */, 9F4E52002088E38200424676 /* ObjectValidation.swift in Sources */, + 3FF874012B8F3B5F00EB8AFA /* NonceRetrieval.swift in Sources */, 7EC60EC022DC5D7C00FB0336 /* EditorSettings.swift in Sources */, 7403A3021EF0726E00DED7DC /* AccountSettings.swift in Sources */, 0847B92C2A4442730044D32F /* IPLocationRemote.swift in Sources */, + 3FF874042B8F3B5F00EB8AFA /* NSDate+RFC3339.swift in Sources */, 40E7FEA9220FA4060032834E /* StatsEmailFollowersInsight.swift in Sources */, 404057DA221C9D560060250C /* StatsTopReferrersTimeIntervalData.swift in Sources */, 826016F11F9FA13A00533B6C /* ActivityServiceRemote.swift in Sources */, + 3FF874082B8F3B5F00EB8AFA /* HTTPAuthenticationAlertController.swift in Sources */, + 3FF874002B8F3B5F00EB8AFA /* WebauthChallengeInfo.swift in Sources */, 74BA04FA1F06DC3900ED5CD8 /* RemoteComment.m in Sources */, 7E3E7A4C20E443AA0075D159 /* NSMutableParagraphStyle+extensions.swift in Sources */, 40F98809221AC88700B7B369 /* StatsPostingStreakInsight.swift in Sources */, 465F889E263B0C5500F4C950 /* BlockEditorSettingsServiceRemote.swift in Sources */, - E632D7781F6E047400297F6D /* SocialLogin2FANonceInfo.swift in Sources */, 32FC1D29255C91ED00CD0A7B /* JetpackScanServiceRemote.swift in Sources */, 9F3E0B9B208732B3009CB5BA /* RemoteReaderSiteInfoSubscription.swift in Sources */, 7403A2E41EF06ED500DED7DC /* AccountSettingsRemote.swift in Sources */, + 3FF873F82B8F3B5F00EB8AFA /* WordPressOrgRestApi.swift in Sources */, 3236F77824AE34B40088E8F3 /* ReaderTopicServiceRemote+Interests.swift in Sources */, FE20A6A4282A96C00025E975 /* RemoteBloggingPromptsSettings.swift in Sources */, - 93BD27831EE73944002BB00B /* WordPressRSDParser.swift in Sources */, FACBDD1A25ECA2FB0026705B /* ReaderPostServiceRemote+RelatedPosts.swift in Sources */, 7328420421CD786C00126755 /* WordPressComServiceRemote+SiteCreation.swift in Sources */, 32FC1D28255C91ED00CD0A7B /* JetpackScan.swift in Sources */, @@ -3446,15 +3585,12 @@ 7397F01A220A072500C723F3 /* ActivityServiceRemote_ApiVersion1_0.swift in Sources */, 4A68E3D429406AA0004AC3DC /* RemoteMenuItem.swift in Sources */, 8B2F4BEF24ACCC120056C08A /* RemoteReaderCard.swift in Sources */, - 4A11239C2B1926B7004690CF /* HTTPRequestBuilder.swift in Sources */, 40E7FEB1220FB3B60032834E /* StatsAnnualAndMostPopularTimeInsight.swift in Sources */, 3F758FD324F6C68200BBA2FC /* AnnouncementServiceRemote.swift in Sources */, - 4A1123A02B196821004690CF /* MultipartForm.swift in Sources */, FAB4F32324EC072700F259BA /* ReaderPostServiceRemote+Subscriptions.swift in Sources */, 82FFBF561F460DD400F4573F /* BlogJetpackSettingsServiceRemote.swift in Sources */, 3297E15625645C7D00287D21 /* JetpackCredentials.swift in Sources */, F1B7F4FC272376A8004215CD /* NSCharacterSet+URLEncode.swift in Sources */, - 4A11239A2B19269A004690CF /* WordPressAPIError.swift in Sources */, 404057C9221B789B0060250C /* StatsTopAuthorsTimeIntervalData.swift in Sources */, FEFFD99326C141A800F34231 /* RemoteShareAppContent.swift in Sources */, 74BA04F61F06DC0A00ED5CD8 /* CommentServiceRemoteXMLRPC.m in Sources */, @@ -3465,6 +3601,7 @@ 4624222D2548BA0F002B8A12 /* RemoteSiteDesign.swift in Sources */, 74D67F061F1528470010C5ED /* PeopleServiceRemote.swift in Sources */, 98DC787522BAEBF200267279 /* StatsAllAnnualInsight.swift in Sources */, + 3FF873FA2B8F3B5F00EB8AFA /* WordPressRSDParser.swift in Sources */, 740B23C31F17EE8000067A2A /* RemotePostCategory.m in Sources */, 8B2F4BF124ACE3C30056C08A /* RemoteReaderInterest.swift in Sources */, 74B5F0E71EF8699C00B411E7 /* RemotePostType.m in Sources */, @@ -3473,6 +3610,7 @@ FEE4EF59272FF78C003CDA3C /* CommentServiceRemoteREST+ApiV2.swift in Sources */, 984E34EB22EF7209005C3F92 /* StatsFileDownloadsTimeIntervalData.swift in Sources */, 465F88A2263B325C00F4C950 /* ChecksumUtil.swift in Sources */, + 3FF873F62B8F3B5F00EB8AFA /* Result+Callback.swift in Sources */, C7A09A52284104DB003096ED /* QRLoginServiceRemote.swift in Sources */, 4A68E3DD294070A7004AC3DC /* RemoteReaderSite.swift in Sources */, 40AB1ADA200FED25009B533D /* PluginDirectoryFeedPage.swift in Sources */, @@ -3480,6 +3618,7 @@ 74A44DCB1F13C533006CD8F4 /* NotificationSettingsServiceRemote.swift in Sources */, FAD1344525908F5F00A8FEB1 /* JetpackBackupServiceRemote.swift in Sources */, F1BB7806240FB90B0030ADDC /* AtomicAuthenticationServiceRemote.swift in Sources */, + 3FF873FB2B8F3B5F00EB8AFA /* SocialLogin2FANonceInfo.swift in Sources */, 404057CE221C38130060250C /* StatsTopVideosTimeIntervalData.swift in Sources */, 7E0D64FF22D855700092AD10 /* EditorServiceRemote.swift in Sources */, 9AF4F2FF2183346B00570E4B /* RemoteRevision.swift in Sources */, @@ -3499,13 +3638,12 @@ F41D98EA2B48602B004EC050 /* SessionDetails.swift in Sources */, 436D563C2118E18D00CEAA33 /* WPState.swift in Sources */, 439A44DA2107C93000795ED7 /* RemotePlan_ApiVersion1_3.swift in Sources */, - 93BD27811EE73944002BB00B /* WordPressOrgXMLRPCApi.swift in Sources */, - 4A57A6832B54A326008D0660 /* WordPressAPIError+NSErrorBrdige.swift in Sources */, 439A44D62107C66A00795ED7 /* JSONDecoderExtension.swift in Sources */, B5A4822B20AC6C0B009D95F6 /* WPKitLogging.swift in Sources */, B5A4822E20AC6C1A009D95F6 /* WPKitLogging.m in Sources */, 7430C9A61F1927180051B8E6 /* ReaderSiteServiceRemote.m in Sources */, FEE4EF57272FDD4B003CDA3C /* RemoteCommentV2.swift in Sources */, + 3FF873F72B8F3B5F00EB8AFA /* HTTPClient.swift in Sources */, 7430C9B21F1927C50051B8E6 /* RemoteReaderPost.m in Sources */, 74A44DCD1F13C533006CD8F4 /* PushAuthenticationServiceRemote.swift in Sources */, 0CB1905E2A2A5E83004D3E80 /* BlazeCampaign.swift in Sources */, @@ -3514,19 +3652,19 @@ 74A44DD11F13C64B006CD8F4 /* RemoteNotificationSettings.swift in Sources */, FEF7419D28085D89002C4203 /* RemoteBloggingPrompt.swift in Sources */, 74DA56331F06EAF000FE9BF4 /* MediaServiceRemoteREST.m in Sources */, - 264E09B32AD0B3BB004B5A5F /* WebauthChallengeInfo.swift in Sources */, 17CD0CC320C58A0D000D9620 /* ReaderSiteSearchServiceRemote.swift in Sources */, 74DA563B1F06EB3000FE9BF4 /* RemoteMedia.m in Sources */, 9311A6861F22625A00704AC9 /* RemoteTaxonomyPaging.m in Sources */, - 93BD27821EE73944002BB00B /* WordPressOrgXMLRPCValidator.swift in Sources */, F9E56DF824EB125600916770 /* FeatureFlagRemote.swift in Sources */, 40247DFC2120E69600AE1C3C /* AutomatedTransferStatus.swift in Sources */, 730E869F21E44EFD00753E1A /* WordPressComServiceRemote+SiteVerticals.swift in Sources */, 740B23C51F17EE8000067A2A /* RemotePost.m in Sources */, 404057C5221B30400060250C /* StatsSearchTermTimeIntervalData.swift in Sources */, + 3FF874032B8F3B5F00EB8AFA /* HTTPRequestBuilder.swift in Sources */, 40247DFA2120D8E100AE1C3C /* AutomatedTransferService.swift in Sources */, 74E2295B1F1E77290085F7F2 /* KeyringConnection.swift in Sources */, 74B5F0DA1EF8299B00B411E7 /* BlogServiceRemoteXMLRPC.m in Sources */, + 3FF873F92B8F3B5F00EB8AFA /* WordPressOrgXMLRPCValidator.swift in Sources */, E1EF5D5D1F9F329900B6D53E /* SitePluginCapabilities.swift in Sources */, 4A68E3CD29404181004AC3DC /* RemoteBlog.swift in Sources */, 7E3E7A4520E443060075D159 /* NSAttributedString+extensions.swift in Sources */, @@ -3535,13 +3673,15 @@ 40E7FEBA2210894B0032834E /* StatsTagsAndCategoriesInsight.swift in Sources */, 439A44D82107C85E00795ED7 /* PlanServiceRemote_ApiVersion1_3.swift in Sources */, 93C674EE1EE834B700BFAF05 /* RemoteBlogSettings.swift in Sources */, + 3FF874022B8F3B5F00EB8AFA /* WordPressOrgXMLRPCApi.swift in Sources */, 436D5641211B7F4400CEAA33 /* DomainContactInformation.swift in Sources */, + 3FF873FC2B8F3B5F00EB8AFA /* Either.swift in Sources */, FA28A3D6259079960082C7B0 /* JetpackRestoreTypes.swift in Sources */, 32FC20CE255DCC6100CD0A7B /* JetpackScanThreat.swift in Sources */, - 4A5BC1A82B59DE6600C7D037 /* Either.swift in Sources */, FE50965F2A2E42A500DDD071 /* JetpackSocialServiceRemote.swift in Sources */, 3F3195AD266FF94B00397EE7 /* ZendeskMetadata.swift in Sources */, 40A71C6E220E1D8E002E3D25 /* StatsServiceRemoteV2.swift in Sources */, + 3FF874092B8F3B5F00EB8AFA /* WordPressAPIError+NSErrorBrdige.swift in Sources */, 82FFBF521F45F04100F4573F /* RemoteBlogJetpackMonitorSettings.swift in Sources */, 462422292548B98A002B8A12 /* SiteDesignServiceRemote.swift in Sources */, 9309994E1F1657C600F006A1 /* ThemeServiceRemote.m in Sources */, @@ -3558,7 +3698,7 @@ files = ( 4AE2784A2B2FC6C600E4D9B1 /* HTTPHeaderValueParserTests.swift in Sources */, E1E89C6A1FD6BDB1006E7A33 /* PluginDirectoryTests.swift in Sources */, - 4A6B4A862B269D0C00802316 /* URLSessionHelperTests.swift in Sources */, + 3FF874122B8F3B8F00EB8AFA /* WordPressComOAuthClientTests.swift in Sources */, 9F3E0BAA20873773009CB5BA /* MockServiceRequest.swift in Sources */, 8B2F4BE524ABB3C70056C08A /* RemoteReaderPostTests.m in Sources */, 4AA5A1A32AA68F6B00969464 /* MediaLibraryTestSupport.swift in Sources */, @@ -3566,31 +3706,31 @@ 4A3239642B73132B00EFD2A8 /* SelfHostedPluginManagementClientTests.swift in Sources */, 73D5930121E550F500E4CF84 /* SiteVerticalsResponseDecodingTests.swift in Sources */, FE5096682A309E4600DDD071 /* JetpackSocialServiceRemoteTests.swift in Sources */, + 3FF874112B8F3B8800EB8AFA /* HTTPRequestBuilderTests.swift in Sources */, 74A44DD41F13C6D8006CD8F4 /* RemoteNotificationTests.swift in Sources */, 74A923B21F2BE2DF00EC8F92 /* RESTTestable.swift in Sources */, 74155E251EF87DDF00A06AEA /* ServiceRemoteRESTTests.m in Sources */, - 46ABD0EA262EEE0400C7FF24 /* AppTransportSecuritySettingsTests.swift in Sources */, 74D67F0A1F15C24C0010C5ED /* PeopleServiceRemoteTests.swift in Sources */, - 4A1123A22B19690C004690CF /* MultipartFormTests.swift in Sources */, + 3FF874152B8F3B8F00EB8AFA /* WordPressOrgAPITests.swift in Sources */, 9F3E0BAE20873836009CB5BA /* ReaderTopicServiceRemoteTest+Subscriptions.swift in Sources */, - 4A05E79E2B30F3C500C25E3B /* HTTPRequestHelpers.swift in Sources */, BA0637ED2492382200AF8419 /* PluginStateTests.swift in Sources */, 7328420621CD798A00126755 /* WordPressComServiceRemoteTests+SiteCreation.swift in Sources */, FACBDD3825ECB4480026705B /* ReaderPostServiceRemote+RelatedPostsTests.swift in Sources */, F4B0F4802ACB4EA9003ABC61 /* AllDomainsResultDomainTests.swift in Sources */, 74585B901F0D51F900E7E667 /* DomainsServiceRemoteRESTTests.swift in Sources */, BAFA775624ADAB3C000F0D3A /* MockPluginDirectoryEntryProvider.swift in Sources */, + 3FF874142B8F3B8F00EB8AFA /* WordPressComRestApiTests+Locale.swift in Sources */, 3F8308A729EE683500354497 /* ActivityTests.swift in Sources */, 9AB6D64A218727D60008F274 /* PostServiceRemoteRESTRevisionsTest.swift in Sources */, - 01438D382B6A35FB0097D60A /* stats-summary.json in Sources */, 7430C9BD1F192C0F0051B8E6 /* ReaderPostServiceRemoteTests.m in Sources */, 1DC837C229B9F04F009DCD4B /* RemoteVideoPressVideoTests.swift in Sources */, FAD1345125909DEA00A8FEB1 /* JetpackBackupServiceRemoteTests.swift in Sources */, 8B2F4BE924ABC9DC0056C08A /* ReaderPostServiceRemote+CardsTests.swift in Sources */, 40F9880C221ACEEE00B7B369 /* StatsRemoteV2Tests.swift in Sources */, 4625BAEB253E118400C04AAD /* PageLayoutServiceRemoteTests.swift in Sources */, - 4A6B4A842B26974F00802316 /* HTTPRequestBuilderTests.swift in Sources */, + 3FF8740F2B8F3B8800EB8AFA /* NonceRetrievalTests.swift in Sources */, 465F88BF263B54EE00F4C950 /* ChecksumUtilTests.swift in Sources */, + 3FF8740B2B8F3B8800EB8AFA /* MultipartFormTests.swift in Sources */, 826017001F9FD60A00533B6C /* ActivityServiceRemoteTests.swift in Sources */, 93F50A3A1F226BB600B5BEBA /* WordPressComServiceRemoteRestTests.swift in Sources */, E13EE14C1F332C4400C15787 /* PluginServiceRemoteTests.swift in Sources */, @@ -3604,19 +3744,20 @@ 74B5F0DE1EF82A9600B411E7 /* BlogServiceRemoteRESTTests.m in Sources */, FED77253298B819900C2346E /* JetpackProxyServiceRemoteTests.swift in Sources */, ABD95B7F25DD6C4B00735BEE /* CommentServiceRemoteRESTLikesTests.swift in Sources */, + 3FF874182B8F3B9000EB8AFA /* URLSessionHelperTests.swift in Sources */, 8B749E8225AF7DDA00023F03 /* JetpackCapabilitiesServiceRemoteTests.swift in Sources */, FEFFD99B26C1598F00F34231 /* ShareAppContentServiceRemoteTests.swift in Sources */, FEEFD8B7280EC91B00A3E261 /* BloggingPromptsServiceRemoteTests.swift in Sources */, - 73B3DAD621FBB20D00B2CF18 /* WordPressComRestApiTests+Locale.swift in Sources */, + 3FF874192B8F3B9000EB8AFA /* WordPressAPIErrorTests.swift in Sources */, C738CAEF28622325001BE107 /* QRLoginServiceRemoteTests.swift in Sources */, - 4A05E79C2B2FDC6100C25E3B /* WordPressOrgAPITests.swift in Sources */, 3297E1DE2564653A00287D21 /* JetpackScanServiceRemoteTests.swift in Sources */, - 01438D352B6A2B2C0097D60A /* stats-visits-month-unit-week.json in Sources */, 9F3E0BAC20873785009CB5BA /* ServiceRequestTest.swift in Sources */, 4624223E2548C26D002B8A12 /* SiteDesignServiceRemoteTests.swift in Sources */, + 3FF8740D2B8F3B8800EB8AFA /* Bundle+SPMSupport.swift in Sources */, 4A1DEF44293051BC00322608 /* LoggingTests.swift in Sources */, 740B23D31F17F6BB00067A2A /* PostServiceRemoteXMLRPCTests.swift in Sources */, 93188D221F2264E60028ED4D /* TaxonomyServiceRemoteRESTTests.m in Sources */, + 3FF8741A2B8F3B9000EB8AFA /* WordPressOrgRestApiTests.swift in Sources */, F194E1232417ED9F00874408 /* AtomicAuthenticationServiceRemoteTests.swift in Sources */, 4AB6A3652B83191600769115 /* ReaderPostServiceRemote+FetchEndpointTests.swift in Sources */, 9817D9D426BC8AF000ECBD8C /* CommentServiceRemoteXMLRPCTests.swift in Sources */, @@ -3627,13 +3768,8 @@ D8DB404021EF222000B8238E /* SiteCreationSegmentsTests.swift in Sources */, AB49D09325D1A85D0084905B /* PostServiceRemoteRESTLikesTests.swift in Sources */, 7433BC051EFC4556002D9E92 /* PlanServiceRemoteTests.swift in Sources */, - 46ABD0E6262EEDAB00C7FF24 /* FakeInfoDictionaryObjectProvider.swift in Sources */, - 4A05E7982B2FCB9A00C25E3B /* NonceRetrievalTests.swift in Sources */, 740B23D61F17F7C100067A2A /* XMLRPCTestable.swift in Sources */, - FFE247A720C891D1002DF3A2 /* WordPressComOAuthClientTests.swift in Sources */, 93AB06041EE8838400EF8764 /* RemoteTestCase.swift in Sources */, - 4A40F6552B2A5A1A0015DA77 /* WordPressAPIErrorTests.swift in Sources */, - 4A57A6812B549144008D0660 /* WordPressComRestApiTests+Error.swift in Sources */, BA2A78FA24A486D300BB6F53 /* SitePluginTests.swift in Sources */, 465F88A7263B371D00F4C950 /* BlockEditorSettingsServiceRemoteTests.swift in Sources */, 93BD27411EE73311002BB00B /* AccountServiceRemoteRESTTests.swift in Sources */, @@ -3641,6 +3777,7 @@ 7430C9BC1F192C0F0051B8E6 /* ReaderSiteServiceRemoteTests.swift in Sources */, F3FF8A1F279C871A00E5C90F /* StatsDotComFollowersInsightTests.swift in Sources */, 73D5930321E552CD00E4CF84 /* SiteVerticalsRequestEncodingTests.swift in Sources */, + 3FF874132B8F3B8F00EB8AFA /* WordPressComRestApiTests+Error.swift in Sources */, 3F3C9E9C289A3E31009A1357 /* TestCollector+Constants.swift in Sources */, BAB0E36424AD599700B3D22C /* MockPluginStateProvider.swift in Sources */, 98F884D426BC6445009ADF57 /* CommentServiceRemoteRESTTests.swift in Sources */, @@ -3648,7 +3785,6 @@ 930999521F1658F800F006A1 /* ThemeServiceRemoteTests.m in Sources */, 8BE67ED324AD05D3004DB4C9 /* Decodable+DictionaryTests.swift in Sources */, FEE48EF62A4B3602008A48E0 /* BlogServiceRemote+ActiveFeaturesTests.swift in Sources */, - 74B335DA1F06F3D60053A184 /* WordPressComRestApiTests.swift in Sources */, FA87FE0724EB39C4003FBEE3 /* ReaderPostServiceRemote+SubscriptionTests.swift in Sources */, 7403A2E61EF06F7000DED7DC /* AccountSettingsRemoteTests.swift in Sources */, 8B16CE92252502C4007BE5A9 /* RemoteReaderPostTests+V2.swift in Sources */, @@ -3656,30 +3792,33 @@ 73D5930521E5541200E4CF84 /* WordPressComServiceRemoteTests+SiteVerticals.swift in Sources */, 8BB5F62427A9A5D100B2FFAF /* DashboardServiceRemoteTests.swift in Sources */, 0152100C28EDA9E400DD6783 /* StatsAnnualAndMostPopularTimeInsightDecodingTests.swift in Sources */, + 3FF8740A2B8F3B8800EB8AFA /* HTTPRequestHelpers.swift in Sources */, 4AA5A1A52AA695D700969464 /* LoadMediaLibraryTests.swift in Sources */, + 3FF8741B2B8F3B9000EB8AFA /* WordPressOrgXMLRPCValidatorTests.swift in Sources */, 17CE77F420C701C8001DEA5A /* ReaderSiteSearchServiceRemoteTests.swift in Sources */, 73A2F38D21E7FC8200388609 /* WordPressComServiceRemoteTests+SiteVerticalsPrompt.swift in Sources */, + 3FF874102B8F3B8800EB8AFA /* FakeInfoDictionaryObjectProvider.swift in Sources */, + 3FF874172B8F3B8F00EB8AFA /* WordPressOrgXMLRPCApiTests.swift in Sources */, 74C473AF1EF2F7D1009918F2 /* SiteManagementServiceRemoteTests.swift in Sources */, FE5096522A13938500DDD071 /* SharingServiceRemoteTests.swift in Sources */, - FFA4D4AA2423B10A00BF5180 /* WordPressOrgRestApiTests.swift in Sources */, + 3FF8740C2B8F3B8800EB8AFA /* AppTransportSecuritySettingsTests.swift in Sources */, 74A44DD51F13C6D8006CD8F4 /* PushAuthenticationServiceRemoteTests.swift in Sources */, 4AE278482B2FBF1100E4D9B1 /* HTTPBodyEncodingTests.swift in Sources */, 731BA83621DECD61000FDFCD /* SiteCreationRequestEncodingTests.swift in Sources */, 7EC60EBE22DC4F9000FB0336 /* EditorServiceRemoteTests.swift in Sources */, 931924241F1662FA0069CBCC /* JSONLoader.swift in Sources */, E1787DB2200E5690004CB3AF /* TimeZoneServiceRemoteTests.swift in Sources */, + 3FF8740E2B8F3B8800EB8AFA /* RSDParserTests.swift in Sources */, FA1D0F8E299534FF0025D76C /* BlazeServiceRemoteTests.swift in Sources */, 740B23D21F17F6BB00067A2A /* PostServiceRemoteRESTTests.m in Sources */, F9E56DFB24EB18C300916770 /* FeatureFlagRemoteTests.swift in Sources */, - 4A05E7AC2B35048A00C25E3B /* RSDParserTests.swift in Sources */, - 46ABD0E0262EED3D00C7FF24 /* WordPressOrgXMLRPCValidatorTests.swift in Sources */, D813437621F6D70D0060D99A /* SiteSegmentsResponseDecodingTests.swift in Sources */, 436D56382118DC4B00CEAA33 /* TransactionsServiceRemoteTests.swift in Sources */, 9F3E0BA82087355E009CB5BA /* RemoteReaderSiteInfoSubscriptionTests.swift in Sources */, + 3FF874162B8F3B8F00EB8AFA /* WordPressComRestApiTests.swift in Sources */, BA62CFE924B592E000978BE1 /* DynamicMockProvider.swift in Sources */, 24ADA24E24F9B32D001B5DAE /* FeatureFlagSerializationTest.swift in Sources */, 7430C9BE1F192C0F0051B8E6 /* ReaderTopicServiceRemoteTests.m in Sources */, - 74B335DC1F06F4180053A184 /* WordPressOrgXMLRPCApiTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3832,7 +3971,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = WordPressKit/Info.plist; + INFOPLIST_FILE = Sources/WordPressKit/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -3864,7 +4003,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = WordPressKit/Info.plist; + INFOPLIST_FILE = Sources/WordPressKit/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -3890,7 +4029,7 @@ "${inherited}", "$(SDKROOT)/usr/include/libxml2", ); - INFOPLIST_FILE = WordPressKitTests/Info.plist; + INFOPLIST_FILE = Tests/WordPressKitTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -3898,7 +4037,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.automattic.WordPressKitTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "WordPressKitTests/WordPressKitTests-Bridging-Header.h"; + SWIFT_OBJC_BRIDGING_HEADER = "Tests/WordPressKitTests/WordPressKitTests-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; }; @@ -3915,7 +4054,7 @@ "${inherited}", "$(SDKROOT)/usr/include/libxml2", ); - INFOPLIST_FILE = WordPressKitTests/Info.plist; + INFOPLIST_FILE = Tests/WordPressKitTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -3923,7 +4062,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.automattic.WordPressKitTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "WordPressKitTests/WordPressKitTests-Bridging-Header.h"; + SWIFT_OBJC_BRIDGING_HEADER = "Tests/WordPressKitTests/WordPressKitTests-Bridging-Header.h"; SWIFT_VERSION = 5.0; }; name = Release; @@ -4003,7 +4142,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = WordPressKit/Info.plist; + INFOPLIST_FILE = Sources/WordPressKit/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -4029,7 +4168,7 @@ "${inherited}", "$(SDKROOT)/usr/include/libxml2", ); - INFOPLIST_FILE = WordPressKitTests/Info.plist; + INFOPLIST_FILE = Tests/WordPressKitTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -4037,7 +4176,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.automattic.WordPressKitTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "WordPressKitTests/WordPressKitTests-Bridging-Header.h"; + SWIFT_OBJC_BRIDGING_HEADER = "Tests/WordPressKitTests/WordPressKitTests-Bridging-Header.h"; SWIFT_VERSION = 5.0; }; name = "Release-Internal"; @@ -4117,7 +4256,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = WordPressKit/Info.plist; + INFOPLIST_FILE = Sources/WordPressKit/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -4143,7 +4282,7 @@ "${inherited}", "$(SDKROOT)/usr/include/libxml2", ); - INFOPLIST_FILE = WordPressKitTests/Info.plist; + INFOPLIST_FILE = Tests/WordPressKitTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -4151,7 +4290,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.automattic.WordPressKitTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "WordPressKitTests/WordPressKitTests-Bridging-Header.h"; + SWIFT_OBJC_BRIDGING_HEADER = "Tests/WordPressKitTests/WordPressKitTests-Bridging-Header.h"; SWIFT_VERSION = 5.0; }; name = "Release-Alpha"; diff --git a/WordPressKit.xcodeproj/xcshareddata/xcschemes/CoreAPI.xcscheme b/WordPressKit.xcodeproj/xcshareddata/xcschemes/CoreAPI.xcscheme new file mode 100644 index 00000000..64ba40b2 --- /dev/null +++ b/WordPressKit.xcodeproj/xcshareddata/xcschemes/CoreAPI.xcscheme @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WordPressKit.xcodeproj/xcshareddata/xcschemes/WordPressKit.xcscheme b/WordPressKit.xcodeproj/xcshareddata/xcschemes/WordPressKit.xcscheme index f09ffe95..5fa59bfe 100644 --- a/WordPressKit.xcodeproj/xcshareddata/xcschemes/WordPressKit.xcscheme +++ b/WordPressKit.xcodeproj/xcshareddata/xcschemes/WordPressKit.xcscheme @@ -30,7 +30,7 @@ codeCoverageEnabled = "YES"> diff --git a/WordPressKit/NSDate+WordPressJSON.h b/WordPressKit/NSDate+WordPressJSON.h deleted file mode 100644 index e6eb2518..00000000 --- a/WordPressKit/NSDate+WordPressJSON.h +++ /dev/null @@ -1,19 +0,0 @@ -#import - -@interface NSDate (WordPressJSON) - -/** - Parses a date string - - Dates in the format specified in http://www.w3.org/TR/NOTE-datetime should be OK. - The kind of dates returned by the REST API should match that format, even if the doc promises ISO 8601. - - Parsing the full ISO 8601, or even RFC 3339 is more complex than this, and makes no sense right now. - @warning this method doesn't support fractional seconds or dates with leap seconds (23:59:60 turns into 23:59:00) - */ - -+ (instancetype)dateWithWordPressComJSONString:(NSString *)string; - -- (NSString *)WordPressComJSONString; - -@end diff --git a/WordPressKit/NSDate+WordPressJSON.m b/WordPressKit/NSDate+WordPressJSON.m deleted file mode 100644 index b3774998..00000000 --- a/WordPressKit/NSDate+WordPressJSON.m +++ /dev/null @@ -1,26 +0,0 @@ -#import "NSDate+WordPressJSON.h" - -@implementation NSDate (WordPressJSON) - -+ (NSDateFormatter *)rfc3339DateFormatter { - static NSDateFormatter *rfc3339DateFormatter; - if (rfc3339DateFormatter == nil) { - rfc3339DateFormatter = [[NSDateFormatter alloc] init]; - NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; - - [rfc3339DateFormatter setLocale:enUSPOSIXLocale]; - [rfc3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"]; - [rfc3339DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; - } - return rfc3339DateFormatter; -} - -+ (instancetype)dateWithWordPressComJSONString:(NSString *)string { - return [[self rfc3339DateFormatter] dateFromString:string]; -} - -- (NSString *)WordPressComJSONString { - return [[[self class] rfc3339DateFormatter] stringFromDate:self]; -} - -@end diff --git a/WordPressKitTests/WordPressComRestApiTests.swift b/WordPressKitTests/WordPressComRestApiTests.swift deleted file mode 100644 index b0c98ae0..00000000 --- a/WordPressKitTests/WordPressComRestApiTests.swift +++ /dev/null @@ -1,515 +0,0 @@ -import Foundation -import XCTest -import OHHTTPStubs -import WordPressShared -@testable import WordPressKit - -class WordPressComRestApiTests: XCTestCase { - - let scheme = "https" - let host = "public-api.wordpress.com" - let wordPressMediaRoutePath = "/rest/v1.1/sites/0/media/" - let wordPressMediaNewEndpointPath = "/rest/v1.1/sites/0/media/new" - - override func setUp() { - super.setUp() - } - - override func tearDown() { - super.tearDown() - HTTPStubs.removeAllStubs() - } - - private func isRestAPIRequest() -> HTTPStubsTestBlock { - return { request in - guard let requestURL = request.url, let components = URLComponents(string: requestURL.absoluteString) else { - return false - } - - let expectedScheme = self.scheme - let actualScheme = components.scheme - - let expectedHost = self.host - let actualHost = components.host - - let expectedPath = self.wordPressMediaRoutePath - let actualPath = components.path - - let result = expectedScheme == actualScheme && expectedHost == actualHost && expectedPath == actualPath - return result - } - } - - private func isRestAPIMediaNewRequest() -> HTTPStubsTestBlock { - return { request in - guard let requestURL = request.url, let components = URLComponents(string: requestURL.absoluteString) else { - return false - } - - let expectedScheme = self.scheme - let actualScheme = components.scheme - - let expectedHost = self.host - let actualHost = components.host - - let expectedPath = self.wordPressMediaNewEndpointPath - let actualPath = components.path - - let result = expectedScheme == actualScheme && expectedHost == actualHost && expectedPath == actualPath - return result - } - } - - func testHTTPMethod() async { - for method in HTTPRequestBuilder.Method.allCases { - let requestReceived = expectation(description: "HTTP request is received") - - var request: URLRequest? - stub(condition: { _ in true }) { - request = $0 - requestReceived.fulfill() - return HTTPStubsResponse(error: URLError(URLError.Code.networkConnectionLost)) - } - - let api = WordPressComRestApi(oAuthToken: "fakeToken") - _ = await api.perform(method, URLString: "test") - await fulfillment(of: [requestReceived], timeout: 0.3) - - XCTAssertEqual(request?.httpMethod?.uppercased(), method.rawValue.uppercased()) - } - } - - @available(iOS 16.0, *) - func testQuery() { - var requestURL: URL? - stub(condition: isRestAPIRequest()) { - requestURL = $0.url - return HTTPStubsResponse(error: URLError(URLError.Code.networkConnectionLost)) - } - - let expect = self.expectation(description: "One callback should be invoked") - let api = WordPressComRestApi(oAuthToken: "fakeToken") - api.GET( - wordPressMediaRoutePath, - parameters: HTTPRequestBuilderTests.nestedParameters as [String: AnyObject], - success: { _, _ in expect.fulfill() }, - failure: { (_, _) in expect.fulfill() } - ) - wait(for: [expect], timeout: 0.3) - - let query = requestURL? - .query(percentEncoded: false)? - .split(separator: "&") - .reduce(into: Set()) { $0.insert(String($1)) } - ?? [] - let expected = HTTPRequestBuilderTests.nestedParametersEncoded + ["locale=en"] - - XCTAssertEqual(query.count, expected.count) - - for item in expected { - XCTAssertTrue(query.contains(item), "Missing query item: \(item)") - } - } - - func testSuccessfullCall() { - stub(condition: isRestAPIRequest()) { _ in - let stubPath = OHPathForFile("WordPressComRestApiMedia.json", type(of: self)) - return fixture(filePath: stubPath!, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) - } - - let expect = self.expectation(description: "One callback should be invoked") - let api = WordPressComRestApi(oAuthToken: "fakeToken") - api.GET(wordPressMediaRoutePath, parameters: nil, success: { (responseObject: AnyObject, _: HTTPURLResponse?) in - expect.fulfill() - XCTAssert(responseObject is [String: AnyObject], "The response should be a dictionary") - }, failure: { (_, _) in - expect.fulfill() - XCTFail("This call should be successfull") - } - ) - self.waitForExpectations(timeout: 2, handler: nil) - } - - func testBaseUrl() async throws { - var request: URLRequest? - stub(condition: { _ in true }, response: { - request = $0 - return HTTPStubsResponse(error: URLError(.networkConnectionLost)) - }) - - let defaultApi = WordPressComRestApi() - XCTAssertEqual(defaultApi.baseURL.absoluteString, "https://public-api.wordpress.com/") - let _ = await defaultApi.perform(.get, URLString: "/path") - try XCTAssertTrue(XCTUnwrap(request?.url?.absoluteString).hasPrefix("https://public-api.wordpress.com/path")) - - let localhostApi = WordPressComRestApi(baseURL: URL(string: "http://localhost:8080")!) - XCTAssertEqual(localhostApi.baseURL.absoluteString, "http://localhost:8080") - let _ = await localhostApi.perform(.get, URLString: "/local") - try XCTAssertTrue(XCTUnwrap(request?.url?.absoluteString).hasPrefix("http://localhost:8080/local")) - } - - func testURLStringWithQuery() async { - let requestReceived = expectation(description: "HTTP request is received") - - var request: URLRequest? - stub(condition: { _ in true }) { - request = $0 - requestReceived.fulfill() - return HTTPStubsResponse(error: URLError(URLError.Code.networkConnectionLost)) - } - - let api = WordPressComRestApi(oAuthToken: "fakeToken") - _ = await api.perform(.get, URLString: "test?arg=value") - await fulfillment(of: [requestReceived], timeout: 0.3) - - XCTAssertEqual(request?.url?.path, "/test") - XCTAssertTrue(request?.url?.query?.contains("arg=value") == true) - } - - func testInvalidTokenFailedCall() { - stub(condition: isRestAPIRequest()) { _ in - let stubPath = OHPathForFile("WordPressComRestApiFailRequestInvalidToken.json", type(of: self)) - return fixture(filePath: stubPath!, status: 400, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) - } - - let expect = self.expectation(description: "One callback should be invoked") - let api = WordPressComRestApi(oAuthToken: "fakeToken") - api.GET(wordPressMediaRoutePath, parameters: nil, success: { (_: AnyObject, _: HTTPURLResponse?) in - expect.fulfill() - XCTFail("This call should fail") - }, failure: { (error, _) in - expect.fulfill() - XCTAssert(error.domain == "WordPressKit.WordPressComRestApiError", "The error should a WordPressComRestApiError") - XCTAssert(error.code == Int(WordPressComRestApiErrorCode.invalidToken.rawValue), "The error code should be invalid token") - }) - self.waitForExpectations(timeout: 2, handler: nil) - } - - func testInvalidJSONReceivedFailedCall() { - stub(condition: isRestAPIRequest()) { _ in - let stubPath = OHPathForFile("WordPressComRestApiFailInvalidJSON.json", type(of: self)) - return fixture(filePath: stubPath!, status: 200, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) - } - let expect = self.expectation(description: "One callback should be invoked") - let api = WordPressComRestApi(oAuthToken: "fakeToken") - api.GET(wordPressMediaRoutePath, parameters: nil, success: { (_: AnyObject, _: HTTPURLResponse?) in - expect.fulfill() - XCTFail("This call should fail") - }, failure: { (error, _) in - expect.fulfill() - XCTAssert(error.domain == WordPressComRestApiErrorDomain, "The error domain should be WordPressComRestApiErrorDomain") - XCTAssert(error.code == Int(WordPressComRestApiErrorCode.responseSerializationFailed.rawValue), "The code should be invalid response serialization") - }) - self.waitForExpectations(timeout: 2, handler: nil) - } - - func testInvalidJSONSentFailedCall() { - stub(condition: isRestAPIMediaNewRequest()) { _ in - let stubPath = OHPathForFile("WordPressComRestApiFailInvalidInput.json", type(of: self)) - return fixture(filePath: stubPath!, status: 400, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) - } - let expect = self.expectation(description: "One callback should be invoked") - let api = WordPressComRestApi(oAuthToken: "fakeToken") - api.POST(wordPressMediaNewEndpointPath, parameters: nil, success: { (_: AnyObject, _: HTTPURLResponse?) in - expect.fulfill() - XCTFail("This call should fail") - }, failure: { (error, _) in - expect.fulfill() - XCTAssert(error.domain == "WordPressKit.WordPressComRestApiError", "The error domain should be WordPressComRestApiError") - XCTAssert(error.code == Int(WordPressComRestApiErrorCode.invalidInput.rawValue), "The error code should be invalid input") - }) - self.waitForExpectations(timeout: 2, handler: nil) - } - - func testUnauthorizedFailedCall() { - stub(condition: isRestAPIMediaNewRequest()) { _ in - let stubPath = OHPathForFile("WordPressComRestApiFailUnauthorized.json", type(of: self)) - return fixture(filePath: stubPath!, status: 403, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) - } - let expect = self.expectation(description: "One callback should be invoked") - let api = WordPressComRestApi(oAuthToken: "fakeToken") - api.POST(wordPressMediaNewEndpointPath, parameters: nil, success: { (_: AnyObject, _: HTTPURLResponse?) in - expect.fulfill() - XCTFail("This call should fail") - }, failure: { (error, _) in - expect.fulfill() - XCTAssert(error.domain == "WordPressKit.WordPressComRestApiError", "The error domain should be WordPressComRestApiError") - XCTAssert(error.code == Int(WordPressComRestApiErrorCode.authorizationRequired.rawValue), "The error code should be AuthorizationRequired") - }) - self.waitForExpectations(timeout: 2, handler: nil) - } - - func testMultipleErrorsFailedCall() { - stub(condition: isRestAPIMediaNewRequest()) { _ in - let stubPath = OHPathForFile("WordPressComRestApiMultipleErrors.json", type(of: self)) - return fixture(filePath: stubPath!, status: 403, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) - } - let expect = self.expectation(description: "One callback should be invoked") - let api = WordPressComRestApi(oAuthToken: "fakeToken") - api.POST(wordPressMediaNewEndpointPath, parameters: nil, success: { (_: AnyObject, _: HTTPURLResponse?) in - expect.fulfill() - XCTFail("This call should fail") - }, failure: { (error, _) in - expect.fulfill() - XCTAssert(error.domain == "WordPressKit.WordPressComRestApiError", "The error domain should be WordPressComRestApiError") - XCTAssert(error.code == Int(WordPressComRestApiErrorCode.uploadFailed.rawValue), "The error code should be AuthorizationRequired") - }) - self.waitForExpectations(timeout: 2, handler: nil) - } - - func testMultipleErrorsFailedMultiPartPostCall() { - stub(condition: isRestAPIMediaNewRequest()) { _ in - let stubPath = OHPathForFile("WordPressComRestApiMultipleErrors.json", type(of: self)) - return fixture(filePath: stubPath!, status: 403, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) - } - let expect = self.expectation(description: "One callback should be invoked") - let api = WordPressComRestApi(oAuthToken: "fakeToken") - api.multipartPOST(wordPressMediaNewEndpointPath, parameters: nil, fileParts: [], success: { (_: AnyObject, _: HTTPURLResponse?) in - expect.fulfill() - XCTFail("This call should fail") - }, failure: { (error, _) in - expect.fulfill() - XCTAssert(error.domain == "WordPressKit.WordPressComRestApiError", "The error domain should be WordPressComRestApiError") - XCTAssert(error.code == Int(WordPressComRestApiErrorCode.uploadFailed.rawValue), "The error code should be AuthorizationRequired") - }) - self.waitForExpectations(timeout: 2, handler: nil) - } - - func testStreamMethodCallWithInvalidFile() { - stub(condition: isRestAPIMediaNewRequest()) { _ in - let stubPath = OHPathForFile("WordPressComRestApiMedia.json", type(of: self)) - return fixture(filePath: stubPath!, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) - } - - let expect = self.expectation(description: "One callback should be invoked") - let api = WordPressComRestApi(oAuthToken: "fakeToken") - let filePart = FilePart(parameterName: "file", url: URL(fileURLWithPath: "/a.txt") as URL, filename: "a.txt", mimeType: "image/jpeg") - api.multipartPOST(wordPressMediaNewEndpointPath, parameters: nil, fileParts: [filePart], success: { (_: AnyObject, _: HTTPURLResponse?) in - expect.fulfill() - XCTFail("This call should fail") - }, failure: { (_, _) in - expect.fulfill() - } - ) - self.waitForExpectations(timeout: 2, handler: nil) - } - - func testStreamMethodParallelCalls() { - stub(condition: isRestAPIMediaNewRequest()) { _ in - let stubPath = OHPathForFile("WordPressComRestApiMedia.json", type(of: self)) - return fixture(filePath: stubPath!, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) - } - guard - let mediaPath = OHPathForFile("test-image.jpg", type(of: self)) - else { - return - } - let mediaURL = URL(fileURLWithPath: mediaPath) - let expect = self.expectation(description: "One callback should be invoked") - let api = WordPressComRestApi(oAuthToken: "fakeToken") - let filePart = FilePart(parameterName: "media[]", url: mediaURL as URL, filename: "test-image.jpg", mimeType: "image/jpeg") - let progress1 = api.multipartPOST(wordPressMediaNewEndpointPath, parameters: nil, fileParts: [filePart], success: { (_: AnyObject, _: HTTPURLResponse?) in - XCTFail("This call should fail") - }, failure: { (error, _) in - XCTAssert(error.domain == NSURLErrorDomain, "The error domain should be NSURLErrorDomain") - XCTAssert(error.code == NSURLErrorCancelled, "The error code should be NSURLErrorCancelled") - } - ) - progress1?.cancel() - api.multipartPOST(wordPressMediaNewEndpointPath, parameters: nil, fileParts: [filePart], success: { (_: AnyObject, _: HTTPURLResponse?) in - expect.fulfill() - - }, failure: { (_, _) in - expect.fulfill() - XCTFail("This call should succesful") - } - ) - self.waitForExpectations(timeout: 5, handler: nil) - } - - func testCancelationOfRequest() { - stub(condition: isRestAPIMediaNewRequest()) { _ in - return HTTPStubsResponse.init(error: NSError(domain: NSURLErrorDomain, code: NSURLErrorCancelled, userInfo: nil)) - } - let expect = self.expectation(description: "One callback should be invoked") - let api = WordPressComRestApi(oAuthToken: "fakeToken") - api.POST(wordPressMediaNewEndpointPath, parameters: nil, success: { (_: AnyObject, _: HTTPURLResponse?) in - expect.fulfill() - XCTFail("This call should fail") - }, failure: { (error, _) in - expect.fulfill() - XCTAssertEqual(error.domain, NSURLErrorDomain, "The error domain should be NSURLErrorDomain") - XCTAssertEqual(error.code, NSURLErrorCancelled, "The error code should be NSURLErrorCancelled") - }) - self.waitForExpectations(timeout: 2, handler: nil) - } - - func testSuccessfullCallCommonGETStructure() { - stub(condition: isRestAPIRequest()) { _ in - let stubPath = OHPathForFile("WordPressComRestApiMedia.json", type(of: self)) - return fixture(filePath: stubPath!, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) - } - - let expect = self.expectation(description: "One callback should be invoked") - let api = WordPressComRestApi(oAuthToken: "fakeToken") - - api.GET(wordPressMediaRoutePath, parameters: nil, success: { responseObject, _ in - XCTAssert(responseObject is [String: AnyObject], "The response should be a dictionary") - expect.fulfill() - }, failure: { _, _ in - XCTFail("This call should be successfull") - expect.fulfill() - }) - self.waitForExpectations(timeout: 2, handler: nil) - } - - func testFailureCallCommonGETStructure() { - stub(condition: isRestAPIRequest()) { _ in - let stubPath = OHPathForFile("WordPressComRestApiFailInvalidJSON.json", type(of: self)) - return fixture(filePath: stubPath!, status: 200, headers: ["Content-Type" as NSObject: "application/json" as AnyObject]) - } - - let expect = self.expectation(description: "One callback should be invoked") - let api = WordPressComRestApi(oAuthToken: "fakeToken") - api.GET(wordPressMediaRoutePath, parameters: nil, success: { _, _ in - XCTFail("This call should fail") - expect.fulfill() - }, failure: { err, _ in - let error = err as NSError - XCTAssert(error.domain == WordPressComRestApiErrorDomain, "The error domain should be WordPressComRestApiErrorDomain") - XCTAssert(error.code == Int(WordPressComRestApiErrorCode.responseSerializationFailed.rawValue), "The code should be invalid response serialization") - expect.fulfill() - }) - self.waitForExpectations(timeout: 2, handler: nil) - } - - func testStatusCode500() { - stub(condition: isAbsoluteURLString("https://public-api.wordpress.com/rest/v1/foo?locale=en")) { _ in - HTTPStubsResponse(data: "Internal server error".data(using: .utf8)!, statusCode: 500, headers: nil) - } - - let api = WordPressComRestApi() - let complete = expectation(description: "API call completed") - api.GET( - "/rest/v1/foo", - parameters: nil, - success: { _, _ in - complete.fulfill() - XCTFail("The API call should complete with a failure") - }, - failure: { error, _ in - complete.fulfill() - XCTAssertEqual(error.domain, "WordPressKit.WordPressComRestApiError") - XCTAssertEqual(error.code, WordPressComRestApiErrorCode.unknown.rawValue) - } - ) - - wait(for: [complete], timeout: 0.3) - } - - func testStatusCode502() { - stub(condition: isAbsoluteURLString("https://public-api.wordpress.com/rest/v1/foo?locale=en")) { _ in - HTTPStubsResponse(data: "Bad Gateway".data(using: .utf8)!, statusCode: 502, headers: nil) - } - - let api = WordPressComRestApi() - let complete = expectation(description: "API call completed") - api.GET( - "/rest/v1/foo", - parameters: nil, - success: { _, _ in - complete.fulfill() - XCTFail("The API call should complete with a failure") - }, - failure: { error, _ in - complete.fulfill() - - XCTAssertTrue(error is WordPressAPIError) - } - ) - - wait(for: [complete], timeout: 0.3) - } - - func testTooManyRequestError() { - stub(condition: isAbsoluteURLString("https://public-api.wordpress.com/rest/v1/foo?locale=en")) { _ in - let stubPath = OHPathForFile("WordPressComRestApiFailThrottled.json", type(of: self)) - return fixture(filePath: stubPath!, status: 500, headers: ["Content-Type" as NSObject: "application/html" as AnyObject]) - } - - let api = WordPressComRestApi() - let complete = expectation(description: "API call completed") - api.GET( - "/rest/v1/foo", - parameters: nil, - success: { _, _ in - complete.fulfill() - XCTFail("The API call should complete with a failure") - }, - failure: { error, _ in - complete.fulfill() - XCTAssertEqual(error.domain, "WordPressKit.WordPressComRestApiError") - XCTAssertEqual(error.code, WordPressComRestApiErrorCode.tooManyRequests.rawValue) - XCTAssertEqual(error.userInfo[WordPressComRestApi.ErrorKeyErrorCode] as? String, "too_many_requests") - XCTAssertTrue(error.localizedDescription.contains("You can try again in 1 minute")) - } - ) - - wait(for: [complete], timeout: 0.3) - } - - func testPreconditionFailureError() { - stub(condition: isAbsoluteURLString("https://public-api.wordpress.com/rest/v1/foo?locale=en")) { _ in - HTTPStubsResponse(jsonObject: ["code": "no_connected_jetpack"], statusCode: 412, headers: nil) - } - - let api = WordPressComRestApi() - let complete = expectation(description: "API call completed") - api.GET( - "/rest/v1/foo", - parameters: nil, - success: { _, _ in - complete.fulfill() - XCTFail("The API call should complete with a failure") - }, - failure: { error, _ in - complete.fulfill() - XCTAssertEqual(error.domain, "WordPressKit.WordPressComRestApiError") - XCTAssertEqual(error.code, WordPressComRestApiErrorCode.preconditionFailure.rawValue) - } - ) - - wait(for: [complete], timeout: 0.3) - } - - /// Verify that parameters in POST requests are sent as JSON. - func testPostParametersContent() throws { - var req: URLRequest? - stub(condition: isHost("public-api.wordpress.com")) { - req = $0 - return HTTPStubsResponse(error: URLError(.notConnectedToInternet)) - } - - let api = WordPressComRestApi() - let complete = expectation(description: "API call completed") - api.POST( - "/rest/v1/foo", - parameters: ["arg1": "value1"] as [String: AnyObject], - success: { _, _ in - complete.fulfill() - XCTFail("The API call should complete with a failure") - }, - failure: { error, _ in - complete.fulfill() - } - ) - - wait(for: [complete], timeout: 0.3) - - let request = try XCTUnwrap(req) - XCTAssertEqual(request.httpMethod?.uppercased(), "POST") - XCTAssertEqual(request.url?.absoluteString, "https://public-api.wordpress.com/rest/v1/foo?locale=en") - XCTAssertEqual(request.value(forHTTPHeaderField: "Content-Type"), "application/json") - XCTAssertEqual(request.httpBodyText, #"{"arg1":"value1"}"#) - } -} diff --git a/fastlane/Fastfile b/fastlane/Fastfile index b71afab0..2145d7aa 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -3,8 +3,23 @@ default_platform(:ios) SWIFTLINT_PATH = './Pods/SwiftLint/swiftlint' +SWIFTLINT_PLUGIN_VALIDATION_BYPASS_XCARGS = '-skipPackagePluginValidation -skipMacroValidation' platform :ios do + lane :package_build do + xcodebuild( + scheme: 'WordPressKit', + xcargs: "-resolvePackageDependencies #{SWIFTLINT_PLUGIN_VALIDATION_BYPASS_XCARGS}" + ) + run_tests( + package_path: '.', + scheme: 'WordPressKit', + device: 'iPhone 15', + prelaunch_simulator: true, + xcargs: SWIFTLINT_PLUGIN_VALIDATION_BYPASS_XCARGS + ) + end + lane :lint do swiftlint( executable: SWIFTLINT_PATH,