diff --git a/.buildkite/commands/boot-simulator.sh b/.buildkite/commands/boot-simulator.sh new file mode 100755 index 000000000000..4b354b21483d --- /dev/null +++ b/.buildkite/commands/boot-simulator.sh @@ -0,0 +1,33 @@ +#!/bin/bash -eu + +# Starts booting a Simulator, and returns without waiting for it. +# +# A test job spends most of a minute booting its Simulator once its tests are ready to run. Started +# from the top of the job instead, the Simulator boots while the job downloads its build and +# installs its gems. +# +# DEVICE is a name, such as "iPhone 18 Pro", or a name and an iOS version, such as +# "iPhone 17 Pro (26.5)". With no version it's the newest iOS that has the device, which is the one +# fastlane picks to run the tests on. + +DEVICE=${1:?Usage $0 DEVICE} + +UDID=$(xcrun simctl list devices available --json | ruby -rjson -e ' + name, version = ARGV[0].match(/\A(.*?)(?: \(([\d.]+)\))?\z/).captures + candidates = JSON.parse($stdin.read)["devices"].flat_map do |runtime, devices| + os = runtime[/\.iOS-([\d-]+)\z/, 1] + next [] if os.nil? + + devices.select { |device| device["name"] == name }.map { |device| [Gem::Version.new(os.tr("-", ".")), device["udid"]] } + end + candidates.select! { |os, _| os == Gem::Version.new(version) } unless version.nil? + puts candidates.max_by(&:first)&.last +' "$DEVICE") + +if [[ -z "$UDID" ]]; then + echo "Found no Simulator for '$DEVICE' to boot ahead of the tests." + exit 0 +fi + +echo "Booting $DEVICE ($UDID) while the job sets up" +xcrun simctl boot "$UDID" > /dev/null 2>&1 & diff --git a/.buildkite/commands/build-for-testing.sh b/.buildkite/commands/build-for-testing.sh index 4350e855fed2..4dd5a7b43232 100755 --- a/.buildkite/commands/build-for-testing.sh +++ b/.buildkite/commands/build-for-testing.sh @@ -18,8 +18,9 @@ fi "$(dirname "${BASH_SOURCE[0]}")/install-secrets.sh" +# Anything after the app's name is an option for the lane, such as `http_fixtures:true`. echo "--- :hammer_and_wrench: Building" -bundle exec fastlane "build_${APP}_for_testing" +bundle exec fastlane "build_${APP}_for_testing" "${@:2}" echo "--- :arrow_up: Upload Build Products" tar -cf "build-products-${APP}.tar" DerivedData/Build/Products/ diff --git a/.buildkite/commands/run-swift-package-tests.sh b/.buildkite/commands/run-swift-package-tests.sh index aa3aee6e3647..9b01f8b002a0 100755 --- a/.buildkite/commands/run-swift-package-tests.sh +++ b/.buildkite/commands/run-swift-package-tests.sh @@ -4,5 +4,6 @@ if "$(dirname "${BASH_SOURCE[0]}")/should-skip-job.sh" --job-type validation; th exit 0 fi +# The HTTPFixtures module and its tests are compiled out unless this condition is set. echo "--- :swift: Running cross-platform Swift package tests" -swift test +swift test -Xswiftc -DUI_TEST_HTTP_FIXTURES diff --git a/.buildkite/commands/run-ui-tests.sh b/.buildkite/commands/run-ui-tests.sh new file mode 100755 index 000000000000..0aacbe035ace --- /dev/null +++ b/.buildkite/commands/run-ui-tests.sh @@ -0,0 +1,84 @@ +#!/bin/bash -eu + +if "$(dirname "${BASH_SOURCE[0]}")/should-skip-job.sh" --job-type validation; then + exit 0 +fi + +DEVICE=${1:?Usage $0 DEVICE AREA} +AREA=${2:?Usage $0 DEVICE AREA} + +"$(dirname "${BASH_SOURCE[0]}")/boot-simulator.sh" "$DEVICE" + +# The suites are grouped by area of the app, one folder each, and each area runs in a job of its own. +TESTS_DIR=Tests/JetpackUITests/Tests + +# Only the suites that run against the fixtures in Tests/JetpackUITests/Fixtures. The others sign +# in to a real WordPress.com account, which CI doesn't have a token for. +FIXTURE_SUITE='class var backend: Backend \{ \.fixtures \}' + +# A suite outside the folders the pipeline has a job for would never run here, so fail instead. +for suite in $(grep -lE "$FIXTURE_SUITE" "$TESTS_DIR"/*.swift "$TESTS_DIR"/*/*.swift 2>/dev/null); do + area=$(basename "$(dirname "$suite")") + if ! grep -qE "^ +- \"$area\"\$" .buildkite/pipeline.yml; then + echo "Error: no UI Tests job runs $suite. Move it into an area's folder under $TESTS_DIR, or add its folder to the step's matrix in .buildkite/pipeline.yml." + exit 1 + fi +done + +SUITE_FILES=$(grep -lE "$FIXTURE_SUITE" "$TESTS_DIR/$AREA"/*.swift || true) + +if [[ -z "$SUITE_FILES" ]]; then + echo "Error: found no UI test suite that runs against the fixtures in $TESTS_DIR/$AREA" + exit 1 +fi + +SUITES=$(echo "$SUITE_FILES" \ + | xargs -n1 basename \ + | sed -e 's/\.swift$//' -e 's/^/JetpackUITests\//' \ + | paste -sd, -) + +echo "Running the $AREA UI tests on $DEVICE. The iOS version will be the latest available in the CI host." +echo "Suites: $SUITES" + +echo "--- 📦 Downloading Build Artifacts" +download_artifact build-products-jetpack.tar +tar -xf build-products-jetpack.tar + +# Only the gems are needed here, given we run the tests on a pre-built binary +echo "--- :rubygems: Setting up Gems" +install_gems + +echo "--- 🔬 Testing" +set +e +bundle exec fastlane test_without_building name:JetpackUITests device:"$DEVICE" only_testing:"$SUITES" reset_simulator:false +TESTS_EXIT_STATUS=$? +set -e + +if [[ $TESTS_EXIT_STATUS -ne 0 ]]; then + # Keep the (otherwise collapsed) current "Testing" section open in Buildkite logs on error. See https://buildkite.com/docs/pipelines/managing-log-output#collapsing-output + echo "^^^ +++" + echo "UI Tests failed!" +fi + +echo "--- 📦 Zipping test results" +cd build/results/ && zip -rq Jetpack.xcresult.zip Jetpack.xcresult && cd - + +echo "--- 💥 Collecting Crash reports" +mkdir -p build/results/crashes +find ~/Library/Logs/DiagnosticReports -name 'Jetpack*.ips' -exec cp "{}" "build/results/crashes/" \; + +echo "--- 🚦 Report Tests Status" +if [[ $TESTS_EXIT_STATUS -eq 0 ]]; then + echo "UI Tests seems to have passed (exit code 0). All good 👍" +else + echo "The UI Tests, ran during the '🔬 Testing' step above, have failed." + echo "For more details about the failed tests, check the Buildkite annotation, the logs under the '🔬 Testing' section and the \`.xcresult\` and test reports in Buildkite artifacts." +fi + +if [[ $BUILDKITE_BRANCH == trunk ]] || [[ $BUILDKITE_BRANCH == release/* ]]; then + annotate_test_failures "build/results/report.junit" --slack "build-and-ship" +else + annotate_test_failures "build/results/report.junit" +fi + +exit $TESTS_EXIT_STATUS diff --git a/.buildkite/commands/run-unit-tests.sh b/.buildkite/commands/run-unit-tests.sh index f961012938f7..74c2c254d41b 100755 --- a/.buildkite/commands/run-unit-tests.sh +++ b/.buildkite/commands/run-unit-tests.sh @@ -4,6 +4,10 @@ if "$(dirname "${BASH_SOURCE[0]}")/should-skip-job.sh" --job-type validation; th exit 0 fi +DEVICE=${1:?Usage $0 DEVICE} + +"$(dirname "${BASH_SOURCE[0]}")/boot-simulator.sh" "$DEVICE" + echo "--- 📦 Downloading Build Artifacts" download_artifact build-products-wordpress.tar tar -xf build-products-wordpress.tar @@ -14,7 +18,8 @@ install_gems echo "--- 🔬 Testing" set +e -bundle exec fastlane test_without_building name:WordPressUnitTests +# Naming the Simulator is what lets the lane skip resolving the Swift packages and reading the build settings. +bundle exec fastlane test_without_building name:WordPressUnitTests device:"$DEVICE" reset_simulator:false TESTS_EXIT_STATUS=$? set -e diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 10304cd28b69..410dd489bb8e 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -66,9 +66,10 @@ steps: - github_commit_status: context: "WordPress Build for Testing" + # The UI tests run against this build, so it has the HTTP fixtures compiled in. - label: "🛠 :jetpack: Build for Testing" key: "build_jetpack" - command: ".buildkite/commands/build-for-testing.sh jetpack" + command: ".buildkite/commands/build-for-testing.sh jetpack http_fixtures:true" plugins: [$CI_TOOLKIT_PLUGIN] notify: - github_commit_status: @@ -88,7 +89,7 @@ steps: context: "Swift Package Tests" - label: "🔬 :wordpress: Unit Tests" - command: ".buildkite/commands/run-unit-tests.sh" + command: ".buildkite/commands/run-unit-tests.sh 'iPhone 17 Pro (26.5)'" depends_on: "build_wordpress" plugins: - $CI_TOOLKIT_PLUGIN @@ -124,6 +125,35 @@ steps: # - github_commit_status: # context: "Unit Tests Keystone" + ################# + # Run UI Tests + ################# + - group: "🔬 UI Tests" + key: ui_tests_group + steps: + - label: "🔬 :jetpack: UI Tests ({{matrix}})" + command: ".buildkite/commands/run-ui-tests.sh 'iPhone 18 Pro' {{matrix}}" + depends_on: "build_jetpack" + plugins: [$CI_TOOLKIT_PLUGIN] + # One job per area of the app: the folders in Tests/JetpackUITests/Tests. + matrix: + - "Me" + - "MySite" + - "Notifications" + - "Reader" + - "Stats" + artifact_paths: + - "build/results/*" + - "build/results/crashes/*" + retry: + automatic: + - exit_status: "*" + limit: 1 + # One status for all the jobs: GitHub gets the context as written, without the matrix value. + notify: + - github_commit_status: + context: "UI Tests" + ################# # Linters ################# diff --git a/.swiftlint.yml b/.swiftlint.yml index 6412d14aba4e..0a3533bfdbaf 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -202,6 +202,13 @@ custom_rules: severity: error excluded: '.*Widgets/.*' + http_fixtures_build_flag: + name: "HTTP Fixtures Build Flag" + regex: '\A(?!#if UI_TEST_HTTP_FIXTURES\n).' + included: 'Modules/Sources/HTTPFixtures/.*\.swift' + message: "Wrap the whole file in `#if UI_TEST_HTTP_FIXTURES`. This module has to compile to nothing unless the build sets that condition, so that the app that ships has none of it. See docs/ui-tests.md." + severity: error + full_range_attributed_string_attribute: name: "Full-Range Attributed String Attribute" regex: '\.addAttributes?\([^\n]*range:\s*NS(MakeRange\(0,|Range\(location:\s*0,\s*length:)' diff --git a/AGENTS.md b/AGENTS.md index 28c272393f12..be7387487b38 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -41,7 +41,8 @@ WordPress-iOS uses a modular architecture with the main app and separate Swift p - The WordPress scheme uses `WordPressUnitTests.xctestplan` for the full unit test suite, including tests in the `Modules` Swift package. - Add every unit test target to `WordPressUnitTests.xctestplan`. - Run the full suite with `xcodebuild -workspace WordPress.xcworkspace -scheme WordPress -testPlan WordPressUnitTests test`. Do not use `swift test`. -- To verify changes end-to-end on an iOS simulator, follow @docs/simulator-sign-in.md to sign in to the app. +- UI tests live in `Tests/JetpackUITests` and run with the Jetpack scheme's `JetpackUITests` test plan. Most suites sign in to a real WordPress.com account, so they need a token; a suite can instead run against the fixtures in `Tests/JetpackUITests/Fixtures`, which needs an app built with the `UI_TEST_HTTP_FIXTURES` compilation condition. See `docs/ui-tests.md`. +- To sign a Simulator into WordPress.com, run `make sim-login` (it targets the running simulator; the WordPress.com token comes from `~/.wpcom-token` or `WPCOM_TOKEN`, and it prompts if none is set). See @docs/simulator-sign-in.md for options and self-hosted sign-in. ### Important Considerations - **Multi-site Support**: Code must handle both WordPress.com and self-hosted sites diff --git a/Makefile b/Makefile index 3539ae12d1dd..e86c8ee0f5da 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,10 @@ -.PHONY: help dependencies +.PHONY: help dependencies sim-login help: ## Show available targets @grep -E '^[a-zA-Z_-]+:.*##' $(MAKEFILE_LIST) | awk -F ':.*## ' '{printf " %-20s %s\n", $$1, $$2}' dependencies: ## Download and cache Gutenberg XCFrameworks ./Scripts/download-gutenberg-xcframeworks.sh + +sim-login: ## Sign an iOS Simulator into WordPress.com (vars: DEVICE, APP, RESET=1; token from ~/.wpcom-token) + ./Scripts/sim-signin.sh $(if $(APP),--app $(APP)) $(if $(DEVICE),--device $(DEVICE)) $(if $(RESET),--reset) $(ARGS) diff --git a/Modules/Package.swift b/Modules/Package.swift index 87b4d37f9b9e..400fe92aee51 100644 --- a/Modules/Package.swift +++ b/Modules/Package.swift @@ -13,6 +13,7 @@ let package = Package( .library(name: "DesignSystem", targets: ["DesignSystem"]), .library(name: "FormattableContentKit", targets: ["FormattableContentKit"]), .library(name: "GutenbergProcessors", targets: ["GutenbergProcessors"]), + .library(name: "HTTPFixtures", targets: ["HTTPFixtures"]), .library(name: "JetpackStats", targets: ["JetpackStats"]), .library(name: "JetpackSocial", targets: ["JetpackSocial"]), .library(name: "JetpackStatsWidgetsCore", targets: ["JetpackStatsWidgetsCore"]), @@ -116,6 +117,10 @@ let package = Package( // Set to v5 to avoid @Sendable warnings and errors swiftSettings: [.swiftLanguageMode(.v5)] ), + // Answers the app's requests from fixtures, for the UI tests. Every file is wrapped in + // `#if UI_TEST_HTTP_FIXTURES`, so the module is empty unless the build sets that + // condition, and the app that ships has none of it. See docs/ui-tests.md. + .target(name: "HTTPFixtures"), .target( name: "JetpackStats", dependencies: [ @@ -370,6 +375,7 @@ let package = Package( ], resources: [.process("Resources")] ), + .testTarget(name: "HTTPFixturesTests", dependencies: ["HTTPFixtures"]), .testTarget(name: "JetpackStatsTests", dependencies: ["JetpackStats"]), .testTarget( name: "JetpackStatsWidgetsCoreTests", @@ -525,6 +531,7 @@ enum XcodeSupport { "BuildSettingsKit", "FormattableContentKit", "GutenbergProcessors", + "HTTPFixtures", "JetpackSocial", "JetpackStats", "JetpackStatsWidgetsCore", diff --git a/Modules/Sources/HTTPFixtures/FixtureSet.swift b/Modules/Sources/HTTPFixtures/FixtureSet.swift new file mode 100644 index 000000000000..52d18d6b078f --- /dev/null +++ b/Modules/Sources/HTTPFixtures/FixtureSet.swift @@ -0,0 +1,118 @@ +#if UI_TEST_HTTP_FIXTURES +import Foundation +import os + +/// A known set of responses to answer an app's requests with, so its UI can be tested against +/// data that doesn't change. +/// +/// The fixtures are [WireMock stub mappings](https://wiremock.org/docs/stubbing/): JSON files that +/// each pair a request matcher with a response, read from every `.json` file under the `mappings` +/// directory. See `StubMapping` and `ResponseTemplate` for the parts of the format that are +/// supported. +/// +/// Mappings match on the path, query and body of a request, never its host, so one set answers +/// for every host the app talks to. +public final class FixtureSet: Sendable { + /// The mappings, in the order they're tried. + private let mappings: [StubMapping] + private let scenarioStates = OSAllocatedUnfairLock<[String: String]>(initialState: [:]) + private let now: @Sendable () -> Date + + /// - Parameters: + /// - directory: The directory that contains the `mappings` directory. + /// - now: The clock `{{now}}` template expressions read. + public init(directory: URL, now: @escaping @Sendable () -> Date = { Date() }) throws(FixtureError) { + let mappingsDirectory = directory.appending(path: "mappings", directoryHint: .isDirectory) + let files = Self.jsonFiles(in: mappingsDirectory) + guard !files.isEmpty else { + throw FixtureError(file: "mappings", reason: "no mappings found in \(mappingsDirectory.path())") + } + + var mappings: [StubMapping] = [] + for file in files { + guard let data = try? Data(contentsOf: file.url) else { + throw FixtureError(file: file.path, reason: "the file can't be read") + } + + let mapping = try StubMapping(data: data, source: file.path) + try Self.validateTemplates(of: mapping) + mappings.append(mapping) + } + + self.mappings = mappings.sorted { + ($0.priority, -$0.specificity, $0.source) < ($1.priority, -$1.specificity, $1.source) + } + self.now = now + } + + /// The response to `request`: the one from the first mapping that matches it, or a 404 when + /// none does. + public func response(for request: StubRequest) -> StubResponse { + let match = scenarioStates.withLock { states -> StubMapping? in + guard let mapping = mappings.first(where: { $0.matches(request, scenarioStates: states) }) else { + return nil + } + if let scenario = mapping.scenario, let newState = scenario.newState { + states[scenario.name] = newState + } + return mapping + } + + guard let match else { + return .noFixture(for: request) + } + + do throws(ResponseTemplate.Failure) { + var template = ResponseTemplate(request: request, now: now()) + let headers = try match.response.headers.mapValues { value throws(ResponseTemplate.Failure) in + try template.render(value) + } + let body = + if let series = match.response.series { + series.body(for: request, now: now()) + } else { + try template.render(match.response.body) + } + return StubResponse( + status: match.response.status, + headers: headers, + body: Data(body.utf8), + delay: match.response.delay, + source: match.source + ) + } catch { + return .error(status: 500, code: "invalid_fixture", message: error.reason, source: match.source) + } + } + + /// Renders a mapping's templates against a placeholder request, so an expression that can't be + /// evaluated is reported when the fixtures load instead of when a test happens to request it. + private static func validateTemplates(of mapping: StubMapping) throws(FixtureError) { + let request = StubRequest(url: URL(string: "https://example.com/")!) + var template = ResponseTemplate(request: request, now: Date()) + do { + for value in mapping.response.headers.values { + _ = try template.render(value) + } + _ = try template.render(mapping.response.body) + } catch { + throw FixtureError(file: mapping.source, reason: error.reason) + } + } + + /// The `.json` files under `directory`, with their paths relative to it, sorted by path. + private static func jsonFiles(in directory: URL) -> [(path: String, url: URL)] { + let root = directory.standardizedFileURL.path(percentEncoded: false) + let enumerator = FileManager.default.enumerator(at: directory, includingPropertiesForKeys: nil) + var files: [(path: String, url: URL)] = [] + while let url = enumerator?.nextObject() as? URL { + guard url.pathExtension == "json" else { + continue + } + let path = url.standardizedFileURL.path(percentEncoded: false) + files.append((path: String(path.dropFirst(root.count)), url: url)) + } + return files.sorted { $0.path < $1.path } + } +} +#endif diff --git a/Modules/Sources/HTTPFixtures/FixtureURLProtocol.swift b/Modules/Sources/HTTPFixtures/FixtureURLProtocol.swift new file mode 100644 index 000000000000..9b9bc1200c8b --- /dev/null +++ b/Modules/Sources/HTTPFixtures/FixtureURLProtocol.swift @@ -0,0 +1,197 @@ +#if UI_TEST_HTTP_FIXTURES +import Foundation +import ObjectiveC +import os + +/// Answers every `URLSession` request in the process from a `FixtureSet`, so nothing reaches the +/// network. +/// +/// This works below the app's API clients, which is what lets one mechanism cover all of them: +/// WordPressKit, Alamofire and wordpress-rs each hand their requests to a `URLSession`. +/// +/// It can't see requests that leave the process another way: the content of a `WKWebView`, +/// background sessions, WebSockets and media playback. +/// +/// - warning: Like the rest of this module, this is only compiled when the build sets the +/// `UI_TEST_HTTP_FIXTURES` compilation condition. No other build of the app has anything in it +/// that can reroute its requests. +public final class FixtureURLProtocol: URLProtocol, @unchecked Sendable { + private struct Configuration: Sendable { + let fixtures: FixtureSet + let requestLog: RequestLog? + } + + private static let configuration = OSAllocatedUnfairLock(initialState: nil) + + /// Starts answering the process's requests from `fixtures`. + /// + /// Call this before the app creates its sessions: a session copies its configuration when it's + /// created, so one that already exists keeps talking to the network. + /// + /// - Parameter requestLog: A file to write a `RecordedRequest` to for every request. It shows + /// what the app sent, and which requests the fixtures are missing. + public static func install(fixtures: FixtureSet, requestLog: URL? = nil) { + activate(fixtures: fixtures, requestLog: requestLog) + _ = registration + } + + /// Starts answering requests in sessions whose configuration lists this protocol. + static func activate(fixtures: FixtureSet, requestLog: URL? = nil) { + let configuration = Configuration(fixtures: fixtures, requestLog: requestLog.flatMap(RequestLog.init(url:))) + self.configuration.withLock { $0 = configuration } + } + + static func deactivate() { + configuration.withLock { $0 = nil } + } + + /// Puts the protocol in front of every session, once. + /// + /// `registerClass` only reaches `URLSession.shared`. A session created from a configuration + /// reads the configuration's `protocolClasses` instead, so the protocol is also added to the + /// two configurations sessions are created from. + private static let registration: Void = { + URLProtocol.registerClass(FixtureURLProtocol.self) + addProtocol(toConfigurationReturnedBy: #selector(getter: URLSessionConfiguration.default)) + addProtocol(toConfigurationReturnedBy: #selector(getter: URLSessionConfiguration.ephemeral)) + }() + + private static func addProtocol(toConfigurationReturnedBy selector: Selector) { + guard let method = class_getClassMethod(URLSessionConfiguration.self, selector) else { + return + } + + typealias Getter = @convention(c) (AnyClass, Selector) -> URLSessionConfiguration + let original = unsafeBitCast(method_getImplementation(method), to: Getter.self) + let replacement: @convention(block) (AnyClass) -> URLSessionConfiguration = { configurationClass in + let configuration = original(configurationClass, selector) + configuration.protocolClasses = [FixtureURLProtocol.self] + (configuration.protocolClasses ?? []) + return configuration + } + method_setImplementation(method, imp_implementationWithBlock(replacement)) + } + + // MARK: - URLProtocol + + private let isStopped = OSAllocatedUnfairLock(initialState: false) + + override public class func canInit(with request: URLRequest) -> Bool { + guard configuration.withLock({ $0 }) != nil, let scheme = request.url?.scheme?.lowercased() else { + return false + } + return scheme == "http" || scheme == "https" + } + + override public class func canonicalRequest(for request: URLRequest) -> URLRequest { + request + } + + override public func startLoading() { + guard let configuration = Self.configuration.withLock({ $0 }), let url = request.url else { + client?.urlProtocol(self, didFailWithError: URLError(.unsupportedURL)) + return + } + + let stubRequest = StubRequest(method: request.httpMethod ?? "GET", url: url, body: Self.body(of: request)) + let response = configuration.fixtures.response(for: stubRequest) + configuration.requestLog?.record(stubRequest, answeredBy: response) + + // The response is delivered after `startLoading` has returned, on the run loop of the thread + // that called it, which is the thread the client has to be called on. + nonisolated(unsafe) let runLoop = CFRunLoopGetCurrent() + DispatchQueue.global() + .asyncAfter(deadline: .now() + response.delay) { + CFRunLoopPerformBlock(runLoop, CFRunLoopMode.defaultMode.rawValue) { + self.deliver(response, for: url) + } + CFRunLoopWakeUp(runLoop) + } + } + + override public func stopLoading() { + isStopped.withLock { $0 = true } + } + + private func deliver(_ response: StubResponse, for url: URL) { + guard !isStopped.withLock({ $0 }) else { + return + } + guard + let httpResponse = HTTPURLResponse( + url: url, + statusCode: response.status, + httpVersion: "HTTP/1.1", + headerFields: response.headers + ) + else { + client?.urlProtocol(self, didFailWithError: URLError(.badServerResponse)) + return + } + + client?.urlProtocol(self, didReceive: httpResponse, cacheStoragePolicy: .notAllowed) + client?.urlProtocol(self, didLoad: response.body) + client?.urlProtocolDidFinishLoading(self) + } + + /// The most of a request body that's read to match it against the fixtures. Anything larger is + /// an upload, which no mapping matches on. + private static let maximumBodySize = 1024 * 1024 + + /// The request's body. A request sent by an upload task, or with a stream, arrives without + /// `httpBody`, so its body is read from the stream. + private static func body(of request: URLRequest) -> Data? { + if let body = request.httpBody { + return body + } + guard let stream = request.httpBodyStream else { + return nil + } + + stream.open() + defer { stream.close() } + + var body = Data() + var buffer = [UInt8](repeating: 0, count: 16 * 1024) + while body.count < maximumBodySize { + let count = stream.read(&buffer, maxLength: buffer.count) + guard count > 0 else { + break + } + body.append(buffer, count: count) + } + return body + } +} + +/// Writes a `RecordedRequest` to a file for every request, one per line. +private final class RequestLog: Sendable { + private let file: OSAllocatedUnfairLock + + init?(url: URL) { + FileManager.default.createFile(atPath: url.path(percentEncoded: false), contents: nil) + guard let handle = try? FileHandle(forWritingTo: url) else { + return nil + } + file = OSAllocatedUnfairLock(uncheckedState: handle) + } + + func record(_ request: StubRequest, answeredBy response: StubResponse) { + let record = RecordedRequest( + method: request.method, + url: request.url, + body: request.bodyString, + status: response.status, + fixture: response.source + ) + let encoder = JSONEncoder() + encoder.outputFormatting = [.sortedKeys, .withoutEscapingSlashes] + guard let json = try? encoder.encode(record) else { + return + } + file.withLockUnchecked { handle in + _ = try? handle.seekToEnd() + try? handle.write(contentsOf: json + Data("\n".utf8)) + } + } +} +#endif diff --git a/Modules/Sources/HTTPFixtures/JSONPath.swift b/Modules/Sources/HTTPFixtures/JSONPath.swift new file mode 100644 index 000000000000..5cc1923aeecb --- /dev/null +++ b/Modules/Sources/HTTPFixtures/JSONPath.swift @@ -0,0 +1,59 @@ +#if UI_TEST_HTTP_FIXTURES +import Foundation + +/// The two forms of JSONPath the fixtures use. +enum JSONPath: Sendable { + /// A dotted path from the root, such as `$.options.template`. + case path([String]) + /// An equality filter on the root, such as `$[?(@.type == 'post')]`. + case filter(path: [String], value: String) + + init?(_ expression: String) { + if let match = expression.wholeMatch(of: /\$((?:\.\w+)+)/) { + self = .path(match.1.split(separator: ".").map(String.init)) + } else if let match = expression.wholeMatch(of: /\$\[\?\(@((?:\.\w+)+)\s*==\s*'([^']*)'\)\]/) { + self = .filter(path: match.1.split(separator: ".").map(String.init), value: String(match.2)) + } else { + return nil + } + } + + /// Whether the expression selects anything in `json`. + func matches(_ json: Any) -> Bool { + switch self { + case .path(let path): + return Self.value(at: path, in: json) != nil + case .filter(let path, let expected): + let candidates = json as? [Any] ?? [json] + return candidates.contains { Self.value(at: path, in: $0).map(Self.string) == expected } + } + } + + /// The value a dotted path leads to, as the text a template renders it with. + func string(in json: Any) -> String? { + guard case .path(let path) = self else { + return nil + } + return Self.value(at: path, in: json).map(Self.string) + } + + private static func value(at path: [String], in json: Any) -> Any? { + var value = json + for key in path { + guard let next = (value as? [String: Any])?[key], !(next is NSNull) else { + return nil + } + value = next + } + return value + } + + private static func string(_ value: Any) -> String { + switch value { + case let string as String: string + case let number as NSNumber: number.stringValue + default: canonicalJSON(value).map { String(decoding: $0, as: UTF8.self) } ?? "" + } + } +} +#endif diff --git a/Modules/Sources/HTTPFixtures/JSONText.swift b/Modules/Sources/HTTPFixtures/JSONText.swift new file mode 100644 index 000000000000..125f6c66c0a0 --- /dev/null +++ b/Modules/Sources/HTTPFixtures/JSONText.swift @@ -0,0 +1,132 @@ +#if UI_TEST_HTTP_FIXTURES +import Foundation + +/// Finds the text of a value in a JSON document, exactly as the document has it. +/// +/// A response body is served this way instead of being parsed and written back out, because +/// `JSONSerialization` doesn't keep the order of an object's keys. The order matters to a body's +/// template expressions, which are evaluated as they come: one may define a variable that a later +/// one reads. +enum JSONText { + /// - Parameters: + /// - path: The keys leading to the value, from the document's root object. + /// - document: A valid JSON document. + static func value(at path: [String], in document: Data) -> Data? { + let scanner = Scanner(bytes: [UInt8](document)) + var range = 0..) -> Range? { + var index = skipWhitespace(from: range.lowerBound) + guard byte(at: index) == UInt8(ascii: "{") else { + return nil + } + index += 1 + + while true { + index = skipWhitespace(from: index) + guard byte(at: index) == UInt8(ascii: "\"") else { + return nil + } + let keyEnd = endOfString(from: index) + let keyText = Data(bytes[index.. UInt8? { + bytes.indices.contains(index) ? bytes[index] : nil + } + + private func skipWhitespace(from start: Int) -> Int { + var index = start + while let byte = byte(at: index), Self.whitespace.contains(byte) { + index += 1 + } + return index + } + + /// The index after the closing quote of the string that starts at `start`. + private func endOfString(from start: Int) -> Int { + var index = start + 1 + while let byte = byte(at: index) { + if byte == UInt8(ascii: "\\") { + index += 2 + } else if byte == UInt8(ascii: "\"") { + return index + 1 + } else { + index += 1 + } + } + return index + } + + /// The index after the value that starts at `start`. + private func endOfValue(from start: Int) -> Int { + var index = start + + switch byte(at: start) { + case UInt8(ascii: "\""): + return endOfString(from: start) + case UInt8(ascii: "{"), UInt8(ascii: "["): + var depth = 0 + while let byte = byte(at: index) { + switch byte { + case UInt8(ascii: "\""): + index = endOfString(from: index) + continue + case UInt8(ascii: "{"), UInt8(ascii: "["): + depth += 1 + case UInt8(ascii: "}"), UInt8(ascii: "]"): + depth -= 1 + default: + break + } + index += 1 + if depth == 0 { + break + } + } + default: + // A number, `true`, `false` or `null` runs up to whatever follows it. + while let byte = byte(at: index), !Self.delimiters.contains(byte) { + index += 1 + } + } + + return index + } + + private static let whitespace: Set = [0x20, 0x09, 0x0A, 0x0D] + private static let delimiters = whitespace.union([UInt8(ascii: ","), UInt8(ascii: "}"), UInt8(ascii: "]")]) + } +} +#endif diff --git a/Modules/Sources/HTTPFixtures/RecordedRequest.swift b/Modules/Sources/HTTPFixtures/RecordedRequest.swift new file mode 100644 index 000000000000..41979a9e17fb --- /dev/null +++ b/Modules/Sources/HTTPFixtures/RecordedRequest.swift @@ -0,0 +1,22 @@ +#if UI_TEST_HTTP_FIXTURES +import Foundation + +/// A request the app made, as the request log records it. +/// +/// The log holds one of these per line, as JSON, in the order the requests were made. A test reads +/// it to check what the app sent, such as its analytics events, and not only what it showed. +public struct RecordedRequest: Codable, Equatable, Sendable { + public let method: String + public let url: URL + + /// The request's body, when it has one and it's text. + public let body: String? + + /// The status of the response the request was answered with. + public let status: Int + + /// The mapping file that answered the request, relative to the `mappings` directory, or `nil` + /// when no mapping matched. + public let fixture: String? +} +#endif diff --git a/Modules/Sources/HTTPFixtures/ResponseTemplate.swift b/Modules/Sources/HTTPFixtures/ResponseTemplate.swift new file mode 100644 index 000000000000..556d6f45b402 --- /dev/null +++ b/Modules/Sources/HTTPFixtures/ResponseTemplate.swift @@ -0,0 +1,270 @@ +#if UI_TEST_HTTP_FIXTURES +import Foundation + +/// Renders the template expressions in a response, the way WireMock's +/// [response templating](https://wiremock.org/docs/response-templating/) does. +/// +/// This covers the expressions the fixtures use, which is a small part of what WireMock offers: +/// +/// - `{{request.requestLine.baseUrl}}`, `{{request.query.name}}`, `{{request.pathSegments.[2]}}` +/// and `{{request.body}}` +/// - `{{now}}`, with the optional arguments `offset='-3 days'` and `format='yyyy-MM-dd'` +/// - `{{jsonPath request.body '$.title'}}`, `{{lookup request.query 'name'}}` and `{{capitalize value}}` +/// - `{{#assign 'name'}}value{{/assign}}`, which defines a variable later expressions can refer to +/// +/// A request value that isn't there renders as nothing, as it does in WireMock. An expression this +/// type can't evaluate is an error. +struct ResponseTemplate { + struct Failure: Error { + let reason: String + } + + let request: StubRequest + let now: Date + private var variables: [String: String] = [:] + + init(request: StubRequest, now: Date) { + self.request = request + self.now = now + } + + mutating func render(_ template: String) throws(Failure) -> String { + var output = "" + var rest = template[...] + + while let open = rest.range(of: "{{") { + output += rest[..) throws(Failure) -> Value { + guard case .word(let name) = tokens.first, Self.helpers.contains(name) else { + return try value(&tokens) + } + tokens.removeFirst() + + var positional: [Value] = [] + var named: [String: String] = [:] + while let token = tokens.first, token != .close { + if case .word(let word) = token, word.hasSuffix("=") { + tokens.removeFirst() + named[String(word.dropLast())] = try value(&tokens).text + } else if case .word(let word) = token, let equals = word.firstIndex(of: "=") { + tokens.removeFirst() + named[String(word[..) throws(Failure) -> Value { + switch tokens.popFirst() { + case .literal(let text): + return .text(text) + case .word(let path): + return try resolve(path) + case .open: + let value = try evaluate(&tokens) + guard tokens.popFirst() == .close else { + throw Failure(reason: "a parenthesis is not closed") + } + return value + case .close, nil: + throw Failure(reason: "an expression is missing a value") + } + } + + private func resolve(_ path: String) throws(Failure) -> Value { + if let variable = variables[path] { + return .text(variable) + } + + switch path { + case "request.requestLine.baseUrl": + return .text(request.baseURL) + case "request.body": + return .text(request.bodyString ?? "") + case "request.query": + return .queryParameters(request.queryParameters) + default: + break + } + + if let name = path.wholeMatch(of: /request\.query\.(.+)/).map({ String($0.1) }) { + return .text(request.queryParameters.first { $0.name == name }?.value ?? "") + } + if let index = path.wholeMatch(of: /request\.pathSegments\.\[(\d+)\]/).flatMap({ Int($0.1) }) { + let segments = request.pathSegments + return .text(segments.indices.contains(index) ? segments[index] : "") + } + throw Failure(reason: "unsupported template expression: \(path)") + } + + // MARK: - Helpers + + private static let helpers: Set = ["now", "jsonPath", "lookup", "capitalize"] + + private func call(_ helper: String, _ positional: [Value], _ named: [String: String]) throws(Failure) -> String { + switch (helper, positional.count) { + case ("now", 0): + return try date(named) + case ("jsonPath", 2): + guard let path = JSONPath(positional[1].text) else { + throw Failure(reason: "unsupported JSONPath expression: \(positional[1].text)") + } + let document = Data(positional[0].text.utf8) + let json = try? JSONSerialization.jsonObject(with: document, options: .fragmentsAllowed) + return json.flatMap { path.string(in: $0) } ?? "" + case ("lookup", 2): + guard case .queryParameters(let parameters) = positional[0] else { + throw Failure(reason: "lookup only reads request.query") + } + return parameters.first { $0.name == positional[1].text }?.value ?? "" + case ("capitalize", 1): + return positional[0].text.capitalized + default: + throw Failure(reason: "\(helper) doesn't take \(positional.count) arguments") + } + } + + private func date(_ arguments: [String: String]) throws(Failure) -> String { + if let unsupported = arguments.keys.sorted().first(where: { $0 != "offset" && $0 != "format" }) { + throw Failure(reason: "now doesn't support the argument \(unsupported)") + } + + var date = now + if let offset = arguments["offset"] { + date = try Self.date(date, offsetBy: offset) + } + + switch arguments["format"] { + case nil: + return date.formatted(.iso8601) + case "epoch": + return String(Int64(date.timeIntervalSince1970 * 1000)) + case "unix": + return String(Int64(date.timeIntervalSince1970)) + case let format?: + let formatter = DateFormatter() + formatter.calendar = Self.calendar + formatter.locale = Locale(identifier: "en_US_POSIX") + formatter.timeZone = Self.calendar.timeZone + formatter.dateFormat = format + return formatter.string(from: date) + } + } + + /// Dates are computed and written in UTC, as WireMock does without a `timezone` argument. + private static let calendar: Calendar = { + var calendar = Calendar(identifier: .gregorian) + calendar.timeZone = .gmt + return calendar + }() + + private static let offsetUnits: [String: Calendar.Component] = [ + "seconds": .second, + "minutes": .minute, + "hours": .hour, + "days": .day, + "months": .month, + "years": .year + ] + + private static func date(_ date: Date, offsetBy offset: String) throws(Failure) -> Date { + let parts = offset.split(separator: " ") + guard + parts.count == 2, + let amount = Int(parts[0]), + let unit = offsetUnits[String(parts[1])], + let result = calendar.date(byAdding: unit, value: amount, to: date) + else { + throw Failure(reason: "unsupported date offset: \(offset)") + } + return result + } + + // MARK: - Tokens + + private enum Token: Equatable { + /// A path, a helper name, or a named argument (`format=name`, or `offset=` before a literal). + case word(String) + /// A quoted string, without its quotes. + case literal(String) + case open + case close + } + + private static func tokens(in expression: Substring) throws(Failure) -> [Token] { + var tokens: [Token] = [] + var rest = expression + + while let character = rest.first { + if character.isWhitespace { + rest.removeFirst() + } else if character == "(" { + tokens.append(.open) + rest.removeFirst() + } else if character == ")" { + tokens.append(.close) + rest.removeFirst() + } else if character == "'" || character == "\"" { + rest.removeFirst() + guard let end = rest.firstIndex(of: character) else { + throw Failure(reason: "a quoted value in {{\(expression)}} is not closed") + } + tokens.append(.literal(String(rest[.. String { + let query = Dictionary(request.queryParameters.map { ($0.name, $0.value) }) { first, _ in first } + let unit = Unit(rawValue: query["unit"] ?? query["period"] ?? "") ?? .day + + var rows: [[Any]] = [] + if let end = Self.date(from: query["date"]) { + let start = + Self.date(from: query["start_date"]) ?? unit.start(of: end, periods: Int(query["quantity"] ?? "") ?? 1) + rows = unit.periods(from: start, to: end) + .map { period in + [unit.label(for: period) as Any] + fields.map { value(of: $0, in: period, unit: unit, now: now) } + } + } + + let body: [String: Any] = [ + "date": query["date"] ?? "", + "unit": unit.rawValue, + "fields": ["period"] + fields.map(\.name), + "data": rows + ] + return canonicalJSON(body).map { String(decoding: $0, as: UTF8.self) } ?? "{}" + } + + // MARK: - Values + + private func value(of field: Field, in period: Date, unit: Unit, now: Date) -> Any { + guard unit != .hour || field.isHourly else { + return NSNull() + } + + switch field.value { + case .average(let average): + if unit == .hour { + let hour = Self.calendar.component(.hour, from: period) + return Int( + (Self.dayValue(of: field.name, averaging: average, on: period) * Self.hourShares[hour]).rounded() + ) + } + return unit.days(in: period) + .reduce(0) { $0 + Int(Self.dayValue(of: field.name, averaging: average, on: $1).rounded()) } + case .level(let level, let growth): + let lastDay = unit.days(in: period).last ?? period + let today = Self.calendar.startOfDay(for: now) + let daysAgo = + Self.calendar.dateComponents([.day], from: Self.calendar.startOfDay(for: lastDay), to: today).day ?? 0 + return Int(level - growth * Double(daysAgo)) + } + } + + /// What a field comes to on one day: its average, scaled by the day of the week and by an + /// amount that depends only on the field and the date. + private static func dayValue(of name: String, averaging average: Double, on date: Date) -> Double { + let day = calendar.startOfDay(for: date) + let weekday = calendar.component(.weekday, from: day) + let dayNumber = Int(day.timeIntervalSince1970 / 86_400) + + // FNV-1a, for a number that looks random but is the same every time. + var hash: UInt64 = 0xcbf2_9ce4_8422_2325 + for byte in "\(name):\(dayNumber)".utf8 { + hash = (hash ^ UInt64(byte)) &* 0x0000_0100_0000_01b3 + } + let variation = 0.8 + 0.4 * Double(hash % 10_000) / 10_000 + + return average * weekdayFactors[weekday - 1] * variation + } + + /// Sunday to Saturday. Weekends are quieter. + private static let weekdayFactors = [0.78, 1.04, 1.12, 1.15, 1.1, 1.0, 0.81] + + /// The share of a day's value that falls in each hour, from midnight. They add up to 1. + private static let hourShares: [Double] = [ + 0.012, 0.008, 0.006, 0.005, 0.006, 0.01, 0.02, 0.035, 0.05, 0.062, 0.068, 0.07, + 0.066, 0.064, 0.062, 0.06, 0.058, 0.057, 0.06, 0.064, 0.06, 0.047, 0.03, 0.02 + ] + + // MARK: - Dates + + /// Dates are read and written as they are in the request, without a time zone. + private static let calendar: Calendar = { + var calendar = Calendar(identifier: .gregorian) + calendar.timeZone = .gmt + calendar.firstWeekday = 2 + return calendar + }() + + private static func formatter(_ format: String) -> DateFormatter { + let formatter = DateFormatter() + formatter.calendar = calendar + formatter.locale = Locale(identifier: "en_US_POSIX") + formatter.timeZone = calendar.timeZone + formatter.dateFormat = format + return formatter + } + + private static func date(from text: String?) -> Date? { + guard let text else { + return nil + } + return formatter("yyyy-MM-dd HH:mm:ss").date(from: text) ?? formatter("yyyy-MM-dd").date(from: text) + } + + private enum Unit: String { + case hour, day, week, month, year + + /// The most periods one response lists, whatever the request asks for. + static let maximumPeriods = 1000 + + var component: Calendar.Component { + switch self { + case .hour: .hour + case .day: .day + case .week: .weekOfYear + case .month: .month + case .year: .year + } + } + + /// The date `periods` periods before the one `end` is in, counting that one. + func start(of end: Date, periods: Int) -> Date { + StatsSeries.calendar.date(byAdding: component, value: -(max(periods, 1) - 1), to: end) ?? end + } + + /// The start of every period from the one `start` is in to the one `end` is in. + func periods(from start: Date, to end: Date) -> [Date] { + let calendar = StatsSeries.calendar + var periods: [Date] = [] + var period = calendar.dateInterval(of: component, for: start)?.start ?? start + while period <= end, periods.count < Self.maximumPeriods { + periods.append(period) + guard let next = calendar.date(byAdding: component, value: 1, to: period) else { + break + } + period = next + } + return periods + } + + /// The days of the period that starts on `period`. + func days(in period: Date) -> [Date] { + let calendar = StatsSeries.calendar + guard self != .hour, self != .day, let end = calendar.date(byAdding: component, value: 1, to: period) else { + return [period] + } + var days: [Date] = [] + var day = period + while day < end { + days.append(day) + guard let next = calendar.date(byAdding: .day, value: 1, to: day) else { + break + } + day = next + } + return days + } + + /// The period as WordPress.com writes it for this unit. + func label(for period: Date) -> String { + switch self { + case .hour: StatsSeries.formatter("yyyy-MM-dd HH:mm:ss").string(from: period) + case .week: StatsSeries.formatter("yyyy'W'MM'W'dd").string(from: period) + case .day, .month, .year: StatsSeries.formatter("yyyy-MM-dd").string(from: period) + } + } + } +} +#endif diff --git a/Modules/Sources/HTTPFixtures/StubMapping.swift b/Modules/Sources/HTTPFixtures/StubMapping.swift new file mode 100644 index 000000000000..a8399b3cf06e --- /dev/null +++ b/Modules/Sources/HTTPFixtures/StubMapping.swift @@ -0,0 +1,388 @@ +#if UI_TEST_HTTP_FIXTURES +import Foundation + +/// One request matcher and the response to answer with, read from a WireMock stub mapping file. +/// +/// Only the parts of the [WireMock format](https://wiremock.org/docs/stubbing/) the fixtures use +/// are supported. A mapping that uses anything else fails to load instead of being read without +/// it: a matcher that was skipped would make the mapping answer requests its author excluded. +struct StubMapping: Sendable { + /// The file the mapping was read from, relative to the `mappings` directory. + let source: String + let priority: Int + let method: String? + let url: URLMatcher + let queryParameters: [QueryParameterMatcher] + let bodyPatterns: [BodyMatcher] + let scenario: Scenario? + let response: ResponseDefinition + + /// WireMock's default priority. A lower number is tried first. + static let defaultPriority = 5 + + /// How many optional conditions the mapping places on a request. Between mappings of equal + /// priority, the one with more conditions is tried first, so a mapping for one query doesn't + /// lose to a catch-all for the same path. + var specificity: Int { + queryParameters.count + bodyPatterns.count + (scenario?.requiredState == nil ? 0 : 1) + } + + func matches(_ request: StubRequest, scenarioStates: [String: String]) -> Bool { + if let method, method != request.method { + return false + } + if let scenario, let requiredState = scenario.requiredState { + guard (scenarioStates[scenario.name] ?? Scenario.initialState) == requiredState else { + return false + } + } + return url.matches(request) + && queryParameters.allSatisfy { $0.matches(request) } + && bodyPatterns.allSatisfy { $0.matches(request) } + } +} + +// MARK: - Matchers + +enum URLMatcher: Sendable { + case any + /// The path and query, exactly (`url`). + case pathAndQuery(String) + /// The path and query, as a regular expression (`urlPattern`). + case pathAndQueryPattern(Pattern) + /// The path, exactly (`urlPath`). + case path(String) + /// The path, as a regular expression (`urlPathPattern`). + case pathPattern(Pattern) + + func matches(_ request: StubRequest) -> Bool { + switch self { + case .any: true + case .pathAndQuery(let expected): request.pathAndQuery == expected + case .pathAndQueryPattern(let pattern): pattern.matches(request.pathAndQuery) + case .path(let expected): request.path == expected + case .pathPattern(let pattern): pattern.matches(request.path) + } + } +} + +struct QueryParameterMatcher: Sendable { + enum Condition: Sendable { + case equalTo(String) + case matches(Pattern) + case absent + } + + let name: String + let condition: Condition + + func matches(_ request: StubRequest) -> Bool { + let values = request.queryParameters.filter { $0.name == name }.map(\.value) + return switch condition { + case .equalTo(let expected): values.contains(expected) + case .matches(let pattern): values.contains(where: pattern.matches) + case .absent: values.isEmpty + } + } +} + +enum BodyMatcher: Sendable { + case equalTo(String) + case matches(Pattern) + /// The body, as JSON serialized by `canonicalJSON`. + case equalToJSON(Data) + case matchesJSONPath(JSONPath) + + func matches(_ request: StubRequest) -> Bool { + switch self { + case .equalTo(let expected): + request.bodyString == expected + case .matches(let pattern): + request.bodyString.map(pattern.matches) ?? false + case .equalToJSON(let expected): + request.bodyJSON.flatMap(canonicalJSON) == expected + case .matchesJSONPath(let path): + request.bodyJSON.map(path.matches) ?? false + } + } +} + +/// A named state machine shared by the mappings that carry its name, which lets a sequence of +/// requests change what later requests are answered with (a new post appearing in the posts list +/// once it's been published, say). +struct Scenario: Sendable { + static let initialState = "Started" + + let name: String + /// The state the scenario must be in for the mapping to match. + let requiredState: String? + /// The state the scenario moves to once the mapping has answered a request. + let newState: String? +} + +struct ResponseDefinition: Sendable { + let status: Int + /// Header values may contain template expressions, like the body. + let headers: [String: String] + let body: String + /// Generates the body in place of `body`, for a mapping that names the `stats-series` + /// transformer. + let series: StatsSeries? + let delay: TimeInterval +} + +// MARK: - Reading + +extension StubMapping { + /// - Parameters: + /// - data: The contents of a mapping file. + /// - source: The file's path, relative to the `mappings` directory. + init(data: Data, source: String) throws(FixtureError) { + do { + try self.init(document: data, file: source) + } catch let error as UnsupportedMapping { + throw FixtureError(file: source, reason: error.reason) + } catch { + throw FixtureError(file: source, reason: "\(error)") + } + } + + private init(document: Data, file: String) throws { + guard let json = try? JSONSerialization.jsonObject(with: document) else { + throw UnsupportedMapping("the file is not valid JSON") + } + var mapping = try KeyedReader(json, at: "the mapping") + // Identifiers and flags WireMock writes when it records a mapping. They don't affect matching. + mapping.ignore("id", "uuid", "name", "persistent", "metadata") + + var request = try KeyedReader(try mapping.take("request"), at: "request") + var response = try KeyedReader(try mapping.take("response"), at: "response") + + self.source = file + self.priority = try mapping.take("priority") ?? Self.defaultPriority + + let method: String? = try request.take("method") + self.method = method.flatMap { $0.uppercased() == "ANY" ? nil : $0.uppercased() } + self.url = try Self.urlMatcher(from: &request) + + let queryParameters: [String: Any] = try request.take("queryParameters") ?? [:] + self.queryParameters = try queryParameters.keys.sorted() + .map { name in + var condition = try KeyedReader(queryParameters[name], at: "queryParameters.\(name)") + let matcher = QueryParameterMatcher(name: name, condition: try Self.queryCondition(from: &condition)) + try condition.finish() + return matcher + } + + let bodyPatterns: [Any] = try request.take("bodyPatterns") ?? [] + self.bodyPatterns = try bodyPatterns.map { pattern in + var pattern = try KeyedReader(pattern, at: "bodyPatterns") + let matcher = try Self.bodyMatcher(from: &pattern) + try pattern.finish() + return matcher + } + + if let name: String = try mapping.take("scenarioName") { + self.scenario = Scenario( + name: name, + requiredState: try mapping.take("requiredScenarioState"), + newState: try mapping.take("newScenarioState") + ) + } else { + self.scenario = nil + } + + self.response = try Self.responseDefinition(from: &response, in: document) + + try request.finish() + try response.finish() + try mapping.finish() + } + + private static func urlMatcher(from request: inout KeyedReader) throws -> URLMatcher { + var matchers: [URLMatcher] = [] + if let url: String = try request.take("url") { + matchers.append(.pathAndQuery(url)) + } + if let pattern: String = try request.take("urlPattern") { + matchers.append(.pathAndQueryPattern(try Pattern(pattern))) + } + if let path: String = try request.take("urlPath") { + matchers.append(.path(path)) + } + if let pattern: String = try request.take("urlPathPattern") { + matchers.append(.pathPattern(try Pattern(pattern))) + } + guard matchers.count <= 1 else { + throw UnsupportedMapping("request has more than one of url, urlPattern, urlPath and urlPathPattern") + } + return matchers.first ?? .any + } + + private static func queryCondition(from condition: inout KeyedReader) throws -> QueryParameterMatcher.Condition { + if let expected: String = try condition.take("equalTo") { + return .equalTo(expected) + } + if let pattern: String = try condition.take("matches") { + return .matches(try Pattern(pattern)) + } + let isAbsent: Bool? = try condition.take("absent") + if isAbsent == true { + return .absent + } + throw UnsupportedMapping("\(condition.location) needs one of equalTo, matches and absent") + } + + private static func bodyMatcher(from pattern: inout KeyedReader) throws -> BodyMatcher { + if let expression: String = try pattern.take("matchesJsonPath") { + guard let path = JSONPath(expression) else { + throw UnsupportedMapping("unsupported JSONPath expression: \(expression)") + } + return .matchesJSONPath(path) + } + if let expected: Any = try pattern.take("equalToJson") { + // WireMock accepts the expected JSON either inline or as a string of JSON. + let json = (expected as? String).flatMap { try? JSONSerialization.jsonObject(with: Data($0.utf8)) } + guard let canonical = canonicalJSON(json ?? expected) else { + throw UnsupportedMapping("equalToJson is not valid JSON") + } + return .equalToJSON(canonical) + } + if let expected: String = try pattern.take("equalTo") { + return .equalTo(expected) + } + if let expression: String = try pattern.take("matches") { + return .matches(try Pattern(expression)) + } + throw UnsupportedMapping("\(pattern.location) needs one of equalTo, matches, equalToJson and matchesJsonPath") + } + + private static func responseDefinition( + from response: inout KeyedReader, + in document: Data + ) throws -> ResponseDefinition { + var series: StatsSeries? + let transformers: [String] = try response.take("transformers") ?? [] + let transformerParameters: Any? = try response.take("transformerParameters") + for transformer in transformers { + switch transformer { + case "response-template": + // Every response is rendered as a template, so naming this one changes nothing. + break + case "stats-series": + do { + series = try StatsSeries(parameters: transformerParameters) + } catch { + throw UnsupportedMapping(error.reason) + } + default: + throw UnsupportedMapping("unsupported transformer: \(transformer)") + } + } + if transformerParameters != nil, series == nil { + throw UnsupportedMapping("transformerParameters are only read by the stats-series transformer") + } + + var headers: [String: String] = [:] + let rawHeaders: [String: Any] = try response.take("headers") ?? [:] + for (name, value) in rawHeaders { + guard let value = value as? String else { + throw UnsupportedMapping("response header \(name) is not a string") + } + headers[name] = value + } + + var body: String = try response.take("body") ?? "" + let jsonBody: Any? = try response.take("jsonBody") + if jsonBody != nil, let text = JSONText.value(at: ["response", "jsonBody"], in: document) { + body = String(decoding: text, as: UTF8.self) + } + let isJSON = jsonBody != nil || series != nil + if isJSON, !headers.keys.contains(where: { $0.caseInsensitiveCompare("Content-Type") == .orderedSame }) { + headers["Content-Type"] = "application/json" + } + + let delay: Int = try response.take("fixedDelayMilliseconds") ?? 0 + return ResponseDefinition( + status: try response.take("status") ?? 200, + headers: headers, + body: body, + series: series, + delay: TimeInterval(delay) / 1000 + ) + } +} + +private struct UnsupportedMapping: Error { + let reason: String + + init(_ reason: String) { + self.reason = reason + } +} + +/// Reads the values of a JSON object, and reports the keys nothing read. +private struct KeyedReader { + let location: String + private var remaining: [String: Any] + + init(_ value: Any?, at location: String) throws { + guard let object = value as? [String: Any] else { + throw UnsupportedMapping("\(location) is missing or is not an object") + } + self.location = location + self.remaining = object + } + + mutating func take(_ key: String) throws -> Value? { + guard let value = remaining.removeValue(forKey: key) else { + return nil + } + guard let typed = value as? Value else { + throw UnsupportedMapping("\(location).\(key) is not a \(Value.self)") + } + return typed + } + + mutating func ignore(_ keys: String...) { + for key in keys { + remaining.removeValue(forKey: key) + } + } + + func finish() throws { + guard remaining.isEmpty else { + let keys = remaining.keys.sorted().joined(separator: ", ") + throw UnsupportedMapping("\(location) has unsupported keys: \(keys)") + } + } +} + +// MARK: - Helpers + +/// A regular expression that has to match the whole of a string, which is how WireMock applies +/// every pattern in a mapping. +struct Pattern: Sendable { + private let expression: NSRegularExpression + + fileprivate init(_ pattern: String) throws { + do { + expression = try NSRegularExpression(pattern: "\\A(?:\(pattern))\\z") + } catch { + throw UnsupportedMapping("invalid regular expression: \(pattern)") + } + } + + func matches(_ string: String) -> Bool { + expression.firstMatch(in: string, range: NSRange(string.startIndex..., in: string)) != nil + } +} + +/// Serializes JSON so that equal values produce equal bytes. +func canonicalJSON(_ json: Any) -> Data? { + try? JSONSerialization.data( + withJSONObject: json, + options: [.fragmentsAllowed, .sortedKeys, .withoutEscapingSlashes] + ) +} +#endif diff --git a/Modules/Sources/HTTPFixtures/StubRequest.swift b/Modules/Sources/HTTPFixtures/StubRequest.swift new file mode 100644 index 000000000000..bb6082bb8c09 --- /dev/null +++ b/Modules/Sources/HTTPFixtures/StubRequest.swift @@ -0,0 +1,68 @@ +#if UI_TEST_HTTP_FIXTURES +import Foundation + +/// A request, reduced to the parts a fixture can match on. +public struct StubRequest: Sendable { + public let method: String + public let url: URL + public let body: Data? + + public init(method: String = "GET", url: URL, body: Data? = nil) { + self.method = method.uppercased() + self.url = url + self.body = body + } +} + +extension StubRequest { + /// The scheme, host and port, such as `https://public-api.wordpress.com`. + var baseURL: String { + let port = url.port.map { ":\($0)" } ?? "" + return "\(url.scheme ?? "https")://\(url.host(percentEncoded: true) ?? "")\(port)" + } + + /// The path as it was sent, still percent-encoded. + var path: String { + let path = url.path(percentEncoded: true) + return path.isEmpty ? "/" : path + } + + /// The path and query as they were sent. + var pathAndQuery: String { + guard let query = url.query(percentEncoded: true) else { + return path + } + return "\(path)?\(query)" + } + + var pathSegments: [String] { + path.split(separator: "/").map(Self.decoded) + } + + /// The decoded query parameters, in the order they were sent. A name that was sent more than + /// once appears once per value. + var queryParameters: [(name: String, value: String)] { + guard let query = url.query(percentEncoded: true) else { + return [] + } + return query.split(separator: "&") + .map { pair in + let parts = pair.split(separator: "=", maxSplits: 1, omittingEmptySubsequences: false) + return (name: Self.decoded(parts[0]), value: parts.count > 1 ? Self.decoded(parts[1]) : "") + } + } + + var bodyString: String? { + body.flatMap { String(data: $0, encoding: .utf8) } + } + + var bodyJSON: Any? { + body.flatMap { try? JSONSerialization.jsonObject(with: $0, options: .fragmentsAllowed) } + } + + private static func decoded(_ component: Substring) -> String { + let spaced = component.replacingOccurrences(of: "+", with: " ") + return spaced.removingPercentEncoding ?? spaced + } +} +#endif diff --git a/Modules/Sources/HTTPFixtures/StubResponse.swift b/Modules/Sources/HTTPFixtures/StubResponse.swift new file mode 100644 index 000000000000..e3cb8f385e02 --- /dev/null +++ b/Modules/Sources/HTTPFixtures/StubResponse.swift @@ -0,0 +1,53 @@ +#if UI_TEST_HTTP_FIXTURES +import Foundation + +/// The response a `FixtureSet` answers a request with. +public struct StubResponse: Sendable { + public let status: Int + public let headers: [String: String] + public let body: Data + + /// How long to wait before delivering the response. + public let delay: TimeInterval + + /// The mapping file the response came from, relative to the `mappings` directory, or `nil` + /// when no mapping matched the request. + public let source: String? +} + +extension StubResponse { + /// The response to a request no mapping matches. + /// + /// The body has the shape of a WordPress.com error, so the app reports it the way it would + /// report a real failure. + static func noFixture(for request: StubRequest) -> StubResponse { + error( + status: 404, + code: "no_fixture", + message: "No fixture matches \(request.method) \(request.pathAndQuery)", + source: nil + ) + } + + static func error(status: Int, code: String, message: String, source: String?) -> StubResponse { + StubResponse( + status: status, + headers: ["Content-Type": "application/json"], + body: canonicalJSON(["error": code, "message": message]) ?? Data(), + delay: 0, + source: source + ) + } +} + +/// A problem with a fixture file. +public struct FixtureError: Error, CustomStringConvertible, Sendable { + /// The file, relative to the `mappings` directory. + public let file: String + public let reason: String + + public var description: String { + "\(file): \(reason)" + } +} +#endif diff --git a/Modules/Sources/JetpackStats/Cards/ChartCard.swift b/Modules/Sources/JetpackStats/Cards/ChartCard.swift index e820de15f83a..d6c5c97a2b40 100644 --- a/Modules/Sources/JetpackStats/Cards/ChartCard.swift +++ b/Modules/Sources/JetpackStats/Cards/ChartCard.swift @@ -58,6 +58,7 @@ struct ChartCard: View { .animation(.spring, value: viewModel.isEditing) .accessibilityElement(children: .contain) .accessibilityLabel(Strings.Accessibility.chartContainer) + .accessibilityIdentifier("chart_card") .sheet(isPresented: $viewModel.isEditing) { NavigationStack { ChartCardCustomizationView(chartViewModel: viewModel) @@ -180,6 +181,7 @@ struct ChartCard: View { .frame(width: 50, height: 50) } .tint(Color.primary) + .accessibilityIdentifier("chart_card_more_button") } @ViewBuilder diff --git a/Modules/Sources/JetpackStats/Cards/TodayCard.swift b/Modules/Sources/JetpackStats/Cards/TodayCard.swift index a7706e5e4fab..d3a524ccb810 100644 --- a/Modules/Sources/JetpackStats/Cards/TodayCard.swift +++ b/Modules/Sources/JetpackStats/Cards/TodayCard.swift @@ -198,6 +198,7 @@ struct TodayCard: View { .frame(width: 50, height: 50) } .tint(Color.primary) + .accessibilityIdentifier("today_card_more_button") } @ViewBuilder diff --git a/Modules/Sources/JetpackStats/Cards/TopListCard.swift b/Modules/Sources/JetpackStats/Cards/TopListCard.swift index c08b2b5f784e..1cd4b3941cfb 100644 --- a/Modules/Sources/JetpackStats/Cards/TopListCard.swift +++ b/Modules/Sources/JetpackStats/Cards/TopListCard.swift @@ -76,6 +76,7 @@ struct TopListCard: View { .scaleEffect(viewModel.isEditing ? 0.95 : 1) .animation(.spring, value: viewModel.isEditing) .accessibilityElement(children: .contain) + .accessibilityIdentifier("top_list_card_\(viewModel.selection.item.rawValue)") .animation(.spring, value: viewModel.data.map(ObjectIdentifier.init)) // placing is important .sheet(isPresented: $viewModel.isEditing) { NavigationStack { @@ -103,6 +104,7 @@ struct TopListCard: View { } .accessibilityElement(children: .combine) .accessibilityLabel(Strings.Accessibility.cardTitle(viewModel.title)) + .accessibilityIdentifier("top_list_card_title") } private var mapView: some View { @@ -138,6 +140,7 @@ struct TopListCard: View { .padding(.vertical, Constants.step0_5) } .fixedSize() + .accessibilityIdentifier("top_list_card_location_level_button") } else if viewModel.selection.item == .devices { Menu { deviceBreakdownPicker @@ -241,6 +244,7 @@ struct TopListCard: View { .frame(width: 50, height: 50) } .tint(Color.primary) + .accessibilityIdentifier("top_list_card_more_button") } @ViewBuilder @@ -375,6 +379,7 @@ struct TopListCard: View { .padding(.top, 16) .tint(Color.secondary.opacity(0.8)) .dynamicTypeSize(...DynamicTypeSize.xLarge) + .accessibilityIdentifier("top_list_card_show_all_button") } private var showMoreInlineButton: some View { diff --git a/Modules/Sources/JetpackStats/Screens/TrafficTabView.swift b/Modules/Sources/JetpackStats/Screens/TrafficTabView.swift index ee6483deae06..3eafe0a59e9d 100644 --- a/Modules/Sources/JetpackStats/Screens/TrafficTabView.swift +++ b/Modules/Sources/JetpackStats/Screens/TrafficTabView.swift @@ -127,6 +127,7 @@ struct TrafficTabView: View { TodayCard(viewModel: viewModel) } .buttonStyle(.plain) + .accessibilityIdentifier("today_card") default: let _ = assertionFailure("Unsupported type: \(viewModel)") EmptyView() @@ -149,6 +150,7 @@ struct TrafficTabView: View { .padding(3) } .accessibilityLabel(Strings.Accessibility.addCardButton) + .accessibilityIdentifier("stats_add_card_button") .dynamicTypeSize(...DynamicTypeSize.xLarge) .buttonStyle(.bordered) .buttonBorderShape(.capsule) diff --git a/Modules/Sources/JetpackStats/Views/LegacyFloatingDateControl.swift b/Modules/Sources/JetpackStats/Views/LegacyFloatingDateControl.swift index b0a9825bf2fa..a6d46a8e7ab6 100644 --- a/Modules/Sources/JetpackStats/Views/LegacyFloatingDateControl.swift +++ b/Modules/Sources/JetpackStats/Views/LegacyFloatingDateControl.swift @@ -63,6 +63,7 @@ struct LegacyFloatingDateControl: View { .tint(Color.primary) .menuOrder(.fixed) .buttonStyle(.plain) + .accessibilityIdentifier("stats_date_range_button") .popoverTip(StatsDateRangeTip(), arrowEdge: .bottom) .floatingStyle() } @@ -119,6 +120,7 @@ struct LegacyFloatingDateControl: View { dateRange.navigate(direction) } .disabled(isDisabled) + .accessibilityIdentifier("stats_date_range_\(direction)_button") } } diff --git a/Modules/Sources/JetpackStats/Views/MetricsOverviewTabView.swift b/Modules/Sources/JetpackStats/Views/MetricsOverviewTabView.swift index 96f83841a538..e61f04d75c46 100644 --- a/Modules/Sources/JetpackStats/Views/MetricsOverviewTabView.swift +++ b/Modules/Sources/JetpackStats/Views/MetricsOverviewTabView.swift @@ -84,6 +84,8 @@ private struct MetricItemView: View { } } .buttonStyle(.plain) + .accessibilityIdentifier("chart_card_metric_\(data.metric)") + .accessibilityAddTraits(isSelected ? .isSelected : []) } // MARK: - Private Views diff --git a/Modules/Sources/JetpackStats/Views/TimezoneInfoView.swift b/Modules/Sources/JetpackStats/Views/TimezoneInfoView.swift index a5af4e036711..94a307d11da4 100644 --- a/Modules/Sources/JetpackStats/Views/TimezoneInfoView.swift +++ b/Modules/Sources/JetpackStats/Views/TimezoneInfoView.swift @@ -20,6 +20,7 @@ struct TimezoneInfoView: View { .foregroundColor(.secondary) } .buttonStyle(.plain) + .accessibilityIdentifier("stats_timezone_button") .popover(isPresented: $showingTimezoneInfo) { timezoneInfoContent } diff --git a/Modules/Sources/JetpackStats/Views/TopList/TopListItemView.swift b/Modules/Sources/JetpackStats/Views/TopList/TopListItemView.swift index 877d7c495e20..06bfb0d104fb 100644 --- a/Modules/Sources/JetpackStats/Views/TopList/TopListItemView.swift +++ b/Modules/Sources/JetpackStats/Views/TopList/TopListItemView.swift @@ -110,6 +110,7 @@ struct TopListItemView: View { .frame(height: cellHeight) .contentShape(Rectangle()) .accessibilityElement(children: .combine) + .accessibilityIdentifier("top_list_item") .contextMenu { contextMenuContent } diff --git a/Modules/Tests/HTTPFixturesTests/CompiledOutTests.swift b/Modules/Tests/HTTPFixturesTests/CompiledOutTests.swift new file mode 100644 index 000000000000..51b95a1ded1e --- /dev/null +++ b/Modules/Tests/HTTPFixturesTests/CompiledOutTests.swift @@ -0,0 +1,9 @@ +#if !UI_TEST_HTTP_FIXTURES +import Testing + +/// `HTTPFixtures` and its tests are only compiled when the build sets `UI_TEST_HTTP_FIXTURES`. +/// Without it this is the only test here, and it's reported as skipped so that a run that left the +/// others out says so. +@Test(.disabled("HTTPFixtures is compiled out. Run `swift test -Xswiftc -DUI_TEST_HTTP_FIXTURES` to test it.")) +func httpFixtures() {} +#endif diff --git a/Modules/Tests/HTTPFixturesTests/FixtureSetTests.swift b/Modules/Tests/HTTPFixturesTests/FixtureSetTests.swift new file mode 100644 index 000000000000..78b22baae4d0 --- /dev/null +++ b/Modules/Tests/HTTPFixturesTests/FixtureSetTests.swift @@ -0,0 +1,343 @@ +#if UI_TEST_HTTP_FIXTURES +import Foundation +import Testing +import HTTPFixtures + +@Suite +struct FixtureSetTests { + // MARK: - URL + + @Test func urlPathIgnoresTheQuery() throws { + let fixtures = try makeFixtureSet([ + "me.json": mapping(#"{"method": "GET", "urlPath": "/rest/v1.1/me"}"#) + ]) + + #expect(fixtures.response(for: get("/rest/v1.1/me?locale=en")).status == 200) + #expect(fixtures.response(for: get("/rest/v1.1/me/sites")).status == 404) + } + + @Test func urlMatchesThePathAndQueryExactly() throws { + let fixtures = try makeFixtureSet([ + "xmlrpc.json": mapping(#"{"method": "POST", "url": "/xmlrpc.php"}"#) + ]) + + #expect(fixtures.response(for: post("/xmlrpc.php")).status == 200) + #expect(fixtures.response(for: post("/xmlrpc.php?rsd")).status == 404) + } + + @Test func urlPatternHasToMatchTheWholePathAndQuery() throws { + let fixtures = try makeFixtureSet([ + "me.json": mapping(#"{"method": "GET", "urlPattern": "/rest/v1.1/me(/)?($|\\?.*)"}"#) + ]) + + #expect(fixtures.response(for: get("/rest/v1.1/me")).status == 200) + #expect(fixtures.response(for: get("/rest/v1.1/me/?locale=en")).status == 200) + #expect(fixtures.response(for: get("/rest/v1.1/me/sites")).status == 404) + } + + @Test func urlPatternTriesEveryAlternative() throws { + // An unanchored search would settle for "posts" and miss that "posts/new" matches in full. + let fixtures = try makeFixtureSet([ + "posts.json": mapping(#"{"urlPattern": "/sites/1/(posts|posts/new)"}"#) + ]) + + #expect(fixtures.response(for: get("/sites/1/posts/new")).status == 200) + } + + @Test func urlPathPatternIgnoresTheQuery() throws { + let fixtures = try makeFixtureSet([ + "stats.json": mapping(#"{"urlPathPattern": "/rest/v1.1/sites/\\d+/stats"}"#) + ]) + + #expect(fixtures.response(for: get("/rest/v1.1/sites/106707880/stats?period=day")).status == 200) + #expect(fixtures.response(for: get("/rest/v1.1/sites/abc/stats")).status == 404) + } + + @Test func matchesAnyHost() throws { + let fixtures = try makeFixtureSet([ + "avatar.json": mapping(#"{"urlPath": "/avatar/abc"}"#) + ]) + + let request = StubRequest(url: URL(string: "https://gravatar.com/avatar/abc?s=96")!) + #expect(fixtures.response(for: request).status == 200) + } + + @Test func methodHasToMatch() throws { + let fixtures = try makeFixtureSet([ + "new.json": mapping(#"{"method": "POST", "urlPath": "/posts/new"}"#), + "any.json": mapping(#"{"method": "ANY", "urlPath": "/anything"}"#) + ]) + + #expect(fixtures.response(for: post("/posts/new")).status == 200) + #expect(fixtures.response(for: get("/posts/new")).status == 404) + #expect(fixtures.response(for: request("DELETE", "/anything")).status == 200) + } + + // MARK: - Query + + @Test func queryParametersAreComparedDecoded() throws { + let fixtures = try makeFixtureSet([ + "drafts.json": mapping( + #""" + { + "urlPath": "/posts", + "queryParameters": {"status": {"equalTo": "draft,pending"}, "number": {"matches": "\\d+"}} + } + """# + ) + ]) + + #expect(fixtures.response(for: get("/posts?status=draft%2Cpending&number=20&extra=1")).status == 200) + #expect(fixtures.response(for: get("/posts?status=publish&number=20")).status == 404) + #expect(fixtures.response(for: get("/posts?status=draft%2Cpending&number=all")).status == 404) + #expect(fixtures.response(for: get("/posts?status=draft%2Cpending")).status == 404) + } + + @Test func absentQueryParameterMustNotBeSent() throws { + let fixtures = try makeFixtureSet([ + "available.json": mapping(#"{"urlPath": "/is-available", "queryParameters": {"format": {"absent": true}}}"#) + ]) + + #expect(fixtures.response(for: get("/is-available?q=a")).status == 200) + #expect(fixtures.response(for: get("/is-available?q=a&format=json")).status == 404) + } + + // MARK: - Body + + @Test func bodyPatternsAllHaveToMatch() throws { + let fixtures = try makeFixtureSet([ + "options.json": mapping( + #""" + { + "method": "POST", + "url": "/xmlrpc.php", + "bodyPatterns": [ + {"matches": ".*wp.getOptions.*"}, + {"matches": ".*e2eflowtestingmobile.*"} + ] + } + """# + ) + ]) + + let method = "wp.getOptions" + let user = "e2eflowtestingmobile" + #expect(fixtures.response(for: post("/xmlrpc.php", body: "\(method)\(user)")).status == 200) + #expect(fixtures.response(for: post("/xmlrpc.php", body: "\(method)")).status == 404) + #expect(fixtures.response(for: post("/xmlrpc.php")).status == 404) + } + + @Test func equalToJSONIgnoresKeyOrder() throws { + let fixtures = try makeFixtureSet([ + "reply.json": mapping( + #"{"method": "POST", "bodyPatterns": [{"equalToJson": {"content": "Hello", "context": "edit"}}]}"# + ) + ]) + + #expect(fixtures.response(for: post("/reply", body: #"{"context": "edit", "content": "Hello"}"#)).status == 200) + #expect(fixtures.response(for: post("/reply", body: #"{"context": "edit", "content": "Bye"}"#)).status == 404) + } + + @Test func matchesJSONPath() throws { + let fixtures = try makeFixtureSet([ + "post.json": mapping( + #"{"method": "POST", "urlPath": "/new", "bodyPatterns": [{"matchesJsonPath": "$[?(@.type == 'post')]"}]}"#, + response: #"{"status": 201}"# + ), + "site.json": mapping( + #"{"method": "POST", "urlPath": "/new", "bodyPatterns": [{"matchesJsonPath": "$.options.template"}]}"#, + response: #"{"status": 202}"# + ) + ]) + + #expect(fixtures.response(for: post("/new", body: #"{"type": "post"}"#)).status == 201) + #expect(fixtures.response(for: post("/new", body: #"{"options": {"template": "default"}}"#)).status == 202) + #expect(fixtures.response(for: post("/new", body: #"{"type": "page"}"#)).status == 404) + } + + // MARK: - Choosing between mappings + + private static let allPosts = #"{"urlPath": "/posts"}"# + private static let draftPosts = #"{"urlPath": "/posts", "queryParameters": {"status": {"equalTo": "draft"}}}"# + + @Test func theMoreSpecificMappingWinsAtEqualPriority() throws { + let fixtures = try makeFixtureSet([ + "a-all.json": mapping(Self.allPosts, response: #"{"status": 200, "body": "all"}"#), + "b-drafts.json": mapping(Self.draftPosts, response: #"{"status": 200, "body": "drafts"}"#) + ]) + + #expect(fixtures.response(for: get("/posts?status=draft")).text == "drafts") + #expect(fixtures.response(for: get("/posts?status=publish")).text == "all") + } + + @Test func aLowerPriorityNumberWinsOverSpecificity() throws { + let fixtures = try makeFixtureSet([ + "all.json": mapping( + Self.allPosts, + response: #"{"status": 200, "body": "all"}"#, + attributes: #""priority": 1"# + ), + "drafts.json": mapping(Self.draftPosts, response: #"{"status": 200, "body": "drafts"}"#) + ]) + + #expect(fixtures.response(for: get("/posts?status=draft")).text == "all") + } + + @Test func scenariosChangeWhatLaterRequestsGet() throws { + let fixtures = try makeFixtureSet([ + "before.json": mapping( + #"{"method": "GET", "urlPath": "/posts"}"#, + response: #"{"status": 200, "body": "no posts"}"#, + attributes: #""scenarioName": "new_post", "requiredScenarioState": "Started""# + ), + "publish.json": mapping( + #"{"method": "POST", "urlPath": "/posts/new"}"#, + attributes: #""scenarioName": "new_post", "newScenarioState": "published""# + ), + "after.json": mapping( + #"{"method": "GET", "urlPath": "/posts"}"#, + response: #"{"status": 200, "body": "one post"}"#, + attributes: #""scenarioName": "new_post", "requiredScenarioState": "published""# + ) + ]) + + #expect(fixtures.response(for: get("/posts")).text == "no posts") + #expect(fixtures.response(for: post("/posts/new")).status == 200) + #expect(fixtures.response(for: get("/posts")).text == "one post") + } + + // MARK: - Responses + + @Test func reportsTheMappingThatAnswered() throws { + let fixtures = try makeFixtureSet([ + "wpcom/me/me.json": mapping(#"{"urlPath": "/rest/v1.1/me"}"#) + ]) + + #expect(fixtures.response(for: get("/rest/v1.1/me")).source == "wpcom/me/me.json") + } + + @Test func answersAnUnmatchedRequestWithAnError() throws { + let fixtures = try makeFixtureSet([ + "me.json": mapping(#"{"urlPath": "/rest/v1.1/me"}"#) + ]) + + let response = fixtures.response(for: get("/rest/v1.1/sites/1/posts?number=20")) + #expect(response.status == 404) + #expect(response.source == nil) + #expect(response.text.contains("No fixture matches GET /rest/v1.1/sites/1/posts?number=20")) + } + + @Test func jsonBodyIsServedAsItIsWritten() throws { + let fixtures = try makeFixtureSet([ + "me.json": mapping( + #"{"urlPath": "/me"}"#, + response: #"{"status": 200, "jsonBody": {"ID": 152748359, "URL": "https://example.com/a"}}"# + ) + ]) + + let response = fixtures.response(for: get("/me")) + #expect(response.headers["Content-Type"] == "application/json") + #expect(response.text == #"{"ID": 152748359, "URL": "https://example.com/a"}"#) + } + + @Test func rendersTemplatesInTheBodyAndHeaders() throws { + let fixtures = try makeFixtureSet([ + "me.json": mapping( + #"{"urlPath": "/me"}"#, + response: #""" + { + "status": 200, + "jsonBody": {"self": "{{request.requestLine.baseUrl}}/me", "date": "{{now format='yyyy-MM-dd'}}"}, + "headers": {"Link": "<{{request.requestLine.baseUrl}}/wp-json/>"} + } + """# + ) + ]) + + let response = fixtures.response(for: get("/me")) + #expect(response.text == #"{"self": "https://public-api.wordpress.com/me", "date": "2025-06-15"}"#) + #expect(response.headers["Link"] == "") + } + + @Test func rendersTheTemplatesOfAJSONBodyInTheOrderTheyAreWritten() throws { + // The first key defines the variable the second one reads. Sorting the keys would break it. + let fixtures = try makeFixtureSet([ + "post.json": mapping( + #"{"urlPath": "/post"}"#, + response: #""" + { + "status": 200, + "jsonBody": { + "modified": "{{#assign 'format'}}yyyy-MM-dd'T'HH:mm:ss{{/assign}}{{now format=format}}", + "date": "{{now offset='-1 days' format=format}}", + "nested": {"braces": "}", "quote": "\"]"} + } + } + """# + ) + ]) + + let json = try JSONSerialization.jsonObject(with: fixtures.response(for: get("/post")).body) as? [String: Any] + #expect(json?["modified"] as? String == "2025-06-15T15:06:40") + #expect(json?["date"] as? String == "2025-06-14T15:06:40") + #expect(json?["nested"] as? [String: String] == ["braces": "}", "quote": "\"]"]) + } + + @Test func delayIsReadInMilliseconds() throws { + let fixtures = try makeFixtureSet([ + "slow.json": mapping(#"{"urlPath": "/slow"}"#, response: #"{"fixedDelayMilliseconds": 1500}"#) + ]) + + #expect(fixtures.response(for: get("/slow")).delay == 1.5) + } + + // MARK: - Loading + + @Test func rejectsAMatcherItDoesNotSupport() throws { + let error = #expect(throws: FixtureError.self) { + try makeFixtureSet([ + "wpcom/me.json": mapping(#"{"urlPath": "/me", "headers": {"Accept": {"contains": "json"}}}"#) + ]) + } + + #expect(error?.file == "wpcom/me.json") + #expect(error?.reason == "request has unsupported keys: headers") + } + + @Test func rejectsATemplateItCannotRender() throws { + let error = #expect(throws: FixtureError.self) { + try makeFixtureSet([ + "me.json": mapping( + #"{"urlPath": "/me"}"#, + response: #"{"status": 200, "body": "{{randomValue type='UUID'}}"}"# + ) + ]) + } + + #expect(error?.file == "me.json") + } + + @Test func rejectsADirectoryWithoutMappings() throws { + #expect(throws: FixtureError.self) { + try FixtureSet(directory: FileManager.default.temporaryDirectory.appending(path: UUID().uuidString)) + } + } +} + +/// The fixtures the Jetpack UI tests run against. +/// +/// The app refuses to launch with fixtures it can't read, which fails every UI test at once. This +/// reports the same problem in the time it takes to run a unit test. +@Suite +struct JetpackUITestFixturesTests { + private static let directory = URL(filePath: #filePath) + .appending(path: "../../../../Tests/JetpackUITests/Fixtures") + .standardizedFileURL + + /// Skipped where the tests run without the source tree next to them. + @Test(.enabled(if: FileManager.default.fileExists(atPath: directory.path(percentEncoded: false)))) + func everyMappingLoads() throws { + _ = try FixtureSet(directory: Self.directory) + } +} +#endif diff --git a/Modules/Tests/HTTPFixturesTests/FixtureURLProtocolTests.swift b/Modules/Tests/HTTPFixturesTests/FixtureURLProtocolTests.swift new file mode 100644 index 000000000000..f3e771ffa4ce --- /dev/null +++ b/Modules/Tests/HTTPFixturesTests/FixtureURLProtocolTests.swift @@ -0,0 +1,122 @@ +#if UI_TEST_HTTP_FIXTURES +import Foundation +import Testing +@testable import HTTPFixtures + +/// These share the protocol's process-wide fixtures, so they run one at a time. +@Suite(.serialized) +struct FixtureURLProtocolTests { + private let session: URLSession = { + let configuration = URLSessionConfiguration.ephemeral + configuration.protocolClasses = [FixtureURLProtocol.self] + return URLSession(configuration: configuration) + }() + + private static let mappings = [ + "wpcom/me.json": mapping( + #"{"method": "GET", "urlPath": "/rest/v1.1/me"}"#, + response: #"{"status": 200, "jsonBody": {"username": "e2eflowtestingmobile"}}"# + ), + "wpcom/new-post.json": mapping( + #"{"method": "POST", "urlPath": "/posts/new", "bodyPatterns": [{"matchesJsonPath": "$[?(@.type == 'post')]"}]}"#, + response: #"{"status": 201, "body": "{{jsonPath request.body '$.title'}}"}"# + ), + "wpcom/slow.json": mapping( + #"{"urlPath": "/slow"}"#, + response: #"{"status": 200, "body": "eventually", "fixedDelayMilliseconds": 50}"# + ) + ] + + @Test func answersARequestFromTheFixtures() async throws { + FixtureURLProtocol.activate(fixtures: try makeFixtureSet(Self.mappings)) + defer { FixtureURLProtocol.deactivate() } + + let url = URL(string: "https://public-api.wordpress.com/rest/v1.1/me?locale=en")! + let (data, response) = try await session.data(from: url) + + #expect((response as? HTTPURLResponse)?.statusCode == 200) + #expect((response as? HTTPURLResponse)?.value(forHTTPHeaderField: "Content-Type") == "application/json") + #expect(String(decoding: data, as: UTF8.self) == #"{"username": "e2eflowtestingmobile"}"#) + } + + @Test func answersARequestNothingMatchesWithA404() async throws { + FixtureURLProtocol.activate(fixtures: try makeFixtureSet(Self.mappings)) + defer { FixtureURLProtocol.deactivate() } + + let (_, response) = try await session.data(from: URL(string: "https://example.com/unknown")!) + + #expect((response as? HTTPURLResponse)?.statusCode == 404) + } + + @Test func readsTheBodyOfARequest() async throws { + FixtureURLProtocol.activate(fixtures: try makeFixtureSet(Self.mappings)) + defer { FixtureURLProtocol.deactivate() } + + var request = URLRequest(url: URL(string: "https://public-api.wordpress.com/posts/new")!) + request.httpMethod = "POST" + request.httpBody = Data(#"{"type": "post", "title": "From httpBody"}"#.utf8) + let (data, response) = try await session.data(for: request) + + #expect((response as? HTTPURLResponse)?.statusCode == 201) + #expect(String(decoding: data, as: UTF8.self) == "From httpBody") + } + + @Test func readsTheBodyOfAnUpload() async throws { + FixtureURLProtocol.activate(fixtures: try makeFixtureSet(Self.mappings)) + defer { FixtureURLProtocol.deactivate() } + + var request = URLRequest(url: URL(string: "https://public-api.wordpress.com/posts/new")!) + request.httpMethod = "POST" + let body = Data(#"{"type": "post", "title": "From an upload"}"#.utf8) + let (data, response) = try await session.upload(for: request, from: body) + + #expect((response as? HTTPURLResponse)?.statusCode == 201) + #expect(String(decoding: data, as: UTF8.self) == "From an upload") + } + + @Test func deliversADelayedResponse() async throws { + FixtureURLProtocol.activate(fixtures: try makeFixtureSet(Self.mappings)) + defer { FixtureURLProtocol.deactivate() } + + let (data, _) = try await session.data(from: URL(string: "https://public-api.wordpress.com/slow")!) + + #expect(String(decoding: data, as: UTF8.self) == "eventually") + } + + @Test func logsEveryRequestWithItsBodyAndTheMappingThatAnsweredIt() async throws { + let log = FileManager.default.temporaryDirectory.appending(path: "\(UUID().uuidString).log") + FixtureURLProtocol.activate(fixtures: try makeFixtureSet(Self.mappings), requestLog: log) + defer { FixtureURLProtocol.deactivate() } + + let newPost = URL(string: "https://public-api.wordpress.com/posts/new")! + let avatar = URL(string: "https://gravatar.com/avatar/abc?s=96")! + var request = URLRequest(url: newPost) + request.httpMethod = "POST" + request.httpBody = Data(#"{"type": "post", "title": "Two\nlines"}"#.utf8) + _ = try await session.data(for: request) + _ = try await session.data(from: avatar) + + let requests = try String(contentsOf: log, encoding: .utf8) + .split(separator: "\n") + .map { try JSONDecoder().decode(RecordedRequest.self, from: Data($0.utf8)) } + #expect( + requests == [ + RecordedRequest( + method: "POST", + url: newPost, + body: #"{"type": "post", "title": "Two\nlines"}"#, + status: 201, + fixture: "wpcom/new-post.json" + ), + RecordedRequest(method: "GET", url: avatar, body: nil, status: 404, fixture: nil) + ] + ) + } + + @Test func leavesRequestsAloneWhenThereAreNoFixtures() { + let request = URLRequest(url: URL(string: "https://public-api.wordpress.com/rest/v1.1/me")!) + + #expect(!FixtureURLProtocol.canInit(with: request)) + } +} +#endif diff --git a/Modules/Tests/HTTPFixturesTests/ResponseTemplateTests.swift b/Modules/Tests/HTTPFixturesTests/ResponseTemplateTests.swift new file mode 100644 index 000000000000..f97f031a07f7 --- /dev/null +++ b/Modules/Tests/HTTPFixturesTests/ResponseTemplateTests.swift @@ -0,0 +1,87 @@ +#if UI_TEST_HTTP_FIXTURES +import Foundation +import Testing +@testable import HTTPFixtures + +@Suite +struct ResponseTemplateTests { + /// Sunday 15 June 2025, 15:06:40 UTC. + private let now = Date(timeIntervalSince1970: 1_750_000_000) + + private func render(_ template: String, for request: StubRequest = get("/")) throws -> String { + var renderer = ResponseTemplate(request: request, now: now) + return try renderer.render(template) + } + + @Test func leavesTextWithoutExpressionsAlone() throws { + #expect(try render(#"{"name": "Tri-County Real Estate"}"#) == #"{"name": "Tri-County Real Estate"}"#) + } + + @Test func baseURLIsTheHostTheRequestWentTo() throws { + let request = StubRequest(url: URL(string: "http://localhost:8282/rest/v1.1/me")!) + + #expect(try render("{{request.requestLine.baseUrl}}/me") == "https://public-api.wordpress.com/me") + #expect(try render("{{request.requestLine.baseUrl}}/me", for: request) == "http://localhost:8282/me") + } + + @Test func readsTheQueryAndThePath() throws { + let request = get("/rest/v1.2/read/tags/dogs/mine/new?url=https%3A%2F%2Fexample.com&tags%5B%5D=cats") + + #expect(try render("{{request.query.url}}", for: request) == "https://example.com") + #expect(try render("{{request.pathSegments.[4]}}", for: request) == "dogs") + #expect(try render("{{lookup request.query 'tags[]'}}", for: request) == "cats") + #expect(try render("{{capitalize (lookup request.query 'tags[]')}}", for: request) == "Cats") + #expect(try render("{{capitalize request.pathSegments.[4]}}", for: request) == "Dogs") + } + + @Test func aRequestValueThatIsMissingRendersAsNothing() throws { + #expect(try render("[{{request.query.url}}][{{request.pathSegments.[9]}}]") == "[][]") + } + + @Test func nowDefaultsToISO8601() throws { + #expect(try render("{{now}}") == "2025-06-15T15:06:40Z") + } + + @Test(arguments: [ + ("{{now format='yyyy-MM-dd'}}", "2025-06-15"), + ("{{now offset='-1 days' format='yyyy-MM-dd'}}", "2025-06-14"), + ("{{now offset='3 months' format='yyyy-MM-dd'}}", "2025-09-15"), + ("{{now offset='-1 years' format='yyyy-MM-dd'}}", "2024-06-15"), + ("{{now offset='-16 hours'}}", "2025-06-14T23:06:40Z"), + ("{{now offset='2 days' format='HH:mm:ssZ'}}", "15:06:40+0000"), + ("{{now format='epoch'}}", "1750000000000"), + ("{{now format='unix'}}", "1750000000") + ]) + func nowTakesAnOffsetAndAFormat(template: String, expected: String) throws { + #expect(try render(template) == expected) + } + + @Test func assignDefinesAVariableAndRendersNothing() throws { + let template = "{{#assign 'format'}}yyyy-MM-dd'T'HH:mm:ss{{/assign}}{{now offset='-2 hours' format=format}}" + + #expect(try render(template) == "2025-06-15T13:06:40") + } + + @Test func jsonPathReadsTheRequestBody() throws { + let request = post("/posts/new", body: #"{"title": "Hello", "terms": {"count": 2}}"#) + + #expect(try render("{{jsonPath request.body '$.title'}}", for: request) == "Hello") + #expect(try render("{{jsonPath request.body '$.terms.count'}}", for: request) == "2") + #expect(try render("{{jsonPath request.body '$.missing'}}", for: request).isEmpty) + } + + @Test(arguments: [ + "{{randomValue type='UUID'}}", + "{{request.headers.Accept}}", + "{{now timezone='Australia/Sydney'}}", + "{{now offset='1 day'}}", + "{{now", + "{{#assign 'name'}}value" + ]) + func rejectsWhatItCannotRender(template: String) { + #expect(throws: ResponseTemplate.Failure.self) { + try render(template) + } + } +} +#endif diff --git a/Modules/Tests/HTTPFixturesTests/StatsSeriesTests.swift b/Modules/Tests/HTTPFixturesTests/StatsSeriesTests.swift new file mode 100644 index 000000000000..b3c641f7d585 --- /dev/null +++ b/Modules/Tests/HTTPFixturesTests/StatsSeriesTests.swift @@ -0,0 +1,155 @@ +#if UI_TEST_HTTP_FIXTURES +import Foundation +import Testing +import HTTPFixtures + +@Suite +struct StatsSeriesTests { + private static let fields = #""" + [ + {"name": "views", "average": 400, "hourly": true}, + {"name": "visitors", "average": 250}, + {"name": "subscribers", "level": 1200, "growth": 2} + ] + """# + + private let fixtures: FixtureSet + + init() throws { + fixtures = try makeFixtureSet([ + "visits.json": mapping( + #"{"method": "GET", "urlPath": "/stats/visits/"}"#, + response: #""" + {"status": 200, "transformers": ["stats-series"], "transformerParameters": {"fields": \#(Self.fields)}} + """# + ) + ]) + } + + private struct Series { + let date: String + let unit: String + let fields: [String] + let rows: [[Any]] + + var periods: [String] { rows.compactMap { $0.first as? String } } + + func values(of field: String) -> [Int?] { + let index = fields.firstIndex(of: field) ?? 0 + return rows.map { $0[index] as? Int } + } + } + + private func series(_ query: String) throws -> Series { + let response = fixtures.response(for: get("/stats/visits/?\(query)")) + #expect(response.status == 200) + #expect(response.headers["Content-Type"] == "application/json") + let json = try #require(try JSONSerialization.jsonObject(with: response.body) as? [String: Any]) + return Series( + date: json["date"] as? String ?? "", + unit: json["unit"] as? String ?? "", + fields: json["fields"] as? [String] ?? [], + rows: json["data"] as? [[Any]] ?? [] + ) + } + + @Test func hasARowForEveryDayOfTheInterval() throws { + let series = try series("unit=day&start_date=2026-09-29&date=2026-10-05&quantity=0") + + #expect(series.date == "2026-10-05") + #expect(series.unit == "day") + #expect(series.fields == ["period", "views", "visitors", "subscribers"]) + #expect( + series.periods == [ + "2026-09-29", "2026-09-30", "2026-10-01", "2026-10-02", "2026-10-03", "2026-10-04", "2026-10-05" + ] + ) + } + + @Test func aDayHasTheSameValueInEveryInterval() throws { + let week = try series("unit=day&start_date=2026-09-29&date=2026-10-05") + let day = try series("unit=day&start_date=2026-10-02&date=2026-10-02") + + #expect(day.periods == ["2026-10-02"]) + #expect(day.values(of: "views") == [week.values(of: "views")[3]]) + #expect(day.values(of: "visitors") == [week.values(of: "visitors")[3]]) + } + + @Test func valuesVaryAroundTheAverage() throws { + let views = try series("unit=day&start_date=2026-07-01&date=2026-09-28").values(of: "views").compactMap { $0 } + + #expect(views.count == 90) + #expect(Set(views).count > 30) + #expect(views.allSatisfy { (200...600).contains($0) }) + #expect((360...440).contains(views.reduce(0, +) / views.count)) + } + + @Test func countsBackFromTheDateWithoutAStartDate() throws { + let series = try series("unit=day&date=2026-10-05&quantity=3") + + #expect(series.periods == ["2026-10-03", "2026-10-04", "2026-10-05"]) + } + + @Test func hoursOnlyHaveTheFieldsThatAreHourly() throws { + let series = try series("unit=hour&start_date=2026-10-05%2000:00:00&date=2026-10-05%2023:59:59&quantity=0") + + #expect(series.date == "2026-10-05 23:59:59") + #expect(series.periods.count == 24) + #expect(series.periods.first == "2026-10-05 00:00:00") + #expect(series.periods.last == "2026-10-05 23:00:00") + #expect(series.values(of: "views").allSatisfy { $0 != nil }) + #expect(series.values(of: "visitors").allSatisfy { $0 == nil }) + } + + @Test func theHoursOfADayAddUpToAboutTheDay() throws { + let hours = try series("unit=hour&start_date=2026-10-05%2000:00:00&date=2026-10-05%2023:59:59") + let day = try series("unit=day&start_date=2026-10-05&date=2026-10-05") + + let total = hours.values(of: "views").compactMap { $0 }.reduce(0, +) + let views = try #require(day.values(of: "views")[0]) + #expect(abs(total - views) <= 12) + } + + @Test func aWeekIsTheSumOfItsDays() throws { + // Weeks start on Monday, and are labeled the way WordPress.com labels them. + let weeks = try series("unit=week&start_date=2026-09-21&date=2026-10-04") + let days = try series("unit=day&start_date=2026-09-21&date=2026-10-04").values(of: "views").compactMap { $0 } + + #expect(weeks.periods == ["2026W09W21", "2026W09W28"]) + #expect(weeks.values(of: "views") == [days[0..<7].reduce(0, +), days[7..<14].reduce(0, +)]) + } + + @Test func monthsAndYearsAreLabeledWithTheirFirstDay() throws { + #expect( + try series("unit=month&start_date=2026-08-15&date=2026-10-05").periods == [ + "2026-08-01", "2026-09-01", "2026-10-01" + ] + ) + #expect(try series("unit=year&date=2026-10-05&quantity=2").periods == ["2025-01-01", "2026-01-01"]) + } + + @Test func aLevelIsItsValueTodayAndLowerBefore() throws { + // The fixtures' clock reads 15 June 2025. + let subscribers = try series("unit=day&start_date=2025-06-13&date=2025-06-15").values(of: "subscribers") + + #expect(subscribers == [1196, 1198, 1200]) + } + + @Test func hasNoRowsWithoutADate() throws { + #expect(try series("unit=day").rows.isEmpty) + } + + @Test(arguments: [ + #"{"status": 200, "transformers": ["stats-series"]}"#, + #"{"status": 200, "transformers": ["stats-series"], "transformerParameters": {"fields": [{"name": "views"}]}}"#, + #"{"status": 200, "transformers": ["stats-series"], "transformerParameters": {"fields": [], "seed": 1}}"#, + #"{"status": 200, "transformers": ["random-values"]}"#, + #"{"status": 200, "transformerParameters": {"fields": []}}"# + ]) + func rejectsAResponseItCannotGenerate(response: String) { + #expect(throws: FixtureError.self) { + try makeFixtureSet(["visits.json": mapping(#"{"urlPath": "/stats/visits/"}"#, response: response)]) + } + } +} +#endif diff --git a/Modules/Tests/HTTPFixturesTests/TemporaryFixtures.swift b/Modules/Tests/HTTPFixturesTests/TemporaryFixtures.swift new file mode 100644 index 000000000000..2c2eaefa2794 --- /dev/null +++ b/Modules/Tests/HTTPFixturesTests/TemporaryFixtures.swift @@ -0,0 +1,53 @@ +#if UI_TEST_HTTP_FIXTURES +import Foundation +import HTTPFixtures + +/// Writes mappings to a temporary directory laid out the way `FixtureSet` reads them. +/// +/// - Parameter mappings: The mapping files, keyed by their path under the `mappings` directory. +func makeFixtureSet( + _ mappings: [String: String], + now: Date = Date(timeIntervalSince1970: 1_750_000_000) +) throws -> FixtureSet { + let directory = FileManager.default.temporaryDirectory.appending(path: UUID().uuidString) + for (path, json) in mappings { + let file = directory.appending(path: "mappings").appending(path: path) + try FileManager.default.createDirectory(at: file.deletingLastPathComponent(), withIntermediateDirectories: true) + try Data(json.utf8).write(to: file) + } + return try FixtureSet(directory: directory, now: { now }) +} + +/// The text of a mapping file. +/// +/// - Parameters: +/// - request: The request matcher, as JSON. +/// - response: The response, as JSON. +/// - attributes: The mapping's other keys, such as its priority, as the inside of a JSON object. +func mapping(_ request: String, response: String = #"{"status": 200}"#, attributes: String? = nil) -> String { + let attributes = attributes.map { "\($0), " } ?? "" + return "{\(attributes)\"request\": \(request), \"response\": \(response)}" +} + +func get(_ pathAndQuery: String) -> StubRequest { + request("GET", pathAndQuery) +} + +func post(_ pathAndQuery: String, body: String? = nil) -> StubRequest { + request("POST", pathAndQuery, body: body) +} + +func request(_ method: String, _ pathAndQuery: String, body: String? = nil) -> StubRequest { + StubRequest( + method: method, + url: URL(string: "https://public-api.wordpress.com\(pathAndQuery)")!, + body: body.map { Data($0.utf8) } + ) +} + +extension StubResponse { + var text: String { + String(decoding: body, as: UTF8.self) + } +} +#endif diff --git a/Package.swift b/Package.swift index c2eabdc904ba..129ee94faef5 100644 --- a/Package.swift +++ b/Package.swift @@ -17,6 +17,11 @@ let package = Package( .package(url: "https://github.com/scinfu/SwiftSoup", exact: "2.13.6") ], targets: [ + .testTarget( + name: "HTTPFixturesTests", + dependencies: [.product(name: "HTTPFixtures", package: "Modules")], + path: "Modules/Tests/HTTPFixturesTests" + ), .testTarget( name: "JetpackStatsWidgetsCoreTests", dependencies: [.product(name: "JetpackStatsWidgetsCore", package: "Modules")], diff --git a/Scripts/sim-signin.sh b/Scripts/sim-signin.sh new file mode 100755 index 000000000000..e581a170bdb9 --- /dev/null +++ b/Scripts/sim-signin.sh @@ -0,0 +1,191 @@ +#!/bin/bash +# +# Sign an iOS Simulator into WordPress.com with a bearer token, in one command. +# +# Wraps `xcrun simctl launch`, passing the `-wpcom-token` launch argument the app reads on +# the login screen to finish WordPress.com sign-in automatically — no taps required. +# Build and install the app on the simulator first (e.g. from Xcode). + +set -euo pipefail + +usage() { + cat <<'EOF' +Sign an iOS Simulator into WordPress.com with a bearer token, in one command. + +Usage: + Scripts/sim-signin.sh [options] + +Options: + -a, --app App to sign in (default: jetpack) + -d, --device Target simulator (default: the running one; prompts if several) + -r, --reset Uninstall and reinstall the app first, for a clean slate + -h, --help Show this help + +Examples: + Scripts/sim-signin.sh # Jetpack, booted simulator + Scripts/sim-signin.sh --app wordpress # WordPress + Scripts/sim-signin.sh --reset # reinstall for a clean slate first + +The WordPress.com bearer token is read from (in order): + 1. WPCOM_TOKEN environment variable + 2. ~/.wpcom-token file + 3. otherwise the script prompts you to paste one (and offers to save it to ~/.wpcom-token) + +It is deliberately NOT accepted as a command-line flag: a token passed on the command line +would be saved in your shell history. Set WPCOM_TOKEN or write ~/.wpcom-token once. +EOF +} + +app="jetpack" +device="" +reset=false +token="" + +require_value() { + # $1 = option name, $2 = remaining argument count ($#) + if [[ "$2" -lt 2 ]]; then + echo "error: $1 requires a value" >&2 + exit 1 + fi +} + +resolve_device() { + # Set `device` to a booted simulator: the only one if just one is booted, otherwise + # prompt to choose. Errors if none are booted. Called only when --device was omitted. + local udids=() names=() line udid name + while IFS= read -r line; do + # `|| true` so a UUID-less line (or a SIGPIPE from `head` under `pipefail`) doesn't + # trip `set -e` and abort the whole script before the `continue` below can skip it. + udid=$(printf '%s\n' "$line" | grep -oiE '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}' | head -1 || true) + [[ -z "$udid" ]] && continue + name=$(printf '%s\n' "$line" | sed -E 's/^[[:space:]]*//; s/[[:space:]]*\([0-9A-Fa-f-]{36}\).*$//') + udids+=("$udid") + names+=("$name") + done < <(xcrun simctl list devices booted | grep -F "(Booted)") + + local n=${#udids[@]} + if [[ "$n" -eq 0 ]]; then + echo "error: no booted simulator. Boot one (open Simulator, or 'xcrun simctl boot '), or pass --device ." >&2 + exit 1 + fi + if [[ "$n" -eq 1 ]]; then + device="${udids[0]}" + echo "Using the only booted simulator: ${names[0]} (${device})" + return + fi + + echo "Multiple simulators are booted — choose one:" >&2 + local i + for (( i = 0; i < n; i++ )); do + printf " %2d) %s (%s)\n" "$(( i + 1 ))" "${names[i]}" "${udids[i]}" >&2 + done + local sel + while true; do + printf "Select a simulator [1-%d]: " "$n" >&2 + if ! read -r sel; then + echo >&2 + echo "error: no selection made; re-run with --device ." >&2 + exit 1 + fi + if [[ "$sel" =~ ^[0-9]+$ ]] && [[ "$sel" -ge 1 ]] && [[ "$sel" -le "$n" ]]; then + device="${udids[sel - 1]}" + echo "Using ${names[sel - 1]} (${device})" + return + fi + echo " not a valid choice: '$sel'" >&2 + done +} + +reset_app() { + # A clean slate: uninstall the app (which removes its entire data container — Core Data, + # UserDefaults, caches, cookies) and reinstall the same bundle. Unlike the in-app + # `-ui-test-reset-everything` wipe, `simctl install` is synchronous, so there's no window to + # race before the sign-in launch, and it clears more than just Core Data + UserDefaults. + local app_bundle bundle_name + app_bundle=$(xcrun simctl get_app_container "$device" "$bundle_id" app 2>/dev/null || true) + if [[ -z "$app_bundle" || ! -d "$app_bundle" ]]; then + echo "error: can't reset — $app ($bundle_id) isn't installed on '$device'. Build and install it first (e.g. from Xcode)." >&2 + exit 1 + fi + bundle_name=$(basename "$app_bundle") + + # Uninstall deletes the installed bundle in place, so stage a copy to reinstall from. + # `reset_staging` is intentionally global so the EXIT trap can clean it up at script exit. + reset_staging=$(mktemp -d) + trap 'rm -rf "$reset_staging"' EXIT + cp -R "$app_bundle" "$reset_staging/$bundle_name" + + echo "Resetting $app (uninstall + reinstall for a clean slate)…" + xcrun simctl uninstall "$device" "$bundle_id" + xcrun simctl install "$device" "$reset_staging/$bundle_name" +} + +while [[ $# -gt 0 ]]; do + case "$1" in + -a|--app) require_value "$1" "$#"; app="$2"; shift 2 ;; + -d|--device) require_value "$1" "$#"; device="$2"; shift 2 ;; + -r|--reset) reset=true; shift ;; + -h|--help) usage; exit 0 ;; + *) echo "error: unknown argument '$1'" >&2; usage >&2; exit 1 ;; + esac +done + +# The token is read from the WPCOM_TOKEN environment variable, then a ~/.wpcom-token file. +# It is intentionally not a command-line argument, to keep it out of shell history. +if [[ -z "$token" ]]; then + token="${WPCOM_TOKEN:-}" +fi +if [[ -z "$token" && -f "$HOME/.wpcom-token" ]]; then + token="$(tr -d '[:space:]' < "$HOME/.wpcom-token")" +fi + +# Nothing found anywhere — prompt for one. Input is hidden, since it's a secret. +if [[ -z "$token" ]]; then + printf "No WordPress.com token found (WPCOM_TOKEN / ~/.wpcom-token).\n" >&2 + printf "Paste a bearer token (hidden), or press Return to cancel: " >&2 + read -rs token || true + printf "\n" >&2 + token="$(printf '%s' "$token" | tr -d '[:space:]')" + if [[ -n "$token" ]]; then + printf "Token received (%s chars).\n" "${#token}" >&2 + printf "Save it to ~/.wpcom-token for next time? [y/N] " >&2 + read -r save_reply || true + if [[ "$save_reply" =~ ^[Yy]$ ]]; then + token_file="$HOME/.wpcom-token" + # umask keeps the new file owner-only; chmod covers an existing, looser file. + if (umask 077; printf '%s\n' "$token" > "$token_file"); then + chmod 600 "$token_file" 2>/dev/null || true + printf "Saved to %s (mode 600).\n" "$token_file" >&2 + else + printf "warning: could not write %s; continuing without saving.\n" "$token_file" >&2 + fi + fi + fi +fi + +if [[ -z "$token" ]]; then + echo "error: no token — set WPCOM_TOKEN, write ~/.wpcom-token, or paste one when prompted" >&2 + usage >&2 + exit 1 +fi + +case "$app" in + jetpack) bundle_id="com.automattic.jetpack" ;; + wordpress) bundle_id="org.wordpress" ;; + *) echo "error: unknown app '$app' (expected 'jetpack' or 'wordpress')" >&2; exit 1 ;; +esac + +# When no --device was given, target the running simulator (prompting if several are booted). +if [[ -z "$device" ]]; then + resolve_device +fi + +echo "Signing $app ($bundle_id) into WordPress.com on simulator '$device'…" + +if [[ "$reset" == true ]]; then + reset_app +fi + +xcrun simctl launch --terminate-running-process "$device" "$bundle_id" -wpcom-token "$token" + +echo "Done. The app signs in automatically from the login screen." diff --git a/Tests/JetpackUITests/Fixtures/mappings/self-hosted/homepage.json b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/homepage.json new file mode 100644 index 000000000000..1d14a79b8dcb --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/homepage.json @@ -0,0 +1,15 @@ +{ + "request": { + "method": "GET", + "urlPath": "/" + }, + "response": { + "status": 200, + "body": "Mock WordPress Site", + "headers": { + "Content-Type": "text/html; charset=UTF-8", + "Link": "<{{request.requestLine.baseUrl}}/wp-json/>; rel=\"https://api.w.org/\"" + }, + "transformers": ["response-template"] + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/self-hosted/rest_v11_connect_site_info_self-hosted.json b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/rest_v11_connect_site_info_self-hosted.json new file mode 100644 index 000000000000..932ca9d777c1 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/rest_v11_connect_site_info_self-hosted.json @@ -0,0 +1,29 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/connect/site-info", + "queryParameters": { + "url": { + "matches": "^http(s)?://((?!wordpress.com).)*$" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "urlAfterRedirects": "{{request.query.url}}", + "exists": true, + "isWordPress": true, + "hasJetpack": true, + "jetpackVersion": "7.3.1", + "isJetpackActive": true, + "isJetpackConnected": false, + "isWordPressDotCom": false + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/self-hosted/wp-json-app-passwords-introspect.json b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/wp-json-app-passwords-introspect.json new file mode 100644 index 000000000000..6b0500d37775 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/wp-json-app-passwords-introspect.json @@ -0,0 +1,25 @@ +{ + "request": { + "method": "GET", + "urlPath": "/wp-json/wp/v2/users/me/application-passwords/introspect", + "queryParameters": { + "context": { + "equalTo": "view" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "uuid": "12345678-1234-1234-1234-123456789abc", + "app_id": "7088f42d-34e9-4402-ab50-b506b819f3e4", + "name": "Jetpack iOS app on Mock Device", + "created": "2025-01-01T00:00:00+00:00", + "last_used": null, + "last_ip": null + }, + "headers": { + "Content-Type": "application/json; charset=UTF-8" + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/self-hosted/wp-json-index.json b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/wp-json-index.json new file mode 100644 index 000000000000..9784a7683f6b --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/wp-json-index.json @@ -0,0 +1,10065 @@ +{ + "request": { + "method": "GET", + "urlPath": "/wp-json/" + }, + "response": { + "status": 200, + "jsonBody": { + "name": "wp-local-site", + "description": "", + "url": "http:\/\/localhost:8282", + "home": "http:\/\/localhost:8282", + "gmt_offset": "0", + "timezone_string": "", + "page_for_posts": 0, + "page_on_front": 0, + "show_on_front": "posts", + "namespaces": [ + "oembed\/1.0", + "wp\/v2", + "wp-site-health\/v1", + "wp-block-editor\/v1", + "wp-abilities\/v1" + ], + "authentication": { + "application-passwords": { + "endpoints": { + "authorization": "http:\/\/localhost:8282\/wp-admin\/authorize-application.php" + } + } + }, + "routes": { + "\/": { + "namespace": "", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { "context": { "default": "view", "required": false } } + } + ], + "_links": { + "self": [{ "href": "http:\/\/localhost:8282\/wp-json\/" }] + } + }, + "\/batch\/v1": { + "namespace": "", + "methods": ["POST"], + "endpoints": [ + { + "methods": ["POST"], + "args": { + "validation": { + "type": "string", + "enum": ["require-all-validate", "normal"], + "default": "normal", + "required": false + }, + "requests": { + "type": "array", + "maxItems": 25, + "items": { + "type": "object", + "properties": { + "method": { + "type": "string", + "enum": ["POST", "PUT", "PATCH", "DELETE"], + "default": "POST" + }, + "path": { "type": "string", "required": true }, + "body": { + "type": "object", + "properties": [], + "additionalProperties": true + }, + "headers": { + "type": "object", + "properties": [], + "additionalProperties": { + "type": ["string", "array"], + "items": { "type": "string" } + } + } + } + }, + "required": true + } + } + } + ], + "_links": { + "self": [{ "href": "http:\/\/localhost:8282\/wp-json\/batch\/v1" }] + } + }, + "\/oembed\/1.0": { + "namespace": "oembed\/1.0", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "namespace": { "default": "oembed\/1.0", "required": false }, + "context": { "default": "view", "required": false } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/oembed\/1.0" } + ] + } + }, + "\/oembed\/1.0\/embed": { + "namespace": "oembed\/1.0", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "url": { + "description": "The URL of the resource for which to fetch oEmbed data.", + "type": "string", + "format": "uri", + "required": true + }, + "format": { "default": "json", "required": false }, + "maxwidth": { "default": 600, "required": false } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/oembed\/1.0\/embed" } + ] + } + }, + "\/oembed\/1.0\/proxy": { + "namespace": "oembed\/1.0", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "url": { + "description": "The URL of the resource for which to fetch oEmbed data.", + "type": "string", + "format": "uri", + "required": true + }, + "format": { + "description": "The oEmbed format to use.", + "type": "string", + "default": "json", + "enum": ["json", "xml"], + "required": false + }, + "maxwidth": { + "description": "The maximum width of the embed frame in pixels.", + "type": "integer", + "default": 600, + "required": false + }, + "maxheight": { + "description": "The maximum height of the embed frame in pixels.", + "type": "integer", + "required": false + }, + "discover": { + "description": "Whether to perform an oEmbed discovery request for unsanctioned providers.", + "type": "boolean", + "default": true, + "required": false + } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/oembed\/1.0\/proxy" } + ] + } + }, + "\/wp\/v2": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "namespace": { "default": "wp\/v2", "required": false }, + "context": { "default": "view", "required": false } + } + } + ], + "_links": { + "self": [{ "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2" }] + } + }, + "\/wp\/v2\/posts": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": true }, + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "default": 10, + "minimum": 1, + "maximum": 100, + "required": false + }, + "search": { + "description": "Limit results to those matching a string.", + "type": "string", + "required": false + }, + "after": { + "description": "Limit response to posts published after a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "modified_after": { + "description": "Limit response to posts modified after a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "author": { + "description": "Limit result set to posts assigned to specific authors.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "author_exclude": { + "description": "Ensure result set excludes posts assigned to specific authors.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "before": { + "description": "Limit response to posts published before a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "modified_before": { + "description": "Limit response to posts modified before a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "exclude": { + "description": "Ensure result set excludes specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "include": { + "description": "Limit result set to specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "search_semantics": { + "description": "How to interpret the search input.", + "type": "string", + "enum": ["exact"], + "required": false + }, + "offset": { + "description": "Offset the result set by a specific number of items.", + "type": "integer", + "required": false + }, + "order": { + "description": "Order sort attribute ascending or descending.", + "type": "string", + "default": "desc", + "enum": ["asc", "desc"], + "required": false + }, + "orderby": { + "description": "Sort collection by post attribute.", + "type": "string", + "default": "date", + "enum": [ + "author", + "date", + "id", + "include", + "modified", + "parent", + "relevance", + "slug", + "include_slugs", + "title" + ], + "required": false + }, + "search_columns": { + "default": [], + "description": "Array of column names to be searched.", + "type": "array", + "items": { + "enum": ["post_title", "post_content", "post_excerpt"], + "type": "string" + }, + "required": false + }, + "slug": { + "description": "Limit result set to posts with one or more specific slugs.", + "type": "array", + "items": { "type": "string" }, + "required": false + }, + "status": { + "default": "publish", + "description": "Limit result set to posts assigned one or more statuses.", + "type": "array", + "items": { + "enum": [ + "publish", + "future", + "draft", + "pending", + "private", + "trash", + "auto-draft", + "inherit", + "request-pending", + "request-confirmed", + "request-failed", + "request-completed", + "any" + ], + "type": "string" + }, + "required": false + }, + "tax_relation": { + "description": "Limit result set based on relationship between multiple taxonomies.", + "type": "string", + "enum": ["AND", "OR"], + "required": false + }, + "categories": { + "description": "Limit result set to items with specific terms assigned in the categories taxonomy.", + "type": ["object", "array"], + "oneOf": [ + { + "title": "Term ID List", + "description": "Match terms with the listed IDs.", + "type": "array", + "items": { "type": "integer" } + }, + { + "title": "Term ID Taxonomy Query", + "description": "Perform an advanced term query.", + "type": "object", + "properties": { + "terms": { + "description": "Term IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [] + }, + "include_children": { + "description": "Whether to include child terms in the terms limiting the result set.", + "type": "boolean", + "default": false + }, + "operator": { + "description": "Whether items must be assigned all or any of the specified terms.", + "type": "string", + "enum": ["AND", "OR"], + "default": "OR" + } + }, + "additionalProperties": false + } + ], + "required": false + }, + "categories_exclude": { + "description": "Limit result set to items except those with specific terms assigned in the categories taxonomy.", + "type": ["object", "array"], + "oneOf": [ + { + "title": "Term ID List", + "description": "Match terms with the listed IDs.", + "type": "array", + "items": { "type": "integer" } + }, + { + "title": "Term ID Taxonomy Query", + "description": "Perform an advanced term query.", + "type": "object", + "properties": { + "terms": { + "description": "Term IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [] + }, + "include_children": { + "description": "Whether to include child terms in the terms limiting the result set.", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + } + ], + "required": false + }, + "tags": { + "description": "Limit result set to items with specific terms assigned in the tags taxonomy.", + "type": ["object", "array"], + "oneOf": [ + { + "title": "Term ID List", + "description": "Match terms with the listed IDs.", + "type": "array", + "items": { "type": "integer" } + }, + { + "title": "Term ID Taxonomy Query", + "description": "Perform an advanced term query.", + "type": "object", + "properties": { + "terms": { + "description": "Term IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [] + }, + "operator": { + "description": "Whether items must be assigned all or any of the specified terms.", + "type": "string", + "enum": ["AND", "OR"], + "default": "OR" + } + }, + "additionalProperties": false + } + ], + "required": false + }, + "tags_exclude": { + "description": "Limit result set to items except those with specific terms assigned in the tags taxonomy.", + "type": ["object", "array"], + "oneOf": [ + { + "title": "Term ID List", + "description": "Match terms with the listed IDs.", + "type": "array", + "items": { "type": "integer" } + }, + { + "title": "Term ID Taxonomy Query", + "description": "Perform an advanced term query.", + "type": "object", + "properties": { + "terms": { + "description": "Term IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [] + } + }, + "additionalProperties": false + } + ], + "required": false + }, + "sticky": { + "description": "Limit result set to items that are sticky.", + "type": "boolean", + "required": false + }, + "ignore_sticky": { + "description": "Whether to ignore sticky posts or not.", + "type": "boolean", + "default": true, + "required": false + }, + "format": { + "description": "Limit result set to items assigned one or more given formats.", + "type": "array", + "uniqueItems": true, + "items": { + "enum": [ + "standard", + "aside", + "chat", + "gallery", + "link", + "image", + "quote", + "status", + "video", + "audio" + ], + "type": "string" + }, + "required": false + } + } + }, + { + "methods": ["POST"], + "allow_batch": { "v1": true }, + "args": { + "date": { + "description": "The date the post was published, in the site's timezone.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "date_gmt": { + "description": "The date the post was published, as GMT.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "slug": { + "description": "An alphanumeric identifier for the post unique to its type.", + "type": "string", + "required": false + }, + "status": { + "description": "A named status for the post.", + "type": "string", + "enum": ["publish", "future", "draft", "pending", "private"], + "required": false + }, + "password": { + "description": "A password to protect access to the content and excerpt.", + "type": "string", + "required": false + }, + "title": { + "description": "The title for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Title for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML title for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "content": { + "description": "The content for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Content for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML content for the post, transformed for display.", + "type": "string", + "context": ["view", "edit"], + "readonly": true + }, + "block_version": { + "description": "Version of the content block format used by the post.", + "type": "integer", + "context": ["edit"], + "readonly": true + }, + "protected": { + "description": "Whether the content is protected with a password.", + "type": "boolean", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "author": { + "description": "The ID for the author of the post.", + "type": "integer", + "required": false + }, + "excerpt": { + "description": "The excerpt for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Excerpt for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML excerpt for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + }, + "protected": { + "description": "Whether the excerpt is protected with a password.", + "type": "boolean", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "featured_media": { + "description": "The ID of the featured media for the post.", + "type": "integer", + "required": false + }, + "comment_status": { + "description": "Whether or not comments are open on the post.", + "type": "string", + "enum": ["open", "closed"], + "required": false + }, + "ping_status": { + "description": "Whether or not the post can be pinged.", + "type": "string", + "enum": ["open", "closed"], + "required": false + }, + "format": { + "description": "The format for the post.", + "type": "string", + "enum": [ + "standard", + "aside", + "chat", + "gallery", + "link", + "image", + "quote", + "status", + "video", + "audio" + ], + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": { + "footnotes": { + "type": "string", + "title": "", + "description": "", + "default": "" + } + }, + "required": false + }, + "sticky": { + "description": "Whether or not the post should be treated as sticky.", + "type": "boolean", + "required": false + }, + "template": { + "description": "The theme file to use to display the post.", + "type": "string", + "required": false + }, + "categories": { + "description": "The terms assigned to the post in the category taxonomy.", + "type": "array", + "items": { "type": "integer" }, + "required": false + }, + "tags": { + "description": "The terms assigned to the post in the post_tag taxonomy.", + "type": "array", + "items": { "type": "integer" }, + "required": false + } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/posts" } + ] + } + }, + "\/wp\/v2\/posts\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "POST", "PUT", "PATCH", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the post.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "excerpt_length": { + "description": "Override the default excerpt length.", + "type": "integer", + "required": false + }, + "password": { + "description": "The password for the post if it is password protected.", + "type": "string", + "required": false + } + } + }, + { + "methods": ["POST", "PUT", "PATCH"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the post.", + "type": "integer", + "required": false + }, + "date": { + "description": "The date the post was published, in the site's timezone.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "date_gmt": { + "description": "The date the post was published, as GMT.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "slug": { + "description": "An alphanumeric identifier for the post unique to its type.", + "type": "string", + "required": false + }, + "status": { + "description": "A named status for the post.", + "type": "string", + "enum": ["publish", "future", "draft", "pending", "private"], + "required": false + }, + "password": { + "description": "A password to protect access to the content and excerpt.", + "type": "string", + "required": false + }, + "title": { + "description": "The title for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Title for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML title for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "content": { + "description": "The content for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Content for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML content for the post, transformed for display.", + "type": "string", + "context": ["view", "edit"], + "readonly": true + }, + "block_version": { + "description": "Version of the content block format used by the post.", + "type": "integer", + "context": ["edit"], + "readonly": true + }, + "protected": { + "description": "Whether the content is protected with a password.", + "type": "boolean", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "author": { + "description": "The ID for the author of the post.", + "type": "integer", + "required": false + }, + "excerpt": { + "description": "The excerpt for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Excerpt for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML excerpt for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + }, + "protected": { + "description": "Whether the excerpt is protected with a password.", + "type": "boolean", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "featured_media": { + "description": "The ID of the featured media for the post.", + "type": "integer", + "required": false + }, + "comment_status": { + "description": "Whether or not comments are open on the post.", + "type": "string", + "enum": ["open", "closed"], + "required": false + }, + "ping_status": { + "description": "Whether or not the post can be pinged.", + "type": "string", + "enum": ["open", "closed"], + "required": false + }, + "format": { + "description": "The format for the post.", + "type": "string", + "enum": [ + "standard", + "aside", + "chat", + "gallery", + "link", + "image", + "quote", + "status", + "video", + "audio" + ], + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": { + "footnotes": { + "type": "string", + "title": "", + "description": "", + "default": "" + } + }, + "required": false + }, + "sticky": { + "description": "Whether or not the post should be treated as sticky.", + "type": "boolean", + "required": false + }, + "template": { + "description": "The theme file to use to display the post.", + "type": "string", + "required": false + }, + "categories": { + "description": "The terms assigned to the post in the category taxonomy.", + "type": "array", + "items": { "type": "integer" }, + "required": false + }, + "tags": { + "description": "The terms assigned to the post in the post_tag taxonomy.", + "type": "array", + "items": { "type": "integer" }, + "required": false + } + } + }, + { + "methods": ["DELETE"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the post.", + "type": "integer", + "required": false + }, + "force": { + "type": "boolean", + "default": false, + "description": "Whether to bypass Trash and force deletion.", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/posts\/(?P[\\d]+)\/revisions": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The ID for the parent of the revision.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "minimum": 1, + "maximum": 100, + "required": false + }, + "search": { + "description": "Limit results to those matching a string.", + "type": "string", + "required": false + }, + "exclude": { + "description": "Ensure result set excludes specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "include": { + "description": "Limit result set to specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "offset": { + "description": "Offset the result set by a specific number of items.", + "type": "integer", + "required": false + }, + "order": { + "description": "Order sort attribute ascending or descending.", + "type": "string", + "default": "desc", + "enum": ["asc", "desc"], + "required": false + }, + "orderby": { + "description": "Sort collection by object attribute.", + "type": "string", + "default": "date", + "enum": [ + "date", + "id", + "include", + "relevance", + "slug", + "include_slugs", + "title" + ], + "required": false + } + } + } + ] + }, + "\/wp\/v2\/posts\/(?P[\\d]+)\/revisions\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The ID for the parent of the revision.", + "type": "integer", + "required": false + }, + "id": { + "description": "Unique identifier for the revision.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["DELETE"], + "args": { + "parent": { + "description": "The ID for the parent of the revision.", + "type": "integer", + "required": false + }, + "id": { + "description": "Unique identifier for the revision.", + "type": "integer", + "required": false + }, + "force": { + "type": "boolean", + "default": false, + "description": "Required to be true, as revisions do not support trashing.", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/posts\/(?P[\\d]+)\/autosaves": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The ID for the parent of the autosave.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["POST"], + "args": { + "parent": { + "description": "The ID for the parent of the autosave.", + "type": "integer", + "required": false + }, + "date": { + "description": "The date the post was published, in the site's timezone.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "date_gmt": { + "description": "The date the post was published, as GMT.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "slug": { + "description": "An alphanumeric identifier for the post unique to its type.", + "type": "string", + "required": false + }, + "status": { + "description": "A named status for the post.", + "type": "string", + "enum": ["publish", "future", "draft", "pending", "private"], + "required": false + }, + "password": { + "description": "A password to protect access to the content and excerpt.", + "type": "string", + "required": false + }, + "title": { + "description": "The title for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Title for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML title for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "content": { + "description": "The content for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Content for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML content for the post, transformed for display.", + "type": "string", + "context": ["view", "edit"], + "readonly": true + }, + "block_version": { + "description": "Version of the content block format used by the post.", + "type": "integer", + "context": ["edit"], + "readonly": true + }, + "protected": { + "description": "Whether the content is protected with a password.", + "type": "boolean", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "author": { + "description": "The ID for the author of the post.", + "type": "integer", + "required": false + }, + "excerpt": { + "description": "The excerpt for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Excerpt for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML excerpt for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + }, + "protected": { + "description": "Whether the excerpt is protected with a password.", + "type": "boolean", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "featured_media": { + "description": "The ID of the featured media for the post.", + "type": "integer", + "required": false + }, + "comment_status": { + "description": "Whether or not comments are open on the post.", + "type": "string", + "enum": ["open", "closed"], + "required": false + }, + "ping_status": { + "description": "Whether or not the post can be pinged.", + "type": "string", + "enum": ["open", "closed"], + "required": false + }, + "format": { + "description": "The format for the post.", + "type": "string", + "enum": [ + "standard", + "aside", + "chat", + "gallery", + "link", + "image", + "quote", + "status", + "video", + "audio" + ], + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": { + "footnotes": { + "type": "string", + "title": "", + "description": "", + "default": "" + } + }, + "required": false + }, + "sticky": { + "description": "Whether or not the post should be treated as sticky.", + "type": "boolean", + "required": false + }, + "template": { + "description": "The theme file to use to display the post.", + "type": "string", + "required": false + }, + "categories": { + "description": "The terms assigned to the post in the category taxonomy.", + "type": "array", + "items": { "type": "integer" }, + "required": false + }, + "tags": { + "description": "The terms assigned to the post in the post_tag taxonomy.", + "type": "array", + "items": { "type": "integer" }, + "required": false + } + } + } + ] + }, + "\/wp\/v2\/posts\/(?P[\\d]+)\/autosaves\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The ID for the parent of the autosave.", + "type": "integer", + "required": false + }, + "id": { + "description": "The ID for the autosave.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/pages": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": true }, + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "default": 10, + "minimum": 1, + "maximum": 100, + "required": false + }, + "search": { + "description": "Limit results to those matching a string.", + "type": "string", + "required": false + }, + "after": { + "description": "Limit response to posts published after a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "modified_after": { + "description": "Limit response to posts modified after a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "author": { + "description": "Limit result set to posts assigned to specific authors.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "author_exclude": { + "description": "Ensure result set excludes posts assigned to specific authors.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "before": { + "description": "Limit response to posts published before a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "modified_before": { + "description": "Limit response to posts modified before a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "exclude": { + "description": "Ensure result set excludes specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "include": { + "description": "Limit result set to specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "menu_order": { + "description": "Limit result set to posts with a specific menu_order value.", + "type": "integer", + "required": false + }, + "search_semantics": { + "description": "How to interpret the search input.", + "type": "string", + "enum": ["exact"], + "required": false + }, + "offset": { + "description": "Offset the result set by a specific number of items.", + "type": "integer", + "required": false + }, + "order": { + "description": "Order sort attribute ascending or descending.", + "type": "string", + "default": "desc", + "enum": ["asc", "desc"], + "required": false + }, + "orderby": { + "description": "Sort collection by post attribute.", + "type": "string", + "default": "date", + "enum": [ + "author", + "date", + "id", + "include", + "modified", + "parent", + "relevance", + "slug", + "include_slugs", + "title", + "menu_order" + ], + "required": false + }, + "parent": { + "description": "Limit result set to items with particular parent IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "parent_exclude": { + "description": "Limit result set to all items except those of a particular parent ID.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "search_columns": { + "default": [], + "description": "Array of column names to be searched.", + "type": "array", + "items": { + "enum": ["post_title", "post_content", "post_excerpt"], + "type": "string" + }, + "required": false + }, + "slug": { + "description": "Limit result set to posts with one or more specific slugs.", + "type": "array", + "items": { "type": "string" }, + "required": false + }, + "status": { + "default": "publish", + "description": "Limit result set to posts assigned one or more statuses.", + "type": "array", + "items": { + "enum": [ + "publish", + "future", + "draft", + "pending", + "private", + "trash", + "auto-draft", + "inherit", + "request-pending", + "request-confirmed", + "request-failed", + "request-completed", + "any" + ], + "type": "string" + }, + "required": false + } + } + }, + { + "methods": ["POST"], + "allow_batch": { "v1": true }, + "args": { + "date": { + "description": "The date the post was published, in the site's timezone.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "date_gmt": { + "description": "The date the post was published, as GMT.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "slug": { + "description": "An alphanumeric identifier for the post unique to its type.", + "type": "string", + "required": false + }, + "status": { + "description": "A named status for the post.", + "type": "string", + "enum": ["publish", "future", "draft", "pending", "private"], + "required": false + }, + "password": { + "description": "A password to protect access to the content and excerpt.", + "type": "string", + "required": false + }, + "parent": { + "description": "The ID for the parent of the post.", + "type": "integer", + "required": false + }, + "title": { + "description": "The title for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Title for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML title for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "content": { + "description": "The content for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Content for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML content for the post, transformed for display.", + "type": "string", + "context": ["view", "edit"], + "readonly": true + }, + "block_version": { + "description": "Version of the content block format used by the post.", + "type": "integer", + "context": ["edit"], + "readonly": true + }, + "protected": { + "description": "Whether the content is protected with a password.", + "type": "boolean", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "author": { + "description": "The ID for the author of the post.", + "type": "integer", + "required": false + }, + "excerpt": { + "description": "The excerpt for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Excerpt for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML excerpt for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + }, + "protected": { + "description": "Whether the excerpt is protected with a password.", + "type": "boolean", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "featured_media": { + "description": "The ID of the featured media for the post.", + "type": "integer", + "required": false + }, + "comment_status": { + "description": "Whether or not comments are open on the post.", + "type": "string", + "enum": ["open", "closed"], + "required": false + }, + "ping_status": { + "description": "Whether or not the post can be pinged.", + "type": "string", + "enum": ["open", "closed"], + "required": false + }, + "menu_order": { + "description": "The order of the post in relation to other posts.", + "type": "integer", + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": { + "footnotes": { + "type": "string", + "title": "", + "description": "", + "default": "" + } + }, + "required": false + }, + "template": { + "description": "The theme file to use to display the post.", + "type": "string", + "required": false + } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/pages" } + ] + } + }, + "\/wp\/v2\/pages\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "POST", "PUT", "PATCH", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the post.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "excerpt_length": { + "description": "Override the default excerpt length.", + "type": "integer", + "required": false + }, + "password": { + "description": "The password for the post if it is password protected.", + "type": "string", + "required": false + } + } + }, + { + "methods": ["POST", "PUT", "PATCH"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the post.", + "type": "integer", + "required": false + }, + "date": { + "description": "The date the post was published, in the site's timezone.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "date_gmt": { + "description": "The date the post was published, as GMT.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "slug": { + "description": "An alphanumeric identifier for the post unique to its type.", + "type": "string", + "required": false + }, + "status": { + "description": "A named status for the post.", + "type": "string", + "enum": ["publish", "future", "draft", "pending", "private"], + "required": false + }, + "password": { + "description": "A password to protect access to the content and excerpt.", + "type": "string", + "required": false + }, + "parent": { + "description": "The ID for the parent of the post.", + "type": "integer", + "required": false + }, + "title": { + "description": "The title for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Title for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML title for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "content": { + "description": "The content for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Content for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML content for the post, transformed for display.", + "type": "string", + "context": ["view", "edit"], + "readonly": true + }, + "block_version": { + "description": "Version of the content block format used by the post.", + "type": "integer", + "context": ["edit"], + "readonly": true + }, + "protected": { + "description": "Whether the content is protected with a password.", + "type": "boolean", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "author": { + "description": "The ID for the author of the post.", + "type": "integer", + "required": false + }, + "excerpt": { + "description": "The excerpt for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Excerpt for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML excerpt for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + }, + "protected": { + "description": "Whether the excerpt is protected with a password.", + "type": "boolean", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "featured_media": { + "description": "The ID of the featured media for the post.", + "type": "integer", + "required": false + }, + "comment_status": { + "description": "Whether or not comments are open on the post.", + "type": "string", + "enum": ["open", "closed"], + "required": false + }, + "ping_status": { + "description": "Whether or not the post can be pinged.", + "type": "string", + "enum": ["open", "closed"], + "required": false + }, + "menu_order": { + "description": "The order of the post in relation to other posts.", + "type": "integer", + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": { + "footnotes": { + "type": "string", + "title": "", + "description": "", + "default": "" + } + }, + "required": false + }, + "template": { + "description": "The theme file to use to display the post.", + "type": "string", + "required": false + } + } + }, + { + "methods": ["DELETE"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the post.", + "type": "integer", + "required": false + }, + "force": { + "type": "boolean", + "default": false, + "description": "Whether to bypass Trash and force deletion.", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/pages\/(?P[\\d]+)\/revisions": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The ID for the parent of the revision.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "minimum": 1, + "maximum": 100, + "required": false + }, + "search": { + "description": "Limit results to those matching a string.", + "type": "string", + "required": false + }, + "exclude": { + "description": "Ensure result set excludes specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "include": { + "description": "Limit result set to specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "offset": { + "description": "Offset the result set by a specific number of items.", + "type": "integer", + "required": false + }, + "order": { + "description": "Order sort attribute ascending or descending.", + "type": "string", + "default": "desc", + "enum": ["asc", "desc"], + "required": false + }, + "orderby": { + "description": "Sort collection by object attribute.", + "type": "string", + "default": "date", + "enum": [ + "date", + "id", + "include", + "relevance", + "slug", + "include_slugs", + "title" + ], + "required": false + } + } + } + ] + }, + "\/wp\/v2\/pages\/(?P[\\d]+)\/revisions\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The ID for the parent of the revision.", + "type": "integer", + "required": false + }, + "id": { + "description": "Unique identifier for the revision.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["DELETE"], + "args": { + "parent": { + "description": "The ID for the parent of the revision.", + "type": "integer", + "required": false + }, + "id": { + "description": "Unique identifier for the revision.", + "type": "integer", + "required": false + }, + "force": { + "type": "boolean", + "default": false, + "description": "Required to be true, as revisions do not support trashing.", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/pages\/(?P[\\d]+)\/autosaves": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The ID for the parent of the autosave.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["POST"], + "args": { + "parent": { + "description": "The ID for the parent of the post.", + "type": "integer", + "required": false + }, + "date": { + "description": "The date the post was published, in the site's timezone.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "date_gmt": { + "description": "The date the post was published, as GMT.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "slug": { + "description": "An alphanumeric identifier for the post unique to its type.", + "type": "string", + "required": false + }, + "status": { + "description": "A named status for the post.", + "type": "string", + "enum": ["publish", "future", "draft", "pending", "private"], + "required": false + }, + "password": { + "description": "A password to protect access to the content and excerpt.", + "type": "string", + "required": false + }, + "title": { + "description": "The title for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Title for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML title for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "content": { + "description": "The content for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Content for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML content for the post, transformed for display.", + "type": "string", + "context": ["view", "edit"], + "readonly": true + }, + "block_version": { + "description": "Version of the content block format used by the post.", + "type": "integer", + "context": ["edit"], + "readonly": true + }, + "protected": { + "description": "Whether the content is protected with a password.", + "type": "boolean", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "author": { + "description": "The ID for the author of the post.", + "type": "integer", + "required": false + }, + "excerpt": { + "description": "The excerpt for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Excerpt for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML excerpt for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + }, + "protected": { + "description": "Whether the excerpt is protected with a password.", + "type": "boolean", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "featured_media": { + "description": "The ID of the featured media for the post.", + "type": "integer", + "required": false + }, + "comment_status": { + "description": "Whether or not comments are open on the post.", + "type": "string", + "enum": ["open", "closed"], + "required": false + }, + "ping_status": { + "description": "Whether or not the post can be pinged.", + "type": "string", + "enum": ["open", "closed"], + "required": false + }, + "menu_order": { + "description": "The order of the post in relation to other posts.", + "type": "integer", + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": { + "footnotes": { + "type": "string", + "title": "", + "description": "", + "default": "" + } + }, + "required": false + }, + "template": { + "description": "The theme file to use to display the post.", + "type": "string", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/pages\/(?P[\\d]+)\/autosaves\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The ID for the parent of the autosave.", + "type": "integer", + "required": false + }, + "id": { + "description": "The ID for the autosave.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/media": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "default": 10, + "minimum": 1, + "maximum": 100, + "required": false + }, + "search": { + "description": "Limit results to those matching a string.", + "type": "string", + "required": false + }, + "after": { + "description": "Limit response to posts published after a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "modified_after": { + "description": "Limit response to posts modified after a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "author": { + "description": "Limit result set to posts assigned to specific authors.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "author_exclude": { + "description": "Ensure result set excludes posts assigned to specific authors.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "before": { + "description": "Limit response to posts published before a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "modified_before": { + "description": "Limit response to posts modified before a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "exclude": { + "description": "Ensure result set excludes specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "include": { + "description": "Limit result set to specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "search_semantics": { + "description": "How to interpret the search input.", + "type": "string", + "enum": ["exact"], + "required": false + }, + "offset": { + "description": "Offset the result set by a specific number of items.", + "type": "integer", + "required": false + }, + "order": { + "description": "Order sort attribute ascending or descending.", + "type": "string", + "default": "desc", + "enum": ["asc", "desc"], + "required": false + }, + "orderby": { + "description": "Sort collection by post attribute.", + "type": "string", + "default": "date", + "enum": [ + "author", + "date", + "id", + "include", + "modified", + "parent", + "relevance", + "slug", + "include_slugs", + "title" + ], + "required": false + }, + "parent": { + "description": "Limit result set to items with particular parent IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "parent_exclude": { + "description": "Limit result set to all items except those of a particular parent ID.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "search_columns": { + "default": [], + "description": "Array of column names to be searched.", + "type": "array", + "items": { + "enum": ["post_title", "post_content", "post_excerpt"], + "type": "string" + }, + "required": false + }, + "slug": { + "description": "Limit result set to posts with one or more specific slugs.", + "type": "array", + "items": { "type": "string" }, + "required": false + }, + "status": { + "default": "inherit", + "description": "Limit result set to posts assigned one or more statuses.", + "type": "array", + "items": { + "enum": ["inherit", "private", "trash"], + "type": "string" + }, + "required": false + }, + "media_type": { + "default": null, + "description": "Limit result set to attachments of a particular media type or media types.", + "type": "array", + "items": { + "type": "string", + "enum": ["image", "video", "text", "application", "audio"] + }, + "required": false + }, + "mime_type": { + "default": null, + "description": "Limit result set to attachments of a particular MIME type or MIME types.", + "type": "array", + "items": { "type": "string" }, + "required": false + } + } + }, + { + "methods": ["POST"], + "args": { + "date": { + "description": "The date the post was published, in the site's timezone.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "date_gmt": { + "description": "The date the post was published, as GMT.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "slug": { + "description": "An alphanumeric identifier for the post unique to its type.", + "type": "string", + "required": false + }, + "status": { + "description": "A named status for the post.", + "type": "string", + "enum": ["publish", "future", "draft", "pending", "private"], + "required": false + }, + "title": { + "description": "The title for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Title for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML title for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "author": { + "description": "The ID for the author of the post.", + "type": "integer", + "required": false + }, + "featured_media": { + "description": "The ID of the featured media for the post.", + "type": "integer", + "required": false + }, + "comment_status": { + "description": "Whether or not comments are open on the post.", + "type": "string", + "enum": ["open", "closed"], + "required": false + }, + "ping_status": { + "description": "Whether or not the post can be pinged.", + "type": "string", + "enum": ["open", "closed"], + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": [], + "required": false + }, + "template": { + "description": "The theme file to use to display the post.", + "type": "string", + "required": false + }, + "alt_text": { + "description": "Alternative text to display when attachment is not displayed.", + "type": "string", + "required": false + }, + "caption": { + "description": "The attachment caption.", + "type": "object", + "properties": { + "raw": { + "description": "Caption for the attachment, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML caption for the attachment, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "description": { + "description": "The attachment description.", + "type": "object", + "properties": { + "raw": { + "description": "Description for the attachment, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML description for the attachment, transformed for display.", + "type": "string", + "context": ["view", "edit"], + "readonly": true + } + }, + "required": false + }, + "post": { + "description": "The ID for the associated post of the attachment.", + "type": "integer", + "required": false + } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/media" } + ] + } + }, + "\/wp\/v2\/media\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "POST", "PUT", "PATCH", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "id": { + "description": "Unique identifier for the post.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["POST", "PUT", "PATCH"], + "args": { + "id": { + "description": "Unique identifier for the post.", + "type": "integer", + "required": false + }, + "date": { + "description": "The date the post was published, in the site's timezone.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "date_gmt": { + "description": "The date the post was published, as GMT.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "slug": { + "description": "An alphanumeric identifier for the post unique to its type.", + "type": "string", + "required": false + }, + "status": { + "description": "A named status for the post.", + "type": "string", + "enum": ["publish", "future", "draft", "pending", "private"], + "required": false + }, + "title": { + "description": "The title for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Title for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML title for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "author": { + "description": "The ID for the author of the post.", + "type": "integer", + "required": false + }, + "featured_media": { + "description": "The ID of the featured media for the post.", + "type": "integer", + "required": false + }, + "comment_status": { + "description": "Whether or not comments are open on the post.", + "type": "string", + "enum": ["open", "closed"], + "required": false + }, + "ping_status": { + "description": "Whether or not the post can be pinged.", + "type": "string", + "enum": ["open", "closed"], + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": [], + "required": false + }, + "template": { + "description": "The theme file to use to display the post.", + "type": "string", + "required": false + }, + "alt_text": { + "description": "Alternative text to display when attachment is not displayed.", + "type": "string", + "required": false + }, + "caption": { + "description": "The attachment caption.", + "type": "object", + "properties": { + "raw": { + "description": "Caption for the attachment, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML caption for the attachment, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "description": { + "description": "The attachment description.", + "type": "object", + "properties": { + "raw": { + "description": "Description for the attachment, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML description for the attachment, transformed for display.", + "type": "string", + "context": ["view", "edit"], + "readonly": true + } + }, + "required": false + }, + "post": { + "description": "The ID for the associated post of the attachment.", + "type": "integer", + "required": false + } + } + }, + { + "methods": ["DELETE"], + "args": { + "id": { + "description": "Unique identifier for the post.", + "type": "integer", + "required": false + }, + "force": { + "type": "boolean", + "default": false, + "description": "Whether to bypass Trash and force deletion.", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/media\/(?P[\\d]+)\/post-process": { + "namespace": "wp\/v2", + "methods": ["POST"], + "endpoints": [ + { + "methods": ["POST"], + "args": { + "id": { + "description": "Unique identifier for the attachment.", + "type": "integer", + "required": false + }, + "action": { + "type": "string", + "enum": ["create-image-subsizes"], + "required": true + } + } + } + ] + }, + "\/wp\/v2\/media\/(?P[\\d]+)\/edit": { + "namespace": "wp\/v2", + "methods": ["POST"], + "endpoints": [ + { + "methods": ["POST"], + "args": { + "src": { + "description": "URL to the edited image file.", + "type": "string", + "format": "uri", + "required": true + }, + "modifiers": { + "description": "Array of image edits.", + "type": "array", + "minItems": 1, + "items": { + "description": "Image edit.", + "type": "object", + "required": ["type", "args"], + "oneOf": [ + { + "title": "Flip", + "properties": { + "type": { + "description": "Flip type.", + "type": "string", + "enum": ["flip"] + }, + "args": { + "description": "Flip arguments.", + "type": "object", + "required": ["flip"], + "properties": { + "flip": { + "description": "Flip direction.", + "type": "object", + "required": ["horizontal", "vertical"], + "properties": { + "horizontal": { + "description": "Whether to flip in the horizontal direction.", + "type": "boolean" + }, + "vertical": { + "description": "Whether to flip in the vertical direction.", + "type": "boolean" + } + } + } + } + } + } + }, + { + "title": "Rotation", + "properties": { + "type": { + "description": "Rotation type.", + "type": "string", + "enum": ["rotate"] + }, + "args": { + "description": "Rotation arguments.", + "type": "object", + "required": ["angle"], + "properties": { + "angle": { + "description": "Angle to rotate clockwise in degrees.", + "type": "number" + } + } + } + } + }, + { + "title": "Crop", + "properties": { + "type": { + "description": "Crop type.", + "type": "string", + "enum": ["crop"] + }, + "args": { + "description": "Crop arguments.", + "type": "object", + "required": ["left", "top", "width", "height"], + "properties": { + "left": { + "description": "Horizontal position from the left to begin the crop as a percentage of the image width.", + "type": "number" + }, + "top": { + "description": "Vertical position from the top to begin the crop as a percentage of the image height.", + "type": "number" + }, + "width": { + "description": "Width of the crop as a percentage of the image width.", + "type": "number" + }, + "height": { + "description": "Height of the crop as a percentage of the image height.", + "type": "number" + } + } + } + } + } + ] + }, + "required": false + }, + "rotation": { + "description": "The amount to rotate the image clockwise in degrees. DEPRECATED: Use `modifiers` instead.", + "type": "integer", + "minimum": 0, + "exclusiveMinimum": true, + "maximum": 360, + "exclusiveMaximum": true, + "required": false + }, + "x": { + "description": "As a percentage of the image, the x position to start the crop from. DEPRECATED: Use `modifiers` instead.", + "type": "number", + "minimum": 0, + "maximum": 100, + "required": false + }, + "y": { + "description": "As a percentage of the image, the y position to start the crop from. DEPRECATED: Use `modifiers` instead.", + "type": "number", + "minimum": 0, + "maximum": 100, + "required": false + }, + "width": { + "description": "As a percentage of the image, the width to crop the image to. DEPRECATED: Use `modifiers` instead.", + "type": "number", + "minimum": 0, + "maximum": 100, + "required": false + }, + "height": { + "description": "As a percentage of the image, the height to crop the image to. DEPRECATED: Use `modifiers` instead.", + "type": "number", + "minimum": 0, + "maximum": 100, + "required": false + }, + "caption": { + "description": "The attachment caption.", + "type": "object", + "properties": { + "raw": { + "description": "Caption for the attachment, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML caption for the attachment, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "description": { + "description": "The attachment description.", + "type": "object", + "properties": { + "raw": { + "description": "Description for the attachment, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML description for the attachment, transformed for display.", + "type": "string", + "context": ["view", "edit"], + "readonly": true + } + }, + "required": false + }, + "title": { + "description": "The title for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Title for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML title for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "post": { + "description": "The ID for the associated post of the attachment.", + "type": "integer", + "required": false + }, + "alt_text": { + "description": "Alternative text to display when attachment is not displayed.", + "type": "string", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/menu-items": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": true }, + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "default": 100, + "minimum": 1, + "maximum": 100, + "required": false + }, + "search": { + "description": "Limit results to those matching a string.", + "type": "string", + "required": false + }, + "after": { + "description": "Limit response to posts published after a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "modified_after": { + "description": "Limit response to posts modified after a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "before": { + "description": "Limit response to posts published before a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "modified_before": { + "description": "Limit response to posts modified before a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "exclude": { + "description": "Ensure result set excludes specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "include": { + "description": "Limit result set to specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "search_semantics": { + "description": "How to interpret the search input.", + "type": "string", + "enum": ["exact"], + "required": false + }, + "offset": { + "description": "Offset the result set by a specific number of items.", + "type": "integer", + "required": false + }, + "order": { + "description": "Order sort attribute ascending or descending.", + "type": "string", + "default": "asc", + "enum": ["asc", "desc"], + "required": false + }, + "orderby": { + "description": "Sort collection by object attribute.", + "type": "string", + "default": "menu_order", + "enum": [ + "author", + "date", + "id", + "include", + "modified", + "parent", + "relevance", + "slug", + "include_slugs", + "title", + "menu_order" + ], + "required": false + }, + "search_columns": { + "default": [], + "description": "Array of column names to be searched.", + "type": "array", + "items": { + "enum": ["post_title", "post_content", "post_excerpt"], + "type": "string" + }, + "required": false + }, + "slug": { + "description": "Limit result set to posts with one or more specific slugs.", + "type": "array", + "items": { "type": "string" }, + "required": false + }, + "status": { + "default": "publish", + "description": "Limit result set to posts assigned one or more statuses.", + "type": "array", + "items": { + "enum": [ + "publish", + "future", + "draft", + "pending", + "private", + "trash", + "auto-draft", + "inherit", + "request-pending", + "request-confirmed", + "request-failed", + "request-completed", + "any" + ], + "type": "string" + }, + "required": false + }, + "tax_relation": { + "description": "Limit result set based on relationship between multiple taxonomies.", + "type": "string", + "enum": ["AND", "OR"], + "required": false + }, + "menus": { + "description": "Limit result set to items with specific terms assigned in the menus taxonomy.", + "type": ["object", "array"], + "oneOf": [ + { + "title": "Term ID List", + "description": "Match terms with the listed IDs.", + "type": "array", + "items": { "type": "integer" } + }, + { + "title": "Term ID Taxonomy Query", + "description": "Perform an advanced term query.", + "type": "object", + "properties": { + "terms": { + "description": "Term IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [] + }, + "operator": { + "description": "Whether items must be assigned all or any of the specified terms.", + "type": "string", + "enum": ["AND", "OR"], + "default": "OR" + } + }, + "additionalProperties": false + } + ], + "required": false + }, + "menus_exclude": { + "description": "Limit result set to items except those with specific terms assigned in the menus taxonomy.", + "type": ["object", "array"], + "oneOf": [ + { + "title": "Term ID List", + "description": "Match terms with the listed IDs.", + "type": "array", + "items": { "type": "integer" } + }, + { + "title": "Term ID Taxonomy Query", + "description": "Perform an advanced term query.", + "type": "object", + "properties": { + "terms": { + "description": "Term IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [] + } + }, + "additionalProperties": false + } + ], + "required": false + }, + "menu_order": { + "description": "Limit result set to posts with a specific menu_order value.", + "type": "integer", + "required": false + } + } + }, + { + "methods": ["POST"], + "allow_batch": { "v1": true }, + "args": { + "title": { + "description": "The title for the object.", + "type": ["string", "object"], + "properties": { + "raw": { + "description": "Title for the object, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML title for the object, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "type": { + "default": "custom", + "description": "The family of objects originally represented, such as \"post_type\" or \"taxonomy\".", + "type": "string", + "enum": [ + "taxonomy", + "post_type", + "post_type_archive", + "custom" + ], + "required": false + }, + "status": { + "default": "publish", + "description": "A named status for the object.", + "type": "string", + "enum": ["publish", "future", "draft", "pending", "private"], + "required": false + }, + "parent": { + "default": 0, + "description": "The ID for the parent of the object.", + "type": "integer", + "minimum": 0, + "required": false + }, + "attr_title": { + "description": "Text for the title attribute of the link element for this menu item.", + "type": "string", + "required": false + }, + "classes": { + "description": "Class names for the link element of this menu item.", + "type": "array", + "items": { "type": "string" }, + "required": false + }, + "description": { + "description": "The description of this menu item.", + "type": "string", + "required": false + }, + "menu_order": { + "default": 1, + "description": "The DB ID of the nav_menu_item that is this item's menu parent, if any, otherwise 0.", + "type": "integer", + "minimum": 1, + "required": false + }, + "object": { + "description": "The type of object originally represented, such as \"category\", \"post\", or \"attachment\".", + "type": "string", + "required": false + }, + "object_id": { + "default": 0, + "description": "The database ID of the original object this menu item represents, for example the ID for posts or the term_id for categories.", + "type": "integer", + "minimum": 0, + "required": false + }, + "target": { + "description": "The target attribute of the link element for this menu item.", + "type": "string", + "enum": ["_blank", ""], + "required": false + }, + "url": { + "description": "The URL to which this menu item points.", + "type": "string", + "format": "uri", + "required": false + }, + "xfn": { + "description": "The XFN relationship expressed in the link of this menu item.", + "type": "array", + "items": { "type": "string" }, + "required": false + }, + "menus": { + "description": "The terms assigned to the object in the nav_menu taxonomy.", + "type": "integer", + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": [], + "required": false + } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/menu-items" } + ] + } + }, + "\/wp\/v2\/menu-items\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "POST", "PUT", "PATCH", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the post.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["POST", "PUT", "PATCH"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the post.", + "type": "integer", + "required": false + }, + "title": { + "description": "The title for the object.", + "type": ["string", "object"], + "properties": { + "raw": { + "description": "Title for the object, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML title for the object, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "type": { + "description": "The family of objects originally represented, such as \"post_type\" or \"taxonomy\".", + "type": "string", + "enum": [ + "taxonomy", + "post_type", + "post_type_archive", + "custom" + ], + "required": false + }, + "status": { + "description": "A named status for the object.", + "type": "string", + "enum": ["publish", "future", "draft", "pending", "private"], + "required": false + }, + "parent": { + "description": "The ID for the parent of the object.", + "type": "integer", + "minimum": 0, + "required": false + }, + "attr_title": { + "description": "Text for the title attribute of the link element for this menu item.", + "type": "string", + "required": false + }, + "classes": { + "description": "Class names for the link element of this menu item.", + "type": "array", + "items": { "type": "string" }, + "required": false + }, + "description": { + "description": "The description of this menu item.", + "type": "string", + "required": false + }, + "menu_order": { + "description": "The DB ID of the nav_menu_item that is this item's menu parent, if any, otherwise 0.", + "type": "integer", + "minimum": 1, + "required": false + }, + "object": { + "description": "The type of object originally represented, such as \"category\", \"post\", or \"attachment\".", + "type": "string", + "required": false + }, + "object_id": { + "description": "The database ID of the original object this menu item represents, for example the ID for posts or the term_id for categories.", + "type": "integer", + "minimum": 0, + "required": false + }, + "target": { + "description": "The target attribute of the link element for this menu item.", + "type": "string", + "enum": ["_blank", ""], + "required": false + }, + "url": { + "description": "The URL to which this menu item points.", + "type": "string", + "format": "uri", + "required": false + }, + "xfn": { + "description": "The XFN relationship expressed in the link of this menu item.", + "type": "array", + "items": { "type": "string" }, + "required": false + }, + "menus": { + "description": "The terms assigned to the object in the nav_menu taxonomy.", + "type": "integer", + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": [], + "required": false + } + } + }, + { + "methods": ["DELETE"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the post.", + "type": "integer", + "required": false + }, + "force": { + "type": "boolean", + "default": false, + "description": "Whether to bypass Trash and force deletion.", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/menu-items\/(?P[\\d]+)\/autosaves": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The ID for the parent of the autosave.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["POST"], + "args": { + "parent": { + "description": "The ID for the parent of the object.", + "type": "integer", + "minimum": 0, + "required": false + }, + "title": { + "description": "The title for the object.", + "type": ["string", "object"], + "properties": { + "raw": { + "description": "Title for the object, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML title for the object, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "type": { + "description": "The family of objects originally represented, such as \"post_type\" or \"taxonomy\".", + "type": "string", + "enum": [ + "taxonomy", + "post_type", + "post_type_archive", + "custom" + ], + "required": false + }, + "status": { + "description": "A named status for the object.", + "type": "string", + "enum": ["publish", "future", "draft", "pending", "private"], + "required": false + }, + "attr_title": { + "description": "Text for the title attribute of the link element for this menu item.", + "type": "string", + "required": false + }, + "classes": { + "description": "Class names for the link element of this menu item.", + "type": "array", + "items": { "type": "string" }, + "required": false + }, + "description": { + "description": "The description of this menu item.", + "type": "string", + "required": false + }, + "menu_order": { + "description": "The DB ID of the nav_menu_item that is this item's menu parent, if any, otherwise 0.", + "type": "integer", + "minimum": 1, + "required": false + }, + "object": { + "description": "The type of object originally represented, such as \"category\", \"post\", or \"attachment\".", + "type": "string", + "required": false + }, + "object_id": { + "description": "The database ID of the original object this menu item represents, for example the ID for posts or the term_id for categories.", + "type": "integer", + "minimum": 0, + "required": false + }, + "target": { + "description": "The target attribute of the link element for this menu item.", + "type": "string", + "enum": ["_blank", ""], + "required": false + }, + "url": { + "description": "The URL to which this menu item points.", + "type": "string", + "format": "uri", + "required": false + }, + "xfn": { + "description": "The XFN relationship expressed in the link of this menu item.", + "type": "array", + "items": { "type": "string" }, + "required": false + }, + "menus": { + "description": "The terms assigned to the object in the nav_menu taxonomy.", + "type": "integer", + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": [], + "required": false + } + } + } + ] + }, + "\/wp\/v2\/menu-items\/(?P[\\d]+)\/autosaves\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The ID for the parent of the autosave.", + "type": "integer", + "required": false + }, + "id": { + "description": "The ID for the autosave.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/blocks": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": true }, + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "default": 10, + "minimum": 1, + "maximum": 100, + "required": false + }, + "search": { + "description": "Limit results to those matching a string.", + "type": "string", + "required": false + }, + "after": { + "description": "Limit response to posts published after a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "modified_after": { + "description": "Limit response to posts modified after a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "before": { + "description": "Limit response to posts published before a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "modified_before": { + "description": "Limit response to posts modified before a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "exclude": { + "description": "Ensure result set excludes specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "include": { + "description": "Limit result set to specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "search_semantics": { + "description": "How to interpret the search input.", + "type": "string", + "enum": ["exact"], + "required": false + }, + "offset": { + "description": "Offset the result set by a specific number of items.", + "type": "integer", + "required": false + }, + "order": { + "description": "Order sort attribute ascending or descending.", + "type": "string", + "default": "desc", + "enum": ["asc", "desc"], + "required": false + }, + "orderby": { + "description": "Sort collection by post attribute.", + "type": "string", + "default": "date", + "enum": [ + "author", + "date", + "id", + "include", + "modified", + "parent", + "relevance", + "slug", + "include_slugs", + "title" + ], + "required": false + }, + "search_columns": { + "default": [], + "description": "Array of column names to be searched.", + "type": "array", + "items": { + "enum": ["post_title", "post_content", "post_excerpt"], + "type": "string" + }, + "required": false + }, + "slug": { + "description": "Limit result set to posts with one or more specific slugs.", + "type": "array", + "items": { "type": "string" }, + "required": false + }, + "status": { + "default": "publish", + "description": "Limit result set to posts assigned one or more statuses.", + "type": "array", + "items": { + "enum": [ + "publish", + "future", + "draft", + "pending", + "private", + "trash", + "auto-draft", + "inherit", + "request-pending", + "request-confirmed", + "request-failed", + "request-completed", + "any" + ], + "type": "string" + }, + "required": false + }, + "tax_relation": { + "description": "Limit result set based on relationship between multiple taxonomies.", + "type": "string", + "enum": ["AND", "OR"], + "required": false + }, + "wp_pattern_category": { + "description": "Limit result set to items with specific terms assigned in the wp_pattern_category taxonomy.", + "type": ["object", "array"], + "oneOf": [ + { + "title": "Term ID List", + "description": "Match terms with the listed IDs.", + "type": "array", + "items": { "type": "integer" } + }, + { + "title": "Term ID Taxonomy Query", + "description": "Perform an advanced term query.", + "type": "object", + "properties": { + "terms": { + "description": "Term IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [] + }, + "operator": { + "description": "Whether items must be assigned all or any of the specified terms.", + "type": "string", + "enum": ["AND", "OR"], + "default": "OR" + } + }, + "additionalProperties": false + } + ], + "required": false + }, + "wp_pattern_category_exclude": { + "description": "Limit result set to items except those with specific terms assigned in the wp_pattern_category taxonomy.", + "type": ["object", "array"], + "oneOf": [ + { + "title": "Term ID List", + "description": "Match terms with the listed IDs.", + "type": "array", + "items": { "type": "integer" } + }, + { + "title": "Term ID Taxonomy Query", + "description": "Perform an advanced term query.", + "type": "object", + "properties": { + "terms": { + "description": "Term IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [] + } + }, + "additionalProperties": false + } + ], + "required": false + } + } + }, + { + "methods": ["POST"], + "allow_batch": { "v1": true }, + "args": { + "date": { + "description": "The date the post was published, in the site's timezone.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "date_gmt": { + "description": "The date the post was published, as GMT.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "slug": { + "description": "An alphanumeric identifier for the post unique to its type.", + "type": "string", + "required": false + }, + "status": { + "description": "A named status for the post.", + "type": "string", + "enum": ["publish", "future", "draft", "pending", "private"], + "required": false + }, + "password": { + "description": "A password to protect access to the content and excerpt.", + "type": "string", + "required": false + }, + "title": { + "description": "The title for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Title for the post, as it exists in the database.", + "type": "string", + "context": ["view", "edit"] + } + }, + "required": false + }, + "content": { + "description": "The content for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Content for the post, as it exists in the database.", + "type": "string", + "context": ["view", "edit"] + }, + "block_version": { + "description": "Version of the content block format used by the post.", + "type": "integer", + "context": ["edit"], + "readonly": true + }, + "protected": { + "description": "Whether the content is protected with a password.", + "type": "boolean", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "excerpt": { + "description": "The excerpt for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Excerpt for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML excerpt for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + }, + "protected": { + "description": "Whether the excerpt is protected with a password.", + "type": "boolean", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": { + "wp_pattern_sync_status": { + "type": "string", + "title": "", + "description": "", + "default": "", + "enum": ["partial", "unsynced"] + }, + "footnotes": { + "type": "string", + "title": "", + "description": "", + "default": "" + } + }, + "required": false + }, + "template": { + "description": "The theme file to use to display the post.", + "type": "string", + "required": false + }, + "wp_pattern_category": { + "description": "The terms assigned to the post in the wp_pattern_category taxonomy.", + "type": "array", + "items": { "type": "integer" }, + "required": false + } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/blocks" } + ] + } + }, + "\/wp\/v2\/blocks\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "POST", "PUT", "PATCH", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the post.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "excerpt_length": { + "description": "Override the default excerpt length.", + "type": "integer", + "required": false + }, + "password": { + "description": "The password for the post if it is password protected.", + "type": "string", + "required": false + } + } + }, + { + "methods": ["POST", "PUT", "PATCH"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the post.", + "type": "integer", + "required": false + }, + "date": { + "description": "The date the post was published, in the site's timezone.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "date_gmt": { + "description": "The date the post was published, as GMT.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "slug": { + "description": "An alphanumeric identifier for the post unique to its type.", + "type": "string", + "required": false + }, + "status": { + "description": "A named status for the post.", + "type": "string", + "enum": ["publish", "future", "draft", "pending", "private"], + "required": false + }, + "password": { + "description": "A password to protect access to the content and excerpt.", + "type": "string", + "required": false + }, + "title": { + "description": "The title for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Title for the post, as it exists in the database.", + "type": "string", + "context": ["view", "edit"] + } + }, + "required": false + }, + "content": { + "description": "The content for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Content for the post, as it exists in the database.", + "type": "string", + "context": ["view", "edit"] + }, + "block_version": { + "description": "Version of the content block format used by the post.", + "type": "integer", + "context": ["edit"], + "readonly": true + }, + "protected": { + "description": "Whether the content is protected with a password.", + "type": "boolean", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "excerpt": { + "description": "The excerpt for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Excerpt for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML excerpt for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + }, + "protected": { + "description": "Whether the excerpt is protected with a password.", + "type": "boolean", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": { + "wp_pattern_sync_status": { + "type": "string", + "title": "", + "description": "", + "default": "", + "enum": ["partial", "unsynced"] + }, + "footnotes": { + "type": "string", + "title": "", + "description": "", + "default": "" + } + }, + "required": false + }, + "template": { + "description": "The theme file to use to display the post.", + "type": "string", + "required": false + }, + "wp_pattern_category": { + "description": "The terms assigned to the post in the wp_pattern_category taxonomy.", + "type": "array", + "items": { "type": "integer" }, + "required": false + } + } + }, + { + "methods": ["DELETE"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the post.", + "type": "integer", + "required": false + }, + "force": { + "type": "boolean", + "default": false, + "description": "Whether to bypass Trash and force deletion.", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/blocks\/(?P[\\d]+)\/revisions": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The ID for the parent of the revision.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "minimum": 1, + "maximum": 100, + "required": false + }, + "search": { + "description": "Limit results to those matching a string.", + "type": "string", + "required": false + }, + "exclude": { + "description": "Ensure result set excludes specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "include": { + "description": "Limit result set to specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "offset": { + "description": "Offset the result set by a specific number of items.", + "type": "integer", + "required": false + }, + "order": { + "description": "Order sort attribute ascending or descending.", + "type": "string", + "default": "desc", + "enum": ["asc", "desc"], + "required": false + }, + "orderby": { + "description": "Sort collection by object attribute.", + "type": "string", + "default": "date", + "enum": [ + "date", + "id", + "include", + "relevance", + "slug", + "include_slugs", + "title" + ], + "required": false + } + } + } + ] + }, + "\/wp\/v2\/blocks\/(?P[\\d]+)\/revisions\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The ID for the parent of the revision.", + "type": "integer", + "required": false + }, + "id": { + "description": "Unique identifier for the revision.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["DELETE"], + "args": { + "parent": { + "description": "The ID for the parent of the revision.", + "type": "integer", + "required": false + }, + "id": { + "description": "Unique identifier for the revision.", + "type": "integer", + "required": false + }, + "force": { + "type": "boolean", + "default": false, + "description": "Required to be true, as revisions do not support trashing.", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/blocks\/(?P[\\d]+)\/autosaves": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The ID for the parent of the autosave.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["POST"], + "args": { + "parent": { + "description": "The ID for the parent of the autosave.", + "type": "integer", + "required": false + }, + "date": { + "description": "The date the post was published, in the site's timezone.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "date_gmt": { + "description": "The date the post was published, as GMT.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "slug": { + "description": "An alphanumeric identifier for the post unique to its type.", + "type": "string", + "required": false + }, + "status": { + "description": "A named status for the post.", + "type": "string", + "enum": ["publish", "future", "draft", "pending", "private"], + "required": false + }, + "password": { + "description": "A password to protect access to the content and excerpt.", + "type": "string", + "required": false + }, + "title": { + "description": "The title for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Title for the post, as it exists in the database.", + "type": "string", + "context": ["view", "edit"] + } + }, + "required": false + }, + "content": { + "description": "The content for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Content for the post, as it exists in the database.", + "type": "string", + "context": ["view", "edit"] + }, + "block_version": { + "description": "Version of the content block format used by the post.", + "type": "integer", + "context": ["edit"], + "readonly": true + }, + "protected": { + "description": "Whether the content is protected with a password.", + "type": "boolean", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "excerpt": { + "description": "The excerpt for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Excerpt for the post, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML excerpt for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + }, + "protected": { + "description": "Whether the excerpt is protected with a password.", + "type": "boolean", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": { + "wp_pattern_sync_status": { + "type": "string", + "title": "", + "description": "", + "default": "", + "enum": ["partial", "unsynced"] + }, + "footnotes": { + "type": "string", + "title": "", + "description": "", + "default": "" + } + }, + "required": false + }, + "template": { + "description": "The theme file to use to display the post.", + "type": "string", + "required": false + }, + "wp_pattern_category": { + "description": "The terms assigned to the post in the wp_pattern_category taxonomy.", + "type": "array", + "items": { "type": "integer" }, + "required": false + } + } + } + ] + }, + "\/wp\/v2\/blocks\/(?P[\\d]+)\/autosaves\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The ID for the parent of the autosave.", + "type": "integer", + "required": false + }, + "id": { + "description": "The ID for the autosave.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/templates\/(?P([^\\\/:<>\\*\\?\"\\|]+(?:\\\/[^\\\/:<>\\*\\?\"\\|]+)?)[\\\/\\w%-]+)\/revisions": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The id of a template", + "type": "string", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "minimum": 1, + "maximum": 100, + "required": false + }, + "search": { + "description": "Limit results to those matching a string.", + "type": "string", + "required": false + }, + "exclude": { + "description": "Ensure result set excludes specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "include": { + "description": "Limit result set to specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "offset": { + "description": "Offset the result set by a specific number of items.", + "type": "integer", + "required": false + }, + "order": { + "description": "Order sort attribute ascending or descending.", + "type": "string", + "default": "desc", + "enum": ["asc", "desc"], + "required": false + }, + "orderby": { + "description": "Sort collection by object attribute.", + "type": "string", + "default": "date", + "enum": [ + "date", + "id", + "include", + "relevance", + "slug", + "include_slugs", + "title" + ], + "required": false + } + } + } + ] + }, + "\/wp\/v2\/templates\/(?P([^\\\/:<>\\*\\?\"\\|]+(?:\\\/[^\\\/:<>\\*\\?\"\\|]+)?)[\\\/\\w%-]+)\/revisions\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The id of a template", + "type": "string", + "required": false + }, + "id": { + "description": "Unique identifier for the revision.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["DELETE"], + "args": { + "parent": { + "description": "The id of a template", + "type": "string", + "required": false + }, + "id": { + "description": "Unique identifier for the revision.", + "type": "integer", + "required": false + }, + "force": { + "type": "boolean", + "default": false, + "description": "Required to be true, as revisions do not support trashing.", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/templates\/(?P([^\\\/:<>\\*\\?\"\\|]+(?:\\\/[^\\\/:<>\\*\\?\"\\|]+)?)[\\\/\\w%-]+)\/autosaves": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "id": { + "description": "The id of a template", + "type": "string", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["POST"], + "args": { + "id": { + "description": "The id of a template", + "type": "string", + "required": false + }, + "slug": { + "description": "Unique slug identifying the template.", + "type": "string", + "minLength": 1, + "pattern": "[a-zA-Z0-9_\\%-]+", + "required": false + }, + "theme": { + "description": "Theme identifier for the template.", + "type": "string", + "required": false + }, + "type": { + "description": "Type of template.", + "type": "string", + "required": false + }, + "content": { + "description": "Content of template.", + "type": ["object", "string"], + "properties": { + "raw": { + "description": "Content for the template, as it exists in the database.", + "type": "string", + "context": ["view", "edit"] + }, + "block_version": { + "description": "Version of the content block format used by the template.", + "type": "integer", + "context": ["edit"], + "readonly": true + } + }, + "required": false + }, + "title": { + "description": "Title of template.", + "type": ["object", "string"], + "properties": { + "raw": { + "description": "Title for the template, as it exists in the database.", + "type": "string", + "context": ["view", "edit", "embed"] + }, + "rendered": { + "description": "HTML title for the template, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "description": { + "description": "Description of template.", + "type": "string", + "required": false + }, + "status": { + "description": "Status of template.", + "type": "string", + "enum": ["publish", "future", "draft", "pending", "private"], + "required": false + }, + "author": { + "description": "The ID for the author of the template.", + "type": "integer", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/templates\/(?P([^\\\/:<>\\*\\?\"\\|]+(?:\\\/[^\\\/:<>\\*\\?\"\\|]+)?)[\\\/\\w%-]+)\/autosaves\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The id of a template", + "type": "string", + "required": false + }, + "id": { + "description": "The ID for the autosave.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/templates": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "wp_id": { + "description": "Limit to the specified post id.", + "type": "integer", + "required": false + }, + "area": { + "description": "Limit to the specified template part area.", + "type": "string", + "required": false + }, + "post_type": { + "description": "Post type to get the templates for.", + "type": "string", + "required": false + } + } + }, + { + "methods": ["POST"], + "args": { + "slug": { + "description": "Unique slug identifying the template.", + "type": "string", + "minLength": 1, + "pattern": "[a-zA-Z0-9_\\%-]+", + "required": true + }, + "theme": { + "description": "Theme identifier for the template.", + "type": "string", + "required": false + }, + "type": { + "description": "Type of template.", + "type": "string", + "required": false + }, + "content": { + "default": "", + "description": "Content of template.", + "type": ["object", "string"], + "properties": { + "raw": { + "description": "Content for the template, as it exists in the database.", + "type": "string", + "context": ["view", "edit"] + }, + "block_version": { + "description": "Version of the content block format used by the template.", + "type": "integer", + "context": ["edit"], + "readonly": true + } + }, + "required": false + }, + "title": { + "default": "", + "description": "Title of template.", + "type": ["object", "string"], + "properties": { + "raw": { + "description": "Title for the template, as it exists in the database.", + "type": "string", + "context": ["view", "edit", "embed"] + }, + "rendered": { + "description": "HTML title for the template, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "description": { + "default": "", + "description": "Description of template.", + "type": "string", + "required": false + }, + "status": { + "default": "publish", + "description": "Status of template.", + "type": "string", + "enum": ["publish", "future", "draft", "pending", "private"], + "required": false + }, + "author": { + "description": "The ID for the author of the template.", + "type": "integer", + "required": false + } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/templates" } + ] + } + }, + "\/wp\/v2\/templates\/lookup": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "slug": { + "description": "The slug of the template to get the fallback for", + "type": "string", + "required": true + }, + "is_custom": { + "description": "Indicates if a template is custom or part of the template hierarchy", + "type": "boolean", + "required": false + }, + "template_prefix": { + "description": "The template prefix for the created template. This is used to extract the main template type, e.g. in `taxonomy-books` extracts the `taxonomy`", + "type": "string", + "required": false + } + } + } + ], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/templates\/lookup" + } + ] + } + }, + "\/wp\/v2\/templates\/(?P([^\\\/:<>\\*\\?\"\\|]+(?:\\\/[^\\\/:<>\\*\\?\"\\|]+)?)[\\\/\\w%-]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "POST", "PUT", "PATCH", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "id": { + "description": "The id of a template", + "type": "string", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["POST", "PUT", "PATCH"], + "args": { + "id": { + "description": "The id of a template", + "type": "string", + "required": false + }, + "slug": { + "description": "Unique slug identifying the template.", + "type": "string", + "minLength": 1, + "pattern": "[a-zA-Z0-9_\\%-]+", + "required": false + }, + "theme": { + "description": "Theme identifier for the template.", + "type": "string", + "required": false + }, + "type": { + "description": "Type of template.", + "type": "string", + "required": false + }, + "content": { + "description": "Content of template.", + "type": ["object", "string"], + "properties": { + "raw": { + "description": "Content for the template, as it exists in the database.", + "type": "string", + "context": ["view", "edit"] + }, + "block_version": { + "description": "Version of the content block format used by the template.", + "type": "integer", + "context": ["edit"], + "readonly": true + } + }, + "required": false + }, + "title": { + "description": "Title of template.", + "type": ["object", "string"], + "properties": { + "raw": { + "description": "Title for the template, as it exists in the database.", + "type": "string", + "context": ["view", "edit", "embed"] + }, + "rendered": { + "description": "HTML title for the template, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "description": { + "description": "Description of template.", + "type": "string", + "required": false + }, + "status": { + "description": "Status of template.", + "type": "string", + "enum": ["publish", "future", "draft", "pending", "private"], + "required": false + }, + "author": { + "description": "The ID for the author of the template.", + "type": "integer", + "required": false + } + } + }, + { + "methods": ["DELETE"], + "args": { + "id": { + "description": "The id of a template", + "type": "string", + "required": false + }, + "force": { + "type": "boolean", + "default": false, + "description": "Whether to bypass Trash and force deletion.", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/template-parts\/(?P([^\\\/:<>\\*\\?\"\\|]+(?:\\\/[^\\\/:<>\\*\\?\"\\|]+)?)[\\\/\\w%-]+)\/revisions": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The id of a template", + "type": "string", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "minimum": 1, + "maximum": 100, + "required": false + }, + "search": { + "description": "Limit results to those matching a string.", + "type": "string", + "required": false + }, + "exclude": { + "description": "Ensure result set excludes specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "include": { + "description": "Limit result set to specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "offset": { + "description": "Offset the result set by a specific number of items.", + "type": "integer", + "required": false + }, + "order": { + "description": "Order sort attribute ascending or descending.", + "type": "string", + "default": "desc", + "enum": ["asc", "desc"], + "required": false + }, + "orderby": { + "description": "Sort collection by object attribute.", + "type": "string", + "default": "date", + "enum": [ + "date", + "id", + "include", + "relevance", + "slug", + "include_slugs", + "title" + ], + "required": false + } + } + } + ] + }, + "\/wp\/v2\/template-parts\/(?P([^\\\/:<>\\*\\?\"\\|]+(?:\\\/[^\\\/:<>\\*\\?\"\\|]+)?)[\\\/\\w%-]+)\/revisions\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The id of a template", + "type": "string", + "required": false + }, + "id": { + "description": "Unique identifier for the revision.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["DELETE"], + "args": { + "parent": { + "description": "The id of a template", + "type": "string", + "required": false + }, + "id": { + "description": "Unique identifier for the revision.", + "type": "integer", + "required": false + }, + "force": { + "type": "boolean", + "default": false, + "description": "Required to be true, as revisions do not support trashing.", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/template-parts\/(?P([^\\\/:<>\\*\\?\"\\|]+(?:\\\/[^\\\/:<>\\*\\?\"\\|]+)?)[\\\/\\w%-]+)\/autosaves": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "id": { + "description": "The id of a template", + "type": "string", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["POST"], + "args": { + "id": { + "description": "The id of a template", + "type": "string", + "required": false + }, + "slug": { + "description": "Unique slug identifying the template.", + "type": "string", + "minLength": 1, + "pattern": "[a-zA-Z0-9_\\%-]+", + "required": false + }, + "theme": { + "description": "Theme identifier for the template.", + "type": "string", + "required": false + }, + "type": { + "description": "Type of template.", + "type": "string", + "required": false + }, + "content": { + "description": "Content of template.", + "type": ["object", "string"], + "properties": { + "raw": { + "description": "Content for the template, as it exists in the database.", + "type": "string", + "context": ["view", "edit"] + }, + "block_version": { + "description": "Version of the content block format used by the template.", + "type": "integer", + "context": ["edit"], + "readonly": true + } + }, + "required": false + }, + "title": { + "description": "Title of template.", + "type": ["object", "string"], + "properties": { + "raw": { + "description": "Title for the template, as it exists in the database.", + "type": "string", + "context": ["view", "edit", "embed"] + }, + "rendered": { + "description": "HTML title for the template, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "description": { + "description": "Description of template.", + "type": "string", + "required": false + }, + "status": { + "description": "Status of template.", + "type": "string", + "enum": ["publish", "future", "draft", "pending", "private"], + "required": false + }, + "author": { + "description": "The ID for the author of the template.", + "type": "integer", + "required": false + }, + "area": { + "description": "Where the template part is intended for use (header, footer, etc.)", + "type": "string", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/template-parts\/(?P([^\\\/:<>\\*\\?\"\\|]+(?:\\\/[^\\\/:<>\\*\\?\"\\|]+)?)[\\\/\\w%-]+)\/autosaves\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The id of a template", + "type": "string", + "required": false + }, + "id": { + "description": "The ID for the autosave.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/template-parts": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "wp_id": { + "description": "Limit to the specified post id.", + "type": "integer", + "required": false + }, + "area": { + "description": "Limit to the specified template part area.", + "type": "string", + "required": false + }, + "post_type": { + "description": "Post type to get the templates for.", + "type": "string", + "required": false + } + } + }, + { + "methods": ["POST"], + "args": { + "slug": { + "description": "Unique slug identifying the template.", + "type": "string", + "minLength": 1, + "pattern": "[a-zA-Z0-9_\\%-]+", + "required": true + }, + "theme": { + "description": "Theme identifier for the template.", + "type": "string", + "required": false + }, + "type": { + "description": "Type of template.", + "type": "string", + "required": false + }, + "content": { + "default": "", + "description": "Content of template.", + "type": ["object", "string"], + "properties": { + "raw": { + "description": "Content for the template, as it exists in the database.", + "type": "string", + "context": ["view", "edit"] + }, + "block_version": { + "description": "Version of the content block format used by the template.", + "type": "integer", + "context": ["edit"], + "readonly": true + } + }, + "required": false + }, + "title": { + "default": "", + "description": "Title of template.", + "type": ["object", "string"], + "properties": { + "raw": { + "description": "Title for the template, as it exists in the database.", + "type": "string", + "context": ["view", "edit", "embed"] + }, + "rendered": { + "description": "HTML title for the template, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "description": { + "default": "", + "description": "Description of template.", + "type": "string", + "required": false + }, + "status": { + "default": "publish", + "description": "Status of template.", + "type": "string", + "enum": ["publish", "future", "draft", "pending", "private"], + "required": false + }, + "author": { + "description": "The ID for the author of the template.", + "type": "integer", + "required": false + }, + "area": { + "description": "Where the template part is intended for use (header, footer, etc.)", + "type": "string", + "required": false + } + } + } + ], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/template-parts" + } + ] + } + }, + "\/wp\/v2\/template-parts\/lookup": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "slug": { + "description": "The slug of the template to get the fallback for", + "type": "string", + "required": true + }, + "is_custom": { + "description": "Indicates if a template is custom or part of the template hierarchy", + "type": "boolean", + "required": false + }, + "template_prefix": { + "description": "The template prefix for the created template. This is used to extract the main template type, e.g. in `taxonomy-books` extracts the `taxonomy`", + "type": "string", + "required": false + } + } + } + ], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/template-parts\/lookup" + } + ] + } + }, + "\/wp\/v2\/template-parts\/(?P([^\\\/:<>\\*\\?\"\\|]+(?:\\\/[^\\\/:<>\\*\\?\"\\|]+)?)[\\\/\\w%-]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "POST", "PUT", "PATCH", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "id": { + "description": "The id of a template", + "type": "string", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["POST", "PUT", "PATCH"], + "args": { + "id": { + "description": "The id of a template", + "type": "string", + "required": false + }, + "slug": { + "description": "Unique slug identifying the template.", + "type": "string", + "minLength": 1, + "pattern": "[a-zA-Z0-9_\\%-]+", + "required": false + }, + "theme": { + "description": "Theme identifier for the template.", + "type": "string", + "required": false + }, + "type": { + "description": "Type of template.", + "type": "string", + "required": false + }, + "content": { + "description": "Content of template.", + "type": ["object", "string"], + "properties": { + "raw": { + "description": "Content for the template, as it exists in the database.", + "type": "string", + "context": ["view", "edit"] + }, + "block_version": { + "description": "Version of the content block format used by the template.", + "type": "integer", + "context": ["edit"], + "readonly": true + } + }, + "required": false + }, + "title": { + "description": "Title of template.", + "type": ["object", "string"], + "properties": { + "raw": { + "description": "Title for the template, as it exists in the database.", + "type": "string", + "context": ["view", "edit", "embed"] + }, + "rendered": { + "description": "HTML title for the template, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "description": { + "description": "Description of template.", + "type": "string", + "required": false + }, + "status": { + "description": "Status of template.", + "type": "string", + "enum": ["publish", "future", "draft", "pending", "private"], + "required": false + }, + "author": { + "description": "The ID for the author of the template.", + "type": "integer", + "required": false + }, + "area": { + "description": "Where the template part is intended for use (header, footer, etc.)", + "type": "string", + "required": false + } + } + }, + { + "methods": ["DELETE"], + "args": { + "id": { + "description": "The id of a template", + "type": "string", + "required": false + }, + "force": { + "type": "boolean", + "default": false, + "description": "Whether to bypass Trash and force deletion.", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/global-styles\/(?P[\\d]+)\/revisions": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The ID for the parent of the revision.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "minimum": 1, + "maximum": 100, + "required": false + }, + "offset": { + "description": "Offset the result set by a specific number of items.", + "type": "integer", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/global-styles\/(?P[\\d]+)\/revisions\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The ID for the parent of the global styles revision.", + "type": "integer", + "required": false + }, + "id": { + "description": "Unique identifier for the global styles revision.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/global-styles\/themes\/(?P[\\\/\\s%\\w\\.\\(\\)\\[\\]\\@_\\-]+)\/variations": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": false }, + "args": { + "stylesheet": { + "description": "The theme identifier", + "type": "string", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/global-styles\/themes\/(?P[^\\\/:<>\\*\\?\"\\|]+(?:\\\/[^\\\/:<>\\*\\?\"\\|]+)?)": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": false }, + "args": { + "stylesheet": { + "description": "The theme identifier", + "type": "string", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/global-styles\/(?P[\\\/\\d+]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "POST", "PUT", "PATCH"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": false }, + "args": { + "id": { + "description": "ID of global styles config.", + "type": "integer", + "required": false + } + } + }, + { + "methods": ["POST", "PUT", "PATCH"], + "allow_batch": { "v1": false }, + "args": { + "styles": { + "description": "Global styles.", + "type": ["object"], + "required": false + }, + "settings": { + "description": "Global settings.", + "type": ["object"], + "required": false + }, + "title": { + "description": "Title of the global styles variation.", + "type": ["object", "string"], + "properties": { + "raw": { + "description": "Title for the global styles variation, as it exists in the database.", + "type": "string", + "context": ["view", "edit", "embed"] + }, + "rendered": { + "description": "HTML title for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + } + } + } + ] + }, + "\/wp\/v2\/navigation": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": true }, + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "default": 10, + "minimum": 1, + "maximum": 100, + "required": false + }, + "search": { + "description": "Limit results to those matching a string.", + "type": "string", + "required": false + }, + "after": { + "description": "Limit response to posts published after a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "modified_after": { + "description": "Limit response to posts modified after a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "before": { + "description": "Limit response to posts published before a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "modified_before": { + "description": "Limit response to posts modified before a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "exclude": { + "description": "Ensure result set excludes specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "include": { + "description": "Limit result set to specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "search_semantics": { + "description": "How to interpret the search input.", + "type": "string", + "enum": ["exact"], + "required": false + }, + "offset": { + "description": "Offset the result set by a specific number of items.", + "type": "integer", + "required": false + }, + "order": { + "description": "Order sort attribute ascending or descending.", + "type": "string", + "default": "desc", + "enum": ["asc", "desc"], + "required": false + }, + "orderby": { + "description": "Sort collection by post attribute.", + "type": "string", + "default": "date", + "enum": [ + "author", + "date", + "id", + "include", + "modified", + "parent", + "relevance", + "slug", + "include_slugs", + "title" + ], + "required": false + }, + "search_columns": { + "default": [], + "description": "Array of column names to be searched.", + "type": "array", + "items": { + "enum": ["post_title", "post_content", "post_excerpt"], + "type": "string" + }, + "required": false + }, + "slug": { + "description": "Limit result set to posts with one or more specific slugs.", + "type": "array", + "items": { "type": "string" }, + "required": false + }, + "status": { + "default": "publish", + "description": "Limit result set to posts assigned one or more statuses.", + "type": "array", + "items": { + "enum": [ + "publish", + "future", + "draft", + "pending", + "private", + "trash", + "auto-draft", + "inherit", + "request-pending", + "request-confirmed", + "request-failed", + "request-completed", + "any" + ], + "type": "string" + }, + "required": false + } + } + }, + { + "methods": ["POST"], + "allow_batch": { "v1": true }, + "args": { + "date": { + "description": "The date the post was published, in the site's timezone.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "date_gmt": { + "description": "The date the post was published, as GMT.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "slug": { + "description": "An alphanumeric identifier for the post unique to its type.", + "type": "string", + "required": false + }, + "status": { + "description": "A named status for the post.", + "type": "string", + "enum": ["publish", "future", "draft", "pending", "private"], + "required": false + }, + "password": { + "description": "A password to protect access to the content and excerpt.", + "type": "string", + "required": false + }, + "title": { + "description": "The title for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Title for the post, as it exists in the database.", + "type": "string", + "context": ["edit", "embed"] + }, + "rendered": { + "description": "HTML title for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "content": { + "description": "The content for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Content for the post, as it exists in the database.", + "type": "string", + "context": ["edit", "embed"] + }, + "rendered": { + "description": "HTML content for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + }, + "block_version": { + "description": "Version of the content block format used by the post.", + "type": "integer", + "context": ["edit", "embed"], + "readonly": true + }, + "protected": { + "description": "Whether the content is protected with a password.", + "type": "boolean", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "template": { + "description": "The theme file to use to display the post.", + "type": "string", + "required": false + } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/navigation" } + ] + } + }, + "\/wp\/v2\/navigation\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "POST", "PUT", "PATCH", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the post.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "password": { + "description": "The password for the post if it is password protected.", + "type": "string", + "required": false + } + } + }, + { + "methods": ["POST", "PUT", "PATCH"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the post.", + "type": "integer", + "required": false + }, + "date": { + "description": "The date the post was published, in the site's timezone.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "date_gmt": { + "description": "The date the post was published, as GMT.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "slug": { + "description": "An alphanumeric identifier for the post unique to its type.", + "type": "string", + "required": false + }, + "status": { + "description": "A named status for the post.", + "type": "string", + "enum": ["publish", "future", "draft", "pending", "private"], + "required": false + }, + "password": { + "description": "A password to protect access to the content and excerpt.", + "type": "string", + "required": false + }, + "title": { + "description": "The title for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Title for the post, as it exists in the database.", + "type": "string", + "context": ["edit", "embed"] + }, + "rendered": { + "description": "HTML title for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "content": { + "description": "The content for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Content for the post, as it exists in the database.", + "type": "string", + "context": ["edit", "embed"] + }, + "rendered": { + "description": "HTML content for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + }, + "block_version": { + "description": "Version of the content block format used by the post.", + "type": "integer", + "context": ["edit", "embed"], + "readonly": true + }, + "protected": { + "description": "Whether the content is protected with a password.", + "type": "boolean", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "template": { + "description": "The theme file to use to display the post.", + "type": "string", + "required": false + } + } + }, + { + "methods": ["DELETE"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the post.", + "type": "integer", + "required": false + }, + "force": { + "type": "boolean", + "default": false, + "description": "Whether to bypass Trash and force deletion.", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/navigation\/(?P[\\d]+)\/revisions": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The ID for the parent of the revision.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "minimum": 1, + "maximum": 100, + "required": false + }, + "search": { + "description": "Limit results to those matching a string.", + "type": "string", + "required": false + }, + "exclude": { + "description": "Ensure result set excludes specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "include": { + "description": "Limit result set to specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "offset": { + "description": "Offset the result set by a specific number of items.", + "type": "integer", + "required": false + }, + "order": { + "description": "Order sort attribute ascending or descending.", + "type": "string", + "default": "desc", + "enum": ["asc", "desc"], + "required": false + }, + "orderby": { + "description": "Sort collection by object attribute.", + "type": "string", + "default": "date", + "enum": [ + "date", + "id", + "include", + "relevance", + "slug", + "include_slugs", + "title" + ], + "required": false + } + } + } + ] + }, + "\/wp\/v2\/navigation\/(?P[\\d]+)\/revisions\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The ID for the parent of the revision.", + "type": "integer", + "required": false + }, + "id": { + "description": "Unique identifier for the revision.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["DELETE"], + "args": { + "parent": { + "description": "The ID for the parent of the revision.", + "type": "integer", + "required": false + }, + "id": { + "description": "Unique identifier for the revision.", + "type": "integer", + "required": false + }, + "force": { + "type": "boolean", + "default": false, + "description": "Required to be true, as revisions do not support trashing.", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/navigation\/(?P[\\d]+)\/autosaves": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The ID for the parent of the autosave.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["POST"], + "args": { + "parent": { + "description": "The ID for the parent of the autosave.", + "type": "integer", + "required": false + }, + "date": { + "description": "The date the post was published, in the site's timezone.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "date_gmt": { + "description": "The date the post was published, as GMT.", + "type": ["string", "null"], + "format": "date-time", + "required": false + }, + "slug": { + "description": "An alphanumeric identifier for the post unique to its type.", + "type": "string", + "required": false + }, + "status": { + "description": "A named status for the post.", + "type": "string", + "enum": ["publish", "future", "draft", "pending", "private"], + "required": false + }, + "password": { + "description": "A password to protect access to the content and excerpt.", + "type": "string", + "required": false + }, + "title": { + "description": "The title for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Title for the post, as it exists in the database.", + "type": "string", + "context": ["edit", "embed"] + }, + "rendered": { + "description": "HTML title for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "content": { + "description": "The content for the post.", + "type": "object", + "properties": { + "raw": { + "description": "Content for the post, as it exists in the database.", + "type": "string", + "context": ["edit", "embed"] + }, + "rendered": { + "description": "HTML content for the post, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + }, + "block_version": { + "description": "Version of the content block format used by the post.", + "type": "integer", + "context": ["edit", "embed"], + "readonly": true + }, + "protected": { + "description": "Whether the content is protected with a password.", + "type": "boolean", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "template": { + "description": "The theme file to use to display the post.", + "type": "string", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/navigation\/(?P[\\d]+)\/autosaves\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "parent": { + "description": "The ID for the parent of the autosave.", + "type": "integer", + "required": false + }, + "id": { + "description": "The ID for the autosave.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/font-families": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "default": 10, + "minimum": 1, + "maximum": 100, + "required": false + }, + "exclude": { + "description": "Ensure result set excludes specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "include": { + "description": "Limit result set to specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "search_semantics": { + "description": "How to interpret the search input.", + "type": "string", + "enum": ["exact"], + "required": false + }, + "offset": { + "description": "Offset the result set by a specific number of items.", + "type": "integer", + "required": false + }, + "order": { + "description": "Order sort attribute ascending or descending.", + "type": "string", + "default": "desc", + "enum": ["asc", "desc"], + "required": false + }, + "orderby": { + "description": "Sort collection by post attribute.", + "type": "string", + "default": "id", + "enum": ["id", "include"], + "required": false + }, + "slug": { + "description": "Limit result set to posts with one or more specific slugs.", + "type": "array", + "items": { "type": "string" }, + "required": false + } + } + }, + { + "methods": ["POST"], + "args": { + "theme_json_version": { + "description": "Version of the theme.json schema used for the typography settings.", + "type": "integer", + "default": 3, + "minimum": 2, + "maximum": 3, + "required": false + }, + "font_family_settings": { + "description": "font-family declaration in theme.json format, encoded as a string.", + "type": "string", + "required": true + } + } + } + ], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/font-families" + } + ] + } + }, + "\/wp\/v2\/font-families\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "POST", "PUT", "PATCH", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "id": { + "description": "Unique identifier for the post.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["POST", "PUT", "PATCH"], + "args": { + "id": { + "description": "Unique identifier for the post.", + "type": "integer", + "required": false + }, + "theme_json_version": { + "description": "Version of the theme.json schema used for the typography settings.", + "type": "integer", + "default": 3, + "minimum": 2, + "maximum": 3, + "required": false + }, + "font_family_settings": { + "description": "font-family declaration in theme.json format, encoded as a string.", + "type": "string", + "required": true + } + } + }, + { + "methods": ["DELETE"], + "args": { + "id": { + "description": "Unique identifier for the post.", + "type": "integer", + "required": false + }, + "force": { + "type": "boolean", + "default": false, + "description": "Whether to bypass Trash and force deletion.", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/font-families\/(?P[\\d]+)\/font-faces": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "font_family_id": { + "description": "The ID for the parent font family of the font face.", + "type": "integer", + "required": true + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "default": 10, + "minimum": 1, + "maximum": 100, + "required": false + }, + "exclude": { + "description": "Ensure result set excludes specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "include": { + "description": "Limit result set to specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "search_semantics": { + "description": "How to interpret the search input.", + "type": "string", + "enum": ["exact"], + "required": false + }, + "offset": { + "description": "Offset the result set by a specific number of items.", + "type": "integer", + "required": false + }, + "order": { + "description": "Order sort attribute ascending or descending.", + "type": "string", + "default": "desc", + "enum": ["asc", "desc"], + "required": false + }, + "orderby": { + "description": "Sort collection by post attribute.", + "type": "string", + "default": "id", + "enum": ["id", "include"], + "required": false + } + } + }, + { + "methods": ["POST"], + "args": { + "font_family_id": { + "description": "The ID for the parent font family of the font face.", + "type": "integer", + "required": true + }, + "theme_json_version": { + "description": "Version of the theme.json schema used for the typography settings.", + "type": "integer", + "default": 3, + "minimum": 2, + "maximum": 3, + "required": false + }, + "font_face_settings": { + "description": "font-face declaration in theme.json format, encoded as a string.", + "type": "string", + "required": true + } + } + } + ] + }, + "\/wp\/v2\/font-families\/(?P[\\d]+)\/font-faces\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "font_family_id": { + "description": "The ID for the parent font family of the font face.", + "type": "integer", + "required": true + }, + "id": { + "description": "Unique identifier for the font face.", + "type": "integer", + "required": true + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["DELETE"], + "args": { + "font_family_id": { + "description": "The ID for the parent font family of the font face.", + "type": "integer", + "required": true + }, + "id": { + "description": "Unique identifier for the font face.", + "type": "integer", + "required": true + }, + "force": { + "type": "boolean", + "default": false, + "description": "Whether to bypass Trash and force deletion.", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/types": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/types" } + ] + } + }, + "\/wp\/v2\/types\/(?P[\\w-]+)": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "type": { + "description": "An alphanumeric identifier for the post type.", + "type": "string", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/statuses": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/statuses" } + ] + } + }, + "\/wp\/v2\/statuses\/(?P[\\w-]+)": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "status": { + "description": "An alphanumeric identifier for the status.", + "type": "string", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/taxonomies": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "type": { + "description": "Limit results to taxonomies associated with a specific post type.", + "type": "string", + "required": false + } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/taxonomies" } + ] + } + }, + "\/wp\/v2\/taxonomies\/(?P[\\w-]+)": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "taxonomy": { + "description": "An alphanumeric identifier for the taxonomy.", + "type": "string", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/categories": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": true }, + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "default": 10, + "minimum": 1, + "maximum": 100, + "required": false + }, + "search": { + "description": "Limit results to those matching a string.", + "type": "string", + "required": false + }, + "exclude": { + "description": "Ensure result set excludes specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "include": { + "description": "Limit result set to specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "order": { + "description": "Order sort attribute ascending or descending.", + "type": "string", + "default": "asc", + "enum": ["asc", "desc"], + "required": false + }, + "orderby": { + "description": "Sort collection by term attribute.", + "type": "string", + "default": "name", + "enum": [ + "id", + "include", + "name", + "slug", + "include_slugs", + "term_group", + "description", + "count" + ], + "required": false + }, + "hide_empty": { + "description": "Whether to hide terms not assigned to any posts.", + "type": "boolean", + "default": false, + "required": false + }, + "parent": { + "description": "Limit result set to terms assigned to a specific parent.", + "type": "integer", + "required": false + }, + "post": { + "description": "Limit result set to terms assigned to a specific post.", + "type": "integer", + "default": null, + "required": false + }, + "slug": { + "description": "Limit result set to terms with one or more specific slugs.", + "type": "array", + "items": { "type": "string" }, + "required": false + } + } + }, + { + "methods": ["POST"], + "allow_batch": { "v1": true }, + "args": { + "description": { + "description": "HTML description of the term.", + "type": "string", + "required": false + }, + "name": { + "description": "HTML title for the term.", + "type": "string", + "required": true + }, + "slug": { + "description": "An alphanumeric identifier for the term unique to its type.", + "type": "string", + "required": false + }, + "parent": { + "description": "The parent term ID.", + "type": "integer", + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": [], + "required": false + } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/categories" } + ] + } + }, + "\/wp\/v2\/categories\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "POST", "PUT", "PATCH", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the term.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["POST", "PUT", "PATCH"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the term.", + "type": "integer", + "required": false + }, + "description": { + "description": "HTML description of the term.", + "type": "string", + "required": false + }, + "name": { + "description": "HTML title for the term.", + "type": "string", + "required": false + }, + "slug": { + "description": "An alphanumeric identifier for the term unique to its type.", + "type": "string", + "required": false + }, + "parent": { + "description": "The parent term ID.", + "type": "integer", + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": [], + "required": false + } + } + }, + { + "methods": ["DELETE"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the term.", + "type": "integer", + "required": false + }, + "force": { + "type": "boolean", + "default": false, + "description": "Required to be true, as terms do not support trashing.", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/tags": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": true }, + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "default": 10, + "minimum": 1, + "maximum": 100, + "required": false + }, + "search": { + "description": "Limit results to those matching a string.", + "type": "string", + "required": false + }, + "exclude": { + "description": "Ensure result set excludes specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "include": { + "description": "Limit result set to specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "offset": { + "description": "Offset the result set by a specific number of items.", + "type": "integer", + "required": false + }, + "order": { + "description": "Order sort attribute ascending or descending.", + "type": "string", + "default": "asc", + "enum": ["asc", "desc"], + "required": false + }, + "orderby": { + "description": "Sort collection by term attribute.", + "type": "string", + "default": "name", + "enum": [ + "id", + "include", + "name", + "slug", + "include_slugs", + "term_group", + "description", + "count" + ], + "required": false + }, + "hide_empty": { + "description": "Whether to hide terms not assigned to any posts.", + "type": "boolean", + "default": false, + "required": false + }, + "post": { + "description": "Limit result set to terms assigned to a specific post.", + "type": "integer", + "default": null, + "required": false + }, + "slug": { + "description": "Limit result set to terms with one or more specific slugs.", + "type": "array", + "items": { "type": "string" }, + "required": false + } + } + }, + { + "methods": ["POST"], + "allow_batch": { "v1": true }, + "args": { + "description": { + "description": "HTML description of the term.", + "type": "string", + "required": false + }, + "name": { + "description": "HTML title for the term.", + "type": "string", + "required": true + }, + "slug": { + "description": "An alphanumeric identifier for the term unique to its type.", + "type": "string", + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": [], + "required": false + } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/tags" } + ] + } + }, + "\/wp\/v2\/tags\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "POST", "PUT", "PATCH", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the term.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["POST", "PUT", "PATCH"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the term.", + "type": "integer", + "required": false + }, + "description": { + "description": "HTML description of the term.", + "type": "string", + "required": false + }, + "name": { + "description": "HTML title for the term.", + "type": "string", + "required": false + }, + "slug": { + "description": "An alphanumeric identifier for the term unique to its type.", + "type": "string", + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": [], + "required": false + } + } + }, + { + "methods": ["DELETE"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the term.", + "type": "integer", + "required": false + }, + "force": { + "type": "boolean", + "default": false, + "description": "Required to be true, as terms do not support trashing.", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/menus": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": true }, + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "default": 10, + "minimum": 1, + "maximum": 100, + "required": false + }, + "search": { + "description": "Limit results to those matching a string.", + "type": "string", + "required": false + }, + "exclude": { + "description": "Ensure result set excludes specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "include": { + "description": "Limit result set to specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "offset": { + "description": "Offset the result set by a specific number of items.", + "type": "integer", + "required": false + }, + "order": { + "description": "Order sort attribute ascending or descending.", + "type": "string", + "default": "asc", + "enum": ["asc", "desc"], + "required": false + }, + "orderby": { + "description": "Sort collection by term attribute.", + "type": "string", + "default": "name", + "enum": [ + "id", + "include", + "name", + "slug", + "include_slugs", + "term_group", + "description", + "count" + ], + "required": false + }, + "hide_empty": { + "description": "Whether to hide terms not assigned to any posts.", + "type": "boolean", + "default": false, + "required": false + }, + "post": { + "description": "Limit result set to terms assigned to a specific post.", + "type": "integer", + "default": null, + "required": false + }, + "slug": { + "description": "Limit result set to terms with one or more specific slugs.", + "type": "array", + "items": { "type": "string" }, + "required": false + } + } + }, + { + "methods": ["POST"], + "allow_batch": { "v1": true }, + "args": { + "description": { + "description": "HTML description of the term.", + "type": "string", + "required": false + }, + "name": { + "description": "HTML title for the term.", + "type": "string", + "required": true + }, + "slug": { + "description": "An alphanumeric identifier for the term unique to its type.", + "type": "string", + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": [], + "required": false + }, + "locations": { + "description": "The locations assigned to the menu.", + "type": "array", + "items": { "type": "string" }, + "required": false + }, + "auto_add": { + "description": "Whether to automatically add top level pages to this menu.", + "type": "boolean", + "required": false + } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/menus" } + ] + } + }, + "\/wp\/v2\/menus\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "POST", "PUT", "PATCH", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the term.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["POST", "PUT", "PATCH"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the term.", + "type": "integer", + "required": false + }, + "description": { + "description": "HTML description of the term.", + "type": "string", + "required": false + }, + "name": { + "description": "HTML title for the term.", + "type": "string", + "required": false + }, + "slug": { + "description": "An alphanumeric identifier for the term unique to its type.", + "type": "string", + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": [], + "required": false + }, + "locations": { + "description": "The locations assigned to the menu.", + "type": "array", + "items": { "type": "string" }, + "required": false + }, + "auto_add": { + "description": "Whether to automatically add top level pages to this menu.", + "type": "boolean", + "required": false + } + } + }, + { + "methods": ["DELETE"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the term.", + "type": "integer", + "required": false + }, + "force": { + "type": "boolean", + "default": false, + "description": "Required to be true, as terms do not support trashing.", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/wp_pattern_category": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": true }, + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "default": 10, + "minimum": 1, + "maximum": 100, + "required": false + }, + "search": { + "description": "Limit results to those matching a string.", + "type": "string", + "required": false + }, + "exclude": { + "description": "Ensure result set excludes specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "include": { + "description": "Limit result set to specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "offset": { + "description": "Offset the result set by a specific number of items.", + "type": "integer", + "required": false + }, + "order": { + "description": "Order sort attribute ascending or descending.", + "type": "string", + "default": "asc", + "enum": ["asc", "desc"], + "required": false + }, + "orderby": { + "description": "Sort collection by term attribute.", + "type": "string", + "default": "name", + "enum": [ + "id", + "include", + "name", + "slug", + "include_slugs", + "term_group", + "description", + "count" + ], + "required": false + }, + "hide_empty": { + "description": "Whether to hide terms not assigned to any posts.", + "type": "boolean", + "default": false, + "required": false + }, + "post": { + "description": "Limit result set to terms assigned to a specific post.", + "type": "integer", + "default": null, + "required": false + }, + "slug": { + "description": "Limit result set to terms with one or more specific slugs.", + "type": "array", + "items": { "type": "string" }, + "required": false + } + } + }, + { + "methods": ["POST"], + "allow_batch": { "v1": true }, + "args": { + "description": { + "description": "HTML description of the term.", + "type": "string", + "required": false + }, + "name": { + "description": "HTML title for the term.", + "type": "string", + "required": true + }, + "slug": { + "description": "An alphanumeric identifier for the term unique to its type.", + "type": "string", + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": [], + "required": false + } + } + } + ], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/wp_pattern_category" + } + ] + } + }, + "\/wp\/v2\/wp_pattern_category\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "POST", "PUT", "PATCH", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the term.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["POST", "PUT", "PATCH"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the term.", + "type": "integer", + "required": false + }, + "description": { + "description": "HTML description of the term.", + "type": "string", + "required": false + }, + "name": { + "description": "HTML title for the term.", + "type": "string", + "required": false + }, + "slug": { + "description": "An alphanumeric identifier for the term unique to its type.", + "type": "string", + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": [], + "required": false + } + } + }, + { + "methods": ["DELETE"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the term.", + "type": "integer", + "required": false + }, + "force": { + "type": "boolean", + "default": false, + "description": "Required to be true, as terms do not support trashing.", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/users": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": true }, + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "default": 10, + "minimum": 1, + "maximum": 100, + "required": false + }, + "search": { + "description": "Limit results to those matching a string.", + "type": "string", + "required": false + }, + "exclude": { + "description": "Ensure result set excludes specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "include": { + "description": "Limit result set to specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "offset": { + "description": "Offset the result set by a specific number of items.", + "type": "integer", + "required": false + }, + "order": { + "default": "asc", + "description": "Order sort attribute ascending or descending.", + "enum": ["asc", "desc"], + "type": "string", + "required": false + }, + "orderby": { + "default": "name", + "description": "Sort collection by user attribute.", + "enum": [ + "id", + "include", + "name", + "registered_date", + "slug", + "include_slugs", + "email", + "url" + ], + "type": "string", + "required": false + }, + "slug": { + "description": "Limit result set to users with one or more specific slugs.", + "type": "array", + "items": { "type": "string" }, + "required": false + }, + "roles": { + "description": "Limit result set to users matching at least one specific role provided. Accepts csv list or single role.", + "type": "array", + "items": { "type": "string" }, + "required": false + }, + "capabilities": { + "description": "Limit result set to users matching at least one specific capability provided. Accepts csv list or single capability.", + "type": "array", + "items": { "type": "string" }, + "required": false + }, + "who": { + "description": "Limit result set to users who are considered authors.", + "type": "string", + "enum": ["authors"], + "required": false + }, + "has_published_posts": { + "description": "Limit result set to users who have published posts.", + "type": ["boolean", "array"], + "items": { + "type": "string", + "enum": { + "post": "post", + "page": "page", + "attachment": "attachment", + "nav_menu_item": "nav_menu_item", + "wp_block": "wp_block", + "wp_template": "wp_template", + "wp_template_part": "wp_template_part", + "wp_global_styles": "wp_global_styles", + "wp_navigation": "wp_navigation", + "wp_font_family": "wp_font_family", + "wp_font_face": "wp_font_face" + } + }, + "required": false + }, + "search_columns": { + "default": [], + "description": "Array of column names to be searched.", + "type": "array", + "items": { + "enum": ["email", "name", "id", "username", "slug"], + "type": "string" + }, + "required": false + } + } + }, + { + "methods": ["POST"], + "allow_batch": { "v1": true }, + "args": { + "username": { + "description": "Login name for the user.", + "type": "string", + "required": true + }, + "name": { + "description": "Display name for the user.", + "type": "string", + "required": false + }, + "first_name": { + "description": "First name for the user.", + "type": "string", + "required": false + }, + "last_name": { + "description": "Last name for the user.", + "type": "string", + "required": false + }, + "email": { + "description": "The email address for the user.", + "type": "string", + "format": "email", + "required": true + }, + "url": { + "description": "URL of the user.", + "type": "string", + "format": "uri", + "required": false + }, + "description": { + "description": "Description of the user.", + "type": "string", + "required": false + }, + "locale": { + "description": "Locale for the user.", + "type": "string", + "enum": ["", "en_US"], + "required": false + }, + "nickname": { + "description": "The nickname for the user.", + "type": "string", + "required": false + }, + "slug": { + "description": "An alphanumeric identifier for the user.", + "type": "string", + "required": false + }, + "roles": { + "description": "Roles assigned to the user.", + "type": "array", + "items": { "type": "string" }, + "required": false + }, + "password": { + "description": "Password for the user (never included).", + "type": "string", + "required": true + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": { + "persisted_preferences": { + "type": "object", + "title": "", + "description": "", + "default": [], + "context": ["edit"], + "properties": { + "_modified": { + "description": "The date and time the preferences were updated.", + "type": "string", + "format": "date-time", + "readonly": false + } + }, + "additionalProperties": true + } + }, + "required": false + } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/users" } + ] + } + }, + "\/wp\/v2\/users\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "POST", "PUT", "PATCH", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the user.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["POST", "PUT", "PATCH"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the user.", + "type": "integer", + "required": false + }, + "username": { + "description": "Login name for the user.", + "type": "string", + "required": false + }, + "name": { + "description": "Display name for the user.", + "type": "string", + "required": false + }, + "first_name": { + "description": "First name for the user.", + "type": "string", + "required": false + }, + "last_name": { + "description": "Last name for the user.", + "type": "string", + "required": false + }, + "email": { + "description": "The email address for the user.", + "type": "string", + "format": "email", + "required": false + }, + "url": { + "description": "URL of the user.", + "type": "string", + "format": "uri", + "required": false + }, + "description": { + "description": "Description of the user.", + "type": "string", + "required": false + }, + "locale": { + "description": "Locale for the user.", + "type": "string", + "enum": ["", "en_US"], + "required": false + }, + "nickname": { + "description": "The nickname for the user.", + "type": "string", + "required": false + }, + "slug": { + "description": "An alphanumeric identifier for the user.", + "type": "string", + "required": false + }, + "roles": { + "description": "Roles assigned to the user.", + "type": "array", + "items": { "type": "string" }, + "required": false + }, + "password": { + "description": "Password for the user (never included).", + "type": "string", + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": { + "persisted_preferences": { + "type": "object", + "title": "", + "description": "", + "default": [], + "context": ["edit"], + "properties": { + "_modified": { + "description": "The date and time the preferences were updated.", + "type": "string", + "format": "date-time", + "readonly": false + } + }, + "additionalProperties": true + } + }, + "required": false + } + } + }, + { + "methods": ["DELETE"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the user.", + "type": "integer", + "required": false + }, + "force": { + "type": "boolean", + "default": false, + "description": "Required to be true, as users do not support trashing.", + "required": false + }, + "reassign": { + "type": "integer", + "description": "Reassign the deleted user's posts and links to this user ID.", + "required": true + } + } + } + ] + }, + "\/wp\/v2\/users\/me": { + "namespace": "wp\/v2", + "methods": ["GET", "POST", "PUT", "PATCH", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["POST", "PUT", "PATCH"], + "args": { + "username": { + "description": "Login name for the user.", + "type": "string", + "required": false + }, + "name": { + "description": "Display name for the user.", + "type": "string", + "required": false + }, + "first_name": { + "description": "First name for the user.", + "type": "string", + "required": false + }, + "last_name": { + "description": "Last name for the user.", + "type": "string", + "required": false + }, + "email": { + "description": "The email address for the user.", + "type": "string", + "format": "email", + "required": false + }, + "url": { + "description": "URL of the user.", + "type": "string", + "format": "uri", + "required": false + }, + "description": { + "description": "Description of the user.", + "type": "string", + "required": false + }, + "locale": { + "description": "Locale for the user.", + "type": "string", + "enum": ["", "en_US"], + "required": false + }, + "nickname": { + "description": "The nickname for the user.", + "type": "string", + "required": false + }, + "slug": { + "description": "An alphanumeric identifier for the user.", + "type": "string", + "required": false + }, + "roles": { + "description": "Roles assigned to the user.", + "type": "array", + "items": { "type": "string" }, + "required": false + }, + "password": { + "description": "Password for the user (never included).", + "type": "string", + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": { + "persisted_preferences": { + "type": "object", + "title": "", + "description": "", + "default": [], + "context": ["edit"], + "properties": { + "_modified": { + "description": "The date and time the preferences were updated.", + "type": "string", + "format": "date-time", + "readonly": false + } + }, + "additionalProperties": true + } + }, + "required": false + } + } + }, + { + "methods": ["DELETE"], + "args": { + "force": { + "type": "boolean", + "default": false, + "description": "Required to be true, as users do not support trashing.", + "required": false + }, + "reassign": { + "type": "integer", + "description": "Reassign the deleted user's posts and links to this user ID.", + "required": true + } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/users\/me" } + ] + } + }, + "\/wp\/v2\/users\/(?P(?:[\\d]+|me))\/application-passwords": { + "namespace": "wp\/v2", + "methods": ["GET", "POST", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["POST"], + "args": { + "app_id": { + "description": "A UUID provided by the application to uniquely identify it. It is recommended to use an UUID v5 with the URL or DNS namespace.", + "type": "string", + "oneOf": [ + { "type": "string", "format": "uuid" }, + { "type": "string", "enum": [""] } + ], + "required": false + }, + "name": { + "description": "The name of the application password.", + "type": "string", + "minLength": 1, + "pattern": ".*\\S.*", + "required": true + } + } + }, + { "methods": ["DELETE"], "args": [] } + ] + }, + "\/wp\/v2\/users\/(?P(?:[\\d]+|me))\/application-passwords\/introspect": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/users\/(?P(?:[\\d]+|me))\/application-passwords\/(?P[\\w\\-]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "POST", "PUT", "PATCH", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["POST", "PUT", "PATCH"], + "args": { + "app_id": { + "description": "A UUID provided by the application to uniquely identify it. It is recommended to use an UUID v5 with the URL or DNS namespace.", + "type": "string", + "oneOf": [ + { "type": "string", "format": "uuid" }, + { "type": "string", "enum": [""] } + ], + "required": false + }, + "name": { + "description": "The name of the application password.", + "type": "string", + "minLength": 1, + "pattern": ".*\\S.*", + "required": false + } + } + }, + { "methods": ["DELETE"], "args": [] } + ] + }, + "\/wp\/v2\/comments": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "default": 10, + "minimum": 1, + "maximum": 100, + "required": false + }, + "search": { + "description": "Limit results to those matching a string.", + "type": "string", + "required": false + }, + "after": { + "description": "Limit response to comments published after a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "author": { + "description": "Limit result set to comments assigned to specific user IDs. Requires authorization.", + "type": "array", + "items": { "type": "integer" }, + "required": false + }, + "author_exclude": { + "description": "Ensure result set excludes comments assigned to specific user IDs. Requires authorization.", + "type": "array", + "items": { "type": "integer" }, + "required": false + }, + "author_email": { + "default": null, + "description": "Limit result set to that from a specific author email. Requires authorization.", + "format": "email", + "type": "string", + "required": false + }, + "before": { + "description": "Limit response to comments published before a given ISO8601 compliant date.", + "type": "string", + "format": "date-time", + "required": false + }, + "exclude": { + "description": "Ensure result set excludes specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "include": { + "description": "Limit result set to specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "offset": { + "description": "Offset the result set by a specific number of items.", + "type": "integer", + "required": false + }, + "order": { + "description": "Order sort attribute ascending or descending.", + "type": "string", + "default": "desc", + "enum": ["asc", "desc"], + "required": false + }, + "orderby": { + "description": "Sort collection by comment attribute.", + "type": "string", + "default": "date_gmt", + "enum": [ + "date", + "date_gmt", + "id", + "include", + "post", + "parent", + "type" + ], + "required": false + }, + "parent": { + "default": [], + "description": "Limit result set to comments of specific parent IDs.", + "type": "array", + "items": { "type": "integer" }, + "required": false + }, + "parent_exclude": { + "default": [], + "description": "Ensure result set excludes specific parent IDs.", + "type": "array", + "items": { "type": "integer" }, + "required": false + }, + "post": { + "default": [], + "description": "Limit result set to comments assigned to specific post IDs.", + "type": "array", + "items": { "type": "integer" }, + "required": false + }, + "status": { + "default": "approve", + "description": "Limit result set to comments assigned a specific status. Requires authorization.", + "type": "string", + "required": false + }, + "type": { + "default": "comment", + "description": "Limit result set to comments assigned a specific type. Requires authorization.", + "type": "string", + "required": false + }, + "password": { + "description": "The password for the post if it is password protected.", + "type": "string", + "required": false + } + } + }, + { + "methods": ["POST"], + "args": { + "author": { + "description": "The ID of the user object, if author was a user.", + "type": "integer", + "required": false + }, + "author_email": { + "description": "Email address for the comment author.", + "type": "string", + "format": "email", + "required": false + }, + "author_ip": { + "description": "IP address for the comment author.", + "type": "string", + "format": "ip", + "required": false + }, + "author_name": { + "description": "Display name for the comment author.", + "type": "string", + "required": false + }, + "author_url": { + "description": "URL for the comment author.", + "type": "string", + "format": "uri", + "required": false + }, + "author_user_agent": { + "description": "User agent for the comment author.", + "type": "string", + "required": false + }, + "content": { + "description": "The content for the comment.", + "type": "object", + "properties": { + "raw": { + "description": "Content for the comment, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML content for the comment, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "date": { + "description": "The date the comment was published, in the site's timezone.", + "type": "string", + "format": "date-time", + "required": false + }, + "date_gmt": { + "description": "The date the comment was published, as GMT.", + "type": "string", + "format": "date-time", + "required": false + }, + "parent": { + "default": 0, + "description": "The ID for the parent of the comment.", + "type": "integer", + "required": false + }, + "post": { + "default": 0, + "description": "The ID of the associated post object.", + "type": "integer", + "required": false + }, + "status": { + "description": "State of the comment.", + "type": "string", + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": { + "_wp_note_status": { + "type": "string", + "title": "", + "description": "Note resolution status", + "default": "", + "enum": ["resolved", "reopen"] + } + }, + "required": false + } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/comments" } + ] + } + }, + "\/wp\/v2\/comments\/(?P[\\d]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "POST", "PUT", "PATCH", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "id": { + "description": "Unique identifier for the comment.", + "type": "integer", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "password": { + "description": "The password for the parent post of the comment (if the post is password protected).", + "type": "string", + "required": false + } + } + }, + { + "methods": ["POST", "PUT", "PATCH"], + "args": { + "id": { + "description": "Unique identifier for the comment.", + "type": "integer", + "required": false + }, + "author": { + "description": "The ID of the user object, if author was a user.", + "type": "integer", + "required": false + }, + "author_email": { + "description": "Email address for the comment author.", + "type": "string", + "format": "email", + "required": false + }, + "author_ip": { + "description": "IP address for the comment author.", + "type": "string", + "format": "ip", + "required": false + }, + "author_name": { + "description": "Display name for the comment author.", + "type": "string", + "required": false + }, + "author_url": { + "description": "URL for the comment author.", + "type": "string", + "format": "uri", + "required": false + }, + "author_user_agent": { + "description": "User agent for the comment author.", + "type": "string", + "required": false + }, + "content": { + "description": "The content for the comment.", + "type": "object", + "properties": { + "raw": { + "description": "Content for the comment, as it exists in the database.", + "type": "string", + "context": ["edit"] + }, + "rendered": { + "description": "HTML content for the comment, transformed for display.", + "type": "string", + "context": ["view", "edit", "embed"], + "readonly": true + } + }, + "required": false + }, + "date": { + "description": "The date the comment was published, in the site's timezone.", + "type": "string", + "format": "date-time", + "required": false + }, + "date_gmt": { + "description": "The date the comment was published, as GMT.", + "type": "string", + "format": "date-time", + "required": false + }, + "parent": { + "description": "The ID for the parent of the comment.", + "type": "integer", + "required": false + }, + "post": { + "description": "The ID of the associated post object.", + "type": "integer", + "required": false + }, + "status": { + "description": "State of the comment.", + "type": "string", + "required": false + }, + "meta": { + "description": "Meta fields.", + "type": "object", + "properties": { + "_wp_note_status": { + "type": "string", + "title": "", + "description": "Note resolution status", + "default": "", + "enum": ["resolved", "reopen"] + } + }, + "required": false + } + } + }, + { + "methods": ["DELETE"], + "args": { + "id": { + "description": "Unique identifier for the comment.", + "type": "integer", + "required": false + }, + "force": { + "type": "boolean", + "default": false, + "description": "Whether to bypass Trash and force deletion.", + "required": false + }, + "password": { + "description": "The password for the parent post of the comment (if the post is password protected).", + "type": "string", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/search": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "default": 10, + "minimum": 1, + "maximum": 100, + "required": false + }, + "search": { + "description": "Limit results to those matching a string.", + "type": "string", + "required": false + }, + "type": { + "default": "post", + "description": "Limit results to items of an object type.", + "type": "string", + "enum": ["post", "term", "post-format"], + "required": false + }, + "subtype": { + "default": "any", + "description": "Limit results to items of one or more object subtypes.", + "type": "array", + "items": { + "enum": ["post", "page", "category", "post_tag", "any"], + "type": "string" + }, + "required": false + }, + "exclude": { + "description": "Ensure result set excludes specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + }, + "include": { + "description": "Limit result set to specific IDs.", + "type": "array", + "items": { "type": "integer" }, + "default": [], + "required": false + } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/search" } + ] + } + }, + "\/wp\/v2\/block-renderer\/(?P[a-z0-9-]+\/[a-z0-9-]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET", "POST"], + "args": { + "name": { + "description": "Unique registered name for the block.", + "type": "string", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["edit"], + "default": "view", + "required": false + }, + "attributes": { + "description": "Attributes for the block.", + "type": "object", + "default": [], + "required": false + }, + "post_id": { + "description": "ID of the post context.", + "type": "integer", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/block-types": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "namespace": { + "description": "Block namespace.", + "type": "string", + "required": false + } + } + } + ], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/block-types" + } + ] + } + }, + "\/wp\/v2\/block-types\/(?P[a-zA-Z0-9_-]+)": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "namespace": { + "description": "Block namespace.", + "type": "string", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/block-types\/(?P[a-zA-Z0-9_-]+)\/(?P[a-zA-Z0-9_-]+)": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "name": { + "description": "Block name.", + "type": "string", + "required": false + }, + "namespace": { + "description": "Block namespace.", + "type": "string", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/settings": { + "namespace": "wp\/v2", + "methods": ["GET", "POST", "PUT", "PATCH"], + "endpoints": [ + { "methods": ["GET"], "args": [] }, + { + "methods": ["POST", "PUT", "PATCH"], + "args": { + "title": { + "title": "Title", + "description": "Site title.", + "type": "string", + "required": false + }, + "description": { + "title": "Tagline", + "description": "Site tagline.", + "type": "string", + "required": false + }, + "url": { + "title": "", + "description": "Site URL.", + "type": "string", + "format": "uri", + "required": false + }, + "email": { + "title": "", + "description": "This address is used for admin purposes, like new user notification.", + "type": "string", + "format": "email", + "required": false + }, + "timezone": { + "title": "", + "description": "A city in the same timezone as you.", + "type": "string", + "required": false + }, + "date_format": { + "title": "", + "description": "A date format for all date strings.", + "type": "string", + "required": false + }, + "time_format": { + "title": "", + "description": "A time format for all time strings.", + "type": "string", + "required": false + }, + "start_of_week": { + "title": "", + "description": "A day number of the week that the week should start on.", + "type": "integer", + "required": false + }, + "language": { + "title": "", + "description": "WordPress locale code.", + "type": "string", + "required": false + }, + "use_smilies": { + "title": "", + "description": "Convert emoticons like :-) and :-P to graphics on display.", + "type": "boolean", + "required": false + }, + "default_category": { + "title": "", + "description": "Default post category.", + "type": "integer", + "required": false + }, + "default_post_format": { + "title": "", + "description": "Default post format.", + "type": "string", + "required": false + }, + "posts_per_page": { + "title": "Maximum posts per page", + "description": "Blog pages show at most.", + "type": "integer", + "required": false + }, + "show_on_front": { + "title": "Show on front", + "description": "What to show on the front page", + "type": "string", + "required": false + }, + "page_on_front": { + "title": "Page on front", + "description": "The ID of the page that should be displayed on the front page", + "type": "integer", + "required": false + }, + "page_for_posts": { + "title": "", + "description": "The ID of the page that should display the latest posts", + "type": "integer", + "required": false + }, + "default_ping_status": { + "title": "", + "description": "Allow link notifications from other blogs (pingbacks and trackbacks) on new articles.", + "type": "string", + "enum": ["open", "closed"], + "required": false + }, + "default_comment_status": { + "title": "Allow comments on new posts", + "description": "Allow people to submit comments on new posts.", + "type": "string", + "enum": ["open", "closed"], + "required": false + }, + "site_logo": { + "title": "Logo", + "description": "Site logo.", + "type": "integer", + "required": false + }, + "site_icon": { + "title": "Icon", + "description": "Site icon.", + "type": "integer", + "required": false + } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/settings" } + ] + } + }, + "\/wp\/v2\/themes": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "status": { + "description": "Limit result set to themes assigned one or more statuses.", + "type": "array", + "items": { "enum": ["active", "inactive"], "type": "string" }, + "required": false + } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/themes" } + ] + } + }, + "\/wp\/v2\/themes\/(?P[^\\\/:<>\\*\\?\"\\|]+(?:\\\/[^\\\/:<>\\*\\?\"\\|]+)?)": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "stylesheet": { + "description": "The theme's stylesheet. This uniquely identifies the theme.", + "type": "string", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/plugins": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "search": { + "description": "Limit results to those matching a string.", + "type": "string", + "required": false + }, + "status": { + "description": "Limits results to plugins with the given status.", + "type": "array", + "items": { "type": "string", "enum": ["inactive", "active"] }, + "required": false + } + } + }, + { + "methods": ["POST"], + "args": { + "slug": { + "type": "string", + "description": "WordPress.org plugin directory slug.", + "pattern": "[\\w\\-]+", + "required": true + }, + "status": { + "description": "The plugin activation status.", + "type": "string", + "enum": ["inactive", "active"], + "default": "inactive", + "required": false + } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/plugins" } + ] + } + }, + "\/wp\/v2\/plugins\/(?P[^.\\\/]+(?:\\\/[^.\\\/]+)?)": { + "namespace": "wp\/v2", + "methods": ["GET", "POST", "PUT", "PATCH", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "plugin": { + "type": "string", + "pattern": "[^.\\\/]+(?:\\\/[^.\\\/]+)?", + "required": false + } + } + }, + { + "methods": ["POST", "PUT", "PATCH"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "plugin": { + "type": "string", + "pattern": "[^.\\\/]+(?:\\\/[^.\\\/]+)?", + "required": false + }, + "status": { + "description": "The plugin activation status.", + "type": "string", + "enum": ["inactive", "active"], + "required": false + } + } + }, + { + "methods": ["DELETE"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "plugin": { + "type": "string", + "pattern": "[^.\\\/]+(?:\\\/[^.\\\/]+)?", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/sidebars": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/sidebars" } + ] + } + }, + "\/wp\/v2\/sidebars\/(?P[\\w-]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "POST", "PUT", "PATCH"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "id": { + "description": "The id of a registered sidebar", + "type": "string", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["POST", "PUT", "PATCH"], + "args": { + "widgets": { + "description": "Nested widgets.", + "type": "array", + "items": { "type": ["object", "string"] }, + "required": false + } + } + } + ] + }, + "\/wp\/v2\/widget-types": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + } + ], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/widget-types" + } + ] + } + }, + "\/wp\/v2\/widget-types\/(?P[a-zA-Z0-9_-]+)": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "id": { + "description": "The widget type id.", + "type": "string", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/widget-types\/(?P[a-zA-Z0-9_-]+)\/encode": { + "namespace": "wp\/v2", + "methods": ["POST"], + "endpoints": [ + { + "methods": ["POST"], + "args": { + "id": { + "description": "The widget type id.", + "type": "string", + "required": true + }, + "instance": { + "description": "Current instance settings of the widget.", + "type": "object", + "required": false + }, + "form_data": { + "description": "Serialized widget form data to encode into instance settings.", + "type": "string", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/widget-types\/(?P[a-zA-Z0-9_-]+)\/render": { + "namespace": "wp\/v2", + "methods": ["POST"], + "endpoints": [ + { + "methods": ["POST"], + "args": { + "id": { + "description": "The widget type id.", + "type": "string", + "required": true + }, + "instance": { + "description": "Current instance settings of the widget.", + "type": "object", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/widgets": { + "namespace": "wp\/v2", + "methods": ["GET", "POST"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": true }, + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "sidebar": { + "description": "The sidebar to return widgets for.", + "type": "string", + "required": false + } + } + }, + { + "methods": ["POST"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the widget.", + "type": "string", + "required": false + }, + "id_base": { + "description": "The type of the widget. Corresponds to ID in widget-types endpoint.", + "type": "string", + "required": false + }, + "sidebar": { + "default": "wp_inactive_widgets", + "description": "The sidebar the widget belongs to.", + "type": "string", + "required": true + }, + "instance": { + "description": "Instance settings of the widget, if supported.", + "type": "object", + "properties": { + "encoded": { + "description": "Base64 encoded representation of the instance settings.", + "type": "string", + "context": ["edit"] + }, + "hash": { + "description": "Cryptographic hash of the instance settings.", + "type": "string", + "context": ["edit"] + }, + "raw": { + "description": "Unencoded instance settings, if supported.", + "type": "object", + "context": ["edit"] + } + }, + "required": false + }, + "form_data": { + "description": "URL-encoded form data from the widget admin form. Used to update a widget that does not support instance. Write only.", + "type": "string", + "required": false + } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/widgets" } + ] + } + }, + "\/wp\/v2\/widgets\/(?P[\\w\\-]+)": { + "namespace": "wp\/v2", + "methods": ["GET", "POST", "PUT", "PATCH", "DELETE"], + "endpoints": [ + { + "methods": ["GET"], + "allow_batch": { "v1": true }, + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + }, + { + "methods": ["POST", "PUT", "PATCH"], + "allow_batch": { "v1": true }, + "args": { + "id": { + "description": "Unique identifier for the widget.", + "type": "string", + "required": false + }, + "id_base": { + "description": "The type of the widget. Corresponds to ID in widget-types endpoint.", + "type": "string", + "required": false + }, + "sidebar": { + "description": "The sidebar the widget belongs to.", + "type": "string", + "required": false + }, + "instance": { + "description": "Instance settings of the widget, if supported.", + "type": "object", + "properties": { + "encoded": { + "description": "Base64 encoded representation of the instance settings.", + "type": "string", + "context": ["edit"] + }, + "hash": { + "description": "Cryptographic hash of the instance settings.", + "type": "string", + "context": ["edit"] + }, + "raw": { + "description": "Unencoded instance settings, if supported.", + "type": "object", + "context": ["edit"] + } + }, + "required": false + }, + "form_data": { + "description": "URL-encoded form data from the widget admin form. Used to update a widget that does not support instance. Write only.", + "type": "string", + "required": false + } + } + }, + { + "methods": ["DELETE"], + "allow_batch": { "v1": true }, + "args": { + "force": { + "description": "Whether to force removal of the widget, or move it to the inactive sidebar.", + "type": "boolean", + "required": false + } + } + } + ] + }, + "\/wp\/v2\/block-directory\/search": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "default": 10, + "minimum": 1, + "maximum": 100, + "required": false + }, + "term": { + "description": "Limit result set to blocks matching the search term.", + "type": "string", + "minLength": 1, + "required": true + } + } + } + ], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/block-directory\/search" + } + ] + } + }, + "\/wp\/v2\/pattern-directory\/patterns": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "default": 100, + "minimum": 1, + "maximum": 100, + "required": false + }, + "search": { + "description": "Limit results to those matching a string.", + "type": "string", + "minLength": 1, + "required": false + }, + "category": { + "description": "Limit results to those matching a category ID.", + "type": "integer", + "minimum": 1, + "required": false + }, + "keyword": { + "description": "Limit results to those matching a keyword ID.", + "type": "integer", + "minimum": 1, + "required": false + }, + "slug": { + "description": "Limit results to those matching a pattern (slug).", + "type": "array", + "required": false + }, + "offset": { + "description": "Offset the result set by a specific number of items.", + "type": "integer", + "required": false + }, + "order": { + "description": "Order sort attribute ascending or descending.", + "type": "string", + "default": "desc", + "enum": ["asc", "desc"], + "required": false + }, + "orderby": { + "description": "Sort collection by post attribute.", + "type": "string", + "default": "date", + "enum": [ + "author", + "date", + "id", + "include", + "modified", + "parent", + "relevance", + "slug", + "include_slugs", + "title", + "favorite_count" + ], + "required": false + } + } + } + ], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/pattern-directory\/patterns" + } + ] + } + }, + "\/wp\/v2\/block-patterns\/patterns": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [{ "methods": ["GET"], "args": [] }], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/block-patterns\/patterns" + } + ] + } + }, + "\/wp\/v2\/block-patterns\/categories": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [{ "methods": ["GET"], "args": [] }], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/block-patterns\/categories" + } + ] + } + }, + "\/wp-site-health\/v1": { + "namespace": "wp-site-health\/v1", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "namespace": { + "default": "wp-site-health\/v1", + "required": false + }, + "context": { "default": "view", "required": false } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp-site-health\/v1" } + ] + } + }, + "\/wp-site-health\/v1\/tests\/background-updates": { + "namespace": "wp-site-health\/v1", + "methods": ["GET"], + "endpoints": [{ "methods": ["GET"], "args": [] }], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp-site-health\/v1\/tests\/background-updates" + } + ] + } + }, + "\/wp-site-health\/v1\/tests\/loopback-requests": { + "namespace": "wp-site-health\/v1", + "methods": ["GET"], + "endpoints": [{ "methods": ["GET"], "args": [] }], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp-site-health\/v1\/tests\/loopback-requests" + } + ] + } + }, + "\/wp-site-health\/v1\/tests\/https-status": { + "namespace": "wp-site-health\/v1", + "methods": ["GET"], + "endpoints": [{ "methods": ["GET"], "args": [] }], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp-site-health\/v1\/tests\/https-status" + } + ] + } + }, + "\/wp-site-health\/v1\/tests\/dotorg-communication": { + "namespace": "wp-site-health\/v1", + "methods": ["GET"], + "endpoints": [{ "methods": ["GET"], "args": [] }], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp-site-health\/v1\/tests\/dotorg-communication" + } + ] + } + }, + "\/wp-site-health\/v1\/tests\/authorization-header": { + "namespace": "wp-site-health\/v1", + "methods": ["GET"], + "endpoints": [{ "methods": ["GET"], "args": [] }], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp-site-health\/v1\/tests\/authorization-header" + } + ] + } + }, + "\/wp-site-health\/v1\/directory-sizes": { + "namespace": "wp-site-health\/v1", + "methods": ["GET"], + "endpoints": [{ "methods": ["GET"], "args": [] }], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp-site-health\/v1\/directory-sizes" + } + ] + } + }, + "\/wp-site-health\/v1\/tests\/page-cache": { + "namespace": "wp-site-health\/v1", + "methods": ["GET"], + "endpoints": [{ "methods": ["GET"], "args": [] }], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp-site-health\/v1\/tests\/page-cache" + } + ] + } + }, + "\/wp-block-editor\/v1": { + "namespace": "wp-block-editor\/v1", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "namespace": { + "default": "wp-block-editor\/v1", + "required": false + }, + "context": { "default": "view", "required": false } + } + } + ], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp-block-editor\/v1" + } + ] + } + }, + "\/wp-block-editor\/v1\/url-details": { + "namespace": "wp-block-editor\/v1", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "url": { + "description": "The URL to process.", + "type": "string", + "format": "uri", + "required": true + } + } + } + ], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp-block-editor\/v1\/url-details" + } + ] + } + }, + "\/wp\/v2\/menu-locations": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + } + ], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/menu-locations" + } + ] + } + }, + "\/wp\/v2\/menu-locations\/(?P[\\w-]+)": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "location": { + "description": "An alphanumeric identifier for the menu location.", + "type": "string", + "required": false + }, + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + } + ] + }, + "\/wp-block-editor\/v1\/export": { + "namespace": "wp-block-editor\/v1", + "methods": ["GET"], + "endpoints": [{ "methods": ["GET"], "args": [] }], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp-block-editor\/v1\/export" + } + ] + } + }, + "\/wp-block-editor\/v1\/navigation-fallback": { + "namespace": "wp-block-editor\/v1", + "methods": ["GET"], + "endpoints": [{ "methods": ["GET"], "args": [] }], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp-block-editor\/v1\/navigation-fallback" + } + ] + } + }, + "\/wp\/v2\/font-collections": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "default": 10, + "minimum": 1, + "maximum": 100, + "required": false + } + } + } + ], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp\/v2\/font-collections" + } + ] + } + }, + "\/wp\/v2\/font-collections\/(?P[\\\/\\w-]+)": { + "namespace": "wp\/v2", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + } + } + } + ] + }, + "\/wp-abilities\/v1": { + "namespace": "wp-abilities\/v1", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "namespace": { + "default": "wp-abilities\/v1", + "required": false + }, + "context": { "default": "view", "required": false } + } + } + ], + "_links": { + "self": [ + { "href": "http:\/\/localhost:8282\/wp-json\/wp-abilities\/v1" } + ] + } + }, + "\/wp-abilities\/v1\/categories": { + "namespace": "wp-abilities\/v1", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "default": 50, + "minimum": 1, + "maximum": 100, + "required": false + } + } + } + ], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp-abilities\/v1\/categories" + } + ] + } + }, + "\/wp-abilities\/v1\/categories\/(?P[a-z0-9]+(?:-[a-z0-9]+)*)": { + "namespace": "wp-abilities\/v1", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "slug": { + "description": "Unique identifier for the ability category.", + "type": "string", + "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$", + "required": false + } + } + } + ] + }, + "\/wp-abilities\/v1\/abilities\/(?P[a-zA-Z0-9\\-\\\/]+?)\/run": { + "namespace": "wp-abilities\/v1", + "methods": ["GET", "POST", "PUT", "PATCH", "DELETE"], + "endpoints": [ + { + "methods": ["GET", "POST", "PUT", "PATCH", "DELETE"], + "args": { + "name": { + "description": "Unique identifier for the ability.", + "type": "string", + "pattern": "^[a-zA-Z0-9\\-\\\/]+$", + "required": false + }, + "input": { + "description": "Input parameters for the ability execution.", + "type": [ + "integer", + "number", + "boolean", + "string", + "array", + "object", + "null" + ], + "default": null, + "required": false + } + } + } + ] + }, + "\/wp-abilities\/v1\/abilities": { + "namespace": "wp-abilities\/v1", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "context": { + "description": "Scope under which the request is made; determines fields present in response.", + "type": "string", + "enum": ["view", "embed", "edit"], + "default": "view", + "required": false + }, + "page": { + "description": "Current page of the collection.", + "type": "integer", + "default": 1, + "minimum": 1, + "required": false + }, + "per_page": { + "description": "Maximum number of items to be returned in result set.", + "type": "integer", + "default": 50, + "minimum": 1, + "maximum": 100, + "required": false + }, + "category": { + "description": "Limit results to abilities in specific ability category.", + "type": "string", + "required": false + } + } + } + ], + "_links": { + "self": [ + { + "href": "http:\/\/localhost:8282\/wp-json\/wp-abilities\/v1\/abilities" + } + ] + } + }, + "\/wp-abilities\/v1\/abilities\/(?P[a-zA-Z0-9\\-\\\/]+)": { + "namespace": "wp-abilities\/v1", + "methods": ["GET"], + "endpoints": [ + { + "methods": ["GET"], + "args": { + "name": { + "description": "Unique identifier for the ability.", + "type": "string", + "pattern": "^[a-zA-Z0-9\\-\\\/]+$", + "required": false + } + } + } + ] + } + }, + "site_logo": 0, + "site_icon": 0, + "site_icon_url": "", + "_links": { + "help": [{ "href": "https:\/\/developer.wordpress.org\/rest-api\/" }] + } + }, + "headers": { + "Content-Type": "application/json; charset=UTF-8" + }, + "transformers": ["response-template"] + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/self-hosted/wp-json-settings.json b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/wp-json-settings.json new file mode 100644 index 000000000000..8c0b9d653497 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/wp-json-settings.json @@ -0,0 +1,34 @@ +{ + "request": { + "method": "GET", + "urlPath": "/wp-json/wp/v2/settings" + }, + "response": { + "status": 200, + "jsonBody": { + "title": "wp-local-site", + "description": "", + "url": "http:\/\/localhost:8282", + "email": "wordpress@example.com", + "timezone": "", + "date_format": "F j, Y", + "time_format": "g:i a", + "start_of_week": 1, + "language": "en_US", + "use_smilies": true, + "default_category": 1, + "default_post_format": "0", + "posts_per_page": 10, + "show_on_front": "posts", + "page_on_front": 0, + "page_for_posts": 0, + "default_ping_status": "open", + "default_comment_status": "open", + "site_logo": null, + "site_icon": 0 + }, + "headers": { + "Content-Type": "application/json; charset=UTF-8" + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/self-hosted/wp-json-users-me.json b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/wp-json-users-me.json new file mode 100644 index 000000000000..7bd072ac98f5 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/wp-json-users-me.json @@ -0,0 +1,40 @@ +{ + "request": { + "method": "GET", + "urlPath": "/wp-json/wp/v2/users/me" + }, + "response": { + "status": 200, + "jsonBody": { + "id": 1, + "username": "e2eflowtestingmobile", + "name": "e2eflowtestingmobile", + "first_name": "", + "last_name": "", + "email": "e2e@example.com", + "url": "", + "description": "", + "link": "{{request.requestLine.baseUrl}}/?author=1", + "locale": "en_US", + "nickname": "e2eflowtestingmobile", + "slug": "e2eflowtestingmobile", + "roles": ["administrator"], + "registered_date": "2020-01-01T00:00:00+00:00", + "capabilities": { + "administrator": true + }, + "extra_capabilities": { + "administrator": true + }, + "avatar_urls": { + "24": "https://secure.gravatar.com/avatar/?s=24&d=mm&r=g", + "48": "https://secure.gravatar.com/avatar/?s=48&d=mm&r=g", + "96": "https://secure.gravatar.com/avatar/?s=96&d=mm&r=g" + } + }, + "headers": { + "Content-Type": "application/json; charset=UTF-8" + }, + "transformers": ["response-template"] + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-system.listMethods.json b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-system.listMethods.json new file mode 100644 index 000000000000..f80802db4e7d --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-system.listMethods.json @@ -0,0 +1,19 @@ +{ + "request": { + "url": "/xmlrpc.php", + "method": "POST", + "bodyPatterns": [ + { + "matches": ".*system.listMethods.*" + } + ] + }, + "response": { + "status": 200, + "body": "\n\n \n \n \n \n system.multicall\n system.listMethods\n system.getCapabilities\n demo.addTwoNumbers\n demo.sayHello\n pingback.extensions.getPingbacks\n pingback.ping\n mt.publishPost\n mt.getTrackbackPings\n mt.supportedTextFilters\n mt.supportedMethods\n mt.setPostCategories\n mt.getPostCategories\n mt.getRecentPostTitles\n mt.getCategoryList\n metaWeblog.getUsersBlogs\n metaWeblog.deletePost\n metaWeblog.newMediaObject\n metaWeblog.getCategories\n metaWeblog.getRecentPosts\n metaWeblog.getPost\n metaWeblog.editPost\n metaWeblog.newPost\n blogger.deletePost\n blogger.editPost\n blogger.newPost\n blogger.getRecentPosts\n blogger.getPost\n blogger.getUserInfo\n blogger.getUsersBlogs\n wp.restoreRevision\n wp.getRevisions\n wp.getPostTypes\n wp.getPostType\n wp.getPostFormats\n wp.getMediaLibrary\n wp.getMediaItem\n wp.getCommentStatusList\n wp.newComment\n wp.editComment\n wp.deleteComment\n wp.getComments\n wp.getComment\n wp.setOptions\n wp.getOptions\n wp.getPageTemplates\n wp.getPageStatusList\n wp.getPostStatusList\n wp.getCommentCount\n wp.deleteFile\n wp.uploadFile\n wp.suggestCategories\n wp.deleteCategory\n wp.newCategory\n wp.getTags\n wp.getCategories\n wp.getAuthors\n wp.getPageList\n wp.editPage\n wp.deletePage\n wp.newPage\n wp.getPages\n wp.getPage\n wp.editProfile\n wp.getProfile\n wp.getUsers\n wp.getUser\n wp.getTaxonomies\n wp.getTaxonomy\n wp.getTerms\n wp.getTerm\n wp.deleteTerm\n wp.editTerm\n wp.newTerm\n wp.getPosts\n wp.getPost\n wp.deletePost\n wp.editPost\n wp.newPost\n wp.getUsersBlogs\n\n \n \n \n\n", + "headers": { + "Content-Type": "text/xml; charset=UTF-8", + "Connection": "keep-alive" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-wp.getComments.json b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-wp.getComments.json new file mode 100644 index 000000000000..f5da5a49ec76 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-wp.getComments.json @@ -0,0 +1,22 @@ +{ + "request": { + "url": "/xmlrpc.php", + "method": "POST", + "bodyPatterns": [ + { + "matches": ".*wp.getComments.*" + }, + { + "matches": ".*e2eflowtestingmobile.*" + } + ] + }, + "response": { + "status": 200, + "body": "\n\n \n \n \n \n \n date_created_gmt20190215T11:23:34\n user_id0\n comment_id1\n parent0\n statusapprove\n contentHi, this is a comment.\nTo get started with moderating, editing, and deleting comments, please visit the Comments screen in the dashboard.\nCommenter avatars come from <a href="https://gravatar.com">Gravatar</a>.\n link{{request.requestLine.baseUrl}}/2019/02/hello-world/#comment-1\n post_id1\n post_titleHello world!\n authorA WordPress Commenter\n author_urlhttps://wordpress.org/\n author_emailwapuu@wordpress.example\n author_ip\n type\n\n\n \n \n \n\n", + "headers": { + "Content-Type": "text/xml; charset=UTF-8", + "Connection": "keep-alive" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-wp.getOptions.json b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-wp.getOptions.json new file mode 100644 index 000000000000..ce21c076148c --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-wp.getOptions.json @@ -0,0 +1,22 @@ +{ + "request": { + "url": "/xmlrpc.php", + "method": "POST", + "bodyPatterns": [ + { + "matches": ".*wp.getOptions.*" + }, + { + "matches": ".*e2eflowtestingmobile.*" + } + ] + }, + "response": { + "status": 200, + "body": "\n\n \n \n \n \n software_version\n descSoftware Version\n readonly1\n value5.1.1\n\n post_thumbnail\n descPost Thumbnail\n readonly1\n value1\n\n default_comment_status\n descAllow people to post comments on new articles\n readonly0\n valueopen\n\n jetpack_client_id\n descThe Client ID/WP.com Blog ID of this site\n readonly1\n value0\n\n home_url\n descSite Address (URL)\n readonly1\n value{{request.requestLine.baseUrl}}\n\n admin_url\n descThe URL to the admin area\n readonly1\n value{{request.requestLine.baseUrl}}/wp-admin/\n\n login_url\n descLogin Address (URL)\n readonly1\n value{{request.requestLine.baseUrl}}/wp-login.php\n\n blog_title\n descSite Title\n readonly0\n valuee2eflowtestingmobile.mystagingwebsite.com at Pressable\n\n time_zone\n descTime Zone\n readonly0\n value0\n\n\n \n \n \n\n", + "headers": { + "Content-Type": "text/xml; charset=UTF-8", + "Connection": "keep-alive" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-wp.getPostFormats.json b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-wp.getPostFormats.json new file mode 100644 index 000000000000..1e966d1475ba --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-wp.getPostFormats.json @@ -0,0 +1,22 @@ +{ + "request": { + "url": "/xmlrpc.php", + "method": "POST", + "bodyPatterns": [ + { + "matches": ".*wp.getPostFormats.*" + }, + { + "matches": ".*e2eflowtestingmobile.*" + } + ] + }, + "response": { + "status": 200, + "body": "\n\n \n \n \n \n standardStandard\n asideAside\n chatChat\n galleryGallery\n linkLink\n imageImage\n quoteQuote\n statusStatus\n videoVideo\n audioAudio\n\n \n \n \n\n", + "headers": { + "Content-Type": "text/xml; charset=UTF-8", + "Connection": "keep-alive" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-wp.getProfile.json b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-wp.getProfile.json new file mode 100644 index 000000000000..334adf0df6ed --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-wp.getProfile.json @@ -0,0 +1,22 @@ +{ + "request": { + "url": "/xmlrpc.php", + "method": "POST", + "bodyPatterns": [ + { + "matches": ".*wp.getProfile.*" + }, + { + "matches": ".*e2eflowtestingmobile.*" + } + ] + }, + "response": { + "status": 200, + "body": "\n\n \n \n \n \n user_id1\n usernamee2eflowtestingmobile\n first_name\n last_name\n registered20190215T11:23:34\n bio\n emaile2eflowtestingmobile@example.com\n nicknamee2eflowtestingmobile\n nicenamee2eflowtestingmobile\n url\n display_namee2eflowtestingmobile\n roles\n administrator\n\n\n \n \n \n\n", + "headers": { + "Content-Type": "text/xml; charset=UTF-8", + "Connection": "keep-alive" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-wp.getTerms.json b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-wp.getTerms.json new file mode 100644 index 000000000000..26eb658780da --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-wp.getTerms.json @@ -0,0 +1,22 @@ +{ + "request": { + "url": "/xmlrpc.php", + "method": "POST", + "bodyPatterns": [ + { + "matches": ".*wp.getTerms.*" + }, + { + "matches": ".*e2eflowtestingmobile.*" + } + ] + }, + "response": { + "status": 200, + "body": "\n\n \n \n \n \n \n term_id1\n nameUncategorized\n sluguncategorized\n term_group0\n term_taxonomy_id1\n taxonomycategory\n description\n parent0\n count1\n filterraw\n custom_fields\n\n\n\n \n \n \n\n", + "headers": { + "Content-Type": "text/xml; charset=UTF-8", + "Connection": "keep-alive" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-wp.getUsers.json b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-wp.getUsers.json new file mode 100644 index 000000000000..dfba9f1c9f05 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-wp.getUsers.json @@ -0,0 +1,22 @@ +{ + "request": { + "url": "/xmlrpc.php", + "method": "POST", + "bodyPatterns": [ + { + "matches": ".*wp.getUsers.*" + }, + { + "matches": ".*e2eflowtestingmobile.*" + } + ] + }, + "response": { + "status": 200, + "body": "\n\n \n \n \n \n\n \n \n \n\n", + "headers": { + "Content-Type": "text/xml; charset=UTF-8", + "Connection": "keep-alive" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-wp.getUsersBlogs.json b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-wp.getUsersBlogs.json new file mode 100644 index 000000000000..32f57c684ad4 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/self-hosted/xmlrpcphp-wp.getUsersBlogs.json @@ -0,0 +1,22 @@ +{ + "request": { + "url": "/xmlrpc.php", + "method": "POST", + "bodyPatterns": [ + { + "matches": ".*wp.getUsersBlogs.*" + }, + { + "matches": ".*e2eflowtestingmobile.*" + } + ] + }, + "response": { + "status": 200, + "body": "\n\n \n \n \n \n \n isAdmin1\n url{{request.requestLine.baseUrl}}/\n blogid1\n blogNamee2eflowtestingmobile.mystagingwebsite.com at Pressable\n xmlrpc{{request.requestLine.baseUrl}}/xmlrpc.php\n\n\n \n \n \n\n", + "headers": { + "Content-Type": "text/xml; charset=UTF-8", + "Connection": "keep-alive" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/activity/wpcom_v2_site_activity.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/activity/wpcom_v2_site_activity.json new file mode 100644 index 000000000000..7169d88501b3 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/activity/wpcom_v2_site_activity.json @@ -0,0 +1,124 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/wpcom/v2/sites/.*/activity(\\?|/|$).*" + }, + "response": { + "status": 200, + "jsonBody": { + + "@context": "https://www.w3.org/ns/activitystreams", + "summary": "Activity log", + "type": "OrderedCollection", + "totalItems": 3, + "page": 1, + "totalPages": 1, + "itemsPerPage": 20, + "id": "https://public-api.wordpress.com/wpcom/v2/sites/106707880/activity?number=20&page=1", + "oldestItemTs": 1654043700542, + "first": "https://public-api.wordpress.com/wpcom/v2/sites/106707880/activity?number=20&page=1", + "last": "https://public-api.wordpress.com/wpcom/v2/sites/106707880/activity?number=20&page=1", + "current": { + "type": "OrderedCollectionPage", + "id": "https://public-api.wordpress.com/wpcom/v2/sites/106707880/activity?number=20&page=1", + "prev": "https://public-api.wordpress.com/wpcom/v2/sites/106707880/activity?number=20&page=0", + "totalItems": 3, + "orderedItems": [ + { + "summary": "Setting changed", + "content": { + "text": "Enabled Jetpack Social for automatic social sharing" + }, + "name": "setting__changed_jetpack_module_publicize", + "actor": { + "type": "Person", + "name": "demo", + "external_user_id": 1, + "wpcom_user_id": 195654479, + "icon": { + "type": "Image", + "url": "https://secure.gravatar.com/avatar/eea057209f5e29d6ca4103bc165d645b?s=96&d=mm&r=g", + "width": 96, + "height": 96 + }, + "role": "administrator" + }, + "type": "Announce", + "published": "2023-04-04T10:33:09.300+00:00", + "generator": { + "jetpack_version": 0, + "blog_id": 106707880 + }, + "is_rewindable": false, + "rewind_id": "1680604388.4567", + "gridicon": "cog", + "status": null, + "activity_id": "6gjTS4cBfytF4jpL6MFT", + "is_discarded": false + }, + { + "summary": "Site owner connected", + "content": { + "text": "The Jetpack connection is now complete. Welcome!" + }, + "name": "jetpack__site_owner_connected", + "actor": { + "type": "Person", + "name": "Kevin Jorge", + "external_user_id": 1, + "wpcom_user_id": 11111111, + "icon": { + "type": "Image", + "url": "https://secure.gravatar.com/avatar/eea057209f5e29d6ca4103bc165d645b?s=96&d=mm&r=g", + "width": 96, + "height": 96 + }, + "role": "administrator" + }, + "type": "Announce", + "published": "2023-04-04T10:33:05.614+00:00", + "generator": { + "jetpack_version": 0, + "blog_id": 106707880 + }, + "is_rewindable": false, + "rewind_id": "1680604385.6144", + "gridicon": "plans", + "status": "success", + "activity_id": "avfTS4cB98Gh8vy65ZU4", + "is_discarded": false + }, + { + "summary": "Site connected", + "content": { + "text": "This site is connected to Jetpack." + }, + "name": "jetpack__site_connected", + "actor": { + "type": "Application", + "name": "Jetpack" + }, + "type": "Announce", + "published": "2023-04-04T10:32:54.647+00:00", + "generator": { + "jetpack_version": 0, + "blog_id": 106707880 + }, + "is_rewindable": false, + "rewind_id": "1680604374.6466", + "gridicon": "plans", + "status": "success", + "activity_id": "XvfTS4cB98Gh8vy6sI2-", + "is_discarded": false + } + ] + } + + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/auth-options.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/auth-options.json new file mode 100644 index 000000000000..2a6fea975cb3 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/auth-options.json @@ -0,0 +1,17 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/rest/v1.1/users/.*/auth-options.*" + }, + "response": { + "status": 200, + "jsonBody": { + "passwordless": false, + "email_verified": true + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/is-available_email_available_json.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/is-available_email_available_json.json new file mode 100644 index 000000000000..fc4787daec07 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/is-available_email_available_json.json @@ -0,0 +1,24 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/is-available/email(/)?($|\\?.*)", + "queryParameters": { + "format": { + "equalTo": "json" + }, + "q": { + "matches": "^e2eflowsignuptestingmobile@example.com$" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "available": true + }, + "headers": { + "Content-Type": "text/javascript", + "Connection": "keep-alive" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/is-available_email_available_text.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/is-available_email_available_text.json new file mode 100644 index 000000000000..3502be1eb0b3 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/is-available_email_available_text.json @@ -0,0 +1,22 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/is-available/email(/)?($|\\?.*)", + "queryParameters": { + "format": { + "absent": true + }, + "q": { + "matches": "^e2eflowsignuptestingmobile@example.com$" + } + } + }, + "response": { + "status": 200, + "body": "true", + "headers": { + "Content-Type": "text/javascript", + "Connection": "keep-alive" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/is-available_email_not_available.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/is-available_email_not_available.json new file mode 100644 index 000000000000..af6a5e156453 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/is-available_email_not_available.json @@ -0,0 +1,23 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/is-available/email(/)?($|\\?.*)", + "queryParameters": { + "q": { + "matches": "^(?!e2eflowsignuptestingmobile@example.com).*$" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "error": "taken", + "message": "Choose a different email address. This one is not available.", + "status": "error" + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/magic_link.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/magic_link.json new file mode 100644 index 000000000000..07a364843a58 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/magic_link.json @@ -0,0 +1,15 @@ +{ + "scenarioName": "auth", + "requiredScenarioState": "logged-in", + "request": { + "method": "GET", + "urlPath": "/magic-link" + }, + "response": { + "status": 302, + "headers": { + "Content-Type": "text/html;charset=utf-8", + "Location": "{{request.query.scheme}}://magic-login?token=valid_token" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/oauth2_token-error.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/oauth2_token-error.json new file mode 100644 index 000000000000..7a5cec70bce9 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/oauth2_token-error.json @@ -0,0 +1,28 @@ +{ + "request": { + "method": "POST", + "urlPath": "/oauth2/token", + "bodyPatterns": [ + { + "matches": ".*username=[^&]+.*" + }, + { + "matches": ".*password=invalidPswd(&.*|$)" + }, + { + "matches": ".*client_secret=.*" + } + ] + }, + "response": { + "status": 400, + "jsonBody": { + "error": "invalid_request", + "error_description": "Incorrect username or password." + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/oauth2_token.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/oauth2_token.json new file mode 100644 index 000000000000..d97a12bd57e1 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/oauth2_token.json @@ -0,0 +1,31 @@ +{ + "request": { + "method": "POST", + "urlPath": "/oauth2/token", + "bodyPatterns": [ + { + "matches": ".*username=[^&]+.*" + }, + { + "matches": ".*password=((?!invalidPswd)[^&])+(&.*|$)" + }, + { + "matches": ".*client_secret=.*" + } + ] + }, + "response": { + "status": 200, + "jsonBody": { + "access_token": "valid_token", + "token_type": "bearer", + "blog_id": "0", + "blog_url": null, + "scope": "global" + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/rest_connect_site_info.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/rest_connect_site_info.json new file mode 100644 index 000000000000..65294872d2a3 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/rest_connect_site_info.json @@ -0,0 +1,29 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/connect/site-info", + "queryParameters": { + "url": { + "matches": "^http(s)?://(.*wordpress.com).*" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "urlAfterRedirects": "{{request.query.url}}", + "exists": true, + "isWordPress": true, + "hasJetpack": true, + "jetpackVersion": "7.3.1", + "isJetpackActive": true, + "isJetpackConnected": false, + "isWordPressDotCom": true + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/rest_v11_auth_send-signup-email.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/rest_v11_auth_send-signup-email.json new file mode 100644 index 000000000000..1b0ac2b926b6 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/rest_v11_auth_send-signup-email.json @@ -0,0 +1,19 @@ +{ + "scenarioName": "auth", + "newScenarioState": "signed-up", + "request": { + "urlPattern": "/rest/v1.1/auth/send-signup-email.*", + "method": "POST" + }, + "response": { + "status": 200, + "jsonBody": { + "success": true + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/rest_v13_auth_send-login-email.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/rest_v13_auth_send-login-email.json new file mode 100644 index 000000000000..89c6a6a299d0 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/auth/rest_v13_auth_send-login-email.json @@ -0,0 +1,20 @@ +{ + "scenarioName": "auth", + "newScenarioState": "logged-in", + "request": { + "urlPattern": "/rest/v1.[1-3]/auth/send-login-email.*", + "method": "POST" + }, + "response": { + "status": 200, + "jsonBody": { + "success": true, + "new_user": false + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/blocks/blocks.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/blocks/blocks.json new file mode 100644 index 000000000000..2f6090f174ae --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/blocks/blocks.json @@ -0,0 +1,17 @@ +{ + "request": { + "urlPattern": "/wp/v2/sites/.*/blocks.*", + "method": "GET" + }, + "response": { + "status": 200, + "jsonBody": [ + + ], + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/106707880 - Tri-County Real Estate/sites_106707880_dashboard.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/106707880 - Tri-County Real Estate/sites_106707880_dashboard.json new file mode 100644 index 000000000000..4e92085741ec --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/106707880 - Tri-County Real Estate/sites_106707880_dashboard.json @@ -0,0 +1,172 @@ +{ + "request": { + "method": "GET", + "urlPath": "/wpcom/v2/sites/106707880/dashboard/cards-data/", + "queryParameters": { + "_locale": { + "matches": "(.*)" + }, + "cards": { + "equalTo": "todays_stats,posts,pages,activity" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "todays_stats": { + "views": 56, + "visitors": 44, + "likes": 19, + "comments": 0 + }, + "posts": { + "has_published": true, + "draft": [ + { + "id": 52, + "title": "Draft", + "content": "A draft post • • • • • •", + "status": "draft", + "modified": "2023-06-18 10:33:38", + "date": "2023-06-18 10:33:38" + } + ], + "scheduled": [] + }, + "pages": [ + { + "id": 51, + "title": "Blog", + "content": "Introduce yourself and your blog My Latest Posts • • • • • •", + "status": "publish", + "modified": "2023-05-18 10:33:38", + "date": "2023-05-18 10:33:38" + }, + { + "id": 30, + "title": "Cart", + "content": "", + "status": "publish", + "modified": "2023-02-03 09:46:32", + "date": "2023-02-03 09:46:32" + }, + { + "id": 31, + "title": "Checkout", + "content": "", + "status": "publish", + "modified": "2023-02-03 09:46:32", + "date": "2023-02-03 09:46:32" + } + ], + "activity": { + "@context": "https://www.w3.org/ns/activitystreams", + "summary": "Activity log", + "type": "OrderedCollection", + "totalItems": 3, + "page": 1, + "totalPages": 1, + "itemsPerPage": 5, + "id": "https://public-api.wordpress.com/wpcom/v2/sites/106707880/activity", + "oldestItemTs": 1654043700542, + "first": "https://public-api.wordpress.com/wpcom/v2/sites/106707880/activity?page=1", + "last": "https://public-api.wordpress.com/wpcom/v2/sites/106707880/activity?page=1", + "current": { + "type": "OrderedCollectionPage", + "id": "https://public-api.wordpress.com/wpcom/v2/sites/106707880/activity", + "totalItems": 1, + "orderedItems": [ + { + "summary": "Setting changed", + "content": { + "text": "Enabled Jetpack Social for automatic social sharing" + }, + "name": "setting__changed_jetpack_module_publicize", + "actor": { + "type": "Person", + "name": "demo", + "external_user_id": 1, + "wpcom_user_id": 195654479, + "icon": { + "type": "Image", + "url": "https://secure.gravatar.com/avatar/eea057209f5e29d6ca4103bc165d645b?s=96&d=mm&r=g", + "width": 96, + "height": 96 + }, + "role": "administrator" + }, + "type": "Announce", + "published": "2023-04-04T10:33:09.300+00:00", + "generator": { + "jetpack_version": 0, + "blog_id": 106707880 + }, + "is_rewindable": false, + "rewind_id": "1680604388.4567", + "gridicon": "cog", + "status": null, + "activity_id": "6gjTS4cBfytF4jpL6MFT", + "is_discarded": false + }, + { + "summary": "Site owner connected", + "content": { + "text": "The Jetpack connection is now complete. Welcome!" + }, + "name": "jetpack__site_owner_connected", + "actor": { + "type": "Person", + "name": "Kevin Jorge", + "external_user_id": 1, + "wpcom_user_id": 11111111, + "icon": { + "type": "Image", + "url": "https://secure.gravatar.com/avatar/eea057209f5e29d6ca4103bc165d645b?s=96&d=mm&r=g", + "width": 96, + "height": 96 + }, + "role": "administrator" + }, + "type": "Announce", + "published": "2023-04-04T10:33:05.614+00:00", + "generator": { + "jetpack_version": 0, + "blog_id": 106707880 + }, + "is_rewindable": false, + "rewind_id": "1680604385.6144", + "gridicon": "plans", + "status": "success", + "activity_id": "avfTS4cB98Gh8vy65ZU4", + "is_discarded": false + }, + { + "summary": "Site connected", + "content": { + "text": "This site is connected to Jetpack." + }, + "name": "jetpack__site_connected", + "actor": { + "type": "Application", + "name": "Jetpack" + }, + "type": "Announce", + "published": "2023-04-04T10:32:54.647+00:00", + "generator": { + "jetpack_version": 0, + "blog_id": 106707880 + }, + "is_rewindable": false, + "rewind_id": "1680604374.6466", + "gridicon": "plans", + "status": "success", + "activity_id": "XvfTS4cB98Gh8vy6sI2-", + "is_discarded": false + } + ] + } + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/106707880 - Tri-County Real Estate/sites_106707880_domains.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/106707880 - Tri-County Real Estate/sites_106707880_domains.json new file mode 100644 index 000000000000..290391b9a86e --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/106707880 - Tri-County Real Estate/sites_106707880_domains.json @@ -0,0 +1,85 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/106707880/domains", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "domains": [ + { + "primary_domain": true, + "blog_id": 106707880, + "subscription_id": null, + "can_manage_dns_records": false, + "can_manage_name_servers": false, + "can_update_contact_info": false, + "cannot_manage_dns_records_reason": null, + "cannot_manage_name_servers_reason": null, + "cannot_update_contact_info_reason": null, + "connection_mode": null, + "current_user_can_add_email": false, + "current_user_can_create_site_from_domain_only": true, + "current_user_cannot_add_email_reason": null, + "current_user_can_manage": true, + "current_user_is_owner": null, + "can_set_as_primary": true, + "domain": "tricountyrealestate.wordpress.com", + "domain_notice_states": null, + "supports_domain_connect": null, + "email_forwards_count": 0, + "expiry": false, + "expiry_soon": false, + "expired": false, + "auto_renewing": false, + "pending_registration": false, + "pending_registration_time": "", + "has_registration": false, + "has_email_forward_dns_records": null, + "points_to_wpcom": true, + "privacy_available": false, + "private_domain": false, + "partner_domain": false, + "wpcom_domain": true, + "has_zone": false, + "is_renewable": false, + "is_redeemable": false, + "is_subdomain": true, + "is_eligible_for_inbound_transfer": false, + "is_locked": false, + "is_wpcom_staging_domain": false, + "transfer_away_eligible_at": null, + "type": "wpcom", + "registration_date": "", + "auto_renewal_date": "", + "google_apps_subscription": null, + "titan_mail_subscription": null, + "pending_whois_update": false, + "tld_maintenance_end_time": null, + "ssl_status": null, + "supports_gdpr_consent_management": false, + "supports_transfer_approval": false, + "domain_registration_agreement_url": "", + "contact_info_disclosure_available": false, + "contact_info_disclosed": false, + "renewable_until": null, + "redeemable_until": null, + "bundled_plan_subscription_id": null, + "product_slug": null, + "owner": "", + "pending_renewal": false, + "aftermarket_auction": false, + "aftermarket_auction_start": null, + "aftermarket_auction_end": null, + "nominet_pending_contact_verification_request": false, + "nominet_domain_suspended": false + } + ] + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/181851495 - Four Paws Dog Grooming/sites_181851495_dashboard.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/181851495 - Four Paws Dog Grooming/sites_181851495_dashboard.json new file mode 100644 index 000000000000..1cf0509bd468 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/181851495 - Four Paws Dog Grooming/sites_181851495_dashboard.json @@ -0,0 +1,66 @@ +{ + "request": { + "method": "GET", + "urlPath": "/wpcom/v2/sites/181851495/dashboard/cards-data/", + "queryParameters": { + "_locale": { + "matches": "(.*)" + }, + "cards": { + "equalTo": "todays_stats,posts,pages,activity" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "todays_stats": { + "views": 1000, + "visitors": 750, + "likes": 500, + "comments": 250 + }, + "posts": { + "has_published": true, + "draft": [], + "scheduled": [] + }, + "pages": [ + { + "id": 3, + "title": "Style Guide", + "content": "That last is no more than a foot high, and about seven paces across, a mere flat top of a grey rock which smokes like a hot cinder after a shower, and where no man would care to venture a naked sole before sunset. On the Little Isabel an old ragged palm, with a thick […]", + "status": "publish", + "modified": "{{#assign 'customformat'}}yyyy-MM-dd'T'HH:mm:ss{{/assign}}{{now offset='-2 hours' format=customformat}}", + "date": "{{now offset='-2 hours' format=customformat}}" + }, + { + "id": 2, + "title": "Image Alignments", + "content": "This page is filled with sample content illustrating what various image types look like. Right-aligned Medium Perhaps the very atmospheric conditions which had kept away the merchant fleets of bygone ages induced the O.S.N. Company to violate the sanctuary of peace sheltering the calm existence of Sulaco. The variable airs sporting lightly with the vast […]", + "status": "publish", + "modified": "{{now offset='-3 hours' format=customformat}}", + "date": "{{now offset='-3 hours' format=customformat}}" + }, + { + "id": 18, + "title": "About Twenty Sixteen", + "content": "Twenty Sixteen is a modernized take on an ever-popular WordPress layout — the horizontal masthead with an optional right sidebar that works perfectly for blogs and websites. It has custom color options with beautiful default color schemes, a harmonious fluid grid using a mobile-first approach, and impeccable polish in every detail. Twenty Sixteen will make […]", + "status": "publish", + "modified": "{{now offset='-5 hours' format=customformat}}", + "date": "{{now offset='-5 hours' format=customformat}}" + } + ], + "activity": { + "@context": "https://www.w3.org/ns/activitystreams", + "summary": "Activity log", + "type": "OrderedCollection", + "totalItems": 0, + "page": 1, + "totalPages": 0, + "itemsPerPage": 5, + "id": "https://public-api.wordpress.com/wpcom/v2/sites/181851495/activity" + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/181851495 - Four Paws Dog Grooming/sites_181851495_domains.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/181851495 - Four Paws Dog Grooming/sites_181851495_domains.json new file mode 100644 index 000000000000..40bd632730d5 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/181851495 - Four Paws Dog Grooming/sites_181851495_domains.json @@ -0,0 +1,86 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/181851495/domains", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "domains": [ + { + "primary_domain": true, + "blog_id": 181851495, + "subscription_id": null, + "can_manage_dns_records": false, + "can_manage_name_servers": false, + "can_update_contact_info": false, + "cannot_manage_dns_records_reason": null, + "cannot_manage_name_servers_reason": null, + "cannot_update_contact_info_reason": null, + "connection_mode": null, + "current_user_can_add_email": false, + "current_user_can_create_site_from_domain_only": true, + "current_user_cannot_add_email_reason": null, + "current_user_can_manage": true, + "current_user_is_owner": null, + "can_set_as_primary": true, + "domain": "fourpawsdoggrooming.wordpress.com", + "domain_notice_states": null, + "supports_domain_connect": null, + "email_forwards_count": 0, + "expiry": false, + "expiry_soon": false, + "expired": false, + "auto_renewing": false, + "pending_registration": false, + "pending_registration_time": "", + "has_registration": false, + "has_email_forward_dns_records": null, + "points_to_wpcom": true, + "privacy_available": false, + "private_domain": false, + "partner_domain": false, + "wpcom_domain": true, + "has_zone": false, + "is_renewable": false, + "is_redeemable": false, + "is_subdomain": true, + "is_eligible_for_inbound_transfer": false, + "is_locked": false, + "is_wpcom_staging_domain": false, + "transfer_away_eligible_at": null, + "type": "wpcom", + "registration_date": "", + "auto_renewal_date": "", + "google_apps_subscription": null, + "titan_mail_subscription": null, + "pending_whois_update": false, + "tld_maintenance_end_time": null, + "ssl_status": null, + "supports_gdpr_consent_management": false, + "supports_transfer_approval": false, + "domain_registration_agreement_url": "", + "contact_info_disclosure_available": false, + "contact_info_disclosed": false, + "renewable_until": null, + "redeemable_until": null, + "bundled_plan_subscription_id": null, + "product_slug": null, + "owner": "", + "pending_renewal": false, + "aftermarket_auction": false, + "aftermarket_auction_start": null, + "aftermarket_auction_end": null, + "nominet_pending_contact_verification_request": false, + "nominet_domain_suspended": false, + "transfer_status": null + } + ] + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/181977606 - Weekend Bakes/sites_181977606_dashboard.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/181977606 - Weekend Bakes/sites_181977606_dashboard.json new file mode 100644 index 000000000000..4142fd1019fd --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/181977606 - Weekend Bakes/sites_181977606_dashboard.json @@ -0,0 +1,66 @@ +{ + "request": { + "method": "GET", + "urlPath": "/wpcom/v2/sites/181977606/dashboard/cards-data/", + "queryParameters": { + "_locale": { + "matches": "(.*)" + }, + "cards": { + "equalTo": "todays_stats,posts,pages,activity" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "todays_stats": { + "views": 100, + "visitors": 75, + "likes": 50, + "comments": 25 + }, + "posts": { + "has_published": true, + "draft": [], + "scheduled": [] + }, + "pages": [ + { + "id": 3, + "title": "Style Guide", + "content": "That last is no more than a foot high, and about seven paces across, a mere flat top of a grey rock which smokes like a hot cinder after a shower, and where no man would care to venture a naked sole before sunset. On the Little Isabel an old ragged palm, with a thick […]", + "status": "publish", + "modified": "{{#assign 'customformat'}}yyyy-MM-dd'T'HH:mm:ss{{/assign}}{{now offset='-2 hours' format=customformat}}", + "date": "{{now offset='-2 hours' format=customformat}}" + }, + { + "id": 2, + "title": "Image Alignments", + "content": "This page is filled with sample content illustrating what various image types look like. Right-aligned Medium Perhaps the very atmospheric conditions which had kept away the merchant fleets of bygone ages induced the O.S.N. Company to violate the sanctuary of peace sheltering the calm existence of Sulaco. The variable airs sporting lightly with the vast […]", + "status": "publish", + "modified": "{{now offset='-3 hours' format=customformat}}", + "date": "{{now offset='-3 hours' format=customformat}}" + }, + { + "id": 18, + "title": "About Twenty Sixteen", + "content": "Twenty Sixteen is a modernized take on an ever-popular WordPress layout — the horizontal masthead with an optional right sidebar that works perfectly for blogs and websites. It has custom color options with beautiful default color schemes, a harmonious fluid grid using a mobile-first approach, and impeccable polish in every detail. Twenty Sixteen will make […]", + "status": "publish", + "modified": "{{now offset='-5 hours' format=customformat}}", + "date": "{{now offset='-5 hours' format=customformat}}" + } + ], + "activity": { + "@context": "https://www.w3.org/ns/activitystreams", + "summary": "Activity log", + "type": "OrderedCollection", + "totalItems": 0, + "page": 1, + "totalPages": 0, + "itemsPerPage": 5, + "id": "https://public-api.wordpress.com/wpcom/v2/sites/181977606/activity" + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/181977606 - Weekend Bakes/sites_181977606_domains.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/181977606 - Weekend Bakes/sites_181977606_domains.json new file mode 100644 index 000000000000..23c82084ce28 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/181977606 - Weekend Bakes/sites_181977606_domains.json @@ -0,0 +1,86 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/181977606/domains", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "domains": [ + { + "primary_domain": true, + "blog_id": 181977606, + "subscription_id": null, + "can_manage_dns_records": false, + "can_manage_name_servers": false, + "can_update_contact_info": false, + "cannot_manage_dns_records_reason": null, + "cannot_manage_name_servers_reason": null, + "cannot_update_contact_info_reason": null, + "connection_mode": null, + "current_user_can_add_email": false, + "current_user_can_create_site_from_domain_only": true, + "current_user_cannot_add_email_reason": null, + "current_user_can_manage": true, + "current_user_is_owner": null, + "can_set_as_primary": true, + "domain": "weekendbakesblog.wordpress.com", + "domain_notice_states": null, + "supports_domain_connect": null, + "email_forwards_count": 0, + "expiry": false, + "expiry_soon": false, + "expired": false, + "auto_renewing": false, + "pending_registration": false, + "pending_registration_time": "", + "has_registration": false, + "has_email_forward_dns_records": null, + "points_to_wpcom": true, + "privacy_available": false, + "private_domain": false, + "partner_domain": false, + "wpcom_domain": true, + "has_zone": false, + "is_renewable": false, + "is_redeemable": false, + "is_subdomain": true, + "is_eligible_for_inbound_transfer": false, + "is_locked": false, + "is_wpcom_staging_domain": false, + "transfer_away_eligible_at": null, + "type": "wpcom", + "registration_date": "", + "auto_renewal_date": "", + "google_apps_subscription": null, + "titan_mail_subscription": null, + "pending_whois_update": false, + "tld_maintenance_end_time": null, + "ssl_status": null, + "supports_gdpr_consent_management": false, + "supports_transfer_approval": false, + "domain_registration_agreement_url": "", + "contact_info_disclosure_available": false, + "contact_info_disclosed": false, + "renewable_until": null, + "redeemable_until": null, + "bundled_plan_subscription_id": null, + "product_slug": null, + "owner": "", + "pending_renewal": false, + "aftermarket_auction": false, + "aftermarket_auction_start": null, + "aftermarket_auction_end": null, + "nominet_pending_contact_verification_request": false, + "nominet_domain_suspended": false, + "transfer_status": null + } + ] + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/221670093 - NUX Test Site/sites_221670093_dashboard.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/221670093 - NUX Test Site/sites_221670093_dashboard.json new file mode 100644 index 000000000000..8b8da9271e09 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/221670093 - NUX Test Site/sites_221670093_dashboard.json @@ -0,0 +1,41 @@ +{ + "request": { + "method": "GET", + "urlPath": "/wpcom/v2/sites/221670093/dashboard/cards-data/", + "queryParameters": { + "_locale": { + "matches": "(.*)" + }, + "cards": { + "equalTo": "todays_stats,posts,pages,activity" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "todays_stats": { + "views": 0, + "visitors": 0, + "likes": 0, + "comments": 0 + }, + "posts": { + "has_published": false, + "draft": [], + "scheduled": [] + }, + "pages": [], + "activity": { + "@context": "https://www.w3.org/ns/activitystreams", + "summary": "Activity log", + "type": "OrderedCollection", + "totalItems": 0, + "page": 1, + "totalPages": 0, + "itemsPerPage": 5, + "id": "https://public-api.wordpress.com/wpcom/v2/sites/221670093/activity" + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/221670093 - NUX Test Site/sites_221670093_domains.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/221670093 - NUX Test Site/sites_221670093_domains.json new file mode 100644 index 000000000000..675241a8c34f --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/221670093 - NUX Test Site/sites_221670093_domains.json @@ -0,0 +1,86 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/221670093/domains", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "domains": [ + { + "primary_domain": true, + "blog_id": 221670093, + "subscription_id": null, + "can_manage_dns_records": false, + "can_manage_name_servers": false, + "can_update_contact_info": false, + "cannot_manage_dns_records_reason": null, + "cannot_manage_name_servers_reason": null, + "cannot_update_contact_info_reason": null, + "connection_mode": null, + "current_user_can_add_email": false, + "current_user_can_create_site_from_domain_only": true, + "current_user_cannot_add_email_reason": null, + "current_user_can_manage": true, + "current_user_is_owner": null, + "can_set_as_primary": true, + "domain": "domainexample.blog", + "domain_notice_states": null, + "supports_domain_connect": null, + "email_forwards_count": 0, + "expiry": false, + "expiry_soon": false, + "expired": false, + "auto_renewing": false, + "pending_registration": false, + "pending_registration_time": "", + "has_registration": false, + "has_email_forward_dns_records": null, + "points_to_wpcom": true, + "privacy_available": false, + "private_domain": false, + "partner_domain": false, + "wpcom_domain": true, + "has_zone": false, + "is_renewable": false, + "is_redeemable": false, + "is_subdomain": true, + "is_eligible_for_inbound_transfer": false, + "is_locked": false, + "is_wpcom_staging_domain": false, + "transfer_away_eligible_at": null, + "type": "wpcom", + "registration_date": "", + "auto_renewal_date": "", + "google_apps_subscription": null, + "titan_mail_subscription": null, + "pending_whois_update": false, + "tld_maintenance_end_time": null, + "ssl_status": null, + "supports_gdpr_consent_management": false, + "supports_transfer_approval": false, + "domain_registration_agreement_url": "", + "contact_info_disclosure_available": false, + "contact_info_disclosed": false, + "renewable_until": null, + "redeemable_until": null, + "bundled_plan_subscription_id": null, + "product_slug": null, + "owner": "", + "pending_renewal": false, + "aftermarket_auction": false, + "aftermarket_auction_start": null, + "aftermarket_auction_end": null, + "nominet_pending_contact_verification_request": false, + "nominet_domain_suspended": false, + "transfer_status": null + } + ] + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/Shared/sites_publisize.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/Shared/sites_publisize.json new file mode 100644 index 000000000000..0954b4aaf951 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/dashboard/Shared/sites_publisize.json @@ -0,0 +1,87 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/wpcom/v2/sites/.*/external-services", + "queryParameters": { + "locale": { + "matches": "(.*)" + }, + "type": { + "equalTo": "publicize" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + + "services": { + "facebook": { + "ID": "facebook", + "label": "Facebook", + "type": "publicize", + "description": "Publish your posts to your Facebook timeline or page.", + "genericon": { + "class": "facebook-alt", + "unicode": "\\f203" + }, + "icon": "http://i.wordpress.com/wp-content/admin-plugins/publicize/assets/publicize-fb-2x.png", + "connect_URL": "https://public-api.wordpress.com/connect/?action=request&kr_nonce=c98be927cc&nonce=31e8eb987b&for=connect&service=facebook&blog=215224204&kr_blog_nonce=3d5d1f5eff&magic=keyring", + "multiple_external_user_ID_support": true, + "external_users_only": true, + "jetpack_support": true, + "jetpack_module_required": "publicize" + }, + "twitter": { + "ID": "twitter", + "label": "Twitter", + "type": "publicize", + "description": "Publish your posts to your Twitter account.", + "genericon": { + "class": "twitter", + "unicode": "\\f202" + }, + "icon": "http://i.wordpress.com/wp-content/admin-plugins/publicize/assets/publicize-twitter-2x.png", + "connect_URL": "https://public-api.wordpress.com/connect/?action=request&kr_nonce=c98be927cc&nonce=49e6f85e72&for=connect&service=twitter&blog=215224204&kr_blog_nonce=3d5d1f5eff&magic=keyring", + "multiple_external_user_ID_support": false, + "external_users_only": false, + "jetpack_support": true, + "jetpack_module_required": "publicize", + "status": "unsupported" + }, + "linkedin": { + "ID": "linkedin", + "label": "LinkedIn", + "type": "publicize", + "description": "Publish your posts to your LinkedIn profile.", + "genericon": { + "class": "linkedin", + "unicode": "\\f207" + }, + "icon": "http://i.wordpress.com/wp-content/admin-plugins/publicize/assets/publicize-linkedin-2x.png", + "connect_URL": "https://public-api.wordpress.com/connect/?action=request&kr_nonce=c98be927cc&nonce=9ed430da6c&for=connect&service=linkedin&blog=215224204&kr_blog_nonce=3d5d1f5eff&magic=keyring", + "multiple_external_user_ID_support": false, + "external_users_only": false, + "jetpack_support": true, + "jetpack_module_required": "publicize" + }, + "tumblr": { + "ID": "tumblr", + "label": "Tumblr", + "type": "publicize", + "description": "Publish your posts to your Tumblr blog.", + "genericon": { + "class": "tumblr", + "unicode": "\\f214" + }, + "icon": "http://i.wordpress.com/wp-content/admin-plugins/publicize/assets/publicize-tumblr-2x.png", + "multiple_external_user_ID_support": true, + "external_users_only": false, + "connect_URL": "https://public-api.wordpress.com/connect/?action=request&kr_nonce=c98be927cc&nonce=99d8ed4fcc&for=connect&service=tumblr&blog=215224204&kr_blog_nonce=3d5d1f5eff&magic=keyring", + "jetpack_support": true, + "jetpack_module_required": "publicize" + } + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/devices/devices_id_delete.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/devices/devices_id_delete.json new file mode 100644 index 000000000000..0aee8f7186c5 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/devices/devices_id_delete.json @@ -0,0 +1,17 @@ +{ + "request": { + "urlPattern": "/rest/v1.1/devices/[0-9]+/delete.*", + "method": "POST" + }, + "response": { + "status": 200, + "jsonBody": { + "success": true + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/devices/devices_new.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/devices/devices_new.json new file mode 100644 index 000000000000..a2c5e67798c0 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/devices/devices_new.json @@ -0,0 +1,70 @@ +{ + "request": { + "urlPath": "/rest/v1.1/devices/new", + "method": "POST", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "ID": "123", + "settings": { + "comments": { + "desc": "Comments", + "long_desc": "Someone comments one of my posts", + "value": "1" + }, + "reblogs": { + "desc": "Reblogs", + "value": "1", + "long_desc": "Someone reblogs one of my posts" + }, + "follows": { + "desc": "Follows", + "long_desc": "Someone follows my blog", + "value": "1" + }, + "post_likes": { + "desc": "Likes", + "long_desc": "Someone likes one of my posts", + "value": "1" + }, + "achievements": { + "desc": "Achievements", + "long_desc": "I've reached an achievement on my blog", + "value": "1" + }, + "muted_blogs": { + "desc": "Muted Blogs", + "long_desc": "Blogs I don't want receive push notifications", + "value": [ + { + "value": 0, + "blog_id": "1", + "url": "https://infocusphotographers.com/", + "blog_name": "Mobile E2E Testing" + } + ] + }, + "mute_until": { + "desc": "Mute Push Notifications", + "value": "0" + }, + "other": { + "desc": "Other", + "long_desc": "Other Notifications!", + "value": "1" + } + } + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/domains/rest_v11_suggestions.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/domains/rest_v11_suggestions.json new file mode 100644 index 000000000000..b6b35e0e6b1b --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/domains/rest_v11_suggestions.json @@ -0,0 +1,75 @@ +{ + "request": { + "urlPath": "/rest/v1.1/domains/suggestions", + "method": "GET" + }, + "response": { + "status": 200, + "jsonBody": [ + { + "domain_name": "domainexample.com", + "relevance": 1, + "supports_privacy": true, + "vendor": "donuts", + "match_reasons": ["tld-common"], + "product_id": 6, + "product_slug": "domain_reg", + "cost": "19,00\u00a0\u20ac", + "raw_price": 19, + "currency_code": "EUR" + }, + { + "domain_name": "domainexample.ink", + "relevance": 1, + "supports_privacy": true, + "vendor": "donuts", + "product_id": 359, + "product_slug": "dotink_domain", + "cost": "26,00\u00a0\u20ac", + "raw_price": 26, + "currency_code": "EUR" + }, + { + "domain_name": "domainexample.blog", + "relevance": 0.99, + "supports_privacy": true, + "vendor": "donuts", + "match_reasons": ["tld-common"], + "product_id": 76, + "product_slug": "dotblog_domain", + "cost": "22,00\u00a0\u20ac", + "raw_price": 22, + "currency_code": "EUR", + "sale_cost": 4.84 + }, + { + "domain_name": "domainexample.org", + "relevance": 0.98, + "supports_privacy": true, + "vendor": "donuts", + "match_reasons": ["tld-common"], + "product_id": 6, + "product_slug": "domain_reg", + "cost": "19,00\u00a0\u20ac", + "raw_price": 19, + "currency_code": "EUR" + }, + { + "domain_name": "domainexample.maison", + "relevance": 0.93, + "supports_privacy": true, + "vendor": "donuts", + "product_id": 200, + "product_slug": "dotmaison_domain", + "cost": "49,00\u00a0\u20ac", + "raw_price": 49, + "currency_code": "EUR" + } + ], + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } + } \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/feature_announcements.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/feature_announcements.json new file mode 100644 index 000000000000..a2e77b3fca7a --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/feature_announcements.json @@ -0,0 +1,30 @@ +{ + "request": { + "method": "GET", + "urlPath": "/wpcom/v2/mobile/feature-announcements/", + "queryParameters": { + "_locale": { + "matches": "(.*)" + }, + "app_id": { + "matches": "(.*)" + }, + "app_version": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "announcements": [ + + ] + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/feature_flags.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/feature_flags.json new file mode 100644 index 000000000000..3c7e2961b75b --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/feature_flags.json @@ -0,0 +1,21 @@ +{ + "request": { + "method": "GET", + "urlPath": "/wpcom/v2/mobile/feature-flags", + "queryParameters": { + "_locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "dashboard_card_activity_log": true, + "dashboard_card_domain": false, + "dashboard_card_free_to_paid_plans": true, + "dashboard_card_pages": true, + "stats_traffic_subscribers_tabs": true + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/jetpack/wpcom_sites_jetpack_social.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/jetpack/wpcom_sites_jetpack_social.json new file mode 100644 index 000000000000..221e28bba2ec --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/jetpack/wpcom_sites_jetpack_social.json @@ -0,0 +1,14 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/wpcom/v2/sites/.*/jetpack-social.*" + }, + "response": { + "status": 200, + "jsonBody": { + "is_share_limit_enabled": false, + "is_enhanced_publishing_enabled": false, + "is_social_image_generator_enabled": false + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/jetpack/wpcom_sites_rewind.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/jetpack/wpcom_sites_rewind.json new file mode 100644 index 000000000000..d169962db6ec --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/jetpack/wpcom_sites_rewind.json @@ -0,0 +1,24 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/wpcom/v2/sites/.*/rewind(/)?($|\\?.*)" + }, + "response": { + "status": 200, + "jsonBody": { + "credentials": [ + { + "still_valid": true, + "type": "managed", + "role": "main" + } + ], + "alerts": { + "threats": [] + }, + "state": "active", + "last_updated": "{{#assign 'customformat'}}yyyy-MM-dd'T'HH:mm:ss{{/assign}}{{now offset='-2 hours' format=customformat}}", + "has_cloud": false + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/jetpack/wpcom_sites_rewind_capabilities.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/jetpack/wpcom_sites_rewind_capabilities.json new file mode 100644 index 000000000000..391da3230151 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/jetpack/wpcom_sites_rewind_capabilities.json @@ -0,0 +1,18 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/wpcom/v2/sites/.*/rewind/capabilities.*" + }, + "response": { + "status": 200, + "jsonBody": { + "capabilities": [ + "backup", + "restore", + "backup-daily", + "scan", + "antispam" + ] + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/jetpack/wpcom_sites_rewind_downloads.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/jetpack/wpcom_sites_rewind_downloads.json new file mode 100644 index 000000000000..5ce702b1e724 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/jetpack/wpcom_sites_rewind_downloads.json @@ -0,0 +1,16 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/wpcom/v2/sites/.*/rewind/downloads/.*" + }, + "response": { + "status": 200, + "jsonBody": { + "downloadId": 434619, + "rewindId": "1690111277.168", + "backupPoint": "{{#assign 'customformat'}}yyyy-MM-dd'T'HH:mm:ss{{/assign}}{{now offset='-2 days' format=customformat}}", + "startedAt": "{{now format=customformat}}", + "progress": 86 + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/me/me.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/me/me.json new file mode 100644 index 000000000000..6468fef0b2aa --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/me/me.json @@ -0,0 +1,55 @@ +{ + "scenarioName": "auth", + "request": { + "urlPattern": "/rest/v1.1/me(/)?($|\\?.*)", + "method": "GET" + }, + "response": { + "status": 200, + "jsonBody": { + "ID": 152748359, + "display_name": "e2eflowtestingmobile", + "username": "e2eflowtestingmobile", + "email": "main.ee0zglcj@mailosaur.io", + "primary_blog": 106707880, + "primary_blog_url": "https://infocusphotographers.com", + "primary_blog_is_jetpack": false, + "language": "en", + "locale_variant": "", + "token_site_id": false, + "token_scope": [ + "global" + ], + "avatar_URL": "https://en.gravatar.com/avatar/35029b2103460109f574c38dfeea5f3f?s=96&d=identicon", + "profile_URL": "http://en.gravatar.com/e2eflowtestingmobile", + "verified": true, + "email_verified": true, + "date": "2019-02-14T09:49:17+00:00", + "site_count": 1, + "visible_site_count": 1, + "has_unseen_notes": false, + "newest_note_type": "", + "phone_account": false, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/me", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/me/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/5836086", + "flags": "{{request.requestLine.baseUrl}}/rest/v1.1/me/flags" + } + }, + "is_valid_google_apps_country": true, + "user_ip_country_code": "IE", + "logout_URL": "https://wordpress.com/wp-login.php?action=logout&_wpnonce=2887f970c8&redirect_to=https%3A%2F%2Fwordpress.com%2F", + "social_login_connections": null, + "social_signup_service": null, + "abtests": { + } + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/me/me_gutenbeg_set.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/me/me_gutenbeg_set.json new file mode 100644 index 000000000000..c421c20fdb04 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/me/me_gutenbeg_set.json @@ -0,0 +1,17 @@ +{ + "request": { + "urlPath": "/wpcom/v2/me/gutenberg", + "method": "POST" + }, + "response": { + "status": 200, + "jsonBody": [ + + ], + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/me/me_settings_get.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/me/me_settings_get.json new file mode 100644 index 000000000000..9c009178c869 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/me/me_settings_get.json @@ -0,0 +1,59 @@ +{ + "request": { + "urlPattern": "/rest/v1.1/me/settings.*", + "method": "GET" + }, + "response": { + "status": 200, + "jsonBody": { + "enable_translator": false, + "surprise_me": false, + "post_post_flag": false, + "holidaysnow": false, + "user_login": "e2eflowtestingmobile", + "password": "", + "display_name": "e2eflowtestingmobile", + "first_name": "", + "last_name": "", + "description": "", + "user_email": "e2eflowtestingmobile@example.com", + "user_email_change_pending": false, + "new_user_email": "", + "user_URL": "https://infocusphotographers.com", + "language": "en", + "avatar_URL": "https://en.gravatar.com/avatar/35029b2103460109f574c38dfeea5f3f?s=200&d=mm", + "primary_site_ID": 106707880, + "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": 4, + "subscription_delivery_hour": 8, + "subscription_delivery_email_blocked": false, + "two_step_enabled": false, + "two_step_sms_enabled": false, + "two_step_backup_codes_printed": false, + "two_step_sms_country": "", + "two_step_sms_phone_number": "", + "user_login_can_be_changed": true, + "calypso_preferences": { + "is_new_reader": true, + "recentSites": [ + 1 + ] + }, + "jetpack_connect": [ + + ], + "is_desktop_app_user": false, + "locale_variant": false, + "tracks_opt_out": false + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/me/me_settings_post.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/me/me_settings_post.json new file mode 100644 index 000000000000..a96572f52584 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/me/me_settings_post.json @@ -0,0 +1,19 @@ +{ + "request": { + "urlPattern": "/rest/v1.1/me/settings.*", + "method": "POST" + }, + "response": { + "status": 200, + "jsonBody": { + "password": "", + "user_login": "e2eflowsignuptestingmobile", + "display_name": "Eeflowsignuptestingmobile" + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/me/me_shopping_cart_post.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/me/me_shopping_cart_post.json new file mode 100644 index 000000000000..2dff1685224d --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/me/me_shopping_cart_post.json @@ -0,0 +1,265 @@ +{ + "request": { + "urlPattern": "/rest/v1.1/me/shopping-cart/.*", + "method": "POST" + }, + "response": { + "status": 200, + "jsonBody": { + "cart_generated_at_timestamp": 1684777767, + "blog_id": 218645783, + "cart_key": 218645783, + "coupon": "", + "coupon_discounts": [], + "coupon_discounts_integer": [], + "coupon_discounts_display": [], + "is_coupon_applied": false, + "next_domain_is_free": false, + "next_domain_condition": "", + "products": [{ + "product_id": 76, + "billing_plan_id": "1562", + "product_name": ".blog Domain Registration", + "product_name_en": ".blog Domain Registration", + "product_slug": "dotblog_domain", + "product_cost": 22, + "product_cost_display": "22\u00a0\u20ac", + "product_cost_integer": 2200, + "meta": "domainexample.blog", + "cost": 4.84, + "currency": "EUR", + "volume": 1, + "quantity": null, + "current_quantity": null, + "price_tier_minimum_units": null, + "price_tier_maximum_units": null, + "price_tier_transform_quantity_divide_by": null, + "price_tier_transform_quantity_round": null, + "free_trial": false, + "introductory_offer_terms": null, + "cost_before_coupon": 22, + "coupon_savings": 0, + "coupon_savings_integer": 0, + "coupon_savings_display": "0\u00a0\u20ac", + "is_sale_coupon_applied": true, + "extra": { + "privacy": true, + "added_from_shopping_cart": true, + "registrar": "KS_RAM", + "domain_registration_agreement_url": "https:\/\/wordpress.com\/automattic-domain-name-registration-agreement\/", + "privacy_available": true, + "premium": false + }, + "bill_period": "365", + "months_per_bill_period": 12, + "is_domain_registration": true, + "time_added_to_cart": 1684777766, + "is_bundled": false, + "item_original_cost": 22, + "item_original_cost_integer": 2200, + "item_original_cost_display": "22\u00a0\u20ac", + "item_original_monthly_cost_integer": 183, + "item_original_monthly_cost_display": "1,83\u00a0\u20ac", + "item_original_cost_for_quantity_one_integer": 900, + "item_original_cost_for_quantity_one_display": "9\u00a0\u20ac", + "item_subtotal_monthly_cost_integer": 17, + "item_subtotal_monthly_cost_display": "0,17\u00a0\u20ac", + "item_original_subtotal": 22, + "item_original_subtotal_integer": 2200, + "item_original_subtotal_display": "22\u00a0\u20ac", + "item_subtotal": 4.84, + "item_subtotal_integer": 484, + "item_subtotal_display": "4,84\u00a0\u20ac", + "item_tax": 0, + "item_tax_rate": 0, + "item_tax_breakdown": [], + "item_total": 4.84, + "item_total_integer": 484, + "subscription_id": 0, + "is_renewal": false, + "domain_post_renewal_expiration_date": null, + "cost_overrides": [{ + "old_price": 9, + "new_price": 1.98, + "reason": "Sale_Coupon->apply_sale_discount" + }], + "is_gift_purchase": false, + "product_variants": [] + }], + "unmerged_products": [{ + "product_id": 76, + "billing_plan_id": "1562", + "product_name": ".blog Domain Registration", + "product_name_en": ".blog Domain Registration", + "product_slug": "dotblog_domain", + "product_cost": 9, + "product_cost_display": "9\u00a0\u20ac", + "product_cost_integer": 900, + "meta": "domainexample.blog", + "cost": 1.98, + "currency": "EUR", + "volume": 1, + "quantity": null, + "current_quantity": null, + "price_tier_minimum_units": null, + "price_tier_maximum_units": null, + "price_tier_transform_quantity_divide_by": null, + "price_tier_transform_quantity_round": null, + "free_trial": false, + "introductory_offer_terms": null, + "cost_before_coupon": 9, + "coupon_savings": 0, + "coupon_savings_integer": 0, + "coupon_savings_display": "0\u00a0\u20ac", + "is_sale_coupon_applied": true, + "extra": { + "privacy": true, + "added_from_shopping_cart": true, + "registrar": "KS_RAM", + "domain_registration_agreement_url": "https:\/\/wordpress.com\/automattic-domain-name-registration-agreement\/", + "privacy_available": true, + "premium": false + }, + "bill_period": "365", + "months_per_bill_period": 12, + "is_domain_registration": true, + "time_added_to_cart": 1684777766, + "is_bundled": false, + "item_original_cost": 9, + "item_original_cost_integer": 900, + "item_original_cost_display": "9\u00a0\u20ac", + "item_original_monthly_cost_integer": 75, + "item_original_monthly_cost_display": "0,75\u00a0\u20ac", + "item_original_cost_for_quantity_one_integer": 900, + "item_original_cost_for_quantity_one_display": "9\u00a0\u20ac", + "item_subtotal_monthly_cost_integer": 17, + "item_subtotal_monthly_cost_display": "0,17\u00a0\u20ac", + "item_original_subtotal": 9, + "item_original_subtotal_integer": 900, + "item_original_subtotal_display": "9\u00a0\u20ac", + "item_subtotal": 1.98, + "item_subtotal_integer": 198, + "item_subtotal_display": "1,98\u00a0\u20ac", + "item_tax": 0, + "item_tax_rate": 0, + "item_tax_breakdown": [], + "item_total": 1.98, + "item_total_integer": 198, + "subscription_id": 0, + "is_renewal": false, + "domain_post_renewal_expiration_date": null, + "cost_overrides": [{ + "old_price": 9, + "new_price": 1.98, + "reason": "Sale_Coupon->apply_sale_discount" + }], + "is_gift_purchase": false, + "product_variants": [] + }, { + "product_id": 5, + "billing_plan_id": "912", + "product_name": "Domain Connection", + "product_name_en": "Domain Connection", + "product_slug": "domain_map", + "product_cost": 13, + "product_cost_display": "13\u00a0\u20ac", + "product_cost_integer": 1300, + "meta": "domainexample.com", + "cost": 2.86, + "currency": "EUR", + "volume": 1, + "quantity": null, + "current_quantity": null, + "price_tier_minimum_units": null, + "price_tier_maximum_units": null, + "price_tier_transform_quantity_divide_by": null, + "price_tier_transform_quantity_round": null, + "free_trial": false, + "introductory_offer_terms": null, + "cost_before_coupon": 13, + "coupon_savings": 0, + "coupon_savings_integer": 0, + "coupon_savings_display": "0\u00a0\u20ac", + "is_sale_coupon_applied": true, + "extra": { + "privacy": true, + "added_from_shopping_cart": true + }, + "bill_period": "365", + "months_per_bill_period": 12, + "is_domain_registration": false, + "time_added_to_cart": 1684777767, + "is_bundled": false, + "item_original_cost": 13, + "item_original_cost_integer": 1300, + "item_original_cost_display": "13\u00a0\u20ac", + "item_original_monthly_cost_integer": 108, + "item_original_monthly_cost_display": "1,08\u00a0\u20ac", + "item_original_cost_for_quantity_one_integer": 1300, + "item_original_cost_for_quantity_one_display": "13\u00a0\u20ac", + "item_subtotal_monthly_cost_integer": 24, + "item_subtotal_monthly_cost_display": "0,24\u00a0\u20ac", + "item_original_subtotal": 13, + "item_original_subtotal_integer": 1300, + "item_original_subtotal_display": "13\u00a0\u20ac", + "item_subtotal": 2.86, + "item_subtotal_integer": 286, + "item_subtotal_display": "2,86\u00a0\u20ac", + "item_tax": 0, + "item_tax_rate": 0, + "item_tax_breakdown": [], + "item_total": 2.86, + "item_total_integer": 286, + "subscription_id": 0, + "is_renewal": false, + "domain_post_renewal_expiration_date": null, + "cost_overrides": [{ + "old_price": 13, + "new_price": 2.86, + "reason": "Sale_Coupon->apply_sale_discount" + }], + "is_gift_purchase": false, + "product_variants": [] + }], + "total_cost": 4.84, + "currency": "EUR", + "total_cost_display": "4,84\u00a0\u20ac", + "total_cost_integer": 484, + "temporary": false, + "tax": { + "location": {}, + "display_taxes": false + }, + "coupon_savings_total": 0, + "coupon_savings_total_display": "0\u00a0\u20ac", + "coupon_savings_total_integer": 0, + "sub_total_with_taxes_display": "4,84\u00a0\u20ac", + "sub_total_with_taxes_integer": 484, + "sub_total": 4.84, + "sub_total_display": "4,84\u00a0\u20ac", + "sub_total_integer": 484, + "total_tax": 0, + "total_tax_display": "0\u00a0\u20ac", + "total_tax_integer": 0, + "total_tax_breakdown": [], + "credits": 0, + "credits_display": "0\u00a0\u20ac", + "credits_integer": 0, + "allowed_payment_methods": ["WPCOM_Billing_MoneyPress_Paygate", "WPCOM_Billing_PayPal_Express", "WPCOM_Billing_Stripe_Payment_Method", "WPCOM_Billing_MoneyPress_Stored", "WPCOM_Billing_Web_Payment"], + "terms_of_service": [], + "did_use_cached_taxes": false, + "is_gift_purchase": false, + "gift_details": null, + "messages": { + "errors": [], + "success": [], + "persistent_errors": [] + } + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } + } \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/me/me_signup.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/me/me_signup.json new file mode 100644 index 000000000000..a28242273931 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/me/me_signup.json @@ -0,0 +1,56 @@ +{ + "scenarioName": "auth", + "requiredScenarioState": "signed-up", + "request": { + "urlPattern": "/rest/v1.1/me(/)?($|\\?.*)", + "method": "GET" + }, + "response": { + "status": 200, + "jsonBody": { + "ID": 152748359, + "display_name": "e2eflowsignuptestingmobile", + "username": "e2eflowsignuptestingmobile", + "email": "e2eflowsignuptestingmobile@example.com", + "primary_blog": null, + "primary_blog_url": null, + "primary_blog_is_jetpack": false, + "language": "en", + "locale_variant": "", + "token_site_id": false, + "token_scope": [ + "global" + ], + "avatar_URL": "https://1.gravatar.com/avatar/7a4015c11be6a342f65e0e169092d402?s=96&d=identicon", + "profile_URL": "http://en.gravatar.com/e2eflowsignuptestingmobile", + "verified": true, + "email_verified": true, + "date": "2019-02-14T09:49:17+00:00", + "site_count": 1, + "visible_site_count": 1, + "has_unseen_notes": false, + "newest_note_type": "", + "phone_account": false, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/me", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/me/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/5836086", + "flags": "{{request.requestLine.baseUrl}}/rest/v1.1/me/flags" + } + }, + "is_valid_google_apps_country": true, + "user_ip_country_code": "IE", + "logout_URL": "https://wordpress.com/wp-login.php?action=logout&_wpnonce=2887f970c8&redirect_to=https%3A%2F%2Fwordpress.com%2F", + "social_login_connections": null, + "social_signup_service": null, + "abtests": { + } + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/me/me_sites.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/me/me_sites.json new file mode 100644 index 000000000000..ac44ab8f944c --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/me/me_sites.json @@ -0,0 +1,569 @@ +{ + "priority": 2, + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.2/me/sites", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "sites": [ + { + "ID": 106707880, + "name": "Tri-County Real Estate", + "description": "", + "URL": "https://tricountyrealestate.wordpress.com", + "user_can_manage": true, + "capabilities": { + "edit_pages": true, + "edit_posts": true, + "edit_others_posts": true, + "edit_others_pages": true, + "delete_posts": true, + "delete_others_posts": true, + "edit_theme_options": true, + "edit_users": false, + "list_users": true, + "manage_categories": true, + "manage_options": true, + "moderate_comments": true, + "activate_wordads": true, + "promote_users": true, + "publish_posts": true, + "upload_files": true, + "delete_users": false, + "remove_users": true, + "own_site": true, + "view_hosting": true, + "view_stats": true + }, + "jetpack": false, + "jetpack_connection": false, + "is_multisite": true, + "post_count": 3, + "subscribers_count": 0, + "lang": "en", + "icon": { + "img": "https://tricountyrealestate.files.wordpress.com/2020/08/image-1.jpg?w=96", + "ico": "https://tricountyrealestate.files.wordpress.com/2020/08/image-1.jpg?w=96", + "media_id": 133 + }, + "logo": { + "id": 0, + "sizes": [ + + ], + "url": "" + }, + "visible": true, + "is_private": true, + "is_coming_soon": true, + "single_user_site": false, + "is_vip": false, + "is_following": false, + "organization_id": 0, + "options": { + "timezone": "America/Los_Angeles", + "gmt_offset": -7, + "blog_public": -1, + "videopress_enabled": false, + "upgraded_filetypes_enabled": false, + "login_url": "https://tricountyrealestate.wordpress.com/wp-login.php", + "admin_url": "https://tricountyrealestate.wordpress.com/wp-admin/", + "is_mapped_domain": false, + "is_redirect": false, + "unmapped_url": "https://tricountyrealestate.wordpress.com", + "featured_images_enabled": false, + "theme_slug": "pub/hever", + "header_image": false, + "background_color": false, + "image_default_link_type": "none", + "image_thumbnail_width": 150, + "image_thumbnail_height": 150, + "image_thumbnail_crop": 0, + "image_medium_width": 300, + "image_medium_height": 300, + "image_large_width": 1024, + "image_large_height": 1024, + "permalink_structure": "/%year%/%monthnum%/%day%/%postname%/", + "post_formats": [ + + ], + "default_post_format": "standard", + "default_category": 1, + "allowed_file_types": [ + "jpg", + "jpeg", + "png", + "gif", + "pdf", + "doc", + "ppt", + "odt", + "pptx", + "docx", + "pps", + "ppsx", + "xls", + "xlsx", + "key", + "asc" + ], + "show_on_front": "page", + "default_likes_enabled": true, + "default_sharing_status": false, + "default_comment_status": true, + "default_ping_status": true, + "software_version": "5.5-wpcom-48929", + "created_at": "2020-08-21T23:23:47+00:00", + "wordads": false, + "publicize_permanently_disabled": false, + "frame_nonce": "354ead212c", + "jetpack_frame_nonce": "354ead212c", + "page_on_front": 5, + "page_for_posts": 0, + "wpcom_public_coming_soon_page_id": 0, + "headstart": false, + "headstart_is_fresh": false, + "ak_vp_bundle_enabled": null, + "advanced_seo_front_page_description": "", + "advanced_seo_title_formats": [ + + ], + "verification_services_codes": null, + "podcasting_archive": null, + "is_domain_only": false, + "is_automated_transfer": false, + "is_wpcom_atomic": false, + "is_wpcom_store": false, + "woocommerce_is_active": false, + "design_type": null, + "site_goals": null, + "site_segment": null, + "import_engine": null, + "is_pending_plan": false, + "is_wpforteams_site": false, + "is_cloud_eligible": false + }, + "plan": { + "product_id": 1029, + "product_slug": "personal-bundle-2y", + "product_name_short": "Personal", + "expired": false, + "user_is_owner": false, + "is_free": false + }, + "products": [], + "jetpack_modules": null, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851541", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851541/help", + "posts": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851541/posts/", + "comments": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/comments/", + "xmlrpc": "https://tricountyrealestate.wordpress.com/xmlrpc.php", + "site_icon": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851541/media/133" + } + }, + "quota": { + "space_allowed": 3221225472, + "space_used": 75318143, + "percent_used": 2.338182895133893, + "space_available": 3145907329 + }, + "launch_status": "launched", + "site_migration": null, + "is_fse_active": false, + "is_fse_eligible": false, + "is_core_site_editor_enabled": false + }, + { + "ID": 181851495, + "name": "Four Paws Dog Grooming", + "description": "", + "URL": "https://fourpawsdoggrooming.wordpress.com", + "user_can_manage": true, + "capabilities": { + "edit_pages": true, + "edit_posts": true, + "edit_others_posts": true, + "edit_others_pages": true, + "delete_posts": true, + "delete_others_posts": true, + "edit_theme_options": true, + "edit_users": false, + "list_users": true, + "manage_categories": true, + "manage_options": true, + "moderate_comments": true, + "activate_wordads": false, + "promote_users": true, + "publish_posts": true, + "upload_files": true, + "delete_users": false, + "remove_users": true, + "own_site": false, + "view_hosting": true, + "view_stats": true + }, + "jetpack": false, + "jetpack_connection": false, + "is_multisite": true, + "post_count": 3, + "subscribers_count": 0, + "lang": "en", + "icon": { + "img": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-2-1.png?w=96", + "ico": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-2-1.png?w=96", + "media_id": 39 + }, + "logo": { + "id": 0, + "sizes": [ + + ], + "url": "" + }, + "visible": true, + "is_private": true, + "is_coming_soon": true, + "single_user_site": false, + "is_vip": false, + "is_following": false, + "organization_id": 0, + "options": { + "timezone": "America/Los_Angeles", + "gmt_offset": -7, + "blog_public": -1, + "videopress_enabled": false, + "upgraded_filetypes_enabled": false, + "login_url": "https://fourpawsdoggrooming.wordpress.com/wp-login.php", + "admin_url": "https://fourpawsdoggrooming.wordpress.com/wp-admin/", + "is_mapped_domain": false, + "is_redirect": false, + "unmapped_url": "https://fourpawsdoggrooming.wordpress.com", + "featured_images_enabled": false, + "theme_slug": "pub/hever", + "header_image": false, + "background_color": false, + "image_default_link_type": "none", + "image_thumbnail_width": 150, + "image_thumbnail_height": 150, + "image_thumbnail_crop": 0, + "image_medium_width": 300, + "image_medium_height": 300, + "image_large_width": 1024, + "image_large_height": 1024, + "permalink_structure": "/%year%/%monthnum%/%day%/%postname%/", + "post_formats": [ + + ], + "default_post_format": "0", + "default_category": 1, + "allowed_file_types": [ + "jpg", + "jpeg", + "png", + "gif", + "pdf", + "doc", + "ppt", + "odt", + "pptx", + "docx", + "pps", + "ppsx", + "xls", + "xlsx", + "key", + "asc" + ], + "show_on_front": "page", + "default_likes_enabled": true, + "default_sharing_status": false, + "default_comment_status": true, + "default_ping_status": true, + "software_version": "5.5-wpcom-48929", + "created_at": "2020-08-21T23:21:16+00:00", + "wordads": false, + "publicize_permanently_disabled": false, + "frame_nonce": "6c9ff09ee5", + "jetpack_frame_nonce": "6c9ff09ee5", + "page_on_front": 5, + "page_for_posts": 0, + "wpcom_public_coming_soon_page_id": 0, + "headstart": false, + "headstart_is_fresh": false, + "ak_vp_bundle_enabled": null, + "advanced_seo_front_page_description": "", + "advanced_seo_title_formats": [ + + ], + "verification_services_codes": null, + "podcasting_archive": null, + "is_domain_only": false, + "is_automated_transfer": false, + "is_wpcom_atomic": false, + "is_wpcom_store": false, + "woocommerce_is_active": false, + "design_type": null, + "site_goals": null, + "site_segment": null, + "import_engine": null, + "is_pending_plan": false, + "is_wpforteams_site": false, + "is_cloud_eligible": false + }, + "plan": { + "product_id": 1, + "product_slug": "free_plan", + "product_name_short": "Free", + "expired": false, + "user_is_owner": false, + "is_free": true + }, + "products": [ + + ], + "jetpack_modules": null, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495/help", + "posts": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495/posts/", + "comments": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851495/comments/", + "xmlrpc": "https://fourpawsdoggrooming.wordpress.com/xmlrpc.php", + "site_icon": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495/media/39" + } + }, + "quota": { + "space_allowed": 3221225472, + "space_used": 4495332, + "percent_used": 0.1395534723997116, + "space_available": 3216730140 + }, + "launch_status": "launched", + "site_migration": null, + "is_fse_active": false, + "is_fse_eligible": false, + "is_core_site_editor_enabled": false + }, + { + "ID": 181977606, + "name": "Weekend Bakes", + "description": "Site on Free Plan", + "URL": "https://weekendbakesblog.wordpress.com", + "user_can_manage": true, + "capabilities": { + "edit_pages": true, + "edit_posts": true, + "edit_others_posts": true, + "edit_others_pages": true, + "delete_posts": true, + "delete_others_posts": true, + "edit_theme_options": true, + "edit_users": false, + "list_users": true, + "manage_categories": true, + "manage_options": true, + "moderate_comments": true, + "activate_wordads": true, + "promote_users": true, + "publish_posts": true, + "upload_files": true, + "delete_users": false, + "remove_users": true, + "own_site": true, + "view_hosting": true, + "view_stats": true, + "activate_plugins": true + }, + "jetpack": false, + "jetpack_connection": false, + "is_multisite": true, + "site_owner": 152748359, + "post_count": 2, + "subscribers_count": 1, + "lang": "en-gb", + "logo": { + "id": 0, + "sizes": [], + "url": "" + }, + "visible": true, + "is_private": false, + "is_coming_soon": false, + "single_user_site": true, + "is_vip": false, + "is_following": true, + "organization_id": 0, + "options": { + "timezone": "", + "gmt_offset": 0, + "blog_public": 0, + "videopress_enabled": false, + "upgraded_filetypes_enabled": false, + "login_url": "https://weekendbakesblog.wordpress.com/wp-login.php", + "admin_url": "https://weekendbakesblog.wordpress.com/wp-admin/", + "is_mapped_domain": false, + "is_redirect": false, + "unmapped_url": "https://weekendbakesblog.wordpress.com", + "featured_images_enabled": true, + "theme_slug": "pub/zoologist", + "header_image": false, + "background_color": false, + "image_default_link_type": "none", + "image_thumbnail_width": 150, + "image_thumbnail_height": 150, + "image_thumbnail_crop": 0, + "image_medium_width": 300, + "image_medium_height": 300, + "image_large_width": 1024, + "image_large_height": 1024, + "permalink_structure": "/%year%/%monthnum%/%day%/%postname%/", + "post_formats": [], + "default_post_format": "0", + "default_category": 97, + "allowed_file_types": [ + "jpg", + "jpeg", + "png", + "gif", + "pdf", + "doc", + "ppt", + "odt", + "pptx", + "docx", + "pps", + "ppsx", + "xls", + "xlsx", + "key", + "webp", + "heic", + "heif", + "asc" + ], + "show_on_front": "page", + "default_likes_enabled": true, + "default_sharing_status": true, + "default_comment_status": true, + "default_ping_status": true, + "software_version": "6.3-alpha-55954", + "created_at": "2022-11-15T08:27:10+00:00", + "updated_at": "2022-12-07T06:46:31+00:00", + "wordads": false, + "publicize_permanently_disabled": false, + "frame_nonce": "7803b34234", + "jetpack_frame_nonce": "7803b34234", + "page_on_front": 2, + "page_for_posts": 0, + "headstart": false, + "headstart_is_fresh": false, + "ak_vp_bundle_enabled": null, + "advanced_seo_front_page_description": "", + "advanced_seo_title_formats": [], + "verification_services_codes": null, + "podcasting_archive": null, + "is_domain_only": false, + "is_automated_transfer": false, + "is_wpcom_atomic": false, + "is_wpcom_store": false, + "woocommerce_is_active": false, + "editing_toolkit_is_active": true, + "design_type": null, + "site_segment": null, + "import_engine": null, + "is_pending_plan": false, + "is_wpforteams_site": false, + "p2_hub_blog_id": null, + "is_cloud_eligible": false, + "anchor_podcast": false, + "was_created_with_blank_canvas_design": false, + "videopress_storage_used": 0, + "is_difm_lite_in_progress": false, + "difm_lite_site_options": {}, + "site_intent": "", + "site_vertical_id": null, + "blogging_prompts_settings": { + "prompts_reminders_opted_in": false, + "reminders_days": { + "monday": false, + "tuesday": false, + "wednesday": false, + "thursday": false, + "friday": false, + "saturday": false, + "sunday": false + }, + "reminders_time": "10.00", + "is_potential_blogging_site": true, + "prompts_card_opted_in": true + }, + "launchpad_screen": false, + "launchpad_checklist_tasks_statuses": [], + "wpcom_production_blog_id": 0, + "wpcom_staging_blog_ids": [], + "can_blaze": false, + "wpcom_site_setup": false + }, + "p2_thumbnail_elements": null, + "plan": { + "product_id": 1035, + "product_slug": "pro-plan-2y", + "product_name_short": "Pro", + "expired": false, + "user_is_owner": false, + "is_free": false + }, + "products": [], + "zendesk_site_meta": { + "plan": "free", + "addon": [] + }, + "jetpack_modules": null, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/181977606", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/181977606/help", + "posts": "https://public-api.wordpress.com/rest/v1.2/sites/181977606/posts/", + "comments": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/comments/", + "xmlrpc": "https://weekendbakesblog.wordpress.com/xmlrpc.php" + } + }, + "quota": { + "space_allowed": 3221225472, + "space_used": 4042929, + "percent_used": 0.12550903484225273, + "space_available": 3217182543 + }, + "launch_status": "launched", + "site_migration": null, + "is_fse_active": false, + "is_fse_eligible": false, + "is_core_site_editor_enabled": true, + "is_wpcom_atomic": false, + "is_wpcom_staging_site": false, + "user_interactions": [ + "2022-12-07", + "2022-11-16", + "2022-11-15" + ], + "was_ecommerce_trial": false, + "was_migration_trial": false + } + ] + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/media.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/media.json new file mode 100644 index 000000000000..b1c975d74c35 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/media.json @@ -0,0 +1,2365 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/106707880/media/", + "queryParameters": { + "number": { + "matches": "(48)?" + }, + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "found": 202, + "media": [ + { + "ID": 384, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/destination-landmark-las-vegas-165799.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/destination-landmark-las-vegas-165799.jpg", + "date": "2019-05-28T16:51:24+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "destination-landmark-las-vegas-165799.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "destination-landmark-las-vegas-165799", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/destination-landmark-las-vegas-165799.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/destination-landmark-las-vegas-165799.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/destination-landmark-las-vegas-165799.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/destination-landmark-las-vegas-165799.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/destination-landmark-las-vegas-165799.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/destination-landmark-las-vegas-165799.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/destination-landmark-las-vegas-165799.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/destination-landmark-las-vegas-165799.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/destination-landmark-las-vegas-165799.jpg?w=288" + }, + "height": 3072, + "width": 4608, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/384", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/384/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 383, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/dawn-desktop-wallpaper-evening-1612351.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/dawn-desktop-wallpaper-evening-1612351.jpg", + "date": "2019-05-28T16:51:22+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "dawn-desktop-wallpaper-evening-1612351.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "dawn-desktop-wallpaper-evening-1612351", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/dawn-desktop-wallpaper-evening-1612351.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/dawn-desktop-wallpaper-evening-1612351.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/dawn-desktop-wallpaper-evening-1612351.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/dawn-desktop-wallpaper-evening-1612351.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/dawn-desktop-wallpaper-evening-1612351.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/dawn-desktop-wallpaper-evening-1612351.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/dawn-desktop-wallpaper-evening-1612351.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/dawn-desktop-wallpaper-evening-1612351.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/dawn-desktop-wallpaper-evening-1612351.jpg?w=288" + }, + "height": 3649, + "width": 5472, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/383", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/383/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 382, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/concert-effect-entertainment-1150837.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/concert-effect-entertainment-1150837.jpg", + "date": "2019-05-28T16:51:20+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "concert-effect-entertainment-1150837.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "concert-effect-entertainment-1150837", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/concert-effect-entertainment-1150837.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/concert-effect-entertainment-1150837.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/concert-effect-entertainment-1150837.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/concert-effect-entertainment-1150837.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/concert-effect-entertainment-1150837.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/concert-effect-entertainment-1150837.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/concert-effect-entertainment-1150837.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/concert-effect-entertainment-1150837.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/concert-effect-entertainment-1150837.jpg?w=288" + }, + "height": 4000, + "width": 6000, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/382", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/382/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 381, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-flight-flying-6881.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/clouds-flight-flying-6881.jpg", + "date": "2019-05-28T16:51:18+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "clouds-flight-flying-6881.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "clouds-flight-flying-6881", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-flight-flying-6881.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-flight-flying-6881.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-flight-flying-6881.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-flight-flying-6881.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-flight-flying-6881.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-flight-flying-6881.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-flight-flying-6881.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-flight-flying-6881.jpg?w=1230&h=1224&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-flight-flying-6881.jpg?w=256" + }, + "height": 1224, + "width": 1632, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/381", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/381/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 379, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-country-countryside-459063.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/clouds-country-countryside-459063.jpg", + "date": "2019-05-28T16:51:15+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "clouds-country-countryside-459063.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "clouds-country-countryside-459063", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-country-countryside-459063.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-country-countryside-459063.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-country-countryside-459063.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-country-countryside-459063.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-country-countryside-459063.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-country-countryside-459063.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-country-countryside-459063.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-country-countryside-459063.jpg?w=1230&h=926&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-country-countryside-459063.jpg?w=415" + }, + "height": 926, + "width": 2001, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/379", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/379/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 377, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-colorful-colourful-587741.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/celebration-colorful-colourful-587741.jpg", + "date": "2019-05-28T16:51:12+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "celebration-colorful-colourful-587741.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "celebration-colorful-colourful-587741", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-colorful-colourful-587741.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-colorful-colourful-587741.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-colorful-colourful-587741.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-colorful-colourful-587741.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-colorful-colourful-587741.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-colorful-colourful-587741.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-colorful-colourful-587741.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-colorful-colourful-587741.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-colorful-colourful-587741.jpg?w=288" + }, + "height": 3617, + "width": 5425, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/377", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/377/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 376, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-christmas-dark-625789.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/celebration-christmas-dark-625789.jpg", + "date": "2019-05-28T16:51:10+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "celebration-christmas-dark-625789.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "celebration-christmas-dark-625789", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-christmas-dark-625789.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-christmas-dark-625789.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-christmas-dark-625789.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-christmas-dark-625789.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-christmas-dark-625789.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-christmas-dark-625789.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-christmas-dark-625789.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-christmas-dark-625789.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-christmas-dark-625789.jpg?w=256" + }, + "height": 3024, + "width": 4032, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/376", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/376/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 375, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/catering-decoration-dinner-57980.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/catering-decoration-dinner-57980.jpg", + "date": "2019-05-28T16:51:08+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "catering-decoration-dinner-57980.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "catering-decoration-dinner-57980", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/catering-decoration-dinner-57980.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/catering-decoration-dinner-57980.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/catering-decoration-dinner-57980.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/catering-decoration-dinner-57980.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/catering-decoration-dinner-57980.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/catering-decoration-dinner-57980.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/catering-decoration-dinner-57980.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/catering-decoration-dinner-57980.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/catering-decoration-dinner-57980.jpg?w=288" + }, + "height": 4000, + "width": 6000, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/375", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/375/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 374, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/carnival-carousel-circus-992763.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/carnival-carousel-circus-992763.jpg", + "date": "2019-05-28T16:51:07+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "carnival-carousel-circus-992763.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "carnival-carousel-circus-992763", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/carnival-carousel-circus-992763.jpg?w=100", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/carnival-carousel-circus-992763.jpg?w=200", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/carnival-carousel-circus-992763.jpg?w=683", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/carnival-carousel-circus-992763.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/carnival-carousel-circus-992763.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/carnival-carousel-circus-992763.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/carnival-carousel-circus-992763.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/carnival-carousel-circus-992763.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/carnival-carousel-circus-992763.jpg?w=128" + }, + "height": 5184, + "width": 3456, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/374", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/374/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 373, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/camera-macro-optics-122400.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/camera-macro-optics-122400.jpg", + "date": "2019-05-28T16:51:04+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "camera-macro-optics-122400.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "camera-macro-optics-122400", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/camera-macro-optics-122400.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/camera-macro-optics-122400.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/camera-macro-optics-122400.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/camera-macro-optics-122400.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/camera-macro-optics-122400.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/camera-macro-optics-122400.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/camera-macro-optics-122400.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/camera-macro-optics-122400.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/camera-macro-optics-122400.jpg?w=288" + }, + "height": 3840, + "width": 5760, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/373", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/373/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 372, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/camera-cup-device-821750.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/camera-cup-device-821750.jpg", + "date": "2019-05-28T16:51:02+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "camera-cup-device-821750.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "camera-cup-device-821750", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/camera-cup-device-821750.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/camera-cup-device-821750.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/camera-cup-device-821750.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/camera-cup-device-821750.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/camera-cup-device-821750.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/camera-cup-device-821750.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/camera-cup-device-821750.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/camera-cup-device-821750.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/camera-cup-device-821750.jpg?w=281" + }, + "height": 1367, + "width": 2000, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/372", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/372/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 371, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/bright-burning-celebrate-288478.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/bright-burning-celebrate-288478.jpg", + "date": "2019-05-28T16:51:00+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "bright-burning-celebrate-288478.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "bright-burning-celebrate-288478", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/bright-burning-celebrate-288478.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/bright-burning-celebrate-288478.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/bright-burning-celebrate-288478.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/bright-burning-celebrate-288478.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/bright-burning-celebrate-288478.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/bright-burning-celebrate-288478.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/bright-burning-celebrate-288478.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/bright-burning-celebrate-288478.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/bright-burning-celebrate-288478.jpg?w=256" + }, + "height": 3456, + "width": 4608, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/371", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/371/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 370, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/boat-branch-color-772429.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/boat-branch-color-772429.jpg", + "date": "2019-05-28T16:50:57+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "boat-branch-color-772429.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "boat-branch-color-772429", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/boat-branch-color-772429.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/boat-branch-color-772429.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/boat-branch-color-772429.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/boat-branch-color-772429.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/boat-branch-color-772429.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/boat-branch-color-772429.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/boat-branch-color-772429.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/boat-branch-color-772429.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/boat-branch-color-772429.jpg?w=288" + }, + "height": 3739, + "width": 5600, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/370", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/370/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 369, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/bloom-blossom-colorful-69776.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/bloom-blossom-colorful-69776.jpg", + "date": "2019-05-28T16:50:55+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "bloom-blossom-colorful-69776.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "bloom-blossom-colorful-69776", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/bloom-blossom-colorful-69776.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/bloom-blossom-colorful-69776.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/bloom-blossom-colorful-69776.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/bloom-blossom-colorful-69776.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/bloom-blossom-colorful-69776.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/bloom-blossom-colorful-69776.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/bloom-blossom-colorful-69776.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/bloom-blossom-colorful-69776.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/bloom-blossom-colorful-69776.jpg?w=256" + }, + "height": 2448, + "width": 3264, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/369", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/369/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 368, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/bloom-blossom-colorful-66902.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/bloom-blossom-colorful-66902.jpg", + "date": "2019-05-28T16:50:53+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "bloom-blossom-colorful-66902.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "bloom-blossom-colorful-66902", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/bloom-blossom-colorful-66902.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/bloom-blossom-colorful-66902.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/bloom-blossom-colorful-66902.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/bloom-blossom-colorful-66902.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/bloom-blossom-colorful-66902.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/bloom-blossom-colorful-66902.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/bloom-blossom-colorful-66902.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/bloom-blossom-colorful-66902.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/bloom-blossom-colorful-66902.jpg?w=290" + }, + "height": 2024, + "width": 3056, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/368", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/368/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 367, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/black-forest-conifer-countryside-158316.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/black-forest-conifer-countryside-158316.jpg", + "date": "2019-05-28T16:50:51+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "black-forest-conifer-countryside-158316.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "black-forest-conifer-countryside-158316", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/black-forest-conifer-countryside-158316.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/black-forest-conifer-countryside-158316.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/black-forest-conifer-countryside-158316.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/black-forest-conifer-countryside-158316.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/black-forest-conifer-countryside-158316.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/black-forest-conifer-countryside-158316.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/black-forest-conifer-countryside-158316.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/black-forest-conifer-countryside-158316.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/black-forest-conifer-countryside-158316.jpg?w=288" + }, + "height": 2633, + "width": 3956, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/367", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/367/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 365, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/beach-children-family-39691.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/beach-children-family-39691.jpg", + "date": "2019-05-28T16:50:47+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "beach-children-family-39691.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "beach-children-family-39691", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/beach-children-family-39691.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/beach-children-family-39691.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/beach-children-family-39691.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/beach-children-family-39691.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/beach-children-family-39691.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/beach-children-family-39691.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/beach-children-family-39691.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/beach-children-family-39691.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/beach-children-family-39691.jpg?w=288" + }, + "height": 2446, + "width": 3669, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/365", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/365/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 364, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/bass-guitar-chord-close-up-96380.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/bass-guitar-chord-close-up-96380.jpg", + "date": "2019-05-28T16:50:45+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "bass-guitar-chord-close-up-96380.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "bass-guitar-chord-close-up-96380", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/bass-guitar-chord-close-up-96380.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/bass-guitar-chord-close-up-96380.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/bass-guitar-chord-close-up-96380.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/bass-guitar-chord-close-up-96380.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/bass-guitar-chord-close-up-96380.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/bass-guitar-chord-close-up-96380.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/bass-guitar-chord-close-up-96380.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/bass-guitar-chord-close-up-96380.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/bass-guitar-chord-close-up-96380.jpg?w=288" + }, + "height": 3648, + "width": 5472, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/364", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/364/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 363, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/barefoot-beach-cheerful-1574653.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/barefoot-beach-cheerful-1574653.jpg", + "date": "2019-05-28T16:50:43+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "barefoot-beach-cheerful-1574653.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "barefoot-beach-cheerful-1574653", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/barefoot-beach-cheerful-1574653.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/barefoot-beach-cheerful-1574653.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/barefoot-beach-cheerful-1574653.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/barefoot-beach-cheerful-1574653.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/barefoot-beach-cheerful-1574653.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/barefoot-beach-cheerful-1574653.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/barefoot-beach-cheerful-1574653.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/barefoot-beach-cheerful-1574653.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/barefoot-beach-cheerful-1574653.jpg?w=288" + }, + "height": 4480, + "width": 6720, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/363", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/363/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 362, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/band-concert-festival-167473.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/band-concert-festival-167473.jpg", + "date": "2019-05-28T16:50:41+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "band-concert-festival-167473.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "band-concert-festival-167473", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/band-concert-festival-167473.jpg?w=99", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/band-concert-festival-167473.jpg?w=199", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/band-concert-festival-167473.jpg?w=678", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/band-concert-festival-167473.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/band-concert-festival-167473.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/band-concert-festival-167473.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/band-concert-festival-167473.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/band-concert-festival-167473.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/band-concert-festival-167473.jpg?w=127" + }, + "height": 4928, + "width": 3264, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/362", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/362/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 361, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/band-concert-entertainment-1456642.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/band-concert-entertainment-1456642.jpg", + "date": "2019-05-28T16:50:40+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "band-concert-entertainment-1456642.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "band-concert-entertainment-1456642", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/band-concert-entertainment-1456642.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/band-concert-entertainment-1456642.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/band-concert-entertainment-1456642.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/band-concert-entertainment-1456642.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/band-concert-entertainment-1456642.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/band-concert-entertainment-1456642.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/band-concert-entertainment-1456642.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/band-concert-entertainment-1456642.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/band-concert-entertainment-1456642.jpg?w=288" + }, + "height": 3304, + "width": 4956, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/361", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/361/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 360, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/band-beat-concert-210799.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/band-beat-concert-210799.jpg", + "date": "2019-05-28T16:50:38+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "band-beat-concert-210799.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "band-beat-concert-210799", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/band-beat-concert-210799.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/band-beat-concert-210799.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/band-beat-concert-210799.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/band-beat-concert-210799.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/band-beat-concert-210799.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/band-beat-concert-210799.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/band-beat-concert-210799.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/band-beat-concert-210799.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/band-beat-concert-210799.jpg?w=256" + }, + "height": 2352, + "width": 3136, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/360", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/360/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 359, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/band-bass-guitar-concert-1588075.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/band-bass-guitar-concert-1588075.jpg", + "date": "2019-05-28T16:50:36+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "band-bass-guitar-concert-1588075.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "band-bass-guitar-concert-1588075", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/band-bass-guitar-concert-1588075.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/band-bass-guitar-concert-1588075.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/band-bass-guitar-concert-1588075.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/band-bass-guitar-concert-1588075.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/band-bass-guitar-concert-1588075.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/band-bass-guitar-concert-1588075.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/band-bass-guitar-concert-1588075.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/band-bass-guitar-concert-1588075.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/band-bass-guitar-concert-1588075.jpg?w=290" + }, + "height": 3252, + "width": 4917, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/359", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/359/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 358, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/ball-cheers-crowd-59884.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/ball-cheers-crowd-59884.jpg", + "date": "2019-05-28T16:50:34+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "ball-cheers-crowd-59884.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "ball-cheers-crowd-59884", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/ball-cheers-crowd-59884.jpg?w=100", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/ball-cheers-crowd-59884.jpg?w=199", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/ball-cheers-crowd-59884.jpg?w=681", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/ball-cheers-crowd-59884.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/ball-cheers-crowd-59884.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/ball-cheers-crowd-59884.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/ball-cheers-crowd-59884.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/ball-cheers-crowd-59884.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/ball-cheers-crowd-59884.jpg?w=128" + }, + "height": 6016, + "width": 4000, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/358", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/358/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 357, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/autumn-colorful-colourful-33109.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/autumn-colorful-colourful-33109.jpg", + "date": "2019-05-28T16:50:33+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "autumn-colorful-colourful-33109.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "autumn-colorful-colourful-33109", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/autumn-colorful-colourful-33109.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/autumn-colorful-colourful-33109.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/autumn-colorful-colourful-33109.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/autumn-colorful-colourful-33109.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/autumn-colorful-colourful-33109.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/autumn-colorful-colourful-33109.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/autumn-colorful-colourful-33109.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/autumn-colorful-colourful-33109.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/autumn-colorful-colourful-33109.jpg?w=288" + }, + "height": 2304, + "width": 3456, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/357", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/357/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 356, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/autumn-autumn-colours-color-1448899.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/autumn-autumn-colours-color-1448899.jpg", + "date": "2019-05-28T16:50:31+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "autumn-autumn-colours-color-1448899.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "autumn-autumn-colours-color-1448899", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/autumn-autumn-colours-color-1448899.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/autumn-autumn-colours-color-1448899.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/autumn-autumn-colours-color-1448899.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/autumn-autumn-colours-color-1448899.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/autumn-autumn-colours-color-1448899.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/autumn-autumn-colours-color-1448899.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/autumn-autumn-colours-color-1448899.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/autumn-autumn-colours-color-1448899.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/autumn-autumn-colours-color-1448899.jpg?w=263" + }, + "height": 2557, + "width": 3496, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/356", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/356/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 355, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/audience-club-colors-1481276.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/audience-club-colors-1481276.jpg", + "date": "2019-05-28T16:50:29+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "audience-club-colors-1481276.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "audience-club-colors-1481276", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/audience-club-colors-1481276.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/audience-club-colors-1481276.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/audience-club-colors-1481276.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/audience-club-colors-1481276.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/audience-club-colors-1481276.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/audience-club-colors-1481276.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/audience-club-colors-1481276.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/audience-club-colors-1481276.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/audience-club-colors-1481276.jpg?w=288" + }, + "height": 3408, + "width": 5112, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/355", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/355/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 354, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/audience-celebration-concert-1190297.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/audience-celebration-concert-1190297.jpg", + "date": "2019-05-28T16:50:27+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "audience-celebration-concert-1190297.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "audience-celebration-concert-1190297", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/audience-celebration-concert-1190297.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/audience-celebration-concert-1190297.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/audience-celebration-concert-1190297.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/audience-celebration-concert-1190297.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/audience-celebration-concert-1190297.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/audience-celebration-concert-1190297.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/audience-celebration-concert-1190297.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/audience-celebration-concert-1190297.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/audience-celebration-concert-1190297.jpg?w=288" + }, + "height": 2200, + "width": 3300, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/354", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/354/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 353, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/audience-band-concert-1105666.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/audience-band-concert-1105666.jpg", + "date": "2019-05-28T16:50:25+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "audience-band-concert-1105666.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "audience-band-concert-1105666", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/audience-band-concert-1105666.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/audience-band-concert-1105666.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/audience-band-concert-1105666.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/audience-band-concert-1105666.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/audience-band-concert-1105666.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/audience-band-concert-1105666.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/audience-band-concert-1105666.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/audience-band-concert-1105666.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/audience-band-concert-1105666.jpg?w=288" + }, + "height": 4480, + "width": 6720, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/353", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/353/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 352, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/audience-back-view-celebration-1267350.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/audience-back-view-celebration-1267350.jpg", + "date": "2019-05-28T16:50:23+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "audience-back-view-celebration-1267350.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "audience-back-view-celebration-1267350", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/audience-back-view-celebration-1267350.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/audience-back-view-celebration-1267350.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/audience-back-view-celebration-1267350.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/audience-back-view-celebration-1267350.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/audience-back-view-celebration-1267350.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/audience-back-view-celebration-1267350.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/audience-back-view-celebration-1267350.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/audience-back-view-celebration-1267350.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/audience-back-view-celebration-1267350.jpg?w=288" + }, + "height": 2410, + "width": 3610, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/352", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/352/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 351, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/astronomy-cosmos-dark-733475.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/astronomy-cosmos-dark-733475.jpg", + "date": "2019-05-28T16:50:21+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "astronomy-cosmos-dark-733475.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "astronomy-cosmos-dark-733475", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/astronomy-cosmos-dark-733475.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/astronomy-cosmos-dark-733475.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/astronomy-cosmos-dark-733475.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/astronomy-cosmos-dark-733475.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/astronomy-cosmos-dark-733475.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/astronomy-cosmos-dark-733475.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/astronomy-cosmos-dark-733475.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/astronomy-cosmos-dark-733475.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/astronomy-cosmos-dark-733475.jpg?w=316" + }, + "height": 3646, + "width": 6000, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/351", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/351/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 350, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/asphalt-environment-grass-239520.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/asphalt-environment-grass-239520.jpg", + "date": "2019-05-28T16:50:18+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "asphalt-environment-grass-239520.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "asphalt-environment-grass-239520", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/asphalt-environment-grass-239520.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/asphalt-environment-grass-239520.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/asphalt-environment-grass-239520.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/asphalt-environment-grass-239520.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/asphalt-environment-grass-239520.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/asphalt-environment-grass-239520.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/asphalt-environment-grass-239520.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/asphalt-environment-grass-239520.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/asphalt-environment-grass-239520.jpg?w=289" + }, + "height": 3799, + "width": 5714, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/350", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/350/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 349, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/asphalt-buildings-business-1319839.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/asphalt-buildings-business-1319839.jpg", + "date": "2019-05-28T16:50:16+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "asphalt-buildings-business-1319839.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "asphalt-buildings-business-1319839", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/asphalt-buildings-business-1319839.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/asphalt-buildings-business-1319839.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/asphalt-buildings-business-1319839.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/asphalt-buildings-business-1319839.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/asphalt-buildings-business-1319839.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/asphalt-buildings-business-1319839.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/asphalt-buildings-business-1319839.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/asphalt-buildings-business-1319839.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/asphalt-buildings-business-1319839.jpg?w=288" + }, + "height": 4000, + "width": 6000, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/349", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/349/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 348, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/artist-cap-close-up-1460037.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/artist-cap-close-up-1460037.jpg", + "date": "2019-05-28T16:50:13+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "artist-cap-close-up-1460037.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "artist-cap-close-up-1460037", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/artist-cap-close-up-1460037.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/artist-cap-close-up-1460037.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/artist-cap-close-up-1460037.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/artist-cap-close-up-1460037.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/artist-cap-close-up-1460037.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/artist-cap-close-up-1460037.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/artist-cap-close-up-1460037.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/artist-cap-close-up-1460037.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/artist-cap-close-up-1460037.jpg?w=287" + }, + "height": 2592, + "width": 3872, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/348", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/348/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 347, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/aromatherapy-beautiful-bouquet-1061744.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/aromatherapy-beautiful-bouquet-1061744.jpg", + "date": "2019-05-28T16:50:11+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "aromatherapy-beautiful-bouquet-1061744.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "aromatherapy-beautiful-bouquet-1061744", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/aromatherapy-beautiful-bouquet-1061744.jpg?w=100", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/aromatherapy-beautiful-bouquet-1061744.jpg?w=200", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/aromatherapy-beautiful-bouquet-1061744.jpg?w=683", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/aromatherapy-beautiful-bouquet-1061744.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/aromatherapy-beautiful-bouquet-1061744.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/aromatherapy-beautiful-bouquet-1061744.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/aromatherapy-beautiful-bouquet-1061744.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/aromatherapy-beautiful-bouquet-1061744.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/aromatherapy-beautiful-bouquet-1061744.jpg?w=128" + }, + "height": 5472, + "width": 3648, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/347", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/347/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 346, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-buildings-business-1775307.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/architecture-buildings-business-1775307.jpg", + "date": "2019-05-28T16:50:08+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "architecture-buildings-business-1775307.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "architecture-buildings-business-1775307", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-buildings-business-1775307.jpg?w=100", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-buildings-business-1775307.jpg?w=200", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-buildings-business-1775307.jpg?w=683", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-buildings-business-1775307.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-buildings-business-1775307.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-buildings-business-1775307.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-buildings-business-1775307.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-buildings-business-1775307.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-buildings-business-1775307.jpg?w=128" + }, + "height": 5184, + "width": 3456, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/346", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/346/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 345, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-buildings-business-230875.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/architecture-buildings-business-230875.jpg", + "date": "2019-05-28T16:50:05+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "architecture-buildings-business-230875.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "architecture-buildings-business-230875", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-buildings-business-230875.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-buildings-business-230875.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-buildings-business-230875.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-buildings-business-230875.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-buildings-business-230875.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-buildings-business-230875.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-buildings-business-230875.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-buildings-business-230875.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-buildings-business-230875.jpg?w=289" + }, + "height": 3897, + "width": 5861, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/345", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/345/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 344, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-bright-building-574043.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/architecture-bright-building-574043.jpg", + "date": "2019-05-28T16:50:02+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "architecture-bright-building-574043.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "architecture-bright-building-574043", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-bright-building-574043.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-bright-building-574043.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-bright-building-574043.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-bright-building-574043.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-bright-building-574043.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-bright-building-574043.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-bright-building-574043.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-bright-building-574043.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-bright-building-574043.jpg?w=288" + }, + "height": 4000, + "width": 6000, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/344", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/344/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 343, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-bridge-connection-417054.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/architecture-bridge-connection-417054.jpg", + "date": "2019-05-28T16:50:00+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "architecture-bridge-connection-417054.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "architecture-bridge-connection-417054", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-bridge-connection-417054.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-bridge-connection-417054.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-bridge-connection-417054.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-bridge-connection-417054.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-bridge-connection-417054.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-bridge-connection-417054.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-bridge-connection-417054.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-bridge-connection-417054.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-bridge-connection-417054.jpg?w=384" + }, + "height": 1772, + "width": 3543, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/343", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/343/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 342, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-balloons-balls-698907.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/architecture-balloons-balls-698907.jpg", + "date": "2019-05-28T16:49:58+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "architecture-balloons-balls-698907.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "architecture-balloons-balls-698907", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-balloons-balls-698907.jpg?w=113", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-balloons-balls-698907.jpg?w=225", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-balloons-balls-698907.jpg?w=768", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-balloons-balls-698907.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-balloons-balls-698907.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-balloons-balls-698907.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-balloons-balls-698907.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-balloons-balls-698907.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-balloons-balls-698907.jpg?w=144" + }, + "height": 3264, + "width": 2448, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/342", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/342/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 341, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-autumn-bench-206673.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/architecture-autumn-bench-206673.jpg", + "date": "2019-05-28T16:49:56+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "architecture-autumn-bench-206673.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "architecture-autumn-bench-206673", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-autumn-bench-206673.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-autumn-bench-206673.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-autumn-bench-206673.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-autumn-bench-206673.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-autumn-bench-206673.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-autumn-bench-206673.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-autumn-bench-206673.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-autumn-bench-206673.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/architecture-autumn-bench-206673.jpg?w=290" + }, + "height": 4910, + "width": 7419, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/341", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/341/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 340, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/arched-window-architecture-beach-572780.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/arched-window-architecture-beach-572780.jpg", + "date": "2019-05-28T16:49:52+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "arched-window-architecture-beach-572780.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "arched-window-architecture-beach-572780", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/arched-window-architecture-beach-572780.jpg?w=128", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/arched-window-architecture-beach-572780.jpg?w=256", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/arched-window-architecture-beach-572780.jpg?w=874", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/arched-window-architecture-beach-572780.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/arched-window-architecture-beach-572780.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/arched-window-architecture-beach-572780.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/arched-window-architecture-beach-572780.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/arched-window-architecture-beach-572780.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/arched-window-architecture-beach-572780.jpg?w=164" + }, + "height": 4274, + "width": 3648, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/340", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/340/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 339, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/applause-audience-band-196652.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/applause-audience-band-196652.jpg", + "date": "2019-05-28T16:49:50+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "applause-audience-band-196652.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "applause-audience-band-196652", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/applause-audience-band-196652.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/applause-audience-band-196652.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/applause-audience-band-196652.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/applause-audience-band-196652.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/applause-audience-band-196652.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/applause-audience-band-196652.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/applause-audience-band-196652.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/applause-audience-band-196652.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/applause-audience-band-196652.jpg?w=288" + }, + "height": 2667, + "width": 4000, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/339", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/339/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 338, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/antelope-canyon-canyon-cave-87419.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/antelope-canyon-canyon-cave-87419.jpg", + "date": "2019-05-28T16:49:48+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "antelope-canyon-canyon-cave-87419.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "antelope-canyon-canyon-cave-87419", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/antelope-canyon-canyon-cave-87419.jpg?w=113", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/antelope-canyon-canyon-cave-87419.jpg?w=225", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/antelope-canyon-canyon-cave-87419.jpg?w=768", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/antelope-canyon-canyon-cave-87419.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/antelope-canyon-canyon-cave-87419.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/antelope-canyon-canyon-cave-87419.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/antelope-canyon-canyon-cave-87419.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/antelope-canyon-canyon-cave-87419.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/antelope-canyon-canyon-cave-87419.jpg?w=144" + }, + "height": 3264, + "width": 2448, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/338", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/338/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + }, + { + "ID": 337, + "URL": "https://infocusphotographers.files.wordpress.com/2019/05/animal-aquatic-corals-847393.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/05/animal-aquatic-corals-847393.jpg", + "date": "2019-05-28T16:49:46+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "animal-aquatic-corals-847393.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "animal-aquatic-corals-847393", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/05/animal-aquatic-corals-847393.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/05/animal-aquatic-corals-847393.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/05/animal-aquatic-corals-847393.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/05/animal-aquatic-corals-847393.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/05/animal-aquatic-corals-847393.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/05/animal-aquatic-corals-847393.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/05/animal-aquatic-corals-847393.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/05/animal-aquatic-corals-847393.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/05/animal-aquatic-corals-847393.jpg?w=256" + }, + "height": 3000, + "width": 4000, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/337", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/337/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + } + ], + "meta": { + "next_page": "value=2019-05-28T16%3A49%3A46%2B00%3A00&id=337" + } + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/media_151.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/media_151.json new file mode 100644 index 000000000000..b6b08a89cc10 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/media_151.json @@ -0,0 +1,66 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/106707880/media/151/", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "ID": 151, + "URL": "https://infocusphotographers.files.wordpress.com/2019/02/adult-band-concert-995301.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/02/adult-band-concert-995301.jpg", + "date": "2019-02-06T21:59:35+00:00", + "post_ID": 0, + "author_ID": 742098, + "file": "adult-band-concert-995301.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "adult-band-concert-995301", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/02/adult-band-concert-995301.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/02/adult-band-concert-995301.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/02/adult-band-concert-995301.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/02/adult-band-concert-995301.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/02/adult-band-concert-995301.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/02/adult-band-concert-995301.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/02/adult-band-concert-995301.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/02/adult-band-concert-995301.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/02/adult-band-concert-995301.jpg?w=288" + }, + "height": 3456, + "width": 5184, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/151", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/151/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/media_238.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/media_238.json new file mode 100644 index 000000000000..4c8241529235 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/media_238.json @@ -0,0 +1,67 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/106707880/media/238/", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "ID": 238, + "URL": "https://infocusphotographers.files.wordpress.com/2019/03/art-bright-celebration-1313817.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/03/art-bright-celebration-1313817.jpg", + "date": "2019-03-20T23:44:49+00:00", + "post_ID": 237, + "author_ID": 14151046, + "file": "art-bright-celebration-1313817.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "art-bright-celebration-1313817", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/03/art-bright-celebration-1313817.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/03/art-bright-celebration-1313817.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/03/art-bright-celebration-1313817.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/03/art-bright-celebration-1313817.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/03/art-bright-celebration-1313817.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/03/art-bright-celebration-1313817.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/03/art-bright-celebration-1313817.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/03/art-bright-celebration-1313817.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/03/art-bright-celebration-1313817.jpg?w=311" + }, + "height": 2628, + "width": 4256, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/238", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/238/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/237" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/media_294.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/media_294.json new file mode 100644 index 000000000000..628687ae7244 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/media_294.json @@ -0,0 +1,64 @@ +{ + "request": { + "method": "GET", + "urlPath": "/wp/v2/sites/106707880/media/294", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "ID": 294, + "URL": "https://e2eflowtestingmobile.files.wordpress.com/2019/05/img_0111-14.jpg", + "guid": "http://e2eflowtestingmobile.files.wordpress.com/2019/05/img_0111-14.jpg", + "date": "2019-05-08T09:49:00+00:00", + "post_ID": 295, + "author_ID": 152748359, + "file": "img_0111-14.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "img_0111", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://e2eflowtestingmobile.files.wordpress.com/2019/05/img_0111-14.jpg?w=150", + "medium": "https://e2eflowtestingmobile.files.wordpress.com/2019/05/img_0111-14.jpg?w=300", + "large": "https://e2eflowtestingmobile.files.wordpress.com/2019/05/img_0111-14.jpg?w=1024", + "post-thumbnail": "https://e2eflowtestingmobile.files.wordpress.com/2019/05/img_0111-14.jpg?w=740&h=430&crop=1", + "independent-publisher-2-banner": "https://e2eflowtestingmobile.files.wordpress.com/2019/05/img_0111-14.jpg?w=1440&h=600&crop=1", + "independent-publisher-2-full-width": "https://e2eflowtestingmobile.files.wordpress.com/2019/05/img_0111-14.jpg?w=1100" + }, + "height": 3024, + "width": 4032, + "exif": { + "aperture": "2.4", + "credit": "", + "camera": "iPhone X", + "caption": "", + "created_timestamp": "1522412059", + "copyright": "", + "focal_length": "6", + "iso": "16", + "shutter_speed": "0.0047846889952153", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/294", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/294/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/295" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/media_62.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/media_62.json new file mode 100644 index 000000000000..a729170ab632 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/media_62.json @@ -0,0 +1,67 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/106707880/media/62/", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "ID": 62, + "URL": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1449761485030-c9bf16154670.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2016/02/photo-1449761485030-c9bf16154670.jpg", + "date": "2016-02-11T00:18:19+00:00", + "post_ID": 24, + "author_ID": 64766782, + "file": "photo-1449761485030-c9bf16154670.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "photo-1449761485030-c9bf16154670", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1449761485030-c9bf16154670.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1449761485030-c9bf16154670.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1449761485030-c9bf16154670.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1449761485030-c9bf16154670.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1449761485030-c9bf16154670.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1449761485030-c9bf16154670.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1449761485030-c9bf16154670.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1449761485030-c9bf16154670.jpg?w=1080&h=720&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1449761485030-c9bf16154670.jpg?w=288" + }, + "height": 720, + "width": 1080, + "exif": { + "aperture": 0, + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": 0, + "copyright": "", + "focal_length": 0, + "iso": 0, + "shutter_speed": 0, + "title": "", + "orientation": 0, + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/62", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/62/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/24" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/media_82.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/media_82.json new file mode 100644 index 000000000000..6586d469e882 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/media_82.json @@ -0,0 +1,67 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/106707880/media/82/", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "ID": 82, + "URL": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1453857271477-4f9a4081966e1.jpeg", + "guid": "http://infocusphotographers.files.wordpress.com/2016/02/photo-1453857271477-4f9a4081966e1.jpeg", + "date": "2016-02-11T00:20:47+00:00", + "post_ID": 24, + "author_ID": 64766782, + "file": "photo-1453857271477-4f9a4081966e1.jpeg", + "mime_type": "image/jpeg", + "extension": "jpeg", + "title": "photo-1453857271477-4f9a4081966e", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1453857271477-4f9a4081966e1.jpeg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1453857271477-4f9a4081966e1.jpeg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1453857271477-4f9a4081966e1.jpeg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1453857271477-4f9a4081966e1.jpeg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1453857271477-4f9a4081966e1.jpeg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1453857271477-4f9a4081966e1.jpeg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1453857271477-4f9a4081966e1.jpeg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1453857271477-4f9a4081966e1.jpeg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1453857271477-4f9a4081966e1.jpeg?w=310" + }, + "height": 2384, + "width": 3853, + "exif": { + "aperture": 0, + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": 0, + "copyright": "", + "focal_length": 0, + "iso": 0, + "shutter_speed": 0, + "title": "", + "orientation": 0, + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/82", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/82/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/24" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/rest_v11_sites_158396482_media.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/rest_v11_sites_158396482_media.json new file mode 100644 index 000000000000..5cf51d22f8e2 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/rest_v11_sites_158396482_media.json @@ -0,0 +1,4404 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/rest/v1.1/sites/106707880/media(/)?($|\\?.*)" + }, + "response": { + "status": 200, + "jsonBody": { + "found": 73, + "media": [ + { + "ID": 144, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-jean-van-der-meulen-2416933.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/10/pexels-jean-van-der-meulen-2416933.jpg", + "date": "2020-10-07T09:32:40-07:00", + "post_ID": 0, + "author_ID": 14151046, + "file": "pexels-jean-van-der-meulen-2416933.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-jean-van-der-meulen-2416933", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-jean-van-der-meulen-2416933.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-jean-van-der-meulen-2416933.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-jean-van-der-meulen-2416933.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-jean-van-der-meulen-2416933.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-jean-van-der-meulen-2416933.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-jean-van-der-meulen-2416933.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-jean-van-der-meulen-2416933.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-jean-van-der-meulen-2416933.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-jean-van-der-meulen-2416933.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-jean-van-der-meulen-2416933.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-jean-van-der-meulen-2416933.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-jean-van-der-meulen-2416933.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-jean-van-der-meulen-2416933.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-jean-van-der-meulen-2416933.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-jean-van-der-meulen-2416933.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-jean-van-der-meulen-2416933.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-jean-van-der-meulen-2416933.jpg?w=1568" + }, + "height": 3563, + "width": 5184, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/144", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/144/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 142, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-265004.jpeg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-265004.jpeg", + "date": "2020-10-07T09:27:59-07:00", + "post_ID": 134, + "author_ID": 14151046, + "file": "pexels-photo-265004.jpeg", + "mime_type": "image/jpeg", + "extension": "jpeg", + "title": "apartment architecture book bookcase", + "caption": "Photo by Pixabay on Pexels.com", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-265004.jpeg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-265004.jpeg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-265004.jpeg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-265004.jpeg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-265004.jpeg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-265004.jpeg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-265004.jpeg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-265004.jpeg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-265004.jpeg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-265004.jpeg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-265004.jpeg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-265004.jpeg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-265004.jpeg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-265004.jpeg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-265004.jpeg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-265004.jpeg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-265004.jpeg?w=1526" + }, + "height": 1300, + "width": 1526, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/142", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/142/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/posts/134" + } + } + }, + { + "ID": 141, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-534172.jpeg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-534172.jpeg", + "date": "2020-10-07T09:27:16-07:00", + "post_ID": 134, + "author_ID": 14151046, + "file": "pexels-photo-534172.jpeg", + "mime_type": "image/jpeg", + "extension": "jpeg", + "title": "apartment chairs clean contemporary", + "caption": "Photo by Pixabay on Pexels.com", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-534172.jpeg?w=103", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-534172.jpeg?w=207", + "large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-534172.jpeg?w=705", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-534172.jpeg?w=895&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-534172.jpeg?w=895&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-534172.jpeg?w=895&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-534172.jpeg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-534172.jpeg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-534172.jpeg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-534172.jpeg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-534172.jpeg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-534172.jpeg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-534172.jpeg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-534172.jpeg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-534172.jpeg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-534172.jpeg?w=895", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-534172.jpeg?w=895" + }, + "height": 1300, + "width": 895, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/141", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/141/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/posts/134" + } + } + }, + { + "ID": 140, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1457847.jpeg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1457847.jpeg", + "date": "2020-10-07T09:26:16-07:00", + "post_ID": 134, + "author_ID": 14151046, + "file": "pexels-photo-1457847.jpeg", + "mime_type": "image/jpeg", + "extension": "jpeg", + "title": "bathroom interior", + "caption": "Photo by Jean van der Meulen on Pexels.com", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1457847.jpeg?w=111", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1457847.jpeg?w=222", + "large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1457847.jpeg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1457847.jpeg?w=963&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1457847.jpeg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1457847.jpeg?w=963&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1457847.jpeg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1457847.jpeg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1457847.jpeg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1457847.jpeg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1457847.jpeg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1457847.jpeg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1457847.jpeg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1457847.jpeg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1457847.jpeg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1457847.jpeg?w=963", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1457847.jpeg?w=963" + }, + "height": 1300, + "width": 963, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/140", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/140/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/posts/134" + } + } + }, + { + "ID": 137, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1080696.jpeg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1080696.jpeg", + "date": "2020-10-07T09:25:22-07:00", + "post_ID": 134, + "author_ID": 14151046, + "file": "pexels-photo-1080696.jpeg", + "mime_type": "image/jpeg", + "extension": "jpeg", + "title": "black kettle beside condiment shakers and green fruits and plants on tray on brown wooden table", + "caption": "Photo by Mark McCammon on Pexels.com", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1080696.jpeg?w=100", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1080696.jpeg?w=200", + "large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1080696.jpeg?w=682", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1080696.jpeg?w=866&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1080696.jpeg?w=866&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1080696.jpeg?w=866&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1080696.jpeg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1080696.jpeg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1080696.jpeg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1080696.jpeg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1080696.jpeg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1080696.jpeg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1080696.jpeg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1080696.jpeg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1080696.jpeg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1080696.jpeg?w=866", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-1080696.jpeg?w=866" + }, + "height": 1300, + "width": 866, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/137", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/137/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/posts/134" + } + } + }, + { + "ID": 136, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-101808.jpeg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-101808.jpeg", + "date": "2020-10-07T09:24:59-07:00", + "post_ID": 134, + "author_ID": 14151046, + "file": "pexels-photo-101808.jpeg", + "mime_type": "image/jpeg", + "extension": "jpeg", + "title": "building metal house architecture", + "caption": "Photo by PhotoMIX Company on Pexels.com", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-101808.jpeg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-101808.jpeg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-101808.jpeg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-101808.jpeg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-101808.jpeg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-101808.jpeg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-101808.jpeg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-101808.jpeg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-101808.jpeg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-101808.jpeg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-101808.jpeg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-101808.jpeg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-101808.jpeg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-101808.jpeg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-101808.jpeg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-101808.jpeg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/10/pexels-photo-101808.jpeg?w=1568" + }, + "height": 1253, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/136", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/136/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/posts/134" + } + } + }, + { + "ID": 133, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/image-1.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/image-1.jpg", + "date": "2020-08-24T21:27:01-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "image-1.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "image-1", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/image-1.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/image-1.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/image-1.jpg?w=640", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/image-1.jpg?w=640&h=640&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/image-1.jpg?w=640&h=640&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/image-1.jpg?w=640&h=640&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/image-1.jpg?w=640&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/image-1.jpg?w=600&h=640&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/image-1.jpg?w=640&h=640&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/image-1.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/image-1.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/image-1.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/image-1.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/image-1.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/image-1.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/image-1.jpg?w=640", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/image-1.jpg?w=640" + }, + "height": 640, + "width": 640, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/133", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/133/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 132, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280222-1.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280222-1.jpg", + "date": "2020-08-24T21:01:01-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-280222-1.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-280222-1", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280222-1.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280222-1.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280222-1.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280222-1.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280222-1.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280222-1.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280222-1.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280222-1.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280222-1.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280222-1.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280222-1.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280222-1.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280222-1.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280222-1.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280222-1.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280222-1.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280222-1.jpg?w=1568" + }, + "height": 1249, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/132", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/132/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 131, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396132.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396132.jpg", + "date": "2020-08-24T21:01:01-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-1396132.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-1396132", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396132.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396132.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396132.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396132.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396132.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396132.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396132.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396132.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396132.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396132.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396132.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396132.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396132.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396132.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396132.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396132.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396132.jpg?w=1568" + }, + "height": 1253, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/131", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/131/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 130, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271795.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271795.jpg", + "date": "2020-08-24T21:01:01-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-271795.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-271795", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271795.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271795.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271795.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271795.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271795.jpg?w=900&h=1058&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271795.jpg?w=1200&h=1058&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271795.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271795.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271795.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271795.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271795.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271795.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271795.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271795.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271795.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271795.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271795.jpg?w=1568" + }, + "height": 1058, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/130", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/130/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 129, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271624.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271624.jpg", + "date": "2020-08-24T21:01:01-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-271624.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-271624", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271624.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271624.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271624.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271624.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271624.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271624.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271624.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271624.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271624.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271624.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271624.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271624.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271624.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271624.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271624.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271624.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271624.jpg?w=1568" + }, + "height": 1255, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/129", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/129/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 128, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3705529.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3705529.jpg", + "date": "2020-08-24T21:01:01-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-3705529.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-3705529", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3705529.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3705529.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3705529.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3705529.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3705529.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3705529.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3705529.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3705529.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3705529.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3705529.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3705529.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3705529.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3705529.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3705529.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3705529.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3705529.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3705529.jpg?w=1568" + }, + "height": 1245, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/128", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/128/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 127, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1454805.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1454805.jpg", + "date": "2020-08-24T21:01:01-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-1454805.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-1454805", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1454805.jpg?w=101", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1454805.jpg?w=201", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1454805.jpg?w=687", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1454805.jpg?w=872&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1454805.jpg?w=872&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1454805.jpg?w=872&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1454805.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1454805.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1454805.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1454805.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1454805.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1454805.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1454805.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1454805.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1454805.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1454805.jpg?w=872", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1454805.jpg?w=872" + }, + "height": 1300, + "width": 872, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/127", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/127/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 126, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259962.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259962.jpg", + "date": "2020-08-24T21:01:00-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-259962.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-259962", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259962.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259962.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259962.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259962.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259962.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259962.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259962.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259962.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259962.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259962.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259962.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259962.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259962.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259962.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259962.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259962.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259962.jpg?w=1568" + }, + "height": 1249, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/126", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/126/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 125, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749-1.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749-1.jpg", + "date": "2020-08-24T20:59:59-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "kitchen-stove-sink-kitchen-counter-349749-1.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "kitchen-stove-sink-kitchen-counter-349749-1", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749-1.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749-1.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749-1.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749-1.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749-1.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749-1.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749-1.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749-1.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749-1.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749-1.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749-1.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749-1.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749-1.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749-1.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749-1.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749-1.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749-1.jpg?w=1568" + }, + "height": 1245, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/125", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/125/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 124, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383-1.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383-1.jpg", + "date": "2020-08-24T20:59:59-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-1643383-1.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-1643383-1", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383-1.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383-1.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383-1.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383-1.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383-1.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383-1.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383-1.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383-1.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383-1.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383-1.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383-1.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383-1.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383-1.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383-1.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383-1.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383-1.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383-1.jpg?w=1568" + }, + "height": 1238, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/124", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/124/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 123, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-298842.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-298842.jpg", + "date": "2020-08-24T20:59:59-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-298842.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-298842", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-298842.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-298842.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-298842.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-298842.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-298842.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-298842.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-298842.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-298842.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-298842.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-298842.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-298842.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-298842.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-298842.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-298842.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-298842.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-298842.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-298842.jpg?w=1568" + }, + "height": 1253, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/123", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/123/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 122, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-276724.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-276724.jpg", + "date": "2020-08-24T20:59:58-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-276724.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-276724", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-276724.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-276724.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-276724.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-276724.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-276724.jpg?w=900&h=1058&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-276724.jpg?w=1200&h=1058&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-276724.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-276724.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-276724.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-276724.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-276724.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-276724.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-276724.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-276724.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-276724.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-276724.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-276724.jpg?w=1568" + }, + "height": 1058, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/122", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/122/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 121, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3933278.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3933278.jpg", + "date": "2020-08-24T20:59:58-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-3933278.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-3933278", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3933278.jpg?w=100", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3933278.jpg?w=200", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3933278.jpg?w=683", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3933278.jpg?w=867&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3933278.jpg?w=867&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3933278.jpg?w=867&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3933278.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3933278.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3933278.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3933278.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3933278.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3933278.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3933278.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3933278.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3933278.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3933278.jpg?w=867", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3933278.jpg?w=867" + }, + "height": 1300, + "width": 867, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/121", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/121/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 120, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3932930.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3932930.jpg", + "date": "2020-08-24T20:59:58-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-3932930.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-3932930", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3932930.jpg?w=100", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3932930.jpg?w=200", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3932930.jpg?w=683", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3932930.jpg?w=867&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3932930.jpg?w=867&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3932930.jpg?w=867&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3932930.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3932930.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3932930.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3932930.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3932930.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3932930.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3932930.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3932930.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3932930.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3932930.jpg?w=867", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3932930.jpg?w=867" + }, + "height": 1300, + "width": 867, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/120", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/120/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 119, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457842.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457842.jpg", + "date": "2020-08-24T20:59:58-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-1457842.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-1457842", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457842.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457842.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457842.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457842.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457842.jpg?w=900&h=1141&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457842.jpg?w=1200&h=1141&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457842.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457842.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457842.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457842.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457842.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457842.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457842.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457842.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457842.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457842.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457842.jpg?w=1568" + }, + "height": 1141, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/119", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/119/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 118, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-699459.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-699459.jpg", + "date": "2020-08-24T20:59:58-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-699459.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-699459", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-699459.jpg?w=113", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-699459.jpg?w=225", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-699459.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-699459.jpg?w=975&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-699459.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-699459.jpg?w=975&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-699459.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-699459.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-699459.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-699459.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-699459.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-699459.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-699459.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-699459.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-699459.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-699459.jpg?w=975", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-699459.jpg?w=975" + }, + "height": 1300, + "width": 975, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/118", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/118/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 117, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617-1.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617-1.jpg", + "date": "2020-08-24T20:58:37-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-210617-1.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-210617-1", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617-1.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617-1.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617-1.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617-1.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617-1.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617-1.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617-1.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617-1.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617-1.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617-1.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617-1.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617-1.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617-1.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617-1.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617-1.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617-1.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617-1.jpg?w=1568" + }, + "height": 1259, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/117", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/117/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 116, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-206172.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-206172.jpg", + "date": "2020-08-24T20:58:37-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-206172.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-206172", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-206172.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-206172.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-206172.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-206172.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-206172.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-206172.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-206172.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-206172.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-206172.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-206172.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-206172.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-206172.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-206172.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-206172.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-206172.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-206172.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-206172.jpg?w=1568" + }, + "height": 1253, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/116", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/116/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 115, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2101086.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2101086.jpg", + "date": "2020-08-24T20:57:57-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-2101086.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-2101086", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2101086.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2101086.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2101086.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2101086.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2101086.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2101086.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2101086.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2101086.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2101086.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2101086.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2101086.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2101086.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2101086.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2101086.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2101086.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2101086.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2101086.jpg?w=1568" + }, + "height": 1255, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/115", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/115/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 114, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-221024.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-221024.jpg", + "date": "2020-08-24T20:57:57-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-221024.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-221024", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-221024.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-221024.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-221024.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-221024.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-221024.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-221024.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-221024.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-221024.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-221024.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-221024.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-221024.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-221024.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-221024.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-221024.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-221024.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-221024.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-221024.jpg?w=1568" + }, + "height": 1259, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/114", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/114/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 113, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3209049.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3209049.jpg", + "date": "2020-08-24T20:57:56-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-3209049.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-3209049", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3209049.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3209049.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3209049.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3209049.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3209049.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3209049.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3209049.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3209049.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3209049.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3209049.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3209049.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3209049.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3209049.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3209049.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3209049.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3209049.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3209049.jpg?w=1568" + }, + "height": 1255, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/113", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/113/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 112, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151-1.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151-1.jpg", + "date": "2020-08-24T20:57:26-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-534151-1.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-534151-1", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151-1.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151-1.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151-1.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151-1.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151-1.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151-1.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151-1.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151-1.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151-1.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151-1.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151-1.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151-1.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151-1.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151-1.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151-1.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151-1.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151-1.jpg?w=1568" + }, + "height": 1255, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/112", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/112/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 111, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534172.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534172.jpg", + "date": "2020-08-24T20:57:26-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-534172.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-534172", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534172.jpg?w=103", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534172.jpg?w=207", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534172.jpg?w=705", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534172.jpg?w=895&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534172.jpg?w=895&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534172.jpg?w=895&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534172.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534172.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534172.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534172.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534172.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534172.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534172.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534172.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534172.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534172.jpg?w=895", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534172.jpg?w=895" + }, + "height": 1300, + "width": 895, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/111", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/111/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 110, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2062426.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2062426.jpg", + "date": "2020-08-24T20:56:44-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-2062426.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-2062426", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2062426.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2062426.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2062426.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2062426.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2062426.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2062426.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2062426.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2062426.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2062426.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2062426.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2062426.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2062426.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2062426.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2062426.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2062426.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2062426.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2062426.jpg?w=1568" + }, + "height": 1255, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/110", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/110/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 109, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1080721.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1080721.jpg", + "date": "2020-08-24T20:56:44-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-1080721.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-1080721", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1080721.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1080721.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1080721.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1080721.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1080721.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1080721.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1080721.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1080721.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1080721.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1080721.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1080721.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1080721.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1080721.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1080721.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1080721.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1080721.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1080721.jpg?w=1568" + }, + "height": 1253, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/109", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/109/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 108, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1125136.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1125136.jpg", + "date": "2020-08-24T20:56:44-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-1125136.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-1125136", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1125136.jpg?w=100", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1125136.jpg?w=200", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1125136.jpg?w=684", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1125136.jpg?w=868&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1125136.jpg?w=868&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1125136.jpg?w=868&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1125136.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1125136.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1125136.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1125136.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1125136.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1125136.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1125136.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1125136.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1125136.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1125136.jpg?w=868", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1125136.jpg?w=868" + }, + "height": 1300, + "width": 868, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/108", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/108/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 107, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571468.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571468.jpg", + "date": "2020-08-24T20:56:20-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-1571468.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-1571468", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571468.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571468.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571468.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571468.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571468.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571468.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571468.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571468.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571468.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571468.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571468.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571468.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571468.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571468.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571468.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571468.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571468.jpg?w=1568" + }, + "height": 1255, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/107", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/107/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 106, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571459.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571459.jpg", + "date": "2020-08-24T20:56:19-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-1571459.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-1571459", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571459.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571459.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571459.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571459.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571459.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571459.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571459.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571459.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571459.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571459.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571459.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571459.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571459.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571459.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571459.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571459.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571459.jpg?w=1568" + }, + "height": 1227, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/106", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/106/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 105, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1648768.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1648768.jpg", + "date": "2020-08-24T20:55:47-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-1648768.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-1648768", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1648768.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1648768.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1648768.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1648768.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1648768.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1648768.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1648768.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1648768.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1648768.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1648768.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1648768.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1648768.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1648768.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1648768.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1648768.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1648768.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1648768.jpg?w=1537" + }, + "height": 1300, + "width": 1537, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/105", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/105/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 104, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2747901.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2747901.jpg", + "date": "2020-08-24T20:55:47-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-2747901.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-2747901", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2747901.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2747901.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2747901.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2747901.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2747901.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2747901.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2747901.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2747901.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2747901.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2747901.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2747901.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2747901.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2747901.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2747901.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2747901.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2747901.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2747901.jpg?w=1568" + }, + "height": 1253, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/104", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/104/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 103, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643389.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643389.jpg", + "date": "2020-08-24T20:53:50-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-1643389.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-1643389", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643389.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643389.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643389.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643389.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643389.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643389.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643389.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643389.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643389.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643389.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643389.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643389.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643389.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643389.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643389.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643389.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643389.jpg?w=1568" + }, + "height": 1255, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/103", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/103/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 102, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617.jpg", + "date": "2020-08-24T20:53:49-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-210617.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-210617", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-210617.jpg?w=1568" + }, + "height": 1259, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/102", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/102/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 100, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151.jpg", + "date": "2020-08-24T20:53:49-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-534151.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-534151", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-534151.jpg?w=1568" + }, + "height": 1255, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/100", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/100/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 99, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396122.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396122.jpg", + "date": "2020-08-24T20:53:49-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-1396122.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-1396122", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396122.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396122.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396122.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396122.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396122.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396122.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396122.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396122.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396122.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396122.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396122.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396122.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396122.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396122.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396122.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396122.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1396122.jpg?w=1568" + }, + "height": 1253, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/99", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/99/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 98, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259593.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259593.jpg", + "date": "2020-08-24T20:53:49-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-259593.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-259593", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259593.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259593.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259593.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259593.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259593.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259593.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259593.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259593.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259593.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259593.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259593.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259593.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259593.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259593.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259593.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259593.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-259593.jpg?w=1568" + }, + "height": 1253, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/98", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/98/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 97, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-238385.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-238385.jpg", + "date": "2020-08-24T20:53:49-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-238385.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-238385", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-238385.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-238385.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-238385.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-238385.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-238385.jpg?w=900&h=1092&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-238385.jpg?w=1200&h=1092&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-238385.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-238385.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-238385.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-238385.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-238385.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-238385.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-238385.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-238385.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-238385.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-238385.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-238385.jpg?w=1568" + }, + "height": 1092, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/97", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/97/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 96, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571463.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571463.jpg", + "date": "2020-08-24T20:53:49-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-1571463.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-1571463", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571463.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571463.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571463.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571463.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571463.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571463.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571463.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571463.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571463.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571463.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571463.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571463.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571463.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571463.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571463.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571463.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1571463.jpg?w=1568" + }, + "height": 1255, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/96", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/96/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 95, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271622.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271622.jpg", + "date": "2020-08-24T20:53:49-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-271622.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-271622", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271622.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271622.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271622.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271622.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271622.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271622.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271622.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271622.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271622.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271622.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271622.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271622.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271622.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271622.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271622.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271622.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271622.jpg?w=1568" + }, + "height": 1253, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/95", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/95/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 94, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1543447.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1543447.jpg", + "date": "2020-08-24T20:53:49-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-1543447.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-1543447", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1543447.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1543447.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1543447.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1543447.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1543447.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1543447.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1543447.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1543447.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1543447.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1543447.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1543447.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1543447.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1543447.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1543447.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1543447.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1543447.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1543447.jpg?w=1568" + }, + "height": 1209, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/94", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/94/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 93, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3701434.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3701434.jpg", + "date": "2020-08-24T20:53:49-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-3701434.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-3701434", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3701434.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3701434.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3701434.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3701434.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3701434.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3701434.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3701434.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3701434.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3701434.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3701434.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3701434.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3701434.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3701434.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3701434.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3701434.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3701434.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3701434.jpg?w=1568" + }, + "height": 1300, + "width": 1733, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/93", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/93/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 92, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-261045.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-261045.jpg", + "date": "2020-08-24T20:53:49-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-261045.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-261045", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-261045.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-261045.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-261045.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-261045.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-261045.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-261045.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-261045.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-261045.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-261045.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-261045.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-261045.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-261045.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-261045.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-261045.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-261045.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-261045.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-261045.jpg?w=1568" + }, + "height": 1253, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/92", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/92/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 91, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2416932.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2416932.jpg", + "date": "2020-08-24T20:53:49-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-2416932.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-2416932", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2416932.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2416932.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2416932.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2416932.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2416932.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2416932.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2416932.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2416932.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2416932.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2416932.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2416932.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2416932.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2416932.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2416932.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2416932.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2416932.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2416932.jpg?w=1568" + }, + "height": 1300, + "width": 1781, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/91", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/91/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 90, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3724312.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3724312.jpg", + "date": "2020-08-24T20:53:49-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-3724312.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-3724312", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3724312.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3724312.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3724312.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3724312.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3724312.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3724312.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3724312.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3724312.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3724312.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3724312.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3724312.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3724312.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3724312.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3724312.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3724312.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3724312.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3724312.jpg?w=1568" + }, + "height": 1253, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/90", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/90/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 89, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2251247.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2251247.jpg", + "date": "2020-08-24T20:53:49-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-2251247.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-2251247", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2251247.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2251247.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2251247.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2251247.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2251247.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2251247.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2251247.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2251247.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2251247.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2251247.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2251247.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2251247.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2251247.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2251247.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2251247.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2251247.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2251247.jpg?w=1568" + }, + "height": 1253, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/89", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/89/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 88, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383.jpg", + "date": "2020-08-24T20:53:49-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-1643383.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-1643383", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1643383.jpg?w=1568" + }, + "height": 1238, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/88", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/88/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 87, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935338.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935338.jpg", + "date": "2020-08-24T20:53:49-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-3935338.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-3935338", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935338.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935338.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935338.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935338.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935338.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935338.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935338.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935338.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935338.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935338.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935338.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935338.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935338.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935338.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935338.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935338.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935338.jpg?w=1568" + }, + "height": 1253, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/87", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/87/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 86, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1918291.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1918291.jpg", + "date": "2020-08-24T20:53:49-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-1918291.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-1918291", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1918291.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1918291.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1918291.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1918291.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1918291.jpg?w=900&h=1058&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1918291.jpg?w=1200&h=1058&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1918291.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1918291.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1918291.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1918291.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1918291.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1918291.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1918291.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1918291.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1918291.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1918291.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1918291.jpg?w=1568" + }, + "height": 1058, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/86", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/86/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 85, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935314.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935314.jpg", + "date": "2020-08-24T20:53:49-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-3935314.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-3935314", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935314.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935314.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935314.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935314.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935314.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935314.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935314.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935314.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935314.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935314.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935314.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935314.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935314.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935314.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935314.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935314.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3935314.jpg?w=1568" + }, + "height": 1253, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/85", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/85/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 84, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/living-room-couch-interior-room-584399.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/living-room-couch-interior-room-584399.jpg", + "date": "2020-08-24T20:53:48-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "living-room-couch-interior-room-584399.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "living-room-couch-interior-room-584399", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/living-room-couch-interior-room-584399.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/living-room-couch-interior-room-584399.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/living-room-couch-interior-room-584399.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/living-room-couch-interior-room-584399.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/living-room-couch-interior-room-584399.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/living-room-couch-interior-room-584399.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/living-room-couch-interior-room-584399.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/living-room-couch-interior-room-584399.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/living-room-couch-interior-room-584399.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/living-room-couch-interior-room-584399.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/living-room-couch-interior-room-584399.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/living-room-couch-interior-room-584399.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/living-room-couch-interior-room-584399.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/living-room-couch-interior-room-584399.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/living-room-couch-interior-room-584399.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/living-room-couch-interior-room-584399.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/living-room-couch-interior-room-584399.jpg?w=1568" + }, + "height": 1244, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/84", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/84/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 83, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-277667.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-277667.jpg", + "date": "2020-08-24T20:53:48-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-277667.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-277667", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-277667.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-277667.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-277667.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-277667.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-277667.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-277667.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-277667.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-277667.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-277667.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-277667.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-277667.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-277667.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-277667.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-277667.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-277667.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-277667.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-277667.jpg?w=1568" + }, + "height": 1258, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/83", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/83/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 82, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3915710.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3915710.jpg", + "date": "2020-08-24T20:53:48-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-3915710.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-3915710", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3915710.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3915710.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3915710.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3915710.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3915710.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3915710.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3915710.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3915710.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3915710.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3915710.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3915710.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3915710.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3915710.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3915710.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3915710.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3915710.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3915710.jpg?w=1568" + }, + "height": 1253, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/82", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/82/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 81, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749.jpg", + "date": "2020-08-24T20:53:48-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "kitchen-stove-sink-kitchen-counter-349749.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "kitchen-stove-sink-kitchen-counter-349749", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/kitchen-stove-sink-kitchen-counter-349749.jpg?w=1568" + }, + "height": 1245, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/81", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/81/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 80, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2724749.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2724749.jpg", + "date": "2020-08-24T20:53:48-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-2724749.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-2724749", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2724749.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2724749.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2724749.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2724749.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2724749.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2724749.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2724749.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2724749.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2724749.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2724749.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2724749.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2724749.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2724749.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2724749.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2724749.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2724749.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2724749.jpg?w=1568" + }, + "height": 1253, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/80", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/80/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 79, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-323780.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-323780.jpg", + "date": "2020-08-24T20:53:48-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-323780.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-323780", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-323780.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-323780.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-323780.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-323780.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-323780.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-323780.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-323780.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-323780.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-323780.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-323780.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-323780.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-323780.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-323780.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-323780.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-323780.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-323780.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-323780.jpg?w=1568" + }, + "height": 1212, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/79", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/79/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 78, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-279648.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-279648.jpg", + "date": "2020-08-24T20:53:48-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-279648.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-279648", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-279648.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-279648.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-279648.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-279648.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-279648.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-279648.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-279648.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-279648.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-279648.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-279648.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-279648.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-279648.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-279648.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-279648.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-279648.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-279648.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-279648.jpg?w=1318" + }, + "height": 1300, + "width": 1318, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/78", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/78/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 77, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280232.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280232.jpg", + "date": "2020-08-24T20:53:48-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-280232.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-280232", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280232.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280232.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280232.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280232.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280232.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280232.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280232.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280232.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280232.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280232.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280232.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280232.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280232.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280232.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280232.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280232.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-280232.jpg?w=1568" + }, + "height": 1249, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/77", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/77/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 76, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3016430.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3016430.jpg", + "date": "2020-08-24T20:53:48-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-3016430.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-3016430", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3016430.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3016430.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3016430.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3016430.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3016430.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3016430.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3016430.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3016430.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3016430.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3016430.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3016430.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3016430.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3016430.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3016430.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3016430.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3016430.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3016430.jpg?w=1568" + }, + "height": 1300, + "width": 1733, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/76", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/76/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 75, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3214064.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3214064.jpg", + "date": "2020-08-24T20:53:48-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-3214064.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-3214064", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3214064.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3214064.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3214064.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3214064.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3214064.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3214064.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3214064.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3214064.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3214064.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3214064.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3214064.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3214064.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3214064.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3214064.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3214064.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3214064.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3214064.jpg?w=1568" + }, + "height": 1253, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/75", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/75/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 74, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3723719.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3723719.jpg", + "date": "2020-08-24T20:53:47-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-3723719.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-3723719", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3723719.jpg?w=113", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3723719.jpg?w=225", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3723719.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3723719.jpg?w=975&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3723719.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3723719.jpg?w=975&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3723719.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3723719.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3723719.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3723719.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3723719.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3723719.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3723719.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3723719.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3723719.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3723719.jpg?w=975", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3723719.jpg?w=975" + }, + "height": 1300, + "width": 975, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/74", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/74/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 73, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-262048.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-262048.jpg", + "date": "2020-08-24T20:53:47-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-262048.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-262048", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-262048.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-262048.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-262048.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-262048.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-262048.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-262048.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-262048.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-262048.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-262048.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-262048.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-262048.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-262048.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-262048.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-262048.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-262048.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-262048.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-262048.jpg?w=1568" + }, + "height": 1300, + "width": 1823, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/73", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/73/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 72, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2635038.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2635038.jpg", + "date": "2020-08-24T20:53:46-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-2635038.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-2635038", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2635038.jpg?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2635038.jpg?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2635038.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2635038.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2635038.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2635038.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2635038.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2635038.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2635038.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2635038.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2635038.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2635038.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2635038.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2635038.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2635038.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2635038.jpg?w=1200", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-2635038.jpg?w=1568" + }, + "height": 1255, + "width": 1880, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/72", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/72/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 71, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3315291.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3315291.jpg", + "date": "2020-08-24T20:53:45-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-3315291.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-3315291", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3315291.jpg?w=125", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3315291.jpg?w=250", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3315291.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3315291.jpg?w=1083&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3315291.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3315291.jpg?w=1083&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3315291.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3315291.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3315291.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3315291.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3315291.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3315291.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3315291.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3315291.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3315291.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3315291.jpg?w=1083", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3315291.jpg?w=1083" + }, + "height": 1300, + "width": 1083, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/71", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/71/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 70, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-4099300.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-4099300.jpg", + "date": "2020-08-24T20:53:45-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-4099300.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-4099300", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-4099300.jpg?w=120", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-4099300.jpg?w=240", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-4099300.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-4099300.jpg?w=1040&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-4099300.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-4099300.jpg?w=1040&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-4099300.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-4099300.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-4099300.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-4099300.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-4099300.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-4099300.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-4099300.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-4099300.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-4099300.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-4099300.jpg?w=1040", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-4099300.jpg?w=1040" + }, + "height": 1300, + "width": 1040, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/70", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/70/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 69, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3554424.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3554424.jpg", + "date": "2020-08-24T20:53:42-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-3554424.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-3554424", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3554424.jpg?w=100", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3554424.jpg?w=200", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3554424.jpg?w=683", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3554424.jpg?w=867&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3554424.jpg?w=867&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3554424.jpg?w=867&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3554424.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3554424.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3554424.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3554424.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3554424.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3554424.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3554424.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3554424.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3554424.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3554424.jpg?w=867", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-3554424.jpg?w=867" + }, + "height": 1300, + "width": 867, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/69", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/69/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 68, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271631.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271631.jpg", + "date": "2020-08-24T20:53:42-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-271631.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-271631", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271631.jpg?w=100", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271631.jpg?w=200", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271631.jpg?w=684", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271631.jpg?w=868&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271631.jpg?w=868&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271631.jpg?w=868&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271631.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271631.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271631.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271631.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271631.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271631.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271631.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271631.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271631.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271631.jpg?w=868", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-271631.jpg?w=868" + }, + "height": 1300, + "width": 868, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/68", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/68/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 67, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457847.jpg", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457847.jpg", + "date": "2020-08-24T20:53:42-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "pexels-photo-1457847.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "pexels-photo-1457847", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457847.jpg?w=111", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457847.jpg?w=222", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457847.jpg?w=750", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457847.jpg?w=963&h=900&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457847.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457847.jpg?w=963&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457847.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457847.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457847.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457847.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457847.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457847.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457847.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457847.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457847.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457847.jpg?w=963", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/pexels-photo-1457847.jpg?w=963" + }, + "height": 1300, + "width": 963, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/67", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/67/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + }, + { + "ID": 30, + "URL": "https://tricountyrealestate.files.wordpress.com/2020/08/real-estate.png", + "guid": "http://tricountyrealestate.files.wordpress.com/2020/08/real-estate.png", + "date": "2020-08-24T13:58:54-07:00", + "post_ID": 0, + "author_ID": 191794483, + "file": "real-estate.png", + "mime_type": "image/png", + "extension": "png", + "title": "Real Estate", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s0.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/real-estate.png?w=150", + "medium": "https://tricountyrealestate.files.wordpress.com/2020/08/real-estate.png?w=300", + "large": "https://tricountyrealestate.files.wordpress.com/2020/08/real-estate.png?w=512", + "newspack-article-block-landscape-large": "https://tricountyrealestate.files.wordpress.com/2020/08/real-estate.png?w=512&h=512&crop=1", + "newspack-article-block-portrait-large": "https://tricountyrealestate.files.wordpress.com/2020/08/real-estate.png?w=512&h=512&crop=1", + "newspack-article-block-square-large": "https://tricountyrealestate.files.wordpress.com/2020/08/real-estate.png?w=512&h=512&crop=1", + "newspack-article-block-landscape-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/real-estate.png?w=512&h=512&crop=1", + "newspack-article-block-portrait-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/real-estate.png?w=512&h=512&crop=1", + "newspack-article-block-square-medium": "https://tricountyrealestate.files.wordpress.com/2020/08/real-estate.png?w=512&h=512&crop=1", + "newspack-article-block-landscape-small": "https://tricountyrealestate.files.wordpress.com/2020/08/real-estate.png?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://tricountyrealestate.files.wordpress.com/2020/08/real-estate.png?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://tricountyrealestate.files.wordpress.com/2020/08/real-estate.png?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/real-estate.png?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/real-estate.png?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://tricountyrealestate.files.wordpress.com/2020/08/real-estate.png?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://tricountyrealestate.files.wordpress.com/2020/08/real-estate.png?w=512", + "post-thumbnail": "https://tricountyrealestate.files.wordpress.com/2020/08/real-estate.png?w=512" + }, + "height": 512, + "width": 512, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/30", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541/media/30/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851541" + } + } + } + ] + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/rest_v11_sites_158396482_media_1_image.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/rest_v11_sites_158396482_media_1_image.json new file mode 100644 index 000000000000..a8fedd1a3c30 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/rest_v11_sites_158396482_media_1_image.json @@ -0,0 +1,80 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/rest/v1.1/sites/106707880/media(/)?($|\\?.*)", + "queryParameters": { + "media_type": { + "equalTo": "image" + }, + "number": { + "equalTo": "1" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "found": 20, + "media": [ + { + "ID": 243, + "URL": "https://infocusphotographers.files.wordpress.com/2019/01/beach-children-family-39691.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/01/beach-children-family-39691.jpg", + "date": "2019-03-20T23:56:52+00:00", + "post_ID": 225, + "author_ID": 14151046, + "file": "beach-children-family-39691.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "beach-children-family-39691", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/01/beach-children-family-39691.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/01/beach-children-family-39691.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/01/beach-children-family-39691.jpg?w=1024", + "edin-thumbnail-landscape": "https://infocusphotographers.files.wordpress.com/2019/01/beach-children-family-39691.jpg?w=330&h=240&crop=1", + "edin-thumbnail-square": "https://infocusphotographers.files.wordpress.com/2019/01/beach-children-family-39691.jpg?w=330&h=330&crop=1", + "edin-thumbnail-avatar": "https://infocusphotographers.files.wordpress.com/2019/01/beach-children-family-39691.jpg?w=96&h=96&crop=1", + "edin-featured-image": "https://infocusphotographers.files.wordpress.com/2019/01/beach-children-family-39691.jpg?w=648", + "edin-hero": "https://infocusphotographers.files.wordpress.com/2019/01/beach-children-family-39691.jpg?w=1230&h=1230&crop=1", + "edin-logo": "https://infocusphotographers.files.wordpress.com/2019/01/beach-children-family-39691.jpg?w=288" + }, + "height": 2446, + "width": 3669, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/243", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/243/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/225" + } + } + } + ] + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/rest_v11_sites_158396482_media_new.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/rest_v11_sites_158396482_media_new.json new file mode 100644 index 000000000000..2e035f424f19 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/rest_v11_sites_158396482_media_new.json @@ -0,0 +1,68 @@ +{ + "request": { + "method": "POST", + "urlPattern": "/rest/v1.1/sites/106707880/media/new(/)?($|\\?.*)" + }, + "response": { + "status": 200, + "jsonBody": { + "media": [ + { + "ID": 294, + "URL": "https://e2eflowtestingmobile.files.wordpress.com/2019/05/img_0111-14.jpg", + "guid": "http://e2eflowtestingmobile.files.wordpress.com/2019/05/img_0111-14.jpg", + "date": "2019-05-08T09:49:00+00:00", + "post_ID": 295, + "author_ID": 152748359, + "file": "img_0111-14.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "img_0111", + "caption": "", + "description": "", + "alt": "", + "icon": "https://s1.wp.com/wp-includes/images/media/default.png", + "thumbnails": { + "thumbnail": "https://e2eflowtestingmobile.files.wordpress.com/2019/05/img_0111-14.jpg?w=150", + "medium": "https://e2eflowtestingmobile.files.wordpress.com/2019/05/img_0111-14.jpg?w=300", + "large": "https://e2eflowtestingmobile.files.wordpress.com/2019/05/img_0111-14.jpg?w=1024", + "post-thumbnail": "https://e2eflowtestingmobile.files.wordpress.com/2019/05/img_0111-14.jpg?w=740&h=430&crop=1", + "independent-publisher-2-banner": "https://e2eflowtestingmobile.files.wordpress.com/2019/05/img_0111-14.jpg?w=1440&h=600&crop=1", + "independent-publisher-2-full-width": "https://e2eflowtestingmobile.files.wordpress.com/2019/05/img_0111-14.jpg?w=1100" + }, + "height": 3024, + "width": 4032, + "exif": { + "aperture": "2.4", + "credit": "", + "camera": "iPhone X", + "caption": "", + "created_timestamp": "1522412059", + "copyright": "", + "focal_length": "6", + "iso": "16", + "shutter_speed": "0.0047846889952153", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/294", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/media/294/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/295" + } + } + } + ] + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/v2_sites_106707880_media.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/v2_sites_106707880_media.json new file mode 100644 index 000000000000..ab90a8390359 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/v2_sites_106707880_media.json @@ -0,0 +1,1266 @@ +{ + "request": { + "method": "GET", + "urlPath": "/wp/v2/sites/106707880/media" + }, + "response": { + "status": 200, + "jsonBody": [ + { + "id": 384, + "date": "2019-05-28T16:51:24", + "date_gmt": "2019-05-28T16:51:24", + "guid": { + "rendered": "http://infocusphotographers.files.wordpress.com/2019/05/destination-landmark-las-vegas-165799.jpg" + }, + "modified": "2019-05-28T16:51:24", + "modified_gmt": "2019-05-28T16:51:24", + "slug": "destination-landmark-las-vegas-165799-2", + "status": "inherit", + "type": "attachment", + "link": "https://infocusphotographers.com/destination-landmark-las-vegas-165799-2/", + "title": { + "rendered": "destination-landmark-las-vegas-165799" + }, + "author": 742098, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/a7dJAQ-6c", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 4608, + "height": 3072, + "file": "2019/05/destination-landmark-las-vegas-165799.jpg", + "sizes": { + "thumbnail": { + "file": "destination-landmark-las-vegas-165799.jpg?w=150", + "width": 150, + "height": 100, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/destination-landmark-las-vegas-165799.jpg?w=150" + }, + "medium": { + "file": "destination-landmark-las-vegas-165799.jpg?w=300", + "width": 300, + "height": 200, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/destination-landmark-las-vegas-165799.jpg?w=300" + }, + "large": { + "file": "destination-landmark-las-vegas-165799.jpg?w=1024", + "width": 1024, + "height": 683, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/destination-landmark-las-vegas-165799.jpg?w=1024" + }, + "full": { + "file": "destination-landmark-las-vegas-165799.jpg", + "width": 1024, + "height": 683, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/destination-landmark-las-vegas-165799.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "filesize": 2172736 + }, + "post": null, + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/destination-landmark-las-vegas-165799.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/media/384" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/users/742098" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/comments?post=384" + } + ] + } + }, + { + "id": 383, + "date": "2019-05-28T16:51:22", + "date_gmt": "2019-05-28T16:51:22", + "guid": { + "rendered": "http://infocusphotographers.files.wordpress.com/2019/05/dawn-desktop-wallpaper-evening-1612351.jpg" + }, + "modified": "2019-05-28T16:51:22", + "modified_gmt": "2019-05-28T16:51:22", + "slug": "dawn-desktop-wallpaper-evening-1612351-2", + "status": "inherit", + "type": "attachment", + "link": "https://infocusphotographers.com/dawn-desktop-wallpaper-evening-1612351-2/", + "title": { + "rendered": "dawn-desktop-wallpaper-evening-1612351" + }, + "author": 742098, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/a7dJAQ-6b", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 5472, + "height": 3649, + "file": "2019/05/dawn-desktop-wallpaper-evening-1612351.jpg", + "sizes": { + "thumbnail": { + "file": "dawn-desktop-wallpaper-evening-1612351.jpg?w=150", + "width": 150, + "height": 100, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/dawn-desktop-wallpaper-evening-1612351.jpg?w=150" + }, + "medium": { + "file": "dawn-desktop-wallpaper-evening-1612351.jpg?w=300", + "width": 300, + "height": 200, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/dawn-desktop-wallpaper-evening-1612351.jpg?w=300" + }, + "large": { + "file": "dawn-desktop-wallpaper-evening-1612351.jpg?w=1024", + "width": 1024, + "height": 683, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/dawn-desktop-wallpaper-evening-1612351.jpg?w=1024" + }, + "full": { + "file": "dawn-desktop-wallpaper-evening-1612351.jpg", + "width": 1024, + "height": 683, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/dawn-desktop-wallpaper-evening-1612351.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "filesize": 2982922 + }, + "post": null, + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/dawn-desktop-wallpaper-evening-1612351.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/media/383" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/users/742098" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/comments?post=383" + } + ] + } + }, + { + "id": 382, + "date": "2019-05-28T16:51:20", + "date_gmt": "2019-05-28T16:51:20", + "guid": { + "rendered": "http://infocusphotographers.files.wordpress.com/2019/05/concert-effect-entertainment-1150837.jpg" + }, + "modified": "2019-05-28T16:51:20", + "modified_gmt": "2019-05-28T16:51:20", + "slug": "concert-effect-entertainment-1150837-2", + "status": "inherit", + "type": "attachment", + "link": "https://infocusphotographers.com/concert-effect-entertainment-1150837-2/", + "title": { + "rendered": "concert-effect-entertainment-1150837" + }, + "author": 742098, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/a7dJAQ-6a", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 6000, + "height": 4000, + "file": "2019/05/concert-effect-entertainment-1150837.jpg", + "sizes": { + "thumbnail": { + "file": "concert-effect-entertainment-1150837.jpg?w=150", + "width": 150, + "height": 100, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/concert-effect-entertainment-1150837.jpg?w=150" + }, + "medium": { + "file": "concert-effect-entertainment-1150837.jpg?w=300", + "width": 300, + "height": 200, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/concert-effect-entertainment-1150837.jpg?w=300" + }, + "large": { + "file": "concert-effect-entertainment-1150837.jpg?w=1024", + "width": 1024, + "height": 683, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/concert-effect-entertainment-1150837.jpg?w=1024" + }, + "full": { + "file": "concert-effect-entertainment-1150837.jpg", + "width": 1024, + "height": 683, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/concert-effect-entertainment-1150837.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "filesize": 2881247 + }, + "post": null, + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/concert-effect-entertainment-1150837.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/media/382" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/users/742098" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/comments?post=382" + } + ] + } + }, + { + "id": 381, + "date": "2019-05-28T16:51:18", + "date_gmt": "2019-05-28T16:51:18", + "guid": { + "rendered": "http://infocusphotographers.files.wordpress.com/2019/05/clouds-flight-flying-6881.jpg" + }, + "modified": "2019-05-28T16:51:18", + "modified_gmt": "2019-05-28T16:51:18", + "slug": "clouds-flight-flying-6881-2", + "status": "inherit", + "type": "attachment", + "link": "https://infocusphotographers.com/clouds-flight-flying-6881-2/", + "title": { + "rendered": "clouds-flight-flying-6881" + }, + "author": 742098, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/a7dJAQ-69", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 1632, + "height": 1224, + "file": "2019/05/clouds-flight-flying-6881.jpg", + "sizes": { + "thumbnail": { + "file": "clouds-flight-flying-6881.jpg?w=150", + "width": 150, + "height": 113, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-flight-flying-6881.jpg?w=150" + }, + "medium": { + "file": "clouds-flight-flying-6881.jpg?w=300", + "width": 300, + "height": 225, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-flight-flying-6881.jpg?w=300" + }, + "large": { + "file": "clouds-flight-flying-6881.jpg?w=1024", + "width": 1024, + "height": 768, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-flight-flying-6881.jpg?w=1024" + }, + "full": { + "file": "clouds-flight-flying-6881.jpg", + "width": 1024, + "height": 768, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-flight-flying-6881.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "filesize": 286243 + }, + "post": null, + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-flight-flying-6881.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/media/381" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/users/742098" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/comments?post=381" + } + ] + } + }, + { + "id": 379, + "date": "2019-05-28T16:51:15", + "date_gmt": "2019-05-28T16:51:15", + "guid": { + "rendered": "http://infocusphotographers.files.wordpress.com/2019/05/clouds-country-countryside-459063.jpg" + }, + "modified": "2019-05-28T16:51:15", + "modified_gmt": "2019-05-28T16:51:15", + "slug": "clouds-country-countryside-459063-2", + "status": "inherit", + "type": "attachment", + "link": "https://infocusphotographers.com/clouds-country-countryside-459063-2/", + "title": { + "rendered": "clouds-country-countryside-459063" + }, + "author": 742098, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/a7dJAQ-67", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 2001, + "height": 926, + "file": "2019/05/clouds-country-countryside-459063.jpg", + "sizes": { + "thumbnail": { + "file": "clouds-country-countryside-459063.jpg?w=150", + "width": 150, + "height": 69, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-country-countryside-459063.jpg?w=150" + }, + "medium": { + "file": "clouds-country-countryside-459063.jpg?w=300", + "width": 300, + "height": 139, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-country-countryside-459063.jpg?w=300" + }, + "large": { + "file": "clouds-country-countryside-459063.jpg?w=1024", + "width": 1024, + "height": 474, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-country-countryside-459063.jpg?w=1024" + }, + "full": { + "file": "clouds-country-countryside-459063.jpg", + "width": 1024, + "height": 474, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-country-countryside-459063.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "filesize": 329615 + }, + "post": null, + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/clouds-country-countryside-459063.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/media/379" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/users/742098" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/comments?post=379" + } + ] + } + }, + { + "id": 377, + "date": "2019-05-28T16:51:12", + "date_gmt": "2019-05-28T16:51:12", + "guid": { + "rendered": "http://infocusphotographers.files.wordpress.com/2019/05/celebration-colorful-colourful-587741.jpg" + }, + "modified": "2019-05-28T16:51:12", + "modified_gmt": "2019-05-28T16:51:12", + "slug": "celebration-colorful-colourful-587741-2", + "status": "inherit", + "type": "attachment", + "link": "https://infocusphotographers.com/celebration-colorful-colourful-587741-2/", + "title": { + "rendered": "celebration-colorful-colourful-587741" + }, + "author": 742098, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/a7dJAQ-65", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 5425, + "height": 3617, + "file": "2019/05/celebration-colorful-colourful-587741.jpg", + "sizes": { + "thumbnail": { + "file": "celebration-colorful-colourful-587741.jpg?w=150", + "width": 150, + "height": 100, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-colorful-colourful-587741.jpg?w=150" + }, + "medium": { + "file": "celebration-colorful-colourful-587741.jpg?w=300", + "width": 300, + "height": 200, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-colorful-colourful-587741.jpg?w=300" + }, + "large": { + "file": "celebration-colorful-colourful-587741.jpg?w=1024", + "width": 1024, + "height": 683, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-colorful-colourful-587741.jpg?w=1024" + }, + "full": { + "file": "celebration-colorful-colourful-587741.jpg", + "width": 1024, + "height": 683, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-colorful-colourful-587741.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "filesize": 1704908 + }, + "post": null, + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-colorful-colourful-587741.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/media/377" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/users/742098" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/comments?post=377" + } + ] + } + }, + { + "id": 376, + "date": "2019-05-28T16:51:10", + "date_gmt": "2019-05-28T16:51:10", + "guid": { + "rendered": "http://infocusphotographers.files.wordpress.com/2019/05/celebration-christmas-dark-625789.jpg" + }, + "modified": "2019-05-28T16:51:10", + "modified_gmt": "2019-05-28T16:51:10", + "slug": "celebration-christmas-dark-625789-2", + "status": "inherit", + "type": "attachment", + "link": "https://infocusphotographers.com/celebration-christmas-dark-625789-2/", + "title": { + "rendered": "celebration-christmas-dark-625789" + }, + "author": 742098, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/a7dJAQ-64", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 4032, + "height": 3024, + "file": "2019/05/celebration-christmas-dark-625789.jpg", + "sizes": { + "thumbnail": { + "file": "celebration-christmas-dark-625789.jpg?w=150", + "width": 150, + "height": 113, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-christmas-dark-625789.jpg?w=150" + }, + "medium": { + "file": "celebration-christmas-dark-625789.jpg?w=300", + "width": 300, + "height": 225, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-christmas-dark-625789.jpg?w=300" + }, + "large": { + "file": "celebration-christmas-dark-625789.jpg?w=1024", + "width": 1024, + "height": 768, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-christmas-dark-625789.jpg?w=1024" + }, + "full": { + "file": "celebration-christmas-dark-625789.jpg", + "width": 1024, + "height": 768, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-christmas-dark-625789.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "filesize": 1779369 + }, + "post": null, + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/celebration-christmas-dark-625789.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/media/376" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/users/742098" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/comments?post=376" + } + ] + } + }, + { + "id": 375, + "date": "2019-05-28T16:51:08", + "date_gmt": "2019-05-28T16:51:08", + "guid": { + "rendered": "http://infocusphotographers.files.wordpress.com/2019/05/catering-decoration-dinner-57980.jpg" + }, + "modified": "2019-05-28T16:51:08", + "modified_gmt": "2019-05-28T16:51:08", + "slug": "catering-decoration-dinner-57980-2", + "status": "inherit", + "type": "attachment", + "link": "https://infocusphotographers.com/catering-decoration-dinner-57980-2/", + "title": { + "rendered": "catering-decoration-dinner-57980" + }, + "author": 742098, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/a7dJAQ-63", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 6000, + "height": 4000, + "file": "2019/05/catering-decoration-dinner-57980.jpg", + "sizes": { + "thumbnail": { + "file": "catering-decoration-dinner-57980.jpg?w=150", + "width": 150, + "height": 100, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/catering-decoration-dinner-57980.jpg?w=150" + }, + "medium": { + "file": "catering-decoration-dinner-57980.jpg?w=300", + "width": 300, + "height": 200, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/catering-decoration-dinner-57980.jpg?w=300" + }, + "large": { + "file": "catering-decoration-dinner-57980.jpg?w=1024", + "width": 1024, + "height": 683, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/catering-decoration-dinner-57980.jpg?w=1024" + }, + "full": { + "file": "catering-decoration-dinner-57980.jpg", + "width": 1024, + "height": 683, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/catering-decoration-dinner-57980.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "filesize": 2241987 + }, + "post": null, + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/catering-decoration-dinner-57980.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/media/375" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/users/742098" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/comments?post=375" + } + ] + } + }, + { + "id": 374, + "date": "2019-05-28T16:51:07", + "date_gmt": "2019-05-28T16:51:07", + "guid": { + "rendered": "http://infocusphotographers.files.wordpress.com/2019/05/carnival-carousel-circus-992763.jpg" + }, + "modified": "2019-05-28T16:51:07", + "modified_gmt": "2019-05-28T16:51:07", + "slug": "carnival-carousel-circus-992763-2", + "status": "inherit", + "type": "attachment", + "link": "https://infocusphotographers.com/carnival-carousel-circus-992763-2/", + "title": { + "rendered": "carnival-carousel-circus-992763" + }, + "author": 742098, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/a7dJAQ-62", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 3456, + "height": 5184, + "file": "2019/05/carnival-carousel-circus-992763.jpg", + "sizes": { + "thumbnail": { + "file": "carnival-carousel-circus-992763.jpg?w=100", + "width": 100, + "height": 150, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/carnival-carousel-circus-992763.jpg?w=100" + }, + "medium": { + "file": "carnival-carousel-circus-992763.jpg?w=200", + "width": 200, + "height": 300, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/carnival-carousel-circus-992763.jpg?w=200" + }, + "large": { + "file": "carnival-carousel-circus-992763.jpg?w=683", + "width": 683, + "height": 1024, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/carnival-carousel-circus-992763.jpg?w=683" + }, + "full": { + "file": "carnival-carousel-circus-992763.jpg", + "width": 1024, + "height": 1536, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/carnival-carousel-circus-992763.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "filesize": 3780115 + }, + "post": null, + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/carnival-carousel-circus-992763.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/media/374" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/users/742098" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/comments?post=374" + } + ] + } + }, + { + "id": 373, + "date": "2019-05-28T16:51:04", + "date_gmt": "2019-05-28T16:51:04", + "guid": { + "rendered": "http://infocusphotographers.files.wordpress.com/2019/05/camera-macro-optics-122400.jpg" + }, + "modified": "2019-05-28T16:51:04", + "modified_gmt": "2019-05-28T16:51:04", + "slug": "camera-macro-optics-122400-2", + "status": "inherit", + "type": "attachment", + "link": "https://infocusphotographers.com/camera-macro-optics-122400-2/", + "title": { + "rendered": "camera-macro-optics-122400" + }, + "author": 742098, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/a7dJAQ-61", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 5760, + "height": 3840, + "file": "2019/05/camera-macro-optics-122400.jpg", + "sizes": { + "thumbnail": { + "file": "camera-macro-optics-122400.jpg?w=150", + "width": 150, + "height": 100, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/camera-macro-optics-122400.jpg?w=150" + }, + "medium": { + "file": "camera-macro-optics-122400.jpg?w=300", + "width": 300, + "height": 200, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/camera-macro-optics-122400.jpg?w=300" + }, + "large": { + "file": "camera-macro-optics-122400.jpg?w=1024", + "width": 1024, + "height": 683, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/camera-macro-optics-122400.jpg?w=1024" + }, + "full": { + "file": "camera-macro-optics-122400.jpg", + "width": 1024, + "height": 683, + "mime_type": "image/jpeg", + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/camera-macro-optics-122400.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "filesize": 3238265 + }, + "post": null, + "source_url": "https://infocusphotographers.files.wordpress.com/2019/05/camera-macro-optics-122400.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/media/373" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/users/742098" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/106707880/comments?post=373" + } + ] + } + } + ], + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/v2_sites_181851495_media.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/v2_sites_181851495_media.json new file mode 100644 index 000000000000..0af090b73e7e --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/v2_sites_181851495_media.json @@ -0,0 +1,1294 @@ +{ + "request": { + "method": "GET", + "urlPath": "/wp/v2/sites/181851495/media" + }, + "response": { + "status": 200, + "jsonBody": [ + { + "id": 65, + "date": "2020-08-27T16:30:36", + "date_gmt": "2020-08-27T23:30:36", + "guid": { + "rendered": "http://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg" + }, + "modified": "2020-08-27T16:31:03", + "modified_gmt": "2020-08-27T23:31:03", + "slug": "image-2", + "status": "inherit", + "type": "attachment", + "link": "https://fourpawsdoggrooming.wordpress.com/our-services/image-2/", + "title": { + "rendered": "image" + }, + "author": 191794483, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/acj1SD-13", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 1320, + "height": 1848, + "file": "2020/08/image-1.jpg", + "sizes": { + "thumbnail": { + "file": "image-1.jpg?w=107", + "width": 107, + "height": 150, + "mime_type": "image/jpeg", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=107" + }, + "medium": { + "file": "image-1.jpg?w=214", + "width": 214, + "height": 300, + "mime_type": "image/jpeg", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=214" + }, + "large": { + "file": "image-1.jpg?w=731", + "width": 731, + "height": 1024, + "mime_type": "image/jpeg", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=731" + }, + "full": { + "file": "image-1.jpg", + "width": 1024, + "height": 1434, + "mime_type": "image/jpeg", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "filesize": 702736 + }, + "post": 45, + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/media/65" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/users/191794483" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/comments?post=65" + } + ] + } + }, + { + "id": 63, + "date": "2020-08-26T12:20:02", + "date_gmt": "2020-08-26T19:20:02", + "guid": { + "rendered": "http://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg" + }, + "modified": "2020-08-26T12:20:02", + "modified_gmt": "2020-08-26T19:20:02", + "slug": "wp-1598469598971", + "status": "inherit", + "type": "attachment", + "link": "https://fourpawsdoggrooming.wordpress.com/our-services/wp-1598469598971/", + "title": { + "rendered": "wp-1598469598971.jpg" + }, + "author": 191794483, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/acj1SD-11", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 1851, + "height": 2780, + "file": "2020/08/wp-1598469598971.jpg", + "sizes": { + "thumbnail": { + "file": "wp-1598469598971.jpg?w=100", + "width": 100, + "height": 150, + "mime_type": "image/jpeg", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=100" + }, + "medium": { + "file": "wp-1598469598971.jpg?w=200", + "width": 200, + "height": 300, + "mime_type": "image/jpeg", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=200" + }, + "large": { + "file": "wp-1598469598971.jpg?w=682", + "width": 682, + "height": 1024, + "mime_type": "image/jpeg", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=682" + }, + "full": { + "file": "wp-1598469598971.jpg", + "width": 1024, + "height": 1538, + "mime_type": "image/jpeg", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "filesize": 437547 + }, + "post": 45, + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/media/63" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/users/191794483" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/comments?post=63" + } + ] + } + }, + { + "id": 61, + "date": "2020-08-25T12:05:54", + "date_gmt": "2020-08-25T19:05:54", + "guid": { + "rendered": "http://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg" + }, + "modified": "2020-08-25T12:10:32", + "modified_gmt": "2020-08-25T19:10:32", + "slug": "image", + "status": "inherit", + "type": "attachment", + "link": "https://fourpawsdoggrooming.wordpress.com/our-services/image/", + "title": { + "rendered": "image" + }, + "author": 191794483, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/acj1SD-Z", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 1846, + "height": 1848, + "file": "2020/08/image.jpg", + "sizes": { + "thumbnail": { + "file": "image.jpg?w=150", + "width": 150, + "height": 150, + "mime_type": "image/jpeg", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=150" + }, + "medium": { + "file": "image.jpg?w=300", + "width": 300, + "height": 300, + "mime_type": "image/jpeg", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=300" + }, + "large": { + "file": "image.jpg?w=1024", + "width": "1024", + "height": 1024, + "mime_type": "image/jpeg", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=1024" + }, + "full": { + "file": "image.jpg", + "width": 1024, + "height": 1025, + "mime_type": "image/jpeg", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "filesize": 936680 + }, + "post": 45, + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/media/61" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/users/191794483" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/comments?post=61" + } + ] + } + }, + { + "id": 49, + "date": "2020-08-24T12:07:27", + "date_gmt": "2020-08-24T19:07:27", + "guid": { + "rendered": "http://fourpawsdoggrooming.files.wordpress.com/2020/08/alvan-nee-1vgfqdcux-4-unsplash.jpg" + }, + "modified": "2020-08-24T12:07:27", + "modified_gmt": "2020-08-24T19:07:27", + "slug": "alvan-nee-1vgfqdcux-4-unsplash", + "status": "inherit", + "type": "attachment", + "link": "https://fourpawsdoggrooming.wordpress.com/alvan-nee-1vgfqdcux-4-unsplash/", + "title": { + "rendered": "alvan-nee-1vgfqdcux-4-unsplash" + }, + "author": 14151046, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/acj1SD-N", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 1851, + "height": 2780, + "file": "2020/08/alvan-nee-1vgfqdcux-4-unsplash.jpg", + "sizes": { + "thumbnail": { + "file": "alvan-nee-1vgfqdcux-4-unsplash.jpg?w=100", + "width": 100, + "height": 150, + "mime_type": "image/jpeg", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/alvan-nee-1vgfqdcux-4-unsplash.jpg?w=100" + }, + "medium": { + "file": "alvan-nee-1vgfqdcux-4-unsplash.jpg?w=200", + "width": 200, + "height": 300, + "mime_type": "image/jpeg", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/alvan-nee-1vgfqdcux-4-unsplash.jpg?w=200" + }, + "large": { + "file": "alvan-nee-1vgfqdcux-4-unsplash.jpg?w=682", + "width": 682, + "height": 1024, + "mime_type": "image/jpeg", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/alvan-nee-1vgfqdcux-4-unsplash.jpg?w=682" + }, + "full": { + "file": "alvan-nee-1vgfqdcux-4-unsplash.jpg", + "width": 1024, + "height": 1538, + "mime_type": "image/jpeg", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/alvan-nee-1vgfqdcux-4-unsplash.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "filesize": 437547 + }, + "post": null, + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/alvan-nee-1vgfqdcux-4-unsplash.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/media/49" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/users/14151046" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/comments?post=49" + } + ] + } + }, + { + "id": 47, + "date": "2020-08-24T12:06:47", + "date_gmt": "2020-08-24T19:06:47", + "guid": { + "rendered": "http://fourpawsdoggrooming.files.wordpress.com/2020/08/boney-dhirbh9en6i-unsplash.jpg" + }, + "modified": "2020-08-24T12:06:47", + "modified_gmt": "2020-08-24T19:06:47", + "slug": "boney-dhirbh9en6i-unsplash", + "status": "inherit", + "type": "attachment", + "link": "https://fourpawsdoggrooming.wordpress.com/boney-dhirbh9en6i-unsplash/", + "title": { + "rendered": "boney-dhirbh9en6i-unsplash" + }, + "author": 14151046, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/acj1SD-L", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 4179, + "height": 2781, + "file": "2020/08/boney-dhirbh9en6i-unsplash.jpg", + "sizes": { + "thumbnail": { + "file": "boney-dhirbh9en6i-unsplash.jpg?w=150", + "width": 150, + "height": 100, + "mime_type": "image/jpeg", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/boney-dhirbh9en6i-unsplash.jpg?w=150" + }, + "medium": { + "file": "boney-dhirbh9en6i-unsplash.jpg?w=300", + "width": 300, + "height": 200, + "mime_type": "image/jpeg", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/boney-dhirbh9en6i-unsplash.jpg?w=300" + }, + "large": { + "file": "boney-dhirbh9en6i-unsplash.jpg?w=1024", + "width": 1024, + "height": 681, + "mime_type": "image/jpeg", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/boney-dhirbh9en6i-unsplash.jpg?w=1024" + }, + "full": { + "file": "boney-dhirbh9en6i-unsplash.jpg", + "width": 1024, + "height": 681, + "mime_type": "image/jpeg", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/boney-dhirbh9en6i-unsplash.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "filesize": 1707842 + }, + "post": null, + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/boney-dhirbh9en6i-unsplash.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/media/47" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/users/14151046" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/comments?post=47" + } + ] + } + }, + { + "id": 39, + "date": "2020-08-21T16:31:38", + "date_gmt": "2020-08-21T23:31:38", + "guid": { + "rendered": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-2-1.png" + }, + "modified": "2020-08-21T16:31:38", + "modified_gmt": "2020-08-21T23:31:38", + "slug": "cropped-fourpaws-logo-2-1-png", + "status": "inherit", + "type": "attachment", + "link": "https://fourpawsdoggrooming.wordpress.com/cropped-fourpaws-logo-2-1-png/", + "title": { + "rendered": "cropped-fourpaws-logo-2-1.png" + }, + "author": 14151046, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/acj1SD-D", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/png", + "media_details": { + "width": 512, + "height": 512, + "file": "2020/08/cropped-fourpaws-logo-2-1.png", + "sizes": { + "site_icon-270": { + "file": "cropped-fourpaws-logo-2-1-270x270.png", + "width": 270, + "height": 270, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-2-1.png?w=512" + }, + "site_icon-192": { + "file": "cropped-fourpaws-logo-2-1-192x192.png", + "width": 192, + "height": 192, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-2-1.png?w=512" + }, + "site_icon-180": { + "file": "cropped-fourpaws-logo-2-1-180x180.png", + "width": 180, + "height": 180, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-2-1.png?w=512" + }, + "site_icon-32": { + "file": "cropped-fourpaws-logo-2-1-32x32.png", + "width": 32, + "height": 32, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-2-1.png?w=512" + }, + "thumbnail": { + "file": "cropped-fourpaws-logo-2-1.png?w=150", + "width": 150, + "height": 150, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-2-1.png?w=150" + }, + "medium": { + "file": "cropped-fourpaws-logo-2-1.png?w=300", + "width": 300, + "height": 300, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-2-1.png?w=300" + }, + "large": { + "file": "cropped-fourpaws-logo-2-1.png?w=512", + "width": 512, + "height": 512, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-2-1.png?w=512" + }, + "full": { + "file": "cropped-fourpaws-logo-2-1.png", + "width": 512, + "height": 512, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-2-1.png" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "filesize": 11020 + }, + "post": null, + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-2-1.png", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/media/39" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/users/14151046" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/comments?post=39" + } + ] + } + }, + { + "id": 37, + "date": "2020-08-21T16:30:59", + "date_gmt": "2020-08-21T23:30:59", + "guid": { + "rendered": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-2.png" + }, + "modified": "2020-08-21T16:30:59", + "modified_gmt": "2020-08-21T23:30:59", + "slug": "cropped-fourpaws-logo-2-png", + "status": "inherit", + "type": "attachment", + "link": "https://fourpawsdoggrooming.wordpress.com/cropped-fourpaws-logo-2-png/", + "title": { + "rendered": "cropped-fourpaws-logo-2.png" + }, + "author": 14151046, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/acj1SD-B", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/png", + "media_details": { + "width": 512, + "height": 512, + "file": "2020/08/cropped-fourpaws-logo-2.png", + "sizes": { + "thumbnail": { + "file": "cropped-fourpaws-logo-2.png?w=150", + "width": 150, + "height": 150, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-2.png?w=150" + }, + "medium": { + "file": "cropped-fourpaws-logo-2.png?w=300", + "width": 300, + "height": 300, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-2.png?w=300" + }, + "large": { + "file": "cropped-fourpaws-logo-2.png?w=512", + "width": 512, + "height": 512, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-2.png?w=512" + }, + "full": { + "file": "cropped-fourpaws-logo-2.png", + "width": 512, + "height": 512, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-2.png" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "filesize": 11020 + }, + "post": null, + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-2.png", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/media/37" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/users/14151046" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/comments?post=37" + } + ] + } + }, + { + "id": 36, + "date": "2020-08-21T16:30:52", + "date_gmt": "2020-08-21T23:30:52", + "guid": { + "rendered": "http://fourpawsdoggrooming.files.wordpress.com/2020/08/fourpaws-logo-2.png" + }, + "modified": "2020-08-21T16:30:52", + "modified_gmt": "2020-08-21T23:30:52", + "slug": "fourpaws-logo-3", + "status": "inherit", + "type": "attachment", + "link": "https://fourpawsdoggrooming.wordpress.com/fourpaws-logo-3/", + "title": { + "rendered": "FourPaws Logo" + }, + "author": 14151046, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/acj1SD-A", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/png", + "media_details": { + "width": 512, + "height": 512, + "file": "2020/08/fourpaws-logo-2.png", + "sizes": { + "thumbnail": { + "file": "fourpaws-logo-2.png?w=150", + "width": 150, + "height": 150, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/fourpaws-logo-2.png?w=150" + }, + "medium": { + "file": "fourpaws-logo-2.png?w=300", + "width": 300, + "height": 300, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/fourpaws-logo-2.png?w=300" + }, + "large": { + "file": "fourpaws-logo-2.png?w=512", + "width": 512, + "height": 512, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/fourpaws-logo-2.png?w=512" + }, + "full": { + "file": "fourpaws-logo-2.png", + "width": 512, + "height": 512, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/fourpaws-logo-2.png" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "filesize": 6945 + }, + "post": null, + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/fourpaws-logo-2.png", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/media/36" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/users/14151046" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/comments?post=36" + } + ] + } + }, + { + "id": 34, + "date": "2020-08-21T16:29:57", + "date_gmt": "2020-08-21T23:29:57", + "guid": { + "rendered": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-1.png" + }, + "modified": "2020-08-21T16:29:57", + "modified_gmt": "2020-08-21T23:29:57", + "slug": "cropped-fourpaws-logo-1-png", + "status": "inherit", + "type": "attachment", + "link": "https://fourpawsdoggrooming.wordpress.com/cropped-fourpaws-logo-1-png/", + "title": { + "rendered": "cropped-fourpaws-logo-1.png" + }, + "author": 14151046, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/acj1SD-y", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/png", + "media_details": { + "width": 400, + "height": 400, + "file": "2020/08/cropped-fourpaws-logo-1.png", + "sizes": { + "thumbnail": { + "file": "cropped-fourpaws-logo-1.png?w=150", + "width": 150, + "height": 150, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-1.png?w=150" + }, + "medium": { + "file": "cropped-fourpaws-logo-1.png?w=300", + "width": 300, + "height": 300, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-1.png?w=300" + }, + "large": { + "file": "cropped-fourpaws-logo-1.png?w=400", + "width": 400, + "height": 400, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-1.png?w=400" + }, + "full": { + "file": "cropped-fourpaws-logo-1.png", + "width": 400, + "height": 400, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-1.png" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "filesize": 8523 + }, + "post": null, + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-1.png", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/media/34" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/users/14151046" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/comments?post=34" + } + ] + } + }, + { + "id": 33, + "date": "2020-08-21T16:29:49", + "date_gmt": "2020-08-21T23:29:49", + "guid": { + "rendered": "http://fourpawsdoggrooming.files.wordpress.com/2020/08/fourpaws-logo-1.png" + }, + "modified": "2020-08-21T16:29:49", + "modified_gmt": "2020-08-21T23:29:49", + "slug": "fourpaws-logo-2", + "status": "inherit", + "type": "attachment", + "link": "https://fourpawsdoggrooming.wordpress.com/fourpaws-logo-2/", + "title": { + "rendered": "FourPaws Logo" + }, + "author": 14151046, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/acj1SD-x", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/png", + "media_details": { + "width": 400, + "height": 400, + "file": "2020/08/fourpaws-logo-1.png", + "sizes": { + "thumbnail": { + "file": "fourpaws-logo-1.png?w=150", + "width": 150, + "height": 150, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/fourpaws-logo-1.png?w=150" + }, + "medium": { + "file": "fourpaws-logo-1.png?w=300", + "width": 300, + "height": 300, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/fourpaws-logo-1.png?w=300" + }, + "large": { + "file": "fourpaws-logo-1.png?w=400", + "width": 400, + "height": 400, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/fourpaws-logo-1.png?w=400" + }, + "full": { + "file": "fourpaws-logo-1.png", + "width": 400, + "height": 400, + "mime_type": "image/png", + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/fourpaws-logo-1.png" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "filesize": 5332 + }, + "post": null, + "source_url": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/fourpaws-logo-1.png", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/media/33" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/users/14151046" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181851495/comments?post=33" + } + ] + } + } + ], + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/v2_sites_181977606_media.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/v2_sites_181977606_media.json new file mode 100644 index 000000000000..e73dc3065c11 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/media/v2_sites_181977606_media.json @@ -0,0 +1,1266 @@ +{ + "request": { + "method": "GET", + "urlPath": "/wp/v2/sites/181977606/media" + }, + "response": { + "status": 200, + "jsonBody": [ + { + "id": 54, + "date": "2020-09-04T22:49:13", + "date_gmt": "2020-09-04T22:49:13", + "guid": { + "rendered": "http://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750300.jpg" + }, + "modified": "2020-09-04T22:49:13", + "modified_gmt": "2020-09-04T22:49:13", + "slug": "wp-1599259750300", + "status": "inherit", + "type": "attachment", + "link": "https://weekendbakesblog.wordpress.com/wp-1599259750300/", + "title": { + "rendered": "wp-1599259750300.jpg" + }, + "author": 191794483, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/acjyGG-S", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 1080, + "height": 1920, + "file": "2020/09/wp-1599259750300.jpg", + "sizes": { + "thumbnail": { + "file": "wp-1599259750300.jpg?w=84", + "width": 84, + "height": 150, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750300.jpg?w=84" + }, + "medium": { + "file": "wp-1599259750300.jpg?w=169", + "width": 169, + "height": 300, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750300.jpg?w=169" + }, + "large": { + "file": "wp-1599259750300.jpg?w=576", + "width": 576, + "height": 1024, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750300.jpg?w=576" + }, + "full": { + "file": "wp-1599259750300.jpg", + "width": 1024, + "height": 1820, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750300.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "filesize": 1185510 + }, + "post": null, + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750300.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/media/54" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/users/191794483" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/comments?post=54" + } + ] + } + }, + { + "id": 53, + "date": "2020-09-04T22:49:13", + "date_gmt": "2020-09-04T22:49:13", + "guid": { + "rendered": "http://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750281.jpg" + }, + "modified": "2020-09-04T22:49:13", + "modified_gmt": "2020-09-04T22:49:13", + "slug": "wp-1599259750281", + "status": "inherit", + "type": "attachment", + "link": "https://weekendbakesblog.wordpress.com/wp-1599259750281/", + "title": { + "rendered": "wp-1599259750281.jpg" + }, + "author": 191794483, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/acjyGG-R", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 1080, + "height": 1920, + "file": "2020/09/wp-1599259750281.jpg", + "sizes": { + "thumbnail": { + "file": "wp-1599259750281.jpg?w=84", + "width": 84, + "height": 150, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750281.jpg?w=84" + }, + "medium": { + "file": "wp-1599259750281.jpg?w=169", + "width": 169, + "height": 300, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750281.jpg?w=169" + }, + "large": { + "file": "wp-1599259750281.jpg?w=576", + "width": 576, + "height": 1024, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750281.jpg?w=576" + }, + "full": { + "file": "wp-1599259750281.jpg", + "width": 1024, + "height": 1820, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750281.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "filesize": 1237165 + }, + "post": null, + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750281.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/media/53" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/users/191794483" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/comments?post=53" + } + ] + } + }, + { + "id": 52, + "date": "2020-09-04T22:49:13", + "date_gmt": "2020-09-04T22:49:13", + "guid": { + "rendered": "http://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750292.jpg" + }, + "modified": "2020-09-04T22:49:13", + "modified_gmt": "2020-09-04T22:49:13", + "slug": "wp-1599259750292", + "status": "inherit", + "type": "attachment", + "link": "https://weekendbakesblog.wordpress.com/wp-1599259750292/", + "title": { + "rendered": "wp-1599259750292.jpg" + }, + "author": 191794483, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/acjyGG-Q", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 1080, + "height": 1920, + "file": "2020/09/wp-1599259750292.jpg", + "sizes": { + "thumbnail": { + "file": "wp-1599259750292.jpg?w=84", + "width": 84, + "height": 150, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750292.jpg?w=84" + }, + "medium": { + "file": "wp-1599259750292.jpg?w=169", + "width": 169, + "height": 300, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750292.jpg?w=169" + }, + "large": { + "file": "wp-1599259750292.jpg?w=576", + "width": 576, + "height": 1024, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750292.jpg?w=576" + }, + "full": { + "file": "wp-1599259750292.jpg", + "width": 1024, + "height": 1820, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750292.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "filesize": 1266683 + }, + "post": null, + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750292.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/media/52" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/users/191794483" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/comments?post=52" + } + ] + } + }, + { + "id": 51, + "date": "2020-09-04T22:49:13", + "date_gmt": "2020-09-04T22:49:13", + "guid": { + "rendered": "http://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750308.jpg" + }, + "modified": "2020-09-04T22:49:13", + "modified_gmt": "2020-09-04T22:49:13", + "slug": "wp-1599259750308", + "status": "inherit", + "type": "attachment", + "link": "https://weekendbakesblog.wordpress.com/wp-1599259750308/", + "title": { + "rendered": "wp-1599259750308.jpg" + }, + "author": 191794483, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/acjyGG-P", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 1080, + "height": 1920, + "file": "2020/09/wp-1599259750308.jpg", + "sizes": { + "thumbnail": { + "file": "wp-1599259750308.jpg?w=84", + "width": 84, + "height": 150, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750308.jpg?w=84" + }, + "medium": { + "file": "wp-1599259750308.jpg?w=169", + "width": 169, + "height": 300, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750308.jpg?w=169" + }, + "large": { + "file": "wp-1599259750308.jpg?w=576", + "width": 576, + "height": 1024, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750308.jpg?w=576" + }, + "full": { + "file": "wp-1599259750308.jpg", + "width": 1024, + "height": 1820, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750308.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "filesize": 1292188 + }, + "post": null, + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750308.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/media/51" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/users/191794483" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/comments?post=51" + } + ] + } + }, + { + "id": 50, + "date": "2020-09-04T22:49:13", + "date_gmt": "2020-09-04T22:49:13", + "guid": { + "rendered": "http://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750265.jpg" + }, + "modified": "2020-09-04T22:49:13", + "modified_gmt": "2020-09-04T22:49:13", + "slug": "wp-1599259750265", + "status": "inherit", + "type": "attachment", + "link": "https://weekendbakesblog.wordpress.com/wp-1599259750265/", + "title": { + "rendered": "wp-1599259750265.jpg" + }, + "author": 191794483, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/acjyGG-O", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 1080, + "height": 1920, + "file": "2020/09/wp-1599259750265.jpg", + "sizes": { + "thumbnail": { + "file": "wp-1599259750265.jpg?w=84", + "width": 84, + "height": 150, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750265.jpg?w=84" + }, + "medium": { + "file": "wp-1599259750265.jpg?w=169", + "width": 169, + "height": 300, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750265.jpg?w=169" + }, + "large": { + "file": "wp-1599259750265.jpg?w=576", + "width": 576, + "height": 1024, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750265.jpg?w=576" + }, + "full": { + "file": "wp-1599259750265.jpg", + "width": 1024, + "height": 1820, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750265.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "filesize": 1645026 + }, + "post": null, + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/09/wp-1599259750265.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/media/50" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/users/191794483" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/comments?post=50" + } + ] + } + }, + { + "id": 49, + "date": "2020-08-26T22:12:44", + "date_gmt": "2020-08-26T22:12:44", + "guid": { + "rendered": "http://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-732548.jpg" + }, + "modified": "2020-08-26T22:12:44", + "modified_gmt": "2020-08-26T22:12:44", + "slug": "pexels-photo-732548", + "status": "inherit", + "type": "attachment", + "link": "https://weekendbakesblog.wordpress.com/pexels-photo-732548/", + "title": { + "rendered": "pexels-photo-732548" + }, + "author": 191794483, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/acjyGG-N", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 1880, + "height": 1253, + "file": "2020/08/pexels-photo-732548.jpg", + "sizes": { + "thumbnail": { + "file": "pexels-photo-732548.jpg?w=150", + "width": 150, + "height": 100, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-732548.jpg?w=150" + }, + "medium": { + "file": "pexels-photo-732548.jpg?w=300", + "width": 300, + "height": 200, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-732548.jpg?w=300" + }, + "large": { + "file": "pexels-photo-732548.jpg?w=1024", + "width": 1024, + "height": 682, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-732548.jpg?w=1024" + }, + "full": { + "file": "pexels-photo-732548.jpg", + "width": 1024, + "height": 682, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-732548.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "filesize": 2850496 + }, + "post": null, + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-732548.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/media/49" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/users/191794483" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/comments?post=49" + } + ] + } + }, + { + "id": 48, + "date": "2020-08-26T22:12:44", + "date_gmt": "2020-08-26T22:12:44", + "guid": { + "rendered": "http://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-131723.jpg" + }, + "modified": "2020-08-26T22:12:44", + "modified_gmt": "2020-08-26T22:12:44", + "slug": "pexels-photo-131723", + "status": "inherit", + "type": "attachment", + "link": "https://weekendbakesblog.wordpress.com/pexels-photo-131723/", + "title": { + "rendered": "pexels-photo-131723" + }, + "author": 191794483, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/acjyGG-M", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 1880, + "height": 1249, + "file": "2020/08/pexels-photo-131723.jpg", + "sizes": { + "thumbnail": { + "file": "pexels-photo-131723.jpg?w=150", + "width": 150, + "height": 100, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-131723.jpg?w=150" + }, + "medium": { + "file": "pexels-photo-131723.jpg?w=300", + "width": 300, + "height": 199, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-131723.jpg?w=300" + }, + "large": { + "file": "pexels-photo-131723.jpg?w=1024", + "width": 1024, + "height": 680, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-131723.jpg?w=1024" + }, + "full": { + "file": "pexels-photo-131723.jpg", + "width": 1024, + "height": 680, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-131723.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "filesize": 2579198 + }, + "post": null, + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-131723.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/media/48" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/users/191794483" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/comments?post=48" + } + ] + } + }, + { + "id": 47, + "date": "2020-08-26T22:12:44", + "date_gmt": "2020-08-26T22:12:44", + "guid": { + "rendered": "http://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-1237119.jpg" + }, + "modified": "2020-08-26T22:12:44", + "modified_gmt": "2020-08-26T22:12:44", + "slug": "pexels-photo-1237119", + "status": "inherit", + "type": "attachment", + "link": "https://weekendbakesblog.wordpress.com/pexels-photo-1237119/", + "title": { + "rendered": "pexels-photo-1237119" + }, + "author": 191794483, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/acjyGG-L", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 1880, + "height": 1250, + "file": "2020/08/pexels-photo-1237119.jpg", + "sizes": { + "thumbnail": { + "file": "pexels-photo-1237119.jpg?w=150", + "width": 150, + "height": 100, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-1237119.jpg?w=150" + }, + "medium": { + "file": "pexels-photo-1237119.jpg?w=300", + "width": 300, + "height": 199, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-1237119.jpg?w=300" + }, + "large": { + "file": "pexels-photo-1237119.jpg?w=1024", + "width": 1024, + "height": 681, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-1237119.jpg?w=1024" + }, + "full": { + "file": "pexels-photo-1237119.jpg", + "width": 1024, + "height": 681, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-1237119.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "filesize": 2424849 + }, + "post": null, + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-1237119.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/media/47" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/users/191794483" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/comments?post=47" + } + ] + } + }, + { + "id": 46, + "date": "2020-08-26T22:12:44", + "date_gmt": "2020-08-26T22:12:44", + "guid": { + "rendered": "http://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-371589.jpg" + }, + "modified": "2020-08-26T22:12:44", + "modified_gmt": "2020-08-26T22:12:44", + "slug": "pexels-photo-371589", + "status": "inherit", + "type": "attachment", + "link": "https://weekendbakesblog.wordpress.com/pexels-photo-371589/", + "title": { + "rendered": "pexels-photo-371589" + }, + "author": 191794483, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/acjyGG-K", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 1880, + "height": 1293, + "file": "2020/08/pexels-photo-371589.jpg", + "sizes": { + "thumbnail": { + "file": "pexels-photo-371589.jpg?w=150", + "width": 150, + "height": 103, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-371589.jpg?w=150" + }, + "medium": { + "file": "pexels-photo-371589.jpg?w=300", + "width": 300, + "height": 206, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-371589.jpg?w=300" + }, + "large": { + "file": "pexels-photo-371589.jpg?w=1024", + "width": 1024, + "height": 704, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-371589.jpg?w=1024" + }, + "full": { + "file": "pexels-photo-371589.jpg", + "width": 1024, + "height": 704, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-371589.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "filesize": 2563558 + }, + "post": null, + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-371589.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/media/46" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/users/191794483" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/comments?post=46" + } + ] + } + }, + { + "id": 45, + "date": "2020-08-26T22:12:44", + "date_gmt": "2020-08-26T22:12:44", + "guid": { + "rendered": "http://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-235734.jpg" + }, + "modified": "2020-08-26T22:12:44", + "modified_gmt": "2020-08-26T22:12:44", + "slug": "pexels-photo-235734", + "status": "inherit", + "type": "attachment", + "link": "https://weekendbakesblog.wordpress.com/pexels-photo-235734/", + "title": { + "rendered": "pexels-photo-235734" + }, + "author": 191794483, + "comment_status": "open", + "ping_status": "closed", + "template": "", + "meta": { + "_coblocks_attr": "", + "_coblocks_dimensions": "", + "_coblocks_responsive_height": "", + "_coblocks_accordion_ie_support": "", + "advanced_seo_description": "", + "amp_status": "", + "spay_email": "" + }, + "jetpack_shortlink": "https://wp.me/acjyGG-J", + "jetpack_sharing_enabled": true, + "jetpack_likes_enabled": true, + "description": { + "rendered": "

\"\"

\n" + }, + "caption": { + "rendered": "" + }, + "alt_text": "", + "media_type": "image", + "mime_type": "image/jpeg", + "media_details": { + "width": 1880, + "height": 1253, + "file": "2020/08/pexels-photo-235734.jpg", + "sizes": { + "thumbnail": { + "file": "pexels-photo-235734.jpg?w=150", + "width": 150, + "height": 100, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-235734.jpg?w=150" + }, + "medium": { + "file": "pexels-photo-235734.jpg?w=300", + "width": 300, + "height": 200, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-235734.jpg?w=300" + }, + "large": { + "file": "pexels-photo-235734.jpg?w=1024", + "width": 1024, + "height": 682, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-235734.jpg?w=1024" + }, + "full": { + "file": "pexels-photo-235734.jpg", + "width": 1024, + "height": 682, + "mime_type": "image/jpeg", + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-235734.jpg" + } + }, + "image_meta": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "filesize": 2317303 + }, + "post": null, + "source_url": "https://weekendbakesblog.files.wordpress.com/2020/08/pexels-photo-235734.jpg", + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/media/45" + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/media" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/types/attachment" + } + ], + "author": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/users/191794483" + } + ], + "replies": [ + { + "embeddable": true, + "href": "{{request.requestLine.baseUrl}}/wp/v2/sites/181977606/comments?post=45" + } + ] + } + } + ], + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/default-notifications.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/default-notifications.json new file mode 100644 index 000000000000..fc59d0f47d15 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/default-notifications.json @@ -0,0 +1,7947 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/notifications", + "queryParameters": { + "number": { + "equalTo": "200" + }, + "locale": { + "matches": "(.*)" + }, + "fields": { + "equalTo": "id,type,unread,body,subject,timestamp,meta" + }, + "num_note_items": { + "equalTo": "20" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "last_seen_time": "1553125740", + "number": 52, + "notes": [ + { + "id": 3864303999, + "type": "post_milestone_achievement", + "read": 1, + "noticon": "", + "timestamp": "2019-03-20T23:49:00+00:00", + "icon": "https://s.wp.com/wp-content/mu-plugins/achievements/post-milestone-1-2x.png", + "url": "http://wordpress.com/trophy-case/", + "subject": [ + { + "text": "You've made your first post on In Focus Photography.", + "ranges": [ + { + "type": "site", + "indices": [ + 31, + 51 + ], + "url": "http://infocusphotographers.wordpress.com", + "id": 106707880 + } + ] + } + ], + "body": [ + { + "text": "First Post", + "media": [ + { + "type": "badge", + "indices": [ + 0, + 10 + ], + "height": "256", + "width": "256", + "url": "https://s.wp.com/wp-content/mu-plugins/achievements/post-milestone-1-2x.png" + } + ] + }, + { + "text": "Congratulations on writing your first post on In Focus Photography!", + "ranges": [ + { + "type": "site", + "indices": [ + 46, + 66 + ], + "url": "http://infocusphotographers.wordpress.com", + "id": 106707880 + } + ] + } + ], + "meta": { + "ids": { + "site": 106707880 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/106707880" + } + }, + "title": "First Post" + }, + { + "id": 1304254364, + "type": "follow", + "read": 1, + "noticon": "", + "timestamp": "2019-01-29T07:32:12+00:00", + "icon": "https://1.gravatar.com/avatar/dc6812f0d56d01c8d8a1f126458ffa7e?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "http://thenomadicwordsmith.wordpress.com", + "subject": [ + { + "text": "Riley Watts and 6 others followed your blog Words, Whimsy, and the World", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 14 + ], + "url": "http://example.wordpress.com", + "site_id": 157098772, + "email": "example@wordpress.com", + "id": 136100716 + }, + { + "type": "site", + "indices": [ + 47, + 75 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + } + ], + "body": [ + { + "text": "Riley Watts", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://example.wordpress.com", + "id": 136100716, + "site_id": 157098772, + "type": "user", + "indices": [ + 0, + 14 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/dc6812f0d56d01c8d8a1f126458ffa7e?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://example.wordpress.com" + }, + "ids": { + "user": 136100716, + "site": 157098772 + }, + "titles": { + "home": "Site Title" + } + }, + "type": "user" + }, + { + "text": "Chloe Mosley", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://ybsm.wordpress.com", + "id": 911487, + "site_id": 878232, + "type": "user", + "indices": [ + 0, + 10 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/bd3072753daa7e03db6ec81716a662c1?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://ybsm.wordpress.com" + }, + "ids": { + "user": 911487, + "site": 878232 + }, + "titles": { + "home": "ybsm", + "tagline": "Just a diary. Read ybsm as yabusame. That's it." + } + }, + "type": "user" + }, + { + "text": "Rowan Shy", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://Rowanslittlenotes.wordpress.com", + "id": 126856765, + "site_id": 134651623, + "type": "user", + "indices": [ + 0, + 9 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/a16c450344e13c52abe9b7bb5b3ef103?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://Rowanslittlenotes.wordpress.com" + }, + "ids": { + "user": 126856765, + "site": 134651623 + }, + "titles": { + "home": "Rowan's little notes", + "tagline": "Learn about my life, recent events and hamsters" + } + }, + "type": "user" + }, + { + "text": "Bobby Whitaker", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://asterisk15.wordpress.com", + "id": 51178141, + "site_id": 53437676, + "type": "user", + "indices": [ + 0, + 13 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/7b1a301d11cd8c5639e01dfb4dd56b85?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://asterisk15.wordpress.com" + }, + "ids": { + "user": 51178141, + "site": 53437676 + }, + "titles": { + "home": "Mother Nature" + } + }, + "type": "user" + }, + { + "text": "Lisa S.", + "ranges": [ + { + "email": "example@wordpress.com", + "id": 74005263, + "type": "user", + "indices": [ + 0, + 7 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/88fa4a65e2d06dcf34c98c038e827e10?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "meta": { + "links": { + "email": "example@wordpress.com" + }, + "ids": { + "user": 74005263 + } + }, + "type": "user" + }, + { + "text": "Mark", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://iamtestingthisyay.wordpress.com", + "id": 74004255, + "site_id": 78387788, + "type": "user", + "indices": [ + 0, + 4 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/54d388fd4592cfed0b14bd1d52f80185?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://iamtestingthisyay.wordpress.com" + }, + "ids": { + "user": 74004255, + "site": 78387788 + }, + "titles": { + "home": "Nature Walks", + "tagline": "Exploring the countryside" + } + }, + "type": "user" + }, + { + "text": "PlayWithLIfE", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://www.playwithlife.org", + "id": 52196013, + "type": "user", + "indices": [ + 0, + 12 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/0e2284b177e549f3aab7138978122408?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://www.playwithlife.org" + }, + "ids": { + "user": 52196013 + } + }, + "type": "user" + } + ], + "meta": { + "ids": { + "site": 71769073 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "title": "7 Followers", + "header": [ + { + "text": "Words, Whimsy, and the World", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 28 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "id": 71769073 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://www.gravatar.com/avatar/ad516503a11cd5ca435acc9bb6523536?s=128" + } + ] + }, + { + "text": "Stories and images from The Nomadic Wordsmith" + } + ] + }, + { + "id": 3658516170, + "type": "like", + "read": 1, + "noticon": "", + "timestamp": "2018-11-24T02:09:15+00:00", + "icon": "https://1.gravatar.com/avatar/d20d9beb90a8e4c049135bb43c0c7c6e?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2015/07/20/along-the-coast-2/", + "subject": [ + { + "text": "Brenton Hebert and documentedwanderlust liked your post Along the Coast", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 13 + ], + "url": "http://chaoticshapes.wordpress.com", + "site_id": 123568371, + "email": "example@wordpress.com", + "id": 116518196 + }, + { + "type": "user", + "indices": [ + 18, + 38 + ], + "url": "http://documentedwanderlust.wordpress.com", + "site_id": 108361066, + "email": "example@wordpress.com", + "id": 102352165 + }, + { + "type": "post", + "indices": [ + 55, + 70 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2015/07/20/along-the-coast-2/", + "site_id": 71769073, + "id": 132 + } + ] + } + ], + "body": [ + { + "text": "Brenton Hebert", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://chaoticshapes.wordpress.com", + "id": 116518196, + "site_id": 123568371, + "type": "user", + "indices": [ + 0, + 13 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/d20d9beb90a8e4c049135bb43c0c7c6e?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://chaoticshapes.wordpress.com" + }, + "ids": { + "user": 116518196, + "site": 123568371 + }, + "titles": { + "home": "Chaotic Shapes", + "tagline": "Art and Lifestyle by Brenton Hebert" + } + }, + "type": "user" + }, + { + "text": "documentedwanderlust", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://documentedwanderlust.wordpress.com", + "id": 102352165, + "site_id": 108361066, + "type": "user", + "indices": [ + 0, + 20 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/bd5dc704bef73822c2247434f91e025f?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://documentedwanderlust.wordpress.com" + }, + "ids": { + "user": 102352165, + "site": 108361066 + }, + "titles": { + "home": "Documented Wanderlust" + } + }, + "type": "user" + } + ], + "meta": { + "ids": { + "site": 71769073, + "post": 132 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/132" + } + }, + "title": "2 Likes", + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Along the Coast" + } + ] + }, + { + "id": 3658516156, + "type": "like", + "read": 1, + "noticon": "", + "timestamp": "2018-11-24T02:09:14+00:00", + "icon": "https://1.gravatar.com/avatar/d20d9beb90a8e4c049135bb43c0c7c6e?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2016/01/28/along-the-coast-4/", + "subject": [ + { + "text": "Brenton Hebert liked your post Along the Coast", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 13 + ], + "url": "http://chaoticshapes.wordpress.com", + "site_id": 123568371, + "email": "example@wordpress.com", + "id": 116518196 + }, + { + "type": "post", + "indices": [ + 30, + 45 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2016/01/28/along-the-coast-4/", + "site_id": 71769073, + "id": 147 + } + ] + } + ], + "body": [ + { + "text": "Brenton Hebert", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://chaoticshapes.wordpress.com", + "id": 116518196, + "site_id": 123568371, + "type": "user", + "indices": [ + 0, + 13 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/d20d9beb90a8e4c049135bb43c0c7c6e?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://chaoticshapes.wordpress.com" + }, + "ids": { + "user": 116518196, + "site": 123568371 + }, + "titles": { + "home": "Chaotic Shapes", + "tagline": "Art and Lifestyle by Brenton Hebert" + } + }, + "type": "user" + } + ], + "meta": { + "ids": { + "site": 71769073, + "post": 147 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/147" + } + }, + "title": "1 Like", + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Along the Coast" + } + ] + }, + { + "id": 3467659357, + "type": "like", + "read": 1, + "noticon": "", + "timestamp": "2018-11-24T02:09:13+00:00", + "icon": "https://1.gravatar.com/avatar/d20d9beb90a8e4c049135bb43c0c7c6e?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2016/08/25/along-the-coast-6/", + "subject": [ + { + "text": "Brenton Hebert and 2 others liked your post Along the Coast", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 13 + ], + "url": "http://chaoticshapes.wordpress.com", + "site_id": 123568371, + "email": "example@wordpress.com", + "id": 116518196 + }, + { + "type": "post", + "indices": [ + 43, + 58 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2016/08/25/along-the-coast-6/", + "site_id": 71769073, + "id": 161 + } + ] + } + ], + "body": [ + { + "text": "Brenton Hebert", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://chaoticshapes.wordpress.com", + "id": 116518196, + "site_id": 123568371, + "type": "user", + "indices": [ + 0, + 13 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/d20d9beb90a8e4c049135bb43c0c7c6e?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://chaoticshapes.wordpress.com" + }, + "ids": { + "user": 116518196, + "site": 123568371 + }, + "titles": { + "home": "Chaotic Shapes", + "tagline": "Art and Lifestyle by Brenton Hebert" + } + }, + "type": "user" + }, + { + "text": "Riley Watts", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://example.wordpress.com", + "id": 136100716, + "site_id": 157098772, + "type": "user", + "indices": [ + 0, + 14 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/dc6812f0d56d01c8d8a1f126458ffa7e?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://example.wordpress.com" + }, + "ids": { + "user": 136100716, + "site": 157098772 + }, + "titles": { + "home": "Site Title" + } + }, + "type": "user" + }, + { + "text": "Chloe Mosley", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://ybsm.wordpress.com", + "id": 911487, + "site_id": 878232, + "type": "user", + "indices": [ + 0, + 10 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/bd3072753daa7e03db6ec81716a662c1?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://ybsm.wordpress.com" + }, + "ids": { + "user": 911487, + "site": 878232 + }, + "titles": { + "home": "ybsm", + "tagline": "Just a diary. Read ybsm as yabusame. That's it." + } + }, + "type": "user" + } + ], + "meta": { + "ids": { + "site": 71769073, + "post": 161 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/161" + } + }, + "title": "3 Likes", + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Along the Coast" + } + ] + }, + { + "id": 3528647758, + "type": "like", + "read": 1, + "noticon": "", + "timestamp": "2018-09-03T06:30:38+00:00", + "icon": "https://1.gravatar.com/avatar/dc6812f0d56d01c8d8a1f126458ffa7e?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/10/25/along-the-coast/", + "subject": [ + { + "text": "Riley Watts liked your post Along the Coast", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 14 + ], + "url": "http://example.wordpress.com", + "site_id": 157098772, + "email": "example@wordpress.com", + "id": 136100716 + }, + { + "type": "post", + "indices": [ + 31, + 46 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/10/25/along-the-coast/", + "site_id": 71769073, + "id": 79 + } + ] + } + ], + "body": [ + { + "text": "Riley Watts", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://example.wordpress.com", + "id": 136100716, + "site_id": 157098772, + "type": "user", + "indices": [ + 0, + 14 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/dc6812f0d56d01c8d8a1f126458ffa7e?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://example.wordpress.com" + }, + "ids": { + "user": 136100716, + "site": 157098772 + }, + "titles": { + "home": "Site Title" + } + }, + "type": "user" + } + ], + "meta": { + "ids": { + "site": 71769073, + "post": 79 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/79" + } + }, + "title": "1 Like", + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Along the Coast" + } + ] + }, + { + "id": 3473753915, + "type": "achieve_user_anniversary", + "read": 1, + "noticon": "", + "timestamp": "2018-07-24T18:13:52+00:00", + "icon": "https://s.wp.com/wp-content/mu-plugins/achievements/anniversary-2x.png", + "url": "http://wordpress.com/trophy-case/", + "subject": [ + { + "text": "Happy Anniversary with WordPress.com!" + } + ], + "body": [ + { + "text": "4 Year Anniversary Achievement", + "media": [ + { + "type": "badge", + "indices": [ + 0, + 30 + ], + "height": "256", + "width": "256", + "url": "https://s.wp.com/wp-content/mu-plugins/achievements/anniversary-2x.png" + } + ] + }, + { + "text": "Happy Anniversary with WordPress.com!" + }, + { + "text": "You registered on WordPress.com 4 years ago." + }, + { + "text": "Thanks for flying with us. Keep up the good blogging." + } + ], + "title": "Achievement" + }, + { + "id": 3467659628, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2018-07-19T23:46:17+00:00", + "icon": "https://2.gravatar.com/avatar/bd3072753daa7e03db6ec81716a662c1?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2016/08/25/along-the-coast-6/comment-page-1/#comment-35", + "subject": [ + { + "text": "Chloe Mosley commented on Along the Coast", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 10 + ], + "url": "http://ybsm.wordpress.com", + "site_id": 878232, + "email": "example@wordpress.com", + "id": 911487 + }, + { + "type": "post", + "indices": [ + 24, + 39 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2016/08/25/along-the-coast-6/", + "site_id": 71769073, + "id": 161 + } + ] + }, + { + "text": "If we could somehow harness this lightning, we could go back to the future!\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 76 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2016/08/25/along-the-coast-6/comment-page-1/#comment-35", + "site_id": 71769073, + "post_id": 161, + "id": 35 + } + ] + } + ], + "body": [ + { + "text": "Chloe Mosley", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://ybsm.wordpress.com", + "id": 911487, + "site_id": 878232, + "type": "user", + "indices": [ + 0, + 10 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/bd3072753daa7e03db6ec81716a662c1?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://ybsm.wordpress.com" + }, + "ids": { + "user": 911487, + "site": 878232 + }, + "titles": { + "home": "ybsm", + "tagline": "Just a diary. Read ybsm as yabusame. That's it." + } + }, + "type": "user" + }, + { + "text": "If we could somehow harness this lightning, we could go back to the future!", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 35, + "user": 911487, + "post": 161, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/35", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/911487", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/161", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/35?action=edit" + } + ], + "meta": { + "ids": { + "user": 911487, + "comment": 35, + "post": 161, + "site": 71769073 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/911487", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/35", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/161", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Along the Coast" + } + ], + "title": "Comment" + }, + { + "id": 2985661262, + "type": "followed_milestone_achievement", + "read": 1, + "noticon": "", + "timestamp": "2017-07-07T20:45:02+00:00", + "icon": "https://s.wp.com/wp-content/mu-plugins/achievements/followed-blog-5-2x.png", + "url": "http://wordpress.com/trophy-case/", + "subject": [ + { + "text": "You've received 5 follows on Words, Whimsy, and the World.", + "ranges": [ + { + "type": "site", + "indices": [ + 29, + 57 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + } + ], + "body": [ + { + "text": "5 Follows!", + "media": [ + { + "type": "badge", + "indices": [ + 0, + 10 + ], + "height": "256", + "width": "256", + "url": "https://s.wp.com/wp-content/mu-plugins/achievements/followed-blog-5-2x.png" + } + ] + }, + { + "text": "Congratulations on getting 5 total follows on Words, Whimsy, and the World!", + "ranges": [ + { + "type": "site", + "indices": [ + 46, + 74 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + }, + { + "text": "Your current tally is 7." + } + ], + "meta": { + "ids": { + "site": 71769073 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "title": "5 Followers!" + }, + { + "id": 2584083750, + "type": "post_milestone_achievement", + "read": 1, + "noticon": "", + "timestamp": "2016-08-17T18:28:59+00:00", + "icon": "https://s.wp.com/wp-content/mu-plugins/achievements/post-milestone-20-2x.png", + "url": "http://wordpress.com/trophy-case/", + "subject": [ + { + "text": "You've made 20 posts on Words, Whimsy, and the World.", + "ranges": [ + { + "type": "site", + "indices": [ + 24, + 52 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + } + ], + "body": [ + { + "text": "20 Posts", + "media": [ + { + "type": "badge", + "indices": [ + 0, + 8 + ], + "height": "256", + "width": "256", + "url": "https://s.wp.com/wp-content/mu-plugins/achievements/post-milestone-20-2x.png" + } + ] + }, + { + "text": "Congratulations on writing 20 posts on Words, Whimsy, and the World!", + "ranges": [ + { + "type": "site", + "indices": [ + 39, + 67 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + } + ], + "meta": { + "ids": { + "site": 71769073 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "title": "20 Posts" + }, + { + "id": 1993981732, + "type": "achieve_user_anniversary", + "read": 1, + "noticon": "", + "timestamp": "2015-08-06T20:43:05+00:00", + "icon": "https://s.wp.com/wp-content/mu-plugins/achievements/anniversary-2x.png", + "url": "http://wordpress.com/trophy-case/", + "subject": [ + { + "text": "Happy Anniversary with WordPress.com!" + } + ], + "body": [ + { + "text": "1 Year Anniversary Achievement", + "media": [ + { + "type": "badge", + "indices": [ + 0, + 30 + ], + "height": "256", + "width": "256", + "url": "https://s.wp.com/wp-content/mu-plugins/achievements/anniversary-2x.png" + } + ] + }, + { + "text": "Happy Anniversary with WordPress.com!" + }, + { + "text": "You registered on WordPress.com one year ago." + }, + { + "text": "Thanks for flying with us. Keep up the good blogging." + } + ], + "title": "Achievement" + }, + { + "id": 1305979273, + "type": "like", + "read": 1, + "noticon": "", + "timestamp": "2015-05-30T18:20:54+00:00", + "icon": "https://1.gravatar.com/avatar/7b1a301d11cd8c5639e01dfb4dd56b85?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/about/", + "subject": [ + { + "text": "Bobby Whitaker and 2 others liked your post About This Nomad", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 13 + ], + "url": "http://asterisk15.wordpress.com", + "site_id": 53437676, + "email": "example@wordpress.com", + "id": 51178141 + }, + { + "type": "post", + "indices": [ + 43, + 59 + ], + "url": "https://thenomadicwordsmith.wordpress.com/about/", + "site_id": 71769073, + "id": 1 + } + ] + } + ], + "body": [ + { + "text": "Bobby Whitaker", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://asterisk15.wordpress.com", + "id": 51178141, + "site_id": 53437676, + "type": "user", + "indices": [ + 0, + 13 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/7b1a301d11cd8c5639e01dfb4dd56b85?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://asterisk15.wordpress.com" + }, + "ids": { + "user": 51178141, + "site": 53437676 + }, + "titles": { + "home": "Mother Nature" + } + }, + "type": "user" + }, + { + "text": "Nancy T.", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://thisismyportfolioyay.wordpress.com", + "id": 74237684, + "site_id": 45151698, + "type": "user", + "indices": [ + 0, + 8 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/4e3309b5cf977f89206c1dbb2b00e8e3?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": true + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://thisismyportfolioyay.wordpress.com" + }, + "ids": { + "user": 74237684, + "site": 45151698 + }, + "titles": { + "home": "Writing Bytes" + } + }, + "type": "user" + }, + { + "text": "Cheri Lucas Rowlands", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://cherilucasrowlands.com", + "id": 10183950, + "site_id": 9838404, + "type": "user", + "indices": [ + 0, + 20 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/36207d4c7c014b0999b995ca3971d383?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://cherilucasrowlands.com" + }, + "ids": { + "user": 10183950, + "site": 9838404 + }, + "titles": { + "home": "Cheri Lucas Rowlands" + } + }, + "type": "user" + } + ], + "meta": { + "ids": { + "site": 71769073, + "post": 1 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/1" + } + }, + "title": "3 Likes", + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "About This Nomad" + } + ] + }, + { + "id": 1478993708, + "type": "traffic_surge", + "read": 1, + "noticon": "", + "timestamp": "2014-11-01T16:17:37+00:00", + "icon": "https://s.wp.com/wp-content/mu-plugins/notes/images/traffic-surge-note-icon-256.png", + "url": "https://wordpress.com/stats/day/thenomadicwordsmith.wordpress.com?startDate=2014-11-01", + "subject": [ + { + "text": "Your stats are booming! Words, Whimsy, and the World is getting lots of traffic.", + "ranges": [ + { + "type": "site", + "indices": [ + 24, + 52 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + } + ], + "body": [ + { + "text": "", + "media": [ + { + "type": "badge", + "indices": [ + 0, + 0 + ], + "url": "https://s.wp.com/wp-content/mu-plugins/notes/images/traffic-surge-note-icon-256.png" + } + ] + }, + { + "text": "Your blog, Words, Whimsy, and the World, appears to be getting more traffic than usual! 26 hourly views - 1 hourly views on average", + "ranges": [ + { + "type": "site", + "indices": [ + 11, + 39 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + }, + { + "text": "A spike in your stats", + "ranges": [ + { + "url": "https://wordpress.com/stats/day/thenomadicwordsmith.wordpress.com?startDate=2014-11-01", + "indices": [ + 11, + 21 + ], + "type": "stat", + "site_id": 71769073 + } + ] + } + ], + "meta": { + "ids": { + "site": 71769073 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "title": "Boom!" + }, + { + "id": 1477873727, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2014-11-01T01:45:35+00:00", + "icon": "https://1.gravatar.com/avatar/4e3309b5cf977f89206c1dbb2b00e8e3?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/two-more-hours/comment-page-1/#comment-30", + "subject": [ + { + "text": "Nancy T. commented on Two More Hours: For Writing, For Magic", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 8 + ], + "url": "http://thisismyportfolioyay.wordpress.com", + "site_id": 45151698, + "email": "example@wordpress.com", + "id": 74237684 + }, + { + "type": "post", + "indices": [ + 22, + 60 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/two-more-hours/", + "site_id": 71769073, + "id": 18 + } + ] + }, + { + "text": "Lovely, thoughtful writing. Thank you.\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 39 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/two-more-hours/comment-page-1/#comment-30", + "site_id": 71769073, + "post_id": 18, + "id": 30 + } + ] + } + ], + "body": [ + { + "text": "Nancy T.", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://thisismyportfolioyay.wordpress.com", + "id": 74237684, + "site_id": 45151698, + "type": "user", + "indices": [ + 0, + 8 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/4e3309b5cf977f89206c1dbb2b00e8e3?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": true + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://thisismyportfolioyay.wordpress.com" + }, + "ids": { + "user": 74237684, + "site": 45151698 + }, + "titles": { + "home": "Writing Bytes" + } + }, + "type": "user" + }, + { + "text": "Lovely, thoughtful writing. Thank you.", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 30, + "user": 74237684, + "post": 18, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/30", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74237684", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/18", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/30?action=edit" + } + ], + "meta": { + "ids": { + "user": 74237684, + "comment": 30, + "post": 18, + "site": 71769073 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74237684", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/30", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/18", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Two More Hours: For Writing, For Magic" + } + ], + "title": "Comment" + }, + { + "id": 1477860339, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2014-11-01T01:34:30+00:00", + "icon": "https://2.gravatar.com/avatar/54d388fd4592cfed0b14bd1d52f80185?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/burning-man/comment-page-1/#comment-27", + "subject": [ + { + "text": "Mark commented on Roaming in the Desert", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 4 + ], + "url": "http://iamtestingthisyay.wordpress.com", + "site_id": 78387788, + "email": "example@wordpress.com", + "id": 74004255 + }, + { + "type": "post", + "indices": [ + 18, + 39 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/burning-man/", + "site_id": 71769073, + "id": 45 + } + ] + }, + { + "text": "Very cool poem and photographs.\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 32 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/burning-man/comment-page-1/#comment-27", + "site_id": 71769073, + "post_id": 45, + "id": 27 + } + ] + } + ], + "body": [ + { + "text": "Mark", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://iamtestingthisyay.wordpress.com", + "id": 74004255, + "site_id": 78387788, + "type": "user", + "indices": [ + 0, + 4 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/54d388fd4592cfed0b14bd1d52f80185?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://iamtestingthisyay.wordpress.com" + }, + "ids": { + "user": 74004255, + "site": 78387788 + }, + "titles": { + "home": "Nature Walks", + "tagline": "Exploring the countryside" + } + }, + "type": "user" + }, + { + "text": "Very cool poem and photographs.", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 27, + "user": 74004255, + "post": 45, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/27", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74004255", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/45", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/27?action=edit" + } + ], + "meta": { + "ids": { + "user": 74004255, + "comment": 27, + "post": 45, + "site": 71769073 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74004255", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/27", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/45", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Roaming in the Desert" + } + ], + "title": "Comment" + }, + { + "id": 1304317703, + "type": "like", + "read": 1, + "noticon": "", + "timestamp": "2014-10-29T00:14:29+00:00", + "icon": "https://1.gravatar.com/avatar/a494890f130ef2b12dba43c21e1ea028?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/burning-man/", + "subject": [ + { + "text": "Meredith and Cheri Lucas Rowlands liked your post Roaming in the Desert", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 8 + ], + "url": "http://stupidmatters.com", + "site_id": 58167694, + "email": "example@wordpress.com", + "id": 25855508 + }, + { + "type": "user", + "indices": [ + 13, + 33 + ], + "url": "http://cherilucasrowlands.com", + "site_id": 9838404, + "email": "example@wordpress.com", + "id": 10183950 + }, + { + "type": "post", + "indices": [ + 50, + 71 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/burning-man/", + "site_id": 71769073, + "id": 45 + } + ] + } + ], + "body": [ + { + "text": "Meredith", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://stupidmatters.com", + "id": 25855508, + "site_id": 58167694, + "type": "user", + "indices": [ + 0, + 8 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/a494890f130ef2b12dba43c21e1ea028?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://stupidmatters.com" + }, + "ids": { + "user": 25855508, + "site": 58167694 + }, + "titles": { + "home": "Stupid Matters", + "tagline": "Finding brilliance in the obvious and humor in the dumb." + } + }, + "type": "user" + }, + { + "text": "Cheri Lucas Rowlands", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://cherilucasrowlands.com", + "id": 10183950, + "site_id": 9838404, + "type": "user", + "indices": [ + 0, + 20 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/36207d4c7c014b0999b995ca3971d383?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://cherilucasrowlands.com" + }, + "ids": { + "user": 10183950, + "site": 9838404 + }, + "titles": { + "home": "Cheri Lucas Rowlands" + } + }, + "type": "user" + } + ], + "meta": { + "ids": { + "site": 71769073, + "post": 45 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/45" + } + }, + "title": "2 Likes", + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Roaming in the Desert" + } + ] + }, + { + "id": 1469692035, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2014-10-28T00:56:32+00:00", + "icon": "https://2.gravatar.com/avatar/54d388fd4592cfed0b14bd1d52f80185?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/on-blogging-2/comment-page-1/#comment-24", + "subject": [ + { + "text": "Mark commented on Great Perspective on Blogging", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 4 + ], + "url": "http://iamtestingthisyay.wordpress.com", + "site_id": 78387788, + "email": "example@wordpress.com", + "id": 74004255 + }, + { + "type": "post", + "indices": [ + 18, + 47 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/on-blogging-2/", + "site_id": 71769073, + "id": 40 + } + ] + }, + { + "text": "Nice perspective on blogging — thanks.\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 39 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/on-blogging-2/comment-page-1/#comment-24", + "site_id": 71769073, + "post_id": 40, + "id": 24 + } + ] + } + ], + "body": [ + { + "text": "Mark", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://iamtestingthisyay.wordpress.com", + "id": 74004255, + "site_id": 78387788, + "type": "user", + "indices": [ + 0, + 4 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/54d388fd4592cfed0b14bd1d52f80185?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://iamtestingthisyay.wordpress.com" + }, + "ids": { + "user": 74004255, + "site": 78387788 + }, + "titles": { + "home": "Nature Walks", + "tagline": "Exploring the countryside" + } + }, + "type": "user" + }, + { + "text": "Nice perspective on blogging — thanks.", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 24, + "user": 74004255, + "post": 40, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/24", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74004255", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/40", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/24?action=edit" + } + ], + "meta": { + "ids": { + "user": 74004255, + "comment": 24, + "post": 40, + "site": 71769073 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74004255", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/24", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/40", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Great Perspective on Blogging" + } + ], + "title": "Comment" + }, + { + "id": 1469662312, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2014-10-28T00:31:29+00:00", + "icon": "https://1.gravatar.com/avatar/4e3309b5cf977f89206c1dbb2b00e8e3?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/08/22/out-to-sea/comment-page-1/#comment-23", + "subject": [ + { + "text": "Nancy T. commented on Out to Sea", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 8 + ], + "url": "http://thisismyportfolioyay.wordpress.com", + "site_id": 45151698, + "email": "example@wordpress.com", + "id": 74237684 + }, + { + "type": "post", + "indices": [ + 22, + 32 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/08/22/out-to-sea/", + "site_id": 71769073, + "id": 56 + } + ] + }, + { + "text": "Great shot of a historic lighthouse.\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 37 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/08/22/out-to-sea/comment-page-1/#comment-23", + "site_id": 71769073, + "post_id": 56, + "id": 23 + } + ] + } + ], + "body": [ + { + "text": "Nancy T.", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://thisismyportfolioyay.wordpress.com", + "id": 74237684, + "site_id": 45151698, + "type": "user", + "indices": [ + 0, + 8 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/4e3309b5cf977f89206c1dbb2b00e8e3?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": true + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://thisismyportfolioyay.wordpress.com" + }, + "ids": { + "user": 74237684, + "site": 45151698 + }, + "titles": { + "home": "Writing Bytes" + } + }, + "type": "user" + }, + { + "text": "Great shot of a historic lighthouse.", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 23, + "user": 74237684, + "post": 56, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/23", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74237684", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/56", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/23?action=edit" + } + ], + "meta": { + "ids": { + "user": 74237684, + "comment": 23, + "post": 56, + "site": 71769073 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74237684", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/23", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/56", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Out to Sea" + } + ], + "title": "Comment" + }, + { + "id": 1469657359, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2014-10-28T00:27:40+00:00", + "icon": "https://2.gravatar.com/avatar/88fa4a65e2d06dcf34c98c038e827e10?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/burning-man/comment-page-1/#comment-21", + "subject": [ + { + "text": "Lisa S. commented on Roaming in the Desert", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 7 + ], + "email": "example@wordpress.com", + "id": 74005263 + }, + { + "type": "post", + "indices": [ + 21, + 42 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/burning-man/", + "site_id": 71769073, + "id": 45 + } + ] + }, + { + "text": "Love this poem. It’s short and sweet.\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 38 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/burning-man/comment-page-1/#comment-21", + "site_id": 71769073, + "post_id": 45, + "id": 21 + } + ] + } + ], + "body": [ + { + "text": "Lisa S.", + "ranges": [ + { + "email": "example@wordpress.com", + "id": 74005263, + "type": "user", + "indices": [ + 0, + 7 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/88fa4a65e2d06dcf34c98c038e827e10?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "meta": { + "links": { + "email": "example@wordpress.com" + }, + "ids": { + "user": 74005263 + } + }, + "type": "user" + }, + { + "text": "Love this poem. It’s short and sweet.", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 21, + "user": 74005263, + "post": 45, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/21", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74005263", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/45", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/21?action=edit" + } + ], + "meta": { + "ids": { + "user": 74005263, + "comment": 21, + "post": 45, + "site": 71769073 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74005263", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/21", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/45", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Roaming in the Desert" + } + ], + "title": "Comment" + }, + { + "id": 1469655326, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2014-10-28T00:26:02+00:00", + "icon": "https://2.gravatar.com/avatar/54d388fd4592cfed0b14bd1d52f80185?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/dreaming-of-elsewhere/comment-page-1/#comment-20", + "subject": [ + { + "text": "Mark commented on Dreaming of Elsewhere", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 4 + ], + "url": "http://iamtestingthisyay.wordpress.com", + "site_id": 78387788, + "email": "example@wordpress.com", + "id": 74004255 + }, + { + "type": "post", + "indices": [ + 18, + 39 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/dreaming-of-elsewhere/", + "site_id": 71769073, + "id": 38 + } + ] + }, + { + "text": "Gorgeous gallery! I like the picture overlooking the Pacific.\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 62 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/dreaming-of-elsewhere/comment-page-1/#comment-20", + "site_id": 71769073, + "post_id": 38, + "id": 20 + } + ] + } + ], + "body": [ + { + "text": "Mark", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://iamtestingthisyay.wordpress.com", + "id": 74004255, + "site_id": 78387788, + "type": "user", + "indices": [ + 0, + 4 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/54d388fd4592cfed0b14bd1d52f80185?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://iamtestingthisyay.wordpress.com" + }, + "ids": { + "user": 74004255, + "site": 78387788 + }, + "titles": { + "home": "Nature Walks", + "tagline": "Exploring the countryside" + } + }, + "type": "user" + }, + { + "text": "Gorgeous gallery! I like the picture overlooking the Pacific.", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 20, + "user": 74004255, + "post": 38, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/20", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74004255", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/38", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/20?action=edit" + } + ], + "meta": { + "ids": { + "user": 74004255, + "comment": 20, + "post": 38, + "site": 71769073 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74004255", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/20", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/38", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Dreaming of Elsewhere" + } + ], + "title": "Comment" + }, + { + "id": 1469652677, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2014-10-28T00:24:00+00:00", + "icon": "https://1.gravatar.com/avatar/4e3309b5cf977f89206c1dbb2b00e8e3?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/two-more-hours/comment-page-1/#comment-19", + "subject": [ + { + "text": "Nancy T. commented on Two More Hours: For Writing, For Magic", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 8 + ], + "url": "http://thisismyportfolioyay.wordpress.com", + "site_id": 45151698, + "email": "example@wordpress.com", + "id": 74237684 + }, + { + "type": "post", + "indices": [ + 22, + 60 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/two-more-hours/", + "site_id": 71769073, + "id": 18 + } + ] + }, + { + "text": "A thoughtful piece on time and the writing process.\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 52 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/two-more-hours/comment-page-1/#comment-19", + "site_id": 71769073, + "post_id": 18, + "id": 19 + } + ] + } + ], + "body": [ + { + "text": "Nancy T.", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://thisismyportfolioyay.wordpress.com", + "id": 74237684, + "site_id": 45151698, + "type": "user", + "indices": [ + 0, + 8 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/4e3309b5cf977f89206c1dbb2b00e8e3?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": true + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://thisismyportfolioyay.wordpress.com" + }, + "ids": { + "user": 74237684, + "site": 45151698 + }, + "titles": { + "home": "Writing Bytes" + } + }, + "type": "user" + }, + { + "text": "A thoughtful piece on time and the writing process.", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 19, + "user": 74237684, + "post": 18, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/19", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74237684", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/18", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/19?action=edit" + } + ], + "meta": { + "ids": { + "user": 74237684, + "comment": 19, + "post": 18, + "site": 71769073 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74237684", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/19", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/18", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Two More Hours: For Writing, For Magic" + } + ], + "title": "Comment" + }, + { + "id": 1469400992, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2014-10-27T21:24:54+00:00", + "icon": "https://2.gravatar.com/avatar/88fa4a65e2d06dcf34c98c038e827e10?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/dreaming-of-elsewhere/comment-page-1/#comment-18", + "subject": [ + { + "text": "Lisa S. commented on Dreaming of Elsewhere", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 7 + ], + "email": "example@wordpress.com", + "id": 74005263 + }, + { + "type": "post", + "indices": [ + 21, + 42 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/dreaming-of-elsewhere/", + "site_id": 71769073, + "id": 38 + } + ] + }, + { + "text": "Fantastic gallery!\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 19 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/dreaming-of-elsewhere/comment-page-1/#comment-18", + "site_id": 71769073, + "post_id": 38, + "id": 18 + } + ] + } + ], + "body": [ + { + "text": "Lisa S.", + "ranges": [ + { + "email": "example@wordpress.com", + "id": 74005263, + "type": "user", + "indices": [ + 0, + 7 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/88fa4a65e2d06dcf34c98c038e827e10?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "meta": { + "links": { + "email": "example@wordpress.com" + }, + "ids": { + "user": 74005263 + } + }, + "type": "user" + }, + { + "text": "Fantastic gallery!", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 18, + "user": 74005263, + "post": 38, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/18", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74005263", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/38", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/18?action=edit" + } + ], + "meta": { + "ids": { + "user": 74005263, + "comment": 18, + "post": 38, + "site": 71769073 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74005263", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/18", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/38", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Dreaming of Elsewhere" + } + ], + "title": "Comment" + }, + { + "id": 1469398671, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2014-10-27T21:23:17+00:00", + "icon": "https://2.gravatar.com/avatar/e6f1fa8fa90f7e1b618be976bc8f82d4?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/on-blogging-2/comment-page-1/#comment-17", + "subject": [ + { + "text": "Alexander commented on Great Perspective on Blogging", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 9 + ], + "email": "example@wordpress.com", + "id": 74006837 + }, + { + "type": "post", + "indices": [ + 23, + 52 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/on-blogging-2/", + "site_id": 71769073, + "id": 40 + } + ] + }, + { + "text": "I agree: blogging is hard sometimes.\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 37 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/on-blogging-2/comment-page-1/#comment-17", + "site_id": 71769073, + "post_id": 40, + "id": 17 + } + ] + } + ], + "body": [ + { + "text": "Alexander", + "ranges": [ + { + "email": "example@wordpress.com", + "id": 74006837, + "type": "user", + "indices": [ + 0, + 9 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/e6f1fa8fa90f7e1b618be976bc8f82d4?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "meta": { + "links": { + "email": "example@wordpress.com" + }, + "ids": { + "user": 74006837 + } + }, + "type": "user" + }, + { + "text": "I agree: blogging is hard sometimes.", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 17, + "user": 74006837, + "post": 40, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/17", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74006837", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/40", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/17?action=edit" + } + ], + "meta": { + "ids": { + "user": 74006837, + "comment": 17, + "post": 40, + "site": 71769073 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74006837", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/17", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/40", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Great Perspective on Blogging" + } + ], + "title": "Comment" + }, + { + "id": 1469396527, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2014-10-27T21:21:49+00:00", + "icon": "https://2.gravatar.com/avatar/54d388fd4592cfed0b14bd1d52f80185?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/burning-man/comment-page-1/#comment-16", + "subject": [ + { + "text": "Mark commented on Roaming in the Desert", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 4 + ], + "url": "http://iamtestingthisyay.wordpress.com", + "site_id": 78387788, + "email": "example@wordpress.com", + "id": 74004255 + }, + { + "type": "post", + "indices": [ + 18, + 39 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/burning-man/", + "site_id": 71769073, + "id": 45 + } + ] + }, + { + "text": "Great night shot! The poem is short and sweet.\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 47 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/burning-man/comment-page-1/#comment-16", + "site_id": 71769073, + "post_id": 45, + "id": 16 + } + ] + } + ], + "body": [ + { + "text": "Mark", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://iamtestingthisyay.wordpress.com", + "id": 74004255, + "site_id": 78387788, + "type": "user", + "indices": [ + 0, + 4 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/54d388fd4592cfed0b14bd1d52f80185?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://iamtestingthisyay.wordpress.com" + }, + "ids": { + "user": 74004255, + "site": 78387788 + }, + "titles": { + "home": "Nature Walks", + "tagline": "Exploring the countryside" + } + }, + "type": "user" + }, + { + "text": "Great night shot! The poem is short and sweet.", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 16, + "user": 74004255, + "post": 45, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/16", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74004255", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/45", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/16?action=edit" + } + ], + "meta": { + "ids": { + "user": 74004255, + "comment": 16, + "post": 45, + "site": 71769073 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74004255", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/16", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/45", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Roaming in the Desert" + } + ], + "title": "Comment" + }, + { + "id": 1469393320, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2014-10-27T21:19:48+00:00", + "icon": "https://2.gravatar.com/avatar/88fa4a65e2d06dcf34c98c038e827e10?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/10/25/along-the-coast/comment-page-1/#comment-15", + "subject": [ + { + "text": "Lisa S. commented on Along the Coast", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 7 + ], + "email": "example@wordpress.com", + "id": 74005263 + }, + { + "type": "post", + "indices": [ + 21, + 36 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/10/25/along-the-coast/", + "site_id": 71769073, + "id": 79 + } + ] + }, + { + "text": "I miss the ocean. What a lovely view.\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 38 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/10/25/along-the-coast/comment-page-1/#comment-15", + "site_id": 71769073, + "post_id": 79, + "id": 15 + } + ] + } + ], + "body": [ + { + "text": "Lisa S.", + "ranges": [ + { + "email": "example@wordpress.com", + "id": 74005263, + "type": "user", + "indices": [ + 0, + 7 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/88fa4a65e2d06dcf34c98c038e827e10?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "meta": { + "links": { + "email": "example@wordpress.com" + }, + "ids": { + "user": 74005263 + } + }, + "type": "user" + }, + { + "text": "I miss the ocean. What a lovely view.", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 15, + "user": 74005263, + "post": 79, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/15", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74005263", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/79", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/15?action=edit" + } + ], + "meta": { + "ids": { + "user": 74005263, + "comment": 15, + "post": 79, + "site": 71769073 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74005263", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/15", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/79", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Along the Coast" + } + ], + "title": "Comment" + }, + { + "id": 1465445299, + "type": "traffic_surge", + "read": 1, + "noticon": "", + "timestamp": "2014-10-25T15:19:28+00:00", + "icon": "https://s.wp.com/wp-content/mu-plugins/notes/images/traffic-surge-note-icon-256.png", + "url": "https://wordpress.com/stats/day/thenomadicwordsmith.wordpress.com?startDate=2014-10-25", + "subject": [ + { + "text": "Your stats are booming! Words, Whimsy, and the World is getting lots of traffic.", + "ranges": [ + { + "type": "site", + "indices": [ + 24, + 52 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + } + ], + "body": [ + { + "text": "", + "media": [ + { + "type": "badge", + "indices": [ + 0, + 0 + ], + "url": "https://s.wp.com/wp-content/mu-plugins/notes/images/traffic-surge-note-icon-256.png" + } + ] + }, + { + "text": "Your blog, Words, Whimsy, and the World, appears to be getting more traffic than usual! 34 hourly views - 0 hourly views on average", + "ranges": [ + { + "type": "site", + "indices": [ + 11, + 39 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + }, + { + "text": "A spike in your stats", + "ranges": [ + { + "url": "https://wordpress.com/stats/day/thenomadicwordsmith.wordpress.com?startDate=2014-10-25", + "indices": [ + 11, + 21 + ], + "type": "stat", + "site_id": 71769073 + } + ] + } + ], + "meta": { + "ids": { + "site": 71769073 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "title": "Boom!" + }, + { + "id": 1462051138, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2014-10-23T18:37:58+00:00", + "icon": "https://2.gravatar.com/avatar/e6f1fa8fa90f7e1b618be976bc8f82d4?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/dreaming-of-elsewhere/comment-page-1/#comment-14", + "subject": [ + { + "text": "Alexander commented on Dreaming of Elsewhere", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 9 + ], + "email": "example@wordpress.com", + "id": 74006837 + }, + { + "type": "post", + "indices": [ + 23, + 44 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/dreaming-of-elsewhere/", + "site_id": 71769073, + "id": 38 + } + ] + }, + { + "text": "Superb shot from the monument in Berlin.\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 41 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/dreaming-of-elsewhere/comment-page-1/#comment-14", + "site_id": 71769073, + "post_id": 38, + "id": 14 + } + ] + } + ], + "body": [ + { + "text": "Alexander", + "ranges": [ + { + "email": "example@wordpress.com", + "id": 74006837, + "type": "user", + "indices": [ + 0, + 9 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/e6f1fa8fa90f7e1b618be976bc8f82d4?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "meta": { + "links": { + "email": "example@wordpress.com" + }, + "ids": { + "user": 74006837 + } + }, + "type": "user" + }, + { + "text": "Superb shot from the monument in Berlin.", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 14, + "user": 74006837, + "post": 38, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/14", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74006837", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/38", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/14?action=edit" + } + ], + "meta": { + "ids": { + "user": 74006837, + "comment": 14, + "post": 38, + "site": 71769073 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74006837", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/14", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/38", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Dreaming of Elsewhere" + } + ], + "title": "Comment" + }, + { + "id": 1462042059, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2014-10-23T18:31:42+00:00", + "icon": "https://2.gravatar.com/avatar/54d388fd4592cfed0b14bd1d52f80185?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/burning-man/comment-page-1/#comment-13", + "subject": [ + { + "text": "Mark commented on Roaming in the Desert", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 4 + ], + "url": "http://iamtestingthisyay.wordpress.com", + "site_id": 78387788, + "email": "example@wordpress.com", + "id": 74004255 + }, + { + "type": "post", + "indices": [ + 18, + 39 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/burning-man/", + "site_id": 71769073, + "id": 45 + } + ] + }, + { + "text": "This poem is perfect!\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 22 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/burning-man/comment-page-1/#comment-13", + "site_id": 71769073, + "post_id": 45, + "id": 13 + } + ] + } + ], + "body": [ + { + "text": "Mark", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://iamtestingthisyay.wordpress.com", + "id": 74004255, + "site_id": 78387788, + "type": "user", + "indices": [ + 0, + 4 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/54d388fd4592cfed0b14bd1d52f80185?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://iamtestingthisyay.wordpress.com" + }, + "ids": { + "user": 74004255, + "site": 78387788 + }, + "titles": { + "home": "Nature Walks", + "tagline": "Exploring the countryside" + } + }, + "type": "user" + }, + { + "text": "This poem is perfect!", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 13, + "user": 74004255, + "post": 45, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/13", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74004255", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/45", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/13?action=edit" + } + ], + "meta": { + "ids": { + "user": 74004255, + "comment": 13, + "post": 45, + "site": 71769073 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74004255", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/13", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/45", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Roaming in the Desert" + } + ], + "title": "Comment" + }, + { + "id": 1462036088, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2014-10-23T18:27:57+00:00", + "icon": "https://2.gravatar.com/avatar/88fa4a65e2d06dcf34c98c038e827e10?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/08/22/out-to-sea/comment-page-1/#comment-12", + "subject": [ + { + "text": "Lisa S. commented on Out to Sea", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 7 + ], + "email": "example@wordpress.com", + "id": 74005263 + }, + { + "type": "post", + "indices": [ + 21, + 31 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/08/22/out-to-sea/", + "site_id": 71769073, + "id": 56 + } + ] + }, + { + "text": "I’d love to visit this historical landmark along the sea.\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 58 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/08/22/out-to-sea/comment-page-1/#comment-12", + "site_id": 71769073, + "post_id": 56, + "id": 12 + } + ] + } + ], + "body": [ + { + "text": "Lisa S.", + "ranges": [ + { + "email": "example@wordpress.com", + "id": 74005263, + "type": "user", + "indices": [ + 0, + 7 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/88fa4a65e2d06dcf34c98c038e827e10?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "meta": { + "links": { + "email": "example@wordpress.com" + }, + "ids": { + "user": 74005263 + } + }, + "type": "user" + }, + { + "text": "I’d love to visit this historical landmark along the sea.", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 12, + "user": 74005263, + "post": 56, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/12", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74005263", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/56", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/12?action=edit" + } + ], + "meta": { + "ids": { + "user": 74005263, + "comment": 12, + "post": 56, + "site": 71769073 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74005263", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/12", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/56", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Out to Sea" + } + ], + "title": "Comment" + }, + { + "id": 1462026240, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2014-10-23T18:21:25+00:00", + "icon": "https://2.gravatar.com/avatar/e6f1fa8fa90f7e1b618be976bc8f82d4?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/on-blogging-2/comment-page-1/#comment-11", + "subject": [ + { + "text": "Alexander commented on Great Perspective on Blogging", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 9 + ], + "email": "example@wordpress.com", + "id": 74006837 + }, + { + "type": "post", + "indices": [ + 23, + 52 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/on-blogging-2/", + "site_id": 71769073, + "id": 40 + } + ] + }, + { + "text": "I feel the same! Making lasting connections with readers is important.\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 71 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/on-blogging-2/comment-page-1/#comment-11", + "site_id": 71769073, + "post_id": 40, + "id": 11 + } + ] + } + ], + "body": [ + { + "text": "Alexander", + "ranges": [ + { + "email": "example@wordpress.com", + "id": 74006837, + "type": "user", + "indices": [ + 0, + 9 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/e6f1fa8fa90f7e1b618be976bc8f82d4?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "meta": { + "links": { + "email": "example@wordpress.com" + }, + "ids": { + "user": 74006837 + } + }, + "type": "user" + }, + { + "text": "I feel the same! Making lasting connections with readers is important.", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 11, + "user": 74006837, + "post": 40, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/11", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74006837", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/40", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/11?action=edit" + } + ], + "meta": { + "ids": { + "user": 74006837, + "comment": 11, + "post": 40, + "site": 71769073 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74006837", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/11", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/40", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Great Perspective on Blogging" + } + ], + "title": "Comment" + }, + { + "id": 1461981982, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2014-10-23T17:53:38+00:00", + "icon": "https://2.gravatar.com/avatar/54d388fd4592cfed0b14bd1d52f80185?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/dreaming-of-elsewhere/comment-page-1/#comment-10", + "subject": [ + { + "text": "Mark commented on Dreaming of Elsewhere", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 4 + ], + "url": "http://iamtestingthisyay.wordpress.com", + "site_id": 78387788, + "email": "example@wordpress.com", + "id": 74004255 + }, + { + "type": "post", + "indices": [ + 18, + 39 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/dreaming-of-elsewhere/", + "site_id": 71769073, + "id": 38 + } + ] + }, + { + "text": "Great photographs. The shot overlooking the ocean is fantastic!\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 64 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/dreaming-of-elsewhere/comment-page-1/#comment-10", + "site_id": 71769073, + "post_id": 38, + "id": 10 + } + ] + } + ], + "body": [ + { + "text": "Mark", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://iamtestingthisyay.wordpress.com", + "id": 74004255, + "site_id": 78387788, + "type": "user", + "indices": [ + 0, + 4 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/54d388fd4592cfed0b14bd1d52f80185?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://iamtestingthisyay.wordpress.com" + }, + "ids": { + "user": 74004255, + "site": 78387788 + }, + "titles": { + "home": "Nature Walks", + "tagline": "Exploring the countryside" + } + }, + "type": "user" + }, + { + "text": "Great photographs. The shot overlooking the ocean is fantastic!", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 10, + "user": 74004255, + "post": 38, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/10", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74004255", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/38", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/10?action=edit" + } + ], + "meta": { + "ids": { + "user": 74004255, + "comment": 10, + "post": 38, + "site": 71769073 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/74004255", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/10", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/38", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Dreaming of Elsewhere" + } + ], + "title": "Comment" + }, + { + "id": 1355738022, + "type": "like", + "read": 1, + "noticon": "", + "timestamp": "2014-08-22T19:41:04+00:00", + "icon": "https://0.gravatar.com/avatar/36207d4c7c014b0999b995ca3971d383?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/08/22/out-to-sea/", + "subject": [ + { + "text": "Cheri Lucas Rowlands liked your post Out to Sea", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 20 + ], + "url": "http://cherilucasrowlands.com", + "site_id": 9838404, + "email": "example@wordpress.com", + "id": 10183950 + }, + { + "type": "post", + "indices": [ + 37, + 47 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/08/22/out-to-sea/", + "site_id": 71769073, + "id": 56 + } + ] + } + ], + "body": [ + { + "text": "Cheri Lucas Rowlands", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://cherilucasrowlands.com", + "id": 10183950, + "site_id": 9838404, + "type": "user", + "indices": [ + 0, + 20 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/36207d4c7c014b0999b995ca3971d383?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://cherilucasrowlands.com" + }, + "ids": { + "user": 10183950, + "site": 9838404 + }, + "titles": { + "home": "Cheri Lucas Rowlands" + } + }, + "type": "user" + } + ], + "meta": { + "ids": { + "site": 71769073, + "post": 56 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/56" + } + }, + "title": "1 Like", + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Out to Sea" + } + ] + }, + { + "id": 1355737668, + "type": "like_milestone_achievement", + "read": 1, + "noticon": "", + "timestamp": "2014-08-22T19:40:44+00:00", + "icon": "https://s.wp.com/wp-content/mu-plugins/achievements/likeable-blog-20-2x.png", + "url": "http://thenomadicwordsmith.wordpress.com", + "subject": [ + { + "text": "You've received 20 likes on Words, Whimsy, and the World", + "ranges": [ + { + "type": "site", + "indices": [ + 28, + 56 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + } + ], + "body": [ + { + "text": "20 Likes", + "media": [ + { + "type": "badge", + "indices": [ + 0, + 8 + ], + "height": "256", + "width": "256", + "url": "https://s.wp.com/wp-content/mu-plugins/achievements/likeable-blog-20-2x.png" + } + ] + }, + { + "text": "Congratulations on getting 20 total likes on Words, Whimsy, and the World.", + "ranges": [ + { + "type": "site", + "indices": [ + 45, + 73 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + }, + { + "text": "Your current tally is 30." + } + ], + "meta": { + "ids": { + "site": 71769073 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "title": "20 Likes" + }, + { + "id": 1310361903, + "type": "traffic_surge", + "read": 1, + "noticon": "", + "timestamp": "2014-07-28T04:14:13+00:00", + "icon": "https://s.wp.com/wp-content/mu-plugins/notes/images/traffic-surge-note-icon-256.png", + "url": "https://wordpress.com/stats/day/thenomadicwordsmith.wordpress.com?startDate=2014-07-28", + "subject": [ + { + "text": "Your stats are booming! Words, Whimsy, and the World is getting lots of traffic.", + "ranges": [ + { + "type": "site", + "indices": [ + 24, + 52 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + } + ], + "body": [ + { + "text": "", + "media": [ + { + "type": "badge", + "indices": [ + 0, + 0 + ], + "url": "https://s.wp.com/wp-content/mu-plugins/notes/images/traffic-surge-note-icon-256.png" + } + ] + }, + { + "text": "Your blog, Words, Whimsy, and the World, appears to be getting more traffic than usual! 31 hourly views - 0 hourly views on average", + "ranges": [ + { + "type": "site", + "indices": [ + 11, + 39 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + }, + { + "text": "A spike in your stats", + "ranges": [ + { + "url": "https://wordpress.com/stats/day/thenomadicwordsmith.wordpress.com?startDate=2014-07-28", + "indices": [ + 11, + 21 + ], + "type": "stat", + "site_id": 71769073 + } + ] + } + ], + "meta": { + "ids": { + "site": 71769073 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "title": "Boom!" + }, + { + "id": 1305980576, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2014-07-25T16:32:24+00:00", + "icon": "https://0.gravatar.com/avatar/36207d4c7c014b0999b995ca3971d383?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/about/comment-page-1/#comment-9", + "subject": [ + { + "text": "Cheri Lucas Rowlands commented on About This Nomad", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 20 + ], + "url": "http://cherilucasrowlands.com", + "site_id": 9838404, + "email": "example@wordpress.com", + "id": 10183950 + }, + { + "type": "post", + "indices": [ + 34, + 50 + ], + "url": "https://thenomadicwordsmith.wordpress.com/about/", + "site_id": 71769073, + "id": 1 + } + ] + }, + { + "text": "Your words and images are lovely and inspiring! I want to go to all of these places, too.\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 90 + ], + "url": "https://thenomadicwordsmith.wordpress.com/about/comment-page-1/#comment-9", + "site_id": 71769073, + "post_id": 1, + "id": 9 + } + ] + } + ], + "body": [ + { + "text": "Cheri Lucas Rowlands", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://cherilucasrowlands.com", + "id": 10183950, + "site_id": 9838404, + "type": "user", + "indices": [ + 0, + 20 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/36207d4c7c014b0999b995ca3971d383?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://cherilucasrowlands.com" + }, + "ids": { + "user": 10183950, + "site": 9838404 + }, + "titles": { + "home": "Cheri Lucas Rowlands" + } + }, + "type": "user" + }, + { + "text": "Your words and images are lovely and inspiring! I want to go to all of these places, too.", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 9, + "user": 10183950, + "post": 1, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/9", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/10183950", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/1", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/9?action=edit" + } + ], + "meta": { + "ids": { + "user": 10183950, + "comment": 9, + "post": 1, + "site": 71769073 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/10183950", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/9", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/1", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "About This Nomad" + } + ], + "title": "Comment" + }, + { + "id": 1304343956, + "type": "traffic_surge", + "read": 1, + "noticon": "", + "timestamp": "2014-07-24T19:57:36+00:00", + "icon": "https://s.wp.com/wp-content/mu-plugins/notes/images/traffic-surge-note-icon-256.png", + "url": "https://wordpress.com/stats/day/thenomadicwordsmith.wordpress.com?startDate=2014-07-24", + "subject": [ + { + "text": "Your stats are booming! Words, Whimsy, and the World is getting lots of traffic.", + "ranges": [ + { + "type": "site", + "indices": [ + 24, + 52 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + } + ], + "body": [ + { + "text": "", + "media": [ + { + "type": "badge", + "indices": [ + 0, + 0 + ], + "url": "https://s.wp.com/wp-content/mu-plugins/notes/images/traffic-surge-note-icon-256.png" + } + ] + }, + { + "text": "Your blog, Words, Whimsy, and the World, appears to be getting more traffic than usual! 73 hourly views - 0 hourly views on average", + "ranges": [ + { + "type": "site", + "indices": [ + 11, + 39 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + }, + { + "text": "A spike in your stats", + "ranges": [ + { + "url": "https://wordpress.com/stats/day/thenomadicwordsmith.wordpress.com?startDate=2014-07-24", + "indices": [ + 11, + 21 + ], + "type": "stat", + "site_id": 71769073 + } + ] + } + ], + "meta": { + "ids": { + "site": 71769073 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "title": "Boom!" + }, + { + "id": 1304254353, + "type": "best_followed_day_feat", + "read": 1, + "noticon": "", + "timestamp": "2014-07-24T18:52:31+00:00", + "icon": "https://s.wp.com/wp-content/mu-plugins/achievements/bestday-follows-2x.png", + "url": "https://wordpress.com/people/followers/71769073", + "subject": [ + { + "text": "July 24: Your best day for follows on Words, Whimsy, and the World", + "ranges": [ + { + "type": "site", + "indices": [ + 38, + 66 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + } + ], + "body": [ + { + "text": "", + "media": [ + { + "type": "badge", + "indices": [ + 0, + 0 + ], + "url": "https://s.wp.com/wp-content/mu-plugins/achievements/bestday-follows-2x.png" + } + ] + }, + { + "text": "On Thursday, July 24, 2014 you surpassed your previous record of most follows in one day for your blog Words, Whimsy, and the World. Nice!", + "ranges": [ + { + "url": "", + "indices": [ + 65, + 77 + ] + }, + { + "type": "site", + "indices": [ + 103, + 131 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + }, + { + "text": "Most Follows in One Day" + }, + { + "text": "Current Record: 2" + }, + { + "text": "Old Record: 1" + } + ], + "meta": { + "ids": { + "site": 71769073 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "title": "2 Followers" + }, + { + "id": 1304185197, + "type": "like", + "read": 1, + "noticon": "", + "timestamp": "2014-07-24T18:43:35+00:00", + "icon": "https://2.gravatar.com/avatar/2367004060918e221dcb9799584e9279?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/wanderlust/", + "subject": [ + { + "text": "Michelle Weber and 2 others liked your post When Wanderlust Hits", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 14 + ], + "url": "http://kingofstates.com", + "site_id": 40536446, + "email": "example@wordpress.com", + "id": 2193192 + }, + { + "type": "post", + "indices": [ + 44, + 64 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/wanderlust/", + "site_id": 71769073, + "id": 22 + } + ] + } + ], + "body": [ + { + "text": "Michelle Weber", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://kingofstates.com", + "id": 2193192, + "site_id": 40536446, + "type": "user", + "indices": [ + 0, + 14 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/2367004060918e221dcb9799584e9279?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://kingofstates.com" + }, + "ids": { + "user": 2193192, + "site": 40536446 + }, + "titles": { + "home": "King of States!", + "tagline": "I'm Michelle. This is my blog. I write about women and fatness, expound upon semi-coherent thoughts I have in the middle of the night, and offer tough love to those in whom I am disappointed; they are legion." + } + }, + "type": "user" + }, + { + "text": "Kjell Reigstad", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://kjellr.com", + "id": 39377736, + "site_id": 87462575, + "type": "user", + "indices": [ + 0, + 14 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/115aabd707fe985c79744d3e7df8fade?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://kjellr.com" + }, + "ids": { + "user": 39377736, + "site": 87462575 + }, + "titles": { + "home": "Kjell Reigstad", + "tagline": "Graphic Design" + } + }, + "type": "user" + }, + { + "text": "Cheri Lucas Rowlands", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://cherilucasrowlands.com", + "id": 10183950, + "site_id": 9838404, + "type": "user", + "indices": [ + 0, + 20 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/36207d4c7c014b0999b995ca3971d383?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://cherilucasrowlands.com" + }, + "ids": { + "user": 10183950, + "site": 9838404 + }, + "titles": { + "home": "Cheri Lucas Rowlands" + } + }, + "type": "user" + } + ], + "meta": { + "ids": { + "site": 71769073, + "post": 22 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/22" + } + }, + "title": "3 Likes", + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "When Wanderlust Hits" + } + ] + }, + { + "id": 1304241630, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2014-07-24T18:42:50+00:00", + "icon": "https://2.gravatar.com/avatar/2367004060918e221dcb9799584e9279?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/dreaming-of-elsewhere/comment-page-1/#comment-6", + "subject": [ + { + "text": "Michelle Weber commented on Dreaming of Elsewhere", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 14 + ], + "url": "http://kingofstates.com", + "site_id": 40536446, + "email": "example@wordpress.com", + "id": 2193192 + }, + { + "type": "post", + "indices": [ + 28, + 49 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/dreaming-of-elsewhere/", + "site_id": 71769073, + "id": 38 + } + ] + }, + { + "text": "Hey, I can see my house from there!\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 36 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/dreaming-of-elsewhere/comment-page-1/#comment-6", + "site_id": 71769073, + "post_id": 38, + "id": 6 + } + ] + } + ], + "body": [ + { + "text": "Michelle Weber", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://kingofstates.com", + "id": 2193192, + "site_id": 40536446, + "type": "user", + "indices": [ + 0, + 14 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/2367004060918e221dcb9799584e9279?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://kingofstates.com" + }, + "ids": { + "user": 2193192, + "site": 40536446 + }, + "titles": { + "home": "King of States!", + "tagline": "I'm Michelle. This is my blog. I write about women and fatness, expound upon semi-coherent thoughts I have in the middle of the night, and offer tough love to those in whom I am disappointed; they are legion." + } + }, + "type": "user" + }, + { + "text": "Hey, I can see my house from there!", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 6, + "user": 2193192, + "post": 38, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/6", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/2193192", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/38", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/6?action=edit" + } + ], + "meta": { + "ids": { + "user": 2193192, + "comment": 6, + "post": 38, + "site": 71769073 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/2193192", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/6", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/38", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Dreaming of Elsewhere" + } + ], + "title": "Comment" + }, + { + "id": 1304179269, + "type": "like", + "read": 1, + "noticon": "", + "timestamp": "2014-07-24T18:42:33+00:00", + "icon": "https://2.gravatar.com/avatar/2367004060918e221dcb9799584e9279?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/dreaming-of-elsewhere/", + "subject": [ + { + "text": "Michelle Weber and 5 others liked your post Dreaming of Elsewhere", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 14 + ], + "url": "http://kingofstates.com", + "site_id": 40536446, + "email": "example@wordpress.com", + "id": 2193192 + }, + { + "type": "post", + "indices": [ + 44, + 65 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/dreaming-of-elsewhere/", + "site_id": 71769073, + "id": 38 + } + ] + } + ], + "body": [ + { + "text": "Michelle Weber", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://kingofstates.com", + "id": 2193192, + "site_id": 40536446, + "type": "user", + "indices": [ + 0, + 14 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/2367004060918e221dcb9799584e9279?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://kingofstates.com" + }, + "ids": { + "user": 2193192, + "site": 40536446 + }, + "titles": { + "home": "King of States!", + "tagline": "I'm Michelle. This is my blog. I write about women and fatness, expound upon semi-coherent thoughts I have in the middle of the night, and offer tough love to those in whom I am disappointed; they are legion." + } + }, + "type": "user" + }, + { + "text": "Kjell Reigstad", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://kjellr.com", + "id": 39377736, + "site_id": 87462575, + "type": "user", + "indices": [ + 0, + 14 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/115aabd707fe985c79744d3e7df8fade?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://kjellr.com" + }, + "ids": { + "user": 39377736, + "site": 87462575 + }, + "titles": { + "home": "Kjell Reigstad", + "tagline": "Graphic Design" + } + }, + "type": "user" + }, + { + "text": "Elizabeth", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://elizabeth.blog/", + "id": 876809, + "site_id": 847631, + "type": "user", + "indices": [ + 0, + 9 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/7cde026ba626f4a827f12b454177947b?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://elizabeth.blog/" + }, + "ids": { + "user": 876809, + "site": 847631 + }, + "titles": { + "home": "Accismus", + "tagline": "The thoughts, opinions, and occasional rantings of Elizabeth Urello." + } + }, + "type": "user" + }, + { + "text": "Cheri Lucas Rowlands", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://cherilucasrowlands.com", + "id": 10183950, + "site_id": 9838404, + "type": "user", + "indices": [ + 0, + 20 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/36207d4c7c014b0999b995ca3971d383?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://cherilucasrowlands.com" + }, + "ids": { + "user": 10183950, + "site": 9838404 + }, + "titles": { + "home": "Cheri Lucas Rowlands" + } + }, + "type": "user" + }, + { + "text": "Mark Armstrong", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "https://markarms.blog/", + "id": 22917495, + "site_id": 66671758, + "type": "user", + "indices": [ + 0, + 14 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/19f62880113934b262c0bbb597644adb?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "https://markarms.blog/" + }, + "ids": { + "user": 22917495, + "site": 66671758 + }, + "titles": { + "home": "Mark Armstrong", + "tagline": "Founder of Longreads; Editor at Automattic" + } + }, + "type": "user" + }, + { + "text": "Mike Dang", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://mikedang.wordpress.com", + "id": 4275359, + "site_id": 10563972, + "type": "user", + "indices": [ + 0, + 9 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/d861b27aa3a4ba53cf0fc5f59b7e0527?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://mikedang.wordpress.com" + }, + "ids": { + "user": 4275359, + "site": 10563972 + }, + "titles": { + "home": "Reporter Mike" + } + }, + "type": "user" + } + ], + "meta": { + "ids": { + "site": 71769073, + "post": 38 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/38" + } + }, + "title": "6 Likes", + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Dreaming of Elsewhere" + } + ] + }, + { + "id": 1304240088, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2014-07-24T18:41:38+00:00", + "icon": "https://2.gravatar.com/avatar/2367004060918e221dcb9799584e9279?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/on-blogging-2/comment-page-1/#comment-5", + "subject": [ + { + "text": "Michelle Weber replied to a comment I read a story in the New York Times today about how no one uses pens anymore. WHAT. Give me …\n", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 14 + ], + "url": "http://kingofstates.com", + "site_id": 40536446, + "email": "example@wordpress.com", + "id": 2193192 + }, + { + "type": "comment", + "indices": [ + 36, + 131 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/on-blogging-2/comment-page-1/#comment-1", + "site_id": 71769073, + "post_id": 40, + "id": 1 + } + ] + }, + { + "text": "You’ll pry my red pens out of my cold, dead hands, Dang.\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 57 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/on-blogging-2/comment-page-1/#comment-5", + "site_id": 71769073, + "post_id": 40, + "id": 5 + } + ] + } + ], + "body": [ + { + "text": "Michelle Weber", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://kingofstates.com", + "id": 2193192, + "site_id": 40536446, + "type": "user", + "indices": [ + 0, + 14 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/2367004060918e221dcb9799584e9279?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://kingofstates.com" + }, + "ids": { + "user": 2193192, + "site": 40536446 + }, + "titles": { + "home": "King of States!", + "tagline": "I'm Michelle. This is my blog. I write about women and fatness, expound upon semi-coherent thoughts I have in the middle of the night, and offer tough love to those in whom I am disappointed; they are legion." + } + }, + "type": "user" + }, + { + "text": "You’ll pry my red pens out of my cold, dead hands, Dang.", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 5, + "user": 2193192, + "post": 40, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/5", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/2193192", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/40", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 1, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/5?action=edit" + } + ], + "meta": { + "ids": { + "parent_comment": 1, + "user": 2193192, + "comment": 5, + "post": 40, + "site": 71769073 + }, + "links": { + "parent_comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/1", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/2193192", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/5", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/40", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "Mike Dang on Great Perspective on Blogging", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 9 + ], + "url": "http://mikedang.wordpress.com", + "site_id": 10563972, + "email": "example@wordpress.com", + "id": 4275359 + }, + { + "type": "post", + "indices": [ + 13, + 42 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/on-blogging-2/", + "site_id": 71769073, + "id": 40 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/d861b27aa3a4ba53cf0fc5f59b7e0527?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "I read a story in the New York Times today about how no one uses pens anymore. WHAT. Give me …" + } + ], + "title": "Reply" + }, + { + "id": 1304176391, + "type": "like", + "read": 1, + "noticon": "", + "timestamp": "2014-07-24T18:41:15+00:00", + "icon": "https://2.gravatar.com/avatar/e870a6cbd22eedb95c72bba37b144b7d?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/on-blogging-2/", + "subject": [ + { + "text": "Amanda Lyle and 4 others liked your post Great Perspective on Blogging", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 11 + ], + "url": "http://www.insidethelifeofmoi.com", + "site_id": 100718137, + "email": "example@wordpress.com", + "id": 61155091 + }, + { + "type": "post", + "indices": [ + 41, + 70 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/on-blogging-2/", + "site_id": 71769073, + "id": 40 + } + ] + } + ], + "body": [ + { + "text": "Amanda Lyle", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://www.insidethelifeofmoi.com", + "id": 61155091, + "site_id": 100718137, + "type": "user", + "indices": [ + 0, + 11 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/e870a6cbd22eedb95c72bba37b144b7d?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://www.insidethelifeofmoi.com" + }, + "ids": { + "user": 61155091, + "site": 100718137 + }, + "titles": { + "home": "Insidethelifeofmoi", + "tagline": "An eccentric blogger with a pen and a thousand ideas" + } + }, + "type": "user" + }, + { + "text": "Kjell Reigstad", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://kjellr.com", + "id": 39377736, + "site_id": 87462575, + "type": "user", + "indices": [ + 0, + 14 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/115aabd707fe985c79744d3e7df8fade?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://kjellr.com" + }, + "ids": { + "user": 39377736, + "site": 87462575 + }, + "titles": { + "home": "Kjell Reigstad", + "tagline": "Graphic Design" + } + }, + "type": "user" + }, + { + "text": "Elizabeth", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://elizabeth.blog/", + "id": 876809, + "site_id": 847631, + "type": "user", + "indices": [ + 0, + 9 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/7cde026ba626f4a827f12b454177947b?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://elizabeth.blog/" + }, + "ids": { + "user": 876809, + "site": 847631 + }, + "titles": { + "home": "Accismus", + "tagline": "The thoughts, opinions, and occasional rantings of Elizabeth Urello." + } + }, + "type": "user" + }, + { + "text": "Michelle Weber", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://kingofstates.com", + "id": 2193192, + "site_id": 40536446, + "type": "user", + "indices": [ + 0, + 14 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/2367004060918e221dcb9799584e9279?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://kingofstates.com" + }, + "ids": { + "user": 2193192, + "site": 40536446 + }, + "titles": { + "home": "King of States!", + "tagline": "I'm Michelle. This is my blog. I write about women and fatness, expound upon semi-coherent thoughts I have in the middle of the night, and offer tough love to those in whom I am disappointed; they are legion." + } + }, + "type": "user" + }, + { + "text": "Mike Dang", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://mikedang.wordpress.com", + "id": 4275359, + "site_id": 10563972, + "type": "user", + "indices": [ + 0, + 9 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/d861b27aa3a4ba53cf0fc5f59b7e0527?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://mikedang.wordpress.com" + }, + "ids": { + "user": 4275359, + "site": 10563972 + }, + "titles": { + "home": "Reporter Mike" + } + }, + "type": "user" + } + ], + "meta": { + "ids": { + "site": 71769073, + "post": 40 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/40" + } + }, + "title": "5 Likes", + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Great Perspective on Blogging" + } + ] + }, + { + "id": 1304234553, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2014-07-24T18:37:23+00:00", + "icon": "https://1.gravatar.com/avatar/d861b27aa3a4ba53cf0fc5f59b7e0527?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/two-more-hours/comment-page-1/#comment-4", + "subject": [ + { + "text": "Mike Dang commented on Two More Hours: For Writing, For Magic", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 9 + ], + "url": "http://mikedang.wordpress.com", + "site_id": 10563972, + "email": "example@wordpress.com", + "id": 4275359 + }, + { + "type": "post", + "indices": [ + 23, + 61 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/two-more-hours/", + "site_id": 71769073, + "id": 18 + } + ] + }, + { + "text": "I wish I had more time in the day to write!\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 44 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/two-more-hours/comment-page-1/#comment-4", + "site_id": 71769073, + "post_id": 18, + "id": 4 + } + ] + } + ], + "body": [ + { + "text": "Mike Dang", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://mikedang.wordpress.com", + "id": 4275359, + "site_id": 10563972, + "type": "user", + "indices": [ + 0, + 9 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/d861b27aa3a4ba53cf0fc5f59b7e0527?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://mikedang.wordpress.com" + }, + "ids": { + "user": 4275359, + "site": 10563972 + }, + "titles": { + "home": "Reporter Mike" + } + }, + "type": "user" + }, + { + "text": "I wish I had more time in the day to write!", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 4, + "user": 4275359, + "post": 18, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/4", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/4275359", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/18", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/4?action=edit" + } + ], + "meta": { + "ids": { + "user": 4275359, + "comment": 4, + "post": 18, + "site": 71769073 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/4275359", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/4", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/18", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Two More Hours: For Writing, For Magic" + } + ], + "title": "Comment" + }, + { + "id": 1304185631, + "type": "like", + "read": 1, + "noticon": "", + "timestamp": "2014-07-24T18:36:31+00:00", + "icon": "https://1.gravatar.com/avatar/d861b27aa3a4ba53cf0fc5f59b7e0527?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/two-more-hours/", + "subject": [ + { + "text": "Mike Dang and 2 others liked your post Two More Hours: For Writing, For Magic", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 9 + ], + "url": "http://mikedang.wordpress.com", + "site_id": 10563972, + "email": "example@wordpress.com", + "id": 4275359 + }, + { + "type": "post", + "indices": [ + 39, + 77 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/two-more-hours/", + "site_id": 71769073, + "id": 18 + } + ] + } + ], + "body": [ + { + "text": "Mike Dang", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://mikedang.wordpress.com", + "id": 4275359, + "site_id": 10563972, + "type": "user", + "indices": [ + 0, + 9 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/d861b27aa3a4ba53cf0fc5f59b7e0527?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://mikedang.wordpress.com" + }, + "ids": { + "user": 4275359, + "site": 10563972 + }, + "titles": { + "home": "Reporter Mike" + } + }, + "type": "user" + }, + { + "text": "Kjell Reigstad", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://kjellr.com", + "id": 39377736, + "site_id": 87462575, + "type": "user", + "indices": [ + 0, + 14 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/115aabd707fe985c79744d3e7df8fade?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://kjellr.com" + }, + "ids": { + "user": 39377736, + "site": 87462575 + }, + "titles": { + "home": "Kjell Reigstad", + "tagline": "Graphic Design" + } + }, + "type": "user" + }, + { + "text": "Cheri Lucas Rowlands", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://cherilucasrowlands.com", + "id": 10183950, + "site_id": 9838404, + "type": "user", + "indices": [ + 0, + 20 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/36207d4c7c014b0999b995ca3971d383?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://cherilucasrowlands.com" + }, + "ids": { + "user": 10183950, + "site": 9838404 + }, + "titles": { + "home": "Cheri Lucas Rowlands" + } + }, + "type": "user" + } + ], + "meta": { + "ids": { + "site": 71769073, + "post": 18 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/18" + } + }, + "title": "3 Likes", + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Two More Hours: For Writing, For Magic" + } + ] + }, + { + "id": 1304211566, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2014-07-24T18:20:06+00:00", + "icon": "https://1.gravatar.com/avatar/7cde026ba626f4a827f12b454177947b?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/dreaming-of-elsewhere/comment-page-1/#comment-3", + "subject": [ + { + "text": "Elizabeth commented on Dreaming of Elsewhere", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 9 + ], + "url": "http://elizabeth.blog/", + "site_id": 847631, + "email": "example@wordpress.com", + "id": 876809 + }, + { + "type": "post", + "indices": [ + 23, + 44 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/dreaming-of-elsewhere/", + "site_id": 71769073, + "id": 38 + } + ] + }, + { + "text": "Lovely photos! I want to go to there.\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 38 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/dreaming-of-elsewhere/comment-page-1/#comment-3", + "site_id": 71769073, + "post_id": 38, + "id": 3 + } + ] + } + ], + "body": [ + { + "text": "Elizabeth", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://elizabeth.blog/", + "id": 876809, + "site_id": 847631, + "type": "user", + "indices": [ + 0, + 9 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/7cde026ba626f4a827f12b454177947b?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://elizabeth.blog/" + }, + "ids": { + "user": 876809, + "site": 847631 + }, + "titles": { + "home": "Accismus", + "tagline": "The thoughts, opinions, and occasional rantings of Elizabeth Urello." + } + }, + "type": "user" + }, + { + "text": "Lovely photos! I want to go to there.", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 3, + "user": 876809, + "post": 38, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/3", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/876809", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/38", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/3?action=edit" + } + ], + "meta": { + "ids": { + "user": 876809, + "comment": 3, + "post": 38, + "site": 71769073 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/876809", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/3", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/38", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Dreaming of Elsewhere" + } + ], + "title": "Comment" + }, + { + "id": 1304210924, + "type": "like_milestone_achievement", + "read": 1, + "noticon": "", + "timestamp": "2014-07-24T18:19:39+00:00", + "icon": "https://s.wp.com/wp-content/mu-plugins/achievements/likeable-blog-10-2x.png", + "url": "http://thenomadicwordsmith.wordpress.com", + "subject": [ + { + "text": "You've received 10 likes on Words, Whimsy, and the World", + "ranges": [ + { + "type": "site", + "indices": [ + 28, + 56 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + } + ], + "body": [ + { + "text": "10 Likes", + "media": [ + { + "type": "badge", + "indices": [ + 0, + 8 + ], + "height": "256", + "width": "256", + "url": "https://s.wp.com/wp-content/mu-plugins/achievements/likeable-blog-10-2x.png" + } + ] + }, + { + "text": "Congratulations on getting 10 total likes on Words, Whimsy, and the World.", + "ranges": [ + { + "type": "site", + "indices": [ + 45, + 73 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + }, + { + "text": "Your current tally is 30." + } + ], + "meta": { + "ids": { + "site": 71769073 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "title": "10 Likes" + }, + { + "id": 1304184444, + "type": "like_milestone_achievement", + "read": 1, + "noticon": "", + "timestamp": "2014-07-24T18:01:58+00:00", + "icon": "https://s.wp.com/wp-content/mu-plugins/achievements/likeable-blog-5-2x.png", + "url": "http://thenomadicwordsmith.wordpress.com", + "subject": [ + { + "text": "You've received 5 likes on Words, Whimsy, and the World", + "ranges": [ + { + "type": "site", + "indices": [ + 27, + 55 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + } + ], + "body": [ + { + "text": "5 Likes", + "media": [ + { + "type": "badge", + "indices": [ + 0, + 7 + ], + "height": "256", + "width": "256", + "url": "https://s.wp.com/wp-content/mu-plugins/achievements/likeable-blog-5-2x.png" + } + ] + }, + { + "text": "Congratulations on getting 5 total likes on Words, Whimsy, and the World.", + "ranges": [ + { + "type": "site", + "indices": [ + 44, + 72 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + }, + { + "text": "Your current tally is 30." + } + ], + "meta": { + "ids": { + "site": 71769073 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "title": "5 Likes" + }, + { + "id": 1304184439, + "type": "best_liked_day_feat", + "read": 1, + "noticon": "", + "timestamp": "2014-07-24T18:01:58+00:00", + "icon": "https://s.wp.com/wp-content/mu-plugins/achievements/bestday-likes-2x.png", + "url": "http://thenomadicwordsmith.wordpress.com", + "subject": [ + { + "text": "July 24: Your best day for likes on Words, Whimsy, and the World", + "ranges": [ + { + "type": "site", + "indices": [ + 36, + 64 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + } + ], + "body": [ + { + "text": "5 Likes", + "media": [ + { + "type": "badge", + "indices": [ + 0, + 7 + ], + "height": "256", + "width": "256", + "url": "https://s.wp.com/wp-content/mu-plugins/achievements/bestday-likes-2x.png" + } + ] + }, + { + "text": "On Thursday July 24, 2014, you surpassed your previous record of most likes in one day for your posts on Words, Whimsy, and the World. That's pretty awesome, well done!", + "ranges": [ + { + "type": "site", + "indices": [ + 105, + 133 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + }, + { + "text": "Most Likes in One Day" + }, + { + "text": "Current Record: 5" + }, + { + "text": "Old Record: 4" + } + ], + "meta": { + "ids": { + "site": 71769073 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "title": "5 Likes" + }, + { + "id": 1304179843, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2014-07-24T17:58:59+00:00", + "icon": "https://1.gravatar.com/avatar/d861b27aa3a4ba53cf0fc5f59b7e0527?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/dreaming-of-elsewhere/comment-page-1/#comment-2", + "subject": [ + { + "text": "Mike Dang commented on Dreaming of Elsewhere", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 9 + ], + "url": "http://mikedang.wordpress.com", + "site_id": 10563972, + "email": "example@wordpress.com", + "id": 4275359 + }, + { + "type": "post", + "indices": [ + 23, + 44 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/dreaming-of-elsewhere/", + "site_id": 71769073, + "id": 38 + } + ] + }, + { + "text": "Wait, I had this dream too. HOW DID YOU READ MY DREAMS!?\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 57 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/dreaming-of-elsewhere/comment-page-1/#comment-2", + "site_id": 71769073, + "post_id": 38, + "id": 2 + } + ] + } + ], + "body": [ + { + "text": "Mike Dang", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://mikedang.wordpress.com", + "id": 4275359, + "site_id": 10563972, + "type": "user", + "indices": [ + 0, + 9 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/d861b27aa3a4ba53cf0fc5f59b7e0527?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://mikedang.wordpress.com" + }, + "ids": { + "user": 4275359, + "site": 10563972 + }, + "titles": { + "home": "Reporter Mike" + } + }, + "type": "user" + }, + { + "text": "Wait, I had this dream too. HOW DID YOU READ MY DREAMS!?", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 2, + "user": 4275359, + "post": 38, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/2", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/4275359", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/38", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/2?action=edit" + } + ], + "meta": { + "ids": { + "user": 4275359, + "comment": 2, + "post": 38, + "site": 71769073 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/4275359", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/2", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/38", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Dreaming of Elsewhere" + } + ], + "title": "Comment" + }, + { + "id": 1304178014, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "2014-07-24T17:57:49+00:00", + "icon": "https://1.gravatar.com/avatar/d861b27aa3a4ba53cf0fc5f59b7e0527?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/on-blogging-2/comment-page-1/#comment-1", + "subject": [ + { + "text": "Mike Dang commented on Great Perspective on Blogging", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 9 + ], + "url": "http://mikedang.wordpress.com", + "site_id": 10563972, + "email": "example@wordpress.com", + "id": 4275359 + }, + { + "type": "post", + "indices": [ + 23, + 52 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/on-blogging-2/", + "site_id": 71769073, + "id": 40 + } + ] + }, + { + "text": "I read a story in the New York Times today about how no one uses pens anymore. WHAT. Give me your pens. I love pens.\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 117 + ], + "url": "https://thenomadicwordsmith.wordpress.com/2014/07/24/on-blogging-2/comment-page-1/#comment-1", + "site_id": 71769073, + "post_id": 40, + "id": 1 + } + ] + } + ], + "body": [ + { + "text": "Mike Dang", + "ranges": [ + { + "email": "example@wordpress.com", + "url": "http://mikedang.wordpress.com", + "id": 4275359, + "site_id": 10563972, + "type": "user", + "indices": [ + 0, + 9 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/d861b27aa3a4ba53cf0fc5f59b7e0527?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "example@wordpress.com", + "home": "http://mikedang.wordpress.com" + }, + "ids": { + "user": 4275359, + "site": 10563972 + }, + "titles": { + "home": "Reporter Mike" + } + }, + "type": "user" + }, + { + "text": "I read a story in the New York Times today about how no one uses pens anymore. WHAT. Give me your pens. I love pens.", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 1, + "user": 4275359, + "post": 40, + "site": 71769073 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/1", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/4275359", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/40", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/thenomadicwordsmith.wordpress.com/1?action=edit" + } + ], + "meta": { + "ids": { + "user": 4275359, + "comment": 1, + "post": 40, + "site": 71769073 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/4275359", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/1", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/40", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "header": [ + { + "text": "thenomadicwordsmith", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 19 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "site_id": 71769073, + "email": "example@wordpress.com", + "id": 68646169 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Great Perspective on Blogging" + } + ], + "title": "Comment" + }, + { + "id": 1304158185, + "type": "post_milestone_achievement", + "read": 1, + "noticon": "", + "timestamp": "2014-07-24T17:43:49+00:00", + "icon": "https://s.wp.com/wp-content/mu-plugins/achievements/post-milestone-5-2x.png", + "url": "http://wordpress.com/trophy-case/", + "subject": [ + { + "text": "You've made 5 posts on Words, Whimsy, and the World.", + "ranges": [ + { + "type": "site", + "indices": [ + 23, + 51 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + } + ], + "body": [ + { + "text": "5 Posts", + "media": [ + { + "type": "badge", + "indices": [ + 0, + 7 + ], + "height": "256", + "width": "256", + "url": "https://s.wp.com/wp-content/mu-plugins/achievements/post-milestone-5-2x.png" + } + ] + }, + { + "text": "Congratulations on writing 5 posts on Words, Whimsy, and the World!", + "ranges": [ + { + "type": "site", + "indices": [ + 38, + 66 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + } + ], + "meta": { + "ids": { + "site": 71769073 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "title": "5 Posts" + }, + { + "id": 1304116488, + "type": "post_milestone_achievement", + "read": 1, + "noticon": "", + "timestamp": "2014-07-24T17:13:51+00:00", + "icon": "https://s.wp.com/wp-content/mu-plugins/achievements/post-milestone-1-2x.png", + "url": "http://wordpress.com/trophy-case/", + "subject": [ + { + "text": "You've made your first post on Words, Whimsy, and the World.", + "ranges": [ + { + "type": "site", + "indices": [ + 31, + 59 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + } + ], + "body": [ + { + "text": "First Post", + "media": [ + { + "type": "badge", + "indices": [ + 0, + 10 + ], + "height": "256", + "width": "256", + "url": "https://s.wp.com/wp-content/mu-plugins/achievements/post-milestone-1-2x.png" + } + ] + }, + { + "text": "Congratulations on writing your first post on Words, Whimsy, and the World!", + "ranges": [ + { + "type": "site", + "indices": [ + 46, + 74 + ], + "url": "http://thenomadicwordsmith.wordpress.com", + "id": 71769073 + } + ] + } + ], + "meta": { + "ids": { + "site": 71769073 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/71769073" + } + }, + "title": "First Post" + } + ] + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications.json new file mode 100644 index 000000000000..7918209e0d43 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications.json @@ -0,0 +1,1063 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/notifications/", + "queryParameters": { + "fields": { + "matches": "id,(note_hash,)?type,unread,body,subject,timestamp,meta" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "last_seen_time": "1598052184", + "number": 9, + "notes": [ + { + "id": 4937363649, + "type": "like", + "read": 0, + "noticon": "", + "timestamp": "{{now}}", + "icon": "https://1.gravatar.com/avatar/11bcf6345930a9fbde5e6f0985c3f24a?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://weekendbakesblog.wordpress.com/2020/10/05/my-top-10-pastry-recipes/", + "subject": [ + { + "text": "Amechie Ajimobi and 5 others liked your post My Top 10 Pastry Recipes", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 15 + ], + "url": "http://amechieajimobi.wordpress.com", + "site_id": 103806280, + "email": "test@example.com", + "id": 98380134 + }, + { + "type": "b", + "indices": [ + 20, + 21 + ] + }, + { + "type": "post", + "indices": [ + 45, + 69 + ], + "url": "https://weekendbakesblog.wordpress.com/2020/10/05/my-top-10-pastry-recipes/", + "site_id": 181977606, + "id": 56 + } + ] + } + ], + "body": [ + { + "text": "Amechie Ajimobi", + "ranges": [ + { + "email": "test@example.com", + "url": "http://amechieajimobi.wordpress.com", + "id": 98380134, + "site_id": 103806280, + "type": "user", + "indices": [ + 0, + 15 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/11bcf6345930a9fbde5e6f0985c3f24a?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "test@example.com", + "home": "http://amechieajimobi.wordpress.com" + }, + "ids": { + "user": 98380134, + "site": 103806280 + }, + "titles": { + "home": "The Cooking Point" + } + }, + "type": "user" + }, + { + "text": "Catrina Ciobanu", + "ranges": [ + { + "email": "test@example.com", + "url": "http://catrinaciobanu.wordpress.com", + "id": 98387381, + "type": "user", + "indices": [ + 0, + 15 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9e99ce19f071c664fb4a882befb72391?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "meta": { + "links": { + "email": "test@example.com", + "home": "http://catrinaciobanu.wordpress.com" + }, + "ids": { + "user": 98387381 + } + }, + "type": "user" + }, + { + "text": "Pamela Nguyen", + "ranges": [ + { + "email": "test@example.com", + "url": "http://pamelanguyen.wordpress.com", + "id": 98379476, + "type": "user", + "indices": [ + 0, + 13 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/b9dadbf067e5583eaf82abefc49727bb?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "meta": { + "links": { + "email": "test@example.com", + "home": "http://pamelanguyen.wordpress.com" + }, + "ids": { + "user": 98379476 + } + }, + "type": "user" + }, + { + "text": "Madison Ruiz", + "ranges": [ + { + "email": "test@example.com", + "url": "http://madisonruiz.wordpress.com", + "id": 98379888, + "type": "user", + "indices": [ + 0, + 12 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/c536d5d44894a7575296e657d86ed770?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "meta": { + "links": { + "email": "test@example.com", + "home": "http://madisonruiz.wordpress.com" + }, + "ids": { + "user": 98379888 + } + }, + "type": "user" + }, + { + "text": "Theresa Ray", + "ranges": [ + { + "email": "test@example.com", + "url": "http://theresaray.wordpress.com", + "id": 98379754, + "type": "user", + "indices": [ + 0, + 11 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/e31f50d91bb2f5b278038898680ea194?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "meta": { + "links": { + "email": "test@example.com", + "home": "http://theresaray.wordpress.com" + }, + "ids": { + "user": 98379754 + } + }, + "type": "user" + }, + { + "text": "Reyansh Pawar", + "ranges": [ + { + "email": "test@example.com", + "url": "http://reyanshpawar.wordpress.com", + "id": 98380071, + "type": "user", + "indices": [ + 0, + 13 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/4b7ac5a2b497adbd473313b0701023a4?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "meta": { + "links": { + "email": "test@example.com", + "home": "http://reyanshpawar.wordpress.com" + }, + "ids": { + "user": 98380071 + } + }, + "type": "user" + } + ], + "meta": { + "ids": { + "site": 181977606, + "post": 56 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/181977606", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/56" + } + }, + "title": "6 Likes", + "header": [ + { + "text": "appstorescreens", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 15 + ], + "url": "http://tricountyrealestate.wordpress.com", + "site_id": 181851541, + "email": "test@example.com", + "id": 191794483 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/35029b2103460109f574c38dfeea5f3f?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "My Top 10 Pastry Recipes" + } + ], + "note_hash": 1391922081 + }, + { + "id": 4937363362, + "type": "comment", + "read": 1, + "noticon": "", + "timestamp": "{{now offset='-2 hours'}}", + "icon": "https://1.gravatar.com/avatar/4b7ac5a2b497adbd473313b0701023a4?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://weekendbakesblog.wordpress.com/2020/10/05/my-top-10-pastry-recipes/comment-page-1/#comment-2", + "subject": [ + { + "text": "Reyansh Pawar commented on My Top 10 Pastry Recipes", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 13 + ], + "url": "http://reyanshpawar.wordpress.com", + "email": "test@example.com", + "id": 98380071 + }, + { + "type": "post", + "indices": [ + 27, + 51 + ], + "url": "https://weekendbakesblog.wordpress.com/2020/10/05/my-top-10-pastry-recipes/", + "site_id": 181977606, + "id": 56 + } + ] + }, + { + "text": "Can you use almond or rice flour instead of the whole wheat to make the peach scone recipe gluten free?\n", + "ranges": [ + { + "type": "comment", + "indices": [ + 0, + 104 + ], + "url": "https://weekendbakesblog.wordpress.com/2020/10/05/my-top-10-pastry-recipes/comment-page-1/#comment-2", + "site_id": 181977606, + "post_id": 56, + "id": 2 + } + ] + } + ], + "body": [ + { + "text": "Reyansh Pawar", + "ranges": [ + { + "email": "test@example.com", + "url": "http://reyanshpawar.wordpress.com", + "id": 98380071, + "type": "user", + "indices": [ + 0, + 13 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://1.gravatar.com/avatar/4b7ac5a2b497adbd473313b0701023a4?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "meta": { + "links": { + "email": "test@example.com", + "home": "http://reyanshpawar.wordpress.com" + }, + "ids": { + "user": 98380071 + } + }, + "type": "user" + }, + { + "text": "Can you use almond or rice flour instead of the whole wheat to make the peach scone recipe gluten free?", + "actions": { + "spam-comment": false, + "trash-comment": false, + "approve-comment": true, + "edit-comment": true, + "replyto-comment": true, + "like-comment": false + }, + "meta": { + "ids": { + "comment": 2, + "user": 98380071, + "post": 56, + "site": 181977606 + }, + "links": { + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/2", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/98380071", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/56", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/181977606" + } + }, + "type": "comment", + "nest_level": 0, + "edit_comment_link": "https://wordpress.com/comment/weekendbakesblog.wordpress.com/2?action=edit" + } + ], + "meta": { + "ids": { + "user": 98380071, + "comment": 2, + "post": 56, + "site": 181977606 + }, + "links": { + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/98380071", + "comment": "{{request.requestLine.baseUrl}}/rest/v1/comments/2", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/56", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/181977606" + } + }, + "header": [ + { + "text": "Pamela Nguyen", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 15 + ], + "url": "http://tricountyrealestate.wordpress.com", + "site_id": 181851541, + "email": "test@example.com", + "id": 191794483 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/35029b2103460109f574c38dfeea5f3f?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "My Top 10 Pastry Recipes" + } + ], + "title": "Comment", + "note_hash": 1287359074 + }, + { + "id": 4937354640, + "type": "new_post", + "read": 0, + "noticon": "", + "timestamp": "{{now offset='-4 hours'}}", + "icon": "https://2.gravatar.com/avatar/e31f50d91bb2f5b278038898680ea194?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "https://weekendbakesblog.wordpress.com/2020/10/05/easy-blueberry-muffins/", + "subject": [ + { + "text": "Kate Williams posted on Kate's Kitchen: French Toast Four Different Ways", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 13 + ], + "url": "http://tricountyrealestate.wordpress.com", + "site_id": 181851541, + "email": "test@example.com", + "id": 191794483 + }, + { + "type": "site", + "indices": [ + 24, + 38 + ], + "url": "http://weekendbakesblog.wordpress.com", + "id": 181977606 + }, + { + "type": "post", + "indices": [ + 40, + 72 + ], + "url": "https://weekendbakesblog.wordpress.com/2020/10/05/easy-blueberry-muffins/", + "site_id": 181977606, + "id": 14 + } + ] + }, + { + "text": "Depending what mood I'm in, I like to…" + } + ], + "body": [ + { + "text": "\n\n\t• \n\t\n\t\n\t• \n\t\n\t\n\t• \n\t\n\t\nIngredients\n\n\t• 1 cup fresh or frozen blueberries\n\t\n\t• 1 3/4 cup flour\n\t\n\t• 2 tsp baking powder\n\t\n\t• 3/4 cups sugar\n\t\n\t• 1/4 cup canola oil\n\t\n\t• 1 egg\n\t\n", + "ranges": [ + { + "type": "h4", + "indices": [ + 26, + 37 + ] + }, + { + "type": "list", + "indices": [ + 1, + 25 + ] + }, + { + "type": "list", + "indices": [ + 38, + 178 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 14, + 16 + ], + "url": "https://appscreens.files.wordpress.com/2020/08/sarah-gualtieri-o3mdjpy3qdo-unsplash.jpg?w=683" + }, + { + "type": "image", + "indices": [ + 22, + 24 + ], + "url": "https://appscreens.files.wordpress.com/2020/08/yulia-khlebnikova-oh5mxkl9oho-unsplash.jpg?w=1024" + }, + { + "type": "image", + "indices": [ + 6, + 8 + ], + "url": "https://appscreens.files.wordpress.com/2020/08/sarah-gualtieri-tohjvyg65n0-unsplash.jpg?w=683" + } + ], + "actions": { + "replyto-comment": true, + "like-post": false + }, + "meta": { + "ids": { + "post": 14, + "site": 181977606 + }, + "links": { + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/14", + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/181977606" + } + }, + "type": "post" + } + ], + "meta": { + "ids": { + "site": 181977606, + "post": 14, + "user": 191794483 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/181977606", + "post": "{{request.requestLine.baseUrl}}/rest/v1/posts/14", + "user": "{{request.requestLine.baseUrl}}/rest/v1/users/191794483" + } + }, + "title": "New Post", + "header": [ + { + "text": "appstorescreens", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 15 + ], + "url": "http://tricountyrealestate.wordpress.com", + "site_id": 181851541, + "email": "test@example.com", + "id": 191794483 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/35029b2103460109f574c38dfeea5f3f?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ] + }, + { + "text": "Easy Blueberry Muffins", + "ranges": [ + { + "type": "post", + "indices": [ + 0, + 22 + ], + "url": "https://weekendbakesblog.wordpress.com/2020/10/05/easy-blueberry-muffins/", + "site_id": 181977606, + "id": 14 + } + ] + } + ], + "note_hash": 492599271 + }, + { + "id": 4937350334, + "type": "follow", + "read": 0, + "noticon": "", + "timestamp": "{{now offset='-5 hours'}}", + "icon": "https://2.gravatar.com/avatar/b9dadbf067e5583eaf82abefc49727bb?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "url": "http://weekendbakesblog.wordpress.com", + "subject": [ + { + "text": "Pamela Nguyen and 4 others followed your blog Weekend Bakes", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 13 + ], + "url": "http://pamelanguyen.wordpress.com", + "email": "test@example.com", + "id": 98379476 + }, + { + "type": "b", + "indices": [ + 18, + 19 + ] + }, + { + "type": "site", + "indices": [ + 46, + 59 + ], + "url": "http://weekendbakesblog.wordpress.com", + "id": 181977606 + } + ] + } + ], + "body": [ + { + "text": "Pamela Nguyen", + "ranges": [ + { + "email": "test@example.com", + "url": "http://pamelanguyen.wordpress.com", + "id": 98379476, + "type": "user", + "indices": [ + 0, + 13 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/b9dadbf067e5583eaf82abefc49727bb?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "meta": { + "links": { + "email": "test@example.com", + "home": "http://pamelanguyen.wordpress.com" + }, + "ids": { + "user": 98379476 + } + }, + "type": "user" + }, + { + "text": "Catrina Ciobanu", + "ranges": [ + { + "email": "test@example.com", + "url": "http://catrinaciobanu.wordpress.com", + "id": 98387381, + "type": "user", + "indices": [ + 0, + 15 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/9e99ce19f071c664fb4a882befb72391?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "meta": { + "links": { + "email": "test@example.com", + "home": "http://catrinaciobanu.wordpress.com" + }, + "ids": { + "user": 98387381 + } + }, + "type": "user" + }, + { + "text": "Theresa Ray", + "ranges": [ + { + "email": "test@example.com", + "url": "http://theresaray.wordpress.com", + "id": 98379754, + "type": "user", + "indices": [ + 0, + 11 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://2.gravatar.com/avatar/e31f50d91bb2f5b278038898680ea194?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "meta": { + "links": { + "email": "test@example.com", + "home": "http://theresaray.wordpress.com" + }, + "ids": { + "user": 98379754 + } + }, + "type": "user" + }, + { + "text": "Madison Ruiz", + "ranges": [ + { + "email": "test@example.com", + "url": "http://madisonruiz.wordpress.com", + "id": 98379888, + "type": "user", + "indices": [ + 0, + 12 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/c536d5d44894a7575296e657d86ed770?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "meta": { + "links": { + "email": "test@example.com", + "home": "http://madisonruiz.wordpress.com" + }, + "ids": { + "user": 98379888 + } + }, + "type": "user" + }, + { + "text": "appstorescreens", + "ranges": [ + { + "email": "test@example.com", + "url": "http://tricountyrealestate.wordpress.com", + "id": 191794483, + "site_id": 181851541, + "type": "user", + "indices": [ + 0, + 15 + ] + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://0.gravatar.com/avatar/35029b2103460109f574c38dfeea5f3f?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G" + } + ], + "actions": { + "follow": false + }, + "meta": { + "links": { + "email": "test@example.com", + "home": "http://tricountyrealestate.wordpress.com" + }, + "ids": { + "user": 191794483, + "site": 181851541 + }, + "titles": { + "home": "Tri-County Real Estate" + } + }, + "type": "user" + } + ], + "meta": { + "ids": { + "site": 181977606 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/181977606" + } + }, + "title": "5 Followers", + "header": [ + { + "text": "Weekend Bakes", + "ranges": [ + { + "type": "user", + "indices": [ + 0, + 13 + ], + "url": "http://weekendbakesblog.wordpress.com", + "site_id": 181977606, + "id": 181977606 + } + ], + "media": [ + { + "type": "image", + "indices": [ + 0, + 0 + ], + "height": "256", + "width": "256", + "url": "https://weekendbakesblog.files.wordpress.com/2020/08/image.jpg?w=96" + } + ] + }, + { + "text": "http://weekendbakesblog.wordpress.com" + } + ], + "note_hash": 3590885648 + }, + { + "id": 4937367020, + "type": "best_liked_day_feat", + "read": 1, + "noticon": "", + "timestamp": "{{now offset='-1 days'}}", + "icon": "https://s.wp.com/wp-content/mu-plugins/achievements/bestday-likes-2x.png", + "url": "http://weekendbakesblog.wordpress.com", + "subject": [ + { + "text": "October 5: Your best day for likes on Weekend Bakes", + "ranges": [ + { + "type": "site", + "indices": [ + 38, + 51 + ], + "url": "http://weekendbakesblog.wordpress.com", + "id": 181977606 + } + ] + } + ], + "body": [ + { + "text": "5 Likes", + "media": [ + { + "type": "badge", + "indices": [ + 0, + 7 + ], + "height": "256", + "width": "256", + "url": "https://s.wp.com/wp-content/mu-plugins/achievements/bestday-likes-2x.png" + } + ] + }, + { + "text": "On Monday October 5, 2020, you surpassed your previous record of most likes in one day for your posts on Weekend Bakes. That's pretty awesome, well done!", + "ranges": [ + { + "type": "site", + "indices": [ + 105, + 118 + ], + "url": "http://weekendbakesblog.wordpress.com", + "id": 181977606 + } + ] + }, + { + "text": "Most Likes in One Day" + }, + { + "text": "Current Record: 5", + "ranges": [ + { + "type": "b", + "indices": [ + 16, + 17 + ] + } + ] + }, + { + "text": "Old Record: 4", + "ranges": [ + { + "type": "b", + "indices": [ + 12, + 13 + ] + } + ] + } + ], + "meta": { + "ids": { + "site": 181977606 + }, + "links": { + "site": "{{request.requestLine.baseUrl}}/rest/v1/sites/181977606" + } + }, + "title": "5 Likes", + "note_hash": 3233821948 + } + ] + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_comment_like.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_comment_like.json new file mode 100644 index 000000000000..1a4c5b63994a --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_comment_like.json @@ -0,0 +1,47 @@ +{ + "request": { + "method": "POST", + "urlPath": "/rest/v1.1/sites/181977606/comments/2/likes/new", + "queryParameters": { + "locale": { + "equalTo": "en" + } + } + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0, no-store, private" + }, + "jsonBody": { + "success": true, + "i_like": true, + "like_count": 5, + "site_ID": 181977606, + "meta": { + "links": { + "help": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/comments/2/likes/new/help", + "post": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/comments/2", + "site": "https://public-api.wordpress.com/rest/v1.1/sites/181977606" + } + }, + "liker": { + "ID": 152748359, + "login": "e2eflowtestingmobile", + "email": "e2eflowtestingmobile@example.com", + "name": "e2eflowtestingmobile", + "first_name": "", + "last_name": "", + "nice_name": "e2eflowtestingmobile", + "URL": "https://infocusphotographers.com", + "avatar_URL": "https://0.gravatar.com/avatar/9c0a19481e160f45c5e7d77576c91310f902d9cd321aedc33253b8a801bd9f48?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/c0a1e46923d6e5d6da20e746a7bfd1bc", + "ip_address": "192.0.0.1", + "site_visible": true, + "default_avatar": true + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_comment_parent.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_comment_parent.json new file mode 100644 index 000000000000..310c315767c1 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_comment_parent.json @@ -0,0 +1,53 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/rest/v1\\.1/sites/(\\d+)/comments/(\\d+)\\?locale=([a-zA-Z]+)" + }, + "response": { + "status": 200, + "jsonBody": { + "ID": 2, + "post": { + "ID": 56, + "title": "My Top 10 Pastry Recipes", + "type": "post", + "link": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/posts/56" + }, + "author": { + "ID": 98380071, + "login": "", + "email": "test@example.com", + "name": "Reyansh Pawar", + "first_name": "", + "last_name": "", + "nice_name": "", + "URL": "http://reyanshpawar.wordpress.com", + "avatar_URL": "https://1.gravatar.com/avatar/4b7ac5a2b497adbd473313b0701023a4?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "profile_URL": "https://en.gravatar.com/990973e34a3efd5373e44fd270755295", + "ip_address": "192.0.0.1" + }, + "date": "{{now}}", + "URL": "https://weekendbakesblog.wordpress.com/2020/10/05/my-top-10-pastry-recipes/comment-page-1/#comment-2", + "short_URL": "https://wp.me/pc82cg-sp%23comment-2", + "content": "

Can you use almond or rice flour instead of the whole wheat to make the peach scone recipe gluten free?

\n", + "raw_content": "Can you use almond or rice flour instead of the whole wheat to make the peach scone recipe gluten free?", + "status": "approved", + "parent": false, + "type": "comment", + "like_count": 4, + "i_like": false, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/comments/2", + "help": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/comments/2/help", + "site": "https://public-api.wordpress.com/rest/v1.1/sites/181977606", + "post": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/posts/56", + "replies": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/comments/2/replies/", + "likes": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/comments/2/likes/" + } + }, + "can_moderate": true, + "i_replied": false + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_comment_reply.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_comment_reply.json new file mode 100644 index 000000000000..bb3350f888e6 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_comment_reply.json @@ -0,0 +1,78 @@ +{ + "scenarioName": "comment_flow", + "requiredScenarioState": "initial_comments_list", + "newScenarioState": "comment_replied", + "request": { + "method": "POST", + "urlPath": "/rest/v1.1/sites/181977606/comments/2/replies/new", + "queryParameters": { + "locale": { + "equalTo": "en" + } + }, + "bodyPatterns": [ + { + "equalToJson": { + "content": "Reply to comment from app", + "context": "edit" + } + } + ] + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0, no-store, private" + }, + "jsonBody": { + "ID": 3, + "post": { + "ID": 56, + "title": "My Top 10 Pastry Recipes", + "type": "post", + "link": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/posts/56" + }, + "author": { + "ID": 152748359, + "login": "e2eflowtestingmobile", + "email": "e2eflowtestingmobile@example.com", + "name": "e2eflowtestingmobile", + "first_name": "", + "last_name": "", + "nice_name": "e2eflowtestingmobile", + "URL": "https://infocusphotographers.com", + "avatar_URL": "https://0.gravatar.com/avatar/9c0a19481e160f45c5e7d77576c91310f902d9cd321aedc33253b8a801bd9f48?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/c0a1e46923d6e5d6da20e746a7bfd1bc", + "ip_address": "192.0.0.1" + }, + "date": "{{now}}", + "URL": "https://weekendbakesblog.wordpress.com/2020/10/05/my-top-10-pastry-recipes/comment-page-1/#comment-3", + "short_URL": "https://wp.me/pc82cg-sp%23comment-3", + "content": "

Reply to comment from app

\n", + "raw_content": "Reply to comment from app", + "status": "approved", + "parent": { + "ID": 2, + "type": "comment", + "link": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/comments/2" + }, + "type": "comment", + "like_count": 0, + "i_like": false, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/comments/3", + "help": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/comments/3/help", + "site": "https://public-api.wordpress.com/rest/v1.1/sites/181977606", + "post": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/posts/56", + "replies": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/comments/3/replies/", + "likes": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/comments/3/likes/" + } + }, + "can_moderate": true, + "i_replied": false + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_comment_reply_after.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_comment_reply_after.json new file mode 100644 index 000000000000..002715c3644b --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_comment_reply_after.json @@ -0,0 +1,73 @@ +{ + "scenarioName": "comment_flow", + "requiredScenarioState": "comment_replied", + "newScenarioState": "new_comments_list", + "request": { + "method": "GET", + "urlPath": "/wp/v2/sites/181977606/comments", + "queryParameters": { + "locale": { + "equalTo": "en" + }, + "parent": { + "equalTo": "2" + } + } + }, + "response": { + "status": 200, + "jsonBody": [{ + "id": 3, + "post": 56, + "parent": 2, + "author": 152748359, + "author_name": "e2eflowtestingmobile", + "author_url": "https://infocusphotographers.com", + "date": "2023-08-08T22:38:31", + "date_gmt": "2023-08-09T03:38:31", + "content": { + "rendered": "

Reply to comment from app

\n" + }, + "link": "https://weekendbakesblog.wordpress.com/2020/10/05/my-top-10-pastry-recipes/comment-page-1/#comment-3", + "status": "approved", + "type": "comment", + "author_avatar_urls": { + "24": "https://secure.gravatar.com/avatar/c0a1e46923d6e5d6da20e746a7bfd1bc?s=24&d=identicon&r=g", + "48": "https://secure.gravatar.com/avatar/c0a1e46923d6e5d6da20e746a7bfd1bc?s=48&d=identicon&r=g", + "96": "https://secure.gravatar.com/avatar/c0a1e46923d6e5d6da20e746a7bfd1bc?s=96&d=identicon&r=g" + }, + "meta": [], + "_links": { + "self": [ + { + "href": "https://public-api.wordpress.com/wp/v2/sites/181977606/comments/3" + } + ], + "collection": [ + { + "href": "https://public-api.wordpress.com/wp/v2/sites/181977606/comments" + } + ], + "author": [ + { + "embeddable": true, + "href": "https://public-api.wordpress.com/wp/v2/sites/181977606/users/191794483" + } + ], + "up": [ + { + "embeddable": true, + "post_type": "post", + "href": "https://public-api.wordpress.com/wp/v2/sites/181977606/posts/56" + } + ], + "in-reply-to": [ + { + "embeddable": true, + "href": "https://public-api.wordpress.com/wp/v2/sites/181977606/comments/2" + } + ] + } + }] + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_comment_reply_before.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_comment_reply_before.json new file mode 100644 index 000000000000..c4aaefad6e14 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_comment_reply_before.json @@ -0,0 +1,26 @@ +{ + "scenarioName": "comment_flow", + "requiredScenarioState": "Started", + "newScenarioState": "initial_comments_list", + "request": { + "method": "GET", + "urlPath": "/wp/v2/sites/181977606/comments", + "queryParameters": { + "locale": { + "equalTo": "en" + }, + "parent": { + "equalTo": "2" + } + } + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json; charset=UTF-8", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0, no-store, private" + }, + "jsonBody": [] + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_likes.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_likes.json new file mode 100644 index 000000000000..09ae543be7b7 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_likes.json @@ -0,0 +1,203 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/rest/v1.2/sites/.*/posts/56/likes.*", + "queryParameters": { + "locale": { + "matches": "(.*)" + }, + "number": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "found": 6, + "i_like": true, + "likes": [ + { + "ID": 152748359, + "login": "testuser01", + "email": "test@example.com", + "name": "Amechie Ajimobi", + "first_name": "Amechie", + "last_name": "Ajimobi", + "nice_name": "Amechie", + "URL": "", + "avatar_URL": "https://1.gravatar.com/avatar/11bcf6345930a9fbde5e6f0985c3f24a?s=256&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D256&r=G", + "profile_URL": "", + "ip_address": false, + "site_ID": 106707880, + "site_visible": true, + "default_avatar": false, + "date_liked": "{{now}}", + "bio": "", + "primary_blog": "https://infocusphotographers.wpcomstaging.com", + "preferred_blog": { + "id": null, + "name": "Testing Site", + "url": "https://infocusphotographers.wpcomstaging.com", + "icon": { + "img": "", + "ico": "" + } + } + }, + { + "ID": 152748360, + "login": "testuser02", + "email": "test02@example.com", + "name": "Tester Two", + "first_name": "Tester", + "last_name": "Two", + "nice_name": "Tester", + "URL": "", + "avatar_URL": "", + "profile_URL": "", + "ip_address": false, + "site_ID": 106707880, + "site_visible": true, + "default_avatar": false, + "date_liked": "{{now}}", + "bio": "", + "primary_blog": "https://infocusphotographers.wpcomstaging.com", + "preferred_blog": { + "id": null, + "name": "Testing Site", + "url": "https://infocusphotographers.wpcomstaging.com", + "icon": { + "img": "", + "ico": "" + } + } + }, + { + "ID": 152748361, + "login": "testuser03", + "email": "test03@example.com", + "name": "Tester Three", + "first_name": "Tester", + "last_name": "Three", + "nice_name": "Tester", + "URL": "", + "avatar_URL": "", + "profile_URL": "", + "ip_address": false, + "site_ID": 106707880, + "site_visible": true, + "default_avatar": false, + "date_liked": "{{now}}", + "bio": "", + "primary_blog": "https://infocusphotographers.wpcomstaging.com", + "preferred_blog": { + "id": null, + "name": "Testing Site", + "url": "https://infocusphotographers.wpcomstaging.com", + "icon": { + "img": "", + "ico": "" + } + } + }, + { + "ID": 152748362, + "login": "testuser04", + "email": "test04@example.com", + "name": "Tester Four", + "first_name": "Tester", + "last_name": "Four", + "nice_name": "Tester", + "URL": "", + "avatar_URL": "", + "profile_URL": "", + "ip_address": false, + "site_ID": 106707880, + "site_visible": true, + "default_avatar": false, + "date_liked": "{{now}}", + "bio": "", + "primary_blog": "https://infocusphotographers.wpcomstaging.com", + "preferred_blog": { + "id": null, + "name": "Testing Site", + "url": "https://infocusphotographers.wpcomstaging.com", + "icon": { + "img": "", + "ico": "" + } + } + }, + { + "ID": 152748363, + "login": "testuser05", + "email": "test05@example.com", + "name": "Tester Five", + "first_name": "Tester", + "last_name": "Five", + "nice_name": "Tester", + "URL": "", + "avatar_URL": "", + "profile_URL": "", + "ip_address": false, + "site_ID": 106707880, + "site_visible": true, + "default_avatar": false, + "date_liked": "{{now}}", + "bio": "", + "primary_blog": "https://infocusphotographers.wpcomstaging.com", + "preferred_blog": { + "id": null, + "name": "Testing Site", + "url": "https://infocusphotographers.wpcomstaging.com", + "icon": { + "img": "", + "ico": "" + } + } + }, + { + "ID": 152748364, + "login": "testuser06", + "email": "test06@example.com", + "name": "Tester Six", + "first_name": "Tester", + "last_name": "Six", + "nice_name": "Tester", + "URL": "", + "avatar_URL": "", + "profile_URL": "", + "ip_address": false, + "site_ID": 106707880, + "site_visible": true, + "default_avatar": false, + "date_liked": "{{now}}", + "bio": "", + "primary_blog": "https://infocusphotographers.wpcomstaging.com", + "preferred_blog": { + "id": null, + "name": "Testing Site", + "url": "https://infocusphotographers.wpcomstaging.com", + "icon": { + "img": "", + "ico": "" + } + } + } + ], + "meta": { + "links": { + "help": "https://public-api.wordpress.com/rest/v1.2/sites/181977606/posts/56/likes/help", + "post": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/posts/56", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181977606" + } + } + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_note_hashes.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_note_hashes.json new file mode 100644 index 000000000000..871115a35be6 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_note_hashes.json @@ -0,0 +1,57 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/rest/v1.1/notifications(/)?($|\\?.*)", + "queryParameters": { + "fields": { + "equalTo": "id,note_hash" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "last_seen_time": "1598052184", + "number": 9, + "notes": [ + { + "id": 4937370391, + "note_hash": 1528602550 + }, + { + "id": 4937363649, + "note_hash": 1391922081 + }, + { + "id": 4937363362, + "note_hash": 1287359074 + }, + { + "id": 4937360549, + "note_hash": 638476488 + }, + { + "id": 4937354640, + "note_hash": 492599271 + }, + { + "id": 4937350334, + "note_hash": 3590885648 + }, + { + "id": 4937367020, + "note_hash": 3233821948 + }, + { + "id": 4880577651, + "note_hash": 2994072417 + } + ] + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_seen.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_seen.json new file mode 100644 index 000000000000..b4abe36fc952 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/notifications/notifications_seen.json @@ -0,0 +1,18 @@ +{ + "request": { + "method": "POST", + "urlPath": "/rest/v1.1/notifications/seen" + }, + "response": { + "status": 200, + "jsonBody": { + "last_seen_time": "1550137757", + "success": true + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/pages/sites_181851495_pages_after.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/pages/sites_181851495_pages_after.json new file mode 100644 index 000000000000..d3483a33c908 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/pages/sites_181851495_pages_after.json @@ -0,0 +1,368 @@ +{ + "scenarioName": "new_page_flow", + "requiredScenarioState": "page_published", + "newScenarioState": "new_pages_list", + "request": { + "method": "GET", + "urlPath": "/rest/v1.2/sites/181851495/posts", + "queryParameters": { + "locale": { + "matches": "(.*)" + }, + "type": { + "equalTo": "page" + } + } + }, + "response": { + "status": 200, + "fixedDelayMilliseconds": 1000, + "jsonBody": { + "found": 4, + "posts": [ + { + "ID": 13, + "site_ID": 181851495, + "author": { + "ID": 152748359, + "login": "e2eflowtestingmobile", + "email": "e2eflowtestingmobile@example.com", + "name": "e2eflowtestingmobile", + "first_name": "", + "last_name": "", + "nice_name": "e2eflowtestingmobile", + "URL": "https://infocusphotographers.com", + "avatar_URL": "https://1.gravatar.com/avatar/7a4015c11be6a342f65e0e169092d402?s=96&d=identicon&r=G", + "profile_URL": "http://en.gravatar.com/e2eflowtestingmobile", + "site_ID": 1 + }, + "date": "{{#assign 'customformat'}}yyyy-MM-dd'T'HH:mm:ssZ{{/assign}}{{now format=customformat}}", + "modified": "{{now format=customformat}}", + "title": "New Blank Page", + "URL": "https://infocusphotographers.com/new-blank-page/", + "short_URL": "https://wp.me/abc123", + "content": "\n

Creating a new blank page

\n", + "excerpt": "", + "slug": "new-blank-page", + "guid": "https://infocusphotographers.com/new-blank-page/", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "page", + "discussion": { + "comments_open": false, + "comment_status": "closed", + "pings_open": false, + "ping_status": "closed", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "abc123", + "featured_image": "", + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [], + "terms": {}, + "tags": {}, + "categories": {}, + "attachments": {}, + "attachment_count": 0, + "metadata": [], + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181851495/posts/13", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/181851495/posts/13/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181851495", + "replies": "https://public-api.wordpress.com/rest/v1.1/sites/181851495/posts/13/replies/", + "likes": "https://public-api.wordpress.com/rest/v1.2/sites/181851495/posts/13/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "other_URLs": {} + }, + { + "ID": 51, + "site_ID": 181851495, + "author": { + "ID": 152748359, + "login": "kkevin", + "email": "test@automattic.com", + "name": "Kevin Jorge", + "first_name": "Kevin", + "last_name": "Jorge", + "nice_name": "kkevin", + "URL": "", + "avatar_URL": "https://secure.gravatar.com/avatar/eea057209f5e29d6ca4103bc165d645b?s=96&d=identicon&r=g", + "profile_URL": "https://en.gravatar.com/eea057209f5e29d6ca4103bc165d645b" + }, + "date": "2023-05-18T13:33:38+03:00", + "modified": "2023-05-18T13:33:38+03:00", + "title": "Blog", + "URL": "https://infocusphotographers.wpcomstaging.com/blog-2/", + "short_URL": "https://wp.me/Pez3E8-P", + "content": "\n
\"\"/
\n\n\n\n

Introduce yourself and your blog

\n\n\n\n
\n\n\n\n

My Latest Posts

\n\n\n\n

• • •

\n\n\n\n\n\n

• • •

\n\n\n\n
\"\"
\n\n\n\n
\"\"
\n", + "excerpt": "", + "slug": "blog-2", + "guid": "https://infocusphotographers.wpcomstaging.com/blog-2/", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "page", + "discussion": { + "comments_open": false, + "comment_status": "closed", + "pings_open": false, + "ping_status": "closed", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "97e31e7dc1c0c1ef55ff252025cc55b3", + "featured_image": "", + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [], + "terms": {}, + "tags": {}, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 6, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181851495/categories/slug:uncategorized", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/181851495/categories/slug:uncategorized/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181851495" + } + }, + "parent": 0 + } + }, + "attachments": {}, + "attachment_count": 0, + "metadata": [], + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181851495/posts/51", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/181851495/posts/51/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181851495", + "replies": "https://public-api.wordpress.com/rest/v1.1/sites/181851495/posts/51/replies/", + "likes": "https://public-api.wordpress.com/rest/v1.2/sites/181851495/posts/51/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "other_URLs": {} + }, + { + "ID": 6, + "site_ID": 181851495, + "author": { + "ID": 152748359, + "login": "kkevin", + "email": "test@automattic.com", + "name": "Kevin Jorge", + "first_name": "Kevin", + "last_name": "Jorge", + "nice_name": "kkevin", + "URL": "", + "avatar_URL": "https://secure.gravatar.com/avatar/eea057209f5e29d6ca4103bc165d645b?s=96&d=identicon&r=g", + "profile_URL": "https://en.gravatar.com/eea057209f5e29d6ca4103bc165d645b" + }, + "date": "2023-02-03T11:39:21+02:00", + "modified": "2023-02-03T11:39:21+02:00", + "title": "Shop", + "URL": "https://infocusphotographers.wpcomstaging.com/shop/", + "short_URL": "https://wp.me/Pez3E8-6", + "content": "", + "excerpt": "", + "slug": "shop", + "guid": "https://infocusphotographers.wpcomstaging.com/shop/", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "page", + "discussion": { + "comments_open": false, + "comment_status": "closed", + "pings_open": false, + "ping_status": "closed", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": false, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "3a97ffe84953f0deaa2fe6bfc2ba0e58", + "featured_image": "", + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [], + "terms": {}, + "tags": {}, + "categories": {}, + "attachments": {}, + "attachment_count": 0, + "metadata": [ + { + "id": "36", + "key": "switch_like_status", + "value": [ + null + ] + }, + { + "id": "37", + "key": "_starter_page_template", + "value": "" + }, + { + "id": "39", + "key": "_wpas_skip_all_services", + "value": "1" + } + ], + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181851495/posts/6", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/181851495/posts/6/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181851495", + "replies": "https://public-api.wordpress.com/rest/v1.1/sites/181851495/posts/6/replies/", + "likes": "https://public-api.wordpress.com/rest/v1.2/sites/181851495/posts/6/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "other_URLs": {} + }, + { + "ID": 7, + "site_ID": 181851495, + "author": { + "ID": 152748359, + "login": "kkevin", + "email": "test@automattic.com", + "name": "Kevin Jorge", + "first_name": "Kevin", + "last_name": "Jorge", + "nice_name": "kkevin", + "URL": "", + "avatar_URL": "https://secure.gravatar.com/avatar/eea057209f5e29d6ca4103bc165d645b?s=96&d=identicon&r=g", + "profile_URL": "https://en.gravatar.com/eea057209f5e29d6ca4103bc165d645b" + }, + "date": "2023-02-03T11:39:20+02:00", + "modified": "2023-02-03T11:39:20+02:00", + "title": "Cart", + "URL": "https://infocusphotographers.wpcomstaging.com/cart/", + "short_URL": "https://wp.me/Pez3E8-7", + "content": "\n
\n
\n
\n
\n\n\n\n
\n

You may be interested in…

\n\n\n\n
\n
\n
\n\n\n\n
\n
\n
\n\n\n\n
\n\n\n\n
\n\n\n\n
\n\n\n\n
\n\n\n\n
\n\n\n\n
\n
\n\n\n\n
\n\n\n\n
\n\n\n\n
\n
\n
\n\n\n\n
\n
\"\"
\n\n\n\n

Your cart is currently empty!

\n\n\n\n

Browse store.

\n\n\n\n
\n\n\n\n

New in store

\n\n\n
\n
\n", + "excerpt": "", + "slug": "cart", + "guid": "https://infocusphotographers.wpcomstaging.com/cart/", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "page", + "discussion": { + "comments_open": false, + "comment_status": "closed", + "pings_open": false, + "ping_status": "closed", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": false, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "5a697a759e1d595fddd5cdfcd64f00a0", + "featured_image": "", + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [], + "terms": {}, + "tags": {}, + "categories": {}, + "attachments": {}, + "attachment_count": 0, + "metadata": [ + { + "id": "43", + "key": "switch_like_status", + "value": [ + null + ] + }, + { + "id": "44", + "key": "_starter_page_template", + "value": "" + }, + { + "id": "46", + "key": "_wpas_skip_all_services", + "value": "1" + } + ], + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181851495/posts/7", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/181851495/posts/7/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181851495", + "replies": "https://public-api.wordpress.com/rest/v1.1/sites/181851495/posts/7/replies/", + "likes": "https://public-api.wordpress.com/rest/v1.2/sites/181851495/posts/7/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "other_URLs": {} + } + ], + "meta": { + "links": { + "counts": "https://public-api.wordpress.com/rest/v1.2/sites/1/post-counts/page" + } + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/pages/sites_181851495_pages_before.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/pages/sites_181851495_pages_before.json new file mode 100644 index 000000000000..507bc97c46a9 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/pages/sites_181851495_pages_before.json @@ -0,0 +1,295 @@ +{ + "scenarioName": "new_page_flow", + "requiredScenarioState": "Started", + "newScenarioState": "initial_pages_list", + "request": { + "method": "GET", + "urlPath": "/rest/v1.2/sites/181851495/posts", + "queryParameters": { + "locale": { + "matches": "(.*)" + }, + "type": { + "equalTo": "page" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "found": 3, + "posts": [ + { + "ID": 51, + "site_ID": 181851495, + "author": { + "ID": 152748359, + "login": "kkevin", + "email": "test@automattic.com", + "name": "Kevin Jorge", + "first_name": "Kevin", + "last_name": "Jorge", + "nice_name": "kkevin", + "URL": "", + "avatar_URL": "https://secure.gravatar.com/avatar/eea057209f5e29d6ca4103bc165d645b?s=96&d=identicon&r=g", + "profile_URL": "https://en.gravatar.com/eea057209f5e29d6ca4103bc165d645b" + }, + "date": "2023-05-18T13:33:38+03:00", + "modified": "2023-05-18T13:33:38+03:00", + "title": "Blog", + "URL": "https://infocusphotographers.wpcomstaging.com/blog-2/", + "short_URL": "https://wp.me/Pez3E8-P", + "content": "\n
\"\"/
\n\n\n\n

Introduce yourself and your blog

\n\n\n\n
\n\n\n\n

My Latest Posts

\n\n\n\n

• • •

\n\n\n\n\n\n

• • •

\n\n\n\n
\"\"
\n\n\n\n
\"\"
\n", + "excerpt": "", + "slug": "blog-2", + "guid": "https://infocusphotographers.wpcomstaging.com/blog-2/", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "page", + "discussion": { + "comments_open": false, + "comment_status": "closed", + "pings_open": false, + "ping_status": "closed", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "97e31e7dc1c0c1ef55ff252025cc55b3", + "featured_image": "", + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [], + "terms": {}, + "tags": {}, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 6, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181851495/categories/slug:uncategorized", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/181851495/categories/slug:uncategorized/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181851495" + } + }, + "parent": 0 + } + }, + "attachments": {}, + "attachment_count": 0, + "metadata": [], + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181851495/posts/51", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/181851495/posts/51/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181851495", + "replies": "https://public-api.wordpress.com/rest/v1.1/sites/181851495/posts/51/replies/", + "likes": "https://public-api.wordpress.com/rest/v1.2/sites/181851495/posts/51/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "other_URLs": {} + }, + { + "ID": 6, + "site_ID": 181851495, + "author": { + "ID": 152748359, + "login": "kkevin", + "email": "test@automattic.com", + "name": "Kevin Jorge", + "first_name": "Kevin", + "last_name": "Jorge", + "nice_name": "kkevin", + "URL": "", + "avatar_URL": "https://secure.gravatar.com/avatar/eea057209f5e29d6ca4103bc165d645b?s=96&d=identicon&r=g", + "profile_URL": "https://en.gravatar.com/eea057209f5e29d6ca4103bc165d645b" + }, + "date": "2023-02-03T11:39:21+02:00", + "modified": "2023-02-03T11:39:21+02:00", + "title": "Shop", + "URL": "https://infocusphotographers.wpcomstaging.com/shop/", + "short_URL": "https://wp.me/Pez3E8-6", + "content": "", + "excerpt": "", + "slug": "shop", + "guid": "https://infocusphotographers.wpcomstaging.com/shop/", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "page", + "discussion": { + "comments_open": false, + "comment_status": "closed", + "pings_open": false, + "ping_status": "closed", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": false, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "3a97ffe84953f0deaa2fe6bfc2ba0e58", + "featured_image": "", + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [], + "terms": {}, + "tags": {}, + "categories": {}, + "attachments": {}, + "attachment_count": 0, + "metadata": [ + { + "id": "36", + "key": "switch_like_status", + "value": [ + null + ] + }, + { + "id": "37", + "key": "_starter_page_template", + "value": "" + }, + { + "id": "39", + "key": "_wpas_skip_all_services", + "value": "1" + } + ], + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181851495/posts/6", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/181851495/posts/6/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181851495", + "replies": "https://public-api.wordpress.com/rest/v1.1/sites/181851495/posts/6/replies/", + "likes": "https://public-api.wordpress.com/rest/v1.2/sites/181851495/posts/6/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "other_URLs": {} + }, + { + "ID": 7, + "site_ID": 181851495, + "author": { + "ID": 152748359, + "login": "kkevin", + "email": "test@automattic.com", + "name": "Kevin Jorge", + "first_name": "Kevin", + "last_name": "Jorge", + "nice_name": "kkevin", + "URL": "", + "avatar_URL": "https://secure.gravatar.com/avatar/eea057209f5e29d6ca4103bc165d645b?s=96&d=identicon&r=g", + "profile_URL": "https://en.gravatar.com/eea057209f5e29d6ca4103bc165d645b" + }, + "date": "2023-02-03T11:39:20+02:00", + "modified": "2023-02-03T11:39:20+02:00", + "title": "Cart", + "URL": "https://infocusphotographers.wpcomstaging.com/cart/", + "short_URL": "https://wp.me/Pez3E8-7", + "content": "\n
\n
\n
\n
\n\n\n\n
\n

You may be interested in…

\n\n\n\n
\n
\n
\n\n\n\n
\n
\n
\n\n\n\n
\n\n\n\n
\n\n\n\n
\n\n\n\n
\n\n\n\n
\n\n\n\n
\n
\n\n\n\n
\n\n\n\n
\n\n\n\n
\n
\n
\n\n\n\n
\n
\"\"
\n\n\n\n

Your cart is currently empty!

\n\n\n\n

Browse store.

\n\n\n\n
\n\n\n\n

New in store

\n\n\n
\n
\n", + "excerpt": "", + "slug": "cart", + "guid": "https://infocusphotographers.wpcomstaging.com/cart/", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "page", + "discussion": { + "comments_open": false, + "comment_status": "closed", + "pings_open": false, + "ping_status": "closed", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": false, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "5a697a759e1d595fddd5cdfcd64f00a0", + "featured_image": "", + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [], + "terms": {}, + "tags": {}, + "categories": {}, + "attachments": {}, + "attachment_count": 0, + "metadata": [ + { + "id": "43", + "key": "switch_like_status", + "value": [ + null + ] + }, + { + "id": "44", + "key": "_starter_page_template", + "value": "" + }, + { + "id": "46", + "key": "_wpas_skip_all_services", + "value": "1" + } + ], + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181851495/posts/7", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/181851495/posts/7/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181851495", + "replies": "https://public-api.wordpress.com/rest/v1.1/sites/181851495/posts/7/replies/", + "likes": "https://public-api.wordpress.com/rest/v1.2/sites/181851495/posts/7/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "other_URLs": {} + } + ], + "meta": { + "links": { + "counts": "https://public-api.wordpress.com/rest/v1.2/sites/1/post-counts/page" + } + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/pages/sites_181851495_pages_new.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/pages/sites_181851495_pages_new.json new file mode 100644 index 000000000000..48f18bc4b4bb --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/pages/sites_181851495_pages_new.json @@ -0,0 +1,103 @@ +{ + "scenarioName": "new_page_flow", + "requiredScenarioState": "initial_pages_list", + "newScenarioState": "page_published", + "request": { + "method": "POST", + "urlPath": "/rest/v1.2/sites/181851495/posts/new", + "queryParameters": { + "context": { + "equalTo": "edit" + }, + "locale": { + "equalTo": "en" + } + }, + "bodyPatterns": [ + { + "matchesJsonPath": "$[?(@.type == 'page')]" + } + ] + }, + "response": { + "status": 200, + "fixedDelayMilliseconds": 1000, + "jsonBody": { + "ID": 13, + "site_ID": 181851495, + "author": { + "ID": 152748359, + "login": "e2eflowtestingmobile", + "email": "e2eflowtestingmobile@example.com", + "name": "e2eflowtestingmobile", + "first_name": "", + "last_name": "", + "nice_name": "e2eflowtestingmobile", + "URL": "https://infocusphotographers.com", + "avatar_URL": "https://1.gravatar.com/avatar/7a4015c11be6a342f65e0e169092d402?s=96&d=identicon&r=G", + "profile_URL": "http://en.gravatar.com/e2eflowtestingmobile", + "site_ID": 1 + }, + "date": "{{#assign 'customformat'}}yyyy-MM-dd'T'HH:mm:ss{{/assign}}{{now format=customformat}}", + "modified": "{{now format=customformat}}", + "title": "New Blank Page", + "URL": "https://infocusphotographers.com/new-blank-page/", + "short_URL": "https://wp.me/abc123", + "content": "\n

Creating a new blank page

\n", + "excerpt": "", + "slug": "new-blank-page", + "guid": "https://infocusphotographers.com/new-blank-page/", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "page", + "discussion": { + "comments_open": false, + "comment_status": "closed", + "pings_open": false, + "ping_status": "closed", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "abc123", + "featured_image": "", + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [], + "terms": {}, + "tags": {}, + "categories": {}, + "attachments": {}, + "attachment_count": 0, + "metadata": [], + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/posts/13", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/106707880/posts/13/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/106707880", + "replies": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/posts/13/replies/", + "likes": "https://public-api.wordpress.com/rest/v1.2/sites/106707880/posts/13/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "other_URLs": {} + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/pages/sites_pages_list.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/pages/sites_pages_list.json new file mode 100644 index 000000000000..66f07b8026c9 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/pages/sites_pages_list.json @@ -0,0 +1,292 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.2/sites/106707880/posts", + "queryParameters": { + "locale": { + "matches": "(.*)" + }, + "type": { + "equalTo": "page" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "found": 3, + "posts": [ + { + "ID": 51, + "site_ID": 106707880, + "author": { + "ID": 152748359, + "login": "kkevin", + "email": "test@automattic.com", + "name": "Kevin Jorge", + "first_name": "Kevin", + "last_name": "Jorge", + "nice_name": "kkevin", + "URL": "", + "avatar_URL": "https://secure.gravatar.com/avatar/eea057209f5e29d6ca4103bc165d645b?s=96&d=identicon&r=g", + "profile_URL": "https://en.gravatar.com/eea057209f5e29d6ca4103bc165d645b" + }, + "date": "2023-05-18T13:33:38+03:00", + "modified": "2023-05-18T13:33:38+03:00", + "title": "Blog", + "URL": "https://infocusphotographers.wpcomstaging.com/blog-2/", + "short_URL": "https://wp.me/Pez3E8-P", + "content": "\n
\"\"/
\n\n\n\n

Introduce yourself and your blog

\n\n\n\n
\n\n\n\n

My Latest Posts

\n\n\n\n

• • •

\n\n\n\n\n\n

• • •

\n\n\n\n
\"\"
\n\n\n\n
\"\"
\n", + "excerpt": "", + "slug": "blog-2", + "guid": "https://infocusphotographers.wpcomstaging.com/blog-2/", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "page", + "discussion": { + "comments_open": false, + "comment_status": "closed", + "pings_open": false, + "ping_status": "closed", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "97e31e7dc1c0c1ef55ff252025cc55b3", + "featured_image": "", + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [], + "terms": {}, + "tags": {}, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 6, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/106707880" + } + }, + "parent": 0 + } + }, + "attachments": {}, + "attachment_count": 0, + "metadata": [], + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/posts/51", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/106707880/posts/51/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/106707880", + "replies": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/posts/51/replies/", + "likes": "https://public-api.wordpress.com/rest/v1.2/sites/106707880/posts/51/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "other_URLs": {} + }, + { + "ID": 6, + "site_ID": 106707880, + "author": { + "ID": 152748359, + "login": "kkevin", + "email": "test@automattic.com", + "name": "Kevin Jorge", + "first_name": "Kevin", + "last_name": "Jorge", + "nice_name": "kkevin", + "URL": "", + "avatar_URL": "https://secure.gravatar.com/avatar/eea057209f5e29d6ca4103bc165d645b?s=96&d=identicon&r=g", + "profile_URL": "https://en.gravatar.com/eea057209f5e29d6ca4103bc165d645b" + }, + "date": "2023-02-03T11:39:21+02:00", + "modified": "2023-02-03T11:39:21+02:00", + "title": "Shop", + "URL": "https://infocusphotographers.wpcomstaging.com/shop/", + "short_URL": "https://wp.me/Pez3E8-6", + "content": "", + "excerpt": "", + "slug": "shop", + "guid": "https://infocusphotographers.wpcomstaging.com/shop/", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "page", + "discussion": { + "comments_open": false, + "comment_status": "closed", + "pings_open": false, + "ping_status": "closed", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": false, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "3a97ffe84953f0deaa2fe6bfc2ba0e58", + "featured_image": "", + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [], + "terms": {}, + "tags": {}, + "categories": {}, + "attachments": {}, + "attachment_count": 0, + "metadata": [ + { + "id": "36", + "key": "switch_like_status", + "value": [ + null + ] + }, + { + "id": "37", + "key": "_starter_page_template", + "value": "" + }, + { + "id": "39", + "key": "_wpas_skip_all_services", + "value": "1" + } + ], + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/posts/6", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/106707880/posts/6/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/106707880", + "replies": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/posts/6/replies/", + "likes": "https://public-api.wordpress.com/rest/v1.2/sites/106707880/posts/6/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "other_URLs": {} + }, + { + "ID": 7, + "site_ID": 106707880, + "author": { + "ID": 152748359, + "login": "kkevin", + "email": "test@automattic.com", + "name": "Kevin Jorge", + "first_name": "Kevin", + "last_name": "Jorge", + "nice_name": "kkevin", + "URL": "", + "avatar_URL": "https://secure.gravatar.com/avatar/eea057209f5e29d6ca4103bc165d645b?s=96&d=identicon&r=g", + "profile_URL": "https://en.gravatar.com/eea057209f5e29d6ca4103bc165d645b" + }, + "date": "2023-02-03T11:39:20+02:00", + "modified": "2023-02-03T11:39:20+02:00", + "title": "Cart", + "URL": "https://infocusphotographers.wpcomstaging.com/cart/", + "short_URL": "https://wp.me/Pez3E8-7", + "content": "\n
\n
\n
\n
\n\n\n\n
\n

You may be interested in…

\n\n\n\n
\n
\n
\n\n\n\n
\n
\n
\n\n\n\n
\n\n\n\n
\n\n\n\n
\n\n\n\n
\n\n\n\n
\n\n\n\n
\n
\n\n\n\n
\n\n\n\n
\n\n\n\n
\n
\n
\n\n\n\n
\n
\"\"
\n\n\n\n

Your cart is currently empty!

\n\n\n\n

Browse store.

\n\n\n\n
\n\n\n\n

New in store

\n\n\n
\n
\n", + "excerpt": "", + "slug": "cart", + "guid": "https://infocusphotographers.wpcomstaging.com/cart/", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "page", + "discussion": { + "comments_open": false, + "comment_status": "closed", + "pings_open": false, + "ping_status": "closed", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": false, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "5a697a759e1d595fddd5cdfcd64f00a0", + "featured_image": "", + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [], + "terms": {}, + "tags": {}, + "categories": {}, + "attachments": {}, + "attachment_count": 0, + "metadata": [ + { + "id": "43", + "key": "switch_like_status", + "value": [ + null + ] + }, + { + "id": "44", + "key": "_starter_page_template", + "value": "" + }, + { + "id": "46", + "key": "_wpas_skip_all_services", + "value": "1" + } + ], + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/posts/7", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/106707880/posts/7/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/106707880", + "replies": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/posts/7/replies/", + "likes": "https://public-api.wordpress.com/rest/v1.2/sites/106707880/posts/7/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "other_URLs": {} + } + ], + "meta": { + "links": { + "counts": "https://public-api.wordpress.com/rest/v1.2/sites/1/post-counts/page" + } + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/pages/sites_pages_new.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/pages/sites_pages_new.json new file mode 100644 index 000000000000..9a4f64c9d099 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/pages/sites_pages_new.json @@ -0,0 +1,59 @@ +{ + "request": { + "method": "POST", + "urlPathPattern": "/rest/v1.1/sites/new", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + }, + "bodyPatterns": [ + { + "matchesJsonPath": "$.lang_id" + }, + { + "matchesJsonPath": "$.options.template" + }, + { + "matchesJsonPath": "$.options.timezone_string" + }, + { + "matchesJsonPath": "$.options.site_information.site_tagline" + }, + { + "matchesJsonPath": "$.find_available_url" + }, + { + "matchesJsonPath": "$.blog_title" + }, + { + "matchesJsonPath": "$.public" + }, + { + "matchesJsonPath": "$.client_secret" + }, + { + "matchesJsonPath": "$.validate" + }, + { + "matchesJsonPath": "$.client_id" + }, + { + "matchesJsonPath": "$.blog_name" + } + ] + }, + "response": { + "status": 200, + "jsonBody": { + "success": true, + "blog_details": { + "url": "https://domainexample.blog/", + "blogid": "221670093", + "blogname": "New Testing Site", + "xmlrpc": "https://domainexample.blog/xmlrpc.php", + "site_slug": "domainexample.blog" + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/pages/sites_pages_offset_6.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/pages/sites_pages_offset_6.json new file mode 100644 index 000000000000..89fd24b79681 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/pages/sites_pages_offset_6.json @@ -0,0 +1,29 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.2/sites/.*/posts", + "queryParameters": { + "locale": { + "matches": "(.*)" + }, + "type": { + "equalTo": "page" + }, + "offset": { + "equalTo": "3" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "found": 0, + "posts": [], + "meta": { + "links": { + "counts": "https://public-api.wordpress.com/rest/v1.2/sites/1/post-counts/page" + } + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/plans/sites_plans.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/plans/sites_plans.json new file mode 100644 index 000000000000..b1d085ba2004 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/plans/sites_plans.json @@ -0,0 +1,411 @@ +{ + "request": { + "urlPattern": "/rest/v1.3/sites/.*/plans.*", + "method": "GET" + }, + "response": { + "status": 200, + "jsonBody": { + "1": { + "formatted_original_price": "US$0", + "raw_price": 0, + "formatted_price": "US$0", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "free_plan", + "product_name": "WordPress.com Free", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "current_plan": true, + "has_domain_credit": false, + "id": null, + "user_is_owner": null, + "interval": -1 + }, + "1009": { + "formatted_original_price": "US$0", + "raw_price": 48, + "formatted_price": "US$48", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "personal-bundle", + "product_name": "WordPress.com Personal", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 365 + }, + "1003": { + "formatted_original_price": "US$0", + "raw_price": 96, + "formatted_price": "US$96", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "value_bundle", + "product_name": "WordPress.com Premium", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 365 + }, + "1008": { + "formatted_original_price": "US$0", + "raw_price": 300, + "formatted_price": "US$300", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "business-bundle", + "product_name": "WordPress.com Business", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 365 + }, + "1011": { + "formatted_original_price": "US$0", + "raw_price": 540, + "formatted_price": "US$540", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "ecommerce-bundle", + "product_name": "WordPress.com eCommerce", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 365 + }, + "1029": { + "formatted_original_price": "US$0", + "raw_price": 78, + "formatted_price": "US$78", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "personal-bundle-2y", + "product_name": "WordPress.com Personal", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 730 + }, + "1049": { + "formatted_original_price": "US$0", + "raw_price": 99, + "formatted_price": "US$99", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "personal-bundle-3y", + "product_name": "WordPress.com Personal", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 1095 + }, + "1023": { + "formatted_original_price": "US$0", + "raw_price": 156, + "formatted_price": "US$156", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "value_bundle-2y", + "product_name": "WordPress.com Premium", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 730 + }, + "1043": { + "formatted_original_price": "US$0", + "raw_price": 198, + "formatted_price": "US$198", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "value_bundle-3y", + "product_name": "WordPress.com Premium", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 1095 + }, + "1028": { + "formatted_original_price": "US$0", + "raw_price": 480, + "formatted_price": "US$480", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "business-bundle-2y", + "product_name": "WordPress.com Business", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 730 + }, + "1048": { + "formatted_original_price": "US$0", + "raw_price": 630, + "formatted_price": "US$630", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "business-bundle-3y", + "product_name": "WordPress.com Business", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 1095 + }, + "1010": { + "formatted_original_price": "US$0", + "raw_price": 36, + "formatted_price": "US$36", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "blogger-bundle", + "product_name": "WordPress.com Blogger", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 365 + }, + "1030": { + "formatted_original_price": "US$0", + "raw_price": 69, + "formatted_price": "US$69", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "blogger-bundle-2y", + "product_name": "WordPress.com Blogger", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 730 + }, + "1031": { + "formatted_original_price": "US$0", + "raw_price": 864, + "formatted_price": "US$864", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "ecommerce-bundle-2y", + "product_name": "WordPress.com eCommerce", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 730 + }, + "1051": { + "formatted_original_price": "US$0", + "raw_price": 1134, + "formatted_price": "US$1,134", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "ecommerce-bundle-3y", + "product_name": "WordPress.com eCommerce", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 1095 + }, + "1019": { + "formatted_original_price": "US$0", + "raw_price": 9, + "formatted_price": "US$9", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "personal-bundle-monthly", + "product_name": "WordPress.com Personal", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 31 + }, + "1013": { + "formatted_original_price": "US$0", + "raw_price": 18, + "formatted_price": "US$18", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "value_bundle_monthly", + "product_name": "WordPress.com Premium", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 31 + }, + "1018": { + "formatted_original_price": "US$0", + "raw_price": 40, + "formatted_price": "US$40", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "business-bundle-monthly", + "product_name": "WordPress.com Business", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 31 + }, + "1021": { + "formatted_original_price": "US$0", + "raw_price": 70, + "formatted_price": "US$70", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "ecommerce-bundle-monthly", + "product_name": "WordPress.com eCommerce", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 31 + }, + "1052": { + "formatted_original_price": "US$0", + "raw_price": 0, + "formatted_price": "US$0", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "ecommerce-trial-bundle-monthly", + "product_name": "Woo Express: Trial", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 31 + }, + "1053": { + "formatted_original_price": "US$0", + "raw_price": 70, + "formatted_price": "US$70", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "wooexpress-medium-bundle-monthly", + "product_name": "Woo Express: Performance", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 31 + }, + "1054": { + "formatted_original_price": "US$0", + "raw_price": 39, + "formatted_price": "US$39", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "wooexpress-small-bundle-monthly", + "product_name": "Woo Express: Essential", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 31 + }, + "1055": { + "formatted_original_price": "US$0", + "raw_price": 540, + "formatted_price": "US$540", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "wooexpress-medium-bundle-yearly", + "product_name": "Woo Express: Performance", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 365 + }, + "1056": { + "formatted_original_price": "US$0", + "raw_price": 300, + "formatted_price": "US$300", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "wooexpress-small-bundle-yearly", + "product_name": "Woo Express: Essential", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 365 + }, + "1034": { + "formatted_original_price": "US$0", + "raw_price": 22, + "formatted_price": "US$22", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "pro-plan-monthly", + "product_name": "WordPress.com Pro", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 31 + }, + "1035": { + "formatted_original_price": "US$0", + "raw_price": 299, + "formatted_price": "US$299", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "pro-plan-2y", + "product_name": "WordPress.com Pro", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 730 + }, + "1033": { + "formatted_original_price": "US$0", + "raw_price": 60, + "formatted_price": "US$60", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "starter-plan", + "product_name": "WordPress.com Starter", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 365 + }, + "1032": { + "formatted_original_price": "US$0", + "raw_price": 180, + "formatted_price": "US$180", + "raw_discount": 0, + "formatted_discount": "US$0", + "product_slug": "pro-plan", + "product_name": "WordPress.com Pro", + "discount_reason": null, + "is_domain_upgrade": null, + "currency_code": "USD", + "can_start_trial": false, + "interval": 365 + } + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/plans/wpcom_v2_plans_mobile.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/plans/wpcom_v2_plans_mobile.json new file mode 100644 index 000000000000..903c076a70d7 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/plans/wpcom_v2_plans_mobile.json @@ -0,0 +1,377 @@ +{ + "request": { + "urlPath": "/wpcom/v2/plans/mobile", + "method": "GET" + }, + "response": { + "status": 200, + "jsonBody": { + "groups": [ + { + "slug": "personal", + "name": "Personal" + }, + { + "slug": "business", + "name": "Business" + } + ], + "plans": [ + { + "groups": [ + "personal" + ], + "products": [ + { + "plan_id": 1 + } + ], + "name": "WordPress.com Free", + "short_name": "Free", + "tagline": "Best for getting started", + "description": "If you just want to start creating, get a free site and be on your way to publishing in less than five minutes.", + "features": [ + "subdomain", + "jetpack-essentials", + "support-forums", + "themes-free", + "design-basic", + "space-3G", + "banner-ads" + ], + "icon": "https://s0.wordpress.com/i/store/mobile/plans-free.png" + }, + { + "groups": [ + "personal" + ], + "products": [ + { + "plan_id": 1010 + }, + { + "plan_id": 1030 + } + ], + "name": "WordPress.com Blogger", + "short_name": "Blogger", + "tagline": "Best for bloggers", + "description": "Brand your blog with a custom .blog domain name, and remove all WordPress.com advertising. Receive additional storage space and email support.", + "features": [ + "blog-domain", + "jetpack-essentials", + "support-email", + "themes-free", + "design-basic", + "space-6G", + "no-ads" + ], + "icon": "https://s0.wordpress.com/i/store/mobile/plans-blogger.png" + }, + { + "groups": [ + "personal" + ], + "products": [ + { + "plan_id": 1009 + }, + { + "plan_id": 1029 + } + ], + "name": "WordPress.com Personal", + "short_name": "Personal", + "tagline": "Best for personal use", + "description": "Boost your website with a custom domain name, and remove all WordPress.com advertising. Get access to high quality email and live chat support.", + "features": [ + "custom-domain", + "jetpack-essentials", + "support-live", + "themes-free", + "design-basic", + "space-6G", + "no-ads" + ], + "icon": "https://s0.wordpress.com/i/store/mobile/plans-personal.png" + }, + { + "groups": [ + "business" + ], + "products": [ + { + "plan_id": 1003 + }, + { + "plan_id": 1023 + } + ], + "name": "WordPress.com Premium", + "short_name": "Premium", + "tagline": "Best for freelancers", + "description": "Build a unique website with advanced design tools, CSS editing, lots of space for audio and video, and the ability to monetize your site with ads.", + "features": [ + "custom-domain", + "jetpack-essentials", + "support-live", + "themes-premium", + "design-custom", + "space-13G", + "no-ads", + "social-media", + "simple-payments", + "monitization", + "videopress" + ], + "icon": "https://s0.wordpress.com/i/store/mobile/plans-premium.png" + }, + { + "groups": [ + "business" + ], + "products": [ + { + "plan_id": 1008 + }, + { + "plan_id": 1028 + } + ], + "name": "WordPress.com Business", + "short_name": "Business", + "tagline": "Best for small business.", + "description": "Power your business website with unlimited premium and business theme templates, Google Analytics support, unlimited storage, and the ability to remove WordPress.com branding.", + "features": [ + "custom-domain", + "jetpack-essentials", + "support-live", + "themes-premium", + "design-custom", + "space-unlimited", + "no-ads", + "social-media", + "simple-payments", + "monitization", + "videopress", + "personalized-help", + "seo", + "plugins", + "upload-themes", + "google-analytics", + "no-branding" + ], + "icon": "https://s0.wordpress.com/i/store/mobile/plans-business.png" + }, + { + "groups": [ + "business" + ], + "products": [ + { + "plan_id": 1011 + }, + { + "plan_id": 1031 + } + ], + "name": "WordPress.com E-commerce", + "short_name": "E-commerce", + "tagline": "Best for online stores", + "description": "Sell products or services with this powerful, all-in-one online store experience. This plan includes premium integrations and is extendable, so it’ll grow with you as your business grows.", + "features": [ + "custom-domain", + "jetpack-essentials", + "support-live", + "themes-premium", + "design-custom", + "space-unlimited", + "no-ads", + "simple-payments", + "monitization", + "videopress", + "personalized-help", + "seo", + "plugins", + "upload-themes", + "google-analytics", + "no-branding", + "payments-processing", + "shipping-rates", + "unlimited-products", + "ecommerce-tools", + "store-theme" + ], + "icon": "https://s0.wordpress.com/i/store/mobile/plans-ecommerce.png" + } + ], + "features": [ + { + "id": "subdomain", + "name": "WordPress.com Subdomain", + "description": "Your site address will use a WordPress.com subdomain (sitename.wordpress.com)." + }, + { + "id": "jetpack-essentials", + "name": "Jetpack Essential Features", + "description": "Speed up your site’s performance and protect it from spammers. Access detailed records of all activity on your site. While you’re at it, improve your SEO and automate social media sharing." + }, + { + "id": "support-forums", + "name": "Community Support", + "description": "Get support through our user community forums." + }, + { + "id": "support-email", + "name": "Email Support", + "description": "High quality email support to help you get your website up and running and working how you want it." + }, + { + "id": "themes-free", + "name": "Dozens of Free Themes", + "description": "Access to a wide range of professional theme templates for your website so you can find the exact design you're looking for." + }, + { + "id": "design-basic", + "name": "Basic Design Customization", + "description": "Customize your selected theme template with pre-set color schemes, background designs, and font styles." + }, + { + "id": "space-3G", + "name": "3GB Storage Space", + "description": "Ample storage space to upload images and documents to your website." + }, + { + "id": "banner-ads", + "name": "WordPress.com Advertising and Banners", + "description": "On our free plan, we sometimes display advertisements on your blog to help pay the bills. This keeps free features free!" + }, + { + "id": "custom-domain", + "name": "Free Domain for One Year", + "description": "Get a free domain for one year. Premium domains not included. Your domain will renew at its regular price." + }, + { + "id": "support-live", + "name": "Email & Live Chat Support", + "description": "High quality support to help you get your website up and running and working how you want it." + }, + { + "id": "space-6G", + "name": "6GB Storage Space", + "description": "With increased storage space you'll be able to upload more images, audio, and documents to your website." + }, + { + "id": "no-ads", + "name": "Remove WordPress.com Ads", + "description": "Allow your visitors to visit and read your website without seeing any WordPress.com advertising." + }, + { + "id": "themes-premium", + "name": "Unlimited Premium Themes", + "description": "Unlimited access to all of our advanced premium theme templates, including templates specifically tailored for businesses." + }, + { + "id": "design-custom", + "name": "Advanced Design Customization", + "description": "Customize your selected theme template with extended color schemes, background designs, and complete control over website CSS." + }, + { + "id": "space-13G", + "name": "13GB Storage Space", + "description": "With increased storage space you'll be able to upload more images, videos, audio, and documents to your website." + }, + { + "id": "social-media", + "name": "Advanced Social Media", + "description": "Schedule your social media updates in advance and promote your posts when it's best for you." + }, + { + "id": "simple-payments", + "name": "Simple Payments", + "description": "Sell anything with a simple PayPal button." + }, + { + "id": "monitization", + "name": "Site Monetization", + "description": "Put your site to work and earn through ad revenue, easy-to-add PayPal buttons, and more." + }, + { + "id": "videopress", + "name": "VideoPress Support", + "description": "The easiest way to upload videos to your website and display them using a fast, unbranded, customizable player with rich stats." + }, + { + "id": "space-unlimited", + "name": "Unlimited Storage Space", + "description": "With increased storage space you'll be able to upload more images, videos, audio, and documents to your website." + }, + { + "id": "personalized-help", + "name": "Get Personalized Help", + "description": "Schedule a one-on-one orientation with a Happiness Engineer to set up your site and learn more about WordPress.com." + }, + { + "id": "seo", + "name": "SEO Tools", + "description": "Adds tools to enhance your site's content for better results on search engines and social media." + }, + { + "id": "plugins", + "name": "Install Plugins", + "description": "Install custom plugins on your site." + }, + { + "id": "upload-themes", + "name": "Upload Themes", + "description": "Upload custom themes on your site." + }, + { + "id": "google-analytics", + "name": "Google Analytics Integration", + "description": "Track website statistics with Google Analytics for a deeper understanding of your website visitors and customers." + }, + { + "id": "no-branding", + "name": "Remove WordPress.com Branding", + "description": "Keep the focus on your site's brand by removing the WordPress.com footer branding." + }, + { + "id": "blog-domain", + "name": "Free .blog Domain for One Year", + "description": "Get a free custom .blog domain for one year. Premium domains not included. Your domain will renew at its regular price." + }, + { + "id": "unlimited-products", + "name": "Unlimited Products or Services", + "description": "Grow your store as big as you want with the ability to add and sell unlimited products and services." + }, + { + "id": "payments-processing", + "name": "Accept Payments in 60+ Countries", + "description": "Built-in payment processing from leading providers like Stripe, PayPal, and more. Accept payments from customers all over the world." + }, + { + "id": "shipping-rates", + "name": "Integrations with Top Shipping Carriers", + "description": "Ship physical products in a snap - show live rates from shipping carriers like UPS and other shipping options" + }, + { + "id": "ecommerce-tools", + "name": "eCommerce Marketing Tools", + "description": "Optimize your store for sales by adding in email and social integrations with Facebook and Mailchimp, and more." + }, + { + "id": "store-theme", + "name": "Premium Customizable Starter Themes", + "description": "Quickly get up and running with a beautiful store theme and additional design options that you can easily make your own." + } + ] + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_draft,pending.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_draft,pending.json new file mode 100644 index 000000000000..696eb147a25a --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_draft,pending.json @@ -0,0 +1,1312 @@ +{ + "scenarioName": "new_post_flow", + "requiredScenarioState": "Started", + "newScenarioState": "initial_posts_list", + "request": { + "method": "GET", + "urlPath": "/rest/v1.2/sites/106707880/posts", + "queryParameters": { + "locale": { + "matches": "(.*)" + }, + "context": { + "equalTo": "edit" + }, + "meta": { + "equalTo": "autosave" + }, + "number": { + "matches": "(.*)" + }, + "status": { + "equalTo": "draft,pending" + }, + "type": { + "equalTo": "post" + } + } + }, + "response": { + "status": 200, + "fixedDelayMilliseconds": 1000, + "jsonBody": { + "found": 7, + "posts": [ + { + "ID": 213, + "site_ID": 106707880, + "author": { + "ID": 68646169, + "login": "thenomadicwordsmith", + "email": "thenomadicwordsmith@gmail.com", + "name": "thenomadicwordsmith", + "first_name": "Nomadic", + "last_name": "Wordsmith", + "nice_name": "thenomadicwordsmith", + "URL": "http://thenomadicwordsmith.wordpress.com", + "avatar_URL": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/thenomadicwordsmith", + "site_ID": 71769073 + }, + "date": "2020-08-24T12:17:14-07:00", + "modified": "2020-08-27T16:31:00-07:00", + "title": "Our Services", + "URL": "https://fourpawsdoggrooming.wordpress.com/our-services/", + "short_URL": "https://wp.me/Pcj1SD-J", + "content": "\n
\n

Mobile grooming salon for cats and dogs.

\n\n\n\n\n
\n\n\n\n

Dog grooming

\n\n\n\n
\n
\n

Our deluxe grooming service includes:

\n\n\n\n
  • Nail clip
  • Ear cleaning
  • 1st shampoo
  • 2nd shampoo
  • Conditioning rinse
  • Towel dry
  • Blow dry
  • Brush out
  • And a treat!
\n
\n\n\n\n
\n
\"\"
\n
\n
\n\n\n\n

Deluxe Cut and Groom

\n\n\n\n

Our deluxe cut and groom package includes everything in the deluxe groom plus a haircut.

\n\n\n\n

Add on services

\n\n\n\n

Pamper your pup even more with one of our signature add on services:

\n\n\n\n
  • Aloe conditioning treatment
  • Soothing medicated shampoos
  • Tooth brushing
  • Creative styling with temporary color
  • Nail polish application
  • Coat braiding
  • Bows and other accessories
\n\n\n\n
\n

\n
\n\n\n\n

\n", + "excerpt": "", + "slug": "our-services", + "guid": "https://fourpawsdoggrooming.wordpress.com/?p=45", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": false, + "comment_status": "closed", + "pings_open": false, + "ping_status": "closed", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "e41d1c97a7b93a594b07e4df51dfafb3", + "featured_image": "", + "post_thumbnail": null, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "attachments": { + "65": { + "ID": 65, + "URL": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg", + "guid": "http://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg", + "date": "2020-08-27T16:30:36-07:00", + "post_ID": 45, + "author_ID": 191794483, + "file": "image-1.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "image", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=107", + "medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=214", + "large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=731", + "newspack-article-block-landscape-large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=1200" + }, + "height": 1848, + "width": 1320, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495/media/65", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495/media/65/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851495/posts/45" + } + } + }, + "63": { + "ID": 63, + "URL": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg", + "guid": "http://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg", + "date": "2020-08-26T12:20:02-07:00", + "post_ID": 45, + "author_ID": 191794483, + "file": "wp-1598469598971.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "wp-1598469598971.jpg", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=100", + "medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=200", + "large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=682", + "newspack-article-block-landscape-large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=1200" + }, + "height": 2780, + "width": 1851, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495/media/63", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495/media/63/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851495/posts/45" + } + } + }, + "61": { + "ID": 61, + "URL": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg", + "guid": "http://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg", + "date": "2020-08-25T12:05:54-07:00", + "post_ID": 45, + "author_ID": 191794483, + "file": "image.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "image", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=150", + "medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=300", + "large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=1024", + "newspack-article-block-landscape-large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=1200" + }, + "height": 1848, + "width": 1846, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495/media/61", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495/media/61/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851495/posts/45" + } + } + } + }, + "attachment_count": 3, + "metadata": [ + { + "id": "502", + "key": "email_notification", + "value": "1553125754" + }, + { + "id": "564", + "key": "geo_public", + "value": "0" + }, + { + "id": "496", + "key": "jabber_published", + "value": "1553125752" + }, + { + "id": "503", + "key": "timeline_notification", + "value": "1553125801" + }, + { + "id": "563", + "key": "_edit_last", + "value": "67626417" + }, + { + "id": "556", + "key": "_edit_lock", + "value": "1565368108:742098" + }, + { + "id": "501", + "key": "_publicize_job_id", + "value": "28865441316" + }, + { + "id": "500", + "key": "_rest_api_client_id", + "value": "-1" + }, + { + "id": "499", + "key": "_rest_api_published", + "value": "1" + }, + { + "id": "565", + "key": "_thumbnail_id", + "value": "151" + }, + { + "id": "514", + "key": "_wp_old_date", + "value": "2019-03-20" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/213", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/posts/213/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/213/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/213/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "revisions": [ + 402, + 401, + 400, + 309, + 303, + 300, + 299, + 298, + 297, + 296, + 292, + 291, + 289, + 288, + 287, + 286, + 285, + 284, + 283, + 280, + 277, + 273, + 267, + 240, + 214 + ], + "other_URLs": { + "permalink_URL": "http://infocusphotographers.com/2019/07/16/%postname%/", + "suggested_slug": "summer-band-jam" + } + }, + { + "ID": 396, + "site_ID": 106707880, + "author": { + "ID": 742098, + "login": "jkmassel", + "email": "jeremy.massel@gmail.com", + "name": "Jeremy Massel", + "first_name": "Jeremy", + "last_name": "Massel", + "nice_name": "jkmassel", + "URL": "https://jkmassel.wordpress.com", + "avatar_URL": "https://2.gravatar.com/avatar/58fc51586c9a1f9895ac70e3ca60886e?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/jkmassel", + "site_ID": 1562023 + }, + "date": "2019-05-28T21:06:45+00:00", + "modified": "2019-05-28T21:08:03+00:00", + "title": "Now Booking Summer Sessions", + "URL": "http://infocusphotographers.com/?p=396", + "short_URL": "https://wp.me/p7dJAQ-6o", + "content": "
“One must maintain a little bit of summer, even in the middle of winter.”\n\n– Henry David Thoreau
\nBlue skies and warm weather, what's not to love about summer? It's a great season for outdoor family portrait sessions and now is the time to book them!\n\nWe offer a number of family portrait packages and for a limited time are offering 15% off packages booked before April 1.\n\nHow to book\n\nEmail us to set up a time to visit our studio.", + "excerpt": "", + "slug": "", + "guid": "http://infocusphotographers.com/?p=396", + "status": "draft", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": false, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "276e4cea0342ec68e69a0ca537acfce1", + "featured_image": "", + "post_thumbnail": null, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + { + "id": "742", + "key": "sharing_disabled", + "value": [ + + ] + }, + { + "id": "741", + "key": "switch_like_status", + "value": "" + }, + { + "id": "743", + "key": "_edit_lock", + "value": "1565368199:742098" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/396", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/posts/396/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/396/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/396/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "revisions": [ + 399, + 398 + ], + "other_URLs": { + "permalink_URL": "http://infocusphotographers.com/2019/05/28/%postname%/", + "suggested_slug": "now-booking-summer-sessions-2" + } + }, + { + "ID": 387, + "site_ID": 106707880, + "author": { + "ID": 68646169, + "login": "thenomadicwordsmith", + "email": "thenomadicwordsmith@gmail.com", + "name": "thenomadicwordsmith", + "first_name": "Nomadic", + "last_name": "Wordsmith", + "nice_name": "thenomadicwordsmith", + "URL": "http://thenomadicwordsmith.wordpress.com", + "avatar_URL": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/thenomadicwordsmith", + "site_ID": 71769073 + }, + "date": "2019-05-28T21:03:22+00:00", + "modified": "2019-05-28T21:03:22+00:00", + "title": "Time to Book Summer Sessions", + "URL": "http://infocusphotographers.com/?p=387", + "short_URL": "https://wp.me/p7dJAQ-6f", + "content": "Blue skies and warm weather, what's not to love about summer?\n\nIt's a great season for outdoor family portrait sessions and now is the time to book them!\n\nWe offer a number of family portrait packages and for a limited time are offering 15% off packages booked before May 1.\n\n\"beach-clouds-daytime-994605\"\n\nHow to book\nEmail us to set up a time to visit our studio.", + "excerpt": "", + "slug": "", + "guid": "http://infocusphotographers.com/?p=387", + "status": "draft", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "a9037bde04073835b078a1b1bb48b7de", + "featured_image": "", + "post_thumbnail": null, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + { + "id": "731", + "key": "_edit_lock", + "value": "1559077396:742098" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/387", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/posts/387/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/387/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/387/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "revisions": [ + 390 + ], + "other_URLs": { + "permalink_URL": "http://infocusphotographers.com/2019/05/28/%postname%/", + "suggested_slug": "time-to-book-summer-sessions" + } + }, + { + "ID": 265, + "site_ID": 106707880, + "author": { + "ID": 68646169, + "login": "thenomadicwordsmith", + "email": "thenomadicwordsmith@gmail.com", + "name": "thenomadicwordsmith", + "first_name": "Nomadic", + "last_name": "Wordsmith", + "nice_name": "thenomadicwordsmith", + "URL": "http://thenomadicwordsmith.wordpress.com", + "avatar_URL": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/thenomadicwordsmith", + "site_ID": 71769073 + }, + "date": "2019-04-17T10:40:39+00:00", + "modified": "2019-04-17T10:41:03+00:00", + "title": "What we've been doing lately", + "URL": "http://infocusphotographers.com/?p=265", + "short_URL": "https://wp.me/p7dJAQ-4h", + "content": "\r\n

The last few weeks have been a blur! Here are a few shots we really like. What do you think?

\r\n\r\n\r\n\r\n\r\n", + "excerpt": "", + "slug": "", + "guid": "http://infocusphotographers.com/?p=265", + "status": "draft", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "2f7a8f8da665b6469d91f96108fb24c6", + "featured_image": "", + "post_thumbnail": null, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + { + "id": "567", + "key": "geo_public", + "value": "0" + }, + { + "id": "566", + "key": "_edit_last", + "value": "67626417" + }, + { + "id": "555", + "key": "_edit_lock", + "value": "1555497522:67626417" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/265", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/posts/265/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/265/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/265/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "revisions": [ + 294, + 293, + 266 + ], + "other_URLs": { + "permalink_URL": "http://infocusphotographers.com/2019/04/17/%postname%/", + "suggested_slug": "what-weve-been-doing-lately" + } + }, + { + "ID": 134, + "site_ID": 106707880, + "author": { + "ID": 68646169, + "login": "thenomadicwordsmith", + "email": "thenomadicwordsmith@gmail.com", + "name": "thenomadicwordsmith", + "first_name": "Nomadic", + "last_name": "Wordsmith", + "nice_name": "thenomadicwordsmith", + "URL": "http://thenomadicwordsmith.wordpress.com", + "avatar_URL": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/thenomadicwordsmith", + "site_ID": 71769073 + }, + "date": "2019-03-19T03:08:16+00:00", + "modified": "2019-05-27T21:39:08+00:00", + "title": "Now Booking Summer Sessions", + "URL": "http://infocusphotographers.com/?p=134", + "short_URL": "https://wp.me/p7dJAQ-2a", + "content": "
“One must maintain a little bit of summer, even in the middle of winter.” \n\n– Henry David Thoreau
\nBlue skies and warm weather, what's not to love about summer? It's a great season for outdoor family portrait sessions and now is the time to book them!\n\nWe offer a number of family portrait packages and for a limited time are offering 15% off packages booked before April 1.\n

How to book

\nEmail us to set up a time to visit our studio.", + "excerpt": "", + "slug": "now-booking-summer-sessions", + "guid": "http://infocusphotographers.com/?p=134", + "status": "draft", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "e9bb2d5021873cf97e6ced1f9308bdd5", + "featured_image": "", + "post_thumbnail": null, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + { + "id": "560", + "key": "_edit_lock", + "value": "1559078929:742098" + }, + { + "id": "478", + "key": "_wp_desired_post_slug", + "value": "" + }, + { + "id": "481", + "key": "_wp_desired_post_slug", + "value": "__trashed-5" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/134", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/posts/134/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/134/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/134/likes/", + "autosave": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/134/autosave" + }, + "data": { + "autosave": { + "ID": 397, + "author_ID": "742098", + "post_ID": 134, + "title": "Now Booking Summer Sessions", + "content": "
“One must maintain a little bit of summer, even in the middle of winter.” \n\n– Henry David Thoreau
\nBlue skies and warm weather, what's not to love about summer? It's a great season for outdoor family portrait sessions and now is the time to book them!\n\nWe offer a number of family portrait packages and for a limited time are offering 15% off packages booked before April 1.\n

How to book

\nEmail us to set up a time to visit our studio.", + "excerpt": "", + "preview_URL": "http://infocusphotographers.com/?p=134&preview=true&preview_nonce=fcfb9daa0a", + "modified": "2019-05-28T21:05:12+00:00" + } + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "revisions": [ + 397, + 310, + 274, + 236, + 231, + 230, + 220, + 219, + 218, + 136, + 135 + ], + "other_URLs": { + "permalink_URL": "http://infocusphotographers.com/2019/03/19/%postname%/", + "suggested_slug": "now-booking-summer-sessions" + } + }, + { + "ID": 215, + "site_ID": 106707880, + "author": { + "ID": 68646169, + "login": "thenomadicwordsmith", + "email": "thenomadicwordsmith@gmail.com", + "name": "thenomadicwordsmith", + "first_name": "Nomadic", + "last_name": "Wordsmith", + "nice_name": "thenomadicwordsmith", + "URL": "http://thenomadicwordsmith.wordpress.com", + "avatar_URL": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/thenomadicwordsmith", + "site_ID": 71769073 + }, + "date": "2019-02-15T23:27:13+00:00", + "modified": "2019-02-15T23:27:13+00:00", + "title": "Ideas", + "URL": "http://infocusphotographers.com/?p=215", + "short_URL": "https://wp.me/p7dJAQ-3t", + "content": "Returning client special - Offer a discount to clients who have left a review.\n\nPhotography classes at the local", + "excerpt": "", + "slug": "", + "guid": "http://infocusphotographers.com/?p=215", + "status": "draft", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "50d8150dfae26a5bef18779211142b65", + "featured_image": "", + "post_thumbnail": null, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + { + "id": "561", + "key": "_edit_lock", + "value": "1553718391:742098" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/215", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/posts/215/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/215/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/215/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "revisions": [ + 216 + ], + "other_URLs": { + "permalink_URL": "http://infocusphotographers.com/2019/02/15/%postname%/", + "suggested_slug": "ideas" + } + }, + { + "ID": 225, + "site_ID": 106707880, + "author": { + "ID": 68646169, + "login": "thenomadicwordsmith", + "email": "thenomadicwordsmith@gmail.com", + "name": "thenomadicwordsmith", + "first_name": "Nomadic", + "last_name": "Wordsmith", + "nice_name": "thenomadicwordsmith", + "URL": "http://thenomadicwordsmith.wordpress.com", + "avatar_URL": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/thenomadicwordsmith", + "site_ID": 71769073 + }, + "date": "2019-01-01T21:54:15+00:00", + "modified": "2019-03-21T17:20:44+00:00", + "title": "Book Your Summer Sessions", + "URL": "http://infocusphotographers.com/?p=225", + "short_URL": "https://wp.me/p7dJAQ-3D", + "content": "\n

“One must maintain a little bit of summer, even in the middle of winter.

– Henry David Thoreau
\n\n\n\n

Blue skies and warm weather, what's not to love about summer? It's a great season for outdoor family portrait sessions and now is the time to book them!

\n\n\n\n

We offer a number of family portrait packages and for a limited time are offering 15% off packages booked before April 1.

\n\n\n\n
\"beach-children-family-39691\"
\n\n\n\n

How to book

\n\n\n\n

Email us to set up a time to visit our studio.

\n", + "excerpt": "", + "slug": "__trashed-2", + "guid": "http://infocusphotographers.com/?p=225", + "status": "draft", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "2d07f957bcc110149b8aa37bd1231ad1", + "featured_image": "", + "post_thumbnail": null, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "attachments": { + "243": { + "ID": 243, + "URL": "https://infocusphotographers.files.wordpress.com/2019/01/beach-children-family-39691.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/01/beach-children-family-39691.jpg", + "date": "2019-03-20T23:56:52+00:00", + "post_ID": 225, + "author_ID": 14151046, + "file": "beach-children-family-39691.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "beach-children-family-39691", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/01/beach-children-family-39691.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/01/beach-children-family-39691.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/01/beach-children-family-39691.jpg?w=1024" + }, + "height": 2446, + "width": 3669, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/media/243", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/media/243/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/225" + } + } + } + }, + "attachment_count": 1, + "metadata": [ + { + "id": "558", + "key": "_edit_lock", + "value": "1559077412:742098" + }, + { + "id": "468", + "key": "_wp_desired_post_slug", + "value": "" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/225", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/posts/225/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/225/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/225/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "revisions": [ + 271, + 235, + 229, + 228, + 227, + 226 + ], + "other_URLs": { + "permalink_URL": "http://infocusphotographers.com/2019/01/01/%postname%/", + "suggested_slug": "__trashed-2" + } + } + ], + "meta": { + "links": { + "counts": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/post-counts/post" + }, + "wpcom": true + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_draft,pending_initial_list.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_draft,pending_initial_list.json new file mode 100644 index 000000000000..bc58a4e9e22f --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_draft,pending_initial_list.json @@ -0,0 +1,1311 @@ +{ + "scenarioName": "new_post_flow", + "requiredScenarioState": "initial_posts_list", + "request": { + "method": "GET", + "urlPath": "/rest/v1.2/sites/106707880/posts", + "queryParameters": { + "locale": { + "matches": "(.*)" + }, + "context": { + "equalTo": "edit" + }, + "meta": { + "equalTo": "autosave" + }, + "number": { + "matches": "(.*)" + }, + "status": { + "equalTo": "draft,pending" + }, + "type": { + "equalTo": "post" + } + } + }, + "response": { + "status": 200, + "fixedDelayMilliseconds": 1000, + "jsonBody": { + "found": 7, + "posts": [ + { + "ID": 213, + "site_ID": 106707880, + "author": { + "ID": 68646169, + "login": "thenomadicwordsmith", + "email": "thenomadicwordsmith@gmail.com", + "name": "thenomadicwordsmith", + "first_name": "Nomadic", + "last_name": "Wordsmith", + "nice_name": "thenomadicwordsmith", + "URL": "http://thenomadicwordsmith.wordpress.com", + "avatar_URL": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/thenomadicwordsmith", + "site_ID": 71769073 + }, + "date": "2020-08-24T12:17:14-07:00", + "modified": "2020-08-27T16:31:00-07:00", + "title": "Our Services", + "URL": "https://fourpawsdoggrooming.wordpress.com/our-services/", + "short_URL": "https://wp.me/Pcj1SD-J", + "content": "\n
\n

Mobile grooming salon for cats and dogs.

\n\n\n\n\n
\n\n\n\n

Dog grooming

\n\n\n\n
\n
\n

Our deluxe grooming service includes:

\n\n\n\n
  • Nail clip
  • Ear cleaning
  • 1st shampoo
  • 2nd shampoo
  • Conditioning rinse
  • Towel dry
  • Blow dry
  • Brush out
  • And a treat!
\n
\n\n\n\n
\n
\"\"
\n
\n
\n\n\n\n

Deluxe Cut and Groom

\n\n\n\n

Our deluxe cut and groom package includes everything in the deluxe groom plus a haircut.

\n\n\n\n

Add on services

\n\n\n\n

Pamper your pup even more with one of our signature add on services:

\n\n\n\n
  • Aloe conditioning treatment
  • Soothing medicated shampoos
  • Tooth brushing
  • Creative styling with temporary color
  • Nail polish application
  • Coat braiding
  • Bows and other accessories
\n\n\n\n
\n

\n
\n\n\n\n

\n", + "excerpt": "", + "slug": "our-services", + "guid": "https://fourpawsdoggrooming.wordpress.com/?p=45", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": false, + "comment_status": "closed", + "pings_open": false, + "ping_status": "closed", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "e41d1c97a7b93a594b07e4df51dfafb3", + "featured_image": "", + "post_thumbnail": null, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "attachments": { + "65": { + "ID": 65, + "URL": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg", + "guid": "http://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg", + "date": "2020-08-27T16:30:36-07:00", + "post_ID": 45, + "author_ID": 191794483, + "file": "image-1.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "image", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=107", + "medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=214", + "large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=731", + "newspack-article-block-landscape-large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image-1.jpg?w=1200" + }, + "height": 1848, + "width": 1320, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495/media/65", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495/media/65/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851495/posts/45" + } + } + }, + "63": { + "ID": 63, + "URL": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg", + "guid": "http://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg", + "date": "2020-08-26T12:20:02-07:00", + "post_ID": 45, + "author_ID": 191794483, + "file": "wp-1598469598971.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "wp-1598469598971.jpg", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=100", + "medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=200", + "large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=682", + "newspack-article-block-landscape-large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/wp-1598469598971.jpg?w=1200" + }, + "height": 2780, + "width": 1851, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495/media/63", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495/media/63/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851495/posts/45" + } + } + }, + "61": { + "ID": 61, + "URL": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg", + "guid": "http://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg", + "date": "2020-08-25T12:05:54-07:00", + "post_ID": 45, + "author_ID": 191794483, + "file": "image.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "image", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=150", + "medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=300", + "large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=1024", + "newspack-article-block-landscape-large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-small": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/image.jpg?w=1200" + }, + "height": 1848, + "width": 1846, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495/media/61", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495/media/61/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851495/posts/45" + } + } + } + }, + "attachment_count": 3, + "metadata": [ + { + "id": "502", + "key": "email_notification", + "value": "1553125754" + }, + { + "id": "564", + "key": "geo_public", + "value": "0" + }, + { + "id": "496", + "key": "jabber_published", + "value": "1553125752" + }, + { + "id": "503", + "key": "timeline_notification", + "value": "1553125801" + }, + { + "id": "563", + "key": "_edit_last", + "value": "67626417" + }, + { + "id": "556", + "key": "_edit_lock", + "value": "1565368108:742098" + }, + { + "id": "501", + "key": "_publicize_job_id", + "value": "28865441316" + }, + { + "id": "500", + "key": "_rest_api_client_id", + "value": "-1" + }, + { + "id": "499", + "key": "_rest_api_published", + "value": "1" + }, + { + "id": "565", + "key": "_thumbnail_id", + "value": "151" + }, + { + "id": "514", + "key": "_wp_old_date", + "value": "2019-03-20" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/213", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/posts/213/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/213/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/213/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "revisions": [ + 402, + 401, + 400, + 309, + 303, + 300, + 299, + 298, + 297, + 296, + 292, + 291, + 289, + 288, + 287, + 286, + 285, + 284, + 283, + 280, + 277, + 273, + 267, + 240, + 214 + ], + "other_URLs": { + "permalink_URL": "http://infocusphotographers.com/2019/07/16/%postname%/", + "suggested_slug": "summer-band-jam" + } + }, + { + "ID": 396, + "site_ID": 106707880, + "author": { + "ID": 742098, + "login": "jkmassel", + "email": "jeremy.massel@gmail.com", + "name": "Jeremy Massel", + "first_name": "Jeremy", + "last_name": "Massel", + "nice_name": "jkmassel", + "URL": "https://jkmassel.wordpress.com", + "avatar_URL": "https://2.gravatar.com/avatar/58fc51586c9a1f9895ac70e3ca60886e?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/jkmassel", + "site_ID": 1562023 + }, + "date": "2019-05-28T21:06:45+00:00", + "modified": "2019-05-28T21:08:03+00:00", + "title": "Now Booking Summer Sessions", + "URL": "http://infocusphotographers.com/?p=396", + "short_URL": "https://wp.me/p7dJAQ-6o", + "content": "
“One must maintain a little bit of summer, even in the middle of winter.”\n\n– Henry David Thoreau
\nBlue skies and warm weather, what's not to love about summer? It's a great season for outdoor family portrait sessions and now is the time to book them!\n\nWe offer a number of family portrait packages and for a limited time are offering 15% off packages booked before April 1.\n\nHow to book\n\nEmail us to set up a time to visit our studio.", + "excerpt": "", + "slug": "", + "guid": "http://infocusphotographers.com/?p=396", + "status": "draft", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": false, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "276e4cea0342ec68e69a0ca537acfce1", + "featured_image": "", + "post_thumbnail": null, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + { + "id": "742", + "key": "sharing_disabled", + "value": [ + + ] + }, + { + "id": "741", + "key": "switch_like_status", + "value": "" + }, + { + "id": "743", + "key": "_edit_lock", + "value": "1565368199:742098" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/396", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/posts/396/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/396/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/396/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "revisions": [ + 399, + 398 + ], + "other_URLs": { + "permalink_URL": "http://infocusphotographers.com/2019/05/28/%postname%/", + "suggested_slug": "now-booking-summer-sessions-2" + } + }, + { + "ID": 387, + "site_ID": 106707880, + "author": { + "ID": 68646169, + "login": "thenomadicwordsmith", + "email": "thenomadicwordsmith@gmail.com", + "name": "thenomadicwordsmith", + "first_name": "Nomadic", + "last_name": "Wordsmith", + "nice_name": "thenomadicwordsmith", + "URL": "http://thenomadicwordsmith.wordpress.com", + "avatar_URL": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/thenomadicwordsmith", + "site_ID": 71769073 + }, + "date": "2019-05-28T21:03:22+00:00", + "modified": "2019-05-28T21:03:22+00:00", + "title": "Time to Book Summer Sessions", + "URL": "http://infocusphotographers.com/?p=387", + "short_URL": "https://wp.me/p7dJAQ-6f", + "content": "Blue skies and warm weather, what's not to love about summer?\n\nIt's a great season for outdoor family portrait sessions and now is the time to book them!\n\nWe offer a number of family portrait packages and for a limited time are offering 15% off packages booked before May 1.\n\n\"beach-clouds-daytime-994605\"\n\nHow to book\nEmail us to set up a time to visit our studio.", + "excerpt": "", + "slug": "", + "guid": "http://infocusphotographers.com/?p=387", + "status": "draft", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "a9037bde04073835b078a1b1bb48b7de", + "featured_image": "", + "post_thumbnail": null, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + { + "id": "731", + "key": "_edit_lock", + "value": "1559077396:742098" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/387", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/posts/387/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/387/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/387/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "revisions": [ + 390 + ], + "other_URLs": { + "permalink_URL": "http://infocusphotographers.com/2019/05/28/%postname%/", + "suggested_slug": "time-to-book-summer-sessions" + } + }, + { + "ID": 265, + "site_ID": 106707880, + "author": { + "ID": 68646169, + "login": "thenomadicwordsmith", + "email": "thenomadicwordsmith@gmail.com", + "name": "thenomadicwordsmith", + "first_name": "Nomadic", + "last_name": "Wordsmith", + "nice_name": "thenomadicwordsmith", + "URL": "http://thenomadicwordsmith.wordpress.com", + "avatar_URL": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/thenomadicwordsmith", + "site_ID": 71769073 + }, + "date": "2019-04-17T10:40:39+00:00", + "modified": "2019-04-17T10:41:03+00:00", + "title": "What we've been doing lately", + "URL": "http://infocusphotographers.com/?p=265", + "short_URL": "https://wp.me/p7dJAQ-4h", + "content": "\r\n

The last few weeks have been a blur! Here are a few shots we really like. What do you think?

\r\n\r\n\r\n\r\n\r\n", + "excerpt": "", + "slug": "", + "guid": "http://infocusphotographers.com/?p=265", + "status": "draft", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "2f7a8f8da665b6469d91f96108fb24c6", + "featured_image": "", + "post_thumbnail": null, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + { + "id": "567", + "key": "geo_public", + "value": "0" + }, + { + "id": "566", + "key": "_edit_last", + "value": "67626417" + }, + { + "id": "555", + "key": "_edit_lock", + "value": "1555497522:67626417" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/265", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/posts/265/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/265/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/265/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "revisions": [ + 294, + 293, + 266 + ], + "other_URLs": { + "permalink_URL": "http://infocusphotographers.com/2019/04/17/%postname%/", + "suggested_slug": "what-weve-been-doing-lately" + } + }, + { + "ID": 134, + "site_ID": 106707880, + "author": { + "ID": 68646169, + "login": "thenomadicwordsmith", + "email": "thenomadicwordsmith@gmail.com", + "name": "thenomadicwordsmith", + "first_name": "Nomadic", + "last_name": "Wordsmith", + "nice_name": "thenomadicwordsmith", + "URL": "http://thenomadicwordsmith.wordpress.com", + "avatar_URL": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/thenomadicwordsmith", + "site_ID": 71769073 + }, + "date": "2019-03-19T03:08:16+00:00", + "modified": "2019-05-27T21:39:08+00:00", + "title": "Now Booking Summer Sessions", + "URL": "http://infocusphotographers.com/?p=134", + "short_URL": "https://wp.me/p7dJAQ-2a", + "content": "
“One must maintain a little bit of summer, even in the middle of winter.” \n\n– Henry David Thoreau
\nBlue skies and warm weather, what's not to love about summer? It's a great season for outdoor family portrait sessions and now is the time to book them!\n\nWe offer a number of family portrait packages and for a limited time are offering 15% off packages booked before April 1.\n

How to book

\nEmail us to set up a time to visit our studio.", + "excerpt": "", + "slug": "now-booking-summer-sessions", + "guid": "http://infocusphotographers.com/?p=134", + "status": "draft", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "e9bb2d5021873cf97e6ced1f9308bdd5", + "featured_image": "", + "post_thumbnail": null, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + { + "id": "560", + "key": "_edit_lock", + "value": "1559078929:742098" + }, + { + "id": "478", + "key": "_wp_desired_post_slug", + "value": "" + }, + { + "id": "481", + "key": "_wp_desired_post_slug", + "value": "__trashed-5" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/134", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/posts/134/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/134/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/134/likes/", + "autosave": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/134/autosave" + }, + "data": { + "autosave": { + "ID": 397, + "author_ID": "742098", + "post_ID": 134, + "title": "Now Booking Summer Sessions", + "content": "
“One must maintain a little bit of summer, even in the middle of winter.” \n\n– Henry David Thoreau
\nBlue skies and warm weather, what's not to love about summer? It's a great season for outdoor family portrait sessions and now is the time to book them!\n\nWe offer a number of family portrait packages and for a limited time are offering 15% off packages booked before April 1.\n

How to book

\nEmail us to set up a time to visit our studio.", + "excerpt": "", + "preview_URL": "http://infocusphotographers.com/?p=134&preview=true&preview_nonce=fcfb9daa0a", + "modified": "2019-05-28T21:05:12+00:00" + } + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "revisions": [ + 397, + 310, + 274, + 236, + 231, + 230, + 220, + 219, + 218, + 136, + 135 + ], + "other_URLs": { + "permalink_URL": "http://infocusphotographers.com/2019/03/19/%postname%/", + "suggested_slug": "now-booking-summer-sessions" + } + }, + { + "ID": 215, + "site_ID": 106707880, + "author": { + "ID": 68646169, + "login": "thenomadicwordsmith", + "email": "thenomadicwordsmith@gmail.com", + "name": "thenomadicwordsmith", + "first_name": "Nomadic", + "last_name": "Wordsmith", + "nice_name": "thenomadicwordsmith", + "URL": "http://thenomadicwordsmith.wordpress.com", + "avatar_URL": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/thenomadicwordsmith", + "site_ID": 71769073 + }, + "date": "2019-02-15T23:27:13+00:00", + "modified": "2019-02-15T23:27:13+00:00", + "title": "Ideas", + "URL": "http://infocusphotographers.com/?p=215", + "short_URL": "https://wp.me/p7dJAQ-3t", + "content": "Returning client special - Offer a discount to clients who have left a review.\n\nPhotography classes at the local", + "excerpt": "", + "slug": "", + "guid": "http://infocusphotographers.com/?p=215", + "status": "draft", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "50d8150dfae26a5bef18779211142b65", + "featured_image": "", + "post_thumbnail": null, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + { + "id": "561", + "key": "_edit_lock", + "value": "1553718391:742098" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/215", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/posts/215/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/215/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/215/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "revisions": [ + 216 + ], + "other_URLs": { + "permalink_URL": "http://infocusphotographers.com/2019/02/15/%postname%/", + "suggested_slug": "ideas" + } + }, + { + "ID": 225, + "site_ID": 106707880, + "author": { + "ID": 68646169, + "login": "thenomadicwordsmith", + "email": "thenomadicwordsmith@gmail.com", + "name": "thenomadicwordsmith", + "first_name": "Nomadic", + "last_name": "Wordsmith", + "nice_name": "thenomadicwordsmith", + "URL": "http://thenomadicwordsmith.wordpress.com", + "avatar_URL": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/thenomadicwordsmith", + "site_ID": 71769073 + }, + "date": "2019-01-01T21:54:15+00:00", + "modified": "2019-03-21T17:20:44+00:00", + "title": "Book Your Summer Sessions", + "URL": "http://infocusphotographers.com/?p=225", + "short_URL": "https://wp.me/p7dJAQ-3D", + "content": "\n

“One must maintain a little bit of summer, even in the middle of winter.

– Henry David Thoreau
\n\n\n\n

Blue skies and warm weather, what's not to love about summer? It's a great season for outdoor family portrait sessions and now is the time to book them!

\n\n\n\n

We offer a number of family portrait packages and for a limited time are offering 15% off packages booked before April 1.

\n\n\n\n
\"beach-children-family-39691\"
\n\n\n\n

How to book

\n\n\n\n

Email us to set up a time to visit our studio.

\n", + "excerpt": "", + "slug": "__trashed-2", + "guid": "http://infocusphotographers.com/?p=225", + "status": "draft", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "2d07f957bcc110149b8aa37bd1231ad1", + "featured_image": "", + "post_thumbnail": null, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "attachments": { + "243": { + "ID": 243, + "URL": "https://infocusphotographers.files.wordpress.com/2019/01/beach-children-family-39691.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/01/beach-children-family-39691.jpg", + "date": "2019-03-20T23:56:52+00:00", + "post_ID": 225, + "author_ID": 14151046, + "file": "beach-children-family-39691.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "beach-children-family-39691", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/01/beach-children-family-39691.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/01/beach-children-family-39691.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/01/beach-children-family-39691.jpg?w=1024" + }, + "height": 2446, + "width": 3669, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/media/243", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/media/243/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/225" + } + } + } + }, + "attachment_count": 1, + "metadata": [ + { + "id": "558", + "key": "_edit_lock", + "value": "1559077412:742098" + }, + { + "id": "468", + "key": "_wp_desired_post_slug", + "value": "" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/225", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/posts/225/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/225/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/225/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "revisions": [ + 271, + 235, + 229, + 228, + 227, + 226 + ], + "other_URLs": { + "permalink_URL": "http://infocusphotographers.com/2019/01/01/%postname%/", + "suggested_slug": "__trashed-2" + } + } + ], + "meta": { + "links": { + "counts": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/post-counts/post" + }, + "wpcom": true + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_new.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_new.json new file mode 100644 index 000000000000..51e820d49ecf --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_new.json @@ -0,0 +1,154 @@ +{ + "scenarioName": "new_post_flow", + "newScenarioState": "post_published", + "request": { + "method": "POST", + "urlPath": "/rest/v1.2/sites/106707880/posts/new", + "queryParameters": { + "context": { + "equalTo": "edit" + }, + "locale": { + "equalTo": "en" + } + }, + "bodyPatterns": [ + { + "matchesJsonPath": "$[?(@.type == 'post')]" + } + ] + }, + "response": { + "status": 200, + "fixedDelayMilliseconds": 1000, + "jsonBody": { + "ID": 5, + "site_ID": 106707880, + "author": { + "ID": 152748359, + "login": "e2eflowtestingmobile", + "email": "e2eflowtestingmobile@example.com", + "name": "e2eflowtestingmobile", + "first_name": "", + "last_name": "", + "nice_name": "e2eflowtestingmobile", + "URL": "https://infocusphotographers.com", + "avatar_URL": "https://1.gravatar.com/avatar/7a4015c11be6a342f65e0e169092d402?s=96&d=identicon&r=G", + "profile_URL": "http://en.gravatar.com/e2eflowtestingmobile", + "site_ID": 1 + }, + "date": "{{#assign 'customformat'}}yyyy-MM-dd'T'HH:mm:ss{{/assign}}{{now format=customformat}}", + "modified": "{{now format=customformat}}", + "title": "Rich post title", + "URL": "https://lowtestingmobile.wordpress.com/2019/03/12/title-33/", + "short_URL": "https://e/paIC9Y-1r", + "content": "\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam congue efficitur leo eget porta.

\n", + "excerpt": "", + "slug": "rich-post-title", + "guid": "https://infocusphotographers.com/2019/03/12/title-33/", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "127876e9017a09034bcf41ee80428027", + "featured_image": "", + "post_thumbnail": null, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 82, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/106707880" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 82, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/106707880" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + { + "id": "909", + "key": "jabber_published", + "value": "1552402855" + } + ], + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/posts/5", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/106707880/posts/5/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/106707880", + "replies": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/posts/5/replies/", + "likes": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/posts/5/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "other_URLs": { + } + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_new_after.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_new_after.json new file mode 100644 index 000000000000..e149f56bc87f --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_new_after.json @@ -0,0 +1,146 @@ +{ + "request": { + "method": "POST", + "urlPattern": "/rest/v1.2/sites/106707880/posts/5?($|\\?.*)", + "queryParameters": { + "context": { + "equalTo": "edit" + } + } + }, + "response": { + "status": 200, + "fixedDelayMilliseconds": 1000, + "jsonBody": { + "ID": 5, + "site_ID": 106707880, + "author": { + "ID": 152748359, + "login": "e2eflowtestingmobile", + "email": "e2eflowtestingmobile@example.com", + "name": "e2eflowtestingmobile", + "first_name": "", + "last_name": "", + "nice_name": "e2eflowtestingmobile", + "URL": "https://infocusphotographers.com", + "avatar_URL": "https://1.gravatar.com/avatar/7a4015c11be6a342f65e0e169092d402?s=96&d=identicon&r=G", + "profile_URL": "http://en.gravatar.com/e2eflowtestingmobile", + "site_ID": 1 + }, + "date": "{{#assign 'customformat'}}yyyy-MM-dd'T'HH:mm:ss{{/assign}}{{now format=customformat}}", + "modified": "{{now format=customformat}}", + "title": "{{jsonPath request.body '$.title'}}", + "URL": "https://lowtestingmobile.wordpress.com/2019/03/12/title-33/", + "short_URL": "https://e/paIC9Y-1r", + "content": "\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam congue efficitur leo eget porta.

\n", + "excerpt": "", + "slug": "title-33", + "guid": "https://infocusphotographers.com/2019/03/12/title-33/", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "127876e9017a09034bcf41ee80428027", + "featured_image": "", + "post_thumbnail": null, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 82, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/106707880" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 82, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/106707880" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + { + "id": "909", + "key": "jabber_published", + "value": "1552402855" + } + ], + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/posts/5", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/106707880/posts/5/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/106707880", + "replies": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/posts/5/replies/", + "likes": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/posts/5/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "other_URLs": { + } + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + }, + "scenarioName": "new-post", + "newScenarioState": "Post Published" + } \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_new_scheduled.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_new_scheduled.json new file mode 100644 index 000000000000..7391a5adf318 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_new_scheduled.json @@ -0,0 +1,146 @@ +{ + "request": { + "method": "POST", + "urlPattern": "/rest/v1.2/sites/181977606/posts/new?($|\\?.*)", + "queryParameters": { + "context": { + "equalTo": "edit" + } + } + }, + "response": { + "status": 200, + "fixedDelayMilliseconds": 1000, + "jsonBody": { + "ID": 15, + "site_ID": 181977606, + "author": { + "ID": 152748359, + "login": "e2eflowtestingmobile", + "email": "e2eflowtestingmobile@example.com", + "name": "e2eflowtestingmobile", + "first_name": "", + "last_name": "", + "nice_name": "e2eflowtestingmobile", + "URL": "https://infocusphotographers.com", + "avatar_URL": "https://1.gravatar.com/avatar/7a4015c11be6a342f65e0e169092d402?s=96&d=identicon&r=G", + "profile_URL": "http://en.gravatar.com/e2eflowtestingmobile", + "site_ID": 1 + }, + "date": "{{#assign 'customformat'}}yyyy-MM-dd'T'HH:mm:ss{{/assign}}{{now offset='+2 hours' format=customformat}}", + "modified": "{{now offset='+2 hours' format=customformat}}", + "title": "{{jsonPath request.body '$.title'}}", + "URL": "https://lowtestingmobile.wordpress.com/2019/03/12/title-33/", + "short_URL": "https://e/paIC9Y-1r", + "content": "\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam congue efficitur leo eget porta.

\n", + "excerpt": "", + "slug": "title-33", + "guid": "https://infocusphotographers.com/2019/03/12/title-33/", + "status": "future", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "127876e9017a09034bcf41ee80428027", + "featured_image": "", + "post_thumbnail": null, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 82, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/categories/slug:uncategorized", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/181977606/categories/slug:uncategorized/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181977606" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 82, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/categories/slug:uncategorized", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/181977606/categories/slug:uncategorized/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181977606" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + { + "id": "909", + "key": "jabber_published", + "value": "1552402855" + } + ], + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/posts/5", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/181977606/posts/5/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181977606", + "replies": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/posts/5/replies/", + "likes": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/posts/5/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "other_URLs": { + } + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + }, + "scenarioName": "new-scheduled-post", + "newScenarioState": "Scheduled Post Published" + } \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_new_scheduled_after.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_new_scheduled_after.json new file mode 100644 index 000000000000..af305e34c97d --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_new_scheduled_after.json @@ -0,0 +1,145 @@ +{ + "request": { + "method": "POST", + "urlPattern": "/rest/v1.2/sites/181977606/posts/15?($|\\?.*)", + "queryParameters": { + "context": { + "equalTo": "edit" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "ID": 15, + "site_ID": 181977606, + "author": { + "ID": 152748359, + "login": "e2eflowtestingmobile", + "email": "e2eflowtestingmobile@example.com", + "name": "e2eflowtestingmobile", + "first_name": "", + "last_name": "", + "nice_name": "e2eflowtestingmobile", + "URL": "https://infocusphotographers.com", + "avatar_URL": "https://1.gravatar.com/avatar/7a4015c11be6a342f65e0e169092d402?s=96&d=identicon&r=G", + "profile_URL": "http://en.gravatar.com/e2eflowtestingmobile", + "site_ID": 1 + }, + "date": "{{#assign 'customformat'}}yyyy-MM-dd'T'HH:mm:ss{{/assign}}{{now offset='+2 hours' format=customformat}}", + "modified": "{{now offset='+2 hours' format=customformat}}", + "title": "{{jsonPath request.body '$.title'}}", + "URL": "https://lowtestingmobile.wordpress.com/2019/03/12/title-33/", + "short_URL": "https://e/paIC9Y-1r", + "content": "\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam congue efficitur leo eget porta.

\n", + "excerpt": "", + "slug": "title-33", + "guid": "https://infocusphotographers.com/2019/03/12/title-33/", + "status": "future", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "127876e9017a09034bcf41ee80428027", + "featured_image": "", + "post_thumbnail": null, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 82, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/categories/slug:uncategorized", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/181977606/categories/slug:uncategorized/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181977606" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 82, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/categories/slug:uncategorized", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/181977606/categories/slug:uncategorized/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181977606" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + { + "id": "909", + "key": "jabber_published", + "value": "1552402855" + } + ], + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/posts/5", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/181977606/posts/5/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181977606", + "replies": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/posts/5/replies/", + "likes": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/posts/5/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "other_URLs": { + } + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + }, + "scenarioName": "new-scheduled-post", + "requiredScenarioState": "Scheduled Post Published" + } \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_private,publish.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_private,publish.json new file mode 100644 index 000000000000..ff66c984cd4f --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_private,publish.json @@ -0,0 +1,805 @@ +{ + "scenarioName": "new_post_flow", + "requiredScenarioState": "post_published", + "newScenarioState": "new_posts_list", + "request": { + "method": "GET", + "urlPath": "/rest/v1.2/sites/106707880/posts", + "queryParameters": { + "locale": { + "matches": "(.*)" + }, + "context": { + "equalTo": "edit" + }, + "meta": { + "equalTo": "autosave" + }, + "number": { + "matches": "(.*)" + }, + "status": { + "equalTo": "private,publish" + }, + "type": { + "equalTo": "post" + } + } + }, + "response": { + "status": 200, + "fixedDelayMilliseconds": 1000, + "jsonBody": { + "found": 4, + "posts": [ + { + "ID": 5, + "site_ID": 106707880, + "author": { + "ID": 152748359, + "login": "e2eflowtestingmobile", + "email": "e2eflowtestingmobile@example.com", + "name": "e2eflowtestingmobile", + "first_name": "", + "last_name": "", + "nice_name": "e2eflowtestingmobile", + "URL": "https://infocusphotographers.com", + "avatar_URL": "https://1.gravatar.com/avatar/7a4015c11be6a342f65e0e169092d402?s=96&d=identicon&r=G", + "profile_URL": "http://en.gravatar.com/e2eflowtestingmobile", + "site_ID": 1 + }, + "date": "{{#assign 'customformat'}}yyyy-MM-dd'T'HH:mm:ss{{/assign}}{{now format=customformat}}", + "modified": "{{now format=customformat}}", + "title": "Rich post title", + "URL": "https://lowtestingmobile.wordpress.com/2019/03/12/title-33/", + "short_URL": "https://e/paIC9Y-1r", + "content": "\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam congue efficitur leo eget porta.

\n", + "excerpt": "", + "slug": "rich-post-title", + "guid": "https://infocusphotographers.com/2019/03/12/title-33/", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "127876e9017a09034bcf41ee80428027", + "featured_image": "", + "post_thumbnail": null, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 82, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/106707880" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 82, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/106707880" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + { + "id": "909", + "key": "jabber_published", + "value": "1552402855" + } + ], + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/posts/5", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/106707880/posts/5/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/106707880", + "replies": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/posts/5/replies/", + "likes": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/posts/5/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "other_URLs": { + } + }, + { + "ID": 237, + "site_ID": 106707880, + "author": { + "ID": 68646169, + "login": "thenomadicwordsmith", + "email": "thenomadicwordsmith@gmail.com", + "name": "thenomadicwordsmith", + "first_name": "Nomadic", + "last_name": "Wordsmith", + "nice_name": "thenomadicwordsmith", + "URL": "http://thenomadicwordsmith.wordpress.com", + "avatar_URL": "https://0.gravatar.com/avatar/9ba48385fc40dfd9a55a3348d8e7f4d9?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/thenomadicwordsmith", + "site_ID": 71769073 + }, + "date": "2019-03-13T23:48:58+00:00", + "modified": "2019-03-21T17:19:25+00:00", + "title": "Photo Contest", + "URL": "http://infocusphotographers.com/2019/03/13/some-news-to-share-2/", + "short_URL": "https://wp.me/p7dJAQ-3P", + "content": "\n

In Focus Photography was nominated for an international photo award!

\n\n\n\n

Please vote for us!

\n", + "excerpt": "", + "slug": "some-news-to-share-2", + "guid": "http://infocusphotographers.com/?p=237", + "status": "private", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "9dc6f7941b6a68fc2323b652c4e9516b", + "featured_image": "https://infocusphotographers.files.wordpress.com/2019/03/art-bright-celebration-1313817.jpg", + "post_thumbnail": { + "ID": 238, + "URL": "https://infocusphotographers.files.wordpress.com/2019/03/art-bright-celebration-1313817.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/03/art-bright-celebration-1313817.jpg", + "mime_type": "image/jpeg", + "width": 4256, + "height": 2628 + }, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "attachments": { + "238": { + "ID": 238, + "URL": "https://infocusphotographers.files.wordpress.com/2019/03/art-bright-celebration-1313817.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2019/03/art-bright-celebration-1313817.jpg", + "date": "2019-03-20T23:44:49+00:00", + "post_ID": 237, + "author_ID": 14151046, + "file": "art-bright-celebration-1313817.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "art-bright-celebration-1313817", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://infocusphotographers.files.wordpress.com/2019/03/art-bright-celebration-1313817.jpg?w=150", + "medium": "https://infocusphotographers.files.wordpress.com/2019/03/art-bright-celebration-1313817.jpg?w=300", + "large": "https://infocusphotographers.files.wordpress.com/2019/03/art-bright-celebration-1313817.jpg?w=1024" + }, + "height": 2628, + "width": 4256, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/media/238", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/media/238/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/237" + } + } + } + }, + "attachment_count": 1, + "metadata": [ + { + "id": "493", + "key": "email_notification", + "value": "1553125740" + }, + { + "id": "486", + "key": "jabber_published", + "value": "1553125739" + }, + { + "id": "491", + "key": "timeline_notification", + "value": "1553125810" + }, + { + "id": "557", + "key": "_edit_lock", + "value": "1553188814:68646169" + }, + { + "id": "492", + "key": "_publicize_job_id", + "value": "28865445244" + }, + { + "id": "490", + "key": "_rest_api_client_id", + "value": "-1" + }, + { + "id": "489", + "key": "_rest_api_published", + "value": "1" + }, + { + "id": "484", + "key": "_thumbnail_id", + "value": "238" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/237", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/posts/237/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/237/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/237/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "revisions": [ + 269, + 263, + 239 + ], + "other_URLs": { + "permalink_URL": "http://infocusphotographers.com/2019/03/13/%postname%/", + "suggested_slug": "some-news-to-share-2" + } + }, + { + "ID": 106, + "site_ID": 106707880, + "author": { + "ID": 100907762, + "login": "leahelainerand", + "email": "andreazoellner+leahrand@gmail.com", + "name": "Leah Elaine Rand", + "first_name": "Leah", + "last_name": "Rand", + "nice_name": "leahelainerand", + "URL": "", + "avatar_URL": "https://0.gravatar.com/avatar/62937c26a2a79bae5921ca9e85be8040?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/leahelainerand", + "site_ID": 106523982 + }, + "date": "2016-04-19T21:28:27+00:00", + "modified": "2018-03-23T00:20:36+00:00", + "title": "Some News to Share", + "URL": "http://infocusphotographers.com/2016/04/19/some-news-to-share/", + "short_URL": "https://wp.me/p7dJAQ-1I", + "content": "John was shortlisted for the World Press Photo competition, an international celebration of the best photojournalism of the year.\n\nhttps://twitter.com/wordpressdotcom/status/702181837079187456", + "excerpt": "", + "slug": "some-news-to-share", + "guid": "https://infocusphotographers.wordpress.com/?p=106", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "3a10a002b4f389596205c24992732a3e", + "featured_image": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1449761485030-c9bf16154670.jpg", + "post_thumbnail": { + "ID": 62, + "URL": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1449761485030-c9bf16154670.jpg", + "guid": "http://infocusphotographers.files.wordpress.com/2016/02/photo-1449761485030-c9bf16154670.jpg", + "mime_type": "image/jpeg", + "width": 1080, + "height": 720 + }, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + { + "id": "254", + "key": "jabber_published", + "value": "1461101308" + }, + { + "id": "267", + "key": "_oembed_00ce3f36d70c72c174774d1222895a08", + "value": "

Congrats to the photojournalists on WordPress who won #WPPh16 @WorldPressPhoto prizes: https://t.co/9ya2boX1Yy pic.twitter.com/ZFAHNngh1f

— WordPress.com (@wordpressdotcom) February 23, 2016
" + }, + { + "id": "294", + "key": "_oembed_33aac0b04f7a7bc31eec252936d4ae4a", + "value": "

Congrats to the photojournalists on WordPress who won #WPPh16 @WorldPressPhoto prizes: https://t.co/9ya2boX1Yy pic.twitter.com/ZFAHNngh1f

— WordPress.com (@wordpressdotcom) February 23, 2016
" + }, + { + "id": "257", + "key": "_oembed_4e3318c4371cf9880f6705450efd7fe6", + "value": "

Congrats to the photojournalists on WordPress who won #WPPh16 @WorldPressPhoto prizes: https://t.co/9ya2boX1Yy pic.twitter.com/ZFAHNngh1f

— WordPress.com (@wordpressdotcom) February 23, 2016
" + }, + { + "id": "251", + "key": "_oembed_8655c52bd5f940727d92329c248de249", + "value": "

Congrats to the photojournalists on WordPress who won #WPPh16 @WorldPressPhoto prizes: https://t.co/9ya2boX1Yy pic.twitter.com/ZFAHNngh1f

— WordPress.com (@wordpressdotcom) February 23, 2016
" + }, + { + "id": "262", + "key": "_oembed_eb2de30a8aa65d93ca387e4a12fd9f06", + "value": "

Congrats to the photojournalists on WordPress who won #WPPh16 @WorldPressPhoto prizes: https://t.co/9ya2boX1Yy pic.twitter.com/ZFAHNngh1f

— WordPress.com (@wordpressdotcom) February 23, 2016
" + }, + { + "id": "268", + "key": "_oembed_time_00ce3f36d70c72c174774d1222895a08", + "value": "1461200444" + }, + { + "id": "295", + "key": "_oembed_time_33aac0b04f7a7bc31eec252936d4ae4a", + "value": "1521764439" + }, + { + "id": "258", + "key": "_oembed_time_4e3318c4371cf9880f6705450efd7fe6", + "value": "1461101310" + }, + { + "id": "252", + "key": "_oembed_time_8655c52bd5f940727d92329c248de249", + "value": "1461101270" + }, + { + "id": "263", + "key": "_oembed_time_eb2de30a8aa65d93ca387e4a12fd9f06", + "value": "1461101311" + }, + { + "id": "261", + "key": "_publicize_job_id", + "value": "21955598041" + }, + { + "id": "260", + "key": "_rest_api_client_id", + "value": "-1" + }, + { + "id": "259", + "key": "_rest_api_published", + "value": "1" + }, + { + "id": "266", + "key": "_thumbnail_id", + "value": "62" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/106", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/posts/106/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/106/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/106/likes/", + "autosave": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/106/autosave" + }, + "data": { + "autosave": { + "ID": 262, + "author_ID": "14151046", + "post_ID": 106, + "title": "Photo Contest", + "content": "John was shortlisted for the World Press Photo competition, an international celebration of the best photojournalism of the year.\n\nhttps://twitter.com/wordpressdotcom/status/702181837079187456", + "excerpt": "", + "preview_URL": "http://infocusphotographers.com/2016/04/19/some-news-to-share/?preview=true&preview_nonce=ef0913f6c4", + "modified": "2019-03-21T00:23:25+00:00" + } + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "revisions": [ + 262, + 109, + 108, + 107 + ], + "other_URLs": { + } + }, + { + "ID": 90, + "site_ID": 106707880, + "author": { + "ID": 100907762, + "login": "leahelainerand", + "email": "andreazoellner+leahrand@gmail.com", + "name": "Leah Elaine Rand", + "first_name": "Leah", + "last_name": "Rand", + "nice_name": "leahelainerand", + "URL": "", + "avatar_URL": "https://0.gravatar.com/avatar/62937c26a2a79bae5921ca9e85be8040?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/leahelainerand", + "site_ID": 106523982 + }, + "date": "2016-03-07T18:32:11+00:00", + "modified": "2016-03-16T02:01:50+00:00", + "title": "Martin and Amy's Wedding", + "URL": "http://infocusphotographers.com/2016/03/07/martin-and-amys-wedding/", + "short_URL": "https://wp.me/p7dJAQ-1s", + "content": "Martin and Amy are a wonderful couple that John and I were lucky to photograph. The theme for their wedding was sophisticated but warm and everything had a clearly personal touch.\n\nThey decided they wanted the bulk of their wedding photos to be black and white. While some couples like personal, goofy photos, Amy and Martin found a perfect balance between classic elegance and shots with personality.\n\n \n\nhttps://www.instagram.com/p/BCF4Z6UjRjE/?taken-by=photomatt\n\n \n\nhttps://www.instagram.com/p/8qwIAWDRum/?taken-by=photomatt\n\n ", + "excerpt": "", + "slug": "martin-and-amys-wedding", + "guid": "https://infocusphotographers.wordpress.com/?p=90", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "8ffbda2c616a90c6b92efe4fb016fe95", + "featured_image": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1453857271477-4f9a4081966e1.jpeg", + "post_thumbnail": { + "ID": 82, + "URL": "https://infocusphotographers.files.wordpress.com/2016/02/photo-1453857271477-4f9a4081966e1.jpeg", + "guid": "http://infocusphotographers.files.wordpress.com/2016/02/photo-1453857271477-4f9a4081966e1.jpeg", + "mime_type": "image/jpeg", + "width": 3853, + "height": 2384 + }, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Wedding": { + "ID": 1674, + "name": "Wedding", + "slug": "wedding", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:wedding", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:wedding/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Wedding": { + "ID": 1674, + "name": "Wedding", + "slug": "wedding", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:wedding", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:wedding/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + { + "id": "201", + "key": "jabber_published", + "value": "1457375532" + }, + { + "id": "562", + "key": "_edit_lock", + "value": "1555492632:67626417" + }, + { + "id": "248", + "key": "_oembed_4e3318c4371cf9880f6705450efd7fe6", + "value": "

Congrats to the photojournalists on WordPress who won #WPPh16 @WorldPressPhoto prizes: https://t.co/9ya2boX1Yy pic.twitter.com/ZFAHNngh1f

— WordPress.com (@wordpressdotcom) February 23, 2016
" + }, + { + "id": "249", + "key": "_oembed_time_4e3318c4371cf9880f6705450efd7fe6", + "value": "1461101264" + }, + { + "id": "233", + "key": "_publicize_done_13969716", + "value": "1" + }, + { + "id": "232", + "key": "_publicize_done_external", + "value": { + "facebook": { + "13895248": "https://facebook.com/10208752052869141" + } + } + }, + { + "id": "206", + "key": "_publicize_job_id", + "value": "20665553278" + }, + { + "id": "205", + "key": "_rest_api_client_id", + "value": "-1" + }, + { + "id": "204", + "key": "_rest_api_published", + "value": "1" + }, + { + "id": "198", + "key": "_thumbnail_id", + "value": "82" + }, + { + "id": "234", + "key": "_wpas_done_13895248", + "value": "1" + }, + { + "id": "231", + "key": "_wpas_mess", + "value": "An amazing weekend, a wonderful couple, and beautiful photos to match! Check it out!" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/90", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/posts/90/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/90/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/90/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "revisions": [ + 102, + 101, + 100, + 93, + 92, + 91 + ], + "other_URLs": { + } + } + ], + "meta": { + "links": { + "counts": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/post-counts/post" + }, + "wpcom": true + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_type_page.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_type_page.json new file mode 100644 index 000000000000..84fe147505ef --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/posts_type_page.json @@ -0,0 +1,38 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.2/sites/.*/posts.*", + "queryParameters": { + "locale": { + "matches": "(.*)" + }, + "context": { + "equalTo": "edit" + }, + "meta": { + "equalTo": "autosave" + }, + "number": { + "matches": "(.*)" + }, + "status": { + "equalTo": "draft,pending,publish,private,future" + }, + "type": { + "equalTo": "page" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "found": 0, + "posts": [], + "meta": { + "links": { + "counts": "https://public-api.wordpress.com/rest/v1.2/sites/1/post-counts/page" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/rest_sites_106707880_posts_439_likes.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/rest_sites_106707880_posts_439_likes.json new file mode 100644 index 000000000000..e3c988485939 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/rest_sites_106707880_posts_439_likes.json @@ -0,0 +1,14 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.2/sites/106707880/posts/439/likes" + }, + "response": { + "status": 200, + "jsonBody": { + "found": 0, + "i_like": false, + "likes": [] + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/rest_sites_106707880_posts_439_related.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/rest_sites_106707880_posts_439_related.json new file mode 100644 index 000000000000..933caf371ad2 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/rest_sites_106707880_posts_439_related.json @@ -0,0 +1,42 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.2/read/site/106707880/post/439/related" + }, + "response": { + "status": 200, + "jsonBody": { + "algorithm_local": "read:related:posts:local/7", + "algorithm_global": "read:related:posts:global/1", + "posts": [ + { + "ID": 974, + "site_ID": 80511, + "author": { + "ID": 29043, + "login": "test", + "email": false, + "name": "Test User", + "first_name": "Test", + "last_name": "User", + "site_ID": 80511 + }, + "date": "2024-03-07T23:00:40+00:00", + "modified": "2024-03-07T23:00:40+00:00", + "title": "title-a", + "URL": "https://example.wordpress.com/2024/03/07/hello-974", + "content": "content-a", + "excerpt": "content-a", + "slug": "hello-974", + "status": "draft", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "featured_image": "", + "format": "standard" + } + ] + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/rest_sites_106707880_posts_439_replies.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/rest_sites_106707880_posts_439_replies.json new file mode 100644 index 000000000000..e9f061b9e93e --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/rest_sites_106707880_posts_439_replies.json @@ -0,0 +1,13 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/106707880/posts/439/replies" + }, + "response": { + "status": 200, + "jsonBody": { + "found": 0, + "site_ID": 106707880 + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/rest_sites_106707880_posts_439_replies_new.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/rest_sites_106707880_posts_439_replies_new.json new file mode 100644 index 000000000000..bc044558ba95 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/rest_sites_106707880_posts_439_replies_new.json @@ -0,0 +1,54 @@ +{ + "request": { + "method": "POST", + "urlPath": "/rest/v1.1/sites/106707880/posts/439/replies/new" + }, + "response": { + "status": 200, + "jsonBody": { + "ID": 1, + "post": { + "ID": 439, + "title": "Social", + "type": "post", + "link": "https://public-api.wordpress.com/rest/v1.1/sites/106707880/posts/439" + }, + "author": { + "ID": 152748359, + "login": "e2eflowtestingmobile", + "email": false, + "name": "e2eflowtestingmobile", + "first_name": "", + "last_name": "", + "nice_name": "e2eflowtestingmobile", + "URL": "http://e2eflowtestingmobile.wordpress.com", + "avatar_URL": "https://1.gravatar.com/avatar/7a4015c11be6a342f65e0e169092d402?s=96&d=identicon&r=G", + "profile_URL": "http://en.gravatar.com/e2eflowtestingmobile", + "site_ID": 106707880, + "has_avatar": false + }, + "date": "2019-05-23T12:46:55+00:00", + "URL": "https://e2eflowtestingmobile.wordpress.com/2019/05/23/sit-elit-adipiscing-elit-dolor-lorem/", + "short_URL": "https://wp.me/paIC9Y-75", + "content": "\n

{{jsonPath request.body '$.content'}}

\n", + "raw_content": "{{jsonPath request.body '$.content'}}", + "status": "approved", + "parent": false, + "type": "comment", + "like_count": 0, + "i_like": false, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/comments/1", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/comments/1/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880", + "post": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/439", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/comments/1/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/comments/1/likes/" + } + }, + "can_moderate": true, + "i_replied": false + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/rest_sites_181851495_posts-draft,pending.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/rest_sites_181851495_posts-draft,pending.json new file mode 100644 index 000000000000..6d342ae93832 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/rest_sites_181851495_posts-draft,pending.json @@ -0,0 +1,163 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.2/sites/181851495/posts", + "queryParameters": { + "locale": { + "matches": "(.*)" + }, + "context": { + "equalTo": "edit" + }, + "meta": { + "equalTo": "autosave" + }, + "number": { + "equalTo": "40" + }, + "status": { + "equalTo": "draft,pending" + }, + "type": { + "equalTo": "post" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "found": 1, + "posts": [ + { + "ID": 67, + "site_ID": 181851495, + "author": { + "ID": 152748359, + "login": "appstorescreens", + "email": "main.ee0zglcj@mailosaur.io", + "name": "appstorescreens", + "first_name": "", + "last_name": "", + "nice_name": "appstorescreens", + "URL": "http://tricountyrealestate.wordpress.com", + "avatar_URL": "https://0.gravatar.com/avatar/35029b2103460109f574c38dfeea5f3f?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/appstorescreens", + "site_ID": 181851541 + }, + "date": "2020-10-05T05:10:17-07:00", + "modified": "2020-10-05T05:12:29-07:00", + "title": "Our Services", + "URL": "https://fourpawsdoggrooming.wordpress.com/our-services/", + "short_URL": "https://wp.me/pcj1SD-15", + "content": "\n
\n

Mobile grooming salon for cats and dogs.

\n\n\n\n\n
\n\n\n\n

Dog grooming

\n\n\n\n
\n
\n

Our deluxe grooming service includes:

\n\n\n\n
  • Nail clip
  • Ear cleaning
  • 1st shampoo
  • 2nd shampoo
  • Conditioning rinse
  • Towel dry
  • Blow dry
  • Brush out
  • And a treat!
\n
\n\n\n\n
\n
\"\"
\n
\n
\n\n\n\n

Deluxe Cut and Groom

\n\n\n\n

Our deluxe cut and groom package includes everything in the deluxe groom plus a haircut.

\n\n\n\n

Add on services

\n\n\n\n

Pamper your pup even more with one of our signature add on services:

\n\n\n\n
  • Aloe conditioning treatment
  • Soothing medicated shampoos
  • Tooth brushing
  • Creative styling with temporary color
  • Nail polish application
  • Coat braiding
  • Bows and other accessories
\n\n\n\n
\n

\n
\n\n\n\n

\n", + "excerpt": "", + "slug": "our-services", + "guid": "https://fourpawsdoggrooming.wordpress.com/?p=67", + "status": "draft", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "8baa5f9a6478573f6869e88704679280", + "featured_image": "", + "post_thumbnail": null, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 3, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851495/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 3, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851495/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": false, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851495/posts/67", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495/posts/67/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851495/posts/67/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851495/posts/67/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "revisions": [ + 68 + ], + "other_URLs": { + "permalink_URL": "https://fourpawsdoggrooming.wordpress.com/2020/10/05/%postname%/", + "suggested_slug": "our-services" + } + } + ], + "meta": { + "links": { + "counts": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181851495/post-counts/post" + }, + "wpcom": true + } + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/rest_sites_181977606_posts-draft,pending.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/rest_sites_181977606_posts-draft,pending.json new file mode 100644 index 000000000000..0c24f982cbfc --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/rest_sites_181977606_posts-draft,pending.json @@ -0,0 +1,315 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.2/sites/181977606/posts", + "queryParameters": { + "locale": { + "matches": "(.*)" + }, + "context": { + "equalTo": "edit" + }, + "meta": { + "equalTo": "autosave" + }, + "number": { + "matches": "3|40" + }, + "status": { + "equalTo": "draft,pending" + }, + "type": { + "equalTo": "post" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "found": 2, + "posts": [ + { + "ID": 14, + "site_ID": 181977606, + "author": { + "ID": 152748359, + "login": "appstorescreens", + "email": "test@example.com", + "name": "appstorescreens", + "first_name": "", + "last_name": "", + "nice_name": "appstorescreens", + "URL": "http://tricountyrealestate.wordpress.com", + "avatar_URL": "https://0.gravatar.com/avatar/35029b2103460109f574c38dfeea5f3f?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/appstorescreens", + "site_ID": 181977606 + }, + "date": "2020-10-05T15:03:30+00:00", + "modified": "2020-10-05T15:04:51+00:00", + "title": "Easy Blueberry Muffins", + "URL": "https://weekendbakesblog.wordpress.com/easy-blueberry-muffins/", + "short_URL": "https://wp.me/pcjyGG-e", + "content": "\n\n\n\n\n

Ingredients

\n\n\n\n
  • 1 cup fresh or frozen blueberries
  • 1 3/4 cup flour
  • 2 tsp baking powder
  • 3/4 cups sugar
  • 1/4 cup canola oil
  • 1 egg
\n", + "excerpt": "", + "slug": "easy-blueberry-muffins", + "guid": "https://weekendbakesblog.wordpress.com/?p=14", + "status": "draft", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "33b4a6f0603d5c065b2e54737b34899c", + "featured_image": "", + "post_thumbnail": null, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 3, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181977606/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181977606/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181977606" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 3, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181977606/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181977606/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181977606" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + { + "id": "142", + "key": "jabber_published", + "value": "1601910212" + }, + { + "id": "148", + "key": "timeline_notification", + "value": "1601910213" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181977606/posts/14", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181977606/posts/14/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181977606", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181977606/posts/14/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181977606/posts/14/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "revisions": [ + 15 + ], + "other_URLs": { + "permalink_URL": "https://weekendbakesblog.wordpress.com/2020/10/05/%postname%/", + "suggested_slug": "easy-blueberry-muffins" + } + }, + { + "ID": 24, + "site_ID": 181977606, + "author": { + "ID": 152748359, + "login": "appstorescreens", + "email": "test@example.com", + "name": "appstorescreens", + "first_name": "", + "last_name": "", + "nice_name": "appstorescreens", + "URL": "http://tricountyrealestate.wordpress.com", + "avatar_URL": "https://0.gravatar.com/avatar/35029b2103460109f574c38dfeea5f3f?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/appstorescreens", + "site_ID": 181977606 + }, + "date": "2021-10-05T15:03:30+00:00", + "modified": "2021-10-05T15:04:51+00:00", + "title": "Easy Strawberry Cake", + "URL": "https://weekendbakesblog.wordpress.com/easy-strawberry-cake/", + "short_URL": "https://wp.me/pcjyGG-e", + "content": "\n

Ingredients List

\n\n\n\n
  • 1 cup fresh or frozen blueberries
  • 1 3/4 cup flour
  • 2 tsp baking powder
  • 3/4 cups sugar
  • 1/4 cup canola oil
  • 1 egg
\n", + "excerpt": "", + "slug": "easy-blueberry-muffins", + "guid": "https://weekendbakesblog.wordpress.com/?p=14", + "status": "draft", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "33b4a6f0603d5c065b2e54737b34899c", + "featured_image": "", + "post_thumbnail": { + "ID": 238, + "URL": "https://mobiledotblog.files.wordpress.com/2022/08/4551182892_9b33f3bdfb_b.jpg", + "guid": "https://mobiledotblog.files.wordpress.com/2022/08/4551182892_9b33f3bdfb_b.jpg", + "mime_type": "image/jpeg", + "width": 4256, + "height": 2628 + }, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 3, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181977606/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181977606/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181977606" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 3, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181977606/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181977606/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181977606" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + { + "id": "142", + "key": "jabber_published", + "value": "1601910212" + }, + { + "id": "148", + "key": "timeline_notification", + "value": "1601910213" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181977606/posts/14", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181977606/posts/14/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181977606", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181977606/posts/14/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181977606/posts/14/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "revisions": [ + 15 + ], + "other_URLs": { + "permalink_URL": "https://weekendbakesblog.wordpress.com/2020/10/05/%postname%/", + "suggested_slug": "easy-blueberry-muffins" + } + } + ], + "meta": { + "links": { + "counts": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181977606/post-counts/post" + }, + "wpcom": true + } + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/rest_sites_181977606_posts-scheduled.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/rest_sites_181977606_posts-scheduled.json new file mode 100644 index 000000000000..b4054b30aeef --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/posts/rest_sites_181977606_posts-scheduled.json @@ -0,0 +1,181 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/rest/v1.2/sites/181977606/posts", + "queryParameters": { + "locale": { + "matches": "(.*)" + }, + "context": { + "equalTo": "edit" + }, + "meta": { + "equalTo": "autosave" + }, + "number": { + "matches": "3|40" + }, + "status": { + "equalTo": "future" + }, + "type": { + "equalTo": "post" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "found": 1, + "posts": [ + { + "ID": 15, + "site_ID": 181977606, + "author": { + "ID": 152748359, + "login": "appstorescreens", + "email": "test@example.com", + "name": "appstorescreens", + "first_name": "", + "last_name": "", + "nice_name": "appstorescreens", + "URL": "http://tricountyrealestate.wordpress.com", + "avatar_URL": "https://0.gravatar.com/avatar/35029b2103460109f574c38dfeea5f3f?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/appstorescreens", + "site_ID": 181977606 + }, + "date": "{{#assign 'customformat'}}yyyy-MM-dd'T'HH:mm:ss{{/assign}}{{now offset='+2 hours' format=customformat}}", + "modified": "{{now offset='+2 hours' format=customformat}}", + "title": "Lemon Cheesecake Tartlets", + "URL": "https://weekendbakesblog.wordpress.com/easy-blueberry-muffins/", + "short_URL": "https://wp.me/pcjyGG-e", + "content": "\n

Ingredients

\n\n\n\n
  • 1 cup fresh or frozen blueberries
  • 1 3/4 cup flour
  • 2 tsp baking powder
  • 3/4 cups sugar
  • 1/4 cup canola oil
  • 1 egg
\n", + "excerpt": "", + "slug": "easy-blueberry-muffins", + "guid": "https://weekendbakesblog.wordpress.com/?p=14", + "status": "future", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "33b4a6f0603d5c065b2e54737b34899d", + "featured_image": "", + "post_thumbnail": { + "ID": 238, + "URL": "https://mobiledotblog.files.wordpress.com/2022/08/4957581385_d7b5c6a8ac_b.jpg", + "guid": "https://mobiledotblog.files.wordpress.com/2022/08/4957581385_d7b5c6a8ac_b.jpg", + "mime_type": "image/jpeg", + "width": 4256, + "height": 2628 + }, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 3, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181977606/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181977606/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181977606" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + }, + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 3, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181977606/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181977606/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181977606" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + { + "id": "142", + "key": "jabber_published", + "value": "1601910212" + }, + { + "id": "148", + "key": "timeline_notification", + "value": "1601910213" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181977606/posts/14", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181977606/posts/14/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181977606", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181977606/posts/14/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181977606/posts/14/likes/" + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "revisions": [ + 15 + ], + "other_URLs": { + "permalink_URL": "https://weekendbakesblog.wordpress.com/2020/10/05/%postname%/", + "suggested_slug": "easy-blueberry-muffins" + } + } + ], + "meta": { + "links": { + "counts": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/181977606/post-counts/post" + }, + "wpcom": true + } + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/products/rest_v11_products.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/products/rest_v11_products.json new file mode 100644 index 000000000000..03c513779c40 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/products/rest_v11_products.json @@ -0,0 +1,122 @@ +{ + "request": { + "urlPath": "/rest/v1.1/products", + "method": "GET" + }, + "response": { + "status": 200, + "jsonBody": { + "domain_reg": { + "product_id": 6, + "product_name": "Domen\u0173 registracija", + "product_slug": "domain_reg", + "description": "Register a domain for use with your blog.", + "product_type": "domain_reg", + "available": true, + "billing_product_slug": "wp-domain-registration", + "is_domain_registration": true, + "cost_display": "6,00\u00a0\u20ac", + "combined_cost_display": "19,00\u00a0\u20ac", + "cost": 6, + "cost_smallest_unit": 600, + "currency_code": "EUR", + "price_tier_list": [], + "price_tier_usage_quantity": null, + "product_term": "year", + "product_term_localized": "metai", + "price_tiers": [], + "price_tier_slug": "", + "tld": "com", + "is_privacy_protection_product_purchase_allowed": true + }, + "dotink_domain": { + "product_id": 359, + "product_name": ".ink Domain Registration", + "product_slug": "dotink_domain", + "description": "", + "product_type": "domain_reg", + "available": true, + "billing_product_slug": "wp-dot-ink-registration", + "is_domain_registration": true, + "cost_display": "13,00\u00a0\u20ac", + "combined_cost_display": "26,00\u00a0\u20ac", + "cost": 13, + "cost_smallest_unit": 1300, + "currency_code": "EUR", + "price_tier_list": [], + "price_tier_usage_quantity": null, + "product_term": "year", + "product_term_localized": "metai", + "price_tiers": [], + "price_tier_slug": "", + "tld": "ink", + "is_privacy_protection_product_purchase_allowed": true + }, + "dotblog_domain": { + "product_id": 76, + "product_name": ".blog Domain Registration", + "product_slug": "dotblog_domain", + "description": "", + "product_type": "domain_reg", + "available": true, + "billing_product_slug": "wp-dot-blog-registration", + "is_domain_registration": true, + "cost_display": "9,00\u00a0\u20ac", + "combined_cost_display": "22,00\u00a0\u20ac", + "cost": 9, + "cost_smallest_unit": 900, + "currency_code": "EUR", + "price_tier_list": [], + "price_tier_usage_quantity": null, + "product_term": "year", + "product_term_localized": "metai", + "price_tiers": [], + "price_tier_slug": "", + "tld": "blog", + "is_privacy_protection_product_purchase_allowed": true, + "sale_cost": 4.84, + "combined_sale_cost_display": "4,84\u00a0\u20ac", + "sale_coupon": { + "start_date": "2023-01-09 00:00:00", + "expires": "2023-12-31 00:00:00", + "discount": 78, + "purchase_types": [3], + "product_ids": [76], + "allowed_for_domain_transfers": false, + "allowed_for_renewals": false, + "allowed_for_new_purchases": true, + "code": "bca96bd24f305980", + "tld_rank": null + } + }, + "dotmaison_domain": { + "product_id": 200, + "product_name": ".maison Domain Registration", + "product_slug": "dotmaison_domain", + "description": "", + "product_type": "domain_reg", + "available": true, + "billing_product_slug": "wp-dot-maison-registration", + "is_domain_registration": true, + "cost_display": "36,00\u00a0\u20ac", + "combined_cost_display": "49,00\u00a0\u20ac", + "cost": 36, + "cost_smallest_unit": 3600, + "currency_code": "EUR", + "price_tier_list": [], + "price_tier_usage_quantity": null, + "product_term": "year", + "product_term_localized": "metai", + "price_tiers": [], + "price_tier_slug": "", + "tld": "maison", + "is_privacy_protection_product_purchase_allowed": true + } + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } + } \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/read_feed_28523_posts.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/read_feed_28523_posts.json new file mode 100644 index 000000000000..7ee8701e057d --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/read_feed_28523_posts.json @@ -0,0 +1,2997 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.2/read/feed/25823/posts" + }, + "response": { + "status": 200, + "jsonBody": { + "date_range": { + "before": "2025-09-30T21:13:09+00:00", + "after": "2025-09-10T19:00:04+00:00" + }, + "number": 7, + "posts": [ + { + "ID": 80490, + "site_ID": 3584907, + "author": { + "ID": 11979399, + "login": "ioanamuresanwp", + "email": false, + "name": "Ioana Muresan", + "first_name": "Ioana", + "last_name": "Muresan", + "nice_name": "ioanamuresanwp", + "URL": "", + "avatar_URL": "https://0.gravatar.com/avatar/37139c6b60c339da4ddf54b22c17b32d04bae30dd49f9a08502672da8507a0a6?s=96&d=retro", + "profile_URL": "https://gravatar.com/ioanamuresanwp", + "site_ID": 245460229, + "has_avatar": true, + "wpcom_id": 11979399, + "wpcom_login": "ioanamuresanwp" + }, + "date": "2025-10-05T15:00:00+00:00", + "modified": "2025-10-05T18:11:50+00:00", + "title": "How to Collect Email Addresses with Gated Content on WordPress Sites", + "URL": "http://en.blog.wordpress.com/2025/09/12/collect-email-addresses-gated-content/", + "short_URL": "https://wp.me/pf2B5-kWe", + "content": "
\n

You asked:

\n\n\n\n
\n

What’s the easiest way to collect emails on my site and give people a downloadable freebie in return?

\n
\n\n\n\n

Users often ask our Happiness Engineers about this topic, and we love helping with it. Here’s how we usually walk folks through setting up gated content to build an email list.

\n\n\n\n

Why this matters

\n\n\n\n

When someone visits your site, you’ve already done the hard part — you’ve got their attention. However, unless you give them a reason to stay in touch, they might disappear forever (no pressure). That’s where email comes in.

\n\n\n\n

Collecting email addresses lets you build real connections with your readers, customers, or future superfans, and offering a freebie is one of the simplest, most effective ways to do it. It’s a little nudge that says, “Hey, I’ve got something useful for you — want it? This here is a two-way street where we both benefit.”

\n\n\n\n

This article is for you if you’re running a business, growing a blog, or sharing your creative work — a small step that can make a big difference in growing your site.

\n\n\n\n

Why collect email addresses? 

\n\n\n\n
    \n
  1. \nBuild relationships: You’re not just chasing clicks, you’re building ongoing connections, turning casual visitors into long-term, loyal readers/customers/followers. You get to stay on their radar even when they’ve left your site.
  2. \n\n\n\n
  3. \nStay in control: This is so important — you get to own your list, not a social platform, not a search engine! That means your list (and your connection with your tribe) stays strong even when algorithms change, even when your traffic dips. 
  4. \n\n\n\n
  5. \nSupport future growth: If you have any concrete plans to launch a product, open a store, promote a service, etc., you’ll want that list. You’re building this site for a reason, and building a connection with your audience can help you get there. 
  6. \n
\n\n\n\n

Look at it this way: you’re building your best long-term asset! 

\n\n\n\n

Tip: You don’t need a long list. You need a list of the right people. 

\n\n\n\n

Why would anyone give you their email address? 

\n\n\n\n

People are protective of their inboxes (you and I are too) — so what makes them say yes? 

\n\n\n\n
    \n
  1. \nThey’re getting something valuable: A fair exchange of sorts, you’re offering them something that solves a problem for them, saves them time, or inspires them to take action. If it feels like a win to them, it is. The important thing here is to keep in mind that the right freebie is the one that speaks directly to what they need. Or want. Or both. 
  2. \n\n\n\n
  3. \nThey trust you: Your site feels helpful, thoughtful, and especially in this day and age, human. You nailed your tone; it’s welcoming and informative. Over time, they get a sense that whatever you’re sending their way is worthwhile. 
  4. \n\n\n\n
  5. \nThey want to stay in the loop: They might not be ready to take any concrete form of action yet, but they feel they’re not willing to miss out on what you want to say. In a nutshell, they like what you’re doing, they like you, and they want to hear more. 
  6. \n
\n\n\n\n

Tip: They share their email when what you’re offering feels “worth it.”

\n\n\n\n

What is a freebie, and more importantly, what is a good freebie? 

\n\n\n\n

A freebie (or “lead magnet”) is something you’re offering in exchange for their email address. 

\n\n\n\n

The best ones generally pack a punch in terms of value and practicality. Here’s what will make your visitors consider your freebies a steal so they end up using them often: 

\n\n\n\n
    \n
  1. \nThey solve a real problem: Save them time, answer a question, offer a helpful shortcut.
  2. \n\n\n\n
  3. \nThey’re relevant to your site: They need to match your site content or product or service. 
  4. \n\n\n\n
  5. \nThey just feel thoughtful: They show your audience you know them and care about what they need.
  6. \n
\n\n\n\n

Tip: Think of freebies as small gifts that say, “I see you, and here’s something that might help.” 

\n\n\n\n

What do they look like in practice?

\n\n\n\n

Here are some examples – for you to pick from, depending on your content, your audience and your goals: 

\n\n\n\n
    \n
  • \nShop owner: You could offer a “How to care for your [product]” factsheet or a coupon code. 
  • \n\n\n\n
  • \nLifestyle blogger: Think printable checklist, e.g., morning routine or pantry staples, travel prep, or self-care ideas.
  • \n\n\n\n
  • \nCreative/freelancer: A free template, a “how I work” client guide, or a mini-portfolio sampler. 
  • \n\n\n\n
  • \nCoach/trainer: A short audio or video recording of a helpful exercise or a journaling/reflection prompt. 
  • \n\n\n\n
  • \nPersonal or passion-based business/website: A curated reading list, your favorite tools, or a printable list of inspiring quotes.
  • \n
\n\n\n\n

Tip: Keep them simple, relevant, and useful. When in doubt, a good rule of thumb is to think what would get you excited to download yourself. 

\n\n\n\n

How to offer your freebie effectively 

\n\n\n\n

Once your freebie is ready, make sure it’s easy for your visitors to say yes. This is where a good CTA (call to action) comes in — that short, friendly invitation that nudges visitors to take action. 

\n\n\n\n

Here’s what makes up an effective CTA: 

\n\n\n\n
    \n
  1. \nClear: Let people know exactly what they’re getting. 
  2. \n\n\n\n
  3. \nWarm: A line like “Want the checklist? Pop your email here” sounds friendlier than “Submit.” 
  4. \n\n\n\n
  5. \nVisible: Don’t hide it at the bottom of the page — give it room to shine. 
  6. \n
\n\n\n\n

What are your options?

\n\n\n\n

The built-in form option is our favorite for its ease and simplicity (see below). If you’re looking for more advanced features, there are other ways to set up your freebie using a variety of plugins you can try.

\n\n\n\n

Here are a some popular options.

\n\n\n\n

Use the form block

\n\n\n\n

See our recommended option below for details. For WordPress.com users, the Form block is available on all plans.

\n\n\n\n
\n\n
\n\n\n\n

Mailpoet (plugin)

\n\n\n\n
\"Image
\n\n\n\n

MailPoet (plugin): Lets you build sign-up forms, send automated emails, and deliver your freebie — all without leaving your site. It’s the best option if you want a built-in email marketing tool with automation. It integrates well with your favorite CMS and allows you to reach and grow your audience by offering features such as GDPR-compliant email newsletters, templates, segmentation, and many Woo-related features for your store.

\n\n\n\n

Once you set it up, you can use this guide to send your freebie to your subscribers. MailPoet is awesome, if we say so ourselves, and it’s free for up to 500 subscribers.

\n\n\n\n

Contact Form 7 Gated Content (plugin)

\n\n\n\n
\"Screenshot
\n\n\n\n

Contact Form 7 Gated content (plugin): lets you gate access to files so your visitors don’t see the Download button until they’ve successfully submitted the information you request. It works as an add-on for sites already using Contact Form 7. It doesn’t include email automation or list management but it’s great if you want a clean, no-code way to restrict access to a download until your visitor takes action. You set the rules, connect it to your content, and the plugin handles the gating part.

\n\n\n\n

MailerLite / Mailchimp / Kit

\n\n\n\n

MailerLite/Mailchimp/Kit (formerly ConvertKit) (third-party tools): Great if you’re already using these tools or looking for advanced marketing features.

\n\n\n\n

You’d build your form on either of these tools, then set up an automated email that delivers your freebie, and finally, paste the embed code into your WordPress.com site using a custom HTML block (you’ll want to have a Business plan to use the Custom HTML block). It’s important to know that while these tools have free tiers, some features will be paid.

\n\n\n\n

Our recommended approach

\n\n\n\n

That said, we are all about making things as easy, straightforward, and lightweight as possible, so we recommend using an adapted Form block to get this done. It’s quick, built right into WordPress.com, and it gets the job done beautifully, no extra tools needed. Here’s how to set it up.

\n\n\n\n

Step 1: Upload your file to your site 

\n\n\n\n

Head over to your Dashboard > Media and upload your file. Once you’re done, click on the file and copy its URL, like so:

\n\n\n\n
\"Example
\n\n\n\n

Step 2: Add the form to your page 

\n\n\n\n

On your page, navigate to where you’d like to add your “grab your freebie” button:

\n\n\n\n
\"Selecting
\n\n\n\n

Add the form block, then select the Registration form:

\n\n\n\n
\"Selecting
\n\n\n\n

Once that is complete, the full form will be added to your page.

\n\n\n\n

Step 3: Customize your form

\n\n\n\n

Use the List view to remove any fields that you don’t need:

\n\n\n\n
\"Customizing
\n\n\n\n

You can further customize the form layout by using the contextual menu at the top or the side panel on your left:

\n\n\n\n
\"Further
\n\n\n\n

Tip: Be sure to select the right element in the list menu so you can be sure you’re editing the correct options. Each element in the list view will have its own settings.

\n\n\n\n

Next, customize the text and the layout of your button:

\n\n\n\n
\"Customizing
\n\n\n\n


Finally, add the file to the form:

\n\n\n\n
\"Adding
\n\n\n\n

You’re all set! Your visitors’ emails will be added to your Dashboard > Feedback > Form responses, and you can use the export buttons (CSV, Google Sheets) if you’d like to use the email addresses in a different tool. Each tool will have a different way to import these email addresses — check their documentation for tool-specific guidance on how best to import your email list.:

\n\n\n\n
\"Exporting
\n\n\n\n

You’ll also get email notifications to the email address associated with your WordPress.com account. 

\n\n\n\n

Tip: Test your form as a visitor. Seeing it work feels good – and reminds you that yep, you built something useful.

\n\n\n\n

Over to you

\n\n\n\n

Our point is: you don’t need a giant funnel or fancy tech — just a good freebie and a way for people to raise their hand and say, “Yes, I’m in.” 

\n\n\n\n

If you hit a bump in the road? We’re right here to help. 

\n\n\n\n

We’d love to see what you create, and we’re excited to see your links in the comments below!

\n
", + "excerpt": "

You asked, we answered: What’s the easiest way to collect emails on my site and give people a downloadable freebie in return?

\n", + "slug": "collect-email-addresses-gated-content", + "guid": "https://en.blog.wordpress.com/?p=80490", + "status": "publish", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": false, + "ping_status": "closed", + "comment_count": 11 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": "252", + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "2edec2dab219cb4c5133188c5ca2aa7a", + "featured_image": "https://en-blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg", + "post_thumbnail": { + "ID": 80516, + "URL": "https://en-blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg", + "mime_type": "image/jpeg", + "width": 2350, + "height": 1480 + }, + "format": "standard", + "tags": [], + "categories": { + "Tips and Tutorials": { + "ID": 28883, + "name": "Tips and Tutorials", + "slug": "tips-and-tutorials", + "description": "Practical advice, step-by-step guidance, expert recommendations, and insights to help you level up your WordPress.com skills.", + "post_count": 140, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/categories/slug:tips-and-tutorials", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/categories/slug:tips-and-tutorials/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907" + } + } + } + }, + "attachments": { + "80516": { + "ID": 80516, + "URL": "https://en-blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg", + "date": "2025-08-05T20:06:48+00:00", + "post_ID": 80490, + "author_ID": 182999449, + "file": "gated-content-wordpress-header.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "", + "caption": "", + "description": "", + "alt": "How to Collect Email Addresses with Gated Content on WordPress Sites", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg?w=1200" + }, + "height": 1480, + "width": 2350, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80516", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80516/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/80490" + } + } + }, + "80514": { + "ID": 80514, + "URL": "https://en-blog.files.wordpress.com/2025/08/contact-form-7-gated-content-solution-example.png", + "guid": "http://en.blog.files.wordpress.com/2025/08/contact-form-7-gated-content-solution-example.png", + "date": "2025-08-05T20:01:42+00:00", + "post_ID": 80490, + "author_ID": 182999449, + "file": "contact-form-7-gated-content-solution-example.png", + "mime_type": "image/png", + "extension": "png", + "title": "contact-form-7-gated-content-solution-example", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/08/contact-form-7-gated-content-solution-example.png?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/08/contact-form-7-gated-content-solution-example.png?w=300", + "large": "https://en-blog.files.wordpress.com/2025/08/contact-form-7-gated-content-solution-example.png?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/08/contact-form-7-gated-content-solution-example.png?w=1200&h=815&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/08/contact-form-7-gated-content-solution-example.png?w=900&h=815&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/08/contact-form-7-gated-content-solution-example.png?w=1200&h=815&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/08/contact-form-7-gated-content-solution-example.png?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/08/contact-form-7-gated-content-solution-example.png?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/08/contact-form-7-gated-content-solution-example.png?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/08/contact-form-7-gated-content-solution-example.png?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/08/contact-form-7-gated-content-solution-example.png?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/08/contact-form-7-gated-content-solution-example.png?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/08/contact-form-7-gated-content-solution-example.png?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/08/contact-form-7-gated-content-solution-example.png?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/08/contact-form-7-gated-content-solution-example.png?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/08/contact-form-7-gated-content-solution-example.png?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/08/contact-form-7-gated-content-solution-example.png?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/08/contact-form-7-gated-content-solution-example.png?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/08/contact-form-7-gated-content-solution-example.png?w=1200" + }, + "height": 815, + "width": 1400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80514", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80514/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/80490" + } + } + }, + "80512": { + "ID": 80512, + "URL": "https://en-blog.files.wordpress.com/2025/08/mailpoet-gated-content-solution-example.png", + "guid": "http://en.blog.files.wordpress.com/2025/08/mailpoet-gated-content-solution-example.png", + "date": "2025-08-05T19:59:30+00:00", + "post_ID": 80490, + "author_ID": 182999449, + "file": "mailpoet-gated-content-solution-example.png", + "mime_type": "image/png", + "extension": "png", + "title": "mailpoet-gated-content-solution-example", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/08/mailpoet-gated-content-solution-example.png?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/08/mailpoet-gated-content-solution-example.png?w=300", + "large": "https://en-blog.files.wordpress.com/2025/08/mailpoet-gated-content-solution-example.png?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/08/mailpoet-gated-content-solution-example.png?w=1200&h=754&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/08/mailpoet-gated-content-solution-example.png?w=900&h=754&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/08/mailpoet-gated-content-solution-example.png?w=1200&h=754&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/08/mailpoet-gated-content-solution-example.png?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/08/mailpoet-gated-content-solution-example.png?w=600&h=754&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/08/mailpoet-gated-content-solution-example.png?w=800&h=754&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/08/mailpoet-gated-content-solution-example.png?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/08/mailpoet-gated-content-solution-example.png?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/08/mailpoet-gated-content-solution-example.png?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/08/mailpoet-gated-content-solution-example.png?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/08/mailpoet-gated-content-solution-example.png?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/08/mailpoet-gated-content-solution-example.png?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/08/mailpoet-gated-content-solution-example.png?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/08/mailpoet-gated-content-solution-example.png?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/08/mailpoet-gated-content-solution-example.png?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/08/mailpoet-gated-content-solution-example.png?w=1200" + }, + "height": 754, + "width": 1400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80512", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80512/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/80490" + } + } + }, + "80510": { + "ID": 80510, + "URL": "https://en-blog.files.wordpress.com/2025/08/image-8.png", + "guid": "http://en.blog.files.wordpress.com/2025/08/image-8.png", + "date": "2025-08-05T19:46:33+00:00", + "post_ID": 80490, + "author_ID": 182999449, + "file": "image-8.png", + "mime_type": "image/png", + "extension": "png", + "title": "image", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/08/image-8.png?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/08/image-8.png?w=300", + "large": "https://en-blog.files.wordpress.com/2025/08/image-8.png?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/08/image-8.png?w=1200&h=621&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/08/image-8.png?w=900&h=621&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/08/image-8.png?w=1200&h=621&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/08/image-8.png?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/08/image-8.png?w=600&h=621&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/08/image-8.png?w=800&h=621&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-8.png?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-8.png?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-8.png?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/08/image-8.png?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/08/image-8.png?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/08/image-8.png?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/08/image-8.png?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/08/image-8.png?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/08/image-8.png?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/08/image-8.png?w=1200" + }, + "height": 621, + "width": 1600, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80510", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80510/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/80490" + } + } + }, + "80509": { + "ID": 80509, + "URL": "https://en-blog.files.wordpress.com/2025/08/image-7.png", + "guid": "http://en.blog.files.wordpress.com/2025/08/image-7.png", + "date": "2025-08-05T19:46:01+00:00", + "post_ID": 80490, + "author_ID": 182999449, + "file": "image-7.png", + "mime_type": "image/png", + "extension": "png", + "title": "image", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/08/image-7.png?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/08/image-7.png?w=300", + "large": "https://en-blog.files.wordpress.com/2025/08/image-7.png?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/08/image-7.png?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/08/image-7.png?w=900&h=1015&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/08/image-7.png?w=1200&h=1015&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/08/image-7.png?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/08/image-7.png?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/08/image-7.png?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-7.png?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-7.png?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-7.png?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/08/image-7.png?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/08/image-7.png?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/08/image-7.png?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/08/image-7.png?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/08/image-7.png?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/08/image-7.png?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/08/image-7.png?w=1200" + }, + "height": 1015, + "width": 1600, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80509", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80509/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/80490" + } + } + }, + "80508": { + "ID": 80508, + "URL": "https://en-blog.files.wordpress.com/2025/08/image-6.png", + "guid": "http://en.blog.files.wordpress.com/2025/08/image-6.png", + "date": "2025-08-05T19:45:01+00:00", + "post_ID": 80490, + "author_ID": 182999449, + "file": "image-6.png", + "mime_type": "image/png", + "extension": "png", + "title": "image", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/08/image-6.png?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/08/image-6.png?w=300", + "large": "https://en-blog.files.wordpress.com/2025/08/image-6.png?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/08/image-6.png?w=1200&h=780&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/08/image-6.png?w=900&h=780&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/08/image-6.png?w=1200&h=780&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/08/image-6.png?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/08/image-6.png?w=600&h=780&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/08/image-6.png?w=800&h=780&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-6.png?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-6.png?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-6.png?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/08/image-6.png?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/08/image-6.png?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/08/image-6.png?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/08/image-6.png?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/08/image-6.png?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/08/image-6.png?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/08/image-6.png?w=1200" + }, + "height": 780, + "width": 1600, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80508", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80508/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/80490" + } + } + }, + "80507": { + "ID": 80507, + "URL": "https://en-blog.files.wordpress.com/2025/08/image-5.png", + "guid": "http://en.blog.files.wordpress.com/2025/08/image-5.png", + "date": "2025-08-05T19:44:44+00:00", + "post_ID": 80490, + "author_ID": 182999449, + "file": "image-5.png", + "mime_type": "image/png", + "extension": "png", + "title": "image", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/08/image-5.png?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/08/image-5.png?w=300", + "large": "https://en-blog.files.wordpress.com/2025/08/image-5.png?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/08/image-5.png?w=1200&h=830&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/08/image-5.png?w=900&h=830&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/08/image-5.png?w=1200&h=830&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/08/image-5.png?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/08/image-5.png?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/08/image-5.png?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-5.png?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-5.png?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-5.png?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/08/image-5.png?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/08/image-5.png?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/08/image-5.png?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/08/image-5.png?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/08/image-5.png?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/08/image-5.png?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/08/image-5.png?w=1200" + }, + "height": 830, + "width": 1600, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80507", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80507/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/80490" + } + } + }, + "80506": { + "ID": 80506, + "URL": "https://en-blog.files.wordpress.com/2025/08/image-4.png", + "guid": "http://en.blog.files.wordpress.com/2025/08/image-4.png", + "date": "2025-08-05T19:44:35+00:00", + "post_ID": 80490, + "author_ID": 182999449, + "file": "image-4.png", + "mime_type": "image/png", + "extension": "png", + "title": "image", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/08/image-4.png?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/08/image-4.png?w=300", + "large": "https://en-blog.files.wordpress.com/2025/08/image-4.png?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/08/image-4.png?w=1200&h=561&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/08/image-4.png?w=900&h=561&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/08/image-4.png?w=1200&h=561&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/08/image-4.png?w=800&h=561&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/08/image-4.png?w=600&h=561&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/08/image-4.png?w=800&h=561&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-4.png?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-4.png?w=450&h=561&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-4.png?w=600&h=561&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/08/image-4.png?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/08/image-4.png?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/08/image-4.png?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/08/image-4.png?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/08/image-4.png?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/08/image-4.png?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/08/image-4.png?w=1200" + }, + "height": 561, + "width": 1600, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80506", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80506/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/80490" + } + } + }, + "80505": { + "ID": 80505, + "URL": "https://en-blog.files.wordpress.com/2025/08/image-3.png", + "guid": "http://en.blog.files.wordpress.com/2025/08/image-3.png", + "date": "2025-08-05T19:44:28+00:00", + "post_ID": 80490, + "author_ID": 182999449, + "file": "image-3.png", + "mime_type": "image/png", + "extension": "png", + "title": "image", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/08/image-3.png?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/08/image-3.png?w=300", + "large": "https://en-blog.files.wordpress.com/2025/08/image-3.png?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/08/image-3.png?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/08/image-3.png?w=900&h=920&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/08/image-3.png?w=1200&h=920&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/08/image-3.png?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/08/image-3.png?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/08/image-3.png?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-3.png?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-3.png?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-3.png?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/08/image-3.png?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/08/image-3.png?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/08/image-3.png?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/08/image-3.png?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/08/image-3.png?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/08/image-3.png?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/08/image-3.png?w=1200" + }, + "height": 920, + "width": 1600, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80505", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80505/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/80490" + } + } + }, + "80504": { + "ID": 80504, + "URL": "https://en-blog.files.wordpress.com/2025/08/image-2.png", + "guid": "http://en.blog.files.wordpress.com/2025/08/image-2.png", + "date": "2025-08-05T19:44:21+00:00", + "post_ID": 80490, + "author_ID": 182999449, + "file": "image-2.png", + "mime_type": "image/png", + "extension": "png", + "title": "image", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/08/image-2.png?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/08/image-2.png?w=300", + "large": "https://en-blog.files.wordpress.com/2025/08/image-2.png?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/08/image-2.png?w=1200&h=727&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/08/image-2.png?w=900&h=727&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/08/image-2.png?w=1200&h=727&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/08/image-2.png?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/08/image-2.png?w=600&h=727&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/08/image-2.png?w=800&h=727&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-2.png?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-2.png?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-2.png?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/08/image-2.png?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/08/image-2.png?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/08/image-2.png?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/08/image-2.png?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/08/image-2.png?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/08/image-2.png?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/08/image-2.png?w=1200" + }, + "height": 727, + "width": 1600, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80504", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80504/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/80490" + } + } + }, + "80503": { + "ID": 80503, + "URL": "https://en-blog.files.wordpress.com/2025/08/image-1.png", + "guid": "http://en.blog.files.wordpress.com/2025/08/image-1.png", + "date": "2025-08-05T19:44:03+00:00", + "post_ID": 80490, + "author_ID": 182999449, + "file": "image-1.png", + "mime_type": "image/png", + "extension": "png", + "title": "image", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/08/image-1.png?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/08/image-1.png?w=300", + "large": "https://en-blog.files.wordpress.com/2025/08/image-1.png?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/08/image-1.png?w=1200&h=845&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/08/image-1.png?w=900&h=845&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/08/image-1.png?w=1200&h=845&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/08/image-1.png?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/08/image-1.png?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/08/image-1.png?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-1.png?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-1.png?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/08/image-1.png?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/08/image-1.png?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/08/image-1.png?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/08/image-1.png?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/08/image-1.png?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/08/image-1.png?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/08/image-1.png?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/08/image-1.png?w=1200" + }, + "height": 845, + "width": 1600, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80503", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80503/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/80490" + } + } + } + }, + "attachment_count": 11, + "metadata": [], + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/read/sites/3584907/posts/80490", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/posts/80490/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "replies": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/80490/replies/", + "likes": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/posts/80490/likes/" + }, + "data": { + "site": { + "ID": 3584907, + "name": "WordPress.com News", + "description": "The latest news on WordPress.com and the WordPress community.", + "URL": "http://en.blog.wordpress.com", + "jetpack": false, + "jetpack_connection": false, + "post_count": 1992, + "subscribers_count": 120400779, + "locale": "en", + "logo": { + "id": 0, + "sizes": [], + "url": "" + }, + "visible": true, + "is_private": false, + "is_coming_soon": false, + "is_following": true, + "organization_id": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/help", + "posts": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/posts/", + "comments": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/comments/", + "xmlrpc": "https://en.blog.wordpress.com/xmlrpc.php" + } + }, + "launch_status": false, + "site_migration": { + "is_complete": false, + "in_progress": false + }, + "is_fse_active": false, + "is_fse_eligible": false, + "is_core_site_editor_enabled": false, + "is_wpcom_atomic": false, + "is_wpcom_staging_site": false, + "is_deleted": false, + "is_a4a_client": false, + "is_a4a_dev_site": false + } + } + }, + "feed_ID": 25823, + "feed_URL": "http://en.blog.wordpress.com", + "pseudo_ID": "2edec2dab219cb4c5133188c5ca2aa7a", + "is_external": false, + "site_name": "WordPress.com News", + "site_URL": "http://en.blog.wordpress.com", + "site_is_private": false, + "site_icon": [], + "featured_media": { + "uri": "https://en-blog.files.wordpress.com/2025/08/gated-content-wordpress-header.jpg", + "width": 2350, + "height": 1480, + "type": "image" + }, + "is_subscribed_comments": false, + "can_subscribe_comments": false, + "subscribed_comments_notifications": false, + "publish_date_changed": false, + "use_excerpt": false, + "capabilities": { + "publish_post": false, + "delete_post": false, + "edit_post": false + }, + "is_jetpack": false, + "feed_item_ID": 5800552590, + "views": null, + "is_following_conversation": false + }, + { + "ID": 81048, + "site_ID": 3584907, + "author": { + "ID": 200075924, + "login": "rochiz", + "email": false, + "name": "Rochi Zalani", + "first_name": "Rochi", + "last_name": "Zalani", + "nice_name": "rochiz", + "URL": "https://rochizalani.com/", + "avatar_URL": "https://1.gravatar.com/avatar/7391cf85a63f401a8cacd9e357ea06af5c85fc2052377a5d99b0730f5d0de578?s=96&d=retro", + "profile_URL": "https://gravatar.com/rochiz", + "site_ID": 190665069, + "has_avatar": true, + "wpcom_id": 200075924, + "wpcom_login": "rochiz" + }, + "date": "2025-09-30T21:13:09+00:00", + "modified": "2025-09-30T21:13:10+00:00", + "title": "How to Make a Portfolio Website in Three Simple Steps (+ Six Pro Tips)", + "URL": "http://en.blog.wordpress.com/2025/09/30/portfolio-website/", + "short_URL": "https://wp.me/pf2B5-l5e", + "content": "
\n

Creating a portfolio website is one of the easiest ways to showcase your work as a creative — whether you’re a designer, writer, photographer, or developer. Initially, in my career as a freelance writer, I thought a static PDF or Google Doc collating my best work would suffice.

\n\n\n\n

Having a professional portfolio website, however, makes quite a difference. For starters, it raises your stature because it signals a certain level of credibility and commitment to your craft that isn’t evident in other formats (like PDFs or online portfolio makers).

\n\n\n\n

Beyond first impressions, creating a portfolio website has tons of functional benefits — it’s interactive, easier to keep up-to-date, and more accessible. I can also see which pages on my website get the most views and engagement to optimize my portfolio better.

\n\n\n\n

Best of all, building a professional-looking website is easier than you think. It might appear overwhelming at first, but this guide will make the process straightforward. 

\n\n\n\n

How to build a portfolio website in three simple steps

\n\n\n\n

Building a portfolio website seems daunting at first — especially if you haven’t created a website before. It seems easier to rely on mock portfolio builders than to make a site from scratch, but I promise the process is easier than you think. Here are all the steps you need to follow:

\n\n\n\n

Step 1: Select your best pieces of work

\n\n\n\n

It’s tempting to dump all the work you’ve ever done in your portfolio, but take it from someone who used to have writing samples from college internships (yikes) on her site: You must only show your best work on your portfolio website.

\n\n\n\n

Why? Your prospective clients are busy people. They don’t have the time to scour through a ton of samples to evaluate your work and determine whether you’re a right fit for their needs. Displaying too many pieces of work also doesn’t leave a lasting impression. You want a potential client to land on your portfolio website, find your best work easily, and remember you.

\n\n\n\n

So, pick only the best of the best work you’ve done so far to display on your portfolio website. If you work in multiple industries or have different categories within your work, you can pick a few samples from each segment.

\n\n\n\n

For example, I write for various sectors — such as the creator economy, software, and productivity. On my portfolio site, each niche is a different page containing a few of the best samples from each category.

\n\n\n\n

Now, when a prospective client lands on my website and they’re in the software industry, they can easily find the best samples in that domain instead of sifting through irrelevant pieces of work.

\n\n\n\n

Organizing my portfolio this way also saves me time when I’m communicating with a lead and need to send relevant samples.

\n\n\n\n

If you want to show work you’ve done for fun, you can classify it separately as your passion project(s).

\n\n\n\n

Takeaway: Select the best pieces of work you’ve done to showcase on your portfolio website. There’s not a singular ideal number of samples — it depends on your work experience, industry, and more. It always helps to think from a client’s perspective.

If they land on your portfolio website, which samples would impress them? How many samples would look too cluttered and make a client bounce? Which samples would best show your range of work? Start putting yourself in your client’s shoes and pick the best pieces of work accordingly.

\n\n\n\n

Step 2: Choose your web host and domain name (if you aren’t already using WordPress.com)

\n\n\n\n

If you’re already using WordPress.com to set up your site, you’re ahead of the game. If you’ve landed on this article without a WordPress.com account, no worries. Stick with me here — we’ll cover the foundation you need before you can bring your portfolio site to life.

\n\n\n\n

You need two things to begin creating your portfolio website: a web host and a domain name.

\n\n\n\n
    \n
  • A web host is a service provider that stores your website’s files and makes them accessible on the internet. We recommend WordPress.com.
  • \n\n\n\n
  • A domain name is your website’s address on the internet.
  • \n
\n\n\n\n

Tip: If you’re confused between domain and hosting, this article highlights their differences and explains why you need both services for your website.

\n\n\n\n

If you want to avoid the headache of finding and integrating a web host, a domain name, and a website builder, you can choose a managed WordPress hosting provider like WordPress.com — where everything is in one place. You also don’t lose the flexibility and control to customize your website however you wish.

\n\n\n\n

Anyone can get a website up and running with WordPress.com. Start with one of these resources:

\n\n\n\n\n\n\n\n

Once you go through the sign up flow, you’re ready to start building your website.

\n\n\n\n

Tip: When you sign up with WordPress.com, you’ll be asked to choose a domain name. This can be something related to your business name, personal brand, or simply your full name.

You can also search available domain names with our domain finder tool or transfer an existing domain name to WordPress.com if you have one with another domain provider.

\n\n\n\n

Step 3: Design your portfolio

\n\n\n\n

The final step is actually designing your portfolio. If you’ve chosen WordPress.com as your host, you’ll have access to thousands of free and premium themes. There are also various themes specifically for portfolios so you don’t have to start building your website from scratch.

\n\n\n\n
\"Screenshot
\n\n\n\n

Once you decide on a theme, customize the website to your brand’s colors and fonts. If you have a logo for your creative business, you can add it to your website, too.

\n\n\n\n

Then, start adding pages to your website. Here are the pages you should have on your portfolio site:

\n\n\n\n
    \n
  • \nHomepage: This is the first place someone lands on when they type your domain or discover your portfolio site. Your home page should briefly introduce who you are and explain what you do. It should also have call-to-actions — like “see my work” or “contact me” — to help potential clients navigate your website. Learn how to set your homepage.
    \n
  • \n\n\n\n
  • \nAbout page: This is where someone can go to learn more about you. Use this place to share your professional experience and sprinkle in some personality. The goal is to make someone connect with the person behind the website.
    \n
  • \n\n\n\n
  • \nContact page: You can have a dedicated contact page or embed a contact form on your site on various pages. Make it easy for people to reach you — include your email address, social media links, and a contact form. If you’re comfortable, you can also include your phone number.
    \n
  • \n\n\n\n
  • \nResume page (if applicable): If you need it, you can also include a resume page where people can view and download your resume. Learn how to upload documents and use the File block to make your resume downloadable.
    \n
  • \n\n\n\n
  • \nPortfolio page: This is the core of your site, where you show the work you selected in step one. WordPress.com has a dedicated portfolio function to showcase your work. Learn how to use it on your site. There are also portfolio plugins to help you organize your work in different ways.
  • \n
\n\n\n\n

The above are the essential pages you should have on your portfolio website, but don’t be afraid to get creative and add more pages if you need them. For example, if you’re planning to add blog posts that show your expertise, you can add a separate page for them on your site.

\n\n\n\n

Tip: Don’t select your best work once and then let it collect dust. You need to regularly update your website with new samples to showcase your current skill level. I set aside an hour at the end of each month to add recent work to my portfolio. Set up a similar ritual that works for you to ensure your portfolio site always matches your existing skillset.

\n\n\n\n

A look inside my portfolio website

\n\n\n\n

Here’s how I’ve designed my portfolio site using the steps outlined in the previous section. Hopefully, it helps you get some ideas about elements you can use in your own portfolio.

\n\n\n\n

1. Home page

\n\n\n\n

The home page has a clear hero image and a headline about what I do. I start by introducing myself and giving a brief summary about the clients I work with and the services I provide. I debated about adding my photo, but I realized it instantly humanizes my website.

\n\n\n\n
\"Example
\n\n\n\n

The call-to-action in the first section is to either visit the portfolio or scroll down to learn more about my work process. If you are a service provider, some details about how you work together can help clients feel more confident about your professionalism and get a rough idea about how you work.

\n\n\n\n

The goal isn’t just to give potential clients a snippet of what working together feels like, but also to filter out clients who might not be a good fit.

\n\n\n\n
\"Example
\n\n\n\n

In the middle of the home page, I’ve also added testimonials and logos of some of the brands I’ve worked with. This instantly builds trust and makes a potential client curious to learn more.

\n\n\n\n
\"Example
\n\n\n\n

I’ve also added a contact form and an FAQ section at the end, so it’s easy for clients to contact me without leaving the website and have their common queries answered.

\n\n\n\n
\"Example
\n\n\n\n

2. Portfolio

\n\n\n\n

The portfolio page on my website begins with a reiteration of who I am, what I do, and logos of some notable brands I’ve worked with. I find this repetition is often helpful because potential clients often land on my portfolio page before they land on my home page.

\n\n\n\n
\"Example
\n\n\n\n

The next section contains an image of me with the “Why should I hire you?” question answered. I’ve found adding this bit often helps soothe doubts of potential clients and helps me showcase how I stand out compared to the competition.

\n\n\n\n
\"\"
\n\n\n\n

After that, I put a spotlight on my best two testimonials from notable (present or former) clients in my industry to build some credibility. In future updates, I also plan on highlighting a few core phrases in these reviews to make the website more skimmable and memorable.

\n\n\n\n
\"Example
\n\n\n\n

Then come the samples. I categorize my samples into various folders to cater to the different kinds of clients I work with. I highly recommend doing this if you work in multiple industries, no matter how niche the difference is between them. It helps clients easily find exactly what they’re looking for to make the decision to hire you. It’s also handy when you want to send only one category’s sample to a potential client.

\n\n\n\n
\"Examples
\n\n\n\n

The portfolio page ends with the contact form and two more testimonials to seal the deal.

\n\n\n\n
\"Example
\n\n\n\n

3. Work Samples

\n\n\n\n

The work sample pages are simple: Each contains six samples and a relevant testimonial. These are the pages I update the most because I want these samples to reflect my latest and best work. Focus on being accessible instead of fancy here. Don’t make a client jump through hoops to find your best work.

\n\n\n\n
\"Examples
\n\n\n\n

What do I mean by relevant testimonials? Let me explain with an example: In the above productivity samples, I have added a majority of the work from my client, Todoist. So the testimonial is from the content manager in the same company.

\n\n\n\n
\"Example
\n\n\n\n

This adds more weight and credibility in the eyes of a future client browsing this page. They can not only see the latest samples, but also read a review from a client in the same industry. Of course, this isn’t always possible, but do your best to pair each testimonial with relevant work samples. If you can’t grab a testimonial, a case study can also work wonders.

\n\n\n\n

I also plan to add contact forms in these pages that are more personalized to the category. This will not only help clients contact me easily, but also help me precisely track where the majority of my leads are coming from.

\n\n\n\n

Tip: Depending on how much time you have available, expect to spend about a week to build a small portfolio site with four or five pages. You can also consider using our custom website design service or expediting the process with our AI website builder.

\n\n\n\n

How to use and promote your portfolio

\n\n\n\n

To make the best use of your portfolio website, it’s important to get the word out and make it accessible. Ideally, it’d be the first thing a prospective client finds when they want to learn more about you and your work.

\n\n\n\n

Here are five easy ways to make the most of your portfolio website:

\n\n\n\n
    \n
  1. \nAdd your portfolio site to your email signature: This way, everyone you communicate with can see and access the link. Over time, your email signature will make it easy for people to remember who you are and where they can learn more about you.
    \n
  2. \n\n\n\n
  3. \nOptimize your site for user experience: Make your website visually clean, easy to navigate, and mobile-friendly. Think from a client’s perspective and add relevant call-to-action buttons to make it easy for people to find what they need.
    \n
  4. \n\n\n\n
  5. \nUse SEO best practices: It’s ideal to rank in search terms that relate to your field and expertise. Write meta descriptions with relevant keywords, add alt text to images, and compress images for faster loading times. Learn more about WordPress SEO to make your portfolio site rank in search results.
    \n
  6. \n\n\n\n
  7. \nShare your portfolio website wherever relevant: The best way to make your portfolio more visible is to market it wherever appropriate. If you practice email marketing, add it to your newsletters. If you use a marketplace to find clients, add your portfolio site to your profile. If you have an about section on your client’s website, ask them to add your website there. Share it when you’re networking professionally or asking for referrals, too.
    \n
  8. \n\n\n\n
  9. \nMonitor website visits: Use Jetpack Stats to track site visitors (which is included with every WordPress.com website). For deeper website analysis, you can also set up Google Analytics. Use data to refine your website and identify areas for improvement.
  10. \n
\n\n\n\n

Now that you’ve learned how to create, use, and promote your portfolio site, let’s understand how to transform it from good to great.

\n\n\n\n

Six tips for putting together an effective portfolio

\n\n\n\n

Over my half a decade of self-employment, I’ve seen a fair share of portfolios from creatives across a variety of fields. Here are six things the best portfolio sites have in common:

\n\n\n\n

1. Tell a (short) story with every project

\n\n\n\n

We’ve already covered why it’s essential to include only your very best work in your portfolio. The goal is to curate, not accumulate.

\n\n\n\n

However, when you’re handpicking your best samples, it’s also important to add context to your projects. For example, if you’re a designer, you can add the goal and results of each sample alongside the work. If a project was more unique than usual, you can add that with the work sample and highlight how you solved any unexpected challenges.

\n\n\n\n

Adding a brief context with your projects can help clients understand your work beyond the finished product — they’ll also see how you solve problems and the range of work you’ve done.

\n\n\n\n

2. Be specific about the kind of work/clients you want to attract

\n\n\n\n

The goal of your portfolio website isn’t just to attract clients, it’s to attract the right kind of clients. If you specifically work with B2B companies, for instance, you don’t want to be fielding contact forms from DTC businesses.

\n\n\n\n

On your website’s home page and portfolio, make it clear exactly who you work with and the kind of work you do. For example, include a table about the kind of services you offer and the ones you don’t. I’ve also seen many people add their rates to their portfolio site. This helps leads determine quickly if their budget is a fit. I got a lot of inquiries about ghostwriting and how I approach it, so I added it as an FAQ on my website.

\n\n\n\n
\"Example
\n\n\n\n

If you’re getting many irrelevant requests via your portfolio site, it might be a signal that you need to be more specific about your services and clients. Remember this isn’t an irreversible decision — if you’re offering a new service or working with clients from a new industry, you can simply update your website to reflect that.

\n\n\n\n

3. Keep your portfolio refreshed and updated

\n\n\n\n

It’s really easy to make your portfolio site once and let it gather cobwebs (been there, done that). You never know how many opportunities you’re missing simply because your portfolio doesn’t reflect your current skillset and services.

\n\n\n\n

I set aside one day each month to refresh my portfolio. This doesn’t just mean updating the samples with my latest work, but also adding more testimonials, showing the impact of my work (like social shares), and editing my service offerings if I’m making any procedural changes.

\n\n\n\n

Make it a part of your weekly or monthly routine to update your portfolio website. The longer you put it off, the harder it becomes to pick up the task, and if you refresh your site regularly, it’s much less time-consuming, too.

\n\n\n\n

4. Integrate your site with your social media accounts

\n\n\n\n

A client might discover you via your social media account. When they do, they should land on your portfolio with minimal effort, making it easy to contact, communicate, and hire you. Luckily, almost all social media platforms make it easy to add a link in your bio where you can add your portfolio. I’ve added mine across LinkedIn, Instagram, and X.

\n\n\n\n
\"Example
\n\n\n\n

Integrating your portfolio website seems like a small thing, but it goes a long way. It funnels your client exactly where you want them (on your portfolio website) rather than letting them open another tab, search your name, and then find your website.

\n\n\n\n

5. Include testimonials from past clients

\n\n\n\n

Testimonials from previous clients build trust and credibility for your work on a whole other level. Your samples just show the finished product, but testimonials show your communication skills, how pleasant you are to work with, and any standout qualities you have compared to the competition.

\n\n\n\n

Ask your existing or past clients to write a testimonial that you can add to your website. To make it easier for them, provide a list of questions they can answer to write it.

\n\n\n\n

Once you get a few testimonials, add them across your website. You can highlight key quotes to make them more impactful, too.

\n\n\n\n

6. Consider adding a blog that showcases your expertise

\n\n\n\n

This tip is optional, but it can be beneficial to add a blog on your portfolio website that relates to your service. For example, if you’re an email marketer, you can write posts about best practices to follow in an onboarding sequence, common mistakes you see people make, etc. These kinds of posts can build even more trust and show off your expertise in the service you provide.

\n\n\n\n

You don’t need to publish a blog on your site every week, but even a couple every quarter can help you stand out from the crowd. Think about what would impress your clients and write blogs about that. If you already post on social media, you can easily repurpose content in both formats.

\n\n\n\n

Your portfolio needs its own home

\n\n\n\n

Building your portfolio website using a web host like WordPress.com means you have complete control over how you present your work, who sees it, and how you want to scale your presence. Closed or proprietary platforms can change their rules, restrict customizability, or even disappear overnight. That’s a big risk — especially for a site that’s your bread and butter.

\n\n\n\n

The best investment you can make for your creative career is owning your online presence. Build your site using WordPress.com today.

\n\n\n\n\n
", + "excerpt": "

Looking to build a portfolio site? Here’s a step-by-step guide on how to make one, along with pro tips to help you take your website from meh to magnificent.

\n", + "slug": "portfolio-website", + "guid": "https://en.blog.wordpress.com/?p=81048", + "status": "publish", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": false, + "ping_status": "closed", + "comment_count": 2 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": "144", + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "c211158a3482b91cc35d2dc65122a978", + "featured_image": "https://en-blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg", + "post_thumbnail": { + "ID": 81085, + "URL": "https://en-blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg", + "mime_type": "image/jpeg", + "width": 2350, + "height": 1480 + }, + "format": "standard", + "tags": [], + "categories": { + "Tips and Tutorials": { + "ID": 28883, + "name": "Tips and Tutorials", + "slug": "tips-and-tutorials", + "description": "Practical advice, step-by-step guidance, expert recommendations, and insights to help you level up your WordPress.com skills.", + "post_count": 140, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/categories/slug:tips-and-tutorials", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/categories/slug:tips-and-tutorials/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907" + } + } + } + }, + "attachments": { + "81085": { + "ID": 81085, + "URL": "https://en-blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg", + "date": "2025-09-30T19:31:12+00:00", + "post_ID": 81048, + "author_ID": 182999449, + "file": "how-to-build-portfolio-website-header.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "", + "caption": "", + "description": "", + "alt": "How to Build a Portfolio Website in Three Simple Steps (+ Six Pro Tips)", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg?w=1200" + }, + "height": 1480, + "width": 2350, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81085", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81085/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/81048" + } + } + }, + "81083": { + "ID": 81083, + "URL": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media-1.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/integrate-social-media-1.jpg", + "date": "2025-09-30T19:28:18+00:00", + "post_ID": 81048, + "author_ID": 182999449, + "file": "integrate-social-media-1.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "integrate-social-media", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media-1.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media-1.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media-1.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media-1.jpg?w=1200&h=464&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media-1.jpg?w=900&h=464&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media-1.jpg?w=1200&h=464&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media-1.jpg?w=800&h=464&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media-1.jpg?w=600&h=464&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media-1.jpg?w=800&h=464&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media-1.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media-1.jpg?w=450&h=464&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media-1.jpg?w=600&h=464&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media-1.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media-1.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media-1.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media-1.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media-1.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media-1.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media-1.jpg?w=1200" + }, + "height": 464, + "width": 1400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81083", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81083/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/81048" + } + } + }, + "81081": { + "ID": 81081, + "URL": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/integrate-social-media.jpg", + "date": "2025-09-30T19:28:07+00:00", + "post_ID": 81048, + "author_ID": 182999449, + "file": "integrate-social-media.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "integrate-social-media", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media.jpg?w=1200&h=464&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media.jpg?w=900&h=464&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media.jpg?w=1200&h=464&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media.jpg?w=800&h=464&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media.jpg?w=600&h=464&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media.jpg?w=800&h=464&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media.jpg?w=450&h=464&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media.jpg?w=600&h=464&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/integrate-social-media.jpg?w=1200" + }, + "height": 464, + "width": 1400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81081", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81081/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/81048" + } + } + }, + "81079": { + "ID": 81079, + "URL": "https://en-blog.files.wordpress.com/2025/09/faq-example.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/faq-example.jpg", + "date": "2025-09-30T19:25:45+00:00", + "post_ID": 81048, + "author_ID": 182999449, + "file": "faq-example.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "faq-example", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/faq-example.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/faq-example.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/faq-example.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/faq-example.jpg?w=1200&h=591&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/faq-example.jpg?w=900&h=591&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/faq-example.jpg?w=1200&h=591&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/faq-example.jpg?w=800&h=591&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/faq-example.jpg?w=600&h=591&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/faq-example.jpg?w=800&h=591&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/faq-example.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/faq-example.jpg?w=450&h=591&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/faq-example.jpg?w=600&h=591&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/faq-example.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/faq-example.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/faq-example.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/faq-example.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/faq-example.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/faq-example.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/faq-example.jpg?w=1200" + }, + "height": 591, + "width": 1400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81079", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81079/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/81048" + } + } + }, + "81077": { + "ID": 81077, + "URL": "https://en-blog.files.wordpress.com/2025/09/work-samples-testimonial.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/work-samples-testimonial.jpg", + "date": "2025-09-30T19:24:36+00:00", + "post_ID": 81048, + "author_ID": 182999449, + "file": "work-samples-testimonial.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "work-samples-testimonial", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/work-samples-testimonial.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/work-samples-testimonial.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/work-samples-testimonial.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/work-samples-testimonial.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/work-samples-testimonial.jpg?w=900&h=1102&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/work-samples-testimonial.jpg?w=1200&h=1102&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/work-samples-testimonial.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/work-samples-testimonial.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/work-samples-testimonial.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/work-samples-testimonial.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/work-samples-testimonial.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/work-samples-testimonial.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/work-samples-testimonial.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/work-samples-testimonial.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/work-samples-testimonial.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/work-samples-testimonial.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/work-samples-testimonial.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/work-samples-testimonial.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/work-samples-testimonial.jpg?w=1200" + }, + "height": 1102, + "width": 1400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81077", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81077/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/81048" + } + } + }, + "81074": { + "ID": 81074, + "URL": "https://en-blog.files.wordpress.com/2025/09/work-samples.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/work-samples.jpg", + "date": "2025-09-30T18:46:14+00:00", + "post_ID": 81048, + "author_ID": 182999449, + "file": "work-samples.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "work-samples", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/work-samples.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/work-samples.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/work-samples.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/work-samples.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/work-samples.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/work-samples.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/work-samples.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/work-samples.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/work-samples.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/work-samples.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/work-samples.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/work-samples.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/work-samples.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/work-samples.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/work-samples.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/work-samples.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/work-samples.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/work-samples.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/work-samples.jpg?w=1200" + }, + "height": 1235, + "width": 1400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81074", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81074/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/81048" + } + } + }, + "81072": { + "ID": 81072, + "URL": "https://en-blog.files.wordpress.com/2025/09/portfolio-end.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/portfolio-end.jpg", + "date": "2025-09-30T18:45:15+00:00", + "post_ID": 81048, + "author_ID": 182999449, + "file": "portfolio-end.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "portfolio-end", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/portfolio-end.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-end.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/portfolio-end.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/portfolio-end.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/portfolio-end.jpg?w=900&h=1155&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/portfolio-end.jpg?w=1200&h=1155&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-end.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-end.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-end.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/portfolio-end.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/portfolio-end.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/portfolio-end.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/portfolio-end.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/portfolio-end.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/portfolio-end.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/portfolio-end.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/portfolio-end.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/portfolio-end.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/portfolio-end.jpg?w=1200" + }, + "height": 1155, + "width": 1400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81072", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81072/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/81048" + } + } + }, + "81070": { + "ID": 81070, + "URL": "https://en-blog.files.wordpress.com/2025/09/portfolio-work-samples.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/portfolio-work-samples.jpg", + "date": "2025-09-30T18:41:57+00:00", + "post_ID": 81048, + "author_ID": 182999449, + "file": "portfolio-work-samples.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "portfolio-work-samples", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/portfolio-work-samples.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-work-samples.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/portfolio-work-samples.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/portfolio-work-samples.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/portfolio-work-samples.jpg?w=900&h=906&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/portfolio-work-samples.jpg?w=1200&h=906&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-work-samples.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-work-samples.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-work-samples.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/portfolio-work-samples.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/portfolio-work-samples.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/portfolio-work-samples.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/portfolio-work-samples.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/portfolio-work-samples.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/portfolio-work-samples.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/portfolio-work-samples.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/portfolio-work-samples.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/portfolio-work-samples.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/portfolio-work-samples.jpg?w=1200" + }, + "height": 906, + "width": 1400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81070", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81070/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/81048" + } + } + }, + "81068": { + "ID": 81068, + "URL": "https://en-blog.files.wordpress.com/2025/09/portfolio-testimonials.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/portfolio-testimonials.jpg", + "date": "2025-09-30T18:40:42+00:00", + "post_ID": 81048, + "author_ID": 182999449, + "file": "portfolio-testimonials.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "portfolio-testimonials", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/portfolio-testimonials.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-testimonials.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/portfolio-testimonials.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/portfolio-testimonials.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/portfolio-testimonials.jpg?w=900&h=940&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/portfolio-testimonials.jpg?w=1200&h=940&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-testimonials.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-testimonials.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-testimonials.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/portfolio-testimonials.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/portfolio-testimonials.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/portfolio-testimonials.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/portfolio-testimonials.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/portfolio-testimonials.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/portfolio-testimonials.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/portfolio-testimonials.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/portfolio-testimonials.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/portfolio-testimonials.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/portfolio-testimonials.jpg?w=1200" + }, + "height": 940, + "width": 1400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81068", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81068/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/81048" + } + } + }, + "81066": { + "ID": 81066, + "URL": "https://en-blog.files.wordpress.com/2025/09/portfolio-why-work-with-me.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/portfolio-why-work-with-me.jpg", + "date": "2025-09-30T18:16:09+00:00", + "post_ID": 81048, + "author_ID": 182999449, + "file": "portfolio-why-work-with-me.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "portfolio-why-work-with-me", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/portfolio-why-work-with-me.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-why-work-with-me.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/portfolio-why-work-with-me.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/portfolio-why-work-with-me.jpg?w=1200&h=843&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/portfolio-why-work-with-me.jpg?w=900&h=843&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/portfolio-why-work-with-me.jpg?w=1200&h=843&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-why-work-with-me.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-why-work-with-me.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-why-work-with-me.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/portfolio-why-work-with-me.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/portfolio-why-work-with-me.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/portfolio-why-work-with-me.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/portfolio-why-work-with-me.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/portfolio-why-work-with-me.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/portfolio-why-work-with-me.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/portfolio-why-work-with-me.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/portfolio-why-work-with-me.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/portfolio-why-work-with-me.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/portfolio-why-work-with-me.jpg?w=1200" + }, + "height": 843, + "width": 1400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81066", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81066/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/81048" + } + } + }, + "81064": { + "ID": 81064, + "URL": "https://en-blog.files.wordpress.com/2025/09/portfolio-header.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/portfolio-header.jpg", + "date": "2025-09-30T18:15:15+00:00", + "post_ID": 81048, + "author_ID": 182999449, + "file": "portfolio-header.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "portfolio-header", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/portfolio-header.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-header.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/portfolio-header.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/portfolio-header.jpg?w=1200&h=697&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/portfolio-header.jpg?w=900&h=697&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/portfolio-header.jpg?w=1200&h=697&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-header.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-header.jpg?w=600&h=697&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-header.jpg?w=800&h=697&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/portfolio-header.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/portfolio-header.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/portfolio-header.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/portfolio-header.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/portfolio-header.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/portfolio-header.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/portfolio-header.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/portfolio-header.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/portfolio-header.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/portfolio-header.jpg?w=1200" + }, + "height": 697, + "width": 1400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81064", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81064/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/81048" + } + } + }, + "81062": { + "ID": 81062, + "URL": "https://en-blog.files.wordpress.com/2025/09/home-contact-faq.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/home-contact-faq.jpg", + "date": "2025-09-30T18:13:45+00:00", + "post_ID": 81048, + "author_ID": 182999449, + "file": "home-contact-faq.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "home-contact-faq", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/home-contact-faq.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/home-contact-faq.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/home-contact-faq.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/home-contact-faq.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/home-contact-faq.jpg?w=900&h=1022&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/home-contact-faq.jpg?w=1200&h=1022&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/home-contact-faq.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/home-contact-faq.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/home-contact-faq.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/home-contact-faq.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/home-contact-faq.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/home-contact-faq.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/home-contact-faq.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/home-contact-faq.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/home-contact-faq.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/home-contact-faq.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/home-contact-faq.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/home-contact-faq.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/home-contact-faq.jpg?w=1200" + }, + "height": 1022, + "width": 1400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81062", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81062/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/81048" + } + } + }, + "81060": { + "ID": 81060, + "URL": "https://en-blog.files.wordpress.com/2025/09/home-testimonials.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/home-testimonials.jpg", + "date": "2025-09-30T18:11:21+00:00", + "post_ID": 81048, + "author_ID": 182999449, + "file": "home-testimonials.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "home-testimonials", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/home-testimonials.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/home-testimonials.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/home-testimonials.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/home-testimonials.jpg?w=1200&h=652&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/home-testimonials.jpg?w=900&h=652&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/home-testimonials.jpg?w=1200&h=652&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/home-testimonials.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/home-testimonials.jpg?w=600&h=652&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/home-testimonials.jpg?w=800&h=652&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/home-testimonials.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/home-testimonials.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/home-testimonials.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/home-testimonials.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/home-testimonials.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/home-testimonials.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/home-testimonials.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/home-testimonials.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/home-testimonials.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/home-testimonials.jpg?w=1200" + }, + "height": 652, + "width": 1400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81060", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81060/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/81048" + } + } + }, + "81058": { + "ID": 81058, + "URL": "https://en-blog.files.wordpress.com/2025/09/home-working-process.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/home-working-process.jpg", + "date": "2025-09-30T18:10:18+00:00", + "post_ID": 81048, + "author_ID": 182999449, + "file": "home-working-process.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "home-working-process", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/home-working-process.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/home-working-process.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/home-working-process.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/home-working-process.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/home-working-process.jpg?w=900&h=960&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/home-working-process.jpg?w=1200&h=960&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/home-working-process.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/home-working-process.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/home-working-process.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/home-working-process.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/home-working-process.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/home-working-process.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/home-working-process.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/home-working-process.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/home-working-process.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/home-working-process.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/home-working-process.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/home-working-process.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/home-working-process.jpg?w=1200" + }, + "height": 960, + "width": 1400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81058", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81058/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/81048" + } + } + }, + "81056": { + "ID": 81056, + "URL": "https://en-blog.files.wordpress.com/2025/09/home-hero.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/home-hero.jpg", + "date": "2025-09-30T18:08:20+00:00", + "post_ID": 81048, + "author_ID": 182999449, + "file": "home-hero.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "home-hero", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/home-hero.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/home-hero.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/home-hero.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/home-hero.jpg?w=1200&h=844&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/home-hero.jpg?w=900&h=844&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/home-hero.jpg?w=1200&h=844&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/home-hero.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/home-hero.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/home-hero.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/home-hero.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/home-hero.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/home-hero.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/home-hero.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/home-hero.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/home-hero.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/home-hero.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/home-hero.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/home-hero.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/home-hero.jpg?w=1200" + }, + "height": 844, + "width": 1400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81056", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81056/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/81048" + } + } + }, + "81054": { + "ID": 81054, + "URL": "https://en-blog.files.wordpress.com/2025/09/portfolio-themes.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/portfolio-themes.jpg", + "date": "2025-09-30T18:05:55+00:00", + "post_ID": 81048, + "author_ID": 182999449, + "file": "portfolio-themes.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "portfolio-themes", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/portfolio-themes.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-themes.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/portfolio-themes.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/portfolio-themes.jpg?w=1200&h=788&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/portfolio-themes.jpg?w=900&h=788&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/portfolio-themes.jpg?w=1200&h=788&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-themes.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-themes.jpg?w=600&h=788&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/portfolio-themes.jpg?w=800&h=788&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/portfolio-themes.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/portfolio-themes.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/portfolio-themes.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/portfolio-themes.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/portfolio-themes.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/portfolio-themes.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/portfolio-themes.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/portfolio-themes.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/portfolio-themes.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/portfolio-themes.jpg?w=1200" + }, + "height": 788, + "width": 1400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81054", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81054/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/81048" + } + } + } + }, + "attachment_count": 16, + "metadata": [], + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/read/sites/3584907/posts/81048", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/posts/81048/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "replies": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/81048/replies/", + "likes": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/posts/81048/likes/" + }, + "data": { + "site": { + "ID": 3584907, + "name": "WordPress.com News", + "description": "The latest news on WordPress.com and the WordPress community.", + "URL": "http://en.blog.wordpress.com", + "jetpack": false, + "jetpack_connection": false, + "post_count": 1992, + "subscribers_count": 120400779, + "locale": "en", + "logo": { + "id": 0, + "sizes": [], + "url": "" + }, + "visible": true, + "is_private": false, + "is_coming_soon": false, + "is_following": true, + "organization_id": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/help", + "posts": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/posts/", + "comments": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/comments/", + "xmlrpc": "https://en.blog.wordpress.com/xmlrpc.php" + } + }, + "launch_status": false, + "site_migration": { + "is_complete": false, + "in_progress": false + }, + "is_fse_active": false, + "is_fse_eligible": false, + "is_core_site_editor_enabled": false, + "is_wpcom_atomic": false, + "is_wpcom_staging_site": false, + "is_deleted": false, + "is_a4a_client": false, + "is_a4a_dev_site": false + } + } + }, + "feed_ID": 25823, + "feed_URL": "http://en.blog.wordpress.com", + "pseudo_ID": "c211158a3482b91cc35d2dc65122a978", + "is_external": false, + "site_name": "WordPress.com News", + "site_URL": "http://en.blog.wordpress.com", + "site_is_private": false, + "site_icon": [], + "featured_media": { + "uri": "https://en-blog.files.wordpress.com/2025/09/how-to-build-portfolio-website-header.jpg", + "width": 2350, + "height": 1480, + "type": "image" + }, + "is_subscribed_comments": false, + "can_subscribe_comments": false, + "subscribed_comments_notifications": false, + "publish_date_changed": false, + "use_excerpt": false, + "capabilities": { + "publish_post": false, + "delete_post": false, + "edit_post": false + }, + "is_jetpack": false, + "feed_item_ID": 5820252209, + "views": null, + "is_following_conversation": false + }, + { + "ID": 81020, + "site_ID": 3584907, + "author": { + "ID": 24219342, + "login": "jbossenger", + "email": false, + "name": "Jonathan Bossenger", + "first_name": "Jonathan", + "last_name": "Bossenger", + "nice_name": "jbossenger", + "URL": "https://jonathanbossenger.com", + "avatar_URL": "https://1.gravatar.com/avatar/a8a3c44a68937ee1996ba1bd3325126c4fd962f20b60acc16988dea6b527d14c?s=96&d=retro", + "profile_URL": "https://gravatar.com/jbossenger", + "site_ID": 99480728, + "has_avatar": true, + "wpcom_id": 24219342, + "wpcom_login": "jbossenger" + }, + "date": "2025-09-25T15:00:00+00:00", + "modified": "2025-09-26T08:52:06+00:00", + "title": "Will AI Replace Web Developers (And How Should You Adapt)?", + "URL": "http://en.blog.wordpress.com/2025/09/25/will-ai-replace-web-developers/", + "short_URL": "https://wp.me/pf2B5-l4M", + "content": "
\n

The more time I spend on social media reading posts by AI influencers, the more I see web developers (like myself) worrying that they’ll be out of a job in less than a year.

\n\n\n\n

It reminds me of something I read a few years ago, the golden rule of software development:

\n\n\n\n
\n

“No matter what the question is, the answer can almost always start with ‘It depends…’”

\n
\n\n\n\n

Whenever a developer asks me if I’m worried that AI will replace me, I find myself saying, “Well, it depends…”

\n\n\n\n

We’re standing on the threshold of a web development revolution

\n\n\n\n

I think about the recent progress of AI the same way I think about the first steam-powered road vehicles (or what we commonly refer to today as cars). 

\n\n\n\n

Back in the mid-19th Century in the UK, people were concerned that compared to horse-drawn modes of transportation, these steam-powered vehicles would block up roadways, endanger public safety, and cause fatal accidents. 

\n\n\n\n

This led to a series of parliamentary acts that heavily restricted the use of road-going steam-powered vehicles. The most restrictive law was the Locomotives Act of 1865, which required vehicles to travel at a maximum of 4 mph (6.4 km/h) in the country and 2 mph (3.2 km/h) in the city, as well as requiring a man carrying a red flag to walk in front of road vehicles hauling multiple wagons. These acts effectively halted automobile development in the United Kingdom for most of the 19th century. 

\n\n\n\n

While fears regarding automobiles were justified — and eventually realized — cars were gradually accepted as they became more common and accessible. Simply put, automobiles made it easier for products to get from point A to point B. I think we can all agree that in some places, especially cities, too many cars on the road can be detrimental. We also can’t deny their impact on our society and how many aspects of our daily lives are made better by having a personal road-going vehicle. 

\n\n\n\n

AI usually gets it right

\n\n\n\n

I’ve been fortunate enough to have used various forms of AI to support my work since early 2021. Back then, OpenAI had released GPT-3, and I was using it regularly as a Technical Writer for blog posts, tutorials, and documentation. Later that year, GitHub released CoPilot, and I was able to snag an open-source maintainers license, which I’ve used consistently for code generation. Since then, practically anything I’ve worked on has been AI-assisted. Generally, it’s been a  positive experience. 

\n\n\n\n

I’ve successfully built everything from plugins to web-based games, and even a few personal utility desktop applications, all using AI. My most recent success was building the WordPress.com Content Calendar in approximately 2 hours, utilizing Perplexity for R&D and Cursor for the build. 

\n\n\n\n

But when it gets it wrong…

\n\n\n\n

Every now and then, though, AI loses the plot. 

\n\n\n\n

I’ve read stories of people vibe coding SaaS apps, only to have their customer details leaked after the apps were hacked due to multiple security vulnerabilities. Recently, an AI agent deleted a company’s entire production database during a code freeze. I’m sure we’ve all heard stories of AI chatbots and agents confidently saying the code is fixed or working when, in reality, it is still broken. 

\n\n\n\n

Earlier this year, I used Cursor to build WP Debug, a small Electron desktop application that allows you to read and display the WordPress debug.log more cleanly. Someone opened a ticket to request adding the GitHub repository URL to the app’s About window. Because I had no Electron experience, it took me the better part of two full days just to implement this small request, something that an experienced Electron developer could probably have completed in an hour. Each time the Cursor agent confidently told me the About window had been implemented correctly, and each time I tested, it failed miserably.

\n\n\n\n

Last week, I was using Perplexity to help me create a lesson on anonymizing production data. As I was reviewing the generated output, everything looked good until I got to the section on anonymization strategies. Perplexity had generated this:

\n\n\n\n

WordPress provides several built-in sanitization functions that should be leveraged in custom anonymization scripts:

\n\n\n\n
// Sanitize email addresses\n\n$sanitized_email = sanitize_email( $raw_email );\n\n// Sanitize text fields\n\n$sanitized_text = sanitize_text_field( $raw_text );\n\n// Sanitize file names\n\n$sanitized_filename = sanitize_file_name( $raw_filename );\n\n// Sanitize HTML content\n\n$sanitized_html = wp_kses_post( $raw_html );
\n\n\n\n

\n\n\n\n

If you know anything about WordPress development API functions, you know that sanitization is not the same as anonymization. If you want to see how wrong a vibe-coded project can go, check out my first attempt at building a browser-based 3D shooter game. Fair warning, only attempt to open the game in your browser if you have a lot of free RAM.

\n\n\n\n

AI isn’t going to replace developers who adapt

\n\n\n\n

Some years ago, when I was still a freelance developer, I had a client who built food blogs. She maintained a couple of single-purpose plugins that managed specific functionality, such as adding a recipe custom post type and various other tasks she required. I would hear from her when she needed something new added to any of these plugins. She knew what she wanted, but lacked the coding experience to build it; however, she excelled at providing specific requirements and thoroughly testing each addition. I can almost guarantee that today, she’d be able to manage this all herself without needing to hire a developer. 

\n\n\n\n

Just like those first steam-powered vehicles, AI-assisted web development is going to make what takes hours possible in minutes. Like any new technological advancement, there will be concerns about the use of AI to develop software, including its environmental impact, the security of the code it generates, and the impact it will have on the skills and abilities of human programmers. Its adoption is, however, inevitable, and to ensure that this AI-infused future remains a productive and positive environment, it relies on the developer community to evolve and adapt alongside it.  

\n\n\n\n

What you should be doing now

\n\n\n\n

Like any new technology, there are two key takeaways. First and foremost, take heed of the hype, but learn to distill it down to the facts. 

\n\n\n\n

Social media is ablaze with folks who are trying to sell a future where the human element to AI is non-existent. It’s important to recognize these for what they are, the modern equivalent of those infomercial-driven late-night shopping channels from the early 2000s. Sometimes what’s advertised will end up being useful, but a lot of it will eventually end up on the digital trash heap. 

\n\n\n\n

AI, just like any other software, relies on humans to iterate and improve. Just like any other software, it’s prone to bugs that need fixing, new features that need documenting, and requires some training and education to operate effectively.

\n\n\n\n

Second, learn how AI works, what it does well, and what it does poorly. Learn about prompting, context, tools, and all the things that make AI coding possible. That allows you to make valid decisions about when to use AI to streamline your processes, and when it makes sense to roll up your sleeves and do some manual work.

\n\n\n\n

AI software experts recommend following good software development practices like clearly defining project scope, planning each step of the development process, writing tests as early as possible, constantly reviewing and validating AI-generated code, using robust security audits, and ensuring ongoing developer education to offset potential skill erosion. 

\n\n\n\n

At the end of the day, AI development tools are at their best when they are used as productivity aids — never as replacements for human expertise or oversight. The future of web development will be shaped by those who embrace these tools with a healthy dose of skepticism, understanding, and a willingness to learn. 

\n\n\n\n

This post was written by a human, assisted by Grammarly for grammar and spelling, inline wordsmithing using Google Gemini for clarity, and research via Perplexity.  

\n
", + "excerpt": "

Short answer: It depends. For a better answer, you’ll have to read this post.

\n", + "slug": "will-ai-replace-web-developers", + "guid": "https://en.blog.wordpress.com/?p=81020", + "status": "publish", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": false, + "ping_status": "closed", + "comment_count": 62 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": "241", + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "1c56b5f9da967e57cd8b770f04bb32c9", + "featured_image": "https://en-blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg", + "post_thumbnail": { + "ID": 81022, + "URL": "https://en-blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg", + "mime_type": "image/jpeg", + "width": 2350, + "height": 1480 + }, + "format": "standard", + "tags": [], + "categories": { + "Development": { + "ID": 780, + "name": "Development", + "slug": "development", + "description": "The latest insights and innovations from the development world—where code, creativity, and community meet to build the web of tomorrow.", + "post_count": 143, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/categories/slug:development", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/categories/slug:development/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907" + } + } + } + }, + "attachments": { + "81022": { + "ID": 81022, + "URL": "https://en-blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg", + "date": "2025-09-24T20:50:46+00:00", + "post_ID": 81020, + "author_ID": 182999449, + "file": "will-ai-replace-web-developers-header.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "", + "caption": "", + "description": "", + "alt": "Will AI Replace Web Developers?", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg?w=1200" + }, + "height": 1480, + "width": 2350, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81022", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81022/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/81020" + } + } + } + }, + "attachment_count": 1, + "metadata": [], + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/read/sites/3584907/posts/81020", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/posts/81020/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "replies": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/81020/replies/", + "likes": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/posts/81020/likes/" + }, + "data": { + "site": { + "ID": 3584907, + "name": "WordPress.com News", + "description": "The latest news on WordPress.com and the WordPress community.", + "URL": "http://en.blog.wordpress.com", + "jetpack": false, + "jetpack_connection": false, + "post_count": 1992, + "subscribers_count": 120400779, + "locale": "en", + "logo": { + "id": 0, + "sizes": [], + "url": "" + }, + "visible": true, + "is_private": false, + "is_coming_soon": false, + "is_following": true, + "organization_id": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/help", + "posts": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/posts/", + "comments": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/comments/", + "xmlrpc": "https://en.blog.wordpress.com/xmlrpc.php" + } + }, + "launch_status": false, + "site_migration": { + "is_complete": false, + "in_progress": false + }, + "is_fse_active": false, + "is_fse_eligible": false, + "is_core_site_editor_enabled": false, + "is_wpcom_atomic": false, + "is_wpcom_staging_site": false, + "is_deleted": false, + "is_a4a_client": false, + "is_a4a_dev_site": false + } + } + }, + "feed_ID": 25823, + "feed_URL": "http://en.blog.wordpress.com", + "pseudo_ID": "1c56b5f9da967e57cd8b770f04bb32c9", + "is_external": false, + "site_name": "WordPress.com News", + "site_URL": "http://en.blog.wordpress.com", + "site_is_private": false, + "site_icon": [], + "featured_media": { + "uri": "https://en-blog.files.wordpress.com/2025/09/will-ai-replace-web-developers-header.jpg", + "width": 2350, + "height": 1480, + "type": "image" + }, + "is_subscribed_comments": false, + "can_subscribe_comments": false, + "subscribed_comments_notifications": false, + "publish_date_changed": false, + "use_excerpt": false, + "capabilities": { + "publish_post": false, + "delete_post": false, + "edit_post": false + }, + "is_jetpack": false, + "feed_item_ID": 5814633562, + "views": null, + "is_following_conversation": false + }, + { + "ID": 80970, + "site_ID": 3584907, + "author": { + "ID": 52095937, + "login": "ndiego", + "email": false, + "name": "Nick Diego", + "first_name": "Nick", + "last_name": "Diego", + "nice_name": "ndiego", + "URL": "https://nickdiego.com", + "avatar_URL": "https://2.gravatar.com/avatar/5d499534bfc21eaf9fa55506d50ffa01881d9a6cba58935552d3a8ac45944c29?s=96&d=retro", + "profile_URL": "https://gravatar.com/ndiego", + "site_ID": 217371925, + "has_avatar": true, + "wpcom_id": 52095937, + "wpcom_login": "ndiego" + }, + "date": "2025-09-23T19:44:07+00:00", + "modified": "2025-09-23T19:44:13+00:00", + "title": "Telex Turns Everyone into a WordPress Block Developer", + "URL": "http://en.blog.wordpress.com/2025/09/23/telex-turns-everyone-into-a-wordpress-block-developer/", + "short_URL": "https://wp.me/pf2B5-l3Y", + "content": "
\n

As a WordPress developer for more than a decade, I’ve built numerous WordPress blocks, ranging from simple callouts and icon blocks to multi-block forms and slideshows. The process can be demanding and requires a solid grasp of how WordPress works under the hood, as well as familiarity with React, JavaScript, PHP, and other relevant technologies.

\n\n\n\n

Scaffolding tools like WordPress’s create-block help. Modern AI code editors, such as Cursor, and assistants like Claude Code, also speed things up. With the right setup and context, you can abstract away much of the complexity. The catch is that you still need to provide the AI with WordPress-specific context and wire everything together. That’s fine for developers, but it keeps the barrier high for everyone else.

\n\n\n\n

What if you could skip that complexity entirely? That’s where Telex comes in.

\n\n\n\n
\"The
\n\n\n\n

What is Telex?

\n\n\n\n

Telex is an experimental tool from the Automattic AI team that turns natural-language prompts into working WordPress blocks. You simply describe what you want, and Telex generates the block. 

\n\n\n\n

Everyone can use Telex, from:

\n\n\n\n
    \n
  • \nSite owners who want custom functionality tailored to their site or who want to experiment with a new idea.
  • \n\n\n\n
  • \nAgencies and freelancers who need quick prototypes or small utility blocks for client projects.
  • \n\n\n\n
  • \nDevelopers who want fast scaffolding in a real WordPress context and code they can refine.
  • \n\n\n\n
  • \nAspiring developers who learn best by seeing a working example and reading the code behind it.
  • \n
\n\n\n\n

Under the hood, Telex packages your block as a single block plugin and previews the result in your browser, all powered by WordPress Playground. There’s no local setup. You can refine the block with short follow-up prompts or edit the code directly, then download the plugin and install it on a site when you’re ready. You can also share your work as a link.

\n\n\n\n

Since Telex is an experiment, results will vary and you may run into bugs and issues along the way. That’s part of the process. We’re learning where AI can remove friction in block creation and where it can be genuinely useful. It is also not an AI website builder. Think of it as an AI that helps you make small functional tools as blocks. 

\n\n\n\n

Telex is currently free to use and you can create as many blocks as you like. Give it a try now.

\n\n\n\n\n\n\n\n

How to build blocks with Telex

\n\n\n\n

Start by thinking about what you want to create. It could be a feature your site is missing or a playful idea to see what Telex can do. This is an experiment, so exploration is welcome. You can also check out one of the featured projects on the Telex homepage for inspiration.

\n\n\n\n

For this post, I’m stepping into the shoes of a food blogger. I have a chocolate chip cookie recipe to share, and I’d like to display an ingredient list that readers can scale up to 4 times. Readers should be able to check off ingredients as they go. There should also be a copy button on the frontend that copies the ingredient list to the clipboard. In the editor, I want to add ingredients in a simple table with three columns: quantity, unit, and ingredient. I should also be able to remove and reorder ingredients up or down in the table using buttons.

\n\n\n\n

I started by entering this prompt in Telex:

\n\n\n\n

Please build an Ingredient List block. This will display a list of ingredients (think food blog) that readers can check off. Add a copy button on the front end that copies the ingredient list to the clipboard. Include a built-in recipe scaler so readers can 2x, 3x, and 4x the recipe, updating ingredient quantities accordingly. In the editor, I need to enter ingredients in a table with three columns: quantity, unit, and ingredient. I should also be able to remove and reorder ingredients up or down in the table using buttons.

\n\n\n\n

I then clicked Build, and Telex got to work.

\n\n\n\n
\"The
\n\n\n\n

The more context you include in your initial prompt, the better. Still, don’t hesitate to try a quick prompt. You can spin up as many blocks as you want, even at the same time. Just open a new browser tab.

\n\n\n\n

In about two minutes, I had a working WordPress block with all the functionality I requested. Here’s a look at the Editor view with the ingredients for my recipe entered into the table. Notice the action buttons like I requested.

\n\n\n\n
\"Version
\n\n\n\n

The frontend delivered all the functionality immediately, though the styling needed some refinement. This is where additional prompts help to fine-tune things.

\n\n\n\n
\"Version
\n\n\n\n

I generally prefer a block to inherit my theme’s styles. I also wanted checked ingredients to show a strikethrough, and I wanted ingredient quantities formatted as whole numbers or fractions where possible. Finally, to add a bit of excitement, when the reader checks off all items, perhaps there’s a confetti animation.

\n\n\n\n

I handled each change with multiple short follow-up prompts:

\n\n\n\n

Let’s simplify the styling so this ingredient list inherits the current theme styles.

\n\n\n\n

On the front end, when a reader checks an ingredient, also apply a strikethrough.

\n\n\n\n

Convert ingredient quantities to whole numbers or fractions on the frontend where possible. No decimals, please.

\n\n\n\n

For fun, when a reader checks off all the items on the ingredients list, shower the screen with a confetti animation.

\n\n\n\n

I recommend giving Telex one task at a time in your follow-up prompts. After four iterations, one for each of the tasks above, my Ingredient List block looked like this: 

\n\n\n\n
\"The
\n\n\n\n

You can also modify the code directly, which is handy if you prefer to make quick, targeted changes. It’s also a great way to learn how the block is assembled.

\n\n\n\n

In my case, I wanted the scale buttons to look a bit different and to update the table in the Editor, so I switched to Code view and adjusted the style.scss and editor.scss files manually.

\n\n\n\n
\"The
\n\n\n\n

Here’s the final result. It took about 10 minutes to build in total:

\n\n\n\n\t\t
\n\t\t\t
\n
\n\t\t\t\n\t\t\t\n\t\t
\n\t\t\n\n\n

Note: Telex is not deterministic. If you try the prompts outlined in this post, expect slightly different results. No two builds will be exactly the same. 

\n\n\n\n

Of course I could have kept iterating. Perhaps add JSON-LD structured data to the ingredient list for search engine optimization, or the ability to convert the units to metric. The possibilities are endless.

\n\n\n\n

Once satisfied with your block, you have two options: use the Download button to get the plugin zip file, or click the Share button. The latter copies a unique link to your clipboard. Anyone with this link can view your block in Telex without needing to log in.

\n\n\n\n
\n
\"\"
\n
\n\n\n\n

Here’s the link to the block I built for this blog post: 

\n\n\n\n\n\n\n\n

If you click the preview link above, you’ll also be able to download the Ingredient List block as a zip file, just as if you had created the block yourself. You can then install it on any WordPress site that supports plugin uploads, or test it locally using WordPress Studio.

\n\n\n\n

Troubleshooting and known gaps

\n\n\n\n

Telex is experimental, so you may hit the occasional hiccup. Sometimes the AI makes a wrong assumption or generates code that does not run. This is common with all AI tools. If you see a warning like the one below, keep iterating. Ask Telex to fix the specific error or copy the details to a new prompt. Then describe the outcome you expect. You can ask as many follow-up questions as you like. If things get tangled, start a fresh session and restate your block requirements.

\n\n\n\n
\n
\"An
\n
\n\n\n\n

There are also many ways to build a block in WordPress, and part of this experiment is to identify areas that need improvement in Telex. For example, blocks that require inner blocks are not currently supported. A slideshow with a parent “Slideshow” block and child “Slide” blocks is a common use case, and Telex will struggle to implement it.

\n\n\n\n

If you run into a scenario where Telex repeatedly fails to complete your request, please let us know in the comments or share your feedback in the in-app feedback form. Sharing your prompt, the error message, and a brief description of what you were trying to build will help the team improve Telex.

\n\n\n\n
The \"Send us Feedback\" form in Telex.
\n\n\n\n

Keep iterating

\n\n\n\n

Telex is an early look at how AI can lower the barrier to block creation. We’ll keep improving it based on what you build and the feedback you share, so spin up a block, post your preview link, and tell us what worked and what didn’t.

\n\n\n\n

Some ideas we’re considering for the future include version history, visual descriptors to make your project list more visual, uploading and customizing existing blocks, and other improvements, whether big or small.

\n\n\n\n

Together, we can make WordPress block development faster, friendlier, and more accessible to everyone.

\n\n\n\n\n
", + "excerpt": "

WordPress block development usually requires advanced technical expertise. Telex changes that by letting you describe what you want and get a working block plugin instantly with prompts.

\n", + "slug": "telex-turns-everyone-into-a-wordpress-block-developer", + "guid": "https://en.blog.wordpress.com/?p=80970", + "status": "publish", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": false, + "ping_status": "closed", + "comment_count": 9 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": "247", + "i_like": true, + "is_reblogged": false, + "is_following": true, + "global_ID": "f2a5beba1b4f41e2876b4b47b3d39608", + "featured_image": "https://en-blog.files.wordpress.com/2025/09/blog-header403x.jpg", + "post_thumbnail": { + "ID": 81018, + "URL": "https://en-blog.files.wordpress.com/2025/09/blog-header403x.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/blog-header403x.jpg", + "mime_type": "image/jpeg", + "width": 2350, + "height": 1480 + }, + "format": "standard", + "tags": { + "AI Tools": { + "ID": 49112760, + "name": "AI Tools", + "slug": "ai-tools", + "description": "", + "post_count": 3, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/tags/slug:ai-tools", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/tags/slug:ai-tools/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907" + } + }, + "display_name": "ai-tools" + }, + "Block Development": { + "ID": 72831406, + "name": "Block Development", + "slug": "block-development", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/tags/slug:block-development", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/tags/slug:block-development/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907" + } + }, + "display_name": "block-development" + }, + "Telex": { + "ID": 525418, + "name": "Telex", + "slug": "telex", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/tags/slug:telex", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/tags/slug:telex/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907" + } + }, + "display_name": "telex" + }, + "WordPress Blocks": { + "ID": 667652910, + "name": "WordPress Blocks", + "slug": "wordpress-blocks", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/tags/slug:wordpress-blocks", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/tags/slug:wordpress-blocks/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907" + } + }, + "display_name": "wordpress-blocks" + } + }, + "categories": { + "News": { + "ID": 103, + "name": "News", + "slug": "news", + "description": "Stay informed with the latest updates, events, and announcements shaping the WordPress.com community and beyond.", + "post_count": 832, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/categories/slug:news", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/categories/slug:news/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907" + } + } + } + }, + "attachments": { + "81018": { + "ID": 81018, + "URL": "https://en-blog.files.wordpress.com/2025/09/blog-header403x.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/blog-header403x.jpg", + "date": "2025-09-23T18:02:24+00:00", + "post_ID": 80970, + "author_ID": 52095937, + "file": "blog-header403x.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "Blog header@3x", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/blog-header403x.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/blog-header403x.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/blog-header403x.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/blog-header403x.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/blog-header403x.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/blog-header403x.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/blog-header403x.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/blog-header403x.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/blog-header403x.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/blog-header403x.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/blog-header403x.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/blog-header403x.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/blog-header403x.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/blog-header403x.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/blog-header403x.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/blog-header403x.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/blog-header403x.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/blog-header403x.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/blog-header403x.jpg?w=1200" + }, + "height": 1480, + "width": 2350, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81018", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81018/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/80970" + } + } + }, + "81000": { + "ID": 81000, + "URL": "https://en-blog.files.wordpress.com/2025/09/telex-block-feedback.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/telex-block-feedback.jpg", + "date": "2025-09-23T14:02:35+00:00", + "post_ID": 80970, + "author_ID": 52095937, + "file": "telex-block-feedback.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "telex-block-feedback", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/telex-block-feedback.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/telex-block-feedback.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/telex-block-feedback.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/telex-block-feedback.jpg?w=1200&h=868&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/telex-block-feedback.jpg?w=900&h=868&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/telex-block-feedback.jpg?w=1200&h=868&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/telex-block-feedback.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/telex-block-feedback.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/telex-block-feedback.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-block-feedback.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-block-feedback.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-block-feedback.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/telex-block-feedback.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/telex-block-feedback.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/telex-block-feedback.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-block-feedback.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-block-feedback.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-block-feedback.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/telex-block-feedback.jpg?w=1200" + }, + "height": 868, + "width": 2400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81000", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/81000/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/80970" + } + } + }, + "80993": { + "ID": 80993, + "URL": "https://en-blog.files.wordpress.com/2025/09/telex-error.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/telex-error.jpg", + "date": "2025-09-23T13:57:10+00:00", + "post_ID": 80970, + "author_ID": 52095937, + "file": "telex-error.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "telex-error", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/telex-error.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/telex-error.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/telex-error.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/telex-error.jpg?w=1200&h=640&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/telex-error.jpg?w=900&h=640&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/telex-error.jpg?w=1200&h=640&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/telex-error.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/telex-error.jpg?w=600&h=640&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/telex-error.jpg?w=800&h=640&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-error.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-error.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-error.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/telex-error.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/telex-error.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/telex-error.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-error.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-error.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-error.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/telex-error.jpg?w=1200" + }, + "height": 640, + "width": 1440, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80993", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80993/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/80970" + } + } + }, + "80990": { + "ID": 80990, + "URL": "https://en-blog.files.wordpress.com/2025/09/telex-share-download.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/telex-share-download.jpg", + "date": "2025-09-23T13:54:36+00:00", + "post_ID": 80970, + "author_ID": 52095937, + "file": "telex-share-download.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "telex-share-download", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/telex-share-download.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/telex-share-download.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/telex-share-download.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/telex-share-download.jpg?w=1200&h=800&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/telex-share-download.jpg?w=900&h=800&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/telex-share-download.jpg?w=1200&h=800&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/telex-share-download.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/telex-share-download.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/telex-share-download.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-share-download.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-share-download.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-share-download.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/telex-share-download.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/telex-share-download.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/telex-share-download.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-share-download.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-share-download.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-share-download.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/telex-share-download.jpg?w=1200" + }, + "height": 800, + "width": 1440, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80990", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80990/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/80970" + } + } + }, + "80986": { + "ID": 80986, + "URL": "https://en-blog.files.wordpress.com/2025/09/telex-code-editor.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/telex-code-editor.jpg", + "date": "2025-09-23T13:50:52+00:00", + "post_ID": 80970, + "author_ID": 52095937, + "file": "telex-code-editor.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "telex-code-editor", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/telex-code-editor.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/telex-code-editor.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/telex-code-editor.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/telex-code-editor.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/telex-code-editor.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/telex-code-editor.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/telex-code-editor.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/telex-code-editor.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/telex-code-editor.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-code-editor.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-code-editor.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-code-editor.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/telex-code-editor.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/telex-code-editor.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/telex-code-editor.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-code-editor.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-code-editor.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-code-editor.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/telex-code-editor.jpg?w=1200" + }, + "height": 1222, + "width": 1800, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80986", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80986/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/80970" + } + } + }, + "80985": { + "ID": 80985, + "URL": "https://en-blog.files.wordpress.com/2025/09/telex-block-finished.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/telex-block-finished.jpg", + "date": "2025-09-23T13:50:00+00:00", + "post_ID": 80970, + "author_ID": 52095937, + "file": "telex-block-finished.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "telex-block-finished", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/telex-block-finished.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/telex-block-finished.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/telex-block-finished.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/telex-block-finished.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/telex-block-finished.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/telex-block-finished.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/telex-block-finished.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/telex-block-finished.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/telex-block-finished.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-block-finished.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-block-finished.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-block-finished.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/telex-block-finished.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/telex-block-finished.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/telex-block-finished.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-block-finished.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-block-finished.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-block-finished.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/telex-block-finished.jpg?w=1200" + }, + "height": 1774, + "width": 2400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80985", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80985/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/80970" + } + } + }, + "80979": { + "ID": 80979, + "URL": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1-front.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/telex-block-v1-front.jpg", + "date": "2025-09-23T13:45:40+00:00", + "post_ID": 80970, + "author_ID": 52095937, + "file": "telex-block-v1-front.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "telex-block-v1-front", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1-front.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1-front.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1-front.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1-front.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1-front.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1-front.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1-front.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1-front.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1-front.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1-front.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1-front.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1-front.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1-front.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1-front.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1-front.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1-front.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1-front.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1-front.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1-front.jpg?w=1200" + }, + "height": 1774, + "width": 2400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80979", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80979/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/80970" + } + } + }, + "80977": { + "ID": 80977, + "URL": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/telex-block-v1.jpg", + "date": "2025-09-23T13:44:48+00:00", + "post_ID": 80970, + "author_ID": 52095937, + "file": "telex-block-v1.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "telex-block-v1", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/telex-block-v1.jpg?w=1200" + }, + "height": 1774, + "width": 2400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80977", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80977/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/80970" + } + } + }, + "80975": { + "ID": 80975, + "URL": "https://en-blog.files.wordpress.com/2025/09/telex-start.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/telex-start.jpg", + "date": "2025-09-23T13:44:08+00:00", + "post_ID": 80970, + "author_ID": 52095937, + "file": "telex-start.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "telex-start", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/telex-start.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/telex-start.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/telex-start.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/telex-start.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/telex-start.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/telex-start.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/telex-start.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/telex-start.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/telex-start.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-start.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-start.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-start.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/telex-start.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/telex-start.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/telex-start.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-start.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-start.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-start.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/telex-start.jpg?w=1200" + }, + "height": 1774, + "width": 2400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80975", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80975/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/80970" + } + } + }, + "80972": { + "ID": 80972, + "URL": "https://en-blog.files.wordpress.com/2025/09/telex-main.jpg", + "guid": "http://en.blog.files.wordpress.com/2025/09/telex-main.jpg", + "date": "2025-09-23T13:41:48+00:00", + "post_ID": 80970, + "author_ID": 52095937, + "file": "telex-main.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "telex-main", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://en-blog.files.wordpress.com/2025/09/telex-main.jpg?w=150", + "medium": "https://en-blog.files.wordpress.com/2025/09/telex-main.jpg?w=300", + "large": "https://en-blog.files.wordpress.com/2025/09/telex-main.jpg?w=1024", + "newspack-article-block-landscape-large": "https://en-blog.files.wordpress.com/2025/09/telex-main.jpg?w=1200&h=900&crop=1", + "newspack-article-block-portrait-large": "https://en-blog.files.wordpress.com/2025/09/telex-main.jpg?w=900&h=1200&crop=1", + "newspack-article-block-square-large": "https://en-blog.files.wordpress.com/2025/09/telex-main.jpg?w=1200&h=1200&crop=1", + "newspack-article-block-landscape-medium": "https://en-blog.files.wordpress.com/2025/09/telex-main.jpg?w=800&h=600&crop=1", + "newspack-article-block-portrait-medium": "https://en-blog.files.wordpress.com/2025/09/telex-main.jpg?w=600&h=800&crop=1", + "newspack-article-block-square-medium": "https://en-blog.files.wordpress.com/2025/09/telex-main.jpg?w=800&h=800&crop=1", + "newspack-article-block-landscape-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-main.jpg?w=600&h=450&crop=1", + "newspack-article-block-portrait-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-main.jpg?w=450&h=600&crop=1", + "newspack-article-block-square-intermediate": "https://en-blog.files.wordpress.com/2025/09/telex-main.jpg?w=600&h=600&crop=1", + "newspack-article-block-landscape-small": "https://en-blog.files.wordpress.com/2025/09/telex-main.jpg?w=400&h=300&crop=1", + "newspack-article-block-portrait-small": "https://en-blog.files.wordpress.com/2025/09/telex-main.jpg?w=300&h=400&crop=1", + "newspack-article-block-square-small": "https://en-blog.files.wordpress.com/2025/09/telex-main.jpg?w=400&h=400&crop=1", + "newspack-article-block-landscape-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-main.jpg?w=200&h=150&crop=1", + "newspack-article-block-portrait-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-main.jpg?w=150&h=200&crop=1", + "newspack-article-block-square-tiny": "https://en-blog.files.wordpress.com/2025/09/telex-main.jpg?w=200&h=200&crop=1", + "newspack-article-block-uncropped": "https://en-blog.files.wordpress.com/2025/09/telex-main.jpg?w=1200" + }, + "height": 1744, + "width": 2400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [] + }, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80972", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/media/80972/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "parent": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/80970" + } + } + } + }, + "attachment_count": 10, + "metadata": [], + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/read/sites/3584907/posts/80970", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/posts/80970/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "replies": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/posts/80970/replies/", + "likes": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/posts/80970/likes/" + }, + "data": { + "site": { + "ID": 3584907, + "name": "WordPress.com News", + "description": "The latest news on WordPress.com and the WordPress community.", + "URL": "http://en.blog.wordpress.com", + "jetpack": false, + "jetpack_connection": false, + "post_count": 1992, + "subscribers_count": 120400779, + "locale": "en", + "logo": { + "id": 0, + "sizes": [], + "url": "" + }, + "visible": true, + "is_private": false, + "is_coming_soon": false, + "is_following": true, + "organization_id": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/help", + "posts": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/posts/", + "comments": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/comments/", + "xmlrpc": "https://en.blog.wordpress.com/xmlrpc.php" + } + }, + "launch_status": false, + "site_migration": { + "is_complete": false, + "in_progress": false + }, + "is_fse_active": false, + "is_fse_eligible": false, + "is_core_site_editor_enabled": false, + "is_wpcom_atomic": false, + "is_wpcom_staging_site": false, + "is_deleted": false, + "is_a4a_client": false, + "is_a4a_dev_site": false + } + } + }, + "feed_ID": 25823, + "feed_URL": "http://en.blog.wordpress.com", + "pseudo_ID": "f2a5beba1b4f41e2876b4b47b3d39608", + "is_external": false, + "site_name": "WordPress.com News", + "site_URL": "http://en.blog.wordpress.com", + "site_is_private": false, + "site_icon": [], + "featured_media": { + "uri": "https://en-blog.files.wordpress.com/2025/09/blog-header403x.jpg", + "width": 2350, + "height": 1480, + "type": "image" + }, + "is_subscribed_comments": false, + "can_subscribe_comments": false, + "subscribed_comments_notifications": false, + "publish_date_changed": false, + "use_excerpt": false, + "capabilities": { + "publish_post": false, + "delete_post": false, + "edit_post": false + }, + "is_jetpack": false, + "feed_item_ID": 5812493984, + "views": null, + "is_following_conversation": true + } + ] + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } + } + \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/reader_like_post.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/reader_like_post.json new file mode 100644 index 000000000000..a109ca8180c3 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/reader_like_post.json @@ -0,0 +1,51 @@ +{ + "scenarioName": "reader_like_post_flow", + "requiredScenarioState": "initial_likes_list", + "newScenarioState": "post_liked", + "request": { + "method": "POST", + "urlPath": "/rest/v1.1/sites/70135762/posts/125073/likes/new", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "success": true, + "i_like": true, + "like_count": 1, + "site_ID": 70135762, + "post_ID": 125073, + "meta": { + "links": { + "help": "https://public-api.wordpress.com/rest/v1.1/sites/70135762/posts/125073/likes/new/help", + "post": "https://public-api.wordpress.com/rest/v1.1/sites/70135762/posts/125073", + "site": "https://public-api.wordpress.com/rest/v1.1/sites/70135762" + } + }, + "liker": { + "ID": 152748359, + "login": "e2eflowtestingmobile", + "email": "e2eflowtestingmobile@example.com", + "name": "e2eflowtestingmobile", + "first_name": "", + "last_name": "", + "nice_name": "e2eflowtestingmobile", + "URL": "https://infocusphotographers.com", + "avatar_URL": "https://0.gravatar.com/avatar/9c0a19481e160f45c5e7d77576c91310f902d9cd321aedc33253b8a801bd9f48?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/c0a1e46923d6e5d6da20e746a7bfd1bc", + "ip_address": "192.0.0.1", + "site_visible": true, + "default_avatar": true + } + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/reader_likes_tab_after.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/reader_likes_tab_after.json new file mode 100644 index 000000000000..580476bb5f12 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/reader_likes_tab_after.json @@ -0,0 +1,573 @@ +{ + "scenarioName": "reader_like_post_flow", + "requiredScenarioState": "post_liked", + "newScenarioState": "new_likes_list", + "request": { + "method": "GET", + "urlPath": "/rest/v1.2/read/liked", + "queryParameters": { + "locale": { + "matches": "(.*)" + }, + "before": { + "matches": "(.*)" + }, + "meta": { + "matches": "(.*)" + }, + "number": { + "matches": "(.*)" + }, + "order": { + "matches": "DESC" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "date_range": { + "before": "(.*)", + "after": "(.*)" + }, + "number": 1, + "posts": [ + { + "ID": 125073, + "site_ID": 70135762, + "author": { + "ID": 7867135, + "login": "aarongilbreath", + "email": false, + "name": "Aaron Gilbreath", + "first_name": "Aaron", + "last_name": "Gilbreath", + "nice_name": "aarongilbreath", + "URL": "", + "avatar_URL": "https://2.gravatar.com/avatar/e1203cef7aae3855fc3935404fc9f739?s=96&d=identicon&r=G", + "profile_URL": "http://en.gravatar.com/aarongilbreath", + "site_ID": 7575556, + "has_avatar": true + }, + "date": "2019-05-23T13:00:09+00:00", + "modified": "2019-05-22T16:44:11-04:00", + "title": "Optimizing Meat 2.0", + "URL": "http://longreads.com/2019/05/23/optimizing-meat-2-0/", + "short_URL": "https://wp.me/p4KhvY-wxj", + "content": "

The most impossible sounding thing about the Impossible Burger isn’t the idea of a delicious meatless protein — some of us have been eating delicious meat substitutes for years — it’s hearing people talk about this food product in terms of scalability, optics, engineering, and “manufacturable prototypes.” The future has arrived, and it tastes better than it sounds. Chris Ip writes for Engadget about the brief history, challenges, and ambitions of Impossible Foods’ meat-free technology, and how its success relates to a planet that’s warming partly because of industrial beef production.

\n

“Ethical consumerism is a failure and doesn’t really accomplish what we want it to accomplish,” said Michael Selden, CEO and founder of Finless Foods, a cell-based seafood startup. “What you need to do is create things that are ethical and moral as a baseline but make them compete on metrics of taste, price and convenience, which is what people actually buy food on, and Impossible has really embodied that.”

\n

There’s a comparison to sustainable energy here: We all need it and we’re barely willing to curtail our electricity demands, but if there’s a price-competitive, clean alternative, then sure. With food, it’s an acknowledgement that — solely for the guaranteed sensory enjoyment that those who are food secure might enjoy each day — taste is the key driver to change our habits.

\n

This leaves Impossible in a nice position. The global economic demand for meat combined with the swelling cultural-political urgency to curtail it could be great for business if you have a legitimate alternative. And the high-risk-high-reward venture capital system demands startups that can pitch themselves as limitlessly scalable. A worldwide problem of this degree means that Impossible can plausibly — and not disingenuously — bridge both a business goal of sky’s-the-limit growth and a messianic narrative. Brown’s social mission aligns with his profit-seeking obligation in ways that can make as much sense to private equity as to Katy Perry.

\n

Read the story

\n", + "excerpt": "

Can Impossible Foods’ meat facsimiles save us from our carnivorous appetites?

\n", + "slug": "optimizing-meat-2-0", + "guid": "http://longreads.com/?p=125073", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": false, + "comment_status": "closed", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 35, + "i_like": true, + "is_reblogged": false, + "is_following": true, + "global_ID": "06ab8cb0a8b05a409928d97bcbf022e0", + "featured_image": "https://longreadsblog.files.wordpress.com/2019/05/ap_19093580335314.jpg", + "post_thumbnail": { + "ID": 125103, + "URL": "https://longreadsblog.files.wordpress.com/2019/05/ap_19093580335314.jpg", + "guid": "http://longreadsblog.files.wordpress.com/2019/05/ap_19093580335314.jpg", + "mime_type": "image/jpeg", + "width": 6000, + "height": 4000 + }, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "culture": { + "ID": 1098, + "name": "culture", + "slug": "culture", + "description": "", + "post_count": 88, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/categories/slug:culture", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/categories/slug:culture/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "Editor's Pick": { + "ID": 259543, + "name": "Editor's Pick", + "slug": "editors-pick", + "description": "", + "post_count": 1395, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/categories/slug:editors-pick", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/categories/slug:editors-pick/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "Food": { + "ID": 586, + "name": "Food", + "slug": "food", + "description": "", + "post_count": 95, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/categories/slug:food", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/categories/slug:food/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "Nonfiction": { + "ID": 35009777, + "name": "Nonfiction", + "slug": "nonfiction", + "description": "", + "post_count": 3803, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/categories/slug:nonfiction", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/categories/slug:nonfiction/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "Quotes": { + "ID": 28016040, + "name": "Quotes", + "slug": "quotes", + "description": "", + "post_count": 2544, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/categories/slug:quotes", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/categories/slug:quotes/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + } + }, + "post_tag": { + "Chris Ip": { + "ID": 89063115, + "name": "Chris Ip", + "slug": "chris-ip", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:chris-ip", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:chris-ip/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "Engadget": { + "ID": 70021, + "name": "Engadget", + "slug": "engadget", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:engadget", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:engadget/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "fake meat": { + "ID": 506195, + "name": "fake meat", + "slug": "fake-meat", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:fake-meat", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:fake-meat/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "food technology": { + "ID": 1272213, + "name": "food technology", + "slug": "food-technology", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:food-technology", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:food-technology/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "food writing": { + "ID": 93032, + "name": "food writing", + "slug": "food-writing", + "description": "", + "post_count": 30, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:food-writing", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:food-writing/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "meat industry": { + "ID": 231639, + "name": "meat industry", + "slug": "meat-industry", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:meat-industry", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:meat-industry/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + } + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + "Chris Ip": { + "ID": 89063115, + "name": "Chris Ip", + "slug": "chris-ip", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:chris-ip", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:chris-ip/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + }, + "display_name": "chris-ip" + }, + "Engadget": { + "ID": 70021, + "name": "Engadget", + "slug": "engadget", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:engadget", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:engadget/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + }, + "display_name": "engadget" + }, + "fake meat": { + "ID": 506195, + "name": "fake meat", + "slug": "fake-meat", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:fake-meat", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:fake-meat/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + }, + "display_name": "fake-meat" + }, + "food technology": { + "ID": 1272213, + "name": "food technology", + "slug": "food-technology", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:food-technology", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:food-technology/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + }, + "display_name": "food-technology" + }, + "food writing": { + "ID": 93032, + "name": "food writing", + "slug": "food-writing", + "description": "", + "post_count": 30, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:food-writing", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:food-writing/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + }, + "display_name": "food-writing" + }, + "meat industry": { + "ID": 231639, + "name": "meat industry", + "slug": "meat-industry", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:meat-industry", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:meat-industry/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + }, + "display_name": "meat-industry" + } + }, + "categories": { + "culture": { + "ID": 1098, + "name": "culture", + "slug": "culture", + "description": "", + "post_count": 88, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/categories/slug:culture", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/categories/slug:culture/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "Editor's Pick": { + "ID": 259543, + "name": "Editor's Pick", + "slug": "editors-pick", + "description": "", + "post_count": 1395, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/categories/slug:editors-pick", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/categories/slug:editors-pick/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "Food": { + "ID": 586, + "name": "Food", + "slug": "food", + "description": "", + "post_count": 95, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/categories/slug:food", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/categories/slug:food/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "Nonfiction": { + "ID": 35009777, + "name": "Nonfiction", + "slug": "nonfiction", + "description": "", + "post_count": 3803, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/categories/slug:nonfiction", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/categories/slug:nonfiction/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "Quotes": { + "ID": 28016040, + "name": "Quotes", + "slug": "quotes", + "description": "", + "post_count": 2544, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/categories/slug:quotes", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/categories/slug:quotes/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + } + }, + "attachments": { + "125103": { + "ID": 125103, + "URL": "https://longreadsblog.files.wordpress.com/2019/05/ap_19093580335314.jpg", + "guid": "http://longreadsblog.files.wordpress.com/2019/05/ap_19093580335314.jpg", + "date": "2019-05-22T15:59:07-04:00", + "post_ID": 125073, + "author_ID": 7867135, + "file": "ap_19093580335314.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "The New Meat", + "caption": "AP Photo/Nati Harnik", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://longreadsblog.files.wordpress.com/2019/05/ap_19093580335314.jpg?w=150", + "medium": "https://longreadsblog.files.wordpress.com/2019/05/ap_19093580335314.jpg?w=300", + "large": "https://longreadsblog.files.wordpress.com/2019/05/ap_19093580335314.jpg?w=1024" + }, + "height": 4000, + "width": 6000, + "exif": { + "aperture": "10", + "credit": "AP", + "camera": "ILCE-7M3", + "caption": "FILE- This Jan. 11, 2019, file photo shows the Impossible Burger, a plant-based burger containing wheat protein, coconut oil and potato protein among it's ingredients in Bellevue, Neb. From soy-based sliders to ground lentil sausages, plant-based meat substitutes are surging in popularity. Growing demand for healthier, more sustainable food is one reason people are seeking plant-based meats. (AP Photo/Nati Harnik, File)", + "created_timestamp": "1547234932", + "copyright": "Copyright 2019 The Associated Press. All rights reserved", + "focal_length": "50", + "iso": "800", + "shutter_speed": "0.01", + "title": "The New Meat", + "orientation": "1", + "keywords": [ + "faux meat;fake meat;vegan" + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/media/125103", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/media/125103/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/posts/125073" + } + } + } + }, + "attachment_count": 1, + "metadata": [ + { + "id": "463770", + "key": "geo_public", + "value": "0" + }, + { + "id": "463900", + "key": "_thumbnail_id", + "value": "125103" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/posts/125073", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/posts/125073/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/posts/125073/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/posts/125073/likes/" + }, + "data": { + "site": { + "ID": 70135762, + "name": "Longreads", + "description": "The best longform stories on the web", + "URL": "http://longreads.com", + "jetpack": false, + "post_count": 6794, + "subscribers_count": 41078065, + "locale": "en", + "icon": { + "img": "https://secure.gravatar.com/blavatar/e68667ec6ee7cdd0c6b5416a84c52a9c", + "ico": "https://secure.gravatar.com/blavatar/e68667ec6ee7cdd0c6b5416a84c52a9c" + }, + "logo": { + "id": 0, + "sizes": [ + + ], + "url": "" + }, + "visible": true, + "is_private": false, + "is_following": true, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/help", + "posts": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/posts/", + "comments": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/comments/", + "xmlrpc": "https://longreadsblog.wordpress.com/xmlrpc.php" + } + } + } + } + }, + "capabilities": { + "publish_post": false, + "delete_post": false, + "edit_post": false + }, + "other_URLs": { + }, + "pseudo_ID": "06ab8cb0a8b05a409928d97bcbf022e0", + "is_external": false, + "site_name": "Longreads", + "site_URL": "http://longreads.com", + "site_is_private": false, + "featured_media": { + "uri": "https://longreadsblog.files.wordpress.com/2019/05/ap_19093580335314.jpg", + "width": 6000, + "height": 4000, + "type": "image" + }, + "feed_ID": 22973954, + "feed_URL": "http://longreads.com", + "is_jetpack": false, + "use_excerpt": false, + "feed_item_ID": 2286928700, + "word_count": 327, + "is_following_conversation": false + } + ] + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/reader_likes_tab_before.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/reader_likes_tab_before.json new file mode 100644 index 000000000000..602576e05bb5 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/reader_likes_tab_before.json @@ -0,0 +1,42 @@ +{ + "scenarioName": "reader_like_post_flow", + "requiredScenarioState": "Started", + "newScenarioState": "initial_likes_list", + "request": { + "method": "GET", + "urlPath": "/rest/v1.2/read/liked", + "queryParameters": { + "locale": { + "matches": "(.*)" + }, + "before": { + "matches": "(.*)" + }, + "meta": { + "matches": "(.*)" + }, + "number": { + "matches": "(.*)" + }, + "order": { + "matches": "DESC" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "date_range": { + "before": "(.*)", + "after": "(.*)" + }, + "number": 0, + "posts": [] + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/reader_tags.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/reader_tags.json new file mode 100644 index 000000000000..872f61e9bc7d --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/reader_tags.json @@ -0,0 +1,353 @@ +{ + "request": { + "method": "GET", + "urlPath": "/wpcom/v2/read/tags/posts", + "queryParameters": { + "tags[]": { + "matches": "(.*)" + }, + "_locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "success": true, + "tags": [ + "{{lookup request.query 'tags[]'}}" + ], + "sort": "date", + "lang": "en", + "page": 1, + "posts": [ + { + "ID": 12345, + "site_ID": 67890, + "author": { + "ID": 54321, + "login": "user123", + "email": false, + "name": "John Doe", + "first_name": "John", + "last_name": "Doe", + "nice_name": "user123", + "URL": "http://example.com", + "avatar_URL": "https://example.com/avatar.jpg", + "profile_URL": "https://example.com/user123", + "site_ID": 98765, + "has_avatar": true + }, + "date": "2023-08-21T22:31:06-04:00", + "modified": "2023-08-19T22:32:37-04:00", + "title": "Sustainability and Investment Trends", + "URL": "https://example.com/article/sustainability-investment-trends", + "short_URL": "https://example.com/shortlink", + "content": "
\n

Today, significant capital is shifting towards sustainable ventures. This is not just a large-scale trend; it signifies a shift in the financial landscape. Leading asset and wealth management firms are witnessing a profound redistribution of investments towards sustainability.

\n\n

By the year 2022, a forecast by a well-known advisory firm predicts that a significant percentage of institutional investors will exclusively engage with ESG (Environmental, Social, and Governance) products. The growth of ESG fund assets is expected to play a substantial role in the European fund landscape, reaching trillions in assets.

\n\n

While Europe currently leads in ESG assets, the American market presents an opportunity of around $120 trillion.

\n\n\n\n

Facedrive, a multi-vertical tech company with an ESG focus, has emerged as a prominent player, making strides in various industries across North America.

\n\n

These trends emphasize the importance of sustainability and its integration into financial strategies. The tech industry giants such as Facebook, Microsoft, Google, and Apple are also actively contributing to sustainability efforts.

\n
", + "excerpt": "

Today, significant capital is shifting towards sustainable ventures. This is not just a large-scale trend; it signifies a shift in the financial landscape. Leading asset and wealth management firms are witnessing a profound redistribution of investments towards sustainability.

", + "slug": "sustainability-and-investment-trends", + "guid": "https://example.com/article/12345", + "status": "publish", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": false, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5", + "featured_image": "https://infocusphotographers.files.wordpress.com/2019/02/adult-band-concert-995301.jpg", + "post_thumbnail": { + "ID": 1234, + "URL": "https://example.com/images/thumbnail.jpg", + "guid": "http://example.com/images/thumbnail.jpg", + "mime_type": "image/jpeg", + "width": 800, + "height": 600 + }, + "format": "standard", + "tags": { + "{{capitalize (lookup request.query 'tags[]')}}": { + "ID": 2290, + "name": "{{lookup request.query 'tags[]'}}", + "slug": "{{lookup request.query 'tags[]'}}", + "description": "", + "post_count": 24, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/categories/slug:architecture", + "help": "https://public-api.wordpress.com/rest/v/sites/181977606/categories/slug:architecture/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181977606" + } + } + } + }, + "categories": { + "Architecture": { + "ID": 2290, + "name": "Architecture", + "slug": "architecture", + "description": "", + "post_count": 24, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/categories/slug:architecture", + "help": "https://public-api.wordpress.com/rest/v/sites/181977606/categories/slug:architecture/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181977606" + } + } + }, + "Civilization": { + "ID": 3268, + "name": "Civilization", + "slug": "civilization", + "description": "", + "post_count": 56, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/categories/slug:civilization", + "help": "https://public-api.wordpress.com/rest/v/sites/181977606/categories/slug:civilization/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181977606" + } + } + }, + "Culture": { + "ID": 1098, + "name": "Culture", + "slug": "culture", + "description": "", + "post_count": 51, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/categories/slug:culture", + "help": "https://public-api.wordpress.com/rest/v/sites/181977606/categories/slug:culture/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181977606" + } + } + }, + "Featured": { + "ID": 35890, + "name": "Featured", + "slug": "featured", + "description": "", + "post_count": 60, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/categories/slug:featured", + "help": "https://public-api.wordpress.com/rest/v/sites/181977606/categories/slug:featured/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181977606" + } + } + }, + "Future": { + "ID": 2850, + "name": "Future", + "slug": "future", + "description": "", + "post_count": 23, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/categories/slug:future", + "help": "https://public-api.wordpress.com/rest/v/sites/181977606/categories/slug:future/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181977606" + } + } + }, + "Global Warming": { + "ID": 18880, + "name": "Global Warming", + "slug": "global-warming", + "description": "", + "post_count": 61, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/categories/slug:global-warming", + "help": "https://public-api.wordpress.com/rest/v/sites/181977606/categories/slug:global-warming/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181977606" + } + } + }, + "Greenhouse Gas": { + "ID": 228993, + "name": "Greenhouse Gas", + "slug": "greenhouse-gas", + "description": "", + "post_count": 68, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/154612013/categories/slug:greenhouse-gas", + "help": "https://public-api.wordpress.com/rest/v/sites/154612013/categories/slug:greenhouse-gas/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/154612013" + } + } + }, + "Human Engineering": { + "ID": 3140291, + "name": "Human Engineering", + "slug": "human-engineering", + "description": "", + "post_count": 24, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/categories/slug:human-engineering", + "help": "https://public-api.wordpress.com/rest/v/sites/181977606/categories/slug:human-engineering/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181977606" + } + } + }, + "Nature": { + "ID": 1099, + "name": "Nature", + "slug": "nature", + "description": "", + "post_count": 178, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/categories/slug:nature", + "help": "https://public-api.wordpress.com/rest/v/sites/181977606/categories/slug:nature/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181977606" + } + } + }, + "News": { + "ID": 103, + "name": "News", + "slug": "news", + "description": "", + "post_count": 197, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/categories/slug:news", + "help": "https://public-api.wordpress.com/rest/v/sites/181977606/categories/slug:news/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181977606" + } + } + }, + "Tourism": { + "ID": 9826, + "name": "Tourism", + "slug": "tourism", + "description": "", + "post_count": 80, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/154612013/categories/slug:tourism", + "help": "https://public-api.wordpress.com/rest/v/sites/154612013/categories/slug:tourism/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/154612013" + } + } + }, + "Travel": { + "ID": 200, + "name": "Travel", + "slug": "travel", + "description": "", + "post_count": 72, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/154612013/categories/slug:travel", + "help": "https://public-api.wordpress.com/rest/v/sites/154612013/categories/slug:travel/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/154612013" + } + } + }, + "USA": { + "ID": 699, + "name": "USA", + "slug": "usa", + "description": "", + "post_count": 31, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/categories/slug:usa", + "help": "https://public-api.wordpress.com/rest/v/sites/181977606/categories/slug:usa/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181977606" + } + } + }, + "WEF": { + "ID": 651891, + "name": "WEF", + "slug": "wef", + "description": "", + "post_count": 1, + "parent": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/154612013/categories/slug:wef", + "help": "https://public-api.wordpress.com/rest/v/sites/154612013/categories/slug:wef/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/154612013" + } + } + } + }, + "attachments": {}, + "attachment_count": 0, + "metadata": [], + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/read/sites/181977606/posts/6335", + "help": "https://public-api.wordpress.com/rest/v/sites/181977606/posts/6335/help", + "site": "https://public-api.wordpress.com/rest/v1.2/sites/181977606", + "replies": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/posts/6335/replies/", + "likes": "https://public-api.wordpress.com/rest/v/sites/181977606/posts/6335/likes/" + } + }, + "feed_ID": 12345678, + "feed_URL": "http://example-feed.com", + "pseudo_ID": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5", + "is_external": false, + "site_name": "Example Feed Site", + "site_URL": "https://example-feed.com", + "site_is_private": false, + "featured_media": { + "uri": "https://infocusphotographers.files.wordpress.com/2019/02/adult-band-concert-995301.jpg", + "width": 800, + "height": 600, + "type": "image" + }, + "is_subscribed_comments": false, + "can_subscribe_comments": true, + "subscribed_comments_notifications": false, + "use_excerpt": false, + "capabilities": { + "publish_post": false, + "delete_post": false, + "edit_post": false + } + } + ], + "next_page_handle": null, + "date_range": { + "before": "2023-08-21T22:44:57-04:00", + "after": "2023-08-22T09:02:11+08:00" + } + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/reader_tags_follow.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/reader_tags_follow.json new file mode 100644 index 000000000000..5dfc47d22eee --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/reader_tags_follow.json @@ -0,0 +1,36 @@ +{ + "request": { + "method": "POST", + "urlPathPattern": "/rest/v1.1/read/tags/([^/]+)/mine/new", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "subscribed": true, + "tags": [ + { + "ID": "123", + "slug": "{{request.pathSegments.[4]}}", + "title": "{{capitalize request.pathSegments.[4]}}", + "display_name": "{{request.pathSegments.[4]}}", + "description": null, + "URL": "https://public-api.wordpress.com/rest/v1.1/read/tags/{{request.pathSegments.[4]}}/posts" + } + ], + "added_tag": "123" + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + }, + "transformers": [ + "response-template" + ] + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v11_read_following_mine.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v11_read_following_mine.json new file mode 100644 index 000000000000..4cc39150b80c --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v11_read_following_mine.json @@ -0,0 +1,307 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/rest/v1.(1|2)/read/following/mine.*" + }, + "response": { + "status": 200, + "jsonBody": { + "subscriptions": [ + { + "ID": "788578957", + "blog_ID": "182890486", + "feed_ID": "143967848", + "URL": "http://automattic.design", + "date_subscribed": "2024-11-13T13:27:45+00:00", + "delivery_methods": { + "notification": { + "send_posts": false + } + }, + "name": "Automattic Design", + "organization_id": 0, + "unseen_count": 0, + "last_updated": "2025-09-22T15:28:55+00:00", + "site_icon": "https://a8cdesignsimple.wordpress.com/wp-content/uploads/2024/09/a8c-design-site-icon-2024.png?w=96", + "is_owner": false, + "meta": { + "links": { + "site": "https://public-api.wordpress.com/rest/v1.2/read/sites/182890486", + "feed": "https://public-api.wordpress.com/rest/v1.1/read/feed/143967848" + }, + "data": { + "site": { + "ID": 182890486, + "name": "Automattic Design", + "description": "Designing a better web", + "URL": "http://automattic.design", + "jetpack": false, + "jetpack_connection": false, + "post_count": 541, + "subscribers_count": 6978, + "lang": "en", + "icon": { + "img": "https://a8cdesignsimple.wordpress.com/wp-content/uploads/2024/09/a8c-design-site-icon-2024.png?w=96", + "ico": "https://a8cdesignsimple.wordpress.com/wp-content/uploads/2024/09/a8c-design-site-icon-2024.png?w=96" + }, + "logo": { + "id": "25306", + "sizes": [], + "url": "https://a8cdesignsimple.wordpress.com/wp-content/uploads/2025/06/automattic-logo.svg" + }, + "visible": true, + "is_private": false, + "is_coming_soon": false, + "is_following": true, + "organization_id": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/182890486", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/182890486/help", + "posts": "https://public-api.wordpress.com/rest/v1.2/sites/182890486/posts/", + "comments": "https://public-api.wordpress.com/rest/v1.1/sites/182890486/comments/", + "xmlrpc": "https://a8cdesignsimple.wordpress.com/xmlrpc.php" + } + }, + "launch_status": "launched", + "site_migration": { + "is_complete": false, + "in_progress": false + }, + "is_fse_active": false, + "is_fse_eligible": false, + "is_core_site_editor_enabled": true, + "is_wpcom_atomic": false, + "is_wpcom_staging_site": false, + "is_deleted": false, + "is_a4a_client": false, + "is_a4a_dev_site": false, + "capabilities": { + "edit_pages": false, + "edit_posts": false, + "edit_others_posts": false, + "edit_theme_options": false, + "list_users": false, + "manage_categories": false, + "manage_options": false, + "publish_posts": false, + "upload_files": false, + "view_stats": false + }, + "is_multi_author": true, + "feed_ID": 143967848, + "feed_URL": "http://automattic.design", + "header_image": false, + "owner": { + "ID": 26957695, + "login": "a8cuser", + "name": "a8cuser", + "first_name": "", + "last_name": "", + "nice_name": "a8cuser", + "URL": "", + "avatar_URL": "https://1.gravatar.com/avatar/48e997e4a437d5002ae4c1eff741b37c2f4e1cad14d45f173ae78c25a0c41a38?s=96&d=identicon&r=G", + "profile_URL": "https://gravatar.com/a8cuser", + "ip_address": false, + "site_visible": false, + "has_avatar": true + }, + "subscription": { + "delivery_methods": { + "email": null, + "notification": { + "send_posts": false + } + } + }, + "is_blocked": false, + "unseen_count": 0 + }, + "feed": { + "blog_ID": "182890486", + "feed_ID": "143967848", + "blog_owner": { + "ID": 26957695, + "name": "a8cuser" + }, + "name": "Automattic Design", + "URL": "http://automattic.design/", + "feed_URL": "http://automattic.design", + "subscribers_count": 6978, + "is_following": true, + "last_update": "2025-09-22T15:28:55+00:00", + "last_checked": "2025-09-22T15:29:01+00:00", + "marked_for_refresh": false, + "next_refresh_time": null, + "organization_id": 0, + "subscription_id": "788578957", + "unseen_count": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/read/feed/143967848", + "site": "https://public-api.wordpress.com/rest/v1.1/read/sites/182890486" + } + }, + "image": "https://a8cdesignsimple.files.wordpress.com/2024/09/a8c-design-site-icon-2024.png?w=32", + "description": "Designing a better web" + } + } + }, + "is_wpforteams_site": false, + "is_paid_subscription": false, + "is_rss": false, + "is_gift": false + }, + { + "ID": "785513750", + "blog_ID": "3584907", + "feed_ID": "25823", + "URL": "http://en.blog.wordpress.com", + "date_subscribed": "2024-10-11T20:14:36+00:00", + "delivery_methods": { + "notification": { + "send_posts": false + } + }, + "name": "WordPress.com News", + "organization_id": 0, + "unseen_count": 0, + "last_updated": "2025-09-30T21:13:09+00:00", + "site_icon": null, + "is_owner": false, + "meta": { + "links": { + "site": "https://public-api.wordpress.com/rest/v1.2/read/sites/3584907", + "feed": "https://public-api.wordpress.com/rest/v1.1/read/feed/25823" + }, + "data": { + "site": { + "ID": 3584907, + "name": "WordPress.com News", + "description": "The latest news on WordPress.com and the WordPress community.", + "URL": "http://en.blog.wordpress.com", + "jetpack": false, + "jetpack_connection": false, + "post_count": 1992, + "subscribers_count": 120400870, + "lang": "en", + "logo": { + "id": 0, + "sizes": [], + "url": "" + }, + "visible": true, + "is_private": false, + "is_coming_soon": false, + "is_following": true, + "organization_id": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.2/sites/3584907", + "help": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/help", + "posts": "https://public-api.wordpress.com/rest/v1.2/sites/3584907/posts/", + "comments": "https://public-api.wordpress.com/rest/v1.1/sites/3584907/comments/", + "xmlrpc": "https://en.blog.wordpress.com/xmlrpc.php" + } + }, + "launch_status": false, + "site_migration": { + "is_complete": false, + "in_progress": false + }, + "is_fse_active": false, + "is_fse_eligible": false, + "is_core_site_editor_enabled": false, + "is_wpcom_atomic": false, + "is_wpcom_staging_site": false, + "is_deleted": false, + "is_a4a_client": false, + "is_a4a_dev_site": false, + "capabilities": { + "edit_pages": false, + "edit_posts": false, + "edit_others_posts": false, + "edit_theme_options": false, + "list_users": false, + "manage_categories": false, + "manage_options": false, + "publish_posts": false, + "upload_files": false, + "view_stats": false + }, + "is_multi_author": true, + "feed_ID": 25823, + "feed_URL": "http://en.blog.wordpress.com", + "header_image": false, + "owner": { + "ID": 26957695, + "login": "a8cuser", + "name": "a8cuser", + "first_name": "", + "last_name": "", + "nice_name": "a8cuser", + "URL": "", + "avatar_URL": "https://1.gravatar.com/avatar/48e997e4a437d5002ae4c1eff741b37c2f4e1cad14d45f173ae78c25a0c41a38?s=96&d=retro", + "profile_URL": "https://gravatar.com/a8cuser", + "ip_address": false, + "site_visible": false, + "has_avatar": true + }, + "subscription": { + "delivery_methods": { + "email": null, + "notification": { + "send_posts": false + } + } + }, + "is_blocked": false, + "unseen_count": 0 + }, + "feed": { + "blog_ID": "3584907", + "feed_ID": "25823", + "blog_owner": { + "ID": 26957695, + "name": "a8cuser" + }, + "name": "WordPress.com News", + "URL": "http://en.blog.wordpress.com/", + "feed_URL": "http://en.blog.wordpress.com", + "subscribers_count": 120400870, + "is_following": true, + "last_update": "2025-09-30T21:13:09+00:00", + "last_checked": "2025-09-30T21:24:37+00:00", + "marked_for_refresh": false, + "next_refresh_time": null, + "organization_id": 0, + "subscription_id": "785513750", + "unseen_count": 0, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/read/feed/25823", + "site": "https://public-api.wordpress.com/rest/v1.1/read/sites/3584907" + } + }, + "image": "http://s0.wp.com/i/buttonw-com.png", + "description": "The latest news on WordPress.com and the WordPress community." + } + } + }, + "is_wpforteams_site": false, + "is_paid_subscription": false, + "is_rss": false, + "is_gift": false + } + ], + "page": 1, + "number": 2, + "total_subscriptions": 2 + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v12_read_following.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v12_read_following.json new file mode 100644 index 000000000000..341524469e27 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v12_read_following.json @@ -0,0 +1,1484 @@ +{ + "scenarioName": "reader_subscriptions_flow", + "requiredScenarioState": "Started", + "newScenarioState": "initial_subscriptions_list", + "request": { + "method": "GET", + "urlPath": "/rest/v1.2/read/following" + }, + "response": { + "status": 200, + "jsonBody": { + "date_range": { + "before": "2019-05-23T13:00:09+00:00", + "after": "2021-05-17T16:34:44+00:00" + }, + "number": 3, + "posts": [ + { + "ID": 125073, + "site_ID": 70135762, + "author": { + "ID": 7867135, + "login": "aarongilbreath", + "email": false, + "name": "Aaron Gilbreath", + "first_name": "Aaron", + "last_name": "Gilbreath", + "nice_name": "aarongilbreath", + "URL": "", + "avatar_URL": "https://2.gravatar.com/avatar/e1203cef7aae3855fc3935404fc9f739?s=96&d=identicon&r=G", + "profile_URL": "http://en.gravatar.com/aarongilbreath", + "site_ID": 7575556, + "has_avatar": true + }, + "date": "2019-05-23T13:00:09+00:00", + "modified": "2019-05-22T16:44:11-04:00", + "title": "Optimizing Meat 2.0", + "URL": "http://longreads.com/2019/05/23/optimizing-meat-2-0/", + "short_URL": "https://wp.me/p4KhvY-wxj", + "content": "

The most impossible sounding thing about the Impossible Burger isn’t the idea of a delicious meatless protein — some of us have been eating delicious meat substitutes for years — it’s hearing people talk about this food product in terms of scalability, optics, engineering, and “manufacturable prototypes.” The future has arrived, and it tastes better than it sounds. Chris Ip writes for Engadget about the brief history, challenges, and ambitions of Impossible Foods’ meat-free technology, and how its success relates to a planet that’s warming partly because of industrial beef production.

\n

“Ethical consumerism is a failure and doesn’t really accomplish what we want it to accomplish,” said Michael Selden, CEO and founder of Finless Foods, a cell-based seafood startup. “What you need to do is create things that are ethical and moral as a baseline but make them compete on metrics of taste, price and convenience, which is what people actually buy food on, and Impossible has really embodied that.”

\n

There’s a comparison to sustainable energy here: We all need it and we’re barely willing to curtail our electricity demands, but if there’s a price-competitive, clean alternative, then sure. With food, it’s an acknowledgement that — solely for the guaranteed sensory enjoyment that those who are food secure might enjoy each day — taste is the key driver to change our habits.

\n

This leaves Impossible in a nice position. The global economic demand for meat combined with the swelling cultural-political urgency to curtail it could be great for business if you have a legitimate alternative. And the high-risk-high-reward venture capital system demands startups that can pitch themselves as limitlessly scalable. A worldwide problem of this degree means that Impossible can plausibly — and not disingenuously — bridge both a business goal of sky’s-the-limit growth and a messianic narrative. Brown’s social mission aligns with his profit-seeking obligation in ways that can make as much sense to private equity as to Katy Perry.

\n

Read the story

\n", + "excerpt": "

Can Impossible Foods’ meat facsimiles save us from our carnivorous appetites?

\n", + "slug": "optimizing-meat-2-0", + "guid": "http://longreads.com/?p=125073", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": false, + "comment_status": "closed", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 34, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "06ab8cb0a8b05a409928d97bcbf022e0", + "featured_image": "https://longreadsblog.files.wordpress.com/2019/05/ap_19093580335314.jpg", + "post_thumbnail": { + "ID": 125103, + "URL": "https://longreadsblog.files.wordpress.com/2019/05/ap_19093580335314.jpg", + "guid": "http://longreadsblog.files.wordpress.com/2019/05/ap_19093580335314.jpg", + "mime_type": "image/jpeg", + "width": 6000, + "height": 4000 + }, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "culture": { + "ID": 1098, + "name": "culture", + "slug": "culture", + "description": "", + "post_count": 88, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/categories/slug:culture", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/categories/slug:culture/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "Editor's Pick": { + "ID": 259543, + "name": "Editor's Pick", + "slug": "editors-pick", + "description": "", + "post_count": 1395, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/categories/slug:editors-pick", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/categories/slug:editors-pick/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "Food": { + "ID": 586, + "name": "Food", + "slug": "food", + "description": "", + "post_count": 95, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/categories/slug:food", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/categories/slug:food/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "Nonfiction": { + "ID": 35009777, + "name": "Nonfiction", + "slug": "nonfiction", + "description": "", + "post_count": 3803, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/categories/slug:nonfiction", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/categories/slug:nonfiction/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "Quotes": { + "ID": 28016040, + "name": "Quotes", + "slug": "quotes", + "description": "", + "post_count": 2544, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/categories/slug:quotes", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/categories/slug:quotes/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + } + }, + "post_tag": { + "Chris Ip": { + "ID": 89063115, + "name": "Chris Ip", + "slug": "chris-ip", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:chris-ip", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:chris-ip/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "Engadget": { + "ID": 70021, + "name": "Engadget", + "slug": "engadget", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:engadget", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:engadget/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "fake meat": { + "ID": 506195, + "name": "fake meat", + "slug": "fake-meat", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:fake-meat", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:fake-meat/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "food technology": { + "ID": 1272213, + "name": "food technology", + "slug": "food-technology", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:food-technology", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:food-technology/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "food writing": { + "ID": 93032, + "name": "food writing", + "slug": "food-writing", + "description": "", + "post_count": 30, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:food-writing", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:food-writing/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "meat industry": { + "ID": 231639, + "name": "meat industry", + "slug": "meat-industry", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:meat-industry", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:meat-industry/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + } + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + "Chris Ip": { + "ID": 89063115, + "name": "Chris Ip", + "slug": "chris-ip", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:chris-ip", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:chris-ip/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + }, + "display_name": "chris-ip" + }, + "Engadget": { + "ID": 70021, + "name": "Engadget", + "slug": "engadget", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:engadget", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:engadget/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + }, + "display_name": "engadget" + }, + "fake meat": { + "ID": 506195, + "name": "fake meat", + "slug": "fake-meat", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:fake-meat", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:fake-meat/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + }, + "display_name": "fake-meat" + }, + "food technology": { + "ID": 1272213, + "name": "food technology", + "slug": "food-technology", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:food-technology", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:food-technology/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + }, + "display_name": "food-technology" + }, + "food writing": { + "ID": 93032, + "name": "food writing", + "slug": "food-writing", + "description": "", + "post_count": 30, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:food-writing", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:food-writing/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + }, + "display_name": "food-writing" + }, + "meat industry": { + "ID": 231639, + "name": "meat industry", + "slug": "meat-industry", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/tags/slug:meat-industry", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/tags/slug:meat-industry/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + }, + "display_name": "meat-industry" + } + }, + "categories": { + "culture": { + "ID": 1098, + "name": "culture", + "slug": "culture", + "description": "", + "post_count": 88, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/categories/slug:culture", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/categories/slug:culture/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "Editor's Pick": { + "ID": 259543, + "name": "Editor's Pick", + "slug": "editors-pick", + "description": "", + "post_count": 1395, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/categories/slug:editors-pick", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/categories/slug:editors-pick/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "Food": { + "ID": 586, + "name": "Food", + "slug": "food", + "description": "", + "post_count": 95, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/categories/slug:food", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/categories/slug:food/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "Nonfiction": { + "ID": 35009777, + "name": "Nonfiction", + "slug": "nonfiction", + "description": "", + "post_count": 3803, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/categories/slug:nonfiction", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/categories/slug:nonfiction/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + }, + "Quotes": { + "ID": 28016040, + "name": "Quotes", + "slug": "quotes", + "description": "", + "post_count": 2544, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/categories/slug:quotes", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/categories/slug:quotes/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762" + } + } + } + }, + "attachments": { + "125103": { + "ID": 125103, + "URL": "https://longreadsblog.files.wordpress.com/2019/05/ap_19093580335314.jpg", + "guid": "http://longreadsblog.files.wordpress.com/2019/05/ap_19093580335314.jpg", + "date": "2019-05-22T15:59:07-04:00", + "post_ID": 125073, + "author_ID": 7867135, + "file": "ap_19093580335314.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "The New Meat", + "caption": "AP Photo/Nati Harnik", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://longreadsblog.files.wordpress.com/2019/05/ap_19093580335314.jpg?w=150", + "medium": "https://longreadsblog.files.wordpress.com/2019/05/ap_19093580335314.jpg?w=300", + "large": "https://longreadsblog.files.wordpress.com/2019/05/ap_19093580335314.jpg?w=1024" + }, + "height": 4000, + "width": 6000, + "exif": { + "aperture": "10", + "credit": "AP", + "camera": "ILCE-7M3", + "caption": "FILE- This Jan. 11, 2019, file photo shows the Impossible Burger, a plant-based burger containing wheat protein, coconut oil and potato protein among it's ingredients in Bellevue, Neb. From soy-based sliders to ground lentil sausages, plant-based meat substitutes are surging in popularity. Growing demand for healthier, more sustainable food is one reason people are seeking plant-based meats. (AP Photo/Nati Harnik, File)", + "created_timestamp": "1547234932", + "copyright": "Copyright 2019 The Associated Press. All rights reserved", + "focal_length": "50", + "iso": "800", + "shutter_speed": "0.01", + "title": "The New Meat", + "orientation": "1", + "keywords": [ + "faux meat;fake meat;vegan" + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/media/125103", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/media/125103/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/posts/125073" + } + } + } + }, + "attachment_count": 1, + "metadata": [ + { + "id": "463770", + "key": "geo_public", + "value": "0" + }, + { + "id": "463900", + "key": "_thumbnail_id", + "value": "125103" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/posts/125073", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/posts/125073/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/posts/125073/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/posts/125073/likes/" + }, + "data": { + "site": { + "ID": 70135762, + "name": "Longreads", + "description": "The best longform stories on the web", + "URL": "http://longreads.com", + "jetpack": false, + "post_count": 6794, + "subscribers_count": 41078065, + "locale": "en", + "icon": { + "img": "https://secure.gravatar.com/blavatar/e68667ec6ee7cdd0c6b5416a84c52a9c", + "ico": "https://secure.gravatar.com/blavatar/e68667ec6ee7cdd0c6b5416a84c52a9c" + }, + "logo": { + "id": 0, + "sizes": [ + + ], + "url": "" + }, + "visible": true, + "is_private": false, + "is_following": true, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/help", + "posts": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/70135762/posts/", + "comments": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/70135762/comments/", + "xmlrpc": "https://longreadsblog.wordpress.com/xmlrpc.php" + } + } + } + } + }, + "capabilities": { + "publish_post": false, + "delete_post": false, + "edit_post": false + }, + "other_URLs": { + }, + "pseudo_ID": "06ab8cb0a8b05a409928d97bcbf022e0", + "is_external": false, + "site_name": "Longreads", + "site_URL": "http://longreads.com", + "site_is_private": false, + "featured_media": { + "uri": "https://longreadsblog.files.wordpress.com/2019/05/ap_19093580335314.jpg", + "width": 6000, + "height": 4000, + "type": "image" + }, + "feed_ID": 22973954, + "feed_URL": "http://longreads.com", + "is_jetpack": false, + "use_excerpt": false, + "feed_item_ID": 2286928700, + "word_count": 327, + "is_following_conversation": false + }, + { + "ID": 441, + "site_ID": 106707880, + "author": { + "ID": 152748359, + "login": "e2eflowtestingmobile", + "email": false, + "name": "e2eflowtestingmobile", + "first_name": "", + "last_name": "", + "nice_name": "e2eflowtestingmobile", + "URL": "http://e2eflowtestingmobile.wordpress.com", + "avatar_URL": "https://1.gravatar.com/avatar/7a4015c11be6a342f65e0e169092d402?s=96&d=identicon&r=G", + "profile_URL": "http://en.gravatar.com/e2eflowtestingmobile", + "site_ID": 106707880, + "has_avatar": false + }, + "date": "2019-05-23T12:48:28+00:00", + "modified": "2019-05-23T12:48:28+00:00", + "title": "Dolor Sit Elit", + "URL": "https://e2eflowtestingmobile.wordpress.com/2019/05/23/dolor-sit-elit/", + "short_URL": "https://wp.me/paIC9Y-77", + "content": "\n

Proin dictum non ligula aliquam varius. Nam congue efficitur leo eget porta. Nam congue efficitur leo eget porta. Nam congue efficitur leo eget porta.

\n\n\n\n
\"\"
\n", + "excerpt": "

Proin dictum non ligula aliquam varius. Nam congue efficitur leo eget porta. Nam congue efficitur leo eget porta. Nam congue efficitur leo eget porta.

\n", + "slug": "dolor-sit-elit", + "guid": "https://e2eflowtestingmobile.wordpress.com/2019/05/23/dolor-sit-elit/", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "3a68b6b54d7e3f2fb5f69904c4039c49", + "featured_image": "https://e2eflowtestingmobile.files.wordpress.com/2019/05/test-image-device-photo-gps-7.jpg", + "post_thumbnail": { + "ID": 440, + "URL": "https://e2eflowtestingmobile.files.wordpress.com/2019/05/test-image-device-photo-gps-7.jpg", + "guid": "http://e2eflowtestingmobile.files.wordpress.com/2019/05/test-image-device-photo-gps-7.jpg", + "mime_type": "image/jpeg", + "width": 1024, + "height": 768 + }, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "iOS Test": { + "ID": 43134051, + "name": "iOS Test", + "slug": "ios-test", + "description": "", + "post_count": 58, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:ios-test", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:ios-test/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "post_tag": { + "tag 2019-05-23 01:47:54271": { + "ID": 680249593, + "name": "tag 2019-05-23 01:47:54271", + "slug": "tag-2019-05-23-014754271", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/tags/slug:tag-2019-05-23-014754271", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/tags/slug:tag-2019-05-23-014754271/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + "tag 2019-05-23 01:47:54271": { + "ID": 680249593, + "name": "tag 2019-05-23 01:47:54271", + "slug": "tag-2019-05-23-014754271", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/tags/slug:tag-2019-05-23-014754271", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/tags/slug:tag-2019-05-23-014754271/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + }, + "display_name": "tag-2019-05-23-014754271" + } + }, + "categories": { + "iOS Test": { + "ID": 43134051, + "name": "iOS Test", + "slug": "ios-test", + "description": "", + "post_count": 58, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:ios-test", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:ios-test/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "attachments": { + "440": { + "ID": 440, + "URL": "https://e2eflowtestingmobile.files.wordpress.com/2019/05/test-image-device-photo-gps-7.jpg", + "guid": "http://e2eflowtestingmobile.files.wordpress.com/2019/05/test-image-device-photo-gps-7.jpg", + "date": "2019-05-23T12:48:14+00:00", + "post_ID": 441, + "author_ID": 152748359, + "file": "test-image-device-photo-gps-7.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "test-image-device-photo-gps", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://e2eflowtestingmobile.files.wordpress.com/2019/05/test-image-device-photo-gps-7.jpg?w=150", + "medium": "https://e2eflowtestingmobile.files.wordpress.com/2019/05/test-image-device-photo-gps-7.jpg?w=300", + "large": "https://e2eflowtestingmobile.files.wordpress.com/2019/05/test-image-device-photo-gps-7.jpg?w=1024" + }, + "height": 768, + "width": 1024, + "exif": { + "aperture": "2.2", + "credit": "", + "camera": "iPhone 6 Plus", + "caption": "", + "created_timestamp": "1438604307", + "copyright": "", + "focal_length": "4.15", + "iso": "32", + "shutter_speed": "0.00055586436909394", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/media/440", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/media/440/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/441" + } + } + } + }, + "attachment_count": 1, + "metadata": [ + { + "id": "3496", + "key": "jabber_published", + "value": "1558615709" + }, + { + "id": "3507", + "key": "timeline_notification", + "value": "1558615711" + }, + { + "id": "3501", + "key": "_thumbnail_id", + "value": "440" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/441", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/posts/441/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/441/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/441/likes/" + }, + "data": { + "site": { + "ID": 106707880, + "name": "Mobile E2E Testing", + "description": "", + "URL": "https://e2eflowtestingmobile.wordpress.com", + "capabilities": { + "edit_pages": true, + "edit_posts": true, + "edit_others_posts": true, + "edit_others_pages": true, + "delete_posts": true, + "delete_others_posts": true, + "edit_theme_options": true, + "edit_users": false, + "list_users": true, + "manage_categories": true, + "manage_options": true, + "moderate_comments": true, + "activate_wordads": true, + "promote_users": true, + "publish_posts": true, + "upload_files": true, + "delete_users": false, + "remove_users": true, + "view_stats": true + }, + "jetpack": false, + "is_multisite": true, + "post_count": 261, + "subscribers_count": 1, + "locale": "en", + "logo": { + "id": 0, + "sizes": [ + + ], + "url": "" + }, + "visible": true, + "is_private": false, + "single_user_site": true, + "is_vip": false, + "is_following": true, + "options": { + "timezone": "", + "gmt_offset": 0, + "blog_public": 1, + "videopress_enabled": false, + "upgraded_filetypes_enabled": false, + "login_url": "https://e2eflowtestingmobile.wordpress.com/wp-login.php", + "admin_url": "https://e2eflowtestingmobile.wordpress.com/wp-admin/", + "is_mapped_domain": false, + "is_redirect": false, + "unmapped_url": "https://e2eflowtestingmobile.wordpress.com", + "featured_images_enabled": false, + "theme_slug": "pub/independent-publisher-2", + "header_image": false, + "background_color": false, + "image_default_link_type": "none", + "image_thumbnail_width": 150, + "image_thumbnail_height": 150, + "image_thumbnail_crop": 0, + "image_medium_width": 300, + "image_medium_height": 300, + "image_large_width": 1024, + "image_large_height": 1024, + "permalink_structure": "/%year%/%monthnum%/%day%/%postname%/", + "post_formats": [ + + ], + "default_post_format": "standard", + "default_category": 1, + "allowed_file_types": [ + "jpg", + "jpeg", + "png", + "gif", + "pdf", + "doc", + "ppt", + "odt", + "pptx", + "docx", + "pps", + "ppsx", + "xls", + "xlsx", + "key" + ], + "show_on_front": "posts", + "default_likes_enabled": true, + "default_sharing_status": true, + "default_comment_status": true, + "default_ping_status": true, + "software_version": "5.2.2-alpha-45377", + "created_at": "2019-02-14T09:49:46+00:00", + "wordads": false, + "publicize_permanently_disabled": false, + "frame_nonce": "4f06a891f5", + "jetpack_frame_nonce": "4f06a891f5", + "headstart": false, + "headstart_is_fresh": false, + "ak_vp_bundle_enabled": null, + "advanced_seo_front_page_description": "", + "advanced_seo_title_formats": [ + + ], + "verification_services_codes": null, + "podcasting_archive": null, + "is_domain_only": false, + "is_automated_transfer": false, + "is_wpcom_atomic": false, + "is_wpcom_store": false, + "woocommerce_is_active": false, + "design_type": "blog", + "site_goals": null, + "site_segment": null + }, + "plan": { + "product_id": 1, + "product_slug": "free_plan", + "product_name_short": "Free", + "expired": false, + "user_is_owner": false, + "is_free": true, + "features": { + "active": [ + "free-blog", + "space", + "support" + ], + "available": { + "free-blog": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "value_bundle-2y", + "business-bundle-2y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ], + "custom-domain": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "value_bundle-2y", + "business-bundle-2y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ], + "space": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "value_bundle-2y", + "business-bundle-2y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ], + "support": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "value_bundle-2y", + "business-bundle-2y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ], + "no-adverts/no-adverts.php": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ], + "custom-design": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ], + "videopress": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ], + "unlimited_themes": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ], + "live_support": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ], + "simple-payments": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ], + "premium-themes": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ], + "google-analytics": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ] + } + } + }, + "jetpack_modules": null, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/help", + "posts": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/posts/", + "comments": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/comments/", + "xmlrpc": "https://e2eflowtestingmobile.wordpress.com/xmlrpc.php" + } + }, + "quota": { + "space_allowed": 3221225472, + "space_used": 586919661, + "percent_used": 18.22038432583213, + "space_available": 2634305811 + } + } + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "other_URLs": { + }, + "pseudo_ID": "3a68b6b54d7e3f2fb5f69904c4039c49", + "is_external": false, + "site_name": "Mobile E2E Testing", + "site_URL": "https://e2eflowtestingmobile.wordpress.com", + "site_is_private": false, + "featured_media": { + "uri": "https://e2eflowtestingmobile.files.wordpress.com/2019/05/test-image-device-photo-gps-7.jpg", + "width": 1024, + "height": 768, + "type": "image" + }, + "feed_ID": 93780362, + "feed_URL": "http://e2eflowtestingmobile.wordpress.com", + "is_jetpack": false, + "use_excerpt": false, + "feed_item_ID": 2286909370, + "word_count": 23, + "is_following_conversation": true + }, + { + "ID": 439, + "site_ID": 106707880, + "author": { + "ID": 152748359, + "login": "e2eflowtestingmobile", + "email": false, + "name": "e2eflowtestingmobile", + "first_name": "", + "last_name": "", + "nice_name": "e2eflowtestingmobile", + "URL": "http://e2eflowtestingmobile.wordpress.com", + "avatar_URL": "https://1.gravatar.com/avatar/7a4015c11be6a342f65e0e169092d402?s=96&d=identicon&r=G", + "profile_URL": "http://en.gravatar.com/e2eflowtestingmobile", + "site_ID": 106707880, + "has_avatar": false + }, + "date": "2019-05-23T12:46:55+00:00", + "modified": "2019-05-23T12:46:55+00:00", + "title": "Sit Elit Adipiscing Elit Dolor Lorem", + "URL": "https://e2eflowtestingmobile.wordpress.com/2019/05/23/sit-elit-adipiscing-elit-dolor-lorem/", + "short_URL": "https://wp.me/paIC9Y-75", + "content": "\n

Aenean vehicula nunc in sapien rutrum, nec vehicula enim iaculis. Aenean vehicula nunc in sapien rutrum, nec vehicula enim iaculis. Proin dictum non ligula aliquam varius. Nam ornare accumsan ante, sollicitudin bibendum erat bibendum nec. Aenean vehicula nunc in sapien rutrum, nec vehicula enim iaculis.

\n", + "excerpt": "

Aenean vehicula nunc in sapien rutrum, nec vehicula enim iaculis. Aenean vehicula nunc in sapien rutrum, nec vehicula enim iaculis. Proin dictum non ligula aliquam varius. Nam ornare accumsan ante, sollicitudin bibendum erat bibendum nec. Aenean vehicula nunc in sapien rutrum, nec vehicula enim iaculis.

\n", + "slug": "sit-elit-adipiscing-elit-dolor-lorem", + "guid": "https://e2eflowtestingmobile.wordpress.com/2019/05/23/sit-elit-adipiscing-elit-dolor-lorem/", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 0, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "d0a5af2d4026b8326ef145c4986e9ecc", + "featured_image": "", + "post_thumbnail": null, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 196, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "post_tag": { + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": [ + + ], + "categories": { + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 196, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + { + "id": "3482", + "key": "jabber_published", + "value": "1558615616" + }, + { + "id": "3490", + "key": "timeline_notification", + "value": "1558615617" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/439", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/posts/439/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/439/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/439/likes/" + }, + "data": { + "site": { + "ID": 106707880, + "name": "Mobile E2E Testing", + "description": "", + "URL": "https://e2eflowtestingmobile.wordpress.com", + "capabilities": { + "edit_pages": true, + "edit_posts": true, + "edit_others_posts": true, + "edit_others_pages": true, + "delete_posts": true, + "delete_others_posts": true, + "edit_theme_options": true, + "edit_users": false, + "list_users": true, + "manage_categories": true, + "manage_options": true, + "moderate_comments": true, + "activate_wordads": true, + "promote_users": true, + "publish_posts": true, + "upload_files": true, + "delete_users": false, + "remove_users": true, + "view_stats": true + }, + "jetpack": false, + "is_multisite": true, + "post_count": 261, + "subscribers_count": 1, + "locale": "en", + "logo": { + "id": 0, + "sizes": [ + + ], + "url": "" + }, + "visible": true, + "is_private": false, + "single_user_site": true, + "is_vip": false, + "is_following": true, + "options": { + "timezone": "", + "gmt_offset": 0, + "blog_public": 1, + "videopress_enabled": false, + "upgraded_filetypes_enabled": false, + "login_url": "https://e2eflowtestingmobile.wordpress.com/wp-login.php", + "admin_url": "https://e2eflowtestingmobile.wordpress.com/wp-admin/", + "is_mapped_domain": false, + "is_redirect": false, + "unmapped_url": "https://e2eflowtestingmobile.wordpress.com", + "featured_images_enabled": false, + "theme_slug": "pub/independent-publisher-2", + "header_image": false, + "background_color": false, + "image_default_link_type": "none", + "image_thumbnail_width": 150, + "image_thumbnail_height": 150, + "image_thumbnail_crop": 0, + "image_medium_width": 300, + "image_medium_height": 300, + "image_large_width": 1024, + "image_large_height": 1024, + "permalink_structure": "/%year%/%monthnum%/%day%/%postname%/", + "post_formats": [ + + ], + "default_post_format": "standard", + "default_category": 1, + "allowed_file_types": [ + "jpg", + "jpeg", + "png", + "gif", + "pdf", + "doc", + "ppt", + "odt", + "pptx", + "docx", + "pps", + "ppsx", + "xls", + "xlsx", + "key" + ], + "show_on_front": "posts", + "default_likes_enabled": true, + "default_sharing_status": true, + "default_comment_status": true, + "default_ping_status": true, + "software_version": "5.2.2-alpha-45377", + "created_at": "2019-02-14T09:49:46+00:00", + "wordads": false, + "publicize_permanently_disabled": false, + "frame_nonce": "4f06a891f5", + "jetpack_frame_nonce": "4f06a891f5", + "headstart": false, + "headstart_is_fresh": false, + "ak_vp_bundle_enabled": null, + "advanced_seo_front_page_description": "", + "advanced_seo_title_formats": [ + + ], + "verification_services_codes": null, + "podcasting_archive": null, + "is_domain_only": false, + "is_automated_transfer": false, + "is_wpcom_atomic": false, + "is_wpcom_store": false, + "woocommerce_is_active": false, + "design_type": "blog", + "site_goals": null, + "site_segment": null + }, + "plan": { + "product_id": 1, + "product_slug": "free_plan", + "product_name_short": "Free", + "expired": false, + "user_is_owner": false, + "is_free": true, + "features": { + "active": [ + "free-blog", + "space", + "support" + ], + "available": { + "free-blog": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "value_bundle-2y", + "business-bundle-2y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ], + "custom-domain": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "value_bundle-2y", + "business-bundle-2y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ], + "space": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "value_bundle-2y", + "business-bundle-2y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ], + "support": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "value_bundle-2y", + "business-bundle-2y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ], + "no-adverts/no-adverts.php": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ], + "custom-design": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ], + "videopress": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ], + "unlimited_themes": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ], + "live_support": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ], + "simple-payments": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ], + "premium-themes": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ], + "google-analytics": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y" + ] + } + } + }, + "jetpack_modules": null, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/help", + "posts": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/106707880/posts/", + "comments": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/comments/", + "xmlrpc": "https://e2eflowtestingmobile.wordpress.com/xmlrpc.php" + } + }, + "quota": { + "space_allowed": 3221225472, + "space_used": 586919661, + "percent_used": 18.22038432583213, + "space_available": 2634305811 + } + } + } + }, + "capabilities": { + "publish_post": true, + "delete_post": true, + "edit_post": true + }, + "other_URLs": { + }, + "pseudo_ID": "d0a5af2d4026b8326ef145c4986e9ecc", + "is_external": false, + "site_name": "Mobile E2E Testing", + "site_URL": "https://e2eflowtestingmobile.wordpress.com", + "site_is_private": false, + "featured_media": { + }, + "feed_ID": 93780362, + "feed_URL": "http://e2eflowtestingmobile.wordpress.com", + "is_jetpack": false, + "use_excerpt": false, + "feed_item_ID": 2286906998, + "word_count": 44, + "is_following_conversation": true + } + ] + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v12_read_following_empty.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v12_read_following_empty.json new file mode 100644 index 000000000000..d7325366dc58 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v12_read_following_empty.json @@ -0,0 +1,26 @@ +{ + "scenarioName": "reader_subscriptions_flow", + "requiredScenarioState": "initial_subscriptions_list", + "newScenarioState": "empty_subscriptions_list", + "request": { + "method": "GET", + "urlPath": "/rest/v1.2/read/following" + }, + "response": { + "status": 200, + "jsonBody": { + "date_range": { + "before": "2019-05-23T13:00:09+00:00", + "after": "2021-05-17T16:34:44+00:00" + }, + "number": 0, + "posts": [ + ] + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v12_read_menu.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v12_read_menu.json new file mode 100644 index 000000000000..ba05ef634cbf --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v12_read_menu.json @@ -0,0 +1,226 @@ +{ + "request": { + "urlPath": "/rest/v1.2/read/menu", + "method": "GET" + }, + "response": { + "status": 200, + "jsonBody": { + "default": { + "following": { + "title": "Followed Sites", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/following" + }, + "discover": { + "title": "Discover", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/sites/53424024/posts" + }, + "liked": { + "title": "My Likes", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/liked" + } + }, + "subscribed": { + "436": { + "ID": "436", + "title": "Photography", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/photography/posts", + "slug": "photography", + "display_name": "photography", + "type": "tag" + } + }, + "recommended": { + "116": { + "ID": 116, + "title": "Religion", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/religion/posts", + "slug": "religion", + "display_name": "religion", + "type": "tag" + }, + "178": { + "ID": 178, + "title": "Books", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/books/posts", + "slug": "books", + "display_name": "books", + "type": "tag" + }, + "200": { + "ID": 200, + "title": "Travel", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/travel/posts", + "slug": "travel", + "display_name": "travel", + "type": "tag" + }, + "376": { + "ID": 376, + "title": "Humor", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/humor/posts", + "slug": "humor", + "display_name": "humor", + "type": "tag" + }, + "406": { + "ID": 406, + "title": "Family", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/family/posts", + "slug": "family", + "display_name": "family", + "type": "tag" + }, + "436": { + "ID": 436, + "title": "Photography", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/photography/posts", + "slug": "photography", + "display_name": "photography", + "type": "tag" + }, + "586": { + "ID": 586, + "title": "Food", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/food/posts", + "slug": "food", + "display_name": "food", + "type": "tag" + }, + "676": { + "ID": 676, + "title": "Websites", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/websites/posts", + "slug": "websites", + "display_name": "websites", + "type": "tag" + }, + "1098": { + "ID": 1098, + "title": "Culture", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/culture/posts", + "slug": "culture", + "display_name": "culture", + "type": "tag" + }, + "2806": { + "ID": 2806, + "title": "Art & Design", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/art-design/posts", + "slug": "art-design", + "display_name": "art-design", + "type": "tag" + }, + "3750": { + "ID": 3750, + "title": "Magazines", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/magazines/posts", + "slug": "magazines", + "display_name": "magazines", + "type": "tag" + }, + "13985": { + "ID": 13985, + "title": "Health & Wellness", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/health-wellness/posts", + "slug": "health-wellness", + "display_name": "health-wellness", + "type": "tag" + }, + "26879": { + "ID": 26879, + "title": "Portfolios", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/portfolios/posts", + "slug": "portfolios", + "display_name": "portfolios", + "type": "tag" + }, + "38881": { + "ID": 38881, + "title": "Science & Nature", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/science-nature/posts", + "slug": "science-nature", + "display_name": "science-nature", + "type": "tag" + }, + "84776": { + "ID": 84776, + "title": "News & Current Events", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/news-current-events/posts", + "slug": "news-current-events", + "display_name": "news-current-events", + "type": "tag" + }, + "258845": { + "ID": 258845, + "title": "Business & Technology", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/business-technology/posts", + "slug": "business-technology", + "display_name": "business-technology", + "type": "tag" + }, + "960817": { + "ID": 960817, + "title": "Fiction & Poetry", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/fiction-poetry/posts", + "slug": "fiction-poetry", + "display_name": "fiction-poetry", + "type": "tag" + }, + "998458": { + "ID": 998458, + "title": "Writing & Blogging", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/writing-blogging/posts", + "slug": "writing-blogging", + "display_name": "writing-blogging", + "type": "tag" + }, + "1446729": { + "ID": 1446729, + "title": "Sports & Gaming", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/sports-gaming/posts", + "slug": "sports-gaming", + "display_name": "sports-gaming", + "type": "tag" + }, + "10016773": { + "ID": 10016773, + "title": "Musings & Personal", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/musings-personal/posts", + "slug": "musings-personal", + "display_name": "musings-personal", + "type": "tag" + }, + "35328892": { + "ID": 35328892, + "title": "Longreads", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/longreads/posts", + "slug": "longreads", + "display_name": "longreads", + "type": "tag" + }, + "63611190": { + "ID": 63611190, + "title": "Crafts & Fashion", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/crafts-fashion/posts", + "slug": "crafts-fashion", + "display_name": "crafts-fashion", + "type": "tag" + }, + "87210105": { + "ID": 87210105, + "title": "Popular Culture & Entertainment", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/popular-culture-entertainment/posts", + "slug": "popular-culture-entertainment", + "display_name": "popular-culture-entertainment", + "type": "tag" + } + } + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v12_read_sites_discover.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v12_read_sites_discover.json new file mode 100644 index 000000000000..105d1b6257fd --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v12_read_sites_discover.json @@ -0,0 +1,88 @@ +{ + "request": { + "urlPattern": "/rest/v1.2/read/sites/53424024(/)?($|\\?.*)", + "method": "GET" + }, + "response": { + "status": 200, + "jsonBody": { + "ID": 53424024, + "name": "Discover", + "description": "A daily selection of the best content published on WordPress, collected for you by humans who love to read.", + "URL": "https://discover.wordpress.com", + "jetpack": false, + "post_count": 3620, + "subscribers_count": 35560543, + "lang": "en", + "icon": { + "img": "https://secure.gravatar.com/blavatar/c9e4e04719c81ca4936a63ea2dce6ace", + "ico": "https://secure.gravatar.com/blavatar/c9e4e04719c81ca4936a63ea2dce6ace" + }, + "logo": { + "id": 0, + "sizes": [ + + ], + "url": "" + }, + "visible": true, + "is_private": false, + "is_following": true, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/help", + "posts": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/posts/", + "comments": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/comments/", + "xmlrpc": "https://discover.wordpress.com/xmlrpc.php", + "featured": "{{request.requestLine.baseUrl}}/rest/v1.2/read/sites/53424024/featured" + } + }, + "launch_status": "launched", + "capabilities": { + "edit_pages": false, + "edit_posts": false, + "edit_others_posts": false, + "edit_theme_options": false, + "list_users": false, + "manage_categories": false, + "manage_options": false, + "publish_posts": false, + "upload_files": false, + "view_stats": false + }, + "is_multi_author": true, + "feed_ID": 41325786, + "feed_URL": "http://discover.wordpress.com", + "header_image": false, + "owner": { + "ID": 26957695, + "login": "a8cuser", + "name": "Automattic", + "first_name": "Automattic", + "last_name": "", + "nice_name": "a8cuser", + "URL": "", + "avatar_URL": "https://1.gravatar.com/avatar/a64c4a50f3f38f02cd27a9bfb3f11b62?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/a8cuser", + "ip_address": false, + "site_visible": true, + "has_avatar": true + }, + "subscription": { + "delivery_methods": { + "email": null, + "notification": { + "send_posts": false + } + } + }, + "is_blocked": false + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v12_read_sites_discover_posts.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v12_read_sites_discover_posts.json new file mode 100644 index 000000000000..baa805b51bda --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v12_read_sites_discover_posts.json @@ -0,0 +1,2431 @@ +{ + "request": { + "urlPattern": "/rest/v1.2/read/sites/53424024/posts(/)?($|\\?.*)", + "method": "GET" + }, + "response": { + "status": 200, + "jsonBody": { + "found": 10, + "posts": [ + { + "ID": 37222, + "site_ID": 53424024, + "author": { + "ID": 47411601, + "login": "benhuberman", + "email": false, + "name": "Ben Huberman", + "first_name": "Ben", + "last_name": "Huberman", + "nice_name": "benhuberman", + "URL": "https://benz.blog/", + "avatar_URL": "https://0.gravatar.com/avatar/663dcd498e8c5f255bfb230a7ba07678?s=96&d=identicon&r=G", + "profile_URL": "http://en.gravatar.com/benhuberman", + "site_ID": 122910962, + "has_avatar": true + }, + "date": "2019-05-27T09:00:17-04:00", + "modified": "2019-05-21T23:55:05-04:00", + "title": "Kelsey Montague Art", + "URL": "https://discover.wordpress.com/2019/05/27/kelsey-montague-art/", + "short_URL": "https://wp.me/p3Ca1O-9Gm", + "content": "

Explore mural artist Kelsey Montague’s work, stay up-to-date on her latest projects, and shop for prints on her Anything Is Possible-featured website. 

\r\n\r\n\r\n

\r\n", + "excerpt": "

Explore mural artist Kelsey Montague’s work, stay up-to-date on her latest projects, and shop for prints on her Anything Is Possible-featured website. 

\n", + "slug": "kelsey-montague-art", + "guid": "https://discover.wordpress.com/?p=37222", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": false, + "comment_status": "closed", + "pings_open": false, + "ping_status": "closed", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 33, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "b06fd6b4fd1b95644d71981f34f747f8", + "featured_image": "https://discover.files.wordpress.com/2019/05/img_3760.jpg", + "post_thumbnail": { + "ID": 37226, + "URL": "https://discover.files.wordpress.com/2019/05/img_3760.jpg", + "guid": "http://discover.files.wordpress.com/2019/05/img_3760.jpg", + "mime_type": "image/jpeg", + "width": 1280, + "height": 1706 + }, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Art": { + "ID": 177, + "name": "Art", + "slug": "art", + "description": "Artists' sites, powerful artwork in multiple genres in a variety of mediums, and news from the art world.", + "post_count": 370, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:art", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:art/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Culture": { + "ID": 1098, + "name": "Culture", + "slug": "culture", + "description": "A curated collection of WordPress sites on society, culture in all its forms, and diverse art forms from around the world.", + "post_count": 414, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:culture", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:culture/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Diversity": { + "ID": 47458, + "name": "Diversity", + "slug": "diversity", + "description": "Blogs, stories, and web projects that highlight activists working towards greater diversity in culture, politics, and the business world.", + "post_count": 131, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:diversity", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:diversity/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Feminism": { + "ID": 553, + "name": "Feminism", + "slug": "feminism", + "description": "Magazines, collaborative websites, and feminist blogs that cover important issues in politics, culture, diversity, and the fight for gender equality.", + "post_count": 99, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:feminism", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:feminism/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Inspiration": { + "ID": 107, + "name": "Inspiration", + "slug": "inspiration", + "description": "Ideas and advice to empower and motivate people – especially bloggers, writers, and creative types – in their personal or professional journeys.", + "post_count": 327, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:inspiration", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:inspiration/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Popular Culture": { + "ID": 2437, + "name": "Popular Culture", + "slug": "popular-culture", + "description": "The web's leading pop culture magazines and blogs, covering music, film, television, gaming, and more.", + "post_count": 198, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:popular-culture", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:popular-culture/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "post_tag": { + "AnythingIsPossible": { + "ID": 109479402, + "name": "AnythingIsPossible", + "slug": "anythingispossible", + "description": "", + "post_count": 15, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:anythingispossible", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:anythingispossible/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "mural": { + "ID": 159763, + "name": "mural", + "slug": "mural", + "description": "", + "post_count": 4, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:mural", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:mural/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "mural art": { + "ID": 5762997, + "name": "mural art", + "slug": "mural-art", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:mural-art", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:mural-art/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "murals": { + "ID": 135373, + "name": "murals", + "slug": "murals", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:murals", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:murals/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "street art": { + "ID": 57447, + "name": "street art", + "slug": "street-art", + "description": "", + "post_count": 18, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:street-art", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:street-art/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "urban art": { + "ID": 28923, + "name": "urban art", + "slug": "urban-art", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:urban-art", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:urban-art/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + "AnythingIsPossible": { + "ID": 109479402, + "name": "AnythingIsPossible", + "slug": "anythingispossible", + "description": "", + "post_count": 15, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:anythingispossible", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:anythingispossible/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "anythingispossible" + }, + "mural": { + "ID": 159763, + "name": "mural", + "slug": "mural", + "description": "", + "post_count": 4, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:mural", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:mural/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "mural" + }, + "mural art": { + "ID": 5762997, + "name": "mural art", + "slug": "mural-art", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:mural-art", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:mural-art/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "mural-art" + }, + "murals": { + "ID": 135373, + "name": "murals", + "slug": "murals", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:murals", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:murals/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "murals" + }, + "street art": { + "ID": 57447, + "name": "street art", + "slug": "street-art", + "description": "", + "post_count": 18, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:street-art", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:street-art/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "street-art" + }, + "urban art": { + "ID": 28923, + "name": "urban art", + "slug": "urban-art", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:urban-art", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:urban-art/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "urban-art" + } + }, + "categories": { + "Art": { + "ID": 177, + "name": "Art", + "slug": "art", + "description": "Artists' sites, powerful artwork in multiple genres in a variety of mediums, and news from the art world.", + "post_count": 370, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:art", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:art/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Culture": { + "ID": 1098, + "name": "Culture", + "slug": "culture", + "description": "A curated collection of WordPress sites on society, culture in all its forms, and diverse art forms from around the world.", + "post_count": 414, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:culture", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:culture/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Diversity": { + "ID": 47458, + "name": "Diversity", + "slug": "diversity", + "description": "Blogs, stories, and web projects that highlight activists working towards greater diversity in culture, politics, and the business world.", + "post_count": 131, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:diversity", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:diversity/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Feminism": { + "ID": 553, + "name": "Feminism", + "slug": "feminism", + "description": "Magazines, collaborative websites, and feminist blogs that cover important issues in politics, culture, diversity, and the fight for gender equality.", + "post_count": 99, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:feminism", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:feminism/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Inspiration": { + "ID": 107, + "name": "Inspiration", + "slug": "inspiration", + "description": "Ideas and advice to empower and motivate people – especially bloggers, writers, and creative types – in their personal or professional journeys.", + "post_count": 327, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:inspiration", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:inspiration/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Popular Culture": { + "ID": 2437, + "name": "Popular Culture", + "slug": "popular-culture", + "description": "The web's leading pop culture magazines and blogs, covering music, film, television, gaming, and more.", + "post_count": 198, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:popular-culture", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:popular-culture/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "attachments": { + "37226": { + "ID": 37226, + "URL": "https://discover.files.wordpress.com/2019/05/img_3760.jpg", + "guid": "http://discover.files.wordpress.com/2019/05/img_3760.jpg", + "date": "2019-05-21T23:48:08-04:00", + "post_ID": 37222, + "author_ID": 47411601, + "file": "img_3760.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "IMG_3760", + "caption": "", + "description": "", + "alt": "Kelsey Montague mural art", + "thumbnails": { + "thumbnail": "https://discover.files.wordpress.com/2019/05/img_3760.jpg?w=113", + "medium": "https://discover.files.wordpress.com/2019/05/img_3760.jpg?w=311", + "large": "https://discover.files.wordpress.com/2019/05/img_3760.jpg?w=768" + }, + "height": 1706, + "width": 1280, + "exif": { + "aperture": "1.8", + "credit": "", + "camera": "iPhone 8 Plus", + "caption": "", + "created_timestamp": "1536421883", + "copyright": "", + "focal_length": "3.99", + "iso": "20", + "shutter_speed": "0.0014836795252226", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/media/37226", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/media/37226/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37222" + } + } + } + }, + "attachment_count": 1, + "metadata": [ + { + "id": "130242", + "key": "geo_public", + "value": "0" + }, + { + "id": "130230", + "key": "_thumbnail_id", + "value": "37226" + }, + { + "id": "130401", + "key": "_wpas_done_17927786", + "value": "1" + }, + { + "id": "130238", + "key": "_wpas_mess", + "value": "Visit @kelsmontagueart's website - featured on @wordpressdotcom's #AnythingIsPossible list - for inspiration, prints, and updates on Kelsey's latest mural projects." + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/read/sites/53424024/posts/37222", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/posts/37222/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37222/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37222/likes/" + }, + "data": { + "site": { + "ID": 53424024, + "name": "Discover", + "description": "A daily selection of the best content published on WordPress, collected for you by humans who love to read.", + "URL": "https://discover.wordpress.com", + "jetpack": false, + "post_count": 3603, + "subscribers_count": 35192480, + "locale": "en", + "icon": { + "img": "https://secure.gravatar.com/blavatar/c9e4e04719c81ca4936a63ea2dce6ace", + "ico": "https://secure.gravatar.com/blavatar/c9e4e04719c81ca4936a63ea2dce6ace" + }, + "logo": { + "id": 0, + "sizes": [ + + ], + "url": "" + }, + "visible": true, + "is_private": false, + "is_following": true, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/help", + "posts": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/posts/", + "comments": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/comments/", + "xmlrpc": "https://discover.wordpress.com/xmlrpc.php" + } + } + } + } + }, + "capabilities": { + "publish_post": false, + "delete_post": false, + "edit_post": false + }, + "other_URLs": { + }, + "discover_metadata": { + "permalink": "https://kelseymontagueart.com/", + "attribution": { + "author_name": "Krista Stevens", + "author_url": "https://kelseymontagueart.com/", + "blog_name": "Kelsey Montague Art", + "blog_url": "https://kelseymontagueart.com", + "avatar_url": "https://discover.files.wordpress.com/2019/05/kelsey-thumbnail.png?w=100&h=100&crop=true" + }, + "discover_fp_post_formats": [ + { + "name": "Pick", + "slug": "pick", + "id": 346750 + }, + { + "name": "Site Pick", + "slug": "site-pick", + "id": 308219249 + } + ], + "featured_post_wpcom_data": { + "blog_id": 161169196 + } + }, + "feed_ID": 41325786, + "feed_URL": "http://discover.wordpress.com", + "pseudo_ID": "b06fd6b4fd1b95644d71981f34f747f8", + "is_external": false, + "site_name": "Discover", + "site_URL": "https://discover.wordpress.com", + "site_is_private": false, + "featured_media": { + }, + "use_excerpt": false, + "is_following_conversation": false + }, + { + "ID": 37189, + "site_ID": 53424024, + "author": { + "ID": 10183950, + "login": "cherilucas", + "email": false, + "name": "Cheri Lucas Rowlands", + "first_name": "Cheri", + "last_name": "Rowlands", + "nice_name": "cherilucas", + "URL": "http://cherilucasrowlands.com", + "avatar_URL": "https://0.gravatar.com/avatar/36207d4c7c014b0999b995ca3971d383?s=96&d=identicon&r=G", + "profile_URL": "http://en.gravatar.com/cherilucas", + "site_ID": 9838404, + "has_avatar": true + }, + "date": "2019-05-26T09:00:58-04:00", + "modified": "2019-05-22T17:07:55-04:00", + "title": "The Radical Notion of Not Letting Work Define You", + "URL": "https://discover.wordpress.com/2019/05/26/the-radical-notion-of-not-letting-work-define-you/", + "short_URL": "https://wp.me/p3Ca1O-9FP", + "content": "

“Just because something can’t be a career doesn’t have to mean that it can’t be part of your life and identity.” At Man Repeller, Molly Conway muses on imposter syndrome, work and identity, and being a playwright.

\n", + "excerpt": "

“Just because something can’t be a career doesn’t have to mean that it can’t be part of your life and identity.” At Man Repeller, Molly Conway muses on imposter syndrome, work and identity, and being a playwright.

\n", + "slug": "the-radical-notion-of-not-letting-work-define-you", + "guid": "https://discover.wordpress.com/?p=37189", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": false, + "comment_status": "closed", + "pings_open": false, + "ping_status": "closed", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 102, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "eedec98542f8cbec7df4d4c608c847ef", + "featured_image": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-20-at-11.50.07-am.png", + "post_thumbnail": { + "ID": 37191, + "URL": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-20-at-11.50.07-am.png", + "guid": "http://discover.files.wordpress.com/2019/05/screen-shot-2019-05-20-at-11.50.07-am.png", + "mime_type": "image/png", + "width": 1482, + "height": 988 + }, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Identity": { + "ID": 10679, + "name": "Identity", + "slug": "identity", + "description": "Engaging conversations and writing around the topics of identity, diversity, and the search for authenticity.", + "post_count": 166, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:identity", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:identity/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Personal Essay": { + "ID": 253221, + "name": "Personal Essay", + "slug": "personal-essay", + "description": "Personal and introspective essays and longform from new and established writers and authors.", + "post_count": 156, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:personal-essay", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:personal-essay/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Personal Musings": { + "ID": 5316, + "name": "Personal Musings", + "slug": "personal-musings", + "description": "Introspective and self-reflective writing in various formats.", + "post_count": 437, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:personal-musings", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:personal-musings/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Work": { + "ID": 131, + "name": "Work", + "slug": "work", + "description": "From tech to farming, posts and websites dedicated to the many facets of work, work-life balance, and social inequality.", + "post_count": 80, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:work", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:work/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Writing": { + "ID": 349, + "name": "Writing", + "slug": "writing", + "description": "Writing, advice, and commentary on the act and process of writing, blogging, and publishing.", + "post_count": 437, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:writing", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:writing/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "post_tag": { + "imposter syndrome": { + "ID": 392126, + "name": "imposter syndrome", + "slug": "imposter-syndrome", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:imposter-syndrome", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:imposter-syndrome/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "playwright": { + "ID": 160393, + "name": "playwright", + "slug": "playwright", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:playwright", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:playwright/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "PoweredByWordPress": { + "ID": 76162589, + "name": "PoweredByWordPress", + "slug": "poweredbywordpress", + "description": "", + "post_count": 42, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:poweredbywordpress", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:poweredbywordpress/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "writers": { + "ID": 16761, + "name": "writers", + "slug": "writers", + "description": "", + "post_count": 70, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:writers", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:writers/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + "imposter syndrome": { + "ID": 392126, + "name": "imposter syndrome", + "slug": "imposter-syndrome", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:imposter-syndrome", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:imposter-syndrome/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "imposter-syndrome" + }, + "playwright": { + "ID": 160393, + "name": "playwright", + "slug": "playwright", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:playwright", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:playwright/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "playwright" + }, + "PoweredByWordPress": { + "ID": 76162589, + "name": "PoweredByWordPress", + "slug": "poweredbywordpress", + "description": "", + "post_count": 42, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:poweredbywordpress", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:poweredbywordpress/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "poweredbywordpress" + }, + "writers": { + "ID": 16761, + "name": "writers", + "slug": "writers", + "description": "", + "post_count": 70, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:writers", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:writers/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "writers" + } + }, + "categories": { + "Identity": { + "ID": 10679, + "name": "Identity", + "slug": "identity", + "description": "Engaging conversations and writing around the topics of identity, diversity, and the search for authenticity.", + "post_count": 166, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:identity", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:identity/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Personal Essay": { + "ID": 253221, + "name": "Personal Essay", + "slug": "personal-essay", + "description": "Personal and introspective essays and longform from new and established writers and authors.", + "post_count": 156, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:personal-essay", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:personal-essay/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Personal Musings": { + "ID": 5316, + "name": "Personal Musings", + "slug": "personal-musings", + "description": "Introspective and self-reflective writing in various formats.", + "post_count": 437, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:personal-musings", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:personal-musings/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Work": { + "ID": 131, + "name": "Work", + "slug": "work", + "description": "From tech to farming, posts and websites dedicated to the many facets of work, work-life balance, and social inequality.", + "post_count": 80, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:work", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:work/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Writing": { + "ID": 349, + "name": "Writing", + "slug": "writing", + "description": "Writing, advice, and commentary on the act and process of writing, blogging, and publishing.", + "post_count": 437, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:writing", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:writing/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "attachments": { + "37191": { + "ID": 37191, + "URL": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-20-at-11.50.07-am.png", + "guid": "http://discover.files.wordpress.com/2019/05/screen-shot-2019-05-20-at-11.50.07-am.png", + "date": "2019-05-20T14:50:23-04:00", + "post_ID": 37189, + "author_ID": 10183950, + "file": "screen-shot-2019-05-20-at-11.50.07-am.png", + "mime_type": "image/png", + "extension": "png", + "title": "man repeller header image", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-20-at-11.50.07-am.png?w=150", + "medium": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-20-at-11.50.07-am.png?w=315", + "large": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-20-at-11.50.07-am.png?w=1220" + }, + "height": 988, + "width": 1482, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/media/37191", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/media/37191/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37189" + } + } + }, + "37192": { + "ID": 37192, + "URL": "https://discover.files.wordpress.com/2019/05/man-repeller-logo.jpg", + "guid": "http://discover.files.wordpress.com/2019/05/man-repeller-logo.jpg", + "date": "2019-05-20T14:50:47-04:00", + "post_ID": 37189, + "author_ID": 10183950, + "file": "man-repeller-logo.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "man repeller logo", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://discover.files.wordpress.com/2019/05/man-repeller-logo.jpg?w=150", + "medium": "https://discover.files.wordpress.com/2019/05/man-repeller-logo.jpg?w=315", + "large": "https://discover.files.wordpress.com/2019/05/man-repeller-logo.jpg?w=400" + }, + "height": 400, + "width": 400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/media/37192", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/media/37192/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37189" + } + } + } + }, + "attachment_count": 2, + "metadata": [ + { + "id": "130145", + "key": "geo_public", + "value": "0" + }, + { + "id": "130142", + "key": "_thumbnail_id", + "value": "37191" + }, + { + "id": "130392", + "key": "_wpas_done_17926349", + "value": "1" + }, + { + "id": "130146", + "key": "_wpas_mess", + "value": "\"Just because something can’t be a career doesn’t have to mean that it can’t be part of your life and identity.\" Molly Conway muses on imposter syndrome, work and identity, and being a playwright. (@ManRepeller)" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/read/sites/53424024/posts/37189", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/posts/37189/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37189/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37189/likes/" + }, + "data": { + "site": { + "ID": 53424024, + "name": "Discover", + "description": "A daily selection of the best content published on WordPress, collected for you by humans who love to read.", + "URL": "https://discover.wordpress.com", + "jetpack": false, + "post_count": 3603, + "subscribers_count": 35192480, + "locale": "en", + "icon": { + "img": "https://secure.gravatar.com/blavatar/c9e4e04719c81ca4936a63ea2dce6ace", + "ico": "https://secure.gravatar.com/blavatar/c9e4e04719c81ca4936a63ea2dce6ace" + }, + "logo": { + "id": 0, + "sizes": [ + + ], + "url": "" + }, + "visible": true, + "is_private": false, + "is_following": true, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/help", + "posts": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/posts/", + "comments": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/comments/", + "xmlrpc": "https://discover.wordpress.com/xmlrpc.php" + } + } + } + } + }, + "capabilities": { + "publish_post": false, + "delete_post": false, + "edit_post": false + }, + "other_URLs": { + }, + "discover_metadata": { + "permalink": "https://www.manrepeller.com/2019/05/work-identity.html", + "attribution": { + "author_name": "Molly Conway", + "author_url": "https://www.manrepeller.com/author/molly-conway", + "blog_name": "Man Repeller", + "blog_url": "https://www.manrepeller.com", + "avatar_url": "https://discover.files.wordpress.com/2019/05/man-repeller-logo.jpg?w=100&h=100&crop=true" + }, + "discover_fp_post_formats": [ + { + "name": "Pick", + "slug": "pick", + "id": 346750 + }, + { + "name": "Standard Pick", + "slug": "standard-pick", + "id": 337879995 + } + ], + "featured_post_wpcom_data": { + "blog_id": 61780023 + } + }, + "feed_ID": 41325786, + "feed_URL": "http://discover.wordpress.com", + "pseudo_ID": "eedec98542f8cbec7df4d4c608c847ef", + "is_external": false, + "site_name": "Discover", + "site_URL": "https://discover.wordpress.com", + "site_is_private": false, + "featured_media": { + "uri": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-20-at-11.50.07-am.png", + "width": 1482, + "height": 988, + "type": "image" + }, + "use_excerpt": false, + "is_following_conversation": false + }, + { + "ID": 37205, + "site_ID": 53424024, + "author": { + "ID": 47411601, + "login": "benhuberman", + "email": false, + "name": "Ben Huberman", + "first_name": "Ben", + "last_name": "Huberman", + "nice_name": "benhuberman", + "URL": "https://benz.blog/", + "avatar_URL": "https://0.gravatar.com/avatar/663dcd498e8c5f255bfb230a7ba07678?s=96&d=identicon&r=G", + "profile_URL": "http://en.gravatar.com/benhuberman", + "site_ID": 122910962, + "has_avatar": true + }, + "date": "2019-05-25T09:00:36-04:00", + "modified": "2019-05-21T23:45:15-04:00", + "title": "Barista Hustle", + "URL": "https://discover.wordpress.com/2019/05/25/barista-hustle/", + "short_URL": "https://wp.me/p3Ca1O-9G5", + "content": "\n

The team at Barista Hustle, a leading coffee-education hub, creates resources and shares their extensive knowledge on topics ranging from cutting-edge gear to latte art.

\n", + "excerpt": "

The team at Barista Hustle, a leading coffee-education hub, creates resources and shares their extensive knowledge on topics ranging from cutting-edge gear to latte art.

\n", + "slug": "barista-hustle", + "guid": "https://discover.wordpress.com/?p=37205", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": false, + "comment_status": "closed", + "pings_open": false, + "ping_status": "closed", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 58, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "5344123ea1ee2da1788f11183966d068", + "featured_image": "https://discover.files.wordpress.com/2019/05/bh-home-header-element-wide-final.jpg", + "post_thumbnail": { + "ID": 37206, + "URL": "https://discover.files.wordpress.com/2019/05/bh-home-header-element-wide-final.jpg", + "guid": "http://discover.files.wordpress.com/2019/05/bh-home-header-element-wide-final.jpg", + "mime_type": "image/jpeg", + "width": 2800, + "height": 1500 + }, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Business": { + "ID": 179, + "name": "Business", + "slug": "business", + "description": "Small business and ecommerce resources, writing for professionals, and commentary on business, economics, and related topics.", + "post_count": 88, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:business", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:business/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Education": { + "ID": 1342, + "name": "Education", + "slug": "education", + "description": "Resources across disciplines and perspectives on teaching, learning, and the educational system from educators, teachers, and parents.", + "post_count": 121, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:education", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:education/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Food": { + "ID": 586, + "name": "Food", + "slug": "food", + "description": "Recipes, writing on food and culinary culture, and food photography or visual art.", + "post_count": 215, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:food", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:food/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Lifestyle": { + "ID": 278, + "name": "Lifestyle", + "slug": "lifestyle", + "description": "Sites devoted to fashion and beauty, interior design, travel, alternative ways of living, and more.", + "post_count": 127, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:lifestyle", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:lifestyle/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Work": { + "ID": 131, + "name": "Work", + "slug": "work", + "description": "From tech to farming, posts and websites dedicated to the many facets of work, work-life balance, and social inequality.", + "post_count": 80, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:work", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:work/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "post_tag": { + "Baristas": { + "ID": 831444, + "name": "Baristas", + "slug": "baristas", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:baristas", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:baristas/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "business blog": { + "ID": 287435, + "name": "business blog", + "slug": "business-blog", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:business-blog", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:business-blog/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "coffee": { + "ID": 16166, + "name": "coffee", + "slug": "coffee", + "description": "", + "post_count": 10, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:coffee", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:coffee/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "ecommerce": { + "ID": 11160, + "name": "ecommerce", + "slug": "ecommerce", + "description": "", + "post_count": 10, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:ecommerce", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:ecommerce/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Small Business": { + "ID": 10585, + "name": "Small Business", + "slug": "small-business", + "description": "", + "post_count": 37, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:small-business", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:small-business/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + "Baristas": { + "ID": 831444, + "name": "Baristas", + "slug": "baristas", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:baristas", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:baristas/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "baristas" + }, + "business blog": { + "ID": 287435, + "name": "business blog", + "slug": "business-blog", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:business-blog", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:business-blog/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "business-blog" + }, + "coffee": { + "ID": 16166, + "name": "coffee", + "slug": "coffee", + "description": "", + "post_count": 10, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:coffee", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:coffee/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "coffee" + }, + "ecommerce": { + "ID": 11160, + "name": "ecommerce", + "slug": "ecommerce", + "description": "", + "post_count": 10, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:ecommerce", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:ecommerce/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "ecommerce" + }, + "Small Business": { + "ID": 10585, + "name": "Small Business", + "slug": "small-business", + "description": "", + "post_count": 37, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:small-business", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:small-business/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "small-business" + } + }, + "categories": { + "Business": { + "ID": 179, + "name": "Business", + "slug": "business", + "description": "Small business and ecommerce resources, writing for professionals, and commentary on business, economics, and related topics.", + "post_count": 88, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:business", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:business/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Education": { + "ID": 1342, + "name": "Education", + "slug": "education", + "description": "Resources across disciplines and perspectives on teaching, learning, and the educational system from educators, teachers, and parents.", + "post_count": 121, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:education", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:education/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Food": { + "ID": 586, + "name": "Food", + "slug": "food", + "description": "Recipes, writing on food and culinary culture, and food photography or visual art.", + "post_count": 215, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:food", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:food/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Lifestyle": { + "ID": 278, + "name": "Lifestyle", + "slug": "lifestyle", + "description": "Sites devoted to fashion and beauty, interior design, travel, alternative ways of living, and more.", + "post_count": 127, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:lifestyle", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:lifestyle/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Work": { + "ID": 131, + "name": "Work", + "slug": "work", + "description": "From tech to farming, posts and websites dedicated to the many facets of work, work-life balance, and social inequality.", + "post_count": 80, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:work", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:work/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + { + "id": "130216", + "key": "geo_public", + "value": "0" + }, + { + "id": "130206", + "key": "_thumbnail_id", + "value": "37206" + }, + { + "id": "130379", + "key": "_wpas_done_17927786", + "value": "1" + }, + { + "id": "130212", + "key": "_wpas_mess", + "value": "Whether you're a coffee professional, an aspiring latte artist, or just looking to improve your next cup, check out the resources and courses @BaristaHustle, a #PoweredByWordPress website:" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/read/sites/53424024/posts/37205", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/posts/37205/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37205/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37205/likes/" + }, + "data": { + "site": { + "ID": 53424024, + "name": "Discover", + "description": "A daily selection of the best content published on WordPress, collected for you by humans who love to read.", + "URL": "https://discover.wordpress.com", + "jetpack": false, + "post_count": 3603, + "subscribers_count": 35192480, + "locale": "en", + "icon": { + "img": "https://secure.gravatar.com/blavatar/c9e4e04719c81ca4936a63ea2dce6ace", + "ico": "https://secure.gravatar.com/blavatar/c9e4e04719c81ca4936a63ea2dce6ace" + }, + "logo": { + "id": 0, + "sizes": [ + + ], + "url": "" + }, + "visible": true, + "is_private": false, + "is_following": true, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/help", + "posts": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/posts/", + "comments": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/comments/", + "xmlrpc": "https://discover.wordpress.com/xmlrpc.php" + } + } + } + } + }, + "capabilities": { + "publish_post": false, + "delete_post": false, + "edit_post": false + }, + "other_URLs": { + }, + "discover_metadata": { + "permalink": "https://baristahustle.com/", + "attribution": { + "author_name": "Krista Stevens", + "author_url": "https://baristahustle.com/", + "blog_name": "Barista Hustle", + "blog_url": "https://baristahustle.com", + "avatar_url": "https://discover.files.wordpress.com/2019/05/bh-logo-new-512-1-400x400.png?w=100&h=100&crop=true" + }, + "discover_fp_post_formats": [ + { + "name": "Pick", + "slug": "pick", + "id": 346750 + }, + { + "name": "Site Pick", + "slug": "site-pick", + "id": 308219249 + } + ], + "featured_post_wpcom_data": { + "blog_id": 82609915 + } + }, + "feed_ID": 41325786, + "feed_URL": "http://discover.wordpress.com", + "pseudo_ID": "5344123ea1ee2da1788f11183966d068", + "is_external": false, + "site_name": "Discover", + "site_URL": "https://discover.wordpress.com", + "site_is_private": false, + "featured_media": { + }, + "use_excerpt": false, + "is_following_conversation": false + }, + { + "ID": 37123, + "site_ID": 53424024, + "author": { + "ID": 10183950, + "login": "cherilucas", + "email": false, + "name": "Cheri Lucas Rowlands", + "first_name": "Cheri", + "last_name": "Rowlands", + "nice_name": "cherilucas", + "URL": "http://cherilucasrowlands.com", + "avatar_URL": "https://0.gravatar.com/avatar/36207d4c7c014b0999b995ca3971d383?s=96&d=identicon&r=G", + "profile_URL": "http://en.gravatar.com/cherilucas", + "site_ID": 9838404, + "has_avatar": true + }, + "date": "2019-05-24T09:00:50-04:00", + "modified": "2019-05-22T17:07:30-04:00", + "title": "Lonely Planet Kids", + "URL": "https://discover.wordpress.com/2019/05/24/lonely-planet-kids/", + "short_URL": "https://wp.me/p3Ca1O-9EL", + "content": "

Lonely Planet Kids — an offshoot of the popular travel guide company –inspires children to be curious about the world. The site features books, activities, family travel posts, and more.

\n", + "excerpt": "

Lonely Planet Kids — an offshoot of the popular travel guide company –inspires children to be curious about the world. The site features books, activities, family travel posts, and more.

\n", + "slug": "lonely-planet-kids", + "guid": "https://discover.wordpress.com/?p=37123", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": false, + "comment_status": "closed", + "pings_open": false, + "ping_status": "closed", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 49, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "12ac818a3de41e3b0cf84fea7efa2592", + "featured_image": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-10-at-3.53.09-pm.png", + "post_thumbnail": { + "ID": 37125, + "URL": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-10-at-3.53.09-pm.png", + "guid": "http://discover.files.wordpress.com/2019/05/screen-shot-2019-05-10-at-3.53.09-pm.png", + "mime_type": "image/png", + "width": 1434, + "height": 808 + }, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Books": { + "ID": 178, + "name": "Books", + "slug": "books", + "description": "Writing, reviews, resources, and news on books, authors, reading, and publishing.", + "post_count": 233, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:books", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:books/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Education": { + "ID": 1342, + "name": "Education", + "slug": "education", + "description": "Resources across disciplines and perspectives on teaching, learning, and the educational system from educators, teachers, and parents.", + "post_count": 121, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:education", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:education/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Exploration": { + "ID": 7543, + "name": "Exploration", + "slug": "exploration", + "description": "Writing and photography on travel, self-discovery, research, observation, and more.", + "post_count": 147, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:exploration", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:exploration/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Family": { + "ID": 406, + "name": "Family", + "slug": "family", + "description": "Writing that encompasses aspects of family, including marriage, parenting, childhood, relationships, and ancestry.", + "post_count": 226, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:family", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:family/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Inspiration": { + "ID": 107, + "name": "Inspiration", + "slug": "inspiration", + "description": "Ideas and advice to empower and motivate people – especially bloggers, writers, and creative types – in their personal or professional journeys.", + "post_count": 327, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:inspiration", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:inspiration/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Parenting": { + "ID": 5309, + "name": "Parenting", + "slug": "parenting", + "description": "Writing and resources on parenting, motherhood, marriage, and family.", + "post_count": 141, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:parenting", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:parenting/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Publishing": { + "ID": 3330, + "name": "Publishing", + "slug": "publishing", + "description": "Writers and editors discussing publishing-industry news, the ins and outs of the literary world, and their own journey to a published book.", + "post_count": 124, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:publishing", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:publishing/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Reading": { + "ID": 1473, + "name": "Reading", + "slug": "reading", + "description": "Posts and book blogs that focus on authors, book reviews, and the pleasures of reading in the digital age.", + "post_count": 143, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:reading", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:reading/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Travel": { + "ID": 200, + "name": "Travel", + "slug": "travel", + "description": "Blogs, online guides, and trip planning resources devoted to travel, exploration, the outdoors, expat life, and global culture.", + "post_count": 247, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:travel", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:travel/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Wanderlust": { + "ID": 13181, + "name": "Wanderlust", + "slug": "wanderlust", + "description": "Stunning travel photography, travel and lifestyle sites, and blog posts on the joys and rewards of exploring new destinations.", + "post_count": 97, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:wanderlust", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:wanderlust/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "post_tag": { + "activities": { + "ID": 6751, + "name": "activities", + "slug": "activities", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:activities", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:activities/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "children": { + "ID": 1343, + "name": "children", + "slug": "children", + "description": "", + "post_count": 28, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:children", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:children/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "family travel": { + "ID": 421426, + "name": "family travel", + "slug": "family-travel", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:family-travel", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:family-travel/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "imagination": { + "ID": 10906, + "name": "imagination", + "slug": "imagination", + "description": "", + "post_count": 7, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:imagination", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:imagination/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "kids": { + "ID": 3374, + "name": "kids", + "slug": "kids", + "description": "", + "post_count": 14, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:kids", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:kids/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Lonely Planet": { + "ID": 232853, + "name": "Lonely Planet", + "slug": "lonely-planet", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:lonely-planet", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:lonely-planet/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Teaching": { + "ID": 1591, + "name": "Teaching", + "slug": "teaching", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:teaching", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:teaching/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + "activities": { + "ID": 6751, + "name": "activities", + "slug": "activities", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:activities", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:activities/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "activities" + }, + "children": { + "ID": 1343, + "name": "children", + "slug": "children", + "description": "", + "post_count": 28, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:children", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:children/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "children" + }, + "family travel": { + "ID": 421426, + "name": "family travel", + "slug": "family-travel", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:family-travel", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:family-travel/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "family-travel" + }, + "imagination": { + "ID": 10906, + "name": "imagination", + "slug": "imagination", + "description": "", + "post_count": 7, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:imagination", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:imagination/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "imagination" + }, + "kids": { + "ID": 3374, + "name": "kids", + "slug": "kids", + "description": "", + "post_count": 14, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:kids", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:kids/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "kids" + }, + "Lonely Planet": { + "ID": 232853, + "name": "Lonely Planet", + "slug": "lonely-planet", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:lonely-planet", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:lonely-planet/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "lonely-planet" + }, + "Teaching": { + "ID": 1591, + "name": "Teaching", + "slug": "teaching", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:teaching", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:teaching/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "teaching" + } + }, + "categories": { + "Books": { + "ID": 178, + "name": "Books", + "slug": "books", + "description": "Writing, reviews, resources, and news on books, authors, reading, and publishing.", + "post_count": 233, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:books", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:books/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Education": { + "ID": 1342, + "name": "Education", + "slug": "education", + "description": "Resources across disciplines and perspectives on teaching, learning, and the educational system from educators, teachers, and parents.", + "post_count": 121, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:education", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:education/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Exploration": { + "ID": 7543, + "name": "Exploration", + "slug": "exploration", + "description": "Writing and photography on travel, self-discovery, research, observation, and more.", + "post_count": 147, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:exploration", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:exploration/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Family": { + "ID": 406, + "name": "Family", + "slug": "family", + "description": "Writing that encompasses aspects of family, including marriage, parenting, childhood, relationships, and ancestry.", + "post_count": 226, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:family", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:family/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Inspiration": { + "ID": 107, + "name": "Inspiration", + "slug": "inspiration", + "description": "Ideas and advice to empower and motivate people – especially bloggers, writers, and creative types – in their personal or professional journeys.", + "post_count": 327, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:inspiration", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:inspiration/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Parenting": { + "ID": 5309, + "name": "Parenting", + "slug": "parenting", + "description": "Writing and resources on parenting, motherhood, marriage, and family.", + "post_count": 141, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:parenting", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:parenting/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Publishing": { + "ID": 3330, + "name": "Publishing", + "slug": "publishing", + "description": "Writers and editors discussing publishing-industry news, the ins and outs of the literary world, and their own journey to a published book.", + "post_count": 124, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:publishing", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:publishing/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Reading": { + "ID": 1473, + "name": "Reading", + "slug": "reading", + "description": "Posts and book blogs that focus on authors, book reviews, and the pleasures of reading in the digital age.", + "post_count": 143, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:reading", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:reading/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Travel": { + "ID": 200, + "name": "Travel", + "slug": "travel", + "description": "Blogs, online guides, and trip planning resources devoted to travel, exploration, the outdoors, expat life, and global culture.", + "post_count": 247, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:travel", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:travel/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Wanderlust": { + "ID": 13181, + "name": "Wanderlust", + "slug": "wanderlust", + "description": "Stunning travel photography, travel and lifestyle sites, and blog posts on the joys and rewards of exploring new destinations.", + "post_count": 97, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:wanderlust", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:wanderlust/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "attachments": { + "37125": { + "ID": 37125, + "URL": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-10-at-3.53.09-pm.png", + "guid": "http://discover.files.wordpress.com/2019/05/screen-shot-2019-05-10-at-3.53.09-pm.png", + "date": "2019-05-10T18:53:26-04:00", + "post_ID": 37123, + "author_ID": 10183950, + "file": "screen-shot-2019-05-10-at-3.53.09-pm.png", + "mime_type": "image/png", + "extension": "png", + "title": "lonely planet kids header", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-10-at-3.53.09-pm.png?w=150", + "medium": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-10-at-3.53.09-pm.png?w=315", + "large": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-10-at-3.53.09-pm.png?w=1220" + }, + "height": 808, + "width": 1434, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/media/37125", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/media/37125/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37123" + } + } + }, + "37126": { + "ID": 37126, + "URL": "https://discover.files.wordpress.com/2019/05/lonely-planet-kids-logo.png", + "guid": "http://discover.files.wordpress.com/2019/05/lonely-planet-kids-logo.png", + "date": "2019-05-10T18:53:28-04:00", + "post_ID": 37123, + "author_ID": 10183950, + "file": "lonely-planet-kids-logo.png", + "mime_type": "image/png", + "extension": "png", + "title": "lonely planet kids logo", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://discover.files.wordpress.com/2019/05/lonely-planet-kids-logo.png?w=150", + "medium": "https://discover.files.wordpress.com/2019/05/lonely-planet-kids-logo.png?w=315", + "large": "https://discover.files.wordpress.com/2019/05/lonely-planet-kids-logo.png?w=400" + }, + "height": 400, + "width": 400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/media/37126", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/media/37126/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37123" + } + } + } + }, + "attachment_count": 2, + "metadata": [ + { + "id": "129821", + "key": "geo_public", + "value": "0" + }, + { + "id": "129818", + "key": "_thumbnail_id", + "value": "37125" + }, + { + "id": "130369", + "key": "_wpas_done_17926349", + "value": "1" + }, + { + "id": "129822", + "key": "_wpas_mess", + "value": "Lonely Planet Kids (@lpkids) inspires children to be curious about the world. The #PoweredByWordPress site features children's books, activities, family travel resources, and more." + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/read/sites/53424024/posts/37123", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/posts/37123/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37123/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37123/likes/" + }, + "data": { + "site": { + "ID": 53424024, + "name": "Discover", + "description": "A daily selection of the best content published on WordPress, collected for you by humans who love to read.", + "URL": "https://discover.wordpress.com", + "jetpack": false, + "post_count": 3603, + "subscribers_count": 35192480, + "locale": "en", + "icon": { + "img": "https://secure.gravatar.com/blavatar/c9e4e04719c81ca4936a63ea2dce6ace", + "ico": "https://secure.gravatar.com/blavatar/c9e4e04719c81ca4936a63ea2dce6ace" + }, + "logo": { + "id": 0, + "sizes": [ + + ], + "url": "" + }, + "visible": true, + "is_private": false, + "is_following": true, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/help", + "posts": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/posts/", + "comments": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/comments/", + "xmlrpc": "https://discover.wordpress.com/xmlrpc.php" + } + } + } + } + }, + "capabilities": { + "publish_post": false, + "delete_post": false, + "edit_post": false + }, + "other_URLs": { + }, + "discover_metadata": { + "permalink": "https://www.lonelyplanet.com/kids/", + "attribution": { + "author_name": "Contributors", + "author_url": "https://www.lonelyplanet.com/kids/about/", + "blog_name": "Lonely Planet Kids", + "blog_url": "https://www.lonelyplanet.com", + "avatar_url": "https://discover.files.wordpress.com/2019/05/lonely-planet-kids-logo.png?w=100&h=100&crop=true" + }, + "discover_fp_post_formats": [ + { + "name": "Pick", + "slug": "pick", + "id": 346750 + }, + { + "name": "Site Pick", + "slug": "site-pick", + "id": 308219249 + } + ] + }, + "feed_ID": 41325786, + "feed_URL": "http://discover.wordpress.com", + "pseudo_ID": "12ac818a3de41e3b0cf84fea7efa2592", + "is_external": false, + "site_name": "Discover", + "site_URL": "https://discover.wordpress.com", + "site_is_private": false, + "featured_media": { + "uri": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-10-at-3.53.09-pm.png", + "width": 1434, + "height": 808, + "type": "image" + }, + "use_excerpt": false, + "is_following_conversation": false + } + ], + "meta": { + "links": { + "counts": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/post-counts/post" + }, + "next_page": "value=2019-04-21T09%3A00%3A08-04%3A00&id=36933", + "wpcom": true + } + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v13_read_menu.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v13_read_menu.json new file mode 100644 index 000000000000..db84b584799d --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v13_read_menu.json @@ -0,0 +1,250 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.3/read/menu" + }, + "response": { + "status": 200, + "jsonBody": { + "default": { + "following": { + "title": "Followed Sites", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/following" + }, + "discover": { + "title": "Discover", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/sites/53424024/posts" + }, + "liked": { + "title": "My Likes", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/liked" + } + }, + "subscribed": { + "412": { + "ID": "412", + "title": "Video", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/video/posts", + "slug": "video", + "display_name": "video", + "type": "tag" + }, + "678": { + "ID": "678", + "title": "History", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/history/posts", + "slug": "history", + "display_name": "history", + "type": "tag" + }, + "3263": { + "ID": "3263", + "title": "gallery", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/gallery/posts", + "slug": "gallery", + "display_name": "gallery", + "type": "tag" + }, + "239173": { + "ID": "239173", + "title": "gif", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/gif/posts", + "slug": "gif", + "display_name": "gif", + "type": "tag" + } + }, + "recommended": { + "116": { + "ID": 116, + "title": "Religion", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/religion/posts", + "slug": "religion", + "display_name": "religion", + "type": "tag" + }, + "178": { + "ID": 178, + "title": "Books", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/books/posts", + "slug": "books", + "display_name": "books", + "type": "tag" + }, + "200": { + "ID": 200, + "title": "Travel", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/travel/posts", + "slug": "travel", + "display_name": "travel", + "type": "tag" + }, + "376": { + "ID": 376, + "title": "Humor", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/humor/posts", + "slug": "humor", + "display_name": "humor", + "type": "tag" + }, + "406": { + "ID": 406, + "title": "Family", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/family/posts", + "slug": "family", + "display_name": "family", + "type": "tag" + }, + "436": { + "ID": 436, + "title": "Photography", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/photography/posts", + "slug": "photography", + "display_name": "photography", + "type": "tag" + }, + "586": { + "ID": 586, + "title": "Food", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/food/posts", + "slug": "food", + "display_name": "food", + "type": "tag" + }, + "676": { + "ID": 676, + "title": "Websites", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/websites/posts", + "slug": "websites", + "display_name": "websites", + "type": "tag" + }, + "1098": { + "ID": 1098, + "title": "Culture", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/culture/posts", + "slug": "culture", + "display_name": "culture", + "type": "tag" + }, + "2806": { + "ID": 2806, + "title": "Art & Design", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/art-design/posts", + "slug": "art-design", + "display_name": "art-design", + "type": "tag" + }, + "3750": { + "ID": 3750, + "title": "Magazines", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/magazines/posts", + "slug": "magazines", + "display_name": "magazines", + "type": "tag" + }, + "13985": { + "ID": 13985, + "title": "Health & Wellness", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/health-wellness/posts", + "slug": "health-wellness", + "display_name": "health-wellness", + "type": "tag" + }, + "26879": { + "ID": 26879, + "title": "Portfolios", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/portfolios/posts", + "slug": "portfolios", + "display_name": "portfolios", + "type": "tag" + }, + "38881": { + "ID": 38881, + "title": "Science & Nature", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/science-nature/posts", + "slug": "science-nature", + "display_name": "science-nature", + "type": "tag" + }, + "84776": { + "ID": 84776, + "title": "News & Current Events", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/news-current-events/posts", + "slug": "news-current-events", + "display_name": "news-current-events", + "type": "tag" + }, + "258845": { + "ID": 258845, + "title": "Business & Technology", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/business-technology/posts", + "slug": "business-technology", + "display_name": "business-technology", + "type": "tag" + }, + "960817": { + "ID": 960817, + "title": "Fiction & Poetry", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/fiction-poetry/posts", + "slug": "fiction-poetry", + "display_name": "fiction-poetry", + "type": "tag" + }, + "998458": { + "ID": 998458, + "title": "Writing & Blogging", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/writing-blogging/posts", + "slug": "writing-blogging", + "display_name": "writing-blogging", + "type": "tag" + }, + "1446729": { + "ID": 1446729, + "title": "Sports & Gaming", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/sports-gaming/posts", + "slug": "sports-gaming", + "display_name": "sports-gaming", + "type": "tag" + }, + "10016773": { + "ID": 10016773, + "title": "Musings & Personal", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/musings-personal/posts", + "slug": "musings-personal", + "display_name": "musings-personal", + "type": "tag" + }, + "35328892": { + "ID": 35328892, + "title": "Longreads", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/longreads/posts", + "slug": "longreads", + "display_name": "longreads", + "type": "tag" + }, + "63611190": { + "ID": 63611190, + "title": "Crafts & Fashion", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/crafts-fashion/posts", + "slug": "crafts-fashion", + "display_name": "crafts-fashion", + "type": "tag" + }, + "87210105": { + "ID": 87210105, + "title": "Popular Culture & Entertainment", + "URL": "{{request.requestLine.baseUrl}}/rest/v1.2/read/tags/popular-culture-entertainment/posts", + "slug": "popular-culture-entertainment", + "display_name": "popular-culture-entertainment", + "type": "tag" + } + } + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v2_read_interests.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v2_read_interests.json new file mode 100644 index 000000000000..23247d854d2e --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v2_read_interests.json @@ -0,0 +1,395 @@ +{ + "request": { + "method": "GET", + "urlPath": "/wpcom/v2/read/interests" + }, + "response": { + "status": 200, + "jsonBody": { + "success": true, + "interests": [ + { + "title": "Activism", + "slug": "activism" + }, + { + "title": "Advice", + "slug": "advice" + }, + { + "title": "Adventure", + "slug": "adventure" + }, + { + "title": "Animals", + "slug": "animals" + }, + { + "title": "Architecture", + "slug": "architecture" + }, + { + "title": "Art", + "slug": "art" + }, + { + "title": "Authors", + "slug": "authors" + }, + { + "title": "Baking", + "slug": "baking" + }, + { + "title": "Beauty", + "slug": "beauty" + }, + { + "title": "Beer", + "slug": "beer" + }, + { + "title": "Blogging", + "slug": "blogging" + }, + { + "title": "Books", + "slug": "books" + }, + { + "title": "Business", + "slug": "business" + }, + { + "title": "Camping", + "slug": "camping" + }, + { + "title": "Cars", + "slug": "cars" + }, + { + "title": "Cocktails", + "slug": "cocktails" + }, + { + "title": "Coding", + "slug": "coding" + }, + { + "title": "Comics", + "slug": "comics" + }, + { + "title": "Cooking", + "slug": "cooking" + }, + { + "title": "Community", + "slug": "community" + }, + { + "title": "Comics", + "slug": "comics" + }, + { + "title": "Crafts", + "slug": "crafts" + }, + { + "title": "Creativity", + "slug": "creativity" + }, + { + "title": "Culture", + "slug": "culture" + }, + { + "title": "Current Events", + "slug": "current-events" + }, + { + "title": "Dance", + "slug": "dance" + }, + { + "title": "Decorating", + "slug": "decorating" + }, + { + "title": "Design", + "slug": "design" + }, + { + "title": "Diversity", + "slug": "diversity" + }, + { + "title": "DIY", + "slug": "diy" + }, + { + "title": "Drawing", + "slug": "drawing" + }, + { + "title": "Ecommerce", + "slug": "ecommerce" + }, + { + "title": "Education", + "slug": "education" + }, + { + "title": "Entertainment", + "slug": "entertainment" + }, + { + "title": "Environment", + "slug": "environment" + }, + { + "title": "Family", + "slug": "family" + }, + { + "title": "Farming", + "slug": "farming" + }, + { + "title": "Fashion", + "slug": "fashion" + }, + { + "title": "Fiction", + "slug": "fiction" + }, + { + "title": "Finance", + "slug": "finance" + }, + { + "title": "Fitness", + "slug": "fitness" + }, + { + "title": "Food", + "slug": "food" + }, + { + "title": "Gaming", + "slug": "gaming" + }, + { + "title": "Gardening", + "slug": "gardening" + }, + { + "title": "Health", + "slug": "health" + }, + { + "title": "History", + "slug": "history" + }, + { + "title": "Homeschooling", + "slug": "homeschooling" + }, + { + "title": "Humor", + "slug": "humor" + }, + { + "title": "Identity", + "slug": "identity" + }, + { + "title": "Illustration", + "slug": "illustration" + }, + { + "title": "Inspiration", + "slug": "inspiration" + }, + { + "title": "Internet", + "slug": "internet" + }, + { + "title": "Journalism", + "slug": "journalism" + }, + { + "title": "Kids", + "slug": "kids" + }, + { + "title": "Language", + "slug": "language" + }, + { + "title": "LGBTQ", + "slug": "lgbtq" + }, + { + "title": "Lifestyle", + "slug": "lifestyle" + }, + { + "title": "Literature", + "slug": "literature" + }, + { + "title": "Mathematics", + "slug": "mathematics" + }, + { + "title": "Media", + "slug": "media" + }, + { + "title": "Mental Health", + "slug": "mental-health" + }, + { + "title": "Military", + "slug": "military" + }, + { + "title": "Movies", + "slug": "movies" + }, + { + "title": "Music", + "slug": "music" + }, + { + "title": "Nature", + "slug": "nature" + }, + { + "title": "Nonfiction", + "slug": "nonfiction" + }, + { + "title": "Nostalgia", + "slug": "nostalgia" + }, + { + "title": "Outdoors", + "slug": "outdoors" + }, + { + "title": "Parenting", + "slug": "parenting" + }, + { + "title": "Pets", + "slug": "pets" + }, + { + "title": "Photography", + "slug": "photography" + }, + { + "title": "Poetry", + "slug": "poetry" + }, + { + "title": "Politics", + "slug": "politics" + }, + { + "title": "Publishing", + "slug": "publishing" + }, + { + "title": "Reading", + "slug": "reading" + }, + { + "title": "Recipes", + "slug": "recipes" + }, + { + "title": "Relationships", + "slug": "relationships" + }, + { + "title": "Religion", + "slug": "religion" + }, + { + "title": "Science", + "slug": "science" + }, + { + "title": "Self-Improvement", + "slug": "self-improvement" + }, + { + "title": "Self-Publishing", + "slug": "self-publishing" + }, + { + "title": "Sewing", + "slug": "sewing" + }, + { + "title": "Social Media", + "slug": "social-media" + }, + { + "title": "Sports", + "slug": "sports" + }, + { + "title": "Teaching", + "slug": "teaching" + }, + { + "title": "Technology", + "slug": "technology" + }, + { + "title": "Television", + "slug": "television" + }, + { + "title": "Travel", + "slug": "travel" + }, + { + "title": "Weddings", + "slug": "weddings" + }, + { + "title": "Wellness", + "slug": "wellness" + }, + { + "title": "Wine", + "slug": "wine" + }, + { + "title": "WordPress", + "slug": "wordpress" + }, + { + "title": "Work", + "slug": "work" + }, + { + "title": "Writing", + "slug": "writing" + } + ] + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v2_read_tags_cards.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v2_read_tags_cards.json new file mode 100644 index 000000000000..75c24abc797f --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/reader/rest_v2_read_tags_cards.json @@ -0,0 +1,3970 @@ +{ + "request": { + "method": "GET", + "urlPattern": "\/wpcom\/v2\/read\/tags\/cards.*|\/wpcom\/v2\/read\/streams\/discover.*" + }, + "response": { + "status": 200, + "jsonBody": { + "success": true, + "tags": [ + "photography" + ], + "sort": "popularity", + "lang": "en", + "page": 1, + "refresh": 1, + "cards": [ + { + "type": "interests_you_may_like", + "data": [ + { + "slug": "blogging", + "title": "Blogging", + "score": 278 + }, + { + "slug": "travel", + "title": "Travel", + "score": 251 + }, + { + "slug": "photos", + "title": "Photos", + "score": 173 + }, + { + "slug": "technology", + "title": "Technology", + "score": 139 + } + ] + }, + { + "type": "interests_you_may_like", + "data": [ + { + "slug": "blogging", + "title": "Blogging", + "score": 278 + }, + { + "slug": "travel", + "title": "Travel", + "score": 251 + }, + { + "slug": "photos", + "title": "Photos", + "score": 173 + }, + { + "slug": "technology", + "title": "Technology", + "score": 139 + } + ] + }, + { + "type": "post", + "data": { + "ID": 37222, + "site_ID": 53424024, + "author": { + "ID": 47411601, + "login": "benhuberman", + "email": false, + "name": "Ben Huberman", + "first_name": "Ben", + "last_name": "Huberman", + "nice_name": "benhuberman", + "URL": "https://benz.blog/", + "avatar_URL": "https://0.gravatar.com/avatar/663dcd498e8c5f255bfb230a7ba07678?s=96&d=identicon&r=G", + "profile_URL": "http://en.gravatar.com/benhuberman", + "site_ID": 122910962, + "has_avatar": true + }, + "date": "{{now offset='-2 hours'}}", + "modified": "{{now offset='-2 hours'}}", + "title": "Kelsey Montague Art", + "URL": "https://discover.wordpress.com/2019/05/27/kelsey-montague-art/", + "short_URL": "https://wp.me/p3Ca1O-9Gm", + "content": "

Explore mural artist Kelsey Montague’s work, stay up-to-date on her latest projects, and shop for prints on her Anything Is Possible-featured website. 

\r\n\r\n\r\n

\r\n", + "excerpt": "

Explore mural artist Kelsey Montague’s work, stay up-to-date on her latest projects, and shop for prints on her Anything Is Possible-featured website. 

\n", + "slug": "kelsey-montague-art", + "guid": "https://discover.wordpress.com/?p=37222", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": false, + "comment_status": "closed", + "pings_open": false, + "ping_status": "closed", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 33, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "b06fd6b4fd1b95644d71981f34f747f8", + "featured_image": "https://discover.files.wordpress.com/2019/05/img_3760.jpg", + "post_thumbnail": { + "ID": 37226, + "URL": "https://discover.files.wordpress.com/2019/05/img_3760.jpg", + "guid": "http://discover.files.wordpress.com/2019/05/img_3760.jpg", + "mime_type": "image/jpeg", + "width": 1280, + "height": 1706 + }, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Art": { + "ID": 177, + "name": "Art", + "slug": "art", + "description": "Artists' sites, powerful artwork in multiple genres in a variety of mediums, and news from the art world.", + "post_count": 370, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:art", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:art/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Culture": { + "ID": 1098, + "name": "Culture", + "slug": "culture", + "description": "A curated collection of WordPress sites on society, culture in all its forms, and diverse art forms from around the world.", + "post_count": 414, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:culture", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:culture/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Diversity": { + "ID": 47458, + "name": "Diversity", + "slug": "diversity", + "description": "Blogs, stories, and web projects that highlight activists working towards greater diversity in culture, politics, and the business world.", + "post_count": 131, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:diversity", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:diversity/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Feminism": { + "ID": 553, + "name": "Feminism", + "slug": "feminism", + "description": "Magazines, collaborative websites, and feminist blogs that cover important issues in politics, culture, diversity, and the fight for gender equality.", + "post_count": 99, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:feminism", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:feminism/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Inspiration": { + "ID": 107, + "name": "Inspiration", + "slug": "inspiration", + "description": "Ideas and advice to empower and motivate people – especially bloggers, writers, and creative types – in their personal or professional journeys.", + "post_count": 327, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:inspiration", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:inspiration/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Popular Culture": { + "ID": 2437, + "name": "Popular Culture", + "slug": "popular-culture", + "description": "The web's leading pop culture magazines and blogs, covering music, film, television, gaming, and more.", + "post_count": 198, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:popular-culture", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:popular-culture/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "post_tag": { + "AnythingIsPossible": { + "ID": 109479402, + "name": "AnythingIsPossible", + "slug": "anythingispossible", + "description": "", + "post_count": 15, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:anythingispossible", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:anythingispossible/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "mural": { + "ID": 159763, + "name": "mural", + "slug": "mural", + "description": "", + "post_count": 4, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:mural", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:mural/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "mural art": { + "ID": 5762997, + "name": "mural art", + "slug": "mural-art", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:mural-art", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:mural-art/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "murals": { + "ID": 135373, + "name": "murals", + "slug": "murals", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:murals", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:murals/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "street art": { + "ID": 57447, + "name": "street art", + "slug": "street-art", + "description": "", + "post_count": 18, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:street-art", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:street-art/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "urban art": { + "ID": 28923, + "name": "urban art", + "slug": "urban-art", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:urban-art", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:urban-art/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + "AnythingIsPossible": { + "ID": 109479402, + "name": "AnythingIsPossible", + "slug": "anythingispossible", + "description": "", + "post_count": 15, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:anythingispossible", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:anythingispossible/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "anythingispossible" + }, + "mural": { + "ID": 159763, + "name": "mural", + "slug": "mural", + "description": "", + "post_count": 4, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:mural", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:mural/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "mural" + }, + "mural art": { + "ID": 5762997, + "name": "mural art", + "slug": "mural-art", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:mural-art", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:mural-art/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "mural-art" + }, + "murals": { + "ID": 135373, + "name": "murals", + "slug": "murals", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:murals", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:murals/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "murals" + }, + "street art": { + "ID": 57447, + "name": "street art", + "slug": "street-art", + "description": "", + "post_count": 18, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:street-art", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:street-art/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "street-art" + }, + "urban art": { + "ID": 28923, + "name": "urban art", + "slug": "urban-art", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:urban-art", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:urban-art/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "urban-art" + } + }, + "categories": { + "Art": { + "ID": 177, + "name": "Art", + "slug": "art", + "description": "Artists' sites, powerful artwork in multiple genres in a variety of mediums, and news from the art world.", + "post_count": 370, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:art", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:art/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Culture": { + "ID": 1098, + "name": "Culture", + "slug": "culture", + "description": "A curated collection of WordPress sites on society, culture in all its forms, and diverse art forms from around the world.", + "post_count": 414, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:culture", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:culture/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Diversity": { + "ID": 47458, + "name": "Diversity", + "slug": "diversity", + "description": "Blogs, stories, and web projects that highlight activists working towards greater diversity in culture, politics, and the business world.", + "post_count": 131, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:diversity", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:diversity/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Feminism": { + "ID": 553, + "name": "Feminism", + "slug": "feminism", + "description": "Magazines, collaborative websites, and feminist blogs that cover important issues in politics, culture, diversity, and the fight for gender equality.", + "post_count": 99, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:feminism", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:feminism/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Inspiration": { + "ID": 107, + "name": "Inspiration", + "slug": "inspiration", + "description": "Ideas and advice to empower and motivate people – especially bloggers, writers, and creative types – in their personal or professional journeys.", + "post_count": 327, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:inspiration", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:inspiration/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Popular Culture": { + "ID": 2437, + "name": "Popular Culture", + "slug": "popular-culture", + "description": "The web's leading pop culture magazines and blogs, covering music, film, television, gaming, and more.", + "post_count": 198, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:popular-culture", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:popular-culture/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "attachments": { + "37226": { + "ID": 37226, + "URL": "https://discover.files.wordpress.com/2019/05/img_3760.jpg", + "guid": "http://discover.files.wordpress.com/2019/05/img_3760.jpg", + "date": "2019-05-21T23:48:08-04:00", + "post_ID": 37222, + "author_ID": 47411601, + "file": "img_3760.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "IMG_3760", + "caption": "", + "description": "", + "alt": "Kelsey Montague mural art", + "thumbnails": { + "thumbnail": "https://discover.files.wordpress.com/2019/05/img_3760.jpg?w=113", + "medium": "https://discover.files.wordpress.com/2019/05/img_3760.jpg?w=311", + "large": "https://discover.files.wordpress.com/2019/05/img_3760.jpg?w=768" + }, + "height": 1706, + "width": 1280, + "exif": { + "aperture": "1.8", + "credit": "", + "camera": "iPhone 8 Plus", + "caption": "", + "created_timestamp": "1536421883", + "copyright": "", + "focal_length": "3.99", + "iso": "20", + "shutter_speed": "0.0014836795252226", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/media/37226", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/media/37226/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37222" + } + } + } + }, + "attachment_count": 1, + "metadata": [ + { + "id": "130242", + "key": "geo_public", + "value": "0" + }, + { + "id": "130230", + "key": "_thumbnail_id", + "value": "37226" + }, + { + "id": "130401", + "key": "_wpas_done_17927786", + "value": "1" + }, + { + "id": "130238", + "key": "_wpas_mess", + "value": "Visit @kelsmontagueart's website - featured on @wordpressdotcom's #AnythingIsPossible list - for inspiration, prints, and updates on Kelsey's latest mural projects." + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/read/sites/53424024/posts/37222", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/posts/37222/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37222/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37222/likes/" + }, + "data": { + "site": { + "ID": 53424024, + "name": "Discover", + "description": "A daily selection of the best content published on WordPress, collected for you by humans who love to read.", + "URL": "https://discover.wordpress.com", + "jetpack": false, + "post_count": 3603, + "subscribers_count": 35192480, + "locale": "en", + "icon": { + "img": "https://secure.gravatar.com/blavatar/c9e4e04719c81ca4936a63ea2dce6ace", + "ico": "https://secure.gravatar.com/blavatar/c9e4e04719c81ca4936a63ea2dce6ace" + }, + "logo": { + "id": 0, + "sizes": [ + + ], + "url": "" + }, + "visible": true, + "is_private": false, + "is_following": true, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/help", + "posts": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/posts/", + "comments": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/comments/", + "xmlrpc": "https://discover.wordpress.com/xmlrpc.php" + } + } + } + } + }, + "capabilities": { + "publish_post": false, + "delete_post": false, + "edit_post": false + }, + "other_URLs": { + }, + "discover_metadata": { + "permalink": "https://kelseymontagueart.com/", + "attribution": { + "author_name": "Krista Stevens", + "author_url": "https://kelseymontagueart.com/", + "blog_name": "Kelsey Montague Art", + "blog_url": "https://kelseymontagueart.com", + "avatar_url": "https://discover.files.wordpress.com/2019/05/kelsey-thumbnail.png?w=100&h=100&crop=true" + }, + "discover_fp_post_formats": [ + { + "name": "Pick", + "slug": "pick", + "id": 346750 + }, + { + "name": "Site Pick", + "slug": "site-pick", + "id": 308219249 + } + ], + "featured_post_wpcom_data": { + "blog_id": 161169196 + } + }, + "feed_ID": 41325786, + "feed_URL": "http://discover.wordpress.com", + "pseudo_ID": "b06fd6b4fd1b95644d71981f34f747f8", + "is_external": false, + "site_name": "Discover", + "site_URL": "https://discover.wordpress.com", + "site_is_private": false, + "featured_media": { + }, + "use_excerpt": false, + "is_following_conversation": false + } + }, + { + "type": "post", + "data": { + "ID": 37189, + "site_ID": 53424024, + "author": { + "ID": 10183950, + "login": "cherilucas", + "email": false, + "name": "Cheri Lucas Rowlands", + "first_name": "Cheri", + "last_name": "Rowlands", + "nice_name": "cherilucas", + "URL": "http://cherilucasrowlands.com", + "avatar_URL": "https://0.gravatar.com/avatar/36207d4c7c014b0999b995ca3971d383?s=96&d=identicon&r=G", + "profile_URL": "http://en.gravatar.com/cherilucas", + "site_ID": 9838404, + "has_avatar": true + }, + "date": "{{now offset='-1 days'}}", + "modified": "{{now offset='-1 days'}}", + "title": "The Radical Notion of Not Letting Work Define You", + "URL": "https://discover.wordpress.com/2019/05/26/the-radical-notion-of-not-letting-work-define-you/", + "short_URL": "https://wp.me/p3Ca1O-9FP", + "content": "

“Just because something can’t be a career doesn’t have to mean that it can’t be part of your life and identity.” At Man Repeller, Molly Conway muses on imposter syndrome, work and identity, and being a playwright.

\n", + "excerpt": "

“Just because something can’t be a career doesn’t have to mean that it can’t be part of your life and identity.” At Man Repeller, Molly Conway muses on imposter syndrome, work and identity, and being a playwright.

\n", + "slug": "the-radical-notion-of-not-letting-work-define-you", + "guid": "https://discover.wordpress.com/?p=37189", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": false, + "comment_status": "closed", + "pings_open": false, + "ping_status": "closed", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 102, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "eedec98542f8cbec7df4d4c608c847ef", + "featured_image": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-20-at-11.50.07-am.png", + "post_thumbnail": { + "ID": 37191, + "URL": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-20-at-11.50.07-am.png", + "guid": "http://discover.files.wordpress.com/2019/05/screen-shot-2019-05-20-at-11.50.07-am.png", + "mime_type": "image/png", + "width": 1482, + "height": 988 + }, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Identity": { + "ID": 10679, + "name": "Identity", + "slug": "identity", + "description": "Engaging conversations and writing around the topics of identity, diversity, and the search for authenticity.", + "post_count": 166, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:identity", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:identity/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Personal Essay": { + "ID": 253221, + "name": "Personal Essay", + "slug": "personal-essay", + "description": "Personal and introspective essays and longform from new and established writers and authors.", + "post_count": 156, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:personal-essay", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:personal-essay/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Personal Musings": { + "ID": 5316, + "name": "Personal Musings", + "slug": "personal-musings", + "description": "Introspective and self-reflective writing in various formats.", + "post_count": 437, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:personal-musings", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:personal-musings/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Work": { + "ID": 131, + "name": "Work", + "slug": "work", + "description": "From tech to farming, posts and websites dedicated to the many facets of work, work-life balance, and social inequality.", + "post_count": 80, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:work", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:work/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Writing": { + "ID": 349, + "name": "Writing", + "slug": "writing", + "description": "Writing, advice, and commentary on the act and process of writing, blogging, and publishing.", + "post_count": 437, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:writing", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:writing/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "post_tag": { + "imposter syndrome": { + "ID": 392126, + "name": "imposter syndrome", + "slug": "imposter-syndrome", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:imposter-syndrome", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:imposter-syndrome/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "playwright": { + "ID": 160393, + "name": "playwright", + "slug": "playwright", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:playwright", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:playwright/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "PoweredByWordPress": { + "ID": 76162589, + "name": "PoweredByWordPress", + "slug": "poweredbywordpress", + "description": "", + "post_count": 42, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:poweredbywordpress", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:poweredbywordpress/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "writers": { + "ID": 16761, + "name": "writers", + "slug": "writers", + "description": "", + "post_count": 70, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:writers", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:writers/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + "imposter syndrome": { + "ID": 392126, + "name": "imposter syndrome", + "slug": "imposter-syndrome", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:imposter-syndrome", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:imposter-syndrome/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "imposter-syndrome" + }, + "playwright": { + "ID": 160393, + "name": "playwright", + "slug": "playwright", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:playwright", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:playwright/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "playwright" + }, + "PoweredByWordPress": { + "ID": 76162589, + "name": "PoweredByWordPress", + "slug": "poweredbywordpress", + "description": "", + "post_count": 42, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:poweredbywordpress", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:poweredbywordpress/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "poweredbywordpress" + }, + "writers": { + "ID": 16761, + "name": "writers", + "slug": "writers", + "description": "", + "post_count": 70, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:writers", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:writers/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "writers" + } + }, + "categories": { + "Identity": { + "ID": 10679, + "name": "Identity", + "slug": "identity", + "description": "Engaging conversations and writing around the topics of identity, diversity, and the search for authenticity.", + "post_count": 166, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:identity", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:identity/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Personal Essay": { + "ID": 253221, + "name": "Personal Essay", + "slug": "personal-essay", + "description": "Personal and introspective essays and longform from new and established writers and authors.", + "post_count": 156, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:personal-essay", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:personal-essay/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Personal Musings": { + "ID": 5316, + "name": "Personal Musings", + "slug": "personal-musings", + "description": "Introspective and self-reflective writing in various formats.", + "post_count": 437, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:personal-musings", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:personal-musings/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Work": { + "ID": 131, + "name": "Work", + "slug": "work", + "description": "From tech to farming, posts and websites dedicated to the many facets of work, work-life balance, and social inequality.", + "post_count": 80, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:work", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:work/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Writing": { + "ID": 349, + "name": "Writing", + "slug": "writing", + "description": "Writing, advice, and commentary on the act and process of writing, blogging, and publishing.", + "post_count": 437, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:writing", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:writing/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "attachments": { + "37191": { + "ID": 37191, + "URL": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-20-at-11.50.07-am.png", + "guid": "http://discover.files.wordpress.com/2019/05/screen-shot-2019-05-20-at-11.50.07-am.png", + "date": "2019-05-20T14:50:23-04:00", + "post_ID": 37189, + "author_ID": 10183950, + "file": "screen-shot-2019-05-20-at-11.50.07-am.png", + "mime_type": "image/png", + "extension": "png", + "title": "man repeller header image", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-20-at-11.50.07-am.png?w=150", + "medium": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-20-at-11.50.07-am.png?w=315", + "large": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-20-at-11.50.07-am.png?w=1220" + }, + "height": 988, + "width": 1482, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/media/37191", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/media/37191/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37189" + } + } + }, + "37192": { + "ID": 37192, + "URL": "https://discover.files.wordpress.com/2019/05/man-repeller-logo.jpg", + "guid": "http://discover.files.wordpress.com/2019/05/man-repeller-logo.jpg", + "date": "2019-05-20T14:50:47-04:00", + "post_ID": 37189, + "author_ID": 10183950, + "file": "man-repeller-logo.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "man repeller logo", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://discover.files.wordpress.com/2019/05/man-repeller-logo.jpg?w=150", + "medium": "https://discover.files.wordpress.com/2019/05/man-repeller-logo.jpg?w=315", + "large": "https://discover.files.wordpress.com/2019/05/man-repeller-logo.jpg?w=400" + }, + "height": 400, + "width": 400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/media/37192", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/media/37192/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37189" + } + } + } + }, + "attachment_count": 2, + "metadata": [ + { + "id": "130145", + "key": "geo_public", + "value": "0" + }, + { + "id": "130142", + "key": "_thumbnail_id", + "value": "37191" + }, + { + "id": "130392", + "key": "_wpas_done_17926349", + "value": "1" + }, + { + "id": "130146", + "key": "_wpas_mess", + "value": "\"Just because something can’t be a career doesn’t have to mean that it can’t be part of your life and identity.\" Molly Conway muses on imposter syndrome, work and identity, and being a playwright. (@ManRepeller)" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/read/sites/53424024/posts/37189", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/posts/37189/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37189/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37189/likes/" + }, + "data": { + "site": { + "ID": 53424024, + "name": "Discover", + "description": "A daily selection of the best content published on WordPress, collected for you by humans who love to read.", + "URL": "https://discover.wordpress.com", + "jetpack": false, + "post_count": 3603, + "subscribers_count": 35192480, + "locale": "en", + "icon": { + "img": "https://secure.gravatar.com/blavatar/c9e4e04719c81ca4936a63ea2dce6ace", + "ico": "https://secure.gravatar.com/blavatar/c9e4e04719c81ca4936a63ea2dce6ace" + }, + "logo": { + "id": 0, + "sizes": [ + + ], + "url": "" + }, + "visible": true, + "is_private": false, + "is_following": true, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/help", + "posts": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/posts/", + "comments": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/comments/", + "xmlrpc": "https://discover.wordpress.com/xmlrpc.php" + } + } + } + } + }, + "capabilities": { + "publish_post": false, + "delete_post": false, + "edit_post": false + }, + "other_URLs": { + }, + "discover_metadata": { + "permalink": "https://www.manrepeller.com/2019/05/work-identity.html", + "attribution": { + "author_name": "Molly Conway", + "author_url": "https://www.manrepeller.com/author/molly-conway", + "blog_name": "Man Repeller", + "blog_url": "https://www.manrepeller.com", + "avatar_url": "https://discover.files.wordpress.com/2019/05/man-repeller-logo.jpg?w=100&h=100&crop=true" + }, + "discover_fp_post_formats": [ + { + "name": "Pick", + "slug": "pick", + "id": 346750 + }, + { + "name": "Standard Pick", + "slug": "standard-pick", + "id": 337879995 + } + ], + "featured_post_wpcom_data": { + "blog_id": 61780023 + } + }, + "feed_ID": 41325786, + "feed_URL": "http://discover.wordpress.com", + "pseudo_ID": "eedec98542f8cbec7df4d4c608c847ef", + "is_external": false, + "site_name": "Discover", + "site_URL": "https://discover.wordpress.com", + "site_is_private": false, + "featured_media": { + "uri": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-20-at-11.50.07-am.png", + "width": 1482, + "height": 988, + "type": "image" + }, + "use_excerpt": false, + "is_following_conversation": false + } + }, + { + "type": "post", + "data": { + "ID": 37205, + "site_ID": 53424024, + "author": { + "ID": 47411601, + "login": "benhuberman", + "email": false, + "name": "Ben Huberman", + "first_name": "Ben", + "last_name": "Huberman", + "nice_name": "benhuberman", + "URL": "https://benz.blog/", + "avatar_URL": "https://0.gravatar.com/avatar/663dcd498e8c5f255bfb230a7ba07678?s=96&d=identicon&r=G", + "profile_URL": "http://en.gravatar.com/benhuberman", + "site_ID": 122910962, + "has_avatar": true + }, + "date": "2019-05-25T09:00:36-04:00", + "modified": "2019-05-21T23:45:15-04:00", + "title": "Barista Hustle", + "URL": "https://discover.wordpress.com/2019/05/25/barista-hustle/", + "short_URL": "https://wp.me/p3Ca1O-9G5", + "content": "\n

The team at Barista Hustle, a leading coffee-education hub, creates resources and shares their extensive knowledge on topics ranging from cutting-edge gear to latte art.

\n", + "excerpt": "

The team at Barista Hustle, a leading coffee-education hub, creates resources and shares their extensive knowledge on topics ranging from cutting-edge gear to latte art.

\n", + "slug": "barista-hustle", + "guid": "https://discover.wordpress.com/?p=37205", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": false, + "comment_status": "closed", + "pings_open": false, + "ping_status": "closed", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 58, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "5344123ea1ee2da1788f11183966d068", + "featured_image": "https://discover.files.wordpress.com/2019/05/bh-home-header-element-wide-final.jpg", + "post_thumbnail": { + "ID": 37206, + "URL": "https://discover.files.wordpress.com/2019/05/bh-home-header-element-wide-final.jpg", + "guid": "http://discover.files.wordpress.com/2019/05/bh-home-header-element-wide-final.jpg", + "mime_type": "image/jpeg", + "width": 2800, + "height": 1500 + }, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Business": { + "ID": 179, + "name": "Business", + "slug": "business", + "description": "Small business and ecommerce resources, writing for professionals, and commentary on business, economics, and related topics.", + "post_count": 88, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:business", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:business/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Education": { + "ID": 1342, + "name": "Education", + "slug": "education", + "description": "Resources across disciplines and perspectives on teaching, learning, and the educational system from educators, teachers, and parents.", + "post_count": 121, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:education", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:education/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Food": { + "ID": 586, + "name": "Food", + "slug": "food", + "description": "Recipes, writing on food and culinary culture, and food photography or visual art.", + "post_count": 215, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:food", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:food/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Lifestyle": { + "ID": 278, + "name": "Lifestyle", + "slug": "lifestyle", + "description": "Sites devoted to fashion and beauty, interior design, travel, alternative ways of living, and more.", + "post_count": 127, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:lifestyle", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:lifestyle/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Work": { + "ID": 131, + "name": "Work", + "slug": "work", + "description": "From tech to farming, posts and websites dedicated to the many facets of work, work-life balance, and social inequality.", + "post_count": 80, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:work", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:work/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "post_tag": { + "Baristas": { + "ID": 831444, + "name": "Baristas", + "slug": "baristas", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:baristas", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:baristas/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "business blog": { + "ID": 287435, + "name": "business blog", + "slug": "business-blog", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:business-blog", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:business-blog/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "coffee": { + "ID": 16166, + "name": "coffee", + "slug": "coffee", + "description": "", + "post_count": 10, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:coffee", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:coffee/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "ecommerce": { + "ID": 11160, + "name": "ecommerce", + "slug": "ecommerce", + "description": "", + "post_count": 10, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:ecommerce", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:ecommerce/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Small Business": { + "ID": 10585, + "name": "Small Business", + "slug": "small-business", + "description": "", + "post_count": 37, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:small-business", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:small-business/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + "Baristas": { + "ID": 831444, + "name": "Baristas", + "slug": "baristas", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:baristas", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:baristas/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "baristas" + }, + "business blog": { + "ID": 287435, + "name": "business blog", + "slug": "business-blog", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:business-blog", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:business-blog/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "business-blog" + }, + "coffee": { + "ID": 16166, + "name": "coffee", + "slug": "coffee", + "description": "", + "post_count": 10, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:coffee", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:coffee/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "coffee" + }, + "ecommerce": { + "ID": 11160, + "name": "ecommerce", + "slug": "ecommerce", + "description": "", + "post_count": 10, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:ecommerce", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:ecommerce/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "ecommerce" + }, + "Small Business": { + "ID": 10585, + "name": "Small Business", + "slug": "small-business", + "description": "", + "post_count": 37, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:small-business", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:small-business/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "small-business" + } + }, + "categories": { + "Business": { + "ID": 179, + "name": "Business", + "slug": "business", + "description": "Small business and ecommerce resources, writing for professionals, and commentary on business, economics, and related topics.", + "post_count": 88, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:business", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:business/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Education": { + "ID": 1342, + "name": "Education", + "slug": "education", + "description": "Resources across disciplines and perspectives on teaching, learning, and the educational system from educators, teachers, and parents.", + "post_count": 121, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:education", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:education/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Food": { + "ID": 586, + "name": "Food", + "slug": "food", + "description": "Recipes, writing on food and culinary culture, and food photography or visual art.", + "post_count": 215, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:food", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:food/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Lifestyle": { + "ID": 278, + "name": "Lifestyle", + "slug": "lifestyle", + "description": "Sites devoted to fashion and beauty, interior design, travel, alternative ways of living, and more.", + "post_count": 127, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:lifestyle", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:lifestyle/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Work": { + "ID": 131, + "name": "Work", + "slug": "work", + "description": "From tech to farming, posts and websites dedicated to the many facets of work, work-life balance, and social inequality.", + "post_count": 80, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:work", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:work/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + { + "id": "130216", + "key": "geo_public", + "value": "0" + }, + { + "id": "130206", + "key": "_thumbnail_id", + "value": "37206" + }, + { + "id": "130379", + "key": "_wpas_done_17927786", + "value": "1" + }, + { + "id": "130212", + "key": "_wpas_mess", + "value": "Whether you're a coffee professional, an aspiring latte artist, or just looking to improve your next cup, check out the resources and courses @BaristaHustle, a #PoweredByWordPress website:" + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/read/sites/53424024/posts/37205", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/posts/37205/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37205/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37205/likes/" + }, + "data": { + "site": { + "ID": 53424024, + "name": "Discover", + "description": "A daily selection of the best content published on WordPress, collected for you by humans who love to read.", + "URL": "https://discover.wordpress.com", + "jetpack": false, + "post_count": 3603, + "subscribers_count": 35192480, + "locale": "en", + "icon": { + "img": "https://secure.gravatar.com/blavatar/c9e4e04719c81ca4936a63ea2dce6ace", + "ico": "https://secure.gravatar.com/blavatar/c9e4e04719c81ca4936a63ea2dce6ace" + }, + "logo": { + "id": 0, + "sizes": [ + + ], + "url": "" + }, + "visible": true, + "is_private": false, + "is_following": true, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/help", + "posts": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/posts/", + "comments": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/comments/", + "xmlrpc": "https://discover.wordpress.com/xmlrpc.php" + } + } + } + } + }, + "capabilities": { + "publish_post": false, + "delete_post": false, + "edit_post": false + }, + "other_URLs": { + }, + "discover_metadata": { + "permalink": "https://baristahustle.com/", + "attribution": { + "author_name": "Krista Stevens", + "author_url": "https://baristahustle.com/", + "blog_name": "Barista Hustle", + "blog_url": "https://baristahustle.com", + "avatar_url": "https://discover.files.wordpress.com/2019/05/bh-logo-new-512-1-400x400.png?w=100&h=100&crop=true" + }, + "discover_fp_post_formats": [ + { + "name": "Pick", + "slug": "pick", + "id": 346750 + }, + { + "name": "Site Pick", + "slug": "site-pick", + "id": 308219249 + } + ], + "featured_post_wpcom_data": { + "blog_id": 82609915 + } + }, + "feed_ID": 41325786, + "feed_URL": "http://discover.wordpress.com", + "pseudo_ID": "5344123ea1ee2da1788f11183966d068", + "is_external": false, + "site_name": "Discover", + "site_URL": "https://discover.wordpress.com", + "site_is_private": false, + "featured_media": { + }, + "use_excerpt": false, + "is_following_conversation": false + } + }, + { + "type": "post", + "data": { + "ID": 37123, + "site_ID": 53424024, + "author": { + "ID": 10183950, + "login": "cherilucas", + "email": false, + "name": "Cheri Lucas Rowlands", + "first_name": "Cheri", + "last_name": "Rowlands", + "nice_name": "cherilucas", + "URL": "http://cherilucasrowlands.com", + "avatar_URL": "https://0.gravatar.com/avatar/36207d4c7c014b0999b995ca3971d383?s=96&d=identicon&r=G", + "profile_URL": "http://en.gravatar.com/cherilucas", + "site_ID": 9838404, + "has_avatar": true + }, + "date": "2019-05-24T09:00:50-04:00", + "modified": "2019-05-22T17:07:30-04:00", + "title": "Lonely Planet Kids", + "URL": "https://discover.wordpress.com/2019/05/24/lonely-planet-kids/", + "short_URL": "https://wp.me/p3Ca1O-9EL", + "content": "

Lonely Planet Kids — an offshoot of the popular travel guide company –inspires children to be curious about the world. The site features books, activities, family travel posts, and more.

\n", + "excerpt": "

Lonely Planet Kids — an offshoot of the popular travel guide company –inspires children to be curious about the world. The site features books, activities, family travel posts, and more.

\n", + "slug": "lonely-planet-kids", + "guid": "https://discover.wordpress.com/?p=37123", + "status": "publish", + "sticky": false, + "password": "", + "parent": false, + "type": "post", + "discussion": { + "comments_open": false, + "comment_status": "closed", + "pings_open": false, + "ping_status": "closed", + "comment_count": 0 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 49, + "i_like": false, + "is_reblogged": false, + "is_following": true, + "global_ID": "12ac818a3de41e3b0cf84fea7efa2592", + "featured_image": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-10-at-3.53.09-pm.png", + "post_thumbnail": { + "ID": 37125, + "URL": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-10-at-3.53.09-pm.png", + "guid": "http://discover.files.wordpress.com/2019/05/screen-shot-2019-05-10-at-3.53.09-pm.png", + "mime_type": "image/png", + "width": 1434, + "height": 808 + }, + "format": "standard", + "geo": false, + "menu_order": 0, + "page_template": "", + "publicize_URLs": [ + + ], + "terms": { + "category": { + "Books": { + "ID": 178, + "name": "Books", + "slug": "books", + "description": "Writing, reviews, resources, and news on books, authors, reading, and publishing.", + "post_count": 233, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:books", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:books/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Education": { + "ID": 1342, + "name": "Education", + "slug": "education", + "description": "Resources across disciplines and perspectives on teaching, learning, and the educational system from educators, teachers, and parents.", + "post_count": 121, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:education", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:education/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Exploration": { + "ID": 7543, + "name": "Exploration", + "slug": "exploration", + "description": "Writing and photography on travel, self-discovery, research, observation, and more.", + "post_count": 147, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:exploration", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:exploration/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Family": { + "ID": 406, + "name": "Family", + "slug": "family", + "description": "Writing that encompasses aspects of family, including marriage, parenting, childhood, relationships, and ancestry.", + "post_count": 226, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:family", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:family/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Inspiration": { + "ID": 107, + "name": "Inspiration", + "slug": "inspiration", + "description": "Ideas and advice to empower and motivate people – especially bloggers, writers, and creative types – in their personal or professional journeys.", + "post_count": 327, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:inspiration", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:inspiration/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Parenting": { + "ID": 5309, + "name": "Parenting", + "slug": "parenting", + "description": "Writing and resources on parenting, motherhood, marriage, and family.", + "post_count": 141, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:parenting", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:parenting/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Publishing": { + "ID": 3330, + "name": "Publishing", + "slug": "publishing", + "description": "Writers and editors discussing publishing-industry news, the ins and outs of the literary world, and their own journey to a published book.", + "post_count": 124, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:publishing", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:publishing/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Reading": { + "ID": 1473, + "name": "Reading", + "slug": "reading", + "description": "Posts and book blogs that focus on authors, book reviews, and the pleasures of reading in the digital age.", + "post_count": 143, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:reading", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:reading/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Travel": { + "ID": 200, + "name": "Travel", + "slug": "travel", + "description": "Blogs, online guides, and trip planning resources devoted to travel, exploration, the outdoors, expat life, and global culture.", + "post_count": 247, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:travel", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:travel/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Wanderlust": { + "ID": 13181, + "name": "Wanderlust", + "slug": "wanderlust", + "description": "Stunning travel photography, travel and lifestyle sites, and blog posts on the joys and rewards of exploring new destinations.", + "post_count": 97, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:wanderlust", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:wanderlust/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "post_tag": { + "activities": { + "ID": 6751, + "name": "activities", + "slug": "activities", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:activities", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:activities/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "children": { + "ID": 1343, + "name": "children", + "slug": "children", + "description": "", + "post_count": 28, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:children", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:children/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "family travel": { + "ID": 421426, + "name": "family travel", + "slug": "family-travel", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:family-travel", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:family-travel/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "imagination": { + "ID": 10906, + "name": "imagination", + "slug": "imagination", + "description": "", + "post_count": 7, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:imagination", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:imagination/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "kids": { + "ID": 3374, + "name": "kids", + "slug": "kids", + "description": "", + "post_count": 14, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:kids", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:kids/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Lonely Planet": { + "ID": 232853, + "name": "Lonely Planet", + "slug": "lonely-planet", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:lonely-planet", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:lonely-planet/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Teaching": { + "ID": 1591, + "name": "Teaching", + "slug": "teaching", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:teaching", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:teaching/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "post_format": { + }, + "mentions": { + } + }, + "tags": { + "activities": { + "ID": 6751, + "name": "activities", + "slug": "activities", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:activities", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:activities/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "activities" + }, + "children": { + "ID": 1343, + "name": "children", + "slug": "children", + "description": "", + "post_count": 28, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:children", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:children/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "children" + }, + "family travel": { + "ID": 421426, + "name": "family travel", + "slug": "family-travel", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:family-travel", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:family-travel/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "family-travel" + }, + "imagination": { + "ID": 10906, + "name": "imagination", + "slug": "imagination", + "description": "", + "post_count": 7, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:imagination", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:imagination/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "imagination" + }, + "kids": { + "ID": 3374, + "name": "kids", + "slug": "kids", + "description": "", + "post_count": 14, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:kids", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:kids/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "kids" + }, + "Lonely Planet": { + "ID": 232853, + "name": "Lonely Planet", + "slug": "lonely-planet", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:lonely-planet", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:lonely-planet/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "lonely-planet" + }, + "Teaching": { + "ID": 1591, + "name": "Teaching", + "slug": "teaching", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/tags/slug:teaching", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/tags/slug:teaching/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + }, + "display_name": "teaching" + } + }, + "categories": { + "Books": { + "ID": 178, + "name": "Books", + "slug": "books", + "description": "Writing, reviews, resources, and news on books, authors, reading, and publishing.", + "post_count": 233, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:books", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:books/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Education": { + "ID": 1342, + "name": "Education", + "slug": "education", + "description": "Resources across disciplines and perspectives on teaching, learning, and the educational system from educators, teachers, and parents.", + "post_count": 121, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:education", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:education/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Exploration": { + "ID": 7543, + "name": "Exploration", + "slug": "exploration", + "description": "Writing and photography on travel, self-discovery, research, observation, and more.", + "post_count": 147, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:exploration", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:exploration/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Family": { + "ID": 406, + "name": "Family", + "slug": "family", + "description": "Writing that encompasses aspects of family, including marriage, parenting, childhood, relationships, and ancestry.", + "post_count": 226, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:family", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:family/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Inspiration": { + "ID": 107, + "name": "Inspiration", + "slug": "inspiration", + "description": "Ideas and advice to empower and motivate people – especially bloggers, writers, and creative types – in their personal or professional journeys.", + "post_count": 327, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:inspiration", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:inspiration/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Parenting": { + "ID": 5309, + "name": "Parenting", + "slug": "parenting", + "description": "Writing and resources on parenting, motherhood, marriage, and family.", + "post_count": 141, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:parenting", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:parenting/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Publishing": { + "ID": 3330, + "name": "Publishing", + "slug": "publishing", + "description": "Writers and editors discussing publishing-industry news, the ins and outs of the literary world, and their own journey to a published book.", + "post_count": 124, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:publishing", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:publishing/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Reading": { + "ID": 1473, + "name": "Reading", + "slug": "reading", + "description": "Posts and book blogs that focus on authors, book reviews, and the pleasures of reading in the digital age.", + "post_count": 143, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:reading", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:reading/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Travel": { + "ID": 200, + "name": "Travel", + "slug": "travel", + "description": "Blogs, online guides, and trip planning resources devoted to travel, exploration, the outdoors, expat life, and global culture.", + "post_count": 247, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:travel", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:travel/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + }, + "Wanderlust": { + "ID": 13181, + "name": "Wanderlust", + "slug": "wanderlust", + "description": "Stunning travel photography, travel and lifestyle sites, and blog posts on the joys and rewards of exploring new destinations.", + "post_count": 97, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/categories/slug:wanderlust", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/categories/slug:wanderlust/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024" + } + } + } + }, + "attachments": { + "37125": { + "ID": 37125, + "URL": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-10-at-3.53.09-pm.png", + "guid": "http://discover.files.wordpress.com/2019/05/screen-shot-2019-05-10-at-3.53.09-pm.png", + "date": "2019-05-10T18:53:26-04:00", + "post_ID": 37123, + "author_ID": 10183950, + "file": "screen-shot-2019-05-10-at-3.53.09-pm.png", + "mime_type": "image/png", + "extension": "png", + "title": "lonely planet kids header", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-10-at-3.53.09-pm.png?w=150", + "medium": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-10-at-3.53.09-pm.png?w=315", + "large": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-10-at-3.53.09-pm.png?w=1220" + }, + "height": 808, + "width": 1434, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/media/37125", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/media/37125/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37123" + } + } + }, + "37126": { + "ID": 37126, + "URL": "https://discover.files.wordpress.com/2019/05/lonely-planet-kids-logo.png", + "guid": "http://discover.files.wordpress.com/2019/05/lonely-planet-kids-logo.png", + "date": "2019-05-10T18:53:28-04:00", + "post_ID": 37123, + "author_ID": 10183950, + "file": "lonely-planet-kids-logo.png", + "mime_type": "image/png", + "extension": "png", + "title": "lonely planet kids logo", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://discover.files.wordpress.com/2019/05/lonely-planet-kids-logo.png?w=150", + "medium": "https://discover.files.wordpress.com/2019/05/lonely-planet-kids-logo.png?w=315", + "large": "https://discover.files.wordpress.com/2019/05/lonely-planet-kids-logo.png?w=400" + }, + "height": 400, + "width": 400, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "0", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/media/37126", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/media/37126/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37123" + } + } + } + }, + "attachment_count": 2, + "metadata": [ + { + "id": "129821", + "key": "geo_public", + "value": "0" + }, + { + "id": "129818", + "key": "_thumbnail_id", + "value": "37125" + }, + { + "id": "130369", + "key": "_wpas_done_17926349", + "value": "1" + }, + { + "id": "129822", + "key": "_wpas_mess", + "value": "Lonely Planet Kids (@lpkids) inspires children to be curious about the world. The #PoweredByWordPress site features children's books, activities, family travel resources, and more." + } + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/read/sites/53424024/posts/37123", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/posts/37123/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37123/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/posts/37123/likes/" + }, + "data": { + "site": { + "ID": 53424024, + "name": "Discover", + "description": "A daily selection of the best content published on WordPress, collected for you by humans who love to read.", + "URL": "https://discover.wordpress.com", + "jetpack": false, + "post_count": 3603, + "subscribers_count": 35192480, + "locale": "en", + "icon": { + "img": "https://secure.gravatar.com/blavatar/c9e4e04719c81ca4936a63ea2dce6ace", + "ico": "https://secure.gravatar.com/blavatar/c9e4e04719c81ca4936a63ea2dce6ace" + }, + "logo": { + "id": 0, + "sizes": [ + + ], + "url": "" + }, + "visible": true, + "is_private": false, + "is_following": true, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024", + "help": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/help", + "posts": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/53424024/posts/", + "comments": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/53424024/comments/", + "xmlrpc": "https://discover.wordpress.com/xmlrpc.php" + } + } + } + } + }, + "capabilities": { + "publish_post": false, + "delete_post": false, + "edit_post": false + }, + "other_URLs": { + }, + "discover_metadata": { + "permalink": "https://www.lonelyplanet.com/kids/", + "attribution": { + "author_name": "Contributors", + "author_url": "https://www.lonelyplanet.com/kids/about/", + "blog_name": "Lonely Planet Kids", + "blog_url": "https://www.lonelyplanet.com", + "avatar_url": "https://discover.files.wordpress.com/2019/05/lonely-planet-kids-logo.png?w=100&h=100&crop=true" + }, + "discover_fp_post_formats": [ + { + "name": "Pick", + "slug": "pick", + "id": 346750 + }, + { + "name": "Site Pick", + "slug": "site-pick", + "id": 308219249 + } + ] + }, + "feed_ID": 41325786, + "feed_URL": "http://discover.wordpress.com", + "pseudo_ID": "12ac818a3de41e3b0cf84fea7efa2592", + "is_external": false, + "site_name": "Discover", + "site_URL": "https://discover.wordpress.com", + "site_is_private": false, + "featured_media": { + "uri": "https://discover.files.wordpress.com/2019/05/screen-shot-2019-05-10-at-3.53.09-pm.png", + "width": 1434, + "height": 808, + "type": "image" + }, + "use_excerpt": false, + "is_following_conversation": false + } + }, + { + "type": "recommended_blogs", + "data": [ + { + "description": "A South Staffordshire Wildlife Journal", + "feed_ID": 49407045, + "feed_URL": "http://petehillmansnaturephotography.wordpress.com", + "icon": { + "img": "https://petehillmansnaturephotography.files.wordpress.com/2020/09/cropped-peter-hillman-a-nature-journey.jpg?w=96", + "ico": "https://petehillmansnaturephotography.files.wordpress.com/2020/09/cropped-peter-hillman-a-nature-journey.jpg?w=96" + }, + "ID": 112482965, + "is_private": false, + "jetpack": false, + "name": "A Nature Journey", + "prefer_feed": false, + "subscribers_count": 1968, + "subscription": { + "delivery_methods": { + "email": null, + "notification": { + "send_posts": false + } + } + }, + "URL": "http://petehillmansnaturephotography.wordpress.com" + }, + { + "description": "Jane's Lens", + "feed_ID": 1366484, + "feed_URL": "http://janeluriephotography.wordpress.com", + "icon": { + "img": "https://secure.gravatar.com/blavatar/3d272d8f6c1070fe12a4b778f2058c72", + "ico": "https://secure.gravatar.com/blavatar/3d272d8f6c1070fe12a4b778f2058c72" + }, + "ID": 26839598, + "is_private": false, + "jetpack": false, + "name": "Jane Lurie Photography", + "prefer_feed": false, + "subscribers_count": 6920, + "subscription": { + "delivery_methods": { + "email": null, + "notification": { + "send_posts": false + } + } + }, + "URL": "http://janeluriephotography.wordpress.com" + } + ] + }, + { + "type": "post", + "data": { + "ID": 10046, + "site_ID": 28958452, + "author": { + "ID": 28500267, + "login": "terriwebsterschrandt", + "email": false, + "name": "Terri Webster Schrandt", + "first_name": "Terri", + "last_name": "Webster Schrandt", + "nice_name": "terriwebsterschrandt", + "URL": "http://terriwebsterschrandt.wordpress.com", + "avatar_URL": "https://2.gravatar.com/avatar/8870e170782893e9891d83bc57e9c8df?s=96&d=retro&r=G", + "profile_URL": "https://en.gravatar.com/terriwebsterschrandt", + "site_ID": 28958452, + "has_avatar": true + }, + "date": "2020-09-27T07:00:00-07:00", + "modified": "2020-09-26T16:05:26-07:00", + "title": "Sunday Stills: Wishing for Water, But #Droplets Will Do", + "URL": "https://secondwindleisure.com/2020/09/27/sunday-stills-wishing-for-water-but-droplets-will-do/", + "short_URL": "https://wp.me/p1XvpO-2C2", + "content": "\n

My return to blogging was fun and satisfying after a tumultuous break! Thank you for welcoming me back last week. It was great to catch up with you!

\n\n\n\n

If you are confused by this week’s Sunday Stills post, we are examining the world of water droplets. In my dry, still excessively warm part of the world, if I want water, I must turn on the garden hose. Artificially produced water droplets will work!

\n\n\n\n
\"End
\n\n\n\n

After the few weeks of turmoil I recently experienced, I find calm and peace in my backyard garden any time of year.

\n\n\n\n

During our recent visit to Spokane, a few raindrops made their presence known by the end of the week.

\n\n\n\n
\"Evergreen
\n\n\n\n

After a long, dry spell, my current library of water droplets is depleted, so please enjoy a few of my favorites from the past:

\n\n\n\n
\"House
\n\n\n\n

My plumeria blossomed last year but no blooms this year. I’m pretty sure I blew up social media and my blog with images of plumeria last summer. Here are a couple donning their droplets from daily backyard watering.

\n\n\n\n\n\n\n\n

More flowers from my backyard include the Teddy Bear sunflower and the geranium in my deck garden.

\n\n\n\n\n\n\n\n

Hint: I’m sure it’s no secret, but if you need an image with water droplets pronto, use a mister or spray bottle and create your own droplets.

\n\n\n\n

If close-ups of water droplets aren’t your style, I included a couple of shots of suspended water drops:

\n\n\n\n

Catching a wall of water drops in Baja Mexico.

\n\n\n\n
\"Weightless
\n\n\n\n


I have to share this one again of Brodie romping through the river, stirring up loads of droplets.

\n\n\n\n
\"Brodie's
\n\n\n\n

No doubt, Spring has sprung in the Southern Hemisphere along with lots of opportunities to see water droplets in action. The calendar says that Autumn is here in the Northern Hemisphere, but we won’t see scenes like this in California until November!

\n\n\n\n
\"Layers
\n\n\n\n

As you know I also love taking part in other photo challenges and I love it when the planets align. I have been wanting to join Lisa’s Bird Weekly Challenge since I recently discovered it. Back in August, my lens captured this cute duck family (common merganser) out for a swim on Grant Lake in the June Lake loop in the Eastern Sierra Nevadas.

\n\n\n\n
\"\"
\n\n\n\n

Yes, it’s a bit of a stretch but my Canon Sureshot managed to capture water droplets on the feathers of the adult duck, seen best in the pic below. (Best I could do, Lisa, I think their legs are short enough)!

\n\n\n\n
\"\"
\n\n\n\n

Today’s images are partly inspired by two other fab photographers: Cee’s Flower of the Day and Jez’ Water, Water Everywhere.

\n\n\n\n

I’m hoping to live vicariously through your wonderful images of water droplets on flowers, plants, animals, whatever! Walls of water droplets cascading down from waves and fountains and other watery images also fit this week’s theme.

\n\n\n

Sunday Stills Photo Challenge Reminders

\n\n
  • Please create a new post for the theme.
  • Title your post a little differently than mine.
  • Don’t forget to create a pingback to this post so that other participants can read your post. I also recommend adding your post’s URL into the comments.
  • Entries for this theme can be shared all week. Use hashtag #SundayStills for sharing on social media.
\n\n\n

October themes are ready to view on my Sunday Stills page.

\n\n\n\n
\"\"
Original image Color Planet
\n\n\n\n

I look forward to you sharing your images of refreshing water droplets in whatever form they might take. Have a great week!

\n\n\n\n
\"SUPSIG\"
\n\n\n\n

© 2020 Copyright-All rights reserved-secondwindleisure.com

\n", + "excerpt": "

My return to blogging was fun and satisfying after a tumultuous break! Thank you for welcoming me back last week. It was great to catch up with you! If you are confused by this week’s Sunday Stills post, we are examining the world of water droplets. In my dry, still excessively warm part of the […]

\n", + "slug": "sunday-stills-wishing-for-water-but-droplets-will-do", + "guid": "http://secondwindleisure.com/?p=10046", + "status": "publish", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 80 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 77, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "6295b4c918b214147d966e6e8c6fe18e", + "featured_image": "https://terriwebsterschrandt.files.wordpress.com/2020/09/cp-drops.png", + "post_thumbnail": { + "ID": 10067, + "URL": "https://terriwebsterschrandt.files.wordpress.com/2020/09/cp-drops.png", + "guid": "http://terriwebsterschrandt.files.wordpress.com/2020/09/cp-drops.png", + "mime_type": "image/png", + "width": 1080, + "height": 1080 + }, + "format": "standard", + "tags": { + "birdweekly": { + "ID": 701015324, + "name": "birdweekly", + "slug": "birdweekly", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28958452/tags/slug:birdweekly", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28958452/tags/slug:birdweekly/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28958452" + } + } + }, + "Cees FOTD": { + "ID": 652598373, + "name": "Cees FOTD", + "slug": "cees-fotd", + "description": "", + "post_count": 19, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28958452/tags/slug:cees-fotd", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28958452/tags/slug:cees-fotd/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28958452" + } + } + }, + "gardening": { + "ID": 1833, + "name": "gardening", + "slug": "gardening", + "description": "", + "post_count": 5, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28958452/tags/slug:gardening", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28958452/tags/slug:gardening/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28958452" + } + } + }, + "Mammoth Lakes": { + "ID": 964261, + "name": "Mammoth Lakes", + "slug": "mammoth-lakes", + "description": "", + "post_count": 4, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28958452/tags/slug:mammoth-lakes", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28958452/tags/slug:mammoth-lakes/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28958452" + } + } + }, + "photography": { + "ID": 436, + "name": "photography", + "slug": "photography", + "description": "", + "post_count": 345, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28958452/tags/slug:photography", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28958452/tags/slug:photography/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28958452" + } + } + }, + "photography challenges": { + "ID": 1009473, + "name": "photography challenges", + "slug": "photography-challenges", + "description": "", + "post_count": 33, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28958452/tags/slug:photography-challenges", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28958452/tags/slug:photography-challenges/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28958452" + } + } + }, + "plumeria": { + "ID": 616561, + "name": "plumeria", + "slug": "plumeria", + "description": "", + "post_count": 8, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28958452/tags/slug:plumeria", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28958452/tags/slug:plumeria/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28958452" + } + } + }, + "Sunday Stills": { + "ID": 11911599, + "name": "Sunday Stills", + "slug": "sunday-stills", + "description": "", + "post_count": 131, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28958452/tags/slug:sunday-stills", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28958452/tags/slug:sunday-stills/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28958452" + } + } + }, + "water": { + "ID": 14157, + "name": "water", + "slug": "water", + "description": "", + "post_count": 14, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28958452/tags/slug:water", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28958452/tags/slug:water/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28958452" + } + } + }, + "water droplets": { + "ID": 450032, + "name": "water droplets", + "slug": "water-droplets", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28958452/tags/slug:water-droplets", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28958452/tags/slug:water-droplets/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28958452" + } + } + } + }, + "categories": { + "leisure": { + "ID": 3172, + "name": "leisure", + "slug": "leisure", + "description": "", + "post_count": 346, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28958452/categories/slug:leisure", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28958452/categories/slug:leisure/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28958452" + } + } + }, + "photography": { + "ID": 436, + "name": "photography", + "slug": "photography", + "description": "", + "post_count": 454, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28958452/categories/slug:photography", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28958452/categories/slug:photography/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28958452" + } + } + }, + "weekly photo challenge": { + "ID": 5114028, + "name": "weekly photo challenge", + "slug": "weekly-photo-challenge", + "description": "", + "post_count": 79, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28958452/categories/slug:weekly-photo-challenge", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28958452/categories/slug:weekly-photo-challenge/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28958452" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/read/sites/28958452/posts/10046", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28958452/posts/10046/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28958452", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28958452/posts/10046/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28958452/posts/10046/likes/" + } + }, + "capabilities": { + "publish_post": false, + "delete_post": false, + "edit_post": false + }, + "is_seen": false, + "feed_ID": 55643820, + "feed_URL": "http://secondwindleisure.com", + "pseudo_ID": "6295b4c918b214147d966e6e8c6fe18e", + "is_external": false, + "site_name": "Second Wind Leisure Perspectives", + "site_URL": "https://secondwindleisure.com", + "site_is_private": false, + "featured_media": { + "uri": "https://terriwebsterschrandt.files.wordpress.com/2020/09/2020_spokane_waterdrops.jpg", + "width": 0, + "height": 0, + "type": "image" + }, + "use_excerpt": false + } + }, + { + "type": "post", + "data": { + "ID": 1007, + "site_ID": 60412660, + "author": { + "ID": 57807571, + "login": "singhpiyush6089", + "email": false, + "name": "singhpiyush6089", + "first_name": "Piyush", + "last_name": "Singh", + "nice_name": "singhpiyush6089", + "URL": "http://theperceptionssquare.com", + "avatar_URL": "https://0.gravatar.com/avatar/fbfa5fcddc8bbef89657e331658e648c?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/singhpiyush6089", + "site_ID": 60412660, + "has_avatar": true + }, + "date": "2020-09-26T13:31:59+00:00", + "modified": "2020-09-26T13:47:39+00:00", + "title": "In Between the Shadows", + "URL": "https://theperceptionssquare.com/2020/09/26/in-between-the-shadows/", + "short_URL": "https://wp.me/p45u5K-gf", + "content": "\n
\"\"
\n\n\n\n

In between the shadows,
In the midst of darkness
And grief , I desire to survive,
I persevere hollowness of life.
My strength is that
Ray of sunshine who
Itself is persevering,
Piercing through darkness
And my grief, breaking barriers
And finally reaches me !

\n\n\n\n

©2020 Piyush Singh

\n", + "excerpt": "

In between the shadows,In the midst of darknessAnd grief , I desire to survive,I persevere hollowness of life.My strength is thatRay of sunshine whoItself is persevering,Piercing through darknessAnd my grief, breaking barriersAnd finally reaches me ! ©2020 Piyush Singh

\n", + "slug": "in-between-the-shadows", + "guid": "http://theperceptionssquare.com/?p=1007", + "status": "publish", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 42 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 167, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "2669cbf58f34e7d71da5e939657d1d4f", + "featured_image": "", + "post_thumbnail": null, + "format": "standard", + "tags": { + "#quotes": { + "ID": 755, + "name": "#quotes", + "slug": "quotes", + "description": "", + "post_count": 68, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/60412660/tags/slug:quotes", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/60412660/tags/slug:quotes/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/60412660" + } + } + }, + "blogging": { + "ID": 91, + "name": "blogging", + "slug": "blogging", + "description": "", + "post_count": 60, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/60412660/tags/slug:blogging", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/60412660/tags/slug:blogging/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/60412660" + } + } + }, + "nature": { + "ID": 1099, + "name": "nature", + "slug": "nature", + "description": "", + "post_count": 20, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/60412660/tags/slug:nature", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/60412660/tags/slug:nature/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/60412660" + } + } + }, + "photography": { + "ID": 436, + "name": "photography", + "slug": "photography", + "description": "", + "post_count": 89, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/60412660/tags/slug:photography", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/60412660/tags/slug:photography/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/60412660" + } + } + }, + "poetry": { + "ID": 422, + "name": "poetry", + "slug": "poetry", + "description": "", + "post_count": 122, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/60412660/tags/slug:poetry", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/60412660/tags/slug:poetry/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/60412660" + } + } + } + }, + "categories": { + "photography": { + "ID": 436, + "name": "photography", + "slug": "photography", + "description": "", + "post_count": 66, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/60412660/categories/slug:photography", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/60412660/categories/slug:photography/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/60412660" + } + } + }, + "poetry": { + "ID": 422, + "name": "poetry", + "slug": "poetry", + "description": "", + "post_count": 128, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/60412660/categories/slug:poetry", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/60412660/categories/slug:poetry/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/60412660" + } + } + }, + "Uncategorized": { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 32, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/60412660/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/60412660/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/60412660" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": false, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/read/sites/60412660/posts/1007", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/60412660/posts/1007/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/60412660", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/60412660/posts/1007/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/60412660/posts/1007/likes/" + } + }, + "capabilities": { + "publish_post": false, + "delete_post": false, + "edit_post": false + }, + "is_seen": false, + "feed_ID": 103168091, + "feed_URL": "http://theperceptionssquare.com", + "pseudo_ID": "2669cbf58f34e7d71da5e939657d1d4f", + "is_external": false, + "site_name": "The Perceptions Square", + "site_URL": "https://theperceptionssquare.com", + "site_is_private": false, + "featured_media": { + "uri": "https://singhpiyush6089.files.wordpress.com/2020/08/img_20200829_140232_624.jpg", + "width": 0, + "height": 0, + "type": "image" + }, + "use_excerpt": false + } + }, + { + "type": "post", + "data": { + "ID": 20653, + "site_ID": 28002157, + "author": { + "ID": 27562902, + "login": "marinakanavaki", + "email": false, + "name": "marina kanavaki", + "first_name": "Marina Artemis", + "last_name": "Kanavaki", + "nice_name": "marinakanavaki", + "URL": "http://marinakanavaki.wordpress.com", + "avatar_URL": "https://1.gravatar.com/avatar/4a0d3606785602212228493e899bc8a2?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/marinakanavaki", + "site_ID": 28002157, + "has_avatar": true + }, + "date": "2020-09-22T16:50:42+03:00", + "modified": "2020-09-22T16:50:42+03:00", + "title": "Autumnal [Fall] Equinox 2020", + "URL": "https://marinakanavaki.com/2020/09/22/autumnal-fall-equinox-2020/", + "short_URL": "https://wp.me/p1TuDH-5n7", + "content": "\n
\"\"
Sunrise & Sunset merged
\n\n\n\n

The time of the year when the Sun shines directly on the Equator and the length of day and night is almost equal, marking the first day of Autumn in the Northern Hemisphere and the first day of Spring in the Southern Hemisphere.

\n\n\n\n

Autumn over here and my favorite season too. There’s a special kind of quiet this season, accompanied by a burst of fiery colors, very dear to me.

\n\n\n\n

○

\n\n\n\n
Moon Phase: Waxing Crescent • Visible: 33%↑ • Age: 5,72 days • Moon Distance: 368,382.09 km
\n\n\n\n

●

\n\n\n\n

This Equinox,

\n\n\n\n

I decided to do

\n\n\n\n

the Sun and the Moon,

\n\n\n\n

side by side

\n\n\n\n

in similar …moods.

\n\n\n\n

\n\n\n\n

● Sun and clouds

\n\n\n\n
\"\"
\n\n\n\n

○ Moon and clouds

\n\n\n\n
\"\"
\n\n\n\n

● Sun bokeh

\n\n\n\n
\"\"
\n\n\n\n

○ Moon bokeh

\n\n\n\n
\"\"
\n\n\n\n

\n\n\n\n

\n\n\n\n

●○

\n\n\n\n

Finally, a day beginning and a day ending,

\n\n\n\n
before they merge into one image [top]
\n\n\n\n

● Sunrise

\n\n\n\n
\"\"
\n\n\n\n

● Sunset

\n\n\n\n
\"\"
\n\n\n\n
\n\n\n\n

●○

\n\n\n\n

Jean-Michel Jarre

\n\n\n\n

Équinoxe , Pt. 2

\n\n\n\n
Équinoxe, 1978
\n\n\n\n
\n\n
\n\n\n\n

●○

\n\n\n\n

Happy

\n\n\n\n
and safe
\n\n\n\n

Fall Equinox

\n\n\n\n

everyone!

\n\n\n\n

○●

\n\n\n\n

\n", + "excerpt": "

The time of the year when the Sun shines directly on the Equator and the length of day and night is almost equal, marking the first day of Autumn in the Northern Hemisphere and the first day of Spring in the Southern Hemisphere. Autumn over here and my favorite season too. There’s a special kind […]

\n", + "slug": "autumnal-fall-equinox-2020", + "guid": "http://marinakanavaki.com/?p=20653", + "status": "publish", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 63 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 110, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "34de6e3639f699de7bfa414385811f2e", + "featured_image": "https://marinakanavaki.files.wordpress.com/2020/09/fall-equinox-2020.jpg", + "post_thumbnail": { + "ID": 20676, + "URL": "https://marinakanavaki.files.wordpress.com/2020/09/fall-equinox-2020.jpg", + "guid": "http://marinakanavaki.files.wordpress.com/2020/09/fall-equinox-2020.jpg", + "mime_type": "image/jpeg", + "width": 1956, + "height": 1956 + }, + "format": "standard", + "tags": { + "2020": { + "ID": 65608, + "name": "2020", + "slug": "2020", + "description": "", + "post_count": 24, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28002157/tags/slug:2020", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28002157/tags/slug:2020/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28002157" + } + } + }, + "autumn": { + "ID": 2865, + "name": "autumn", + "slug": "autumn", + "description": "", + "post_count": 10, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28002157/tags/slug:autumn", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28002157/tags/slug:autumn/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28002157" + } + } + }, + "Autumnal Equinox": { + "ID": 1868835, + "name": "Autumnal Equinox", + "slug": "autumnal-equinox", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28002157/tags/slug:autumnal-equinox", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28002157/tags/slug:autumnal-equinox/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28002157" + } + } + }, + "Équinoxe": { + "ID": 5562732, + "name": "Équinoxe", + "slug": "equinoxe", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28002157/tags/slug:equinoxe", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28002157/tags/slug:equinoxe/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28002157" + } + } + }, + "Fall Equinox": { + "ID": 1811742, + "name": "Fall Equinox", + "slug": "fall-equinox", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28002157/tags/slug:fall-equinox", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28002157/tags/slug:fall-equinox/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28002157" + } + } + }, + "Jean-Michel Jarre": { + "ID": 357230, + "name": "Jean-Michel Jarre", + "slug": "jean-michel-jarre", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28002157/tags/slug:jean-michel-jarre", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28002157/tags/slug:jean-michel-jarre/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28002157" + } + } + }, + "Moon phase": { + "ID": 337555, + "name": "Moon phase", + "slug": "moon-phase", + "description": "", + "post_count": 4, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28002157/tags/slug:moon-phase", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28002157/tags/slug:moon-phase/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28002157" + } + } + }, + "moonrise": { + "ID": 360921, + "name": "moonrise", + "slug": "moonrise", + "description": "", + "post_count": 8, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28002157/tags/slug:moonrise", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28002157/tags/slug:moonrise/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28002157" + } + } + }, + "photo": { + "ID": 994, + "name": "photo", + "slug": "photo", + "description": "", + "post_count": 5, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28002157/tags/slug:photo", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28002157/tags/slug:photo/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28002157" + } + } + }, + "Photography": { + "ID": 436, + "name": "Photography", + "slug": "photography", + "description": "", + "post_count": 110, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28002157/tags/slug:photography", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28002157/tags/slug:photography/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28002157" + } + } + }, + "sunrise": { + "ID": 35945, + "name": "sunrise", + "slug": "sunrise", + "description": "", + "post_count": 27, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28002157/tags/slug:sunrise", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28002157/tags/slug:sunrise/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28002157" + } + } + }, + "sunset": { + "ID": 766, + "name": "sunset", + "slug": "sunset", + "description": "", + "post_count": 34, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28002157/tags/slug:sunset", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28002157/tags/slug:sunset/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28002157" + } + } + } + }, + "categories": { + "Nature": { + "ID": 1099, + "name": "Nature", + "slug": "nature", + "description": "", + "post_count": 139, + "parent": 78522247, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28002157/categories/slug:nature", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28002157/categories/slug:nature/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28002157" + } + } + }, + "Photography": { + "ID": 436, + "name": "Photography", + "slug": "photography", + "description": "", + "post_count": 156, + "parent": 78522247, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28002157/categories/slug:photography", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28002157/categories/slug:photography/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28002157" + } + } + }, + "Seasons": { + "ID": 20333, + "name": "Seasons", + "slug": "seasons", + "description": "", + "post_count": 142, + "parent": 680306717, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28002157/categories/slug:seasons", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28002157/categories/slug:seasons/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28002157" + } + } + }, + "Time": { + "ID": 5087, + "name": "Time", + "slug": "time", + "description": "", + "post_count": 143, + "parent": 680306717, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28002157/categories/slug:time", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28002157/categories/slug:time/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28002157" + } + } + } + }, + "attachments": { + }, + "attachment_count": 0, + "metadata": [ + + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/read/sites/28002157/posts/20653", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/28002157/posts/20653/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/28002157", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28002157/posts/20653/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/28002157/posts/20653/likes/" + } + }, + "capabilities": { + "publish_post": false, + "delete_post": false, + "edit_post": false + }, + "is_seen": false, + "feed_ID": 2091483, + "feed_URL": "http://marinakanavaki.com", + "pseudo_ID": "34de6e3639f699de7bfa414385811f2e", + "is_external": false, + "site_name": "Marina Kanavaki", + "site_URL": "https://marinakanavaki.com", + "site_is_private": false, + "featured_media": { + "uri": "https://www.youtube.com/embed/_okeeslfmh8?version=3&rel=1&fs=1&autohide=2&showsearch=0&showinfo=1&iv_load_policy=1&wmode=transparent", + "type": "video" + }, + "use_excerpt": false + } + }, + { + "type": "post", + "data": { + "ID": 15697, + "site_ID": 21271414, + "author": { + "ID": 21825924, + "login": "abubot6", + "email": false, + "name": "Island Traveler", + "first_name": "Barnard", + "last_name": "Deocampo", + "nice_name": "abubot6", + "URL": "http://thismansjourney.net/", + "avatar_URL": "https://2.gravatar.com/avatar/201ebd347a0197bf0e7ffde03f9f2441?s=96&d=&r=G", + "profile_URL": "https://en.gravatar.com/abubot6", + "site_ID": 21271414, + "has_avatar": true + }, + "date": "2020-09-19T16:16:00-07:00", + "modified": "2020-09-19T16:16:32-07:00", + "title": "FALL in LOVE with your LIFE", + "URL": "https://this-mans-journey.com/2020/09/19/fall-in-love-with-your-life/", + "short_URL": "https://wp.me/p1rfFk-45b", + "content": "\n

It took pain, anxiety and sadness for me to realize I needed to be kind to myself.

\n\n\n\n
\"\"
Our first Fall Harvest Blessing Tree. We’re skipping the pumpkin patch this year. Instead, we went to Ross, Marshall’s and Dollar Tree for our pumpkin hunting. If we choose to see and celebrate what’s good of 2020, then it has been a good year.
\n\n\n\n

In this world, our happiness will not be given easily. In fact, people will find a way to take it. So, today care less of what others will say. Be nice to yourself instead of trying to please everyone. People will take advantage of your kindness and will tear your joy and positivity in pieces.

\n\n\n\n
\"\"
These pumpkins light up our dining room. We don’t wait for light to happen. We find light where we can.
\n\n\n\n

Fall in love with your life because no one can love it more than you do.

\n\n\n\n

Fall in love with your life because it deserves to be happy too.

\n\n\n\n
\"\"
I can only change how I react.
\n\n\n\n

It’s never too late to feel like we matter again. You’d been a light and warmth to others. It’s okay to experience the same.

\n\n\n\n
\"\"
Family Day in San Francisco. Stopping to watch the ocean before heading down Union Square. I turned down 3 overtime work including today and tomorrow. Money won’t make you happy, but following your heart will. 9/19/20
\n\n\n\n

Today, being better begins.

\n\n\n\n

\n", + "excerpt": "

It took pain, anxiety and sadness for me to realize I needed to be kind to myself. In this world, our happiness will not be given easily. In fact, people will find a way to take it. So, today care less of what others will say. Be nice to yourself instead of trying to please […]

\n", + "slug": "fall-in-love-with-your-life", + "guid": "http://this-mans-journey.com/?p=15697", + "status": "publish", + "discussion": { + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open", + "comment_count": 44 + }, + "likes_enabled": true, + "sharing_enabled": true, + "like_count": 219, + "i_like": false, + "is_reblogged": false, + "is_following": false, + "global_ID": "e61dd75e67bdca48b91ad87a2400429f", + "featured_image": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0190-1.jpg", + "post_thumbnail": { + "ID": 15706, + "URL": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0190-1.jpg", + "guid": "http://consumerjournaldotnet.files.wordpress.com/2020/09/img_0190-1.jpg", + "mime_type": "image/jpeg", + "width": 1170, + "height": 1477 + }, + "format": "standard", + "tags": { + "anxiety": { + "ID": 3252, + "name": "anxiety", + "slug": "anxiety", + "description": "", + "post_count": 1, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/21271414/tags/slug:anxiety", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/21271414/tags/slug:anxiety/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414" + } + } + }, + "decor": { + "ID": 48669, + "name": "decor", + "slug": "decor", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/21271414/tags/slug:decor", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/21271414/tags/slug:decor/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414" + } + } + }, + "Fall": { + "ID": 46710, + "name": "Fall", + "slug": "fall", + "description": "", + "post_count": 4, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/21271414/tags/slug:fall", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/21271414/tags/slug:fall/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414" + } + } + }, + "Happiness": { + "ID": 22297, + "name": "Happiness", + "slug": "happiness", + "description": "", + "post_count": 26, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/21271414/tags/slug:happiness", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/21271414/tags/slug:happiness/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414" + } + } + }, + "Health": { + "ID": 337, + "name": "Health", + "slug": "health", + "description": "", + "post_count": 16, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/21271414/tags/slug:health", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/21271414/tags/slug:health/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414" + } + } + }, + "Life": { + "ID": 124, + "name": "Life", + "slug": "life", + "description": "", + "post_count": 56, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/21271414/tags/slug:life", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/21271414/tags/slug:life/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414" + } + } + }, + "love": { + "ID": 3785, + "name": "love", + "slug": "love", + "description": "", + "post_count": 6, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/21271414/tags/slug:love", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/21271414/tags/slug:love/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414" + } + } + }, + "Photography": { + "ID": 436, + "name": "Photography", + "slug": "photography", + "description": "", + "post_count": 57, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/21271414/tags/slug:photography", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/21271414/tags/slug:photography/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414" + } + } + }, + "Pumpkin": { + "ID": 186595, + "name": "Pumpkin", + "slug": "pumpkin", + "description": "", + "post_count": 3, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/21271414/tags/slug:pumpkin", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/21271414/tags/slug:pumpkin/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414" + } + } + }, + "Shopping": { + "ID": 1508, + "name": "Shopping", + "slug": "shopping", + "description": "", + "post_count": 2, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/21271414/tags/slug:shopping", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/21271414/tags/slug:shopping/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414" + } + } + } + }, + "categories": { + "Life": { + "ID": 124, + "name": "Life", + "slug": "life", + "description": "", + "post_count": 38, + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/21271414/categories/slug:life", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/21271414/categories/slug:life/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414" + } + } + } + }, + "attachments": { + "15708": { + "ID": 15708, + "URL": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0216.jpg", + "guid": "http://consumerjournaldotnet.files.wordpress.com/2020/09/img_0216.jpg", + "date": "2020-09-19T16:15:49-07:00", + "post_ID": 15697, + "author_ID": 21825924, + "file": "img_0216.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "img_0216", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0216.jpg?w=150", + "medium": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0216.jpg?w=300", + "large": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0216.jpg?w=1024", + "full": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0216.jpg" + }, + "height": 3024, + "width": 4032, + "exif": { + "aperture": "1.8", + "credit": "", + "camera": "iPhone 8 Plus", + "caption": "", + "created_timestamp": "1600531126", + "copyright": "", + "focal_length": "3.99", + "iso": "20", + "shutter_speed": "0.00055586436909394", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414/media/15708", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/21271414/media/15708/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/21271414/posts/15697" + } + } + }, + "15709": { + "ID": 15709, + "URL": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0216-1.jpg", + "guid": "http://consumerjournaldotnet.files.wordpress.com/2020/09/img_0216-1.jpg", + "date": "2020-09-19T16:15:49-07:00", + "post_ID": 15697, + "author_ID": 21825924, + "file": "img_0216-1.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "img_0216-1", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0216-1.jpg?w=150", + "medium": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0216-1.jpg?w=300", + "large": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0216-1.jpg?w=1024", + "full": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0216-1.jpg" + }, + "height": 3024, + "width": 4032, + "exif": { + "aperture": "1.8", + "credit": "", + "camera": "iPhone 8 Plus", + "caption": "", + "created_timestamp": "1600531126", + "copyright": "", + "focal_length": "3.99", + "iso": "20", + "shutter_speed": "0.00055586436909394", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414/media/15709", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/21271414/media/15709/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/21271414/posts/15697" + } + } + }, + "15707": { + "ID": 15707, + "URL": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0216-2.jpg", + "guid": "http://consumerjournaldotnet.files.wordpress.com/2020/09/img_0216-2.jpg", + "date": "2020-09-19T16:11:40-07:00", + "post_ID": 15697, + "author_ID": 21825924, + "file": "img_0216-2.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "img_0216-2", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0216-2.jpg?w=150", + "medium": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0216-2.jpg?w=300", + "large": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0216-2.jpg?w=1024", + "full": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0216-2.jpg" + }, + "height": 3024, + "width": 4032, + "exif": { + "aperture": "1.8", + "credit": "", + "camera": "iPhone 8 Plus", + "caption": "", + "created_timestamp": "1600531126", + "copyright": "", + "focal_length": "3.99", + "iso": "20", + "shutter_speed": "0.00055586436909394", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414/media/15707", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/21271414/media/15707/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/21271414/posts/15697" + } + } + }, + "15706": { + "ID": 15706, + "URL": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0190-1.jpg", + "guid": "http://consumerjournaldotnet.files.wordpress.com/2020/09/img_0190-1.jpg", + "date": "2020-09-19T13:52:11-07:00", + "post_ID": 15697, + "author_ID": 21825924, + "file": "img_0190-1.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "img_0190-1", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0190-1.jpg?w=119", + "medium": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0190-1.jpg?w=238", + "large": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0190-1.jpg?w=811", + "full": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0190-1.jpg" + }, + "height": 1477, + "width": 1170, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414/media/15706", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/21271414/media/15706/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/21271414/posts/15697" + } + } + }, + "15704": { + "ID": 15704, + "URL": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0176.jpg", + "guid": "http://consumerjournaldotnet.files.wordpress.com/2020/09/img_0176.jpg", + "date": "2020-09-19T13:36:18-07:00", + "post_ID": 15697, + "author_ID": 21825924, + "file": "img_0176.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "img_0176", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0176.jpg?w=150", + "medium": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0176.jpg?w=300", + "large": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0176.jpg?w=1024", + "full": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0176.jpg" + }, + "height": 3024, + "width": 4032, + "exif": { + "aperture": "1.8", + "credit": "", + "camera": "iPhone 8 Plus", + "caption": "", + "created_timestamp": "1600460637", + "copyright": "", + "focal_length": "3.99", + "iso": "50", + "shutter_speed": "0.066666666666667", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414/media/15704", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/21271414/media/15704/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/21271414/posts/15697" + } + } + }, + "15703": { + "ID": 15703, + "URL": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0038.jpg", + "guid": "http://consumerjournaldotnet.files.wordpress.com/2020/09/img_0038.jpg", + "date": "2020-09-19T13:36:04-07:00", + "post_ID": 15697, + "author_ID": 21825924, + "file": "img_0038.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "img_0038", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0038.jpg?w=150", + "medium": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0038.jpg?w=300", + "large": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0038.jpg?w=1024", + "full": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0038.jpg" + }, + "height": 3024, + "width": 4032, + "exif": { + "aperture": "1.8", + "credit": "", + "camera": "iPhone 8 Plus", + "caption": "", + "created_timestamp": "1600038963", + "copyright": "", + "focal_length": "3.99", + "iso": "64", + "shutter_speed": "0.066666666666667", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414/media/15703", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/21271414/media/15703/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/21271414/posts/15697" + } + } + }, + "15701": { + "ID": 15701, + "URL": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0190.jpg", + "guid": "http://consumerjournaldotnet.files.wordpress.com/2020/09/img_0190.jpg", + "date": "2020-09-19T12:59:41-07:00", + "post_ID": 15697, + "author_ID": 21825924, + "file": "img_0190.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "img_0190", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0190.jpg?w=119", + "medium": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0190.jpg?w=238", + "large": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0190.jpg?w=811", + "full": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0190.jpg" + }, + "height": 1477, + "width": 1170, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414/media/15701", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/21271414/media/15701/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/21271414/posts/15697" + } + } + }, + "15696": { + "ID": 15696, + "URL": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0188.jpg", + "guid": "http://consumerjournaldotnet.files.wordpress.com/2020/09/img_0188.jpg", + "date": "2020-09-19T10:47:21-07:00", + "post_ID": 15697, + "author_ID": 21825924, + "file": "img_0188.jpg", + "mime_type": "image/jpeg", + "extension": "jpg", + "title": "img_0188", + "caption": "", + "description": "", + "alt": "", + "thumbnails": { + "thumbnail": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0188.jpg?w=112", + "medium": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0188.jpg?w=225", + "large": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0188.jpg?w=767", + "full": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0188.jpg" + }, + "height": 1800, + "width": 1348, + "exif": { + "aperture": "0", + "credit": "", + "camera": "", + "caption": "", + "created_timestamp": "0", + "copyright": "", + "focal_length": "0", + "iso": "0", + "shutter_speed": "0", + "title": "", + "orientation": "1", + "keywords": [ + + ] + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414/media/15696", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/21271414/media/15696/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414", + "parent": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/21271414/posts/15697" + } + } + } + }, + "attachment_count": 8, + "metadata": [ + + ], + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/read/sites/21271414/posts/15697", + "help": "{{request.requestLine.baseUrl}}/rest/v/sites/21271414/posts/15697/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.2/sites/21271414", + "replies": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/21271414/posts/15697/replies/", + "likes": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/21271414/posts/15697/likes/" + } + }, + "capabilities": { + "publish_post": false, + "delete_post": false, + "edit_post": false + }, + "is_seen": false, + "feed_ID": 107168226, + "feed_URL": "http://this-mans-journey.com", + "pseudo_ID": "e61dd75e67bdca48b91ad87a2400429f", + "is_external": false, + "site_name": "This Man's Journey", + "site_URL": "https://this-mans-journey.com", + "site_is_private": false, + "featured_media": { + "uri": "https://consumerjournaldotnet.files.wordpress.com/2020/09/img_0216.jpg", + "width": 4032, + "height": 3024, + "type": "image" + }, + "use_excerpt": false + } + } + ] + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/rest_v1_batch.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/rest_v1_batch.json new file mode 100644 index 000000000000..6e8be7484b1e --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/rest_v1_batch.json @@ -0,0 +1,11 @@ +{ + "request": { + "urlPattern": "/rest/v1.1/batch(.*)", + "method": "GET" + }, + "response": { + "status": 200, + "jsonBody": { + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/scan/wpcom_v2_sites_185124945_scan.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/scan/wpcom_v2_sites_185124945_scan.json new file mode 100644 index 000000000000..3afd5719f7c9 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/scan/wpcom_v2_sites_185124945_scan.json @@ -0,0 +1,35 @@ +{ + "request": { + "urlPattern": "/wpcom/v2/sites/185124945/scan(\\?|/|$).*", + "method": "GET" + }, + "response": { + "status": 200, + "jsonBody": { + "state": "idle", + "threats": [ + + ], + "has_cloud": false, + "credentials": [ + { + "still_valid": true, + "type": "managed", + "role": "main" + } + ], + "most_recent": { + "is_initial": false, + "timestamp": "{{now offset='-2 days' format='yyyy-MM-dd'}}T{{now offset='-2 days' format='HH:mm:ssZ'}}", + "duration": 16, + "progress": 100, + "error": false + } + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880.json new file mode 100644 index 000000000000..f56c440fa98a --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880.json @@ -0,0 +1,297 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/106707880", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "ID": 106707880, + "name": "Tri-County Real Estate", + "description": "Site on Personal Plan", + "URL": "http://tricountyrealestate.wordpress.com", + "capabilities": { + "edit_pages": true, + "edit_posts": true, + "edit_others_posts": true, + "edit_others_pages": true, + "delete_posts": true, + "delete_others_posts": true, + "edit_theme_options": true, + "edit_users": false, + "list_users": true, + "manage_categories": true, + "manage_options": true, + "moderate_comments": true, + "activate_wordads": false, + "promote_users": true, + "publish_posts": true, + "upload_files": true, + "delete_users": false, + "remove_users": true, + "view_stats": true + }, + "jetpack": false, + "icon": { + "img": "https://tricountyrealestate.files.wordpress.com/2020/08/image-1.jpg?w=96", + "ico": "https://tricountyrealestate.files.wordpress.com/2020/08/image-1.jpg?w=96" + }, + "visible": true, + "is_private": false, + "options": { + "timezone": "", + "gmt_offset": 0, + "blog_public": 1, + "videopress_enabled": false, + "upgraded_filetypes_enabled": true, + "login_url": "https://infocusphotographers.wordpress.com/wp-login.php", + "admin_url": "https://infocusphotographers.wordpress.com/wp-admin/", + "is_mapped_domain": true, + "is_redirect": false, + "unmapped_url": "https://infocusphotographers.wordpress.com", + "featured_images_enabled": false, + "theme_slug": "pub/edin", + "header_image": false, + "background_color": "ffffff", + "image_default_link_type": "none", + "image_thumbnail_width": 150, + "image_thumbnail_height": 150, + "image_thumbnail_crop": 0, + "image_medium_width": 300, + "image_medium_height": 300, + "image_large_width": 1024, + "image_large_height": 1024, + "permalink_structure": "/%year%/%monthnum%/%day%/%postname%/", + "post_formats": [ + + ], + "default_post_format": "0", + "default_category": 1, + "allowed_file_types": [ + "jpg", + "jpeg", + "png", + "gif", + "pdf", + "doc", + "ppt", + "odt", + "pptx", + "docx", + "pps", + "ppsx", + "xls", + "xlsx", + "key", + "asc", + "mp3", + "m4a", + "wav", + "ogg", + "zip" + ], + "show_on_front": "page", + "default_likes_enabled": true, + "default_sharing_status": true, + "default_comment_status": true, + "default_ping_status": true, + "software_version": "5.2.2", + "created_at": "2016-02-09T16:07:34+00:00", + "wordads": false, + "publicize_permanently_disabled": false, + "frame_nonce": "847b221e56", + "jetpack_frame_nonce": "847b221e56", + "page_on_front": 1, + "page_for_posts": 0, + "headstart": false, + "headstart_is_fresh": false, + "ak_vp_bundle_enabled": null, + "advanced_seo_front_page_description": "", + "advanced_seo_title_formats": [ + + ], + "verification_services_codes": null, + "podcasting_archive": null, + "is_domain_only": false, + "is_automated_transfer": false, + "is_wpcom_atomic": false, + "is_wpcom_store": false, + "woocommerce_is_active": false, + "design_type": null, + "site_goals": null, + "site_segment": null + }, + "plan": { + "product_id": 1029, + "product_slug": "personal-bundle-2y", + "product_name": "WordPress.com Personal", + "product_name_short": "Personal", + "expired": false, + "user_is_owner": false, + "is_free": false, + "features": { + "active": [ + "free-blog", + "custom-domain", + "space", + "support", + "wordads-jetpack" + ], + "available": { + "free-blog": [ + "free_plan", + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y", + "business-bundle-monthly" + ], + "space": [ + "free_plan", + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y", + "business-bundle-monthly" + ], + "support": [ + "free_plan", + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y", + "business-bundle-monthly" + ], + "custom-domain": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y", + "business-bundle-monthly" + ], + "no-adverts/no-adverts.php": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y", + "business-bundle-monthly" + ], + "custom-design": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y", + "business-bundle-monthly" + ], + "videopress": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y", + "business-bundle-monthly" + ], + "unlimited_themes": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y", + "business-bundle-monthly" + ], + "live_support": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y", + "business-bundle-monthly" + ], + "simple-payments": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y", + "business-bundle-monthly" + ], + "premium-themes": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y", + "business-bundle-monthly" + ], + "google-analytics": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "ecommerce-bundle", + "ecommerce-bundle-2y", + "business-bundle-monthly" + ] + } + } + }, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/help", + "posts": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/posts/", + "comments": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/106707880/comments/", + "xmlrpc": "https://infocusphotographers.wordpress.com/xmlrpc.php" + } + }, + "quota": { + "space_allowed": 6442450944, + "space_used": 442302007, + "percent_used": 6.865430731947224, + "space_available": 6000148937 + } + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_gutenberg_disabled.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_gutenberg_disabled.json new file mode 100644 index 000000000000..47cb930f1285 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_gutenberg_disabled.json @@ -0,0 +1,21 @@ +{ + "scenarioName": "gutenberg", + "requiredScenarioState": "Started", + "request": { + "urlPattern": "/wpcom/v2/sites/106707880/gutenberg(/)?($|\\?.*)", + "method": "GET" + }, + "response": { + "status": 200, + "jsonBody": { + "editor_mobile": "aztec", + "editor_web": "gutenberg", + "opt_in": "{{request.requestLine.baseUrl}}/wpcom/v2/sites/106707880/gutenberg?editor=gutenberg&platform=mobile" + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_gutenberg_enabled.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_gutenberg_enabled.json new file mode 100644 index 000000000000..07bdd78ed705 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_gutenberg_enabled.json @@ -0,0 +1,21 @@ +{ + "scenarioName": "gutenberg", + "requiredScenarioState": "enabled", + "request": { + "urlPattern": "/wpcom/v2/sites/106707880/gutenberg(/)?($|\\?.*)", + "method": "GET" + }, + "response": { + "status": 200, + "jsonBody": { + "editor_mobile": "gutenberg", + "editor_web": "gutenberg", + "opt_in": "{{request.requestLine.baseUrl}}/wpcom/v2/sites/106707880/gutenberg?editor=gutenberg&platform=mobile" + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_gutenberg_null.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_gutenberg_null.json new file mode 100644 index 000000000000..788a6eac90f8 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_gutenberg_null.json @@ -0,0 +1,19 @@ +{ + "request": { + "urlPath": "/wpcom/v2/sites/106707880/gutenberg/", + "method": "POST" + }, + "response": { + "status": 200, + "jsonBody": { + "editor_mobile": "gutenberg", + "editor_web": "gutenberg", + "opt_in": "{{request.requestLine.baseUrl}}/wpcom/v2/sites/106707880/gutenberg?editor=gutenberg&platform=mobile" + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_gutenberg_opt_in.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_gutenberg_opt_in.json new file mode 100644 index 000000000000..fff634422d85 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_gutenberg_opt_in.json @@ -0,0 +1,29 @@ +{ + "scenarioName": "gutenberg", + "newScenarioState": "enabled", + "request": { + "urlPattern": "/wpcom/v2/sites/106707880/gutenberg(/+)?\\?(.*)", + "method": "POST", + "queryParameters": { + "editor": { + "equalTo": "gutenberg" + }, + "platform": { + "equalTo": "mobile" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "editor_mobile": "gutenberg", + "editor_web": "gutenberg", + "opt_out": "{{request.requestLine.baseUrl}}/wpcom/v2/sites/106707880/gutenberg?editor=classic&platform=mobile" + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_gutenberg_opt_out.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_gutenberg_opt_out.json new file mode 100644 index 000000000000..75d5c964f56f --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_gutenberg_opt_out.json @@ -0,0 +1,29 @@ +{ + "scenarioName": "gutenberg", + "newScenarioState": "Started", + "request": { + "urlPattern": "/wpcom/v2/sites/106707880/gutenberg(/+)?\\?(.*)", + "method": "POST", + "queryParameters": { + "editor": { + "equalTo": "aztec" + }, + "platform": { + "equalTo": "mobile" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "editor_mobile": "aztec", + "editor_web": "gutenberg", + "opt_in": "{{request.requestLine.baseUrl}}/wpcom/v2/sites/106707880/gutenberg?editor=gutenberg&platform=mobile" + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_settings.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_settings.json new file mode 100644 index 000000000000..4b214d640b97 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_settings.json @@ -0,0 +1,121 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/106707880/settings", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "ID": 106707880, + "name": "Tri-County Real Estate", + "description": "", + "URL": "http://tricountyrealestate.wordpress.com", + "lang": "en", + "settings": { + "admin_url": "https://tricountyrealestate.wordpress.com/wp-admin/", + "default_ping_status": true, + "default_comment_status": true, + "blog_public": 1, + "jetpack_sync_non_public_post_stati": false, + "jetpack_relatedposts_allowed": true, + "jetpack_relatedposts_enabled": false, + "jetpack_relatedposts_show_headline": "", + "jetpack_relatedposts_show_thumbnails": "", + "jetpack_search_enabled": false, + "jetpack_search_supported": false, + "default_category": 1, + "post_categories": [ + { + "value": 1, + "name": "Uncategorized" + }, + { + "value": 1674, + "name": "Wedding" + } + ], + "default_post_format": "0", + "default_pingback_flag": true, + "require_name_email": true, + "comment_registration": false, + "close_comments_for_old_posts": false, + "close_comments_days_old": 14, + "thread_comments": true, + "thread_comments_depth": 3, + "page_comments": true, + "comments_per_page": 50, + "default_comments_page": "newest", + "comment_order": "asc", + "comments_notify": true, + "moderation_notify": true, + "social_notifications_like": false, + "social_notifications_reblog": false, + "social_notifications_subscribe": false, + "comment_moderation": false, + "comment_whitelist": true, + "comment_max_links": 2, + "moderation_keys": "", + "blacklist_keys": "", + "lang_id": 1, + "wga": false, + "disabled_likes": false, + "disabled_reblogs": false, + "jetpack_comment_likes_enabled": true, + "twitter_via": "", + "jetpack-twitter-cards-site-tag": "", + "eventbrite_api_token": null, + "gmt_offset": "0", + "timezone_string": "", + "date_format": "F j, Y", + "time_format": "g:i a", + "start_of_week": "1", + "jetpack_testimonial": true, + "jetpack_testimonial_posts_per_page": 10, + "jetpack_portfolio": false, + "jetpack_portfolio_posts_per_page": 10, + "markdown_supported": true, + "site_icon": 0, + "advanced_seo_front_page_description": "", + "advanced_seo_title_formats": [ + + ], + "amp_is_supported": true, + "amp_is_enabled": true, + "api_cache": true, + "posts_per_page": 10, + "posts_per_rss": 10, + "rss_use_excerpt": false, + "wpcom_publish_posts_with_markdown": false, + "wpcom_publish_comments_with_markdown": false, + "infinite_scroll": false, + "infinite_scroll_blocked": "footer", + "podcasting_category_id": 0, + "podcasting_title": "", + "podcasting_subtitle": "", + "podcasting_talent_name": "", + "podcasting_summary": "", + "podcasting_copyright": "", + "podcasting_explicit": "no", + "podcasting_image": "", + "podcasting_keywords": "", + "podcasting_category_1": "", + "podcasting_category_2": "", + "podcasting_category_3": "", + "podcasting_email": "", + "podcasting_image_id": 0, + "sharing_button_style": "icon-text", + "sharing_label": "Share this:", + "sharing_show": [ + "post", + "page" + ], + "sharing_open_links": "same" + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_tags.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_tags.json new file mode 100644 index 000000000000..1b331db2629e --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_tags.json @@ -0,0 +1,20 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/106707880/tags" + }, + "response": { + "status": 200, + "jsonBody": { + "found": 0, + "tags": [ + + ] + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_taxonomies.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_taxonomies.json new file mode 100644 index 000000000000..a4e1e3fc0b8f --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_taxonomies.json @@ -0,0 +1,251 @@ +{ + "request": { + "method": "GET", + "urlPath": "/wp/v2/sites/106707880/taxonomies", + "queryParameters": { + "context": { + "equalTo": "edit" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "category": { + "name": "Categories", + "slug": "category", + "capabilities": { + "manage_terms": "manage_categories", + "edit_terms": "edit_categories", + "delete_terms": "delete_categories", + "assign_terms": "assign_categories" + }, + "description": "", + "labels": { + "name": "Categories", + "singular_name": "Category", + "search_items": "Search Categories", + "popular_items": null, + "all_items": "All Categories", + "parent_item": "Parent Category", + "parent_item_colon": "Parent Category:", + "name_field_description": "The name is how it appears on your site.", + "slug_field_description": "The “slug” is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens.", + "parent_field_description": "Assign a parent term to create a hierarchy. The term Jazz, for example, would be the parent of Bebop and Big Band.", + "desc_field_description": "The description is not prominent by default; however, some themes may show it.", + "edit_item": "Edit Category", + "view_item": "View Category", + "update_item": "Update Category", + "add_new_item": "Add Category", + "new_item_name": "New Category Name", + "separate_items_with_commas": null, + "add_or_remove_items": null, + "choose_from_most_used": null, + "not_found": "No categories found.", + "no_terms": "No categories", + "filter_by_item": "Filter by category", + "items_list_navigation": "Categories list navigation", + "items_list": "Categories list", + "most_used": "Most Used", + "back_to_items": "← Go to Categories", + "item_link": "Category Link", + "item_link_description": "A link to a category.", + "menu_name": "Categories", + "name_admin_bar": "category", + "template_name": "Category Archives" + }, + "types": ["post"], + "show_cloud": true, + "hierarchical": true, + "rest_base": "categories", + "rest_namespace": "wp/v2", + "visibility": { + "public": true, + "publicly_queryable": true, + "show_admin_column": true, + "show_in_nav_menus": true, + "show_in_quick_edit": true, + "show_ui": true + } + }, + "post_tag": { + "name": "Tags", + "slug": "post_tag", + "capabilities": { + "manage_terms": "manage_post_tags", + "edit_terms": "edit_post_tags", + "delete_terms": "delete_post_tags", + "assign_terms": "assign_post_tags" + }, + "description": "", + "labels": { + "name": "Tags", + "singular_name": "Tag", + "search_items": "Search Tags", + "popular_items": "Popular Tags", + "all_items": "All Tags", + "parent_item": null, + "parent_item_colon": null, + "name_field_description": "The name is how it appears on your site.", + "slug_field_description": "The “slug” is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens.", + "parent_field_description": null, + "desc_field_description": "The description is not prominent by default; however, some themes may show it.", + "edit_item": "Edit Tag", + "view_item": "View Tag", + "update_item": "Update Tag", + "add_new_item": "Add Tag", + "new_item_name": "New Tag Name", + "separate_items_with_commas": "Separate tags with commas", + "add_or_remove_items": "Add or remove tags", + "choose_from_most_used": "Choose from the most used tags", + "not_found": "No tags found.", + "no_terms": "No tags", + "filter_by_item": null, + "items_list_navigation": "Tags list navigation", + "items_list": "Tags list", + "most_used": "Most Used", + "back_to_items": "← Go to Tags", + "item_link": "Tag Link", + "item_link_description": "A link to a tag.", + "menu_name": "Tags", + "name_admin_bar": "post_tag", + "template_name": "Tag Archives" + }, + "types": ["post"], + "show_cloud": true, + "hierarchical": false, + "rest_base": "tags", + "rest_namespace": "wp/v2", + "visibility": { + "public": true, + "publicly_queryable": true, + "show_admin_column": true, + "show_in_nav_menus": true, + "show_in_quick_edit": true, + "show_ui": true + } + }, + "nav_menu": { + "name": "Navigation Menus", + "slug": "nav_menu", + "capabilities": { + "manage_terms": "edit_theme_options", + "edit_terms": "edit_theme_options", + "delete_terms": "edit_theme_options", + "assign_terms": "edit_theme_options" + }, + "description": "", + "labels": { + "name": "Navigation Menus", + "singular_name": "Navigation Menu", + "search_items": "Search Tags", + "popular_items": "Popular Tags", + "all_items": "Navigation Menus", + "parent_item": null, + "parent_item_colon": null, + "name_field_description": "The name is how it appears on your site.", + "slug_field_description": "The “slug” is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens.", + "parent_field_description": null, + "desc_field_description": "The description is not prominent by default; however, some themes may show it.", + "edit_item": "Edit Tag", + "view_item": "View Tag", + "update_item": "Update Tag", + "add_new_item": "Add Tag", + "new_item_name": "New Tag Name", + "separate_items_with_commas": "Separate tags with commas", + "add_or_remove_items": "Add or remove tags", + "choose_from_most_used": "Choose from the most used tags", + "not_found": "No tags found.", + "no_terms": "No tags", + "filter_by_item": null, + "items_list_navigation": "Tags list navigation", + "items_list": "Tags list", + "most_used": "Most Used", + "back_to_items": "← Go to Tags", + "item_link": "Tag Link", + "item_link_description": "A link to a tag.", + "menu_name": "Navigation Menus", + "name_admin_bar": "Navigation Menu", + "archives": "Navigation Menus", + "template_name": "Navigation Menu Archives" + }, + "types": ["nav_menu_item"], + "show_cloud": false, + "hierarchical": false, + "rest_base": "menus", + "rest_namespace": "wp/v2", + "visibility": { + "public": false, + "publicly_queryable": false, + "show_admin_column": false, + "show_in_nav_menus": false, + "show_in_quick_edit": false, + "show_ui": false + } + }, + "wp_pattern_category": { + "name": "Pattern Categories", + "slug": "wp_pattern_category", + "capabilities": { + "manage_terms": "manage_categories", + "edit_terms": "manage_categories", + "delete_terms": "manage_categories", + "assign_terms": "edit_posts" + }, + "description": "", + "labels": { + "name": "Pattern Categories", + "singular_name": "Pattern Category", + "search_items": "Search Pattern Categories", + "popular_items": "Popular Pattern Categories", + "all_items": "Pattern Categories", + "parent_item": null, + "parent_item_colon": null, + "name_field_description": "The name is how it appears on your site.", + "slug_field_description": "The “slug” is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens.", + "parent_field_description": null, + "desc_field_description": "The description is not prominent by default; however, some themes may show it.", + "edit_item": "Edit Pattern Category", + "view_item": "View Pattern Category", + "update_item": "Update Pattern Category", + "add_new_item": "Add Category", + "new_item_name": "New Pattern Category Name", + "separate_items_with_commas": "Separate pattern categories with commas", + "add_or_remove_items": "Add or remove pattern categories", + "choose_from_most_used": "Choose from the most used pattern categories", + "not_found": "No pattern categories found.", + "no_terms": "No pattern categories", + "filter_by_item": null, + "items_list_navigation": "Pattern Categories list navigation", + "items_list": "Pattern Categories list", + "most_used": "Most Used", + "back_to_items": "← Go to Pattern Categories", + "item_link": "Pattern Category Link", + "item_link_description": "A link to a pattern category.", + "menu_name": "Pattern Categories", + "name_admin_bar": "Pattern Category", + "archives": "Pattern Categories", + "template_name": "Pattern Category Archives" + }, + "types": ["wp_block"], + "show_cloud": false, + "hierarchical": false, + "rest_base": "wp_pattern_category", + "rest_namespace": "wp/v2", + "visibility": { + "public": false, + "publicly_queryable": false, + "show_admin_column": true, + "show_in_nav_menus": false, + "show_in_quick_edit": true, + "show_ui": true + } + } + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_taxonomies_category_terms.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_taxonomies_category_terms.json new file mode 100644 index 000000000000..a3be8e9b661c --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_taxonomies_category_terms.json @@ -0,0 +1,90 @@ +{ + "request": { + "method": "GET", + "urlPath": "/wp/v2/sites/106707880/categories" + }, + "response": { + "status": 200, + "jsonBody": [ + { + "id": 1, + "count": 1, + "description": "", + "link": "http://tricountyrealestate.wordpress.com/category/uncategorized/", + "name": "Uncategorized", + "slug": "uncategorized", + "taxonomy": "category", + "parent": 0, + "meta": [], + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp-json/wp/v2/categories/1", + "targetHints": { "allow": ["GET", "POST", "PUT", "PATCH", "DELETE"] } + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp-json/wp/v2/categories" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp-json/wp/v2/taxonomies/category" + } + ], + "wp:post_type": [ + { + "href": "{{request.requestLine.baseUrl}}/wp-json/wp/v2/posts?categories=1" + } + ], + "curies": [ + { "name": "wp", "href": "https://api.w.org/{rel}", "templated": true } + ] + } + }, + { + "id": 1674, + "count": 1, + "description": "", + "link": "http://tricountyrealestate.wordpress.com/category/wedding/", + "name": "Wedding", + "slug": "wedding", + "taxonomy": "category", + "parent": 0, + "meta": [], + "_links": { + "self": [ + { + "href": "{{request.requestLine.baseUrl}}/wp-json/wp/v2/categories/1674", + "targetHints": { "allow": ["GET", "POST", "PUT", "PATCH", "DELETE"] } + } + ], + "collection": [ + { + "href": "{{request.requestLine.baseUrl}}/wp-json/wp/v2/categories" + } + ], + "about": [ + { + "href": "{{request.requestLine.baseUrl}}/wp-json/wp/v2/taxonomies/category" + } + ], + "wp:post_type": [ + { + "href": "{{request.requestLine.baseUrl}}/wp-json/wp/v2/posts?categories=1674" + } + ], + "curies": [ + { "name": "wp", "href": "https://api.w.org/{rel}", "templated": true } + ] + } + } + ], + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_taxonomies_post_tag.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_taxonomies_post_tag.json new file mode 100644 index 000000000000..87877c3ef1bc --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/106707880 - Tri-County Real Estate - Personal Plan/rest_sites_106707880_taxonomies_post_tag.json @@ -0,0 +1,26 @@ +{ + "request": { + "method": "GET", + "urlPath": "/wp/v2/sites/106707880/tags" + }, + "response": { + "status": 200, + "jsonBody": [ + { + "id": 2500, + "count": 1, + "description": "", + "link": "https://tricountyrealestate.wordpress.com/tag/tag/", + "name": "tag", + "slug": "tag", + "taxonomy": "post_tag", + "meta": [] + } + ], + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/181851495 - Four Paws Dog Grooming - Free Plan/rest_sites_181851495.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/181851495 - Four Paws Dog Grooming - Free Plan/rest_sites_181851495.json new file mode 100644 index 000000000000..84aa58e4c302 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/181851495 - Four Paws Dog Grooming - Free Plan/rest_sites_181851495.json @@ -0,0 +1,386 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/181851495", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "ID": 181851495, + "name": "Four Paws Dog Grooming", + "description": "Site on Free Plan", + "URL": "https://fourpawsdoggrooming.wordpress.com", + "user_can_manage": true, + "capabilities": { + "edit_pages": true, + "edit_posts": true, + "edit_others_posts": true, + "edit_others_pages": true, + "delete_posts": true, + "delete_others_posts": true, + "edit_theme_options": true, + "edit_users": false, + "list_users": true, + "manage_categories": true, + "manage_options": true, + "moderate_comments": true, + "activate_wordads": false, + "promote_users": true, + "publish_posts": true, + "upload_files": true, + "delete_users": false, + "remove_users": true, + "own_site": false, + "view_hosting": true, + "view_stats": true + }, + "jetpack": false, + "jetpack_connection": false, + "is_multisite": true, + "post_count": 3, + "subscribers_count": 0, + "lang": "en", + "icon": { + "img": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-2-1.png?w=96", + "ico": "https://fourpawsdoggrooming.files.wordpress.com/2020/08/cropped-fourpaws-logo-2-1.png?w=96", + "media_id": 39 + }, + "logo": { + "id": 0, + "sizes": [ + + ], + "url": "" + }, + "visible": true, + "is_private": true, + "is_coming_soon": true, + "single_user_site": false, + "is_vip": false, + "is_following": false, + "options": { + "timezone": "America/Los_Angeles", + "gmt_offset": -7, + "blog_public": -1, + "videopress_enabled": false, + "upgraded_filetypes_enabled": false, + "login_url": "https://fourpawsdoggrooming.wordpress.com/wp-login.php", + "admin_url": "https://fourpawsdoggrooming.wordpress.com/wp-admin/", + "is_mapped_domain": false, + "is_redirect": false, + "unmapped_url": "https://fourpawsdoggrooming.wordpress.com", + "featured_images_enabled": false, + "theme_slug": "pub/hever", + "header_image": false, + "background_color": false, + "image_default_link_type": "none", + "image_thumbnail_width": 150, + "image_thumbnail_height": 150, + "image_thumbnail_crop": 0, + "image_medium_width": 300, + "image_medium_height": 300, + "image_large_width": 1024, + "image_large_height": 1024, + "permalink_structure": "/%year%/%monthnum%/%day%/%postname%/", + "post_formats": [ + + ], + "default_post_format": "0", + "default_category": 1, + "allowed_file_types": [ + "jpg", + "jpeg", + "png", + "gif", + "pdf", + "doc", + "ppt", + "odt", + "pptx", + "docx", + "pps", + "ppsx", + "xls", + "xlsx", + "key", + "asc" + ], + "show_on_front": "page", + "default_likes_enabled": true, + "default_sharing_status": false, + "default_comment_status": true, + "default_ping_status": true, + "software_version": "5.5-wpcom-48929", + "created_at": "2020-08-21T23:21:16+00:00", + "wordads": false, + "publicize_permanently_disabled": false, + "frame_nonce": "6c9ff09ee5", + "jetpack_frame_nonce": "6c9ff09ee5", + "page_on_front": 5, + "page_for_posts": 0, + "wpcom_public_coming_soon_page_id": 0, + "headstart": false, + "headstart_is_fresh": false, + "ak_vp_bundle_enabled": null, + "advanced_seo_front_page_description": "", + "advanced_seo_title_formats": [ + + ], + "verification_services_codes": null, + "podcasting_archive": null, + "is_domain_only": false, + "is_automated_transfer": false, + "is_wpcom_atomic": false, + "is_wpcom_store": false, + "woocommerce_is_active": false, + "design_type": null, + "site_goals": null, + "site_segment": null, + "import_engine": null, + "is_pending_plan": false, + "is_wpforteams_site": false, + "is_cloud_eligible": false + }, + "plan": { + "product_id": 1, + "product_slug": "free_plan", + "product_name": "WordPress.com Free", + "product_name_short": "Free", + "expired": false, + "user_is_owner": false, + "is_free": true, + "features": { + "active": [ + "free-blog", + "space", + "support" + ], + "available": { + "free-blog": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "value_bundle-2y", + "business-bundle-2y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle-2y" + ], + "custom-domain": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "value_bundle-2y", + "business-bundle-2y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle-2y" + ], + "space": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "value_bundle-2y", + "business-bundle-2y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle-2y" + ], + "donations": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle-2y" + ], + "core/audio": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle-2y" + ], + "premium-content/container": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle-2y" + ], + "support": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "value_bundle-2y", + "business-bundle-2y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle-2y" + ], + "no-adverts/no-adverts.php": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle-2y" + ], + "custom-design": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle-2y" + ], + "videopress": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle-2y" + ], + "unlimited_themes": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle-2y" + ], + "live_support": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle-2y" + ], + "private_whois": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle-2y" + ], + "simple-payments": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle-2y" + ], + "calendly": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle-2y" + ], + "opentable": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle-2y" + ], + "send-a-message": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle-2y" + ], + "core/video": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle-2y" + ], + "core/cover": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "business-bundle-2y", + "ecommerce-bundle-2y" + ], + "premium-themes": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "ecommerce-bundle-2y" + ], + "google-analytics": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "ecommerce-bundle-2y" + ], + "social-previews": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "ecommerce-bundle-2y" + ] + } + } + }, + "products": [ + + ], + "jetpack_modules": null, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851495", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851495/help", + "posts": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851495/posts/", + "comments": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851495/comments/", + "xmlrpc": "https://fourpawsdoggrooming.wordpress.com/xmlrpc.php", + "site_icon": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851495/media/39" + } + }, + "quota": { + "space_allowed": 3221225472, + "space_used": 4495332, + "percent_used": 0.1395534723997116, + "space_available": 3216730140 + }, + "launch_status": "launched", + "site_migration": null, + "is_fse_active": false, + "is_fse_eligible": false, + "is_core_site_editor_enabled": false + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/181851495 - Four Paws Dog Grooming - Free Plan/rest_sites_181851495_gutenberg.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/181851495 - Four Paws Dog Grooming - Free Plan/rest_sites_181851495_gutenberg.json new file mode 100644 index 000000000000..bfdd26c0b8e5 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/181851495 - Four Paws Dog Grooming - Free Plan/rest_sites_181851495_gutenberg.json @@ -0,0 +1,19 @@ +{ + "request": { + "urlPath": "/wpcom/v2/sites/181851495/gutenberg", + "method": "GET" + }, + "response": { + "status": 200, + "jsonBody": { + "editor_mobile": "gutenberg", + "editor_web": "gutenberg", + "opt_in": "{{request.requestLine.baseUrl}}/wpcom/v2/sites/181851495/gutenberg?editor=gutenberg&platform=mobile" + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/181851495 - Four Paws Dog Grooming - Free Plan/rest_sites_181851495_settings.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/181851495 - Four Paws Dog Grooming - Free Plan/rest_sites_181851495_settings.json new file mode 100644 index 000000000000..246902e6f08b --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/181851495 - Four Paws Dog Grooming - Free Plan/rest_sites_181851495_settings.json @@ -0,0 +1,121 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/181851495/settings", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "ID": 181851495, + "name": "Four Paws Dog Grooming", + "description": "", + "URL": "https://fourpawsdoggrooming.wordpress.com", + "lang": "en", + "settings": { + "admin_url": "https://fourpawsdoggrooming.wordpress.com/wp-admin/", + "default_ping_status": true, + "default_comment_status": true, + "instant_search_enabled": false, + "blog_public": -1, + "jetpack_sync_non_public_post_stati": false, + "jetpack_relatedposts_allowed": true, + "jetpack_relatedposts_enabled": true, + "jetpack_relatedposts_show_headline": false, + "jetpack_relatedposts_show_thumbnails": false, + "jetpack_search_enabled": false, + "jetpack_search_supported": false, + "default_category": 1, + "post_categories": [ + { + "value": 1, + "name": "Uncategorized" + } + ], + "default_post_format": "0", + "default_pingback_flag": true, + "require_name_email": true, + "comment_registration": false, + "close_comments_for_old_posts": false, + "close_comments_days_old": 14, + "thread_comments": true, + "thread_comments_depth": 3, + "page_comments": true, + "comments_per_page": 50, + "default_comments_page": "newest", + "comment_order": "asc", + "comments_notify": true, + "moderation_notify": true, + "social_notifications_like": false, + "social_notifications_reblog": false, + "social_notifications_subscribe": false, + "comment_moderation": false, + "comment_whitelist": true, + "comment_previously_approved": false, + "comment_max_links": 2, + "moderation_keys": "", + "blacklist_keys": "", + "disallowed_keys": false, + "lang_id": 1, + "wga": false, + "disabled_likes": false, + "disabled_reblogs": false, + "jetpack_comment_likes_enabled": true, + "twitter_via": "", + "jetpack-twitter-cards-site-tag": "", + "eventbrite_api_token": null, + "gmt_offset": -7, + "timezone_string": "America/Los_Angeles", + "date_format": "F j, Y", + "time_format": "g:i a", + "start_of_week": "1", + "jetpack_testimonial": false, + "jetpack_testimonial_posts_per_page": 10, + "jetpack_portfolio": false, + "jetpack_portfolio_posts_per_page": 10, + "markdown_supported": true, + "site_icon": 39, + "advanced_seo_front_page_description": "", + "advanced_seo_title_formats": [ + + ], + "amp_is_supported": false, + "amp_is_enabled": true, + "api_cache": true, + "posts_per_page": 10, + "posts_per_rss": 10, + "rss_use_excerpt": false, + "wpcom_publish_posts_with_markdown": false, + "wpcom_publish_comments_with_markdown": false, + "infinite_scroll": true, + "infinite_scroll_blocked": false, + "wpcom_coming_soon": 1, + "podcasting_category_id": 0, + "podcasting_title": "", + "podcasting_subtitle": "", + "podcasting_talent_name": "", + "podcasting_summary": "", + "podcasting_copyright": "", + "podcasting_explicit": "no", + "podcasting_image": "", + "podcasting_keywords": "", + "podcasting_category_1": "", + "podcasting_category_2": "", + "podcasting_category_3": "", + "podcasting_email": "", + "podcasting_image_id": 0, + "sharing_button_style": "icon-text", + "sharing_label": "Share this:", + "sharing_show": [ + "post", + "page" + ], + "sharing_open_links": "same" + } + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/181977606 - Weekend Bakes - Pro Plan/rest_sites_181977606.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/181977606 - Weekend Bakes - Pro Plan/rest_sites_181977606.json new file mode 100644 index 000000000000..1070e6d719d7 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/181977606 - Weekend Bakes - Pro Plan/rest_sites_181977606.json @@ -0,0 +1,1778 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/181977606", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "ID": 181977606, + "name": "Weekend Bakes", + "description": "Site on Pro Plan", + "URL": "https://weekendbakesblog.wordpress.com", + "user_can_manage": false, + "capabilities": { + "edit_pages": true, + "edit_posts": true, + "edit_others_posts": true, + "edit_others_pages": true, + "delete_posts": true, + "delete_others_posts": true, + "edit_theme_options": true, + "edit_users": false, + "list_users": true, + "manage_categories": true, + "manage_options": true, + "moderate_comments": true, + "activate_wordads": true, + "promote_users": true, + "publish_posts": true, + "upload_files": true, + "delete_users": false, + "remove_users": true, + "own_site": true, + "view_hosting": true, + "view_stats": true, + "activate_plugins": true + }, + "jetpack": false, + "jetpack_connection": false, + "is_multisite": true, + "post_count": 13, + "subscribers_count": 5, + "lang": "en", + "logo": { + "id": 0, + "sizes": [], + "url": "" + }, + "visible": true, + "is_private": false, + "is_coming_soon": false, + "single_user_site": true, + "is_vip": false, + "is_following": true, + "organization_id": 0, + "options": { + "timezone": "", + "gmt_offset": 0, + "blog_public": 1, + "videopress_enabled": false, + "upgraded_filetypes_enabled": false, + "login_url": "https://weekendbakesblog.wordpress.com/wp-login.php", + "admin_url": "https://weekendbakesblog.wordpress.com/wp-admin/", + "is_mapped_domain": false, + "is_redirect": false, + "unmapped_url": "https://weekendbakesblog.wordpress.com", + "featured_images_enabled": true, + "theme_slug": "pub/twentysixteen", + "header_image": false, + "background_color": false, + "image_default_link_type": "none", + "image_thumbnail_width": 150, + "image_thumbnail_height": 150, + "image_thumbnail_crop": 0, + "image_medium_width": 300, + "image_medium_height": 300, + "image_large_width": 1024, + "image_large_height": 1024, + "permalink_structure": "/%year%/%monthnum%/%day%/%postname%/", + "post_formats": [], + "default_post_format": "0", + "default_category": 1, + "allowed_file_types": [ + "jpg", + "jpeg", + "png", + "gif", + "pdf", + "doc", + "ppt", + "odt", + "pptx", + "docx", + "pps", + "ppsx", + "xls", + "xlsx", + "key", + "webp", + "heic", + "heif", + "asc" + ], + "show_on_front": "posts", + "default_likes_enabled": true, + "default_sharing_status": true, + "default_comment_status": true, + "default_ping_status": true, + "software_version": "6.3-alpha-55954", + "created_at": "2022-12-22T07:13:20+00:00", + "updated_at": "2022-12-22T07:13:24+00:00", + "wordads": false, + "publicize_permanently_disabled": false, + "frame_nonce": "cd557ccebe", + "jetpack_frame_nonce": "cd557ccebe", + "headstart": false, + "headstart_is_fresh": false, + "ak_vp_bundle_enabled": null, + "advanced_seo_front_page_description": "", + "advanced_seo_title_formats": [], + "verification_services_codes": null, + "podcasting_archive": null, + "is_domain_only": false, + "is_automated_transfer": false, + "is_wpcom_atomic": false, + "is_wpcom_store": false, + "woocommerce_is_active": false, + "editing_toolkit_is_active": true, + "design_type": null, + "site_segment": 2, + "import_engine": null, + "is_pending_plan": false, + "is_wpforteams_site": false, + "p2_hub_blog_id": null, + "is_cloud_eligible": false, + "anchor_podcast": false, + "was_created_with_blank_canvas_design": false, + "videopress_storage_used": 0, + "is_difm_lite_in_progress": false, + "difm_lite_site_options": {}, + "site_intent": "", + "site_vertical_id": null, + "blogging_prompts_settings": { + "prompts_reminders_opted_in": false, + "reminders_days": { + "monday": false, + "tuesday": false, + "wednesday": false, + "thursday": false, + "friday": false, + "saturday": false, + "sunday": false + }, + "reminders_time": "10.00", + "is_potential_blogging_site": true, + "prompts_card_opted_in": true + }, + "launchpad_screen": false, + "launchpad_checklist_tasks_statuses": [], + "wpcom_production_blog_id": 0, + "wpcom_staging_blog_ids": [], + "can_blaze": true, + "wpcom_site_setup": false + }, + "p2_thumbnail_elements": null, + "plan": { + "product_id": 1035, + "product_slug": "pro-plan-2y", + "product_name": "WordPress.com Pro", + "product_name_short": "Pro", + "expired": false, + "billing_period": "", + "user_is_owner": false, + "is_free": false, + "license_key": "", + "features": { + "active": [ + "akismet", + "donations", + "free-blog", + "recurring-payments", + "space", + "support", + "social-mastodon-connection", + "social-instagram-connection", + "social-multi-connections" + ], + "available": { + "ai-assistant": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "core/audio": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "custom-domain": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "domain-mapping": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "full-activity-log": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "no-adverts/no-adverts.php": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "payments": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "premium-content/container": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "set-primary-custom-domain": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "space-upgraded-storage": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "subscriber-unlimited-imports": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "subscription-gifting": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "upgraded_upload_filetypes": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "calendly": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "cloudflare-analytics": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "cloudflare-cdn": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "core/cover": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "core/video": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "credit-vouchers": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "custom-design": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "global-styles": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "google-analytics": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "live_support": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-2y", + "pro-plan" + ], + "opentable": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "premium-themes": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "private_whois": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "republicize": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "send-a-message": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "simple-payments": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "upload-audio-files": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "upload-video-files": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "video-hosting": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "videopress": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "videopress/video": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "whatsapp-button": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "wordads": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "wordads-jetpack": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "ad-credit": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "advanced-seo": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "antispam": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "atomic": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "backups": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "restore": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "cdn": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "search": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "concierge": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly" + ], + "concierge-business": [ + "business-bundle", + "business-bundle-2y", + "business-bundle-3y", + "business-bundle-monthly" + ], + "copy-site": [ + "business-bundle", + "business-bundle-2y", + "business-bundle-3y", + "business-bundle-monthly" + ], + "edit-plugins": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "edit-themes": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "email-unlimited-forwards": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "google-my-business": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "install-plugins": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "install-purchased-plugins": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "install-themes": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "jetpack-dashboard": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "list-installed-plugins": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "manage-plugins": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "no-wpcom-branding": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "options-permalink": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "priority_support": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "real-time-backups": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "scan": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "scan-managed": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "security-settings": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "seo-preview-tools": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "sftp": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "ssh": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly" + ], + "site-preview-links": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly" + ], + "social-previews": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "staging-sites": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly" + ], + "upload-plugins": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "upload-themes": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "woop": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "ecommerce-managed-plugins": [ + "ecommerce-bundle", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly" + ], + "ecommerce-managed-plugins-medium": [ + "ecommerce-bundle", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-medium-bundle-yearly" + ], + "mailpoet-business": [ + "ecommerce-bundle", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "ecommerce-bundle-monthly" + ], + "blog-domain-only": [ + "blogger-bundle", + "blogger-bundle-2y" + ], + "ecommerce-managed-plugins-trial": [ + "ecommerce-trial-bundle-monthly" + ], + "install-woo-onboarding-plugins": [ + "ecommerce-trial-bundle-monthly" + ], + "reduced-email-priority": [ + "ecommerce-trial-bundle-monthly" + ], + "ecommerce-managed-plugins-small": [ + "wooexpress-small-bundle-monthly", + "wooexpress-small-bundle-yearly" + ], + "artificial-50gb-storage-limit": [ + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ] + } + } + }, + "products": [], + "zendesk_site_meta": { + "plan": "free", + "addon": [] + }, + "jetpack_modules": null, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/181977606", + "help": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/help", + "posts": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/posts/", + "comments": "https://public-api.wordpress.com/rest/v1.1/sites/181977606/comments/", + "xmlrpc": "https://weekendbakesblog.wordpress.com/xmlrpc.php" + } + }, + "quota": { + "space_allowed": 3221225472, + "space_used": 1298424, + "percent_used": 0.0403083860874176, + "space_available": 3219927048 + }, + "launch_status": "launched", + "site_migration": null, + "is_fse_active": false, + "is_fse_eligible": false, + "is_core_site_editor_enabled": false, + "is_wpcom_atomic": false, + "is_wpcom_staging_site": false, + "user_interactions": [ + "2022-12-22" + ], + "was_ecommerce_trial": false, + "was_migration_trial": false + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/181977606 - Weekend Bakes - Pro Plan/rest_sites_181977606_gutenberg.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/181977606 - Weekend Bakes - Pro Plan/rest_sites_181977606_gutenberg.json new file mode 100644 index 000000000000..e2fb48cf4ac5 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/181977606 - Weekend Bakes - Pro Plan/rest_sites_181977606_gutenberg.json @@ -0,0 +1,19 @@ +{ + "request": { + "urlPath": "/wpcom/v2/sites/181977606/gutenberg", + "method": "GET" + }, + "response": { + "status": 200, + "jsonBody": { + "editor_mobile": "gutenberg", + "editor_web": "gutenberg", + "opt_in": "{{request.requestLine.baseUrl}}/wpcom/v2/sites/181977606/gutenberg?editor=gutenberg&platform=mobile" + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/181977606 - Weekend Bakes - Pro Plan/rest_sites_181977606_settings.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/181977606 - Weekend Bakes - Pro Plan/rest_sites_181977606_settings.json new file mode 100644 index 000000000000..7283722ea995 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/181977606 - Weekend Bakes - Pro Plan/rest_sites_181977606_settings.json @@ -0,0 +1,147 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/181977606/settings", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "ID": 181977606, + "name": "Weekend Bakes", + "description": "", + "URL": "https://weekendbakesblog.wordpress.com", + "lang": "en", + "settings": { + "admin_url": "https://weekendbakesblog.wordpress.com/wp-admin/", + "default_ping_status": true, + "default_comment_status": true, + "instant_search_enabled": false, + "blog_public": 1, + "jetpack_sync_non_public_post_stati": false, + "jetpack_relatedposts_allowed": true, + "jetpack_relatedposts_enabled": true, + "jetpack_relatedposts_show_context": false, + "jetpack_relatedposts_show_date": false, + "jetpack_relatedposts_show_headline": false, + "jetpack_relatedposts_show_thumbnails": false, + "jetpack_search_enabled": false, + "jetpack_search_supported": false, + "default_category": 1, + "post_categories": [ + { + "value": 1, + "name": "Uncategorized" + } + ], + "default_post_format": "0", + "default_pingback_flag": true, + "require_name_email": true, + "comment_registration": false, + "close_comments_for_old_posts": false, + "close_comments_days_old": 14, + "thread_comments": true, + "thread_comments_depth": 3, + "page_comments": true, + "comments_per_page": 50, + "default_comments_page": "newest", + "comment_order": "asc", + "comments_notify": true, + "moderation_notify": true, + "social_notifications_like": false, + "social_notifications_reblog": false, + "social_notifications_subscribe": false, + "comment_moderation": false, + "comment_whitelist": true, + "comment_previously_approved": false, + "comment_max_links": 2, + "moderation_keys": "", + "blacklist_keys": "", + "disallowed_keys": false, + "lang_id": 1, + "site_vertical_id": "", + "wga": false, + "jetpack_cloudflare_analytics": false, + "disabled_likes": false, + "disabled_reblogs": false, + "jetpack_comment_likes_enabled": true, + "twitter_via": "", + "jetpack-twitter-cards-site-tag": "", + "eventbrite_api_token": null, + "gmt_offset": 0, + "timezone_string": "", + "date_format": "F j, Y", + "time_format": "g:i a", + "start_of_week": "1", + "woocommerce_onboarding_profile": [], + "woocommerce_store_address": "", + "woocommerce_store_address_2": "", + "woocommerce_store_city": "", + "woocommerce_default_country": "", + "woocommerce_store_postcode": "", + "jetpack_testimonial": false, + "jetpack_testimonial_posts_per_page": 10, + "jetpack_portfolio": false, + "jetpack_portfolio_posts_per_page": 10, + "markdown_supported": true, + "site_icon": 12, + "advanced_seo_front_page_description": "", + "advanced_seo_title_formats": [], + "amp_is_supported": true, + "amp_is_enabled": true, + "amp_is_deprecated": true, + "api_cache": true, + "posts_per_page": 10, + "posts_per_rss": 10, + "rss_use_excerpt": false, + "launchpad_screen": "", + "wpcom_featured_image_in_email": false, + "sm_enabled": false, + "wpcom_gifting_subscription": false, + "wpcom_reader_views_enabled": true, + "wpcom_subscription_emails_use_excerpt": false, + "show_on_front": "posts", + "page_on_front": "0", + "page_for_posts": "0", + "subscription_options": { + "invitation": "Howdy,\nYou recently subscribed to cloudteststore1.wordpress.com and we need to verify the email you provided. Once you confirm below, you'll be able to receive and read new posts.\n\nIf you believe this is an error, ignore this message and nothing more will happen.", + "comment_follow": "Howdy.\n\nYou recently followed one of my posts. This means you will receive an email when new comments are posted.\n\nTo activate, click confirm below. If you believe this is an error, ignore this message and we'll never bother you again." + }, + "wpcom_publish_posts_with_markdown": false, + "wpcom_publish_comments_with_markdown": false, + "infinite_scroll": true, + "infinite_scroll_blocked": false, + "wpcom_coming_soon": 0, + "wpcom_public_coming_soon": 0, + "podcasting_category_id": 0, + "podcasting_title": "", + "podcasting_subtitle": "", + "podcasting_talent_name": "", + "podcasting_summary": "", + "podcasting_copyright": "", + "podcasting_explicit": "no", + "podcasting_image": "", + "podcasting_keywords": "", + "podcasting_category_1": "", + "podcasting_category_2": "", + "podcasting_category_3": "", + "podcasting_email": "", + "podcasting_image_id": 0, + "sharing_button_style": "icon-text", + "sharing_label": "Share this:", + "sharing_show": [ + "post", + "page" + ], + "sharing_open_links": "same", + "jetpack_protect_whitelist": { + "local": [] + } + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/181977606 - Weekend Bakes - Pro Plan/rest_sites_181977606_users.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/181977606 - Weekend Bakes - Pro Plan/rest_sites_181977606_users.json new file mode 100644 index 000000000000..79b7e7ef67ae --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/181977606 - Weekend Bakes - Pro Plan/rest_sites_181977606_users.json @@ -0,0 +1,44 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/rest/v1.1/sites/181977606/users.*", + "queryParameters": { + "locale": { + "matches": "(.*)" + }, + "authors_only": { + "equalTo": "1" + }, + "number": { + "equalTo": "100" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "found": 1, + "users": [ + { + "ID": 152748359, + "login": "appstorescreens", + "email": "test@example.com", + "name": "appstorescreens", + "first_name": "", + "last_name": "", + "nice_name": "e2eflowtestingmobile", + "URL": "http://tricountyrealestate.wordpress.com", + "avatar_URL": "https://0.gravatar.com/avatar/35029b2103460109f574c38dfeea5f3f?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/appstorescreens", + "ip_address": "", + "site_ID": 181977606, + "site_visible": true, + "roles": [ + "administrator" + ], + "is_super_admin": false + } + ] + } + } + } \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/221670093 - NUX Test Site - NUX Site/rest_sites_221670093.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/221670093 - NUX Test Site - NUX Site/rest_sites_221670093.json new file mode 100644 index 000000000000..9d4808f21f74 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/221670093 - NUX Test Site - NUX Site/rest_sites_221670093.json @@ -0,0 +1,1778 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/221670093", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "ID": 221670093, + "name": "New Testing Site", + "description": "Newly created site", + "URL": "https://domainexample.blog", + "user_can_manage": false, + "capabilities": { + "edit_pages": true, + "edit_posts": true, + "edit_others_posts": true, + "edit_others_pages": true, + "delete_posts": true, + "delete_others_posts": true, + "edit_theme_options": true, + "edit_users": false, + "list_users": true, + "manage_categories": true, + "manage_options": true, + "moderate_comments": true, + "activate_wordads": true, + "promote_users": true, + "publish_posts": true, + "upload_files": true, + "delete_users": false, + "remove_users": true, + "own_site": true, + "view_hosting": true, + "view_stats": true, + "activate_plugins": true + }, + "jetpack": false, + "jetpack_connection": false, + "is_multisite": true, + "post_count": 13, + "subscribers_count": 5, + "lang": "en", + "logo": { + "id": 0, + "sizes": [], + "url": "" + }, + "visible": true, + "is_private": false, + "is_coming_soon": false, + "single_user_site": true, + "is_vip": false, + "is_following": true, + "organization_id": 0, + "options": { + "timezone": "", + "gmt_offset": 0, + "blog_public": 1, + "videopress_enabled": false, + "upgraded_filetypes_enabled": false, + "login_url": "https://weekendbakesblog.wordpress.com/wp-login.php", + "admin_url": "https://weekendbakesblog.wordpress.com/wp-admin/", + "is_mapped_domain": false, + "is_redirect": false, + "unmapped_url": "https://weekendbakesblog.wordpress.com", + "featured_images_enabled": true, + "theme_slug": "pub/twentysixteen", + "header_image": false, + "background_color": false, + "image_default_link_type": "none", + "image_thumbnail_width": 150, + "image_thumbnail_height": 150, + "image_thumbnail_crop": 0, + "image_medium_width": 300, + "image_medium_height": 300, + "image_large_width": 1024, + "image_large_height": 1024, + "permalink_structure": "/%year%/%monthnum%/%day%/%postname%/", + "post_formats": [], + "default_post_format": "0", + "default_category": 1, + "allowed_file_types": [ + "jpg", + "jpeg", + "png", + "gif", + "pdf", + "doc", + "ppt", + "odt", + "pptx", + "docx", + "pps", + "ppsx", + "xls", + "xlsx", + "key", + "webp", + "heic", + "heif", + "asc" + ], + "show_on_front": "posts", + "default_likes_enabled": true, + "default_sharing_status": true, + "default_comment_status": true, + "default_ping_status": true, + "software_version": "6.3-alpha-55954", + "created_at": "2022-12-22T07:13:20+00:00", + "updated_at": "2022-12-22T07:13:24+00:00", + "wordads": false, + "publicize_permanently_disabled": false, + "frame_nonce": "cd557ccebe", + "jetpack_frame_nonce": "cd557ccebe", + "headstart": false, + "headstart_is_fresh": false, + "ak_vp_bundle_enabled": null, + "advanced_seo_front_page_description": "", + "advanced_seo_title_formats": [], + "verification_services_codes": null, + "podcasting_archive": null, + "is_domain_only": false, + "is_automated_transfer": false, + "is_wpcom_atomic": false, + "is_wpcom_store": false, + "woocommerce_is_active": false, + "editing_toolkit_is_active": true, + "design_type": null, + "site_segment": 2, + "import_engine": null, + "is_pending_plan": false, + "is_wpforteams_site": false, + "p2_hub_blog_id": null, + "is_cloud_eligible": false, + "anchor_podcast": false, + "was_created_with_blank_canvas_design": false, + "videopress_storage_used": 0, + "is_difm_lite_in_progress": false, + "difm_lite_site_options": {}, + "site_intent": "", + "site_vertical_id": null, + "blogging_prompts_settings": { + "prompts_reminders_opted_in": false, + "reminders_days": { + "monday": false, + "tuesday": false, + "wednesday": false, + "thursday": false, + "friday": false, + "saturday": false, + "sunday": false + }, + "reminders_time": "10.00", + "is_potential_blogging_site": true, + "prompts_card_opted_in": true + }, + "launchpad_screen": false, + "launchpad_checklist_tasks_statuses": [], + "wpcom_production_blog_id": 0, + "wpcom_staging_blog_ids": [], + "can_blaze": true, + "wpcom_site_setup": false + }, + "p2_thumbnail_elements": null, + "plan": { + "product_id": 1035, + "product_slug": "pro-plan-2y", + "product_name": "WordPress.com Pro", + "product_name_short": "Pro", + "expired": false, + "billing_period": "", + "user_is_owner": false, + "is_free": false, + "license_key": "", + "features": { + "active": [ + "akismet", + "donations", + "free-blog", + "recurring-payments", + "space", + "support", + "social-mastodon-connection", + "social-instagram-connection", + "social-multi-connections" + ], + "available": { + "ai-assistant": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "core/audio": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "custom-domain": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "domain-mapping": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "full-activity-log": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "no-adverts/no-adverts.php": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "payments": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "premium-content/container": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "set-primary-custom-domain": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "space-upgraded-storage": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "subscriber-unlimited-imports": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "subscription-gifting": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "upgraded_upload_filetypes": [ + "personal-bundle", + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "personal-bundle-2y", + "personal-bundle-3y", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "blogger-bundle", + "blogger-bundle-2y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "personal-bundle-monthly", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "calendly": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "cloudflare-analytics": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "cloudflare-cdn": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "core/cover": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "core/video": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "credit-vouchers": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "custom-design": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "global-styles": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "google-analytics": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "live_support": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-2y", + "pro-plan" + ], + "opentable": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "premium-themes": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "private_whois": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "republicize": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "send-a-message": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "simple-payments": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "upload-audio-files": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "upload-video-files": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "video-hosting": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "videopress": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "videopress/video": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "whatsapp-button": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "wordads": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "wordads-jetpack": [ + "value_bundle", + "business-bundle", + "ecommerce-bundle", + "value_bundle-2y", + "value_bundle-3y", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "value_bundle_monthly", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "ad-credit": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "advanced-seo": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "antispam": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "atomic": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "backups": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "restore": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "cdn": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "search": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "concierge": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly" + ], + "concierge-business": [ + "business-bundle", + "business-bundle-2y", + "business-bundle-3y", + "business-bundle-monthly" + ], + "copy-site": [ + "business-bundle", + "business-bundle-2y", + "business-bundle-3y", + "business-bundle-monthly" + ], + "edit-plugins": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "edit-themes": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "email-unlimited-forwards": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "google-my-business": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "install-plugins": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "install-purchased-plugins": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "install-themes": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "jetpack-dashboard": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "list-installed-plugins": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "starter-plan", + "pro-plan" + ], + "manage-plugins": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "no-wpcom-branding": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "options-permalink": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "priority_support": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "real-time-backups": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "scan": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "scan-managed": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "security-settings": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "seo-preview-tools": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "sftp": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "ssh": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly" + ], + "site-preview-links": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly" + ], + "social-previews": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "staging-sites": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly" + ], + "upload-plugins": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "upload-themes": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "woop": [ + "business-bundle", + "ecommerce-bundle", + "business-bundle-2y", + "business-bundle-3y", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "business-bundle-monthly", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly", + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ], + "ecommerce-managed-plugins": [ + "ecommerce-bundle", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "ecommerce-bundle-monthly", + "ecommerce-trial-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-small-bundle-monthly", + "wooexpress-medium-bundle-yearly", + "wooexpress-small-bundle-yearly" + ], + "ecommerce-managed-plugins-medium": [ + "ecommerce-bundle", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "ecommerce-bundle-monthly", + "wooexpress-medium-bundle-monthly", + "wooexpress-medium-bundle-yearly" + ], + "mailpoet-business": [ + "ecommerce-bundle", + "ecommerce-bundle-2y", + "ecommerce-bundle-3y", + "ecommerce-bundle-monthly" + ], + "blog-domain-only": [ + "blogger-bundle", + "blogger-bundle-2y" + ], + "ecommerce-managed-plugins-trial": [ + "ecommerce-trial-bundle-monthly" + ], + "install-woo-onboarding-plugins": [ + "ecommerce-trial-bundle-monthly" + ], + "reduced-email-priority": [ + "ecommerce-trial-bundle-monthly" + ], + "ecommerce-managed-plugins-small": [ + "wooexpress-small-bundle-monthly", + "wooexpress-small-bundle-yearly" + ], + "artificial-50gb-storage-limit": [ + "pro-plan-monthly", + "pro-plan-2y", + "pro-plan" + ] + } + } + }, + "products": [], + "zendesk_site_meta": { + "plan": "free", + "addon": [] + }, + "jetpack_modules": null, + "meta": { + "links": { + "self": "https://public-api.wordpress.com/rest/v1.1/sites/221670093", + "help": "https://public-api.wordpress.com/rest/v1.1/sites/221670093/help", + "posts": "https://public-api.wordpress.com/rest/v1.1/sites/221670093/posts/", + "comments": "https://public-api.wordpress.com/rest/v1.1/sites/221670093/comments/", + "xmlrpc": "https://domainexample.blog/xmlrpc.php" + } + }, + "quota": { + "space_allowed": 3221225472, + "space_used": 1298424, + "percent_used": 0.0403083860874176, + "space_available": 3219927048 + }, + "launch_status": "launched", + "site_migration": null, + "is_fse_active": false, + "is_fse_eligible": false, + "is_core_site_editor_enabled": false, + "is_wpcom_atomic": false, + "is_wpcom_staging_site": false, + "user_interactions": [ + "2022-12-22" + ], + "was_ecommerce_trial": false, + "was_migration_trial": false + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/221670093 - NUX Test Site - NUX Site/rest_sites_221670093_gutenberg.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/221670093 - NUX Test Site - NUX Site/rest_sites_221670093_gutenberg.json new file mode 100644 index 000000000000..a164d687d3af --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/221670093 - NUX Test Site - NUX Site/rest_sites_221670093_gutenberg.json @@ -0,0 +1,19 @@ +{ + "request": { + "urlPath": "/wpcom/v2/sites/221670093/gutenberg", + "method": "GET" + }, + "response": { + "status": 200, + "jsonBody": { + "editor_mobile": "gutenberg", + "editor_web": "gutenberg", + "opt_in": "{{request.requestLine.baseUrl}}/wpcom/v2/sites/221670093/gutenberg?editor=gutenberg&platform=mobile" + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/221670093 - NUX Test Site - NUX Site/rest_sites_221670093_gutenberg_post.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/221670093 - NUX Test Site - NUX Site/rest_sites_221670093_gutenberg_post.json new file mode 100644 index 000000000000..0cc4959fab2f --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/221670093 - NUX Test Site - NUX Site/rest_sites_221670093_gutenberg_post.json @@ -0,0 +1,30 @@ +{ + "request": { + "urlPath": "/wpcom/v2/sites/221670093/gutenberg", + "method": "POST", + "queryParameters": { + "platform": { + "matches": "mobile" + }, + "editor": { + "matches": "gutenberg" + }, + "locale": { + "matches": ".*" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "editor_mobile": "gutenberg", + "editor_web": "gutenberg", + "opt_out": "https://public-api.wordpress.com/wpcom/v2/sites/221670093/gutenberg?editor=aztec&platform=mobile" + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/221670093 - NUX Test Site - NUX Site/rest_sites_221670093_settings.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/221670093 - NUX Test Site - NUX Site/rest_sites_221670093_settings.json new file mode 100644 index 000000000000..d56fbb70d278 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/221670093 - NUX Test Site - NUX Site/rest_sites_221670093_settings.json @@ -0,0 +1,147 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/221670093/settings", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "ID": 221670093, + "name": "New Testing Site", + "description": "", + "URL": "https://domainexample.blog", + "lang": "en", + "settings": { + "admin_url": "https://domainexample.blog/wp-admin/", + "default_ping_status": true, + "default_comment_status": true, + "instant_search_enabled": false, + "blog_public": 1, + "jetpack_sync_non_public_post_stati": false, + "jetpack_relatedposts_allowed": true, + "jetpack_relatedposts_enabled": true, + "jetpack_relatedposts_show_context": false, + "jetpack_relatedposts_show_date": false, + "jetpack_relatedposts_show_headline": false, + "jetpack_relatedposts_show_thumbnails": false, + "jetpack_search_enabled": false, + "jetpack_search_supported": false, + "default_category": 1, + "post_categories": [ + { + "value": 1, + "name": "Uncategorized" + } + ], + "default_post_format": "0", + "default_pingback_flag": true, + "require_name_email": true, + "comment_registration": false, + "close_comments_for_old_posts": false, + "close_comments_days_old": 14, + "thread_comments": true, + "thread_comments_depth": 3, + "page_comments": true, + "comments_per_page": 50, + "default_comments_page": "newest", + "comment_order": "asc", + "comments_notify": true, + "moderation_notify": true, + "social_notifications_like": false, + "social_notifications_reblog": false, + "social_notifications_subscribe": false, + "comment_moderation": false, + "comment_whitelist": true, + "comment_previously_approved": false, + "comment_max_links": 2, + "moderation_keys": "", + "blacklist_keys": "", + "disallowed_keys": false, + "lang_id": 1, + "site_vertical_id": "", + "wga": false, + "jetpack_cloudflare_analytics": false, + "disabled_likes": false, + "disabled_reblogs": false, + "jetpack_comment_likes_enabled": true, + "twitter_via": "", + "jetpack-twitter-cards-site-tag": "", + "eventbrite_api_token": null, + "gmt_offset": 0, + "timezone_string": "", + "date_format": "F j, Y", + "time_format": "g:i a", + "start_of_week": "1", + "woocommerce_onboarding_profile": [], + "woocommerce_store_address": "", + "woocommerce_store_address_2": "", + "woocommerce_store_city": "", + "woocommerce_default_country": "", + "woocommerce_store_postcode": "", + "jetpack_testimonial": false, + "jetpack_testimonial_posts_per_page": 10, + "jetpack_portfolio": false, + "jetpack_portfolio_posts_per_page": 10, + "markdown_supported": true, + "site_icon": 12, + "advanced_seo_front_page_description": "", + "advanced_seo_title_formats": [], + "amp_is_supported": true, + "amp_is_enabled": true, + "amp_is_deprecated": true, + "api_cache": true, + "posts_per_page": 10, + "posts_per_rss": 10, + "rss_use_excerpt": false, + "launchpad_screen": "", + "wpcom_featured_image_in_email": false, + "sm_enabled": false, + "wpcom_gifting_subscription": false, + "wpcom_reader_views_enabled": true, + "wpcom_subscription_emails_use_excerpt": false, + "show_on_front": "posts", + "page_on_front": "0", + "page_for_posts": "0", + "subscription_options": { + "invitation": "Howdy,\nYou recently subscribed to cloudteststore1.wordpress.com and we need to verify the email you provided. Once you confirm below, you'll be able to receive and read new posts.\n\nIf you believe this is an error, ignore this message and nothing more will happen.", + "comment_follow": "Howdy.\n\nYou recently followed one of my posts. This means you will receive an email when new comments are posted.\n\nTo activate, click confirm below. If you believe this is an error, ignore this message and we'll never bother you again." + }, + "wpcom_publish_posts_with_markdown": false, + "wpcom_publish_comments_with_markdown": false, + "infinite_scroll": true, + "infinite_scroll_blocked": false, + "wpcom_coming_soon": 0, + "wpcom_public_coming_soon": 0, + "podcasting_category_id": 0, + "podcasting_title": "", + "podcasting_subtitle": "", + "podcasting_talent_name": "", + "podcasting_summary": "", + "podcasting_copyright": "", + "podcasting_explicit": "no", + "podcasting_image": "", + "podcasting_keywords": "", + "podcasting_category_1": "", + "podcasting_category_2": "", + "podcasting_category_3": "", + "podcasting_email": "", + "podcasting_image_id": 0, + "sharing_button_style": "icon-text", + "sharing_label": "Share this:", + "sharing_show": [ + "post", + "page" + ], + "sharing_open_links": "same", + "jetpack_protect_whitelist": { + "local": [] + } + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/221670093 - NUX Test Site - NUX Site/rest_sites_221670093_users.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/221670093 - NUX Test Site - NUX Site/rest_sites_221670093_users.json new file mode 100644 index 000000000000..795f16532dcb --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/221670093 - NUX Test Site - NUX Site/rest_sites_221670093_users.json @@ -0,0 +1,44 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/rest/v1.1/sites/221670093/users.*", + "queryParameters": { + "locale": { + "matches": "(.*)" + }, + "authors_only": { + "equalTo": "1" + }, + "number": { + "equalTo": "100" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "found": 1, + "users": [ + { + "ID": 152748359, + "login": "appstorescreens", + "email": "test@example.com", + "name": "appstorescreens", + "first_name": "", + "last_name": "", + "nice_name": "e2eflowtestingmobile", + "URL": "http://tricountyrealestate.wordpress.com", + "avatar_URL": "https://0.gravatar.com/avatar/35029b2103460109f574c38dfeea5f3f?s=96&d=identicon&r=G", + "profile_URL": "https://en.gravatar.com/appstorescreens", + "ip_address": "", + "site_ID": 221670093, + "site_visible": true, + "roles": [ + "administrator" + ], + "is_super_admin": false + } + ] + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/Shared/rest_sites_categories.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/Shared/rest_sites_categories.json new file mode 100644 index 000000000000..f5be37fd541e --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/Shared/rest_sites_categories.json @@ -0,0 +1,51 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/rest/v1.1/sites/.*/categories.*", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "found": 2, + "categories": [ + { + "ID": 1, + "name": "Uncategorized", + "slug": "uncategorized", + "description": "", + "post_count": 1, + "feed_url": "http://infocusphotographers.com/category/uncategorized/feed/", + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851495/categories/slug:uncategorized", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851495/categories/slug:uncategorized/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851495" + } + } + }, + { + "ID": 1674, + "name": "Wedding", + "slug": "wedding", + "description": "", + "post_count": 1, + "feed_url": "http://infocusphotographers.com/category/wedding/feed/", + "parent": 0, + "meta": { + "links": { + "self": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851495/categories/slug:wedding", + "help": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851495/categories/slug:wedding/help", + "site": "{{request.requestLine.baseUrl}}/rest/v1.1/sites/181851495" + } + } + } + ] + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/Shared/rest_sites_post_formats.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/Shared/rest_sites_post_formats.json new file mode 100644 index 000000000000..4b7721fe66eb --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/Shared/rest_sites_post_formats.json @@ -0,0 +1,27 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/rest/v1.1/sites/.*/post-formats.*", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "formats": { + "aside": "Aside", + "image": "Image", + "video": "Video", + "quote": "Quote", + "link": "Link", + "gallery": "Gallery", + "status": "Status", + "audio": "Audio", + "chat": "Chat" + } + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/Shared/rest_sites_publicize_connections.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/Shared/rest_sites_publicize_connections.json new file mode 100644 index 000000000000..df9e8f236e4a --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/Shared/rest_sites_publicize_connections.json @@ -0,0 +1,19 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/rest/v1.1/sites/.*/publicize-connections.*", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "connections": [ + + ] + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/Shared/rest_sites_users.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/Shared/rest_sites_users.json new file mode 100644 index 000000000000..16590d9e991e --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/Shared/rest_sites_users.json @@ -0,0 +1,27 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/rest/v1.1/sites/.*/users.*", + "queryParameters": { + "locale": { + "matches": "(.*)" + }, + "authors_only": { + "equalTo": "1" + }, + "number": { + "equalTo": "100" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "found": 0, + "site_ID": 106707880, + "comments": [ + + ] + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/Shared/wpcom_sites_block_layouts.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/Shared/wpcom_sites_block_layouts.json new file mode 100644 index 000000000000..e9711f9dce45 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/Shared/wpcom_sites_block_layouts.json @@ -0,0 +1,770 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/wpcom/v2/sites/([0-9]+)/block-layouts", + "queryParameters": { + "supported_blocks": { + "matches": "(.*)" + }, + "preview_width": { + "matches": "(.*)" + }, + "scale": { + "matches": "(.*)" + }, + "preview_height": { + "matches": "(.*)" + }, + "type": { + "matches": "(.*)" + }, + "is_beta": { + "matches": "(.*)" + }, + "_locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "layouts": [ + { + "slug": "menu-2", + "title": "Menu", + "content": "\n

The menu is a mix of French regional cuisines, and the menu changes with the seasons. Be sure to ask about the daily specials!

\n\n\n\n
\n\n\n\n
\n\n\n\n
\n\n\n\n

Starters

\n\n\n\n
\n\n\n\n

Salmon Canapés
Smoked salmon topped with crème fraîche, dill and capers
$15.00

\n\n\n\n

Pork Rillettes
With quick pickle of dried apricots and pistachio crumble
$14.00

\n\n\n\n

Provençal Vegetable Tart
With seasonal vegetables
$12.50

\n\n\n\n
\n\n\n\n
\n\n\n\n
\n\n\n\n

Mains

\n\n\n\n
\n\n\n\n

Coq au Vin d’Alsace
Chicken cooked in Riesling with onions, mushrooms and herbs
$25.50

\n\n\n\n

Bouillabaisse
Traditional Provençal fish stew, with shrimp, mussels, clams and monkfish
$26.00

\n\n\n\n

Sole Meunière
Pan-fried sole in butter and served with brown butter sauce, parsley and lemon
$28.00

\n\n\n\n
\n\n\n\n
\n\n\n\n
\n\n\n\n

Desserts

\n\n\n\n
\n\n\n\n

Chocolate Macarons
A classic French delicacy, filled with rich chocolate ganache
$12.00

\n\n\n\n

Crêpe Suzette
Delicate crêpe in buttery, orange sauce; served flambé
$13.00

\n\n\n\n

Praline Cake
Multi-layer praline and chocolate cake with caramel cream cheese
$12.00

\n\n\n\n
\n\n\n\n
\n\n\n\n

Our fish is responsibly caught from sustainable sources.

\n", + "categories": [ + { + "slug": "services", + "title": "Services", + "description": "Service pages", + "emoji": "🔧", + "order": 8 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=4133&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D4133%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D4133%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D4133%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "contact-with-info", + "title": "Contact", + "content": "\n
\n
\n

Get in touch

\n\n\n\n
\n
\n\n\n\n
\n

Tell your visitors how to contact you. You could also get a bit more specific, by letting them know what to contact you about.

\n\n\n\n

Be sure to mention all the channels where visitors can reach you, including social media.

\n\n\n\n\n\n\n\n
\n
\n
\n\n\n\n
\n
\n

Connect

\n
\n\n\n\n
\n
    \n\n\n\n\n\n\n\n\n\n
\n
\n
\n\n\n\n
\n", + "categories": [ + { + "slug": "contact", + "title": "Contact", + "description": "Contact pages", + "emoji": "📫", + "order": 6 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=4073&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D4073%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D4073%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D4073%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "blog-9", + "title": "Blog", + "content": "\n
\"\"
\n\n\n\n

Introduce yourself and your blog

\n\n\n\n
\n\n\n\n

My Latest Posts

\n\n\n\n

• • •

\n\n\n\n\n\n

• • •

\n", + "categories": [ + { + "slug": "blog", + "title": "Blog", + "description": "Blog pages", + "emoji": "📰", + "order": 0 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3685&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3685%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3685%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3685%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "blog-8", + "title": "Blog", + "content": "\n
\n\n\n\n
\"\"
\n\n\n\n
\n\n\n\n

Introduce yourself and your blog

\n\n\n\n
\n\n\n\n

My Latest Posts

\n\n\n\n
\n\n\n\n\n\n
\n", + "categories": [ + { + "slug": "blog", + "title": "Blog", + "description": "Blog pages", + "emoji": "📰", + "order": 0 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3681&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3681%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3681%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3681%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "favorites-2", + "title": "Favorites", + "content": "\n

My Favorites

\n\n\n\n

List a few of your favorite things, or use this page to describe what you do.

\n\n\n\n
\n\n\n\n
\"\"
\n\n\n\n

Topic 1

\n\n\n\n

Add a sentence or two about an idea, topic, or service you want to share with your readers.

\n\n\n\n
\n\n\n\n
\"\"
\n\n\n\n

Topic 2

\n\n\n\n

Add a sentence or two about an idea, topic, or service you want to share with your readers.

\n", + "categories": [ + { + "slug": "highlights", + "title": "Highlights", + "description": "Highlights pages", + "emoji": "💛", + "order": 4 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3676&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3676%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3676%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3676%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "favorites", + "title": "Favorites", + "content": "\n
\"\"
\n\n\n\n

My Favorites

\n\n\n\n

List a few of your favorite things, or use this page to describe what you do.

\n\n\n\n
\"\"
\n

Topic 1

\n\n\n\n

Add a sentence or two about an idea, topic, or service you want to share with your readers.

\n
\n\n\n\n
\n\n\n\n
\"\"
\n

Topic 2

\n\n\n\n

Add a sentence or two about an idea, topic, or service you want to share with your readers.

\n
\n", + "categories": [ + { + "slug": "highlights", + "title": "Highlights", + "description": "Highlights pages", + "emoji": "💛", + "order": 4 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3670&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3670%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3670%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3670%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "coming-soon-3", + "title": "Coming Soon", + "content": "\n
\"\"
\n
\"\"
\n\n\n\n
\n\n\n\n

Coming soon!

\n\n\n\n
\n\n\n\n

Let’s make something new together

\n\n\n\n

_Instagram
_Twitter
_YouTube

\n\n\n\n

Want to learn more? Get in touch!

\n
\n", + "categories": [ + { + "slug": "splash", + "title": "Splash", + "description": "Splash pages", + "emoji": "🏖", + "order": 3 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3665&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3665%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3665%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3665%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "coming-soon-2", + "title": "Coming Soon", + "content": "\n
\n

Coming soon

\n\n\n\n

Let’s make something new together

\n\n\n\n
\n\n\n\n\n
\n", + "categories": [ + { + "slug": "splash", + "title": "Splash", + "description": "Splash pages", + "emoji": "🏖", + "order": 3 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3662&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3662%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3662%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3662%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "about-11", + "title": "About", + "content": "\n
\"\"
\n\n\n\n
\n

About me

\n\n\n\n

Introduce yourself! Use this space to write 2 or 3 sentences about who you are, what you do, and where you are.

\n\n\n\n
    \n\n\n\n
\n
\n", + "categories": [ + { + "slug": "about", + "title": "About", + "description": "About pages", + "emoji": "👋", + "order": 1 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3658&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3658%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3658%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3658%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "about-10", + "title": "About", + "content": "\n
\n\n\n\n
\"\"
\n\n\n\n

About me

\n\n\n\n

Introduce yourself! Use this space to write 2 or 3 sentences about who you are, what you do, and where you are.

\n\n\n\n\n", + "categories": [ + { + "slug": "about", + "title": "About", + "description": "About pages", + "emoji": "👋", + "order": 1 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3654&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3654%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3654%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3654%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "links", + "title": "Links", + "content": "\n
\"\"
\n
\n\n\n\n

My Links

\n\n\n\n

My latest and greatest tips, resources, and reads. So much goodness all in one place!

\n\n\n\n\n\n\n\n
    \n\n\n\n
\n\n\n\n
\n
\n", + "categories": [ + { + "slug": "links", + "title": "Links", + "description": "Links pages", + "emoji": "🔗", + "order": 2 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3649&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3649%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3649%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3649%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "about-9", + "title": "Links", + "content": "\n
\"\"
\n\n\n\n

My Links

\n\n\n\n\n\n\n\n

My latest and greatest tips, resources, and reads. So much goodness all in one place!

\n\n\n\n\n", + "categories": [ + { + "slug": "links", + "title": "Links", + "description": "Links pages", + "emoji": "🔗", + "order": 2 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3644&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3644%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3644%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3644%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "reynolds-2", + "title": "Reynolds", + "content": "\n
\"\"
\n

Introduce yourself -- who you are, what you do, and where you are.

\n\n\n\n\n
\n\n\n\n
\"\"
\n

Project #1

\n\n\n\n

A unique approach to the creative process. Every project begins with an idea, but it's what happens to that idea along the way that counts.

\n\n\n\n\n
\n\n\n\n
\"\"
\n

Project #2

\n\n\n\n

Your project showcase demonstrates your skills, your experience, and your ability to produce stunning work across genres.

\n\n\n\n\n
\n\n\n\n
\"\"
\n

Project #3

\n\n\n\n

Your customers will love your attention to detail. Each project you showcase tells them something difference about you and your innovative work.

\n\n\n\n\n
\n\n\n\n

\n", + "categories": [ + { + "slug": "home", + "title": "Home", + "description": "Home pages", + "emoji": "🏠", + "order": 9 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3504&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3504%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3504%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3504%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "vesta-2", + "title": "Vesta", + "content": "\n
\n
\n
\n\n\n\n
\n
\n

Vesta is a photographer and art director based in London, UK. Currently working for magazines and award-winning publications.

\n
\n\n\n\n
\n
\n\n\n\n
\n\n\n\n
\n
\n
\n
\"\"
\n\n\n\n

Never Ending Story

\n\n\n\n
\n
\n\n\n\n
\n
\"\"
\n\n\n\n

The Final Corner

\n\n\n\n
\n
\n
\n
\n\n\n\n
\n
\n
\n
\"\"
\n\n\n\n

Top of the Hill

\n\n\n\n
\n
\n\n\n\n
\n
\"\"
\n\n\n\n

Crossing Points

\n\n\n\n
\n
\n
\n
\n\n\n\n
\n
\n
\n
\"\"
\n\n\n\n

Ebb and Flow

\n\n\n\n
\n
\n\n\n\n
\n
\"\"
\n\n\n\n

In the Morning

\n\n\n\n
\n
\n
\n
\n\n\n\n
\n\n\n\n
\n
\n

Contact

\n
\n\n\n\n\n
\n", + "categories": [ + { + "slug": "home", + "title": "Home", + "description": "Home pages", + "emoji": "🏠", + "order": 9 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3498&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3498%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3498%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3498%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "overton-2", + "title": "Overton", + "content": "\n
\n\n\n\n

From breakfast and lunch to dinner and dessert, our menu will delight.

\n\n\n\n

Our delicious menu includes snacks, finger-foods, and full meals.

\n\n\n\n\n\n\n\n
\n\n\n\n
\"\"
\n

\n
\n\n\n\n
\n
\n\n\n\n
\n
\n

Ready Made Meals

\n\n\n\n

Can't be bothered to cook but still craving delicious food? We've got you covered with our ready made meals. Our menu offers selections for breakfast, lunch, or dinner with a range that is sure to please the whole family.

\n
\n\n\n\n
\n

Birthdays

\n\n\n\n

Birthday parties are a special occasion for family and friends to gather together and celebrate. We can help you make the party even better with our delicious birthday party catering service.

\n
\n\n\n\n
\n

Weddings

\n\n\n\n

Let us make your special day even more memorable with an exquisite menu uniquely tailored to your vision and budget. We would be delighted to work with you and be a part of your celebration.

\n
\n
\n\n\n\n
\n
\n\n\n\n
\n\n\n\n
\n\n\n\n

Thank you so much for helping make our day so wonderful! Everyone enjoyed the beautifully presented food and the professional service. Thank you again!

\n\n\n\n

Marisa Daniels

\n\n\n\n
\n\n\n\n
\n\n\n\n
\n
\n

Latest from the blog

\n
\n\n\n\n
\n
\n\n\n\n
\n", + "categories": [ + { + "slug": "home", + "title": "Home", + "description": "Home pages", + "emoji": "🏠", + "order": 9 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3490&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3490%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3490%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3490%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "easley-2", + "title": "Easley", + "content": "\n
\n
\n
\n
\n\n\n\n

Jane Doe

\n\n\n\n

Illustrator, Cartoonist

\n\n\n\n

Hi I'm Jane, and if you haven't noticed already, I really really like to draw! I've been working in the visual arts for more than eight years. My portfolio includes print and digital media, clothing and kids' books. Thanks for visiting!

\n
\n\n\n\n
\n
\"\"
\n
\n\n\n\n
\n
\"\"
\n
\n
\n\n\n\n
\n
\n
\"\"
\n
\n\n\n\n
\n
\"\"
\n
\n\n\n\n
\n
\"\"
\n
\n
\n
\n", + "categories": [ + { + "slug": "home", + "title": "Home", + "description": "Home pages", + "emoji": "🏠", + "order": 9 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3486&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3486%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3486%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3486%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "leven-2", + "title": "Leven", + "content": "\n
\n

A Curated Collection of Vintage Cameras.

\n\n\n\n

We stock the largest and most unique range of classic and vintage cameras and accessories anywhere. Looking for film processing and darkroom equipment? We've got you covered!

\n\n\n\n\n\n\n\n
\n
\n\n\n\n
\n

As Good as New

\n
\n\n\n\n
\n
\n

GX-303

\n\n\n\n
\n\n\n\n

Galaxy Deep Field Lens

\n\n\n\n

COMING SOON

\n\n\n\n
\n\n\n\n

Professional and amateur astrophotographers alike will love our new collection of deep field lenses. With quality housing, shake-eliminating focus barrels and world-class optics, you'll be able to capture the Milky Way and our Solar System in all their magnificence. The extra wide angle and aperture provide outstanding quality and low noise. These pieces come with cleaning cloths and felt cases and a 12-month warranty.

\n\n\n\n\n\n\n\n
\n
\n\n\n\n
\n
\"\"
\n\n\n\n
\"\"
\n

If you're new to photography, you may have heard the term 'depth of field', but might be still unsure of how it affects your shot set up. Even older, vintage cameras have features that allow you to increase or decrease depth of field.

\n
\n\n\n\n
\n
\n
\n\n\n\n
\n

Professional high quality cameras, tools, and accessories for today’s avid photographers.

\n
\n\n\n\n
\n\n\n\n

What Our Customers are Saying

\n\n\n\n
\n\n\n\n

I don't leave the house without my stylish camera. Thank you for your advice and assistance.

Beverly Mattingdale
\n\n\n\n
\n\n\n\n

\n", + "categories": [ + { + "slug": "home", + "title": "Home", + "description": "Home pages", + "emoji": "🏠", + "order": 9 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3477&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3477%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3477%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3477%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "brice-2", + "title": "Brice", + "content": "\n
\n
\n\n\n\n

Support your local community

\n\n\n\n

We need your help to continue to provide essential community services to people in crisis.

\n\n\n\n\n\n\n\n
\n
\n\n\n\n
\n\n\n\n

We are a local organisation that provides support and expertise within the local community, to potential volunteers, existing volunteers, and organisations that involve volunteers.

\n\n\n\n
\n\n\n\n
\n
\n\n\n\n
\n
\n

1,652

\n\n\n\n

Volunteers available

\n
\n\n\n\n
\n

1,132

\n\n\n\n

Volunteer opportunities

\n
\n\n\n\n
\n

1,972

\n\n\n\n

Matches last year

\n
\n
\n\n\n\n
\n
\n\n\n\n
\n
\n\n\n\n

Are you a business?

\n\n\n\n

We are uniting our resources around this challenge, and we are combining our resources and asks to make it easy for people to support their communities.

\n\n\n\n\n\n\n\n
\n\n\n\n

Want to volunteer?

\n\n\n\n

We’ve had an incredible response so far, and are doing everything we can to respond to everyone who wants to volunteer in one of our community programmes.

\n\n\n\n\n\n\n\n
\n
\n\n\n\n
\n
\n\n\n\n

Hear more from our community.

\n\n\n\n
\n\n\n\n\n\n
\n
\n\n\n\n
\n
\n\n\n\n

\"So many things are possible just as long as you don't know they're impossible.\"

\n\n\n\n

Norton Juster

\n\n\n\n
\n
\n", + "categories": [ + { + "slug": "home", + "title": "Home", + "description": "Home pages", + "emoji": "🏠", + "order": 9 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3470&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3470%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3470%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3470%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "bowen-2", + "title": "Bowen", + "content": "\n
\"\"
\n
\n\n\n\n

Hey there!

\n\n\n\n

Hi, I’m Lillie, a mom of two, passionate about photography, home decor, and travel. Thanks for visiting!

\n\n\n\n
First time to the site? Start here
\n\n\n\n
\n
\n\n\n\n
\n\n\n\n

From the blog

\n\n\n\n\n\n
\n\n\n\n
\n

Posting new tips every week

\n\n\n\n\n
\n\n\n\n
\"\"
\n
\n\n\n\n

About Me

\n\n\n\n

Hi, I’m Lillie. Previously a magazine editor, I became a full-time mother and freelance writer in 2017. When I’m not spending time with my wonderful kids and husband, I love writing about my fascination with food, adventure, and living a healthy and organized life!

\n\n\n\n
\n
\n", + "categories": [ + { + "slug": "home", + "title": "Home", + "description": "Home pages", + "emoji": "🏠", + "order": 9 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3467&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3467%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3467%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3467%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "cassel-2", + "title": "Cassel", + "content": "\n
\n\n\n\n
\n
\"\"
\n\n\n\n

About us

\n\n\n\n

We're a food blog focused on simple and seasonal recipes.

\n\n\n\n\n
\n\n\n\n
\n\n\n\n\n\n
\n\n\n\n
\"\"
\n
\n\n\n\n

New recipes posted weekly

\n\n\n\n\n\n\n\n
\n
\n", + "categories": [ + { + "slug": "home", + "title": "Home", + "description": "Home pages", + "emoji": "🏠", + "order": 9 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3440&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3440%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3440%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3440%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "barnsbury-2", + "title": "Barnsbury", + "content": "\n
\"\"
\n

Locally Farmed Organic Vegetable Delivery

\n\n\n\n

20 years of growing organic vegetables and delivering vegetable boxes from our 12-acre farm in Sussex.

\n\n\n\n\n
\n\n\n\n
\n
\n\n\n\n

Services

\n\n\n\n

What We Do

\n\n\n\n
\n\n\n\n
\n
\n
\"\"
\n\n\n\n

We produce organic vegetable boxes that are affordable, seasonal, and as fresh and local as possible.

\n
\n\n\n\n
\n
\"\"
\n\n\n\n

We have different sizes of boxes available for various appetites, from individuals to families.

\n
\n\n\n\n
\n
\"\"
\n\n\n\n

We are flexible with the items in your boxes. You can change items in your order for something you would like.

\n
\n
\n\n\n\n
\n
\n\n\n\n
\"\"
\n
\n\n\n\n

Meet us better

\n\n\n\n

Our Organic Farm in Numbers

\n\n\n\n
\n\n\n\n

470 households per month

\n\n\n\n

23 experts working

\n\n\n\n

5 awards won

\n\n\n\n

100% satisfied customers

\n\n\n\n
\n
\n\n\n\n
\n\n\n\n

Try with our vegetables

\n\n\n\n

Our favourite recipes

\n\n\n\n
\n\n\n\n\n\n\n\n\n\n
\n\n\n\n
\n
\n\n\n\n

We are very happy with the quality of the box and we value the service.

Joseph
\n\n\n\n
\n
\n", + "categories": [ + { + "slug": "home", + "title": "Home", + "description": "Home pages", + "emoji": "🏠", + "order": 9 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3432&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3432%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3432%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3432%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "alves-2", + "title": "Alves", + "content": "\n
\"\"
\n
\n\n\n\n

Raise Your Helping Hand

\n\n\n\n

We are a non-profit organization, we are looking forward to a peaceful world by helping each other to join hands together to bring a better future for all children.

\n\n\n\n\n\n\n\n
\n
\n\n\n\n
\"\"
\n
\n\n\n\n
\n
\n

About Us

\n\n\n\n

Our Beliefs

\n
\n\n\n\n
\n

We believe in a world where every child can read. Our mission is to invest in early childhood education in order to empower the next generation. We do that, by creating educational programs and providing necessary resources in underprivileged areas. We believe in smart fund allocation, and therefore we employ minimal staff.

\n
\n
\n\n\n\n
\n
\n\n\n\n
\"\"
\n
\n\n\n\n

How You Can Help

\n\n\n\n
\n\n\n\n
\n
\n

Send Donation

\n\n\n\n

Giving online has never been more secure, convenient or hassle-free with our one-click donation. We also do accept standard cash and check donations at all of our locations.

\n
\n\n\n\n
\n

Become a Volunteer

\n\n\n\n

You can get involved today by becoming a Volunteer. Sign up and you will be joining a group of change-makers, a network strong enough to impact positive change in the lives of children.

\n
\n\n\n\n
\n

Give Scholarship

\n\n\n\n

Your gift will help equip children in need with necessary resources, training and education while offering the promise of a brighter future. You can make a difference today by signing up.

\n
\n
\n\n\n\n
\n
\n\n\n\n
\"\"
\n
\n\n\n\n

Testimonials

\n\n\n\n

What People Say

\n\n\n\n
\n\n\n\n
\n
\n

The generosity of this organization makes it possible for me to continue having education opportunities in this difficult area.

Jane Doe
\n
\n\n\n\n
\n

Wonderful job with those kids that need us and people from various places all over the world. I will definitely join your group as a volunteer.

John Doe
\n
\n
\n\n\n\n
\n
\n\n\n\n
\"\"
\n
\n\n\n\n

News

\n\n\n\n

Recent Causes

\n\n\n\n
\n\n\n\n\n\n
\n
\n\n\n\n
\"\"
\n
\n\n\n\n

Become a Volunteer

\n\n\n\n

With the aim of helping as many people as possible, we always lack enthusiastic volunteers. Please contact us for more info.

\n\n\n\n\n\n\n\n
\n
\n", + "categories": [ + { + "slug": "home", + "title": "Home", + "description": "Home pages", + "emoji": "🏠", + "order": 9 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3424&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3424%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3424%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3424%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "team-3", + "title": "Team", + "content": "\n

We are a small team of talented professionals with a wide range of skills and experience. We love what we do, and we do it with passion. We look forward to working with you.

\n\n\n\n
\n\n\n\n
\n
\n
\"\"
\n\n\n\n

Juan Pérez

\n\n\n\n

Position or Job Title

\n\n\n\n
\n
\n\n\n\n
\n
\"\"
\n\n\n\n

Sally Smith

\n\n\n\n

Position or Job Title

\n\n\n\n
\n
\n\n\n\n
\n
\"\"
\n\n\n\n

Lara Thayer

\n\n\n\n

Position or Job Title

\n\n\n\n
\n\n\n\n

\n
\n
\n\n\n\n
\n\n\n\n
\n\n\n\n
\n\n\n\n\n\n\n\n
\n\n\n\n
\n", + "categories": [ + { + "slug": "team", + "title": "Team", + "description": "Team pages", + "emoji": "👥", + "order": 7 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3413&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3413%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3413%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3413%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "blog-7", + "title": "Blog", + "content": "\n
\n
\n\n\n\n
\n
\"\"
\n
\n\n\n\n
\n
\n\n\n\n

Eat Dessert First is for my love of food and sharing my favorites with you.

\n\n\n\n
\n\n\n\n

Hi, I’m Lillie. Previously a magazine editor, I became a full-time mother and freelance writer in 2017. I spend most of my time with my kids and husband over at The Brown Bear Family.

\n\n\n\n
\n\n\n", + "categories": [ + { + "slug": "blog", + "title": "Blog", + "description": "Blog pages", + "emoji": "📰", + "order": 0 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3395&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3395%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3395%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3395%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "services-6", + "title": "Services", + "content": "\n
\n
\n

Services

\n\n\n\n
\n
\n\n\n\n
\n

Service A

\n\n\n\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin id arcu aliquet, elementum nisi quis, condimentum nibh. Donec hendrerit dui ut nisi tempor scelerisque. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin id arcu aliquet, elementum nisi quis, condimentum nibh. Donec hendrerit dui ut nisi tempor scelerisque.

\n\n\n\n
\n\n\n\n

Service B

\n\n\n\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin id arcu aliquet, elementum nisi quis, condimentum nibh. Donec hendrerit dui ut nisi tempor scelerisque. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin id arcu aliquet, elementum nisi quis, condimentum nibh. Donec hendrerit dui ut nisi tempor scelerisque.

\n
\n
\n\n\n\n
\n
\n

Testimonials

\n\n\n\n
\n
\n\n\n\n
\n

Add a testimonial from someone who loves your service. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin id arcu aliquet, elementum nisi quis, condimentum nibh. Donec hendrerit dui ut nisi tempor scelerisque.

Jane Doe
\n\n\n\n
\n\n\n\n

Add a testimonial from someone who loves your service. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin id arcu aliquet, elementum nisi quis, condimentum nibh. Donec hendrerit dui ut nisi tempor scelerisque.

John Doe
\n
\n
\n\n\n\n
\n", + "categories": [ + { + "slug": "services", + "title": "Services", + "description": "Service pages", + "emoji": "🔧", + "order": 8 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3392&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3392%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3392%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3392%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "portfolio-10", + "title": "Portfolio", + "content": "\n

Use this space to introduce yourself.
Who you are, what you do, and where you are.

\n\n\n\n

Add more information about yourself. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin id arcu aliquet, elementum nisi quis, condimentum nibh.

\n\n\n\n
\n\n\n\n
\n\n\n\n
\n\n\n\n
\"\"
\n
Project Name
\n\n\n\n

A short Description of your project

\n
\n\n\n\n
\n\n\n\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vitae massa eu nisi vulputate congue ut a tellus. Proin accumsan purus et dui venenatis, malesuada fermentum sem efficitur. Sed dignissim tristique congue. Vestibulum neque augue, varius id finibus vel, cursus eget arcu. Aliquam at nulla diam. Integer faucibus, libero at lacinia sollicitudin, elit nisi iaculis velit, non malesuada ante est vel ex. Phasellus id feugiat leo. Donec quis tortor dolor.

\n\n\n\n
\n\n\n\n\n\n\n\n
\n\n\n\n
\n\n\n\n
\n\n\n\n
\"\"
\n
Project Name
\n\n\n\n

A short Description of your project

\n
\n\n\n\n
\n\n\n\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vitae massa eu nisi vulputate congue ut a tellus. Proin accumsan purus et dui venenatis, malesuada fermentum sem efficitur. Sed dignissim tristique congue. Vestibulum neque augue, varius id finibus vel, cursus eget arcu. Aliquam at nulla diam. Integer faucibus, libero at lacinia sollicitudin, elit nisi iaculis velit, non malesuada ante est vel ex. Phasellus id feugiat leo. Donec quis tortor dolor.

\n\n\n\n
\n\n\n\n\n\n\n\n
\n\n\n\n
\n", + "categories": [ + { + "slug": "portfolio", + "title": "Portfolio", + "description": "Portfolio pages", + "emoji": "🎨", + "order": 5 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3383&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3383%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3383%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3383%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "portfolio-9", + "title": "Portfolio", + "content": "\n

Use this space to introduce yourself.
Who you are, what you do, and where you are.

\n\n\n\n
\n\n\n\n

Add more information about yourself. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin id arcu aliquet, elementum nisi quis, condimentum nibh.

\n\n\n\n
\n\n\n\n\n", + "categories": [ + { + "slug": "portfolio", + "title": "Portfolio", + "description": "Portfolio pages", + "emoji": "🎨", + "order": 5 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3380&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3380%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3380%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3380%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "contact-12", + "title": "Contact", + "content": "\n
\n
\n

Get in touch

\n\n\n\n
\n
\n\n\n\n
\n

Tell your visitors how to contact you. You could also get a bit more specific, by letting them know what to contact you about.

\n\n\n\n

Be sure to mention all the channels where visitors can reach you, including social media. If you’d rather not provide your email, you can add a contact form instead.

\n\n\n\n

Email me at contact@example.com

\n
\n
\n\n\n\n
\n
\n

Connect

\n\n\n\n
\n
\n\n\n\n
\n
    \n\n\n\n\n\n\n\n\n\n
\n
\n
\n\n\n\n
\n", + "categories": [ + { + "slug": "contact", + "title": "Contact", + "description": "Contact pages", + "emoji": "📫", + "order": 6 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3372&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3372%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3372%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3372%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "about-7", + "title": "About", + "content": "\n
\"\"
\n\n\n\n
\n\n\n\n
\n
\n

About me

\n\n\n\n
\n
\n\n\n\n
\n

Add more information about yourself. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin id arcu aliquet, elementum nisi quis, condimentum nibh. Donec hendrerit dui ut nisi tempor scelerisque.

\n
\n
\n\n\n\n
\n
\n

Expertise

\n\n\n\n
\n
\n\n\n\n
\n

What You Do

\n\n\n\n

Add more information about what you do. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin id arcu aliquet, elementum nisi quis, condimentum nibh.

\n\n\n\n
\n\n\n\n

What You Do

\n\n\n\n

Add more information about what you do. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin id arcu aliquet, elementum nisi quis, condimentum nibh.

\n
\n
\n", + "categories": [ + { + "slug": "about", + "title": "About", + "description": "About pages", + "emoji": "👋", + "order": 1 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3342&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3342%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3342%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3342%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "team-2", + "title": "Team", + "content": "\n

We are a small team of talented professionals with a wide range of skills and experience. We love what we do, and we do it with passion. We look forward to working with you.

\n\n\n\n
\n\n\n\n
\"\"
\n

Sally Smith

\n\n\n\n

Position or Job Title

\n\n\n\n

A short bio with personal history, key achievements, or an interesting fact.

\n\n\n\n

Email me: mail@example.com

\n
\n\n\n\n
\"\"
\n

Juan Pérez

\n\n\n\n

Position or Job Title

\n\n\n\n

A short bio with personal history, key achievements, or an interesting fact.

\n\n\n\n

Email me: mail@example.com

\n
\n\n\n\n
\"\"
\n

Samuel the Dog

\n\n\n\n

Position or Job Title

\n\n\n\n

A short bio with personal history, key achievements, or an interesting fact.

\n\n\n\n

Email me: mail@example.com

\n
\n\n\n\n
\n\n\n\n
\n\n\n\n
\n\n\n\n

Want to work with us?

\n\n\n\n\n\n\n\n
\n\n\n\n
\n", + "categories": [ + { + "slug": "team", + "title": "Team", + "description": "Team pages", + "emoji": "👥", + "order": 7 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3360&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3360%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3360%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3360%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "about-6", + "title": "About", + "content": "\n

Visitors will want to know who is on the other side of the page. Use this space to write about yourself, your site, your business, or anything you want. Use the testimonials below to quote others, talking about the same thing – in their own words.

\n\n\n\n

This is sample content, included with the template to illustrate its features. Remove or replace it with your own words and media.

\n\n\n\n

What People Say

\n\n\n\n
\n
\n

The way to get started is to quit talking and begin doing.

Walt Disney
\n
\n\n\n\n
\n

It is our choices, Harry, that show what we truly are, far more than our abilities.

J.K. Rowling
\n
\n\n\n\n
\n

Don’t cry because it’s over, smile because it happened.

Dr. Seuss
\n
\n
\n\n\n\n
\n\n\n\n
\n\n\n\n
\n\n\n\n

Let’s build something together

\n\n\n\n\n\n\n\n
\n\n\n\n
\n", + "categories": [ + { + "slug": "about", + "title": "About", + "description": "About pages", + "emoji": "👋", + "order": 1 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3353&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3353%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3353%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3353%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "mayland", + "title": "Mayland", + "content": "\n
\n
\n
\n
\"\"
\n\n\n\n
\"\"
\n\n\n\n
\"\"
\n
\n\n\n\n
\n
\"\"
\n\n\n\n
\"\"
\n\n\n\n
\"\"
\n
\n\n\n\n
\n
\"\"
\n\n\n\n
\"\"
\n\n\n\n
\"\"
\n
\n
\n
\n", + "categories": [ + { + "slug": "gallery", + "title": "Gallery", + "description": "Gallery pages", + "emoji": "🖼", + "order": 13 + }, + { + "slug": "home", + "title": "Home", + "description": "Home pages", + "emoji": "🏠", + "order": 9 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=3099&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3099%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3099%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D3099%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "contact-10", + "title": "Contact", + "content": "\n
\n
\n
\n
\"\"
\n
\n\n\n\n
\n

Let's get in touch

\n\n\n\n

Tell your visitors how to contact you. You could also get a bit more specific, by letting them know what to contact you about.

\n\n\n\n

Be sure to mention all the channels where visitors can reach you, including social media. If you’d rather not provide your email, you can add a contact form instead.

\n\n\n\n

Email me at contact@example.com or follow me on:

\n\n\n\n\n
\n
\n
\n", + "categories": [ + { + "slug": "contact", + "title": "Contact", + "description": "Contact pages", + "emoji": "📫", + "order": 6 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=1406&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D1406%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D1406%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D1406%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "contact-9", + "title": "Contact", + "content": "\n
\n
\"\"
\n\n\n\n
\n
\n

Tell your visitors how to get in touch with you. You could also get a bit more specific, by letting them know what to contact you about.

\n\n\n\n

Be sure to mention all the channels where visitors can reach you, including social media. If you'd rather not provide your email, you can add a contact form instead.

\n
\n\n\n\n
\n

Drop me a line
contact@example.com

\n\n\n\n

Let's hang out

\n\n\n\n\n
\n
\n
\n", + "categories": [ + { + "slug": "contact", + "title": "Contact", + "description": "Contact pages", + "emoji": "📫", + "order": 6 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=1403&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D1403%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D1403%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D1403%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "portfolio-5", + "title": "Portfolio", + "content": "\n\n", + "categories": [ + { + "slug": "gallery", + "title": "Gallery", + "description": "Gallery pages", + "emoji": "🖼", + "order": 13 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=1361&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D1361%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D1361%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D1361%26language%3Den?vpw=400&vph=600&w=400&h=600" + }, + { + "slug": "about-3", + "title": "About", + "content": "\n
\n\n\n\n
\"\"
\n
\n\n\n\n

Add Your Name

\n\n\n\n

Add your job title

\n\n\n\n\n\n\n\n

Add more information about yourself. Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sit amet eros eget justo elementum interdum. Cras vestibulum nulla id aliquam rutrum. Vestibulum aliquet mauris ut augue ultrices facilisis. Vestibulum pretium ligula sed ipsum dapibus, tempus iaculis felis ornare. Morbi pretium sed est tincidunt hendrerit. Curabitur id elit scelerisque, pharetra tellus sit amet, dictum mi. Aliquam consectetur tristique metus non pulvinar. Donec luctus magna quis justo tincidunt, eu euismod lacus faucibus.

\n\n\n\n
Add What You Do
\n\n\n\n
  • What you do
  • What you do
\n\n\n\n
    \n\n\n\n\n\n\n\n\n\n
\n\n\n\n
\n
\n", + "categories": [ + { + "slug": "about", + "title": "About", + "description": "About pages", + "emoji": "👋", + "order": 1 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com?use_patterns=true&post_id=1340&language=en", + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D1340%26language%3Den?vpw=1200&vph=1800&w=400&h=600", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D1340%26language%3Den?vpw=800&vph=1200&w=400&h=600", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/Hever/dotcompatterns.wordpress.com%3Fuse_patterns%3Dtrue%26post_id%3D1340%26language%3Den?vpw=400&vph=600&w=400&h=600" + } + ], + "categories": [ + { + "slug": "blog", + "title": "Blog", + "description": "Blog pages", + "emoji": "📰", + "order": 0 + }, + { + "slug": "about", + "title": "About", + "description": "About pages", + "emoji": "👋", + "order": 1 + }, + { + "slug": "links", + "title": "Links", + "description": "Links pages", + "emoji": "🔗", + "order": 2 + }, + { + "slug": "splash", + "title": "Splash", + "description": "Splash pages", + "emoji": "🏖", + "order": 3 + }, + { + "slug": "highlights", + "title": "Highlights", + "description": "Highlights pages", + "emoji": "💛", + "order": 4 + }, + { + "slug": "portfolio", + "title": "Portfolio", + "description": "Portfolio pages", + "emoji": "🎨", + "order": 5 + }, + { + "slug": "contact", + "title": "Contact", + "description": "Contact pages", + "emoji": "📫", + "order": 6 + }, + { + "slug": "team", + "title": "Team", + "description": "Team pages", + "emoji": "👥", + "order": 7 + }, + { + "slug": "services", + "title": "Services", + "description": "Service pages", + "emoji": "🔧", + "order": 8 + }, + { + "slug": "home", + "title": "Home", + "description": "Home pages", + "emoji": "🏠", + "order": 9 + }, + { + "slug": "gallery", + "title": "Gallery", + "description": "Gallery pages", + "emoji": "🖼", + "order": 13 + } + ] + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/Shared/wpcom_sites_blogging_prompts.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/Shared/wpcom_sites_blogging_prompts.json new file mode 100644 index 000000000000..3fbe0123d741 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/Shared/wpcom_sites_blogging_prompts.json @@ -0,0 +1,255 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/wpcom/v3/sites/([0-9]+)/blogging-prompts", + "queryParameters": { + "per_page": { + "matches": "(.*)" + }, + "after": { + "matches": "(.*)" + }, + "force_year": { + "matches": "(.*)" + }, + "_locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": [ + { + "id": 2003, + "text": "What foods would you like to make?", + "attribution": "dayone", + "date": "2022-07-20", + "answered": false, + "answered_users_count": 3, + "answered_users_sample": [ + { + "avatar": "https://2.gravatar.com/avatar/5dffa9e5d426449127114fe04f4820ba?s=96&d=identicon&r=G" + }, + { + "avatar": "https://0.gravatar.com/avatar/9cd92ae622fc905b4908503cf9fbd489?s=96&d=identicon&r=G" + }, + { + "avatar": "https://2.gravatar.com/avatar/e2526cb456f69198425ebeaff0a9225f?s=96&d=identicon&r=G" + } + ], + "answered_link": "https://wordpress.com/tag/dailyprompt-2003", + "answered_link_text": "View all responses" + }, + { + "id": 2004, + "text": "What's your favorite game (card, board, video, etc.)? Why?", + "attribution": "", + "date": "2022-07-21", + "answered": false, + "answered_users_count": 0, + "answered_users_sample": [], + "answered_link": "https://wordpress.com/tag/dailyprompt-2004", + "answered_link_text": "View all responses" + }, + { + "id": 2005, + "text": "What’s your go-to comfort food?", + "attribution": "dayone", + "date": "2022-07-22", + "answered": false, + "answered_users_count": 0, + "answered_users_sample": [], + "answered_link": "https://wordpress.com/tag/dailyprompt-2005", + "answered_link_text": "View all responses" + }, + { + "id": 2006, + "text": "What do you listen to while you work?", + "attribution": "dayone", + "date": "2022-07-23", + "answered": false, + "answered_users_count": 0, + "answered_users_sample": [], + "answered_link": "https://wordpress.com/tag/dailyprompt-2006", + "answered_link_text": "View all responses" + }, + { + "id": 2007, + "text": "What would you change about modern society?", + "attribution": "dayone", + "date": "2022-07-24", + "answered": false, + "answered_users_count": 0, + "answered_users_sample": [], + "answered_link": "https://wordpress.com/tag/dailyprompt-2007", + "answered_link_text": "View all responses" + }, + { + "id": 2008, + "text": "What are your future travel plans?", + "attribution": "dayone", + "date": "2022-07-25", + "answered": false, + "answered_users_count": 0, + "answered_users_sample": [], + "answered_link": "https://wordpress.com/tag/dailyprompt-2008", + "answered_link_text": "View all responses" + }, + { + "id": 2009, + "text": "What's the sickest you've ever been?", + "attribution": "dayone", + "date": "2022-07-26", + "answered": false, + "answered_users_count": 0, + "answered_users_sample": [], + "answered_link": "https://wordpress.com/tag/dailyprompt-2009", + "answered_link_text": "View all responses" + }, + { + "id": 2010, + "text": "What's the story behind your nickname?", + "attribution": "dayone", + "date": "2022-07-27", + "answered": false, + "answered_users_count": 0, + "answered_users_sample": [], + "answered_link": "https://wordpress.com/tag/dailyprompt-2010", + "answered_link_text": "View all responses" + }, + { + "id": 2011, + "text": "If you won two free plane tickets, where would you go?", + "attribution": "", + "date": "2022-07-28", + "answered": false, + "answered_users_count": 0, + "answered_users_sample": [], + "answered_link": "https://wordpress.com/tag/dailyprompt-2011", + "answered_link_text": "View all responses" + }, + { + "id": 2012, + "text": "If you could bring back one dinosaur, which one would it be?", + "attribution": "dayone", + "date": "2022-07-29", + "answered": false, + "answered_users_count": 0, + "answered_users_sample": [], + "answered_link": "https://wordpress.com/tag/dailyprompt-2012", + "answered_link_text": "View all responses" + }, + { + "id": 2013, + "text": "How would you describe yourself to someone?", + "attribution": "dayone", + "date": "2022-07-30", + "answered": false, + "answered_users_count": 0, + "answered_users_sample": [], + "answered_link": "https://wordpress.com/tag/dailyprompt-2013", + "answered_link_text": "View all responses" + }, + { + "id": 2014, + "text": "Was today typical?", + "attribution": "dayone", + "date": "2022-07-31", + "answered": false, + "answered_users_count": 0, + "answered_users_sample": [], + "answered_link": "https://wordpress.com/tag/dailyprompt-2014", + "answered_link_text": "View all responses" + }, + { + "id": 2015, + "text": "What traditions have you not kept that your parents had?", + "attribution": "dayone", + "date": "2022-08-01", + "answered": false, + "answered_users_count": 0, + "answered_users_sample": [], + "answered_link": "https://wordpress.com/tag/dailyprompt-2015", + "answered_link_text": "View all responses" + }, + { + "id": 2016, + "text": "How would you describe yourself to someone who can't see you?", + "attribution": "dayone", + "date": "2022-08-02", + "answered": false, + "answered_users_count": 0, + "answered_users_sample": [], + "answered_link": "https://wordpress.com/tag/dailyprompt-2016", + "answered_link_text": "View all responses" + }, + { + "id": 2017, + "text": "Write about a random act of kindness you've done for someone.", + "attribution": "dayone", + "date": "2022-08-03", + "answered": false, + "answered_users_count": 0, + "answered_users_sample": [], + "answered_link": "https://wordpress.com/tag/dailyprompt-2017", + "answered_link_text": "View all responses" + }, + { + "id": 2018, + "text": "What are you curious about?", + "attribution": "dayone", + "date": "2022-08-04", + "answered": false, + "answered_users_count": 0, + "answered_users_sample": [], + "answered_link": "https://wordpress.com/tag/dailyprompt-2018", + "answered_link_text": "View all responses" + }, + { + "id": 2019, + "text": "Do you have any habits you're currently trying to break?", + "attribution": "dayone", + "date": "2022-08-05", + "answered": false, + "answered_users_count": 0, + "answered_users_sample": [], + "answered_link": "https://wordpress.com/tag/dailyprompt-2019", + "answered_link_text": "View all responses" + }, + { + "id": 2020, + "text": "List 30 things that make you happy.", + "attribution": "dayone", + "date": "2022-08-06", + "answered": false, + "answered_users_count": 0, + "answered_users_sample": [], + "answered_link": "https://wordpress.com/tag/dailyprompt-2020", + "answered_link_text": "View all responses" + }, + { + "id": 2021, + "text": "Scour the news for an entirely uninteresting story. Consider how it connects to your life. Write about that.", + "attribution": "", + "date": "2022-08-07", + "answered": false, + "answered_users_count": 0, + "answered_users_sample": [], + "answered_link": "https://wordpress.com/tag/dailyprompt-2021", + "answered_link_text": "View all responses" + }, + { + "id": 2022, + "text": "What's the most money you've ever spent on a meal? Was it worth it?", + "attribution": "", + "date": "{{now format='yyyy-MM-dd'}}", + "answered": false, + "answered_users_count": 0, + "answered_users_sample": [], + "answered_link": "https://wordpress.com/tag/dailyprompt-2022", + "answered_link_text": "View all responses" + } + ] + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/Shared/wpcom_sites_common_starter_site_designs.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/Shared/wpcom_sites_common_starter_site_designs.json new file mode 100644 index 000000000000..5594730f41be --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/sites/Shared/wpcom_sites_common_starter_site_designs.json @@ -0,0 +1,647 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/wpcom/v2/common-starter-site-designs", + "queryParameters": { + "preview_width": { + "matches": "(.*)" + }, + "scale": { + "matches": "(.*)" + }, + "preview_height": { + "matches": "(.*)" + }, + "type": { + "matches": "(.*)" + }, + "_locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "designs": [ + { + "slug": "about", + "title": "Sparhead About", + "segment_id": 4, + "categories": [ + { + "slug": "about", + "title": "About", + "description": "About", + "emoji": "👋", + "order": 0 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/spearhead/mobileaboutlayout.wordpress.com/?language=en", + "theme": "spearhead", + "group": [ + "single-page", + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/spearhead/mobileaboutlayout.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/spearhead/mobileaboutlayout.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/spearhead/mobileaboutlayout.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "about2", + "title": "Seedlet About", + "segment_id": 4, + "categories": [ + { + "slug": "about", + "title": "About", + "description": "About", + "emoji": "👋", + "order": 0 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/seedlet/mobileaboutlayout2.wordpress.com/?language=en", + "theme": "seedlet", + "group": [ + "single-page", + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/seedlet/mobileaboutlayout2.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/seedlet/mobileaboutlayout2.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/seedlet/mobileaboutlayout2.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "blog-new", + "title": "Sparhead Blog", + "segment_id": 2, + "categories": [ + { + "slug": "blog", + "title": "Blog", + "description": "Blog", + "emoji": "📰", + "order": 2 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/spearhead/mobilebloglayout.wordpress.com/?language=en", + "theme": "spearhead", + "group": [ + "single-page", + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/spearhead/mobilebloglayout.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/spearhead/mobilebloglayout.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/spearhead/mobilebloglayout.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "blog2", + "title": "Seedlet Blog", + "segment_id": 2, + "categories": [ + { + "slug": "blog", + "title": "Blog", + "description": "Blog", + "emoji": "📰", + "order": 2 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/seedlet/mobilebloglayout2.wordpress.com/?language=en", + "theme": "seedlet", + "group": [ + "single-page", + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/seedlet/mobilebloglayout2.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/seedlet/mobilebloglayout2.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/seedlet/mobilebloglayout2.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "links", + "title": "Seedlet Links", + "segment_id": 1, + "categories": [ + { + "slug": "links", + "title": "Links", + "description": "Links", + "emoji": "🔗", + "order": 1 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/seedlet/mobilelinkslayout.wordpress.com/?language=en", + "theme": "seedlet", + "group": [ + "single-page", + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/seedlet/mobilelinkslayout.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/seedlet/mobilelinkslayout.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/seedlet/mobilelinkslayout.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "links2", + "title": "Spearhead Links", + "segment_id": 1, + "categories": [ + { + "slug": "links", + "title": "Links", + "description": "Links", + "emoji": "🔗", + "order": 1 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/spearhead/mobilelinkslayout2.wordpress.com/?language=en", + "theme": "spearhead", + "group": [ + "single-page", + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/spearhead/mobilelinkslayout2.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/spearhead/mobilelinkslayout2.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/spearhead/mobilelinkslayout2.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "favorites", + "title": "Seedlet Highlights", + "segment_id": 4, + "categories": [ + { + "slug": "highlights", + "title": "Highlights", + "description": "Highlights", + "emoji": "💛", + "order": 4 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/seedlet/mobilefavoriteslayout.wordpress.com/?language=en", + "theme": "seedlet", + "group": [ + "single-page", + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/seedlet/mobilefavoriteslayout.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/seedlet/mobilefavoriteslayout.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/seedlet/mobilefavoriteslayout.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "favorites2", + "title": "Spearhead Highlights", + "segment_id": 4, + "categories": [ + { + "slug": "highlights", + "title": "Highlights", + "description": "Highlights", + "emoji": "💛", + "order": 4 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/spearhead/mobilefavoriteslayout2.wordpress.com/?language=en", + "theme": "spearhead", + "group": [ + "single-page", + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/spearhead/mobilefavoriteslayout2.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/spearhead/mobilefavoriteslayout2.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/spearhead/mobilefavoriteslayout2.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "launch", + "title": "Seedlet Splash", + "segment_id": 1, + "categories": [ + { + "slug": "splash", + "title": "Splash", + "description": "Splash", + "emoji": "🏖️", + "order": 3 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/seedlet/mobilelaunchlayout.wordpress.com/?language=en", + "theme": "seedlet", + "group": [ + "single-page", + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/seedlet/mobilelaunchlayout.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/seedlet/mobilelaunchlayout.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/seedlet/mobilelaunchlayout.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "launch2", + "title": "Spearhead Splash", + "segment_id": 1, + "categories": [ + { + "slug": "splash", + "title": "Splash", + "description": "Splash", + "emoji": "🏖️", + "order": 3 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/spearhead/mobilelaunchlayout2.wordpress.com/?language=en", + "theme": "spearhead", + "group": [ + "single-page", + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/spearhead/mobilelaunchlayout2.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/spearhead/mobilelaunchlayout2.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/spearhead/mobilelaunchlayout2.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "bowen", + "title": "Bowen", + "segment_id": 2, + "categories": [ + { + "slug": "blog", + "title": "Blog", + "description": "Blog", + "emoji": "📰", + "order": 2 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/coutoire/bowenstartermobile.wordpress.com/?language=en", + "theme": "coutoire", + "group": [ + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/coutoire/bowenstartermobile.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/coutoire/bowenstartermobile.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/coutoire/bowenstartermobile.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "alves", + "title": "Alves", + "segment_id": 1, + "categories": [ + { + "slug": "business", + "title": "Business", + "description": "Business", + "emoji": "🤵", + "order": 6 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/alves/alvesstartermobile.wordpress.com/?language=en", + "theme": "alves", + "group": [ + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/alves/alvesstartermobile.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/alves/alvesstartermobile.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/alves/alvesstartermobile.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "barnsbury", + "title": "Barnsbury", + "segment_id": 1, + "categories": [ + { + "slug": "business", + "title": "Business", + "description": "Business", + "emoji": "🤵", + "order": 6 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/barnsbury/barnsburystartermobile.wordpress.com/?language=en", + "theme": "barnsbury", + "group": [ + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/barnsbury/barnsburystartermobile.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/barnsbury/barnsburystartermobile.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/barnsbury/barnsburystartermobile.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "brice", + "title": "Brice", + "segment_id": 1, + "categories": [ + { + "slug": "business", + "title": "Business", + "description": "Business", + "emoji": "🤵", + "order": 6 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/mayland/bricestartermobile.wordpress.com/?language=en", + "theme": "mayland", + "group": [ + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/mayland/bricestartermobile.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/mayland/bricestartermobile.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/mayland/bricestartermobile.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "business", + "title": "Leven", + "segment_id": 1, + "categories": [ + { + "slug": "business", + "title": "Business", + "description": "Business", + "emoji": "🤵", + "order": 6 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/leven/levenstartermobile.wordpress.com/?language=en", + "theme": "leven", + "group": [ + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/leven/levenstartermobile.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/leven/levenstartermobile.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/leven/levenstartermobile.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "overton", + "title": "Overton", + "segment_id": 1, + "categories": [ + { + "slug": "business", + "title": "Business", + "description": "Business", + "emoji": "🤵", + "order": 6 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/alves/overtonstartermobile.wordpress.com/?language=en", + "theme": "alves", + "group": [ + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/alves/overtonstartermobile.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/alves/overtonstartermobile.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/alves/overtonstartermobile.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "easley", + "title": "Easley", + "segment_id": 4, + "categories": [ + { + "slug": "professional", + "title": "Professional", + "description": "Professional", + "emoji": "💼", + "order": 5 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/maywood/easleystartermobile.wordpress.com/?language=en", + "theme": "maywood", + "group": [ + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/maywood/easleystartermobile.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/maywood/easleystartermobile.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/maywood/easleystartermobile.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "professional", + "title": "Vesta", + "segment_id": 4, + "categories": [ + { + "slug": "professional", + "title": "Professional", + "description": "Professional", + "emoji": "💼", + "order": 5 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/mayland/vestastartermobile.wordpress.com/?language=en", + "theme": "mayland", + "group": [ + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/mayland/vestastartermobile.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/mayland/vestastartermobile.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/mayland/vestastartermobile.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "reynolds", + "title": "Reynolds", + "segment_id": 4, + "categories": [ + { + "slug": "professional", + "title": "Professional", + "description": "Professional", + "emoji": "💼", + "order": 5 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/rockfield/reynoldsstartermobile.wordpress.com/?language=en", + "theme": "rockfield", + "group": [ + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/rockfield/reynoldsstartermobile.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/rockfield/reynoldsstartermobile.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/rockfield/reynoldsstartermobile.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "quadrat-white", + "title": "Quadrat", + "segment_id": 2, + "categories": [ + { + "slug": "blog", + "title": "Blog", + "description": "Blog", + "emoji": "📰", + "order": 2 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/quadrat-white/mobilefoodvertical.wordpress.com/?language=en", + "theme": "quadrat-white", + "group": [ + "food", + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/quadrat-white/mobilefoodvertical.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/quadrat-white/mobilefoodvertical.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/quadrat-white/mobilefoodvertical.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "remote", + "title": "Remote", + "segment_id": 2, + "categories": [ + { + "slug": "blog", + "title": "Blog", + "description": "Blog", + "emoji": "📰", + "order": 2 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/remote/mobilenewsvertical.wordpress.com/?language=en", + "theme": "remote", + "group": [ + "news", + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/remote/mobilenewsvertical.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/remote/mobilenewsvertical.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/remote/mobilenewsvertical.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "russell", + "title": "Russell", + "segment_id": 2, + "categories": [ + { + "slug": "blog", + "title": "Blog", + "description": "Blog", + "emoji": "📰", + "order": 2 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/russell/mobilestarterrussell.wordpress.com/?language=en", + "theme": "russell", + "group": [ + "lifestyle", + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/russell/mobilestarterrussell.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/russell/mobilestarterrussell.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/russell/mobilestarterrussell.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "geologist-cream", + "title": "Geologist", + "segment_id": 2, + "categories": [ + { + "slug": "blog", + "title": "Blog", + "description": "Blog", + "emoji": "📰", + "order": 2 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/geologist-cream/mobilestartergeologist.wordpress.com/?language=en", + "theme": "geologist-cream", + "group": [ + "personal", + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/geologist-cream/mobilestartergeologist.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/geologist-cream/mobilestartergeologist.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/geologist-cream/mobilestartergeologist.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "stewart", + "title": "Stewart", + "segment_id": 2, + "categories": [ + { + "slug": "blog", + "title": "Blog", + "description": "Blog", + "emoji": "📰", + "order": 2 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/stewart/mobilestarterstewart.wordpress.com/?language=en", + "theme": "stewart", + "group": [ + "photography", + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/stewart/mobilestarterstewart.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/stewart/mobilestarterstewart.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/stewart/mobilestarterstewart.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + }, + { + "slug": "arbutus", + "title": "Arbutus", + "segment_id": 2, + "categories": [ + { + "slug": "blog", + "title": "Blog", + "description": "Blog", + "emoji": "📰", + "order": 2 + } + ], + "demo_url": "https://public-api.wordpress.com/rest/v1/template/demo/arbutus/mobilestarterarbutus.wordpress.com/?language=en", + "theme": "arbutus", + "group": [ + "travel", + "stable" + ], + "preview": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/arbutus/mobilestarterarbutus.wordpress.com/%3Flanguage%3Den?vpw=1200&vph=1560&w=500&h=650", + "preview_tablet": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/arbutus/mobilestarterarbutus.wordpress.com/%3Flanguage%3Den?vpw=800&vph=1040&w=500&h=650", + "preview_mobile": "https://s0.wp.com/mshots/v1/public-api.wordpress.com/rest/v1/template/demo/arbutus/mobilestarterarbutus.wordpress.com/%3Flanguage%3Den?vpw=400&vph=520&w=500&h=650" + } + ], + "categories": [ + { + "slug": "about", + "title": "About", + "description": "About", + "emoji": "👋", + "order": 0 + }, + { + "slug": "links", + "title": "Links", + "description": "Links", + "emoji": "🔗", + "order": 1 + }, + { + "slug": "blog", + "title": "Blog", + "description": "Blog", + "emoji": "📰", + "order": 2 + }, + { + "slug": "splash", + "title": "Splash", + "description": "Splash", + "emoji": "🏖️", + "order": 3 + }, + { + "slug": "highlights", + "title": "Highlights", + "description": "Highlights", + "emoji": "💛", + "order": 4 + }, + { + "slug": "professional", + "title": "Professional", + "description": "Professional", + "emoji": "💼", + "order": 5 + }, + { + "slug": "business", + "title": "Business", + "description": "Business", + "emoji": "🤵", + "order": 6 + } + ] + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats.json new file mode 100644 index 000000000000..213509f8747e --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats.json @@ -0,0 +1,201 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/rest/v1.1/sites/.*/stats(/+)\\?(.*)", + "queryParameters": { + "locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "date": "{{now format='yyyy-MM-dd'}}", + "stats": { + "visitors_today": 271, + "visitors_yesterday": 249, + "visitors": 201877, + "views_today": 438, + "views_yesterday": 402, + "views_best_day": "2025-05-17", + "views_best_day_total": 1284, + "views": 318406, + "comments": 512, + "posts": 42, + "followers_blog": 1289, + "followers_comments": 0, + "comments_per_month": 14, + "comments_most_active_recent_day": "", + "comments_most_active_time": "N/A", + "comments_spam": 3, + "categories": 2, + "tags": 0, + "shares": 57, + "shares_facebook": 23, + "shares_twitter": 14, + "shares_press-this": 1 + }, + "visits": { + "unit": "day", + "fields": [ + "period", + "views", + "visitors" + ], + "data": [ + [ + "{{now offset='-23 days' format='yyyy-MM-dd'}}", + 0, + 0 + ], + [ + "{{now offset='-22 days' format='yyyy-MM-dd'}}", + 1, + 1 + ], + [ + "{{now offset='-21 days' format='yyyy-MM-dd'}}", + 0, + 0 + ], + [ + "{{now offset='-20 days' format='yyyy-MM-dd'}}", + 0, + 0 + ], + [ + "{{now offset='-19 days' format='yyyy-MM-dd'}}", + 0, + 0 + ], + [ + "{{now offset='-18 days' format='yyyy-MM-dd'}}", + 0, + 0 + ], + [ + "{{now offset='-17 days' format='yyyy-MM-dd'}}", + 0, + 0 + ], + [ + "{{now offset='-4 days' format='yyyy-MM-dd'}}", + 0, + 0 + ], + [ + "{{now offset='-4 days' format='yyyy-MM-dd'}}", + 0, + 0 + ], + [ + "{{now offset='-4 days' format='yyyy-MM-dd'}}", + 1, + 1 + ], + [ + "{{now offset='-4 days' format='yyyy-MM-dd'}}", + 0, + 0 + ], + [ + "{{now offset='-4 days' format='yyyy-MM-dd'}}", + 24, + 3 + ], + [ + "{{now offset='-4 days' format='yyyy-MM-dd'}}", + 6, + 4 + ], + [ + "{{now offset='-16 days' format='yyyy-MM-dd'}}", + 3, + 3 + ], + [ + "{{now offset='-15 days' format='yyyy-MM-dd'}}", + 9, + 2 + ], + [ + "{{now offset='-14 days' format='yyyy-MM-dd'}}", + 0, + 0 + ], + [ + "{{now offset='-13 days' format='yyyy-MM-dd'}}", + 0, + 0 + ], + [ + "{{now offset='-12 days' format='yyyy-MM-dd'}}", + 2, + 2 + ], + [ + "{{now offset='-11 days' format='yyyy-MM-dd'}}", + 0, + 0 + ], + [ + "{{now offset='-10 days' format='yyyy-MM-dd'}}", + 3, + 2 + ], + [ + "{{now offset='-9 days' format='yyyy-MM-dd'}}", + 0, + 0 + ], + [ + "{{now offset='-8 days' format='yyyy-MM-dd'}}", + 6, + 3 + ], + [ + "{{now offset='-7 days' format='yyyy-MM-dd'}}", + 0, + 0 + ], + [ + "{{now offset='-6 days' format='yyyy-MM-dd'}}", + 0, + 0 + ], + [ + "{{now offset='-5 days' format='yyyy-MM-dd'}}", + 0, + 0 + ], + [ + "{{now offset='-4 days' format='yyyy-MM-dd'}}", + 0, + 0 + ], + [ + "{{now offset='-3 days' format='yyyy-MM-dd'}}", + 0, + 0 + ], + [ + "{{now offset='-2 days' format='yyyy-MM-dd'}}", + 1, + 1 + ], + [ + "{{now offset='-1 days' format='yyyy-MM-dd'}}", + 1, + 1 + ], + [ + "{{now format='yyyy-MM-dd'}}", + 0, + 0 + ] + ] + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_archives.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_archives.json new file mode 100644 index 000000000000..8b528a90f148 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_archives.json @@ -0,0 +1,68 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/stats/archives/*" + }, + "response": { + "status": 200, + "jsonBody": { + "date": "{{request.query.date}}", + "period": "{{request.query.period}}", + "summary": { + "category": [ + { + "href": "http://infocusphotographers.com/category/weddings/", + "value": "weddings", + "views": 318 + }, + { + "href": "http://infocusphotographers.com/category/portraits/", + "value": "portraits", + "views": 204 + }, + { + "href": "http://infocusphotographers.com/category/news/", + "value": "news", + "views": 87 + } + ], + "tag": [ + { + "href": "http://infocusphotographers.com/tag/outdoor/", + "value": "outdoor", + "views": 96 + }, + { + "href": "http://infocusphotographers.com/tag/engagement/", + "value": "engagement", + "views": 71 + } + ], + "author": [ + { + "href": "http://infocusphotographers.com/author/leahrand/", + "value": "leahrand", + "views": 64 + }, + { + "href": "http://infocusphotographers.com/author/andreazoellner/", + "value": "andreazoellner", + "views": 22 + } + ], + "date": [ + { + "href": "http://infocusphotographers.com/2016/03/", + "value": "2016/03", + "views": 48 + }, + { + "href": "http://infocusphotographers.com/2016/04/", + "value": "2016/04", + "views": 31 + } + ] + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_clicks.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_clicks.json new file mode 100644 index 000000000000..cc862f37137c --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_clicks.json @@ -0,0 +1,54 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/stats/clicks/*" + }, + "response": { + "status": 200, + "jsonBody": { + "date": "{{request.query.date}}", + "period": "{{request.query.period}}", + "summary": { + "clicks": [ + { + "name": "instagram.com/infocusphotographers", + "url": "https://www.instagram.com/infocusphotographers", + "views": 92, + "children": null + }, + { + "name": "pinterest.com/infocusphotographers", + "url": "https://www.pinterest.com/infocusphotographers", + "views": 47, + "children": null + }, + { + "name": "WordPress.com Media", + "url": null, + "views": 38, + "children": [ + { + "name": "infocusphotographers.files.wordpress.com/2019/05/portfolio-01.jpg", + "url": "https://infocusphotographers.files.wordpress.com/2019/05/portfolio-01.jpg", + "views": 22 + }, + { + "name": "infocusphotographers.files.wordpress.com/2019/05/portfolio-02.jpg", + "url": "https://infocusphotographers.files.wordpress.com/2019/05/portfolio-02.jpg", + "views": 16 + } + ] + }, + { + "name": "maps.google.com", + "url": "https://maps.google.com/?q=In+Focus+Photography", + "views": 23, + "children": null + } + ], + "other_clicks": 14, + "total_clicks": 214 + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_comments.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_comments.json new file mode 100644 index 000000000000..75ddfbe028c6 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_comments.json @@ -0,0 +1,23 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/rest/v1.1/sites/.*/stats/comments/.*" + }, + "response": { + "status": 200, + "jsonBody": { + "date": "{{now format='yyyy-MM-dd'}}", + "authors": [ + + ], + "posts": [ + + ], + "monthly_comments": 0, + "total_comments": 0, + "most_active_day": null, + "most_active_time": "N/A", + "most_commented_post": false + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_devices-browser.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_devices-browser.json new file mode 100644 index 000000000000..5d1a19410f54 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_devices-browser.json @@ -0,0 +1,19 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/stats/devices/browser/*" + }, + "response": { + "status": 200, + "jsonBody": { + "top_values": { + "safari": 1361, + "chrome": 1198, + "firefox": 174, + "edge": 151, + "samsung": 74, + "other": 54 + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_devices-platform.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_devices-platform.json new file mode 100644 index 000000000000..9cae8c2e0fc7 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_devices-platform.json @@ -0,0 +1,21 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/stats/devices/platform/*" + }, + "response": { + "status": 200, + "jsonBody": { + "top_values": { + "iphone": 1124, + "android": 687, + "mac": 512, + "windows": 471, + "ipad": 102, + "linux": 64, + "android_tablet": 22, + "unknown": 30 + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_devices-screensize.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_devices-screensize.json new file mode 100644 index 000000000000..67f62668b914 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_devices-screensize.json @@ -0,0 +1,16 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/stats/devices/screensize/*" + }, + "response": { + "status": 200, + "jsonBody": { + "top_values": { + "mobile": 61.4, + "desktop": 34.9, + "tablet": 3.7 + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_email-opens.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_email-opens.json new file mode 100644 index 000000000000..46c8c7bfae75 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_email-opens.json @@ -0,0 +1,15 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/stats/opens/emails/[0-9]+/rate/*" + }, + "response": { + "status": 200, + "jsonBody": { + "total_sends": 1284, + "unique_opens": 742, + "total_opens": 1532, + "opens_rate": 0.58 + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_emails-summary.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_emails-summary.json new file mode 100644 index 000000000000..195cee28515b --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_emails-summary.json @@ -0,0 +1,40 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/stats/emails/summary/*" + }, + "response": { + "status": 200, + "jsonBody": { + "posts": [ + { + "id": 106, + "href": "http://infocusphotographers.com/2016/04/19/some-news-to-share/", + "date": "{{now offset='-6 days' format='yyyy-MM-dd'}} 09:30:00", + "title": "Some News to Share", + "type": "post", + "opens": 1532, + "clicks": 211 + }, + { + "id": 90, + "href": "http://infocusphotographers.com/2016/03/07/martin-and-amys-wedding/", + "date": "{{now offset='-20 days' format='yyyy-MM-dd'}} 09:30:00", + "title": "Martin and Amy's Wedding", + "type": "post", + "opens": 1810, + "clicks": 342 + }, + { + "id": 237, + "href": "http://infocusphotographers.com/2019/03/13/photo-contest/", + "date": "{{now offset='-41 days' format='yyyy-MM-dd'}} 09:30:00", + "title": "Photo Contest", + "type": "post", + "opens": 1274, + "clicks": 156 + } + ] + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_file-downloads.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_file-downloads.json new file mode 100644 index 000000000000..d5e2e95d54bf --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_file-downloads.json @@ -0,0 +1,31 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/stats/file-downloads/*" + }, + "response": { + "status": 200, + "jsonBody": { + "date": "{{request.query.date}}", + "period": "{{request.query.period}}", + "summary": { + "files": [ + { + "filename": "/2019/05/pricing-guide.pdf", + "downloads": 57 + }, + { + "filename": "/2019/05/wedding-day-checklist.pdf", + "downloads": 34 + }, + { + "filename": "/2019/03/photo-contest-rules.pdf", + "downloads": 12 + } + ], + "other_downloads": 3, + "total_downloads": 106 + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_followers_email.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_followers_email.json new file mode 100644 index 000000000000..3cf8f4601f1d --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_followers_email.json @@ -0,0 +1,63 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/stats/followers/*", + "queryParameters": { + "type": { + "equalTo": "email" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "page": 1, + "pages": 1, + "total": 383, + "total_email": 383, + "total_wpcom": 906, + "subscribers": [ + { + "avatar": "https://0.gravatar.com/avatar/000000000000000000000000000111e2?s=64", + "label": "amelia.grant@example.com", + "ID": "70114", + "url": null, + "follow_data": null, + "date_subscribed": "{{now offset='-2 days'}}" + }, + { + "avatar": "https://0.gravatar.com/avatar/000000000000000000000000000111d2?s=64", + "label": "t.okafor@example.com", + "ID": "70098", + "url": null, + "follow_data": null, + "date_subscribed": "{{now offset='-5 days'}}" + }, + { + "avatar": "https://0.gravatar.com/avatar/000000000000000000000000000111ad?s=64", + "label": "hello@studiolumen.example", + "ID": "70061", + "url": null, + "follow_data": null, + "date_subscribed": "{{now offset='-9 days'}}" + }, + { + "avatar": "https://0.gravatar.com/avatar/00000000000000000000000000011163?s=64", + "label": "marco.bianchi@example.com", + "ID": "69987", + "url": null, + "follow_data": null, + "date_subscribed": "{{now offset='-16 days'}}" + }, + { + "avatar": "https://0.gravatar.com/avatar/0000000000000000000000000001110e?s=64", + "label": "jen.wu@example.com", + "ID": "69902", + "url": null, + "follow_data": null, + "date_subscribed": "{{now offset='-31 days'}}" + } + ] + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_followers_wpcom.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_followers_wpcom.json new file mode 100644 index 000000000000..3b55e50ecc78 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_followers_wpcom.json @@ -0,0 +1,63 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/stats/followers/*", + "queryParameters": { + "type": { + "equalTo": "wpcom" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "page": 1, + "pages": 1, + "total": 906, + "total_email": 383, + "total_wpcom": 906, + "subscribers": [ + { + "avatar": "https://0.gravatar.com/avatar/00000000000000000000000000007c85?s=64", + "label": "Priya Raman", + "ID": "31877", + "url": "http://priyaraman.wordpress.com", + "follow_data": null, + "date_subscribed": "{{now offset='-1 days'}}" + }, + { + "avatar": "https://0.gravatar.com/avatar/00000000000000000000000000007c3a?s=64", + "label": "Daniel Osei", + "ID": "31802", + "url": "http://danielosei.wordpress.com", + "follow_data": null, + "date_subscribed": "{{now offset='-3 days'}}" + }, + { + "avatar": "https://0.gravatar.com/avatar/00000000000000000000000000007c0a?s=64", + "label": "Sofia Lindqvist", + "ID": "31754", + "url": "http://sofialindqvist.wordpress.com", + "follow_data": null, + "date_subscribed": "{{now offset='-8 days'}}" + }, + { + "avatar": "https://0.gravatar.com/avatar/00000000000000000000000000007bca?s=64", + "label": "Kenji Watanabe", + "ID": "31690", + "url": "http://kenjiwatanabe.wordpress.com", + "follow_data": null, + "date_subscribed": "{{now offset='-12 days'}}" + }, + { + "avatar": "https://0.gravatar.com/avatar/00000000000000000000000000007b7f?s=64", + "label": "Maya Hernandez", + "ID": "31615", + "url": "http://mayahernandez.wordpress.com", + "follow_data": null, + "date_subscribed": "{{now offset='-27 days'}}" + } + ] + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_insights.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_insights.json new file mode 100644 index 000000000000..52d9a8941723 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_insights.json @@ -0,0 +1,114 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/rest/v1.1/sites/.*/stats/insights/.*" + }, + "response": { + "status": 200, + "jsonBody": { + "highest_hour": 20, + "highest_hour_percent": 24.742268041237114, + "highest_day_of_week": 3, + "highest_day_percent": 33.793103448275865, + "days": { + "3": 49, + "0": 45, + "2": 21, + "1": 15, + "5": 6, + "4": 5, + "6": 4 + }, + "hours": { + "04": 24, + "17": 9, + "06": 8, + "21": 7, + "09": 6, + "12": 6, + "15": 5, + "18": 5, + "08": 4, + "16": 4, + "02": 4, + "05": 3, + "01": 2, + "10": 2, + "11": 2, + "00": 1, + "23": 1, + "03": 1, + "20": 24, + "14": 1, + "22": 1, + "19": 0, + "07": 0, + "13": 0 + }, + "hourly_views": { + "{{now offset='-2 days' format='yyyy-MM-dd'}} 10:00:00": 0, + "{{now offset='-2 days' format='yyyy-MM-dd'}} 11:00:00": 0, + "{{now offset='-2 days' format='yyyy-MM-dd'}} 12:00:00": 0, + "{{now offset='-2 days' format='yyyy-MM-dd'}} 13:00:00": 0, + "{{now offset='-2 days' format='yyyy-MM-dd'}} 14:00:00": 0, + "{{now offset='-2 days' format='yyyy-MM-dd'}} 15:00:00": 0, + "{{now offset='-2 days' format='yyyy-MM-dd'}} 16:00:00": 1, + "{{now offset='-2 days' format='yyyy-MM-dd'}} 17:00:00": 0, + "{{now offset='-2 days' format='yyyy-MM-dd'}} 18:00:00": 0, + "{{now offset='-2 days' format='yyyy-MM-dd'}} 19:00:00": 0, + "{{now offset='-2 days' format='yyyy-MM-dd'}} 20:00:00": 0, + "{{now offset='-2 days' format='yyyy-MM-dd'}} 21:00:00": 0, + "{{now offset='-2 days' format='yyyy-MM-dd'}} 22:00:00": 0, + "{{now offset='-2 days' format='yyyy-MM-dd'}} 23:00:00": 0, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 00:00:00": 0, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 01:00:00": 0, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 02:00:00": 0, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 03:00:00": 0, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 04:00:00": 0, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 05:00:00": 0, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 06:00:00": 0, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 07:00:00": 0, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 08:00:00": 0, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 09:00:00": 0, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 10:00:00": 0, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 11:00:00": 1, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 12:00:00": 0, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 13:00:00": 0, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 14:00:00": 0, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 15:00:00": 0, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 16:00:00": 0, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 17:00:00": 0, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 18:00:00": 0, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 19:00:00": 0, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 20:00:00": 0, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 21:00:00": 0, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 22:00:00": 0, + "{{now offset='-1 days' format='yyyy-MM-dd'}} 23:00:00": 0, + "{{now format='yyyy-MM-dd'}} 00:00:00": 0, + "{{now format='yyyy-MM-dd'}} 01:00:00": 0, + "{{now format='yyyy-MM-dd'}} 02:00:00": 0, + "{{now format='yyyy-MM-dd'}} 03:00:00": 0, + "{{now format='yyyy-MM-dd'}} 04:00:00": 0, + "{{now format='yyyy-MM-dd'}} 05:00:00": 0, + "{{now format='yyyy-MM-dd'}} 06:00:00": 0, + "{{now format='yyyy-MM-dd'}} 07:00:00": 0, + "{{now format='yyyy-MM-dd'}} 08:00:00": 0, + "{{now format='yyyy-MM-dd'}} 09:00:00": 0 + }, + "years": [ + { + "year": "2016", + "total_posts": 2, + "total_words": 105, + "avg_words": 52.5, + "total_likes": 0, + "avg_likes": 0, + "total_comments": 0, + "avg_comments": 0, + "total_images": 2, + "avg_images": 1 + } + ] + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_last-post.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_last-post.json new file mode 100644 index 000000000000..7b240368a72b --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_last-post.json @@ -0,0 +1,37 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/posts/*", + "queryParameters": { + "order_by": { + "equalTo": "date" + }, + "number": { + "equalTo": "1" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "found": 3, + "posts": [ + { + "ID": 106, + "title": "Some News to Share", + "URL": "http://infocusphotographers.com/2016/04/19/some-news-to-share/", + "date": "{{now offset='-6 days'}}", + "like_count": 23, + "discussion": { + "comment_count": 7, + "comments_open": true, + "comment_status": "open", + "pings_open": true, + "ping_status": "open" + }, + "featured_image": "" + } + ] + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_location-views-city.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_location-views-city.json new file mode 100644 index 000000000000..dfcf8ee67fe0 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_location-views-city.json @@ -0,0 +1,82 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/stats/location-views/city/*" + }, + "response": { + "status": 200, + "jsonBody": { + "date": "{{request.query.date}}", + "period": "{{request.query.period}}", + "summary": { + "views": [ + { + "location": "San Francisco", + "country_code": "US", + "views": 268, + "coordinates": { + "latitude": "37.7749", + "longitude": "-122.4194" + } + }, + { + "location": "London", + "country_code": "GB", + "views": 231, + "coordinates": { + "latitude": "51.5074", + "longitude": "-0.1278" + } + }, + { + "location": "New York", + "country_code": "US", + "views": 207, + "coordinates": { + "latitude": "40.7128", + "longitude": "-74.0060" + } + }, + { + "location": "Toronto", + "country_code": "CA", + "views": 142, + "coordinates": { + "latitude": "43.6532", + "longitude": "-79.3832" + } + }, + { + "location": "Los Angeles", + "country_code": "US", + "views": 133, + "coordinates": { + "latitude": "34.0522", + "longitude": "-118.2437" + } + }, + { + "location": "Sydney", + "country_code": "AU", + "views": 97, + "coordinates": { + "latitude": "-33.8688", + "longitude": "151.2093" + } + }, + { + "location": "Berlin", + "country_code": "DE", + "views": 71, + "coordinates": { + "latitude": "52.5200", + "longitude": "13.4050" + } + } + ], + "other_views": 1863, + "total_views": 3012 + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_location-views-country.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_location-views-country.json new file mode 100644 index 000000000000..2b2c4a1c5782 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_location-views-country.json @@ -0,0 +1,91 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/stats/location-views/country/*" + }, + "response": { + "status": 200, + "jsonBody": { + "date": "{{request.query.date}}", + "period": "{{request.query.period}}", + "summary": { + "views": [ + { + "country_code": "US", + "views": 1648 + }, + { + "country_code": "GB", + "views": 402 + }, + { + "country_code": "CA", + "views": 296 + }, + { + "country_code": "AU", + "views": 214 + }, + { + "country_code": "DE", + "views": 151 + }, + { + "country_code": "IN", + "views": 118 + }, + { + "country_code": "FR", + "views": 77 + } + ], + "other_views": 106, + "total_views": 3012 + }, + "country-info": { + "US": { + "flag_icon": "https://secure.gravatar.com/blavatar/flag-us?s=48", + "flat_flag_icon": "https://secure.gravatar.com/blavatar/flat-flag-us?s=48", + "country_full": "United States", + "map_region": "021" + }, + "GB": { + "flag_icon": "https://secure.gravatar.com/blavatar/flag-gb?s=48", + "flat_flag_icon": "https://secure.gravatar.com/blavatar/flat-flag-gb?s=48", + "country_full": "United Kingdom", + "map_region": "154" + }, + "CA": { + "flag_icon": "https://secure.gravatar.com/blavatar/flag-ca?s=48", + "flat_flag_icon": "https://secure.gravatar.com/blavatar/flat-flag-ca?s=48", + "country_full": "Canada", + "map_region": "021" + }, + "AU": { + "flag_icon": "https://secure.gravatar.com/blavatar/flag-au?s=48", + "flat_flag_icon": "https://secure.gravatar.com/blavatar/flat-flag-au?s=48", + "country_full": "Australia", + "map_region": "053" + }, + "DE": { + "flag_icon": "https://secure.gravatar.com/blavatar/flag-de?s=48", + "flat_flag_icon": "https://secure.gravatar.com/blavatar/flat-flag-de?s=48", + "country_full": "Germany", + "map_region": "155" + }, + "IN": { + "flag_icon": "https://secure.gravatar.com/blavatar/flag-in?s=48", + "flat_flag_icon": "https://secure.gravatar.com/blavatar/flat-flag-in?s=48", + "country_full": "India", + "map_region": "034" + }, + "FR": { + "flag_icon": "https://secure.gravatar.com/blavatar/flag-fr?s=48", + "flat_flag_icon": "https://secure.gravatar.com/blavatar/flat-flag-fr?s=48", + "country_full": "France", + "map_region": "155" + } + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_location-views-region.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_location-views-region.json new file mode 100644 index 000000000000..1b496d258e61 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_location-views-region.json @@ -0,0 +1,49 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/stats/location-views/region/*" + }, + "response": { + "status": 200, + "jsonBody": { + "date": "{{request.query.date}}", + "period": "{{request.query.period}}", + "summary": { + "views": [ + { + "location": "California", + "country_code": "US", + "views": 512 + }, + { + "location": "England", + "country_code": "GB", + "views": 356 + }, + { + "location": "New York", + "country_code": "US", + "views": 301 + }, + { + "location": "Ontario", + "country_code": "CA", + "views": 187 + }, + { + "location": "Texas", + "country_code": "US", + "views": 164 + }, + { + "location": "New South Wales", + "country_code": "AU", + "views": 121 + } + ], + "other_views": 1371, + "total_views": 3012 + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_post-likes.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_post-likes.json new file mode 100644 index 000000000000..9af62b156655 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_post-likes.json @@ -0,0 +1,86 @@ +{ + "priority": 6, + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.2/sites/[0-9]+/posts/[0-9]+/likes/*" + }, + "response": { + "status": 200, + "jsonBody": { + "found": 23, + "i_like": false, + "likes": [ + { + "ID": 31877, + "login": "priyaraman", + "name": "Priya Raman", + "site_ID": 32877, + "avatar_URL": "https://0.gravatar.com/avatar/00000000000000000000000000007c85?s=96", + "bio": "", + "date_liked": "{{now offset='-1 days'}}", + "preferred_blog": { + "url": "http://priyaraman.wordpress.com", + "name": "Priya Raman", + "id": 32877 + } + }, + { + "ID": 31802, + "login": "danielosei", + "name": "Daniel Osei", + "site_ID": 32802, + "avatar_URL": "https://0.gravatar.com/avatar/00000000000000000000000000007c3a?s=96", + "bio": "", + "date_liked": "{{now offset='-2 days'}}", + "preferred_blog": { + "url": "http://danielosei.wordpress.com", + "name": "Daniel Osei", + "id": 32802 + } + }, + { + "ID": 31754, + "login": "sofialindqvist", + "name": "Sofia Lindqvist", + "site_ID": 32754, + "avatar_URL": "https://0.gravatar.com/avatar/00000000000000000000000000007c0a?s=96", + "bio": "", + "date_liked": "{{now offset='-2 days'}}", + "preferred_blog": { + "url": "http://sofialindqvist.wordpress.com", + "name": "Sofia Lindqvist", + "id": 32754 + } + }, + { + "ID": 31690, + "login": "kenjiwatanabe", + "name": "Kenji Watanabe", + "site_ID": 32690, + "avatar_URL": "https://0.gravatar.com/avatar/00000000000000000000000000007bca?s=96", + "bio": "", + "date_liked": "{{now offset='-4 days'}}", + "preferred_blog": { + "url": "http://kenjiwatanabe.wordpress.com", + "name": "Kenji Watanabe", + "id": 32690 + } + }, + { + "ID": 31615, + "login": "mayahernandez", + "name": "Maya Hernandez", + "site_ID": 32615, + "avatar_URL": "https://0.gravatar.com/avatar/00000000000000000000000000007b7f?s=96", + "bio": "", + "date_liked": "{{now offset='-5 days'}}", + "preferred_blog": { + "url": "http://mayahernandez.wordpress.com", + "name": "Maya Hernandez", + "id": 32615 + } + } + ] + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_post.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_post.json new file mode 100644 index 000000000000..6d7f6791231b --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_post.json @@ -0,0 +1,474 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/stats/post/[0-9]+/*" + }, + "response": { + "status": 200, + "jsonBody": { + "date": "{{now format='yyyy-MM-dd'}}", + "views": 30428, + "years": { + "{{now offset='-2 years' format='yyyy'}}": { + "months": { + "1": 612, + "2": 580, + "3": 705, + "4": 731, + "5": 802, + "6": 768, + "7": 744, + "8": 690, + "9": 721, + "10": 815, + "11": 794, + "12": 760 + }, + "total": 8722 + }, + "{{now offset='-1 years' format='yyyy'}}": { + "months": { + "1": 842, + "2": 791, + "3": 913, + "4": 1004, + "5": 1284, + "6": 1120, + "7": 1032, + "8": 987, + "9": 1065, + "10": 1143, + "11": 1098, + "12": 1021 + }, + "total": 12300 + } + }, + "averages": { + "{{now offset='-2 years' format='yyyy'}}": { + "months": { + "1": 20, + "2": 19, + "3": 24, + "4": 24, + "5": 27, + "6": 26, + "7": 25, + "8": 23, + "9": 24, + "10": 27, + "11": 26, + "12": 25 + }, + "overall": 24 + }, + "{{now offset='-1 years' format='yyyy'}}": { + "months": { + "1": 28, + "2": 26, + "3": 30, + "4": 33, + "5": 43, + "6": 37, + "7": 34, + "8": 33, + "9": 36, + "10": 38, + "11": 37, + "12": 34 + }, + "overall": 34 + } + }, + "weeks": [ + { + "days": [ + { + "day": "{{now offset='-41 days' format='yyyy-MM-dd'}}", + "count": 31 + }, + { + "day": "{{now offset='-40 days' format='yyyy-MM-dd'}}", + "count": 44 + }, + { + "day": "{{now offset='-39 days' format='yyyy-MM-dd'}}", + "count": 47 + }, + { + "day": "{{now offset='-38 days' format='yyyy-MM-dd'}}", + "count": 52 + }, + { + "day": "{{now offset='-37 days' format='yyyy-MM-dd'}}", + "count": 49 + }, + { + "day": "{{now offset='-36 days' format='yyyy-MM-dd'}}", + "count": 38 + }, + { + "day": "{{now offset='-35 days' format='yyyy-MM-dd'}}", + "count": 29 + } + ], + "total": 290, + "average": 41, + "change": null + }, + { + "days": [ + { + "day": "{{now offset='-34 days' format='yyyy-MM-dd'}}", + "count": 33 + }, + { + "day": "{{now offset='-33 days' format='yyyy-MM-dd'}}", + "count": 46 + }, + { + "day": "{{now offset='-32 days' format='yyyy-MM-dd'}}", + "count": 51 + }, + { + "day": "{{now offset='-31 days' format='yyyy-MM-dd'}}", + "count": 55 + }, + { + "day": "{{now offset='-30 days' format='yyyy-MM-dd'}}", + "count": 48 + }, + { + "day": "{{now offset='-29 days' format='yyyy-MM-dd'}}", + "count": 41 + }, + { + "day": "{{now offset='-28 days' format='yyyy-MM-dd'}}", + "count": 30 + } + ], + "total": 304, + "average": 43, + "change": 4.8 + }, + { + "days": [ + { + "day": "{{now offset='-27 days' format='yyyy-MM-dd'}}", + "count": 35 + }, + { + "day": "{{now offset='-26 days' format='yyyy-MM-dd'}}", + "count": 49 + }, + { + "day": "{{now offset='-25 days' format='yyyy-MM-dd'}}", + "count": 53 + }, + { + "day": "{{now offset='-24 days' format='yyyy-MM-dd'}}", + "count": 58 + }, + { + "day": "{{now offset='-23 days' format='yyyy-MM-dd'}}", + "count": 52 + }, + { + "day": "{{now offset='-22 days' format='yyyy-MM-dd'}}", + "count": 44 + }, + { + "day": "{{now offset='-21 days' format='yyyy-MM-dd'}}", + "count": 32 + } + ], + "total": 323, + "average": 46, + "change": 6.2 + }, + { + "days": [ + { + "day": "{{now offset='-20 days' format='yyyy-MM-dd'}}", + "count": 36 + }, + { + "day": "{{now offset='-19 days' format='yyyy-MM-dd'}}", + "count": 52 + }, + { + "day": "{{now offset='-18 days' format='yyyy-MM-dd'}}", + "count": 57 + }, + { + "day": "{{now offset='-17 days' format='yyyy-MM-dd'}}", + "count": 61 + }, + { + "day": "{{now offset='-16 days' format='yyyy-MM-dd'}}", + "count": 55 + }, + { + "day": "{{now offset='-15 days' format='yyyy-MM-dd'}}", + "count": 46 + }, + { + "day": "{{now offset='-14 days' format='yyyy-MM-dd'}}", + "count": 34 + } + ], + "total": 341, + "average": 49, + "change": 5.6 + }, + { + "days": [ + { + "day": "{{now offset='-13 days' format='yyyy-MM-dd'}}", + "count": 39 + }, + { + "day": "{{now offset='-12 days' format='yyyy-MM-dd'}}", + "count": 54 + }, + { + "day": "{{now offset='-11 days' format='yyyy-MM-dd'}}", + "count": 60 + }, + { + "day": "{{now offset='-10 days' format='yyyy-MM-dd'}}", + "count": 63 + }, + { + "day": "{{now offset='-9 days' format='yyyy-MM-dd'}}", + "count": 58 + }, + { + "day": "{{now offset='-8 days' format='yyyy-MM-dd'}}", + "count": 49 + }, + { + "day": "{{now offset='-7 days' format='yyyy-MM-dd'}}", + "count": 37 + } + ], + "total": 360, + "average": 51, + "change": 5.6 + }, + { + "days": [ + { + "day": "{{now offset='-6 days' format='yyyy-MM-dd'}}", + "count": 71 + }, + { + "day": "{{now offset='-5 days' format='yyyy-MM-dd'}}", + "count": 96 + }, + { + "day": "{{now offset='-4 days' format='yyyy-MM-dd'}}", + "count": 88 + }, + { + "day": "{{now offset='-3 days' format='yyyy-MM-dd'}}", + "count": 74 + }, + { + "day": "{{now offset='-2 days' format='yyyy-MM-dd'}}", + "count": 67 + }, + { + "day": "{{now offset='-1 days' format='yyyy-MM-dd'}}", + "count": 52 + }, + { + "day": "{{now format='yyyy-MM-dd'}}", + "count": 43 + } + ], + "total": 491, + "average": 70, + "change": 36.4 + } + ], + "fields": [ + "period", + "views" + ], + "data": [ + [ + "{{now offset='-41 days' format='yyyy-MM-dd'}}", + 31 + ], + [ + "{{now offset='-40 days' format='yyyy-MM-dd'}}", + 44 + ], + [ + "{{now offset='-39 days' format='yyyy-MM-dd'}}", + 47 + ], + [ + "{{now offset='-38 days' format='yyyy-MM-dd'}}", + 52 + ], + [ + "{{now offset='-37 days' format='yyyy-MM-dd'}}", + 49 + ], + [ + "{{now offset='-36 days' format='yyyy-MM-dd'}}", + 38 + ], + [ + "{{now offset='-35 days' format='yyyy-MM-dd'}}", + 29 + ], + [ + "{{now offset='-34 days' format='yyyy-MM-dd'}}", + 33 + ], + [ + "{{now offset='-33 days' format='yyyy-MM-dd'}}", + 46 + ], + [ + "{{now offset='-32 days' format='yyyy-MM-dd'}}", + 51 + ], + [ + "{{now offset='-31 days' format='yyyy-MM-dd'}}", + 55 + ], + [ + "{{now offset='-30 days' format='yyyy-MM-dd'}}", + 48 + ], + [ + "{{now offset='-29 days' format='yyyy-MM-dd'}}", + 41 + ], + [ + "{{now offset='-28 days' format='yyyy-MM-dd'}}", + 30 + ], + [ + "{{now offset='-27 days' format='yyyy-MM-dd'}}", + 35 + ], + [ + "{{now offset='-26 days' format='yyyy-MM-dd'}}", + 49 + ], + [ + "{{now offset='-25 days' format='yyyy-MM-dd'}}", + 53 + ], + [ + "{{now offset='-24 days' format='yyyy-MM-dd'}}", + 58 + ], + [ + "{{now offset='-23 days' format='yyyy-MM-dd'}}", + 52 + ], + [ + "{{now offset='-22 days' format='yyyy-MM-dd'}}", + 44 + ], + [ + "{{now offset='-21 days' format='yyyy-MM-dd'}}", + 32 + ], + [ + "{{now offset='-20 days' format='yyyy-MM-dd'}}", + 36 + ], + [ + "{{now offset='-19 days' format='yyyy-MM-dd'}}", + 52 + ], + [ + "{{now offset='-18 days' format='yyyy-MM-dd'}}", + 57 + ], + [ + "{{now offset='-17 days' format='yyyy-MM-dd'}}", + 61 + ], + [ + "{{now offset='-16 days' format='yyyy-MM-dd'}}", + 55 + ], + [ + "{{now offset='-15 days' format='yyyy-MM-dd'}}", + 46 + ], + [ + "{{now offset='-14 days' format='yyyy-MM-dd'}}", + 34 + ], + [ + "{{now offset='-13 days' format='yyyy-MM-dd'}}", + 39 + ], + [ + "{{now offset='-12 days' format='yyyy-MM-dd'}}", + 54 + ], + [ + "{{now offset='-11 days' format='yyyy-MM-dd'}}", + 60 + ], + [ + "{{now offset='-10 days' format='yyyy-MM-dd'}}", + 63 + ], + [ + "{{now offset='-9 days' format='yyyy-MM-dd'}}", + 58 + ], + [ + "{{now offset='-8 days' format='yyyy-MM-dd'}}", + 49 + ], + [ + "{{now offset='-7 days' format='yyyy-MM-dd'}}", + 37 + ], + [ + "{{now offset='-6 days' format='yyyy-MM-dd'}}", + 71 + ], + [ + "{{now offset='-5 days' format='yyyy-MM-dd'}}", + 96 + ], + [ + "{{now offset='-4 days' format='yyyy-MM-dd'}}", + 88 + ], + [ + "{{now offset='-3 days' format='yyyy-MM-dd'}}", + 74 + ], + [ + "{{now offset='-2 days' format='yyyy-MM-dd'}}", + 67 + ], + [ + "{{now offset='-1 days' format='yyyy-MM-dd'}}", + 52 + ], + [ + "{{now format='yyyy-MM-dd'}}", + 43 + ] + ], + "highest_month": 1284, + "highest_day_average": 43, + "highest_week_average": 70 + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_publicize.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_publicize.json new file mode 100644 index 000000000000..15b406ad98a2 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_publicize.json @@ -0,0 +1,27 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/rest/v1.1/sites/.*/stats/publicize/.*", + "queryParameters": { + "locale": { + "matches": "(.*)" + }, + "max": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "services": [ + + ] + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_published-posts.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_published-posts.json new file mode 100644 index 000000000000..a947e4f24f37 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_published-posts.json @@ -0,0 +1,21 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/posts/*", + "queryParameters": { + "after": { + "matches": ".+" + }, + "before": { + "matches": ".+" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "found": 0, + "posts": [] + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_referrers.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_referrers.json new file mode 100644 index 000000000000..0740ed15cea6 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_referrers.json @@ -0,0 +1,77 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/stats/referrers/*" + }, + "response": { + "status": 200, + "jsonBody": { + "date": "{{request.query.date}}", + "period": "{{request.query.period}}", + "summary": { + "groups": [ + { + "group": "Search Engines", + "name": "Search Engines", + "total": 512, + "results": [ + { + "name": "Google Search", + "url": "http://www.google.com/", + "views": 468 + }, + { + "name": "Bing", + "url": "http://www.bing.com", + "views": 31 + }, + { + "name": "DuckDuckGo", + "url": "https://duckduckgo.com", + "views": 13 + } + ] + }, + { + "group": "instagram.com", + "name": "Instagram", + "url": "https://www.instagram.com/", + "total": 274, + "results": { + "views": 274 + } + }, + { + "group": "facebook.com", + "name": "Facebook", + "url": "http://facebook.com/", + "total": 188, + "results": { + "views": 188 + } + }, + { + "group": "WordPress.com Reader", + "name": "WordPress.com Reader", + "url": "https://wordpress.com/", + "total": 96, + "results": { + "views": 96 + } + }, + { + "group": "pinterest.com", + "name": "Pinterest", + "url": "http://pinterest.com/", + "total": 61, + "results": { + "views": 61 + } + } + ], + "other_views": 49, + "total_views": 1180 + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_search-terms.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_search-terms.json new file mode 100644 index 000000000000..0f70445efcfc --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_search-terms.json @@ -0,0 +1,36 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/stats/search-terms/*" + }, + "response": { + "status": 200, + "jsonBody": { + "date": "{{request.query.date}}", + "period": "{{request.query.period}}", + "summary": { + "search_terms": [ + { + "term": "wedding photographer near me", + "views": 41 + }, + { + "term": "in focus photography", + "views": 33 + }, + { + "term": "engagement photo ideas", + "views": 19 + }, + { + "term": "outdoor wedding photos", + "views": 12 + } + ], + "encrypted_search_terms": 362, + "other_search_terms": 9, + "total_search_terms": 476 + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_streak.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_streak.json new file mode 100644 index 000000000000..a6bd19143035 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_streak.json @@ -0,0 +1,26 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/rest/v1.1/sites/.*/stats/streak/.*" + }, + "response": { + "status": 200, + "jsonBody": { + "streak": { + "long": { + "start": "", + "end": "", + "length": 1 + }, + "current": { + "start": "", + "end": "", + "length": 0 + } + }, + "data": [ + + ] + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_subscribers.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_subscribers.json new file mode 100644 index 000000000000..c2d1eec22ef4 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_subscribers.json @@ -0,0 +1,26 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/stats/subscribers/*" + }, + "response": { + "status": 200, + "transformers": [ + "stats-series" + ], + "transformerParameters": { + "fields": [ + { + "name": "subscribers", + "level": 1289, + "growth": 1.35 + }, + { + "name": "subscribers_paid", + "level": 38, + "growth": 0.05 + } + ] + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_summary.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_summary.json new file mode 100644 index 000000000000..99bd774942b8 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_summary.json @@ -0,0 +1,24 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/rest/v1.1/sites/.*/stats/summary/.*" + }, + "response": { + "status": 200, + "jsonBody": { + "date": "{{now format='yyyy-MM-dd'}}", + "period": "day", + "views": 438, + "visitors": 271, + "likes": 14, + "reblogs": 1, + "comments": 6, + "followers": 1289 + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_tags.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_tags.json new file mode 100644 index 000000000000..e6092f9e1176 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_tags.json @@ -0,0 +1,28 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/rest/v1.1/sites/.*/stats/tags/.*", + "queryParameters": { + "locale": { + "matches": "(.*)" + }, + "max": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "date": "{{now format='yyyy-MM-dd'}}", + "tags": [ + + ] + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_top-authors.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_top-authors.json new file mode 100644 index 000000000000..494d43323337 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_top-authors.json @@ -0,0 +1,66 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/stats/top-authors/*" + }, + "response": { + "status": 200, + "jsonBody": { + "date": "{{request.query.date}}", + "period": "{{request.query.period}}", + "summary": { + "authors": [ + { + "name": "Leah Elaine Rand", + "avatar": "https://0.gravatar.com/avatar/62937c26a2a79bae5921ca9e85be8040?s=64", + "views": 1956, + "posts": [ + { + "id": 1, + "title": "Home", + "url": "http://infocusphotographers.com/about/", + "views": 846, + "video": false + }, + { + "id": 90, + "title": "Martin and Amy's Wedding", + "url": "http://infocusphotographers.com/2016/03/07/martin-and-amys-wedding/", + "views": 612, + "video": false + }, + { + "id": 24, + "title": "Portfolio", + "url": "http://infocusphotographers.com/portfolio/", + "views": 498, + "video": false + } + ] + }, + { + "name": "Andrea Zoellner", + "avatar": "https://0.gravatar.com/avatar/9c9aa771f98b781c3fea988f6d925c9f?s=64", + "views": 565, + "posts": [ + { + "id": 106, + "title": "Some News to Share", + "url": "http://infocusphotographers.com/2016/04/19/some-news-to-share/", + "views": 301, + "video": false + }, + { + "id": 22, + "title": "Our Story", + "url": "http://infocusphotographers.com/our-story/", + "views": 264, + "video": false + } + ] + } + ] + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_top-posts.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_top-posts.json new file mode 100644 index 000000000000..1d54197ec539 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_top-posts.json @@ -0,0 +1,64 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/stats/top-posts/*" + }, + "response": { + "status": 200, + "jsonBody": { + "date": "{{request.query.date}}", + "period": "{{request.query.period}}", + "summary": { + "postviews": [ + { + "id": 1, + "href": "http://infocusphotographers.com/about/", + "date": "2016-02-09 16:07:34", + "title": "Home", + "type": "page", + "views": 846, + "video_play": false + }, + { + "id": 90, + "href": "http://infocusphotographers.com/2016/03/07/martin-and-amys-wedding/", + "date": "2016-03-07 11:22:10", + "title": "Martin and Amy's Wedding", + "type": "post", + "views": 612, + "video_play": false + }, + { + "id": 24, + "href": "http://infocusphotographers.com/portfolio/", + "date": "2016-02-09 16:12:02", + "title": "Portfolio", + "type": "page", + "views": 498, + "video_play": false + }, + { + "id": 106, + "href": "http://infocusphotographers.com/2016/04/19/some-news-to-share/", + "date": "2016-04-19 21:28:27", + "title": "Some News to Share", + "type": "post", + "views": 301, + "video_play": false + }, + { + "id": 22, + "href": "http://infocusphotographers.com/our-story/", + "date": "2016-02-09 16:10:45", + "title": "Our Story", + "type": "page", + "views": 264, + "video_play": false + } + ], + "total_views": 3012, + "other_views": 491 + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_utm-campaign-source-medium.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_utm-campaign-source-medium.json new file mode 100644 index 000000000000..b47f08de2fe1 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_utm-campaign-source-medium.json @@ -0,0 +1,60 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/106707880/stats/utm/utm_campaign,utm_source,utm_medium" + }, + "response": { + "status": 200, + "jsonBody": { + "top_utm_values": { + "[\"spring-minis\",\"instagram\",\"social\"]": 164, + "[\"newsletter-april\",\"newsletter\",\"email\"]": 121, + "[\"spring-minis\",\"facebook\",\"social\"]": 88, + "[\"portfolio-launch\",\"google\",\"cpc\"]": 57, + "[\"newsletter-april\",\"pinterest\",\"social\"]": 26 + }, + "top_posts": { + "[\"spring-minis\",\"instagram\",\"social\"]": [ + { + "id": 90, + "title": "Martin and Amy's Wedding", + "views": 164, + "href": "http://infocusphotographers.com/2016/03/07/martin-and-amys-wedding/" + } + ], + "[\"newsletter-april\",\"newsletter\",\"email\"]": [ + { + "id": 106, + "title": "Some News to Share", + "views": 121, + "href": "http://infocusphotographers.com/2016/04/19/some-news-to-share/" + } + ], + "[\"spring-minis\",\"facebook\",\"social\"]": [ + { + "id": 24, + "title": "Portfolio", + "views": 88, + "href": "http://infocusphotographers.com/portfolio/" + } + ], + "[\"portfolio-launch\",\"google\",\"cpc\"]": [ + { + "id": 24, + "title": "Portfolio", + "views": 57, + "href": "http://infocusphotographers.com/portfolio/" + } + ], + "[\"newsletter-april\",\"pinterest\",\"social\"]": [ + { + "id": 1, + "title": "Home", + "views": 26, + "href": "http://infocusphotographers.com/about/" + } + ] + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_utm-campaign.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_utm-campaign.json new file mode 100644 index 000000000000..6d1f63ea768d --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_utm-campaign.json @@ -0,0 +1,54 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/106707880/stats/utm/utm_campaign" + }, + "response": { + "status": 200, + "jsonBody": { + "top_utm_values": { + "spring-minis": 252, + "newsletter-april": 147, + "portfolio-launch": 57 + }, + "top_posts": { + "spring-minis": [ + { + "id": 90, + "title": "Martin and Amy's Wedding", + "views": 164, + "href": "http://infocusphotographers.com/2016/03/07/martin-and-amys-wedding/" + }, + { + "id": 24, + "title": "Portfolio", + "views": 88, + "href": "http://infocusphotographers.com/portfolio/" + } + ], + "newsletter-april": [ + { + "id": 106, + "title": "Some News to Share", + "views": 121, + "href": "http://infocusphotographers.com/2016/04/19/some-news-to-share/" + }, + { + "id": 1, + "title": "Home", + "views": 26, + "href": "http://infocusphotographers.com/about/" + } + ], + "portfolio-launch": [ + { + "id": 24, + "title": "Portfolio", + "views": 57, + "href": "http://infocusphotographers.com/portfolio/" + } + ] + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_utm-medium.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_utm-medium.json new file mode 100644 index 000000000000..c0c1f9a79881 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_utm-medium.json @@ -0,0 +1,54 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/106707880/stats/utm/utm_medium" + }, + "response": { + "status": 200, + "jsonBody": { + "top_utm_values": { + "social": 278, + "email": 121, + "cpc": 57 + }, + "top_posts": { + "social": [ + { + "id": 90, + "title": "Martin and Amy's Wedding", + "views": 164, + "href": "http://infocusphotographers.com/2016/03/07/martin-and-amys-wedding/" + }, + { + "id": 24, + "title": "Portfolio", + "views": 88, + "href": "http://infocusphotographers.com/portfolio/" + }, + { + "id": 1, + "title": "Home", + "views": 26, + "href": "http://infocusphotographers.com/about/" + } + ], + "email": [ + { + "id": 106, + "title": "Some News to Share", + "views": 121, + "href": "http://infocusphotographers.com/2016/04/19/some-news-to-share/" + } + ], + "cpc": [ + { + "id": 24, + "title": "Portfolio", + "views": 57, + "href": "http://infocusphotographers.com/portfolio/" + } + ] + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_utm-source-medium.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_utm-source-medium.json new file mode 100644 index 000000000000..ca6472c3f993 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_utm-source-medium.json @@ -0,0 +1,60 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/106707880/stats/utm/utm_source,utm_medium" + }, + "response": { + "status": 200, + "jsonBody": { + "top_utm_values": { + "[\"instagram\",\"social\"]": 164, + "[\"newsletter\",\"email\"]": 121, + "[\"facebook\",\"social\"]": 88, + "[\"google\",\"cpc\"]": 57, + "[\"pinterest\",\"social\"]": 26 + }, + "top_posts": { + "[\"instagram\",\"social\"]": [ + { + "id": 90, + "title": "Martin and Amy's Wedding", + "views": 164, + "href": "http://infocusphotographers.com/2016/03/07/martin-and-amys-wedding/" + } + ], + "[\"newsletter\",\"email\"]": [ + { + "id": 106, + "title": "Some News to Share", + "views": 121, + "href": "http://infocusphotographers.com/2016/04/19/some-news-to-share/" + } + ], + "[\"facebook\",\"social\"]": [ + { + "id": 24, + "title": "Portfolio", + "views": 88, + "href": "http://infocusphotographers.com/portfolio/" + } + ], + "[\"google\",\"cpc\"]": [ + { + "id": 24, + "title": "Portfolio", + "views": 57, + "href": "http://infocusphotographers.com/portfolio/" + } + ], + "[\"pinterest\",\"social\"]": [ + { + "id": 1, + "title": "Home", + "views": 26, + "href": "http://infocusphotographers.com/about/" + } + ] + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_utm-source.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_utm-source.json new file mode 100644 index 000000000000..b512b42007d8 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_utm-source.json @@ -0,0 +1,60 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/106707880/stats/utm/utm_source" + }, + "response": { + "status": 200, + "jsonBody": { + "top_utm_values": { + "instagram": 164, + "newsletter": 121, + "facebook": 88, + "google": 57, + "pinterest": 26 + }, + "top_posts": { + "instagram": [ + { + "id": 90, + "title": "Martin and Amy's Wedding", + "views": 164, + "href": "http://infocusphotographers.com/2016/03/07/martin-and-amys-wedding/" + } + ], + "newsletter": [ + { + "id": 106, + "title": "Some News to Share", + "views": 121, + "href": "http://infocusphotographers.com/2016/04/19/some-news-to-share/" + } + ], + "facebook": [ + { + "id": 24, + "title": "Portfolio", + "views": 88, + "href": "http://infocusphotographers.com/portfolio/" + } + ], + "google": [ + { + "id": 24, + "title": "Portfolio", + "views": 57, + "href": "http://infocusphotographers.com/portfolio/" + } + ], + "pinterest": [ + { + "id": 1, + "title": "Home", + "views": 26, + "href": "http://infocusphotographers.com/about/" + } + ] + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_video-plays.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_video-plays.json new file mode 100644 index 000000000000..cd37ccee19e8 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_video-plays.json @@ -0,0 +1,31 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/stats/video-plays/*" + }, + "response": { + "status": 200, + "jsonBody": { + "date": "{{request.query.date}}", + "period": "{{request.query.period}}", + "summary": { + "plays": [ + { + "post_id": 90, + "url": "http://infocusphotographers.com/2016/03/07/martin-and-amys-wedding/", + "title": "Martin and Amy's Wedding Highlights", + "plays": 86 + }, + { + "post_id": 24, + "url": "http://infocusphotographers.com/portfolio/", + "title": "Behind the Scenes: Studio Tour", + "plays": 41 + } + ], + "other_plays": 6, + "total_plays": 133 + } + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_visits.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_visits.json new file mode 100644 index 000000000000..336e4e213370 --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/stats/stats_visits.json @@ -0,0 +1,37 @@ +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/stats/visits/*" + }, + "response": { + "status": 200, + "transformers": [ + "stats-series" + ], + "transformerParameters": { + "fields": [ + { + "name": "views", + "average": 432, + "hourly": true + }, + { + "name": "visitors", + "average": 268 + }, + { + "name": "likes", + "average": 14 + }, + { + "name": "comments", + "average": 6 + }, + { + "name": "posts", + "average": 0.4 + } + ] + } + } +} diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/themes/sites_themes.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/themes/sites_themes.json new file mode 100644 index 000000000000..1ef3068ff24e --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/themes/sites_themes.json @@ -0,0 +1,144 @@ +{ + "request": { + "method": "GET", + "urlPattern": "/wp/v2/sites/.*/themes.*" + }, + "response": { + "status": 200, + "jsonBody": [ + { + "stylesheet": "pub/edin", + "template": "pub/edin", + "requires_php": "", + "requires_wp": "", + "textdomain": "edin", + "version": "1.3.2-wpcom", + "screenshot": "https://s0.wp.com/wp-content/themes/pub/edin/screenshot.png", + "author": { + "raw": "Automattic", + "rendered": "Automattic" + }, + "author_uri": { + "raw": "https://wordpress.com/themes/", + "rendered": "https://wordpress.com/themes/" + }, + "description": { + "raw": "Edin is a modern responsive business and corporate theme that helps you to create a strong--yet beautiful--online presence for your business.", + "rendered": "Edin is a modern responsive business and corporate theme that helps you to create a strong–yet beautiful–online presence for your business." + }, + "name": { + "raw": "Edin", + "rendered": "Edin" + }, + "tags": { + "raw": [ + "Blog", + "Blue", + "breadcrumb-navigation", + "bright", + "business", + "classic-menu", + "clean", + "collaboration", + "conservative", + "Custom Background", + "Custom Colors", + "Custom Header", + "custom-menu", + "design", + "Editor Style", + "elegant", + "Featured Images", + "flexible-header", + "food", + "formal", + "Full Width Template", + "Gray", + "hotel", + "Infinite Scroll", + "Left Sidebar", + "Light", + "Light", + "minimal", + "modern", + "multiple-menus", + "Post Formats", + "professional", + "real-estate", + "Responsive Layout", + "Right Sidebar", + "RTL Language Support", + "school", + "simple", + "site-logo", + "sophisticated", + "Sticky Post", + "testimonials", + "Theme Options", + "traditional", + "Translation Ready", + "Two Columns", + "White" + ], + "rendered": "Blog, Blue, breadcrumb-navigation, bright, business, classic-menu, clean, collaboration, conservative, Custom Background, Custom Colors, Custom Header, custom-menu, design, Editor Style, elegant, Featured Images, flexible-header, food, formal, Full Width Template, Gray, hotel, Infinite Scroll, Left Sidebar, Light, Light, minimal, modern, multiple-menus, Post Formats, professional, real-estate, Responsive Layout, Right Sidebar, RTL Language Support, school, simple, site-logo, sophisticated, Sticky Post, testimonials, Theme Options, traditional, Translation Ready, Two Columns, White" + }, + "theme_uri": { + "raw": "https://wordpress.com/themes/edin/", + "rendered": "https://wordpress.com/themes/edin/" + }, + "theme_supports": { + "align-wide": false, + "automatic-feed-links": true, + "custom-background": { + "default-color": "ffffff", + "default-image": "" + }, + "custom-header": { + "default-image": "", + "default-text-color": "303030", + "width": 1230, + "height": 100, + "flex-width": true, + "flex-height": true + }, + "custom-logo": false, + "customize-selective-refresh-widgets": false, + "dark-editor-style": false, + "disable-custom-colors": false, + "disable-custom-font-sizes": false, + "disable-custom-gradients": false, + "editor-color-palette": false, + "editor-font-sizes": false, + "editor-gradient-presets": false, + "editor-styles": false, + "html5": [ + "search-form", + "comment-form", + "comment-list", + "gallery", + "caption" + ], + "formats": [ + "standard", + "aside", + "image", + "video", + "quote", + "link", + "status", + "gallery" + ], + "post-thumbnails": true, + "responsive-embeds": false, + "title-tag": false, + "wp-block-styles": false + } + } + ], + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/tracks/tracks_record.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/tracks/tracks_record.json new file mode 100644 index 000000000000..fd6d1f5ecacd --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/tracks/tracks_record.json @@ -0,0 +1,19 @@ +{ + "id": "2ad4ffca-6254-4b1e-b005-982ac3b4f8f6", + "name": "rest_v11_tracks_record", + "request": { + "urlPath": "/rest/v1.1/tracks/record", + "method": "POST" + }, + "response": { + "status": 202, + "body": "\"Accepted\"", + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + }, + "uuid": "2ad4ffca-6254-4b1e-b005-982ac3b4f8f6", + "persistent": true +} \ No newline at end of file diff --git a/Tests/JetpackUITests/Fixtures/mappings/wpcom/users/users_suggest.json b/Tests/JetpackUITests/Fixtures/mappings/wpcom/users/users_suggest.json new file mode 100644 index 000000000000..fd558b640b7d --- /dev/null +++ b/Tests/JetpackUITests/Fixtures/mappings/wpcom/users/users_suggest.json @@ -0,0 +1,19 @@ +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/users/suggest" + }, + "response": { + "status": 200, + "jsonBody": { + "suggestions": [ + + ] + }, + "headers": { + "Content-Type": "application/json", + "Connection": "keep-alive", + "Cache-Control": "no-cache, must-revalidate, max-age=0" + } + } +} \ No newline at end of file diff --git a/Tests/JetpackUITests/JetpackUITests.xctestplan b/Tests/JetpackUITests/JetpackUITests.xctestplan new file mode 100644 index 000000000000..c65ceab9af71 --- /dev/null +++ b/Tests/JetpackUITests/JetpackUITests.xctestplan @@ -0,0 +1,31 @@ +{ + "configurations" : [ + { + "id" : "8E6A0C4F-3B1D-4F7A-9C2E-5D8B7A1F0E63", + "name" : "Foundation", + "options" : { + + } + } + ], + "defaultOptions" : { + "codeCoverage" : false, + "language" : "en", + "region" : "US", + "targetForVariableExpansion" : { + "containerPath" : "container:WordPress.xcodeproj", + "identifier" : "FABB1F8F2602FC2C00C8785C", + "name" : "Jetpack" + } + }, + "testTargets" : [ + { + "target" : { + "containerPath" : "container:WordPress.xcodeproj", + "identifier" : "2475322B306C77300075CFDD", + "name" : "JetpackUITests" + } + } + ], + "version" : 1 +} diff --git a/Tests/JetpackUITests/Screens/AboutScreen.swift b/Tests/JetpackUITests/Screens/AboutScreen.swift new file mode 100644 index 000000000000..d8ca28c5859b --- /dev/null +++ b/Tests/JetpackUITests/Screens/AboutScreen.swift @@ -0,0 +1,27 @@ +import XCTest + +/// The About sheet: links to rate and share the app, its blog and the legal notices. +final class AboutScreen: ScreenObject { + private let closeButtonGetter: ElementGetter = { + $0.buttons["Close"] + } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [{ $0.staticTexts["Rate Us"] }, closeButtonGetter], app: app) + } + + func row(_ title: String) -> XCUIElement { + app.staticTexts[title] + } + + func goToLegal() throws -> TitledScreen { + try tap(row("Legal and More")) + return try TitledScreen(title: "Legal and More", app: app) + } + + @discardableResult + func close() throws -> MeScreen { + closeButtonGetter(app).tap() + return try MeScreen(app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/AccountSettingsScreen.swift b/Tests/JetpackUITests/Screens/AccountSettingsScreen.swift new file mode 100644 index 000000000000..b8ba1724fd9b --- /dev/null +++ b/Tests/JetpackUITests/Screens/AccountSettingsScreen.swift @@ -0,0 +1,31 @@ +import XCTest + +/// The WordPress.com account's settings. +final class AccountSettingsScreen: ScreenObject { + /// The rows that push a screen for editing one setting. Each is titled the same as its screen. + enum Setting: String, CaseIterable { + case username = "Username" + case email = "Email" + case changePassword = "Change Password" + case webAddress = "Web Address" + } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [Self.navigationBarTitle("Account Settings")], app: app) + } + + /// The row for a setting. It shows the setting's value beside its title. + func row(_ title: String) -> XCUIElement { + app.tables.cells[title] + } + + func goTo(_ setting: Setting) throws -> TitledScreen { + try tap(row(setting.rawValue)) + return try TitledScreen(title: setting.rawValue, app: app) + } + + func goToPrimarySitePicker() throws -> SheetScreen { + try tap(row("Primary Site")) + return try SheetScreen(title: "Primary Site", dismissButton: "Cancel", app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/ActionSheetComponent.swift b/Tests/JetpackUITests/Screens/ActionSheetComponent.swift new file mode 100644 index 000000000000..2999db8807fd --- /dev/null +++ b/Tests/JetpackUITests/Screens/ActionSheetComponent.swift @@ -0,0 +1,24 @@ +import XCTest + +/// The sheet shown by My Site's create button, for choosing what to create. +final class ActionSheetComponent: ScreenObject { + private let blogPostButtonGetter: ElementGetter = { + $0.buttons["blogPostButton"] + } + + private let sitePageButtonGetter: ElementGetter = { + $0.buttons["sitePageButton"] + } + + var blogPostButton: XCUIElement { blogPostButtonGetter(app) } + var sitePageButton: XCUIElement { sitePageButtonGetter(app) } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [blogPostButtonGetter, sitePageButtonGetter], app: app) + } + + func goToBlogPost() throws -> EditorScreen { + blogPostButton.tap() + return try EditorScreen(app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/ActivityDetailsScreen.swift b/Tests/JetpackUITests/Screens/ActivityDetailsScreen.swift new file mode 100644 index 000000000000..c5bf9b4fe47b --- /dev/null +++ b/Tests/JetpackUITests/Screens/ActivityDetailsScreen.swift @@ -0,0 +1,8 @@ +import XCTest + +/// The details of one activity log event. +final class ActivityDetailsScreen: ScreenObject { + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [Self.navigationBarTitle("Event")], app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/ActivityLogScreen.swift b/Tests/JetpackUITests/Screens/ActivityLogScreen.swift new file mode 100644 index 000000000000..1392294425c0 --- /dev/null +++ b/Tests/JetpackUITests/Screens/ActivityLogScreen.swift @@ -0,0 +1,17 @@ +import XCTest + +/// The site's activity log. +final class ActivityLogScreen: ScreenObject { + private let listGetter: ElementGetter = { + $0.collectionViews["activity_logs_list"] + } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [listGetter, Self.navigationBarTitle("Activity")], app: app) + } + + func goToFirstActivity() throws -> ActivityDetailsScreen { + try tapFirst(firstRow(in: listGetter(app)), named: "activity") + return try ActivityDetailsScreen(app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/AppSettingsScreen.swift b/Tests/JetpackUITests/Screens/AppSettingsScreen.swift new file mode 100644 index 000000000000..17b52485075c --- /dev/null +++ b/Tests/JetpackUITests/Screens/AppSettingsScreen.swift @@ -0,0 +1,40 @@ +import XCTest + +/// The app's own settings, which it stores on the device. +final class AppSettingsScreen: ScreenObject { + /// The rows that push another screen, each with the title of the screen it pushes. + enum Section: String, CaseIterable { + case maxVideoUploadSize = "Max Video Upload Size" + case mediaCache = "Media Cache" + case privacySettings = "Privacy Settings" + case appearance = "Appearance" + case appIcon = "App Icon" + case experimentalFeatures = "Experimental Features" + case savedPosts = "Saved Posts" + case designSystem = "Design System" + + var screenTitle: String { + switch self { + case .maxVideoUploadSize: "Resolution" + default: rawValue + } + } + } + + private let tableGetter: ElementGetter = { + $0.tables["appSettingsTable"] + } + + var table: XCUIElement { tableGetter(app) } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [tableGetter, Self.navigationBarTitle("App Settings")], app: app) + } + + func goTo(_ section: Section) throws -> TitledScreen { + let row = table.staticTexts[section.rawValue] + try scroll(to: row, in: table) + row.tap() + return try TitledScreen(title: section.screenTitle, app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/BlazeCampaignsScreen.swift b/Tests/JetpackUITests/Screens/BlazeCampaignsScreen.swift new file mode 100644 index 000000000000..f4da19a0f5f5 --- /dev/null +++ b/Tests/JetpackUITests/Screens/BlazeCampaignsScreen.swift @@ -0,0 +1,8 @@ +import XCTest + +/// The site's Blaze campaigns list. +final class BlazeCampaignsScreen: ScreenObject { + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [Self.navigationBarTitle("Blaze Campaigns")], app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/BlazeOverlayScreen.swift b/Tests/JetpackUITests/Screens/BlazeOverlayScreen.swift new file mode 100644 index 000000000000..7ef260653754 --- /dev/null +++ b/Tests/JetpackUITests/Screens/BlazeOverlayScreen.swift @@ -0,0 +1,24 @@ +import XCTest + +/// The sheet introducing Blaze, shown before any campaign is created. +final class BlazeOverlayScreen: ScreenObject { + private let navigationBarGetter: ElementGetter = { + $0.navigationBars["WordPress.BlazeOverlayView"] + } + + private let closeButtonGetter: ElementGetter = { + $0.navigationBars["WordPress.BlazeOverlayView"].buttons["close-button"] + } + + var closeButton: XCUIElement { closeButtonGetter(app) } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [navigationBarGetter, closeButtonGetter], app: app) + } + + @discardableResult + func close() throws -> MySiteScreen { + closeButton.tap() + return try MySiteScreen(app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/ChartDataScreen.swift b/Tests/JetpackUITests/Screens/ChartDataScreen.swift new file mode 100644 index 000000000000..cc82a907d286 --- /dev/null +++ b/Tests/JetpackUITests/Screens/ChartDataScreen.swift @@ -0,0 +1,22 @@ +import XCTest + +/// The sheet listing the values behind the chart card. +final class ChartDataScreen: ScreenObject { + private let navigationBarGetter: ElementGetter = { + $0.navigationBars["Chart Data"] + } + + private let closeButtonGetter: ElementGetter = { + $0.navigationBars["Chart Data"].buttons["Close"] + } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [navigationBarGetter, closeButtonGetter], app: app) + } + + @discardableResult + func close() throws -> StatsScreen { + closeButtonGetter(app).tap() + return try StatsScreen(app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/CommentDetailsScreen.swift b/Tests/JetpackUITests/Screens/CommentDetailsScreen.swift new file mode 100644 index 000000000000..837ccf17ae93 --- /dev/null +++ b/Tests/JetpackUITests/Screens/CommentDetailsScreen.swift @@ -0,0 +1,12 @@ +import XCTest + +/// The details of one comment. +final class CommentDetailsScreen: ScreenObject { + private let replyButtonGetter: ElementGetter = { + $0.buttons["reply-comment-button"] + } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [replyButtonGetter], app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/CommentsScreen.swift b/Tests/JetpackUITests/Screens/CommentsScreen.swift new file mode 100644 index 000000000000..86dea106a7f9 --- /dev/null +++ b/Tests/JetpackUITests/Screens/CommentsScreen.swift @@ -0,0 +1,38 @@ +import XCTest + +/// The site's comments list. +final class CommentsScreen: ScreenObject { + enum Filter: String, CaseIterable { + case all, pending, unreplied, approved, spam, trashed + } + + private let tableGetter: ElementGetter = { + $0.tables["Comments Table"] + } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [tableGetter, Self.navigationBarTitle("Comments")], app: app) + } + + @discardableResult + func select(_ filter: Filter) throws -> Self { + try select(tab: tab(for: filter)) + return self + } + + /// Waits for `filter` to be the selected one, without tapping it. + @discardableResult + func waitForSelection(of filter: Filter) throws -> Self { + try waitForSelection(of: tab(for: filter)) + return self + } + + func goToFirstComment() throws -> CommentDetailsScreen { + try tapFirst(tableGetter(app).cells.firstMatch, named: "comments under this filter") + return try CommentDetailsScreen(app: app) + } + + private func tab(for filter: Filter) -> XCUIElement { + app.buttons[filter.rawValue] + } +} diff --git a/Tests/JetpackUITests/Screens/CustomDateRangeScreen.swift b/Tests/JetpackUITests/Screens/CustomDateRangeScreen.swift new file mode 100644 index 000000000000..f3539fced872 --- /dev/null +++ b/Tests/JetpackUITests/Screens/CustomDateRangeScreen.swift @@ -0,0 +1,22 @@ +import XCTest + +/// The sheet for picking the stats' date range by its start and end dates. +final class CustomDateRangeScreen: ScreenObject { + private let navigationBarGetter: ElementGetter = { + $0.navigationBars["Select Range"] + } + + private let cancelButtonGetter: ElementGetter = { + $0.navigationBars["Select Range"].buttons["Cancel"] + } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [navigationBarGetter, cancelButtonGetter], app: app) + } + + @discardableResult + func cancel() throws -> StatsScreen { + cancelButtonGetter(app).tap() + return try StatsScreen(app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/DomainDetailsScreen.swift b/Tests/JetpackUITests/Screens/DomainDetailsScreen.swift new file mode 100644 index 000000000000..ae878a875370 --- /dev/null +++ b/Tests/JetpackUITests/Screens/DomainDetailsScreen.swift @@ -0,0 +1,21 @@ +import XCTest + +/// The management page for one of the site's domains, shown in a web view. +final class DomainDetailsScreen: ScreenObject { + private let dismissButtonGetter: ElementGetter = { + $0.buttons["Dismiss"] + } + + var dismissButton: XCUIElement { dismissButtonGetter(app) } + + /// - Parameter domain: The domain name, which the screen shows as its title. + init(domain: String, app: XCUIApplication) throws { + try super.init(expectedElementGetters: [{ $0.navigationBars[domain] }, dismissButtonGetter], app: app) + } + + @discardableResult + func dismiss() throws -> DomainsScreen { + dismissButton.tap() + return try DomainsScreen(app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/DomainsScreen.swift b/Tests/JetpackUITests/Screens/DomainsScreen.swift new file mode 100644 index 000000000000..8c285481bb5f --- /dev/null +++ b/Tests/JetpackUITests/Screens/DomainsScreen.swift @@ -0,0 +1,19 @@ +import XCTest + +/// The site's domains list. +final class DomainsScreen: ScreenObject { + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [Self.navigationBarTitle("Site Domains")], app: app) + } + + /// Opens the first domain that has a management page. The site's free WordPress.com domain + /// doesn't have one. + func goToFirstDomain() throws -> DomainDetailsScreen { + let row = app.buttons["site-domain-row"].firstMatch + try tapFirst(row, named: "domains with a management page") + + // The row's label starts with the domain name: "example.com, Active, Expires on…". + let domain = String(row.label.prefix { $0 != "," }) + return try DomainDetailsScreen(domain: domain, app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/EditorScreen.swift b/Tests/JetpackUITests/Screens/EditorScreen.swift new file mode 100644 index 000000000000..bc63885b3754 --- /dev/null +++ b/Tests/JetpackUITests/Screens/EditorScreen.swift @@ -0,0 +1,49 @@ +import XCTest + +/// The editor for a post or page. +/// +/// New posts and posts with block content open in the block editor, and older posts in the classic +/// editor. Both have the close button this screen is identified by. +final class EditorScreen: ScreenObject { + private let closeButtonGetter: ElementGetter = { + $0.buttons["editor-close-button"] + } + + var closeButton: XCUIElement { closeButtonGetter(app) } + + init(app: XCUIApplication) throws { + Self.declineAutosave(in: app, coveringEditorWith: closeButtonGetter(app)) + try super.init(expectedElementGetters: [closeButtonGetter], app: app) + } + + /// Closes the editor. If the post has changes, discards them from the confirmation sheet. + func close() { + closeButton.tap() + + let confirmation = app.sheets["post-has-changes-alert"] + if confirmation.pollForExistence(timeout: 3) { + // "Discard Draft" for a new post, "Discard Changes" for an existing one. + confirmation.buttons.matching(NSPredicate(format: "label BEGINSWITH 'Discard'")).firstMatch.tap() + } + } + + /// Closes an editor opened from My Site, discarding any changes. + @discardableResult + func closeAndDiscardChanges() throws -> MySiteScreen { + close() + return try MySiteScreen(app: app) + } + + /// A post with a newer autosave on the server opens with an alert offering to load it, which + /// covers the editor. Declining leaves the post as it is. + private static func declineAutosave(in app: XCUIApplication, coveringEditorWith closeButton: XCUIElement) { + let alert = app.alerts["Autosave Available"] + let deadline = Date(timeIntervalSinceNow: defaultWaitTimeout) + + while !closeButton.isHittable, Date() < deadline { + if alert.exists { + alert.buttons["Cancel"].tap() + } + } + } +} diff --git a/Tests/JetpackUITests/Screens/GravatarProfileScreen.swift b/Tests/JetpackUITests/Screens/GravatarProfileScreen.swift new file mode 100644 index 000000000000..46b674c8c905 --- /dev/null +++ b/Tests/JetpackUITests/Screens/GravatarProfileScreen.swift @@ -0,0 +1,18 @@ +import XCTest + +/// The sheet for editing the account's Gravatar profile, opened from My Profile. +final class GravatarProfileScreen: ScreenObject { + private let doneButtonGetter: ElementGetter = { + $0.buttons["Done"] + } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [{ $0.staticTexts["Gravatar"] }, doneButtonGetter], app: app) + } + + @discardableResult + func done() throws -> MeScreen { + doneButtonGetter(app).tap() + return try MeScreen(app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/HelpScreen.swift b/Tests/JetpackUITests/Screens/HelpScreen.swift new file mode 100644 index 000000000000..c09947081faf --- /dev/null +++ b/Tests/JetpackUITests/Screens/HelpScreen.swift @@ -0,0 +1,23 @@ +import XCTest + +/// Help & Support: the ways to reach support, and the app's version and logs. +final class HelpScreen: ScreenObject { + private let helpCenterRowGetter: ElementGetter = { + $0.cells["help-center-link-button"] + } + + var contactSupportRow: XCUIElement { app.cells["contact-support-button"] } + var ticketsRow: XCUIElement { app.cells["my-tickets-button"] } + var contactEmailRow: XCUIElement { app.cells["set-contact-email-button"] } + var versionRow: XCUIElement { app.cells["Version"] } + var logsRow: XCUIElement { app.cells["activity-logs-button"] } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [Self.navigationBarTitle("Help"), helpCenterRowGetter], app: app) + } + + func goToLogs() throws -> TitledScreen { + try tap(logsRow) + return try TitledScreen(title: "Activity Logs", app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/ManageStatsCardsScreen.swift b/Tests/JetpackUITests/Screens/ManageStatsCardsScreen.swift new file mode 100644 index 000000000000..a687a3556ef0 --- /dev/null +++ b/Tests/JetpackUITests/Screens/ManageStatsCardsScreen.swift @@ -0,0 +1,22 @@ +import XCTest + +/// The sheet for choosing which cards the Insights tab shows. +final class ManageStatsCardsScreen: ScreenObject { + private let navigationBarGetter: ElementGetter = { + $0.navigationBars["Manage Stats Cards"] + } + + private let closeButtonGetter: ElementGetter = { + $0.navigationBars["Manage Stats Cards"].buttons.firstMatch + } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [navigationBarGetter, closeButtonGetter], app: app) + } + + @discardableResult + func close() throws -> StatsScreen { + closeButtonGetter(app).tap() + return try StatsScreen(app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/MeScreen.swift b/Tests/JetpackUITests/Screens/MeScreen.swift new file mode 100644 index 000000000000..43bfc658637c --- /dev/null +++ b/Tests/JetpackUITests/Screens/MeScreen.swift @@ -0,0 +1,47 @@ +import XCTest + +/// The Me tab: the account, its settings and the app's settings. +final class MeScreen: ScreenObject { + private let tableGetter: ElementGetter = { + $0.tables["Me Table"] + } + + var table: XCUIElement { tableGetter(app) } + var displayName: XCUIElement { app.staticTexts["Display Name"] } + var username: XCUIElement { app.staticTexts["Username"] } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [tableGetter], app: app) + } + + func goToMyProfile() throws -> GravatarProfileScreen { + try open(table.cells["myProfile"]) + return try GravatarProfileScreen(app: app) + } + + func goToAccountSettings() throws -> AccountSettingsScreen { + try open(table.cells["accountSettings"]) + return try AccountSettingsScreen(app: app) + } + + func goToAppSettings() throws -> AppSettingsScreen { + try open(table.cells["appSettings"]) + return try AppSettingsScreen(app: app) + } + + func goToHelp() throws -> HelpScreen { + // This row has no identifier. + try open(table.cells.containing(.staticText, identifier: "Help & Support").firstMatch) + return try HelpScreen(app: app) + } + + func goToAbout() throws -> AboutScreen { + try open(table.cells["About"]) + return try AboutScreen(app: app) + } + + private func open(_ row: XCUIElement) throws { + try scroll(to: row, in: table) + row.tap() + } +} diff --git a/Tests/JetpackUITests/Screens/MediaScreen.swift b/Tests/JetpackUITests/Screens/MediaScreen.swift new file mode 100644 index 000000000000..b5c125f708b5 --- /dev/null +++ b/Tests/JetpackUITests/Screens/MediaScreen.swift @@ -0,0 +1,8 @@ +import XCTest + +/// The site's media library. +final class MediaScreen: ScreenObject { + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [Self.navigationBarTitle("Media")], app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/MenuComponent.swift b/Tests/JetpackUITests/Screens/MenuComponent.swift new file mode 100644 index 000000000000..b24757efdf21 --- /dev/null +++ b/Tests/JetpackUITests/Screens/MenuComponent.swift @@ -0,0 +1,41 @@ +import XCTest + +/// A menu or popover of buttons, opened from another button. +final class MenuComponent: ScreenObject { + /// - Parameter item: The title of an item the menu is known to contain, which identifies it. + init(expecting item: String, app: XCUIApplication) throws { + try super.init(expectedElementGetters: [{ $0.buttons[item] }], app: app) + } + + func item(_ title: String) -> XCUIElement { + app.buttons[title] + } + + /// The item whose title starts with `prefix`. Some items append their current value to their + /// title, such as "Compare With…, Preceding Period". + func item(beginningWith prefix: String) -> XCUIElement { + app.buttons.matching(NSPredicate(format: "label BEGINSWITH %@", prefix)).firstMatch + } + + /// Waits for the menu to show every one of `titles`. + @discardableResult + func waitForItems(_ titles: [String]) throws -> Self { + for title in titles { + try waitFor(item(title)) + } + return self + } + + /// Taps an item. Returns the menu, because an item that opens a submenu shows more items. + @discardableResult + func select(_ title: String) throws -> Self { + try tap(item(title)) + return self + } + + @discardableResult + func select(beginningWith prefix: String) throws -> Self { + try tap(item(beginningWith: prefix)) + return self + } +} diff --git a/Tests/JetpackUITests/Screens/MenusScreen.swift b/Tests/JetpackUITests/Screens/MenusScreen.swift new file mode 100644 index 000000000000..c54b656779b1 --- /dev/null +++ b/Tests/JetpackUITests/Screens/MenusScreen.swift @@ -0,0 +1,8 @@ +import XCTest + +/// The site's navigation menus editor. +final class MenusScreen: ScreenObject { + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [Self.navigationBarTitle("Menus")], app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/MySiteScreen+Dashboard.swift b/Tests/JetpackUITests/Screens/MySiteScreen+Dashboard.swift new file mode 100644 index 000000000000..add8e4f58c85 --- /dev/null +++ b/Tests/JetpackUITests/Screens/MySiteScreen+Dashboard.swift @@ -0,0 +1,141 @@ +import XCTest + +/// Navigation from the cards on My Site's dashboard. +extension MySiteScreen { + enum DashboardCard: String { + case prompts + case blaze + case todaysStats = "todays_stats_new" + case draftPosts + case pages + case activityLog = "activity_log" + case personalize + } + + // MARK: - Cards + + func goToStatsFromDashboardCard() throws -> StatsScreen { + try scrollAndTap(cell(for: .todaysStats)) + return try StatsScreen(app: app) + } + + func goToBlazeFromDashboardCard() throws -> BlazeOverlayScreen { + try scrollAndTap(cell(for: .blaze)) + return try BlazeOverlayScreen(app: app) + } + + func goToPersonalizeHomeScreen() throws -> PersonalizeHomeScreen { + try scrollAndTap(cell(for: .personalize)) + return try PersonalizeHomeScreen(app: app) + } + + func goToPromptResponsesFromDashboardCard() throws -> PromptResponsesScreen { + try scrollAndTap(cell(for: .prompts).buttons["View all responses"]) + return try PromptResponsesScreen(app: app) + } + + // MARK: - Card Headers + + func goToDraftsFromDashboardCard() throws -> PostsScreen { + try scrollAndTap(header(of: .draftPosts)) + return try PostsScreen(app: app) + } + + func goToPagesFromDashboardCard() throws -> PagesScreen { + try scrollAndTap(header(of: .pages)) + return try PagesScreen(app: app) + } + + func goToActivityLogFromDashboardCard() throws -> ActivityLogScreen { + try scrollAndTap(header(of: .activityLog)) + return try ActivityLogScreen(app: app) + } + + // MARK: - Card Rows + + func goToFirstDraftFromDashboardCard() throws -> EditorScreen { + try scrollAndTap(cell(for: .draftPosts).tables.cells.firstMatch) + return try EditorScreen(app: app) + } + + func goToFirstPageFromDashboardCard() throws -> EditorScreen { + try scrollAndTap(cell(for: .pages).tables.cells.firstMatch) + return try EditorScreen(app: app) + } + + func goToFirstActivityFromDashboardCard() throws -> ActivityDetailsScreen { + // The header and the menu button are the card's only buttons with an identifier. + let rows = try cell(for: .activityLog).buttons.matching(NSPredicate(format: "identifier == ''")) + try scrollAndTap(rows.firstMatch) + return try ActivityDetailsScreen(app: app) + } + + // MARK: - Card Menus + + func goToDraftsFromDashboardCardMenu() throws -> PostsScreen { + try tapMenuItem("View all drafts", of: .draftPosts) + return try PostsScreen(app: app) + } + + func goToPagesFromDashboardCardMenu() throws -> PagesScreen { + try tapMenuItem("All pages", of: .pages) + return try PagesScreen(app: app) + } + + func goToActivityLogFromDashboardCardMenu() throws -> ActivityLogScreen { + try tapMenuItem("All activity", of: .activityLog) + return try ActivityLogScreen(app: app) + } + + func goToPromptsListFromDashboardCardMenu() throws -> PromptsListScreen { + try tapMenuItem("View more prompts", of: .prompts) + return try PromptsListScreen(app: app) + } + + func goToPromptsIntroductionFromDashboardCardMenu() throws -> PromptsIntroductionScreen { + try tapMenuItem("Learn more", of: .prompts) + return try PromptsIntroductionScreen(app: app) + } + + func goToBlazeFromDashboardCardMenu() throws -> BlazeOverlayScreen { + try tapMenuItem("Learn more", of: .blaze) + return try BlazeOverlayScreen(app: app) + } + + // MARK: - Helpers + + /// The cell for a card, once the dashboard has loaded. + /// + /// The dashboard only shows a card when the site has something to put in it: the Activity Log + /// card needs recent activity, the Draft Posts card needs a draft. Not having that isn't a + /// failure of the app, so this skips the test instead. + private func cell(for card: DashboardCard) throws -> XCUIElement { + let cards = app.collectionViews.cells + try wait(until: "the dashboard's cards") { + // The Personalize card is always last, and placeholders stand in for the rest while + // they load. + cards["dashboard-card-personalize"].exists && !cards["dashboard-card-ghost"].firstMatch.exists + } + + let cell = cards["dashboard-card-\(card.rawValue)"] + guard cell.exists else { + throw XCTSkip("The dashboard isn't showing the \(card) card for this site") + } + return cell + } + + private func header(of card: DashboardCard) throws -> XCUIElement { + try cell(for: card).buttons["dashboard-card-header"] + } + + private func scrollAndTap(_ element: XCUIElement) throws { + try scroll(to: element, in: content) + element.tap() + } + + private func tapMenuItem(_ title: String, of card: DashboardCard) throws { + try scrollAndTap(cell(for: card).buttons["dashboard-card-more-button"]) + try waitFor(app.buttons[title]) + app.buttons[title].tap() + } +} diff --git a/Tests/JetpackUITests/Screens/MySiteScreen+Tabs.swift b/Tests/JetpackUITests/Screens/MySiteScreen+Tabs.swift new file mode 100644 index 000000000000..e39c2de22ac0 --- /dev/null +++ b/Tests/JetpackUITests/Screens/MySiteScreen+Tabs.swift @@ -0,0 +1,19 @@ +import XCTest + +/// Navigation to the app's other tabs. +extension MySiteScreen { + func goToReader() throws -> ReaderScreen { + try tap(app.buttons["tabbar_reader"]) + return try ReaderScreen(app: app) + } + + func goToNotifications() throws -> NotificationsScreen { + try tap(app.buttons["tabbar_notifications"]) + return try NotificationsScreen(app: app) + } + + func goToMe() throws -> MeScreen { + try tap(app.buttons["tabbar_me"]) + return try MeScreen(app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/MySiteScreen.swift b/Tests/JetpackUITests/Screens/MySiteScreen.swift new file mode 100644 index 000000000000..94d523ec40dc --- /dev/null +++ b/Tests/JetpackUITests/Screens/MySiteScreen.swift @@ -0,0 +1,71 @@ +import XCTest + +/// The home screen for the selected site. +final class MySiteScreen: ScreenObject { + private let contentGetter: ElementGetter = { + $0.otherElements["my_site"] + } + + private let createButtonGetter: ElementGetter = { + $0.buttons["floatingCreateButton"] + } + + /// The scroll view holding the header, the quick actions and the dashboard cards. + var content: XCUIElement { contentGetter(app) } + var createButton: XCUIElement { createButtonGetter(app) } + var switchSiteButton: XCUIElement { app.buttons["switch-site-button"] } + var siteTitle: XCUIElement { app.buttons["site-title-button"] } + var siteURL: XCUIElement { app.buttons["site-url-button"] } + + /// Signing in syncs the account's sites before My Site appears, so this waits longer than + /// most screens by default. + /// + /// The screen is identified by its container rather than its header, because the header + /// scrolls out of view with the content. + init(app: XCUIApplication, waitTimeout: TimeInterval = 60) throws { + let expectedElementGetters = [contentGetter, createButtonGetter] + try super.init(expectedElementGetters: expectedElementGetters, app: app, waitTimeout: waitTimeout) + } + + func goToCreateSheet() throws -> ActionSheetComponent { + try tap(createButton) + return try ActionSheetComponent(app: app) + } + + func goToNewPost() throws -> EditorScreen { + try goToCreateSheet() + .goToBlogPost() + } + + func goToSitePicker() throws -> SitePickerScreen { + try tap(switchSiteButton) + return try SitePickerScreen(app: app) + } + + // MARK: - Quick Actions + + func goToStats() throws -> StatsScreen { + try tap(app.cells["quick_actions_stats"]) + return try StatsScreen(app: app) + } + + func goToPosts() throws -> PostsScreen { + try tap(app.cells["quick_actions_posts"]) + return try PostsScreen(app: app) + } + + func goToPages() throws -> PagesScreen { + try tap(app.cells["quick_actions_pages"]) + return try PagesScreen(app: app) + } + + func goToMedia() throws -> MediaScreen { + try tap(app.cells["quick_actions_media"]) + return try MediaScreen(app: app) + } + + func goToSiteMenu() throws -> SiteMenuScreen { + try tap(app.cells["quick_actions_more"]) + return try SiteMenuScreen(app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/NotificationDetailsScreen.swift b/Tests/JetpackUITests/Screens/NotificationDetailsScreen.swift new file mode 100644 index 000000000000..d4adc413c4ef --- /dev/null +++ b/Tests/JetpackUITests/Screens/NotificationDetailsScreen.swift @@ -0,0 +1,22 @@ +import XCTest + +/// The details of one notification. +final class NotificationDetailsScreen: ScreenObject { + /// - Parameter title: What the notification is about, which titles the screen: "6 Likes", + /// "Comment", "5 Followers". + init(title: String, app: XCUIApplication) throws { + try super.init(expectedElementGetters: [{ $0.navigationBars[title] }], app: app) + } + + /// Steps to the newer notification, the one above this one in the list. + func goToNextNotification(titled title: String) throws -> NotificationDetailsScreen { + try tap(app.buttons["Next notification"]) + return try NotificationDetailsScreen(title: title, app: app) + } + + /// Steps to the older notification, the one below this one in the list. + func goToPreviousNotification(titled title: String) throws -> NotificationDetailsScreen { + try tap(app.buttons["Previous notification"]) + return try NotificationDetailsScreen(title: title, app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/NotificationsScreen.swift b/Tests/JetpackUITests/Screens/NotificationsScreen.swift new file mode 100644 index 000000000000..695d2b597ee8 --- /dev/null +++ b/Tests/JetpackUITests/Screens/NotificationsScreen.swift @@ -0,0 +1,54 @@ +import XCTest + +/// The Notifications tab. +final class NotificationsScreen: ScreenObject { + enum Filter: String, CaseIterable { + case unread + case comments = "comment" + case subscribers = "follow" + case likes = "like" + case all = "none" + } + + private let tableGetter: ElementGetter = { + $0.tables["notifications-table"] + } + + var table: XCUIElement { tableGetter(app) } + + /// The notifications listed under the selected filter. + var notifications: XCUIElementQuery { table.cells } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [tableGetter], app: app) + } + + @discardableResult + func select(_ filter: Filter) throws -> Self { + try select(tab: app.buttons[filter.rawValue]) + return self + } + + /// The notification whose text starts with `prefix`. + func notification(beginningWith prefix: String) -> XCUIElement { + table.cells.containing(NSPredicate(format: "label BEGINSWITH %@", prefix)).firstMatch + } + + /// Opens a notification. Its details are titled with what it's about, such as "6 Likes". + func goToNotification(beginningWith prefix: String, titled title: String) throws -> NotificationDetailsScreen { + let row = notification(beginningWith: prefix) + try scroll(to: row, in: table) + row.tap() + return try NotificationDetailsScreen(title: title, app: app) + } + + func openMenu() throws -> MenuComponent { + try tap(app.navigationBars["Notifications"].buttons["Navigation Bar Menu Button"]) + return try MenuComponent(expecting: "Notification Settings", app: app) + } + + func goToNotificationSettings() throws -> SheetScreen { + try openMenu().select("Notification Settings") + return try SheetScreen(title: "Notification Settings", dismissButton: "Done", app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/PagesScreen.swift b/Tests/JetpackUITests/Screens/PagesScreen.swift new file mode 100644 index 000000000000..9b5cdc065190 --- /dev/null +++ b/Tests/JetpackUITests/Screens/PagesScreen.swift @@ -0,0 +1,39 @@ +import XCTest + +/// The site's pages list. +final class PagesScreen: ScreenObject { + enum Filter: String, CaseIterable { + case published, drafts, scheduled, trashed + } + + private let tableGetter: ElementGetter = { + $0.tables["PagesTable"] + } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [tableGetter, Self.navigationBarTitle("Pages")], app: app) + } + + @discardableResult + func select(_ filter: Filter) throws -> Self { + try select(tab: tab(for: filter)) + return self + } + + /// Waits for `filter` to be the selected one, without tapping it. + @discardableResult + func waitForSelection(of filter: Filter) throws -> Self { + try waitForSelection(of: tab(for: filter)) + return self + } + + func goToFirstPage() throws -> EditorScreen { + try tapFirst(tableGetter(app).cells.firstMatch, named: "pages under this filter") + return try EditorScreen(app: app) + } + + private func tab(for filter: Filter) -> XCUIElement { + // The list exposes its filter tabs twice in the accessibility tree. + tableGetter(app).buttons[filter.rawValue].firstMatch + } +} diff --git a/Tests/JetpackUITests/Screens/PersonalizeHomeScreen.swift b/Tests/JetpackUITests/Screens/PersonalizeHomeScreen.swift new file mode 100644 index 000000000000..b7cbf63d7e88 --- /dev/null +++ b/Tests/JetpackUITests/Screens/PersonalizeHomeScreen.swift @@ -0,0 +1,24 @@ +import XCTest + +/// The sheet for choosing which shortcuts and cards My Site shows. +final class PersonalizeHomeScreen: ScreenObject { + private let navigationBarGetter: ElementGetter = { + $0.navigationBars["Personalize Home Screen"] + } + + private let closeButtonGetter: ElementGetter = { + $0.navigationBars["Personalize Home Screen"].buttons["xmark"] + } + + var closeButton: XCUIElement { closeButtonGetter(app) } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [navigationBarGetter, closeButtonGetter], app: app) + } + + @discardableResult + func close() throws -> MySiteScreen { + closeButton.tap() + return try MySiteScreen(app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/PostsScreen.swift b/Tests/JetpackUITests/Screens/PostsScreen.swift new file mode 100644 index 000000000000..502e663888ee --- /dev/null +++ b/Tests/JetpackUITests/Screens/PostsScreen.swift @@ -0,0 +1,39 @@ +import XCTest + +/// The site's posts list. +final class PostsScreen: ScreenObject { + enum Filter: String, CaseIterable { + case published, drafts, scheduled, trashed + } + + private let tableGetter: ElementGetter = { + $0.tables["PostsTable"] + } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [tableGetter, Self.navigationBarTitle("Posts")], app: app) + } + + @discardableResult + func select(_ filter: Filter) throws -> Self { + try select(tab: tab(for: filter)) + return self + } + + /// Waits for `filter` to be the selected one, without tapping it. + @discardableResult + func waitForSelection(of filter: Filter) throws -> Self { + try waitForSelection(of: tab(for: filter)) + return self + } + + func goToFirstPost() throws -> EditorScreen { + try tapFirst(tableGetter(app).cells.firstMatch, named: "posts under this filter") + return try EditorScreen(app: app) + } + + private func tab(for filter: Filter) -> XCUIElement { + // The list exposes its filter tabs twice in the accessibility tree. + tableGetter(app).buttons[filter.rawValue].firstMatch + } +} diff --git a/Tests/JetpackUITests/Screens/PromptResponsesScreen.swift b/Tests/JetpackUITests/Screens/PromptResponsesScreen.swift new file mode 100644 index 000000000000..86ced2975f5d --- /dev/null +++ b/Tests/JetpackUITests/Screens/PromptResponsesScreen.swift @@ -0,0 +1,12 @@ +import XCTest + +/// The Reader's list of posts answering a blogging prompt. +final class PromptResponsesScreen: ScreenObject { + private let tableGetter: ElementGetter = { + $0.tables["reader_table_view"] + } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [tableGetter], app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/PromptsIntroductionScreen.swift b/Tests/JetpackUITests/Screens/PromptsIntroductionScreen.swift new file mode 100644 index 000000000000..8a8b34a52a6e --- /dev/null +++ b/Tests/JetpackUITests/Screens/PromptsIntroductionScreen.swift @@ -0,0 +1,24 @@ +import XCTest + +/// The sheet introducing blogging prompts. +final class PromptsIntroductionScreen: ScreenObject { + private let navigationBarGetter: ElementGetter = { + $0.navigationBars["Introducing Blogging Prompts"] + } + + private let closeButtonGetter: ElementGetter = { + $0.navigationBars["Introducing Blogging Prompts"].buttons["close-button"] + } + + var closeButton: XCUIElement { closeButtonGetter(app) } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [navigationBarGetter, closeButtonGetter], app: app) + } + + @discardableResult + func close() throws -> MySiteScreen { + closeButton.tap() + return try MySiteScreen(app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/PromptsListScreen.swift b/Tests/JetpackUITests/Screens/PromptsListScreen.swift new file mode 100644 index 000000000000..0343ebf3a2da --- /dev/null +++ b/Tests/JetpackUITests/Screens/PromptsListScreen.swift @@ -0,0 +1,12 @@ +import XCTest + +/// The list of recent blogging prompts. +final class PromptsListScreen: ScreenObject { + private let tableGetter: ElementGetter = { + $0.tables["Blogging Prompts List"] + } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [tableGetter], app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/ReaderPostScreen.swift b/Tests/JetpackUITests/Screens/ReaderPostScreen.swift new file mode 100644 index 000000000000..b42474d0cd14 --- /dev/null +++ b/Tests/JetpackUITests/Screens/ReaderPostScreen.swift @@ -0,0 +1,22 @@ +import XCTest + +/// One post, opened in the Reader. +final class ReaderPostScreen: ScreenObject { + private let saveButtonGetter: ElementGetter = { + $0.buttons["Save post"] + } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [saveButtonGetter], app: app) + } + + /// The button naming the post's author, which also carries the date it was published. + func author(named name: String) -> XCUIElement { + app.buttons.matching(NSPredicate(format: "label BEGINSWITH %@", name)).firstMatch + } + + /// The button naming the site the post is on. + func site(named name: String) -> XCUIElement { + app.buttons[name] + } +} diff --git a/Tests/JetpackUITests/Screens/ReaderScreen.swift b/Tests/JetpackUITests/Screens/ReaderScreen.swift new file mode 100644 index 000000000000..67462548f125 --- /dev/null +++ b/Tests/JetpackUITests/Screens/ReaderScreen.swift @@ -0,0 +1,74 @@ +import XCTest + +/// The Reader tab's menu of streams: Recent, Discover, Saved and so on, then the subscriptions, +/// lists and tags. +final class ReaderScreen: ScreenObject { + enum Stream: String, CaseIterable { + case recent + case saved + case likes + case search + // The app's identifier is misspelled. + case subscriptions = "subscrtipions" + + var title: String { + switch self { + case .recent: "Recent" + case .saved: "Saved" + case .likes: "Likes" + case .search: "Search" + case .subscriptions: "Subscriptions" + } + } + } + + private let menuGetter: ElementGetter = { + $0.collectionViews["reader_sidebar"] + } + + var menu: XCUIElement { menuGetter(app) } + + init(app: XCUIApplication) throws { + Self.returnToMenu(in: app, menu: menuGetter(app)) + try super.init(expectedElementGetters: [menuGetter], app: app) + } + + func goTo(_ stream: Stream) throws -> ReaderStreamScreen { + try tap(app.descendants(matching: .any).matching(identifier: "reader_sidebar_\(stream.rawValue)").firstMatch) + return try ReaderStreamScreen(title: stream.title, app: app) + } + + /// Opens the stream of a site the account is subscribed to. + func goToSubscription(named name: String) throws -> ReaderStreamScreen { + let row = menu.staticTexts[name] + try scroll(to: row, in: menu) + row.tap() + return try ReaderStreamScreen(title: name, app: app) + } + + /// Switches the menu to and from the mode for reordering and removing its items. + @discardableResult + func toggleEditing() throws -> Self { + let editButton = app.navigationBars["Reader"].buttons["Edit"] + if editButton.exists { + editButton.tap() + try waitFor(app.navigationBars["Reader"].buttons["checkmark"]) + } else { + try tap(app.navigationBars["Reader"].buttons["checkmark"]) + try waitFor(editButton) + } + return self + } + + /// The tab reopens on the stream it last showed, so this goes back from that to the menu. + private static func returnToMenu(in app: XCUIApplication, menu: XCUIElement) { + let backButton = app.navigationBars.buttons["BackButton"].firstMatch + let deadline = Date(timeIntervalSinceNow: defaultWaitTimeout) + + while !menu.exists, Date() < deadline { + if backButton.exists { + backButton.tap() + } + } + } +} diff --git a/Tests/JetpackUITests/Screens/ReaderStreamScreen.swift b/Tests/JetpackUITests/Screens/ReaderStreamScreen.swift new file mode 100644 index 000000000000..cc80e2756d89 --- /dev/null +++ b/Tests/JetpackUITests/Screens/ReaderStreamScreen.swift @@ -0,0 +1,54 @@ +import XCTest + +/// A list of posts in the Reader: one of its streams, or the posts of one site. +final class ReaderStreamScreen: ScreenObject { + /// - Parameter title: The stream's title, which is the identifier of its navigation bar. + init(title: String, app: XCUIApplication) throws { + try super.init(expectedElementGetters: [{ $0.navigationBars[title] }], app: app) + } + + var table: XCUIElement { app.tables["reader_table_view"] } + + /// Whether the stream has loaded and has no posts. + /// + /// The stream's own message ("No saved posts", "Nothing liked yet") isn't in the accessibility + /// hierarchy, so this goes by the label UIKit gives a table with no rows. + var isEmpty: Bool { table.label == "Empty list" } + + /// The card for the post titled `title`. + func post(titled title: String) -> XCUIElement { + table.cells.containing(NSPredicate(format: "label CONTAINS %@", title)).firstMatch + } + + func goToPost(titled title: String) throws -> ReaderPostScreen { + try tap(table.staticTexts[title].firstMatch) + return try ReaderPostScreen(app: app) + } + + /// The like button on a post's card. Its label says whether the post is liked, and by how + /// many: "Like. 34 likes." or "Remove like. 35 likes." + func likeButton(ofPostTitled title: String) -> XCUIElement { + post(titled: title).buttons["reader-like-button"] + } + + /// Likes a post from its card, and waits for the card to show it as liked. + @discardableResult + func like(postTitled title: String) throws -> Self { + let button = likeButton(ofPostTitled: title) + try tap(button) + try wait(until: "\(title) shown as liked") { button.label.hasPrefix("Remove like") } + return self + } + + func goBackToMenu() throws -> ReaderScreen { + goBack() + return try ReaderScreen(app: app) + } + + func openMenu(ofPostTitled title: String) throws -> MenuComponent { + let card = post(titled: title) + try waitFor(card) + card.buttons["reader-more-button"].tap() + return try MenuComponent(expecting: "Copy Link", app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/SheetScreen.swift b/Tests/JetpackUITests/Screens/SheetScreen.swift new file mode 100644 index 000000000000..a3b72494c32e --- /dev/null +++ b/Tests/JetpackUITests/Screens/SheetScreen.swift @@ -0,0 +1,20 @@ +import XCTest + +/// A sheet identified by its navigation bar, with a button in the bar that dismisses it. +final class SheetScreen: ScreenObject { + private let title: String + private let dismissButton: String + + /// - Parameters: + /// - title: The identifier of the sheet's navigation bar, which is its title. + /// - dismissButton: The title of the bar button that dismisses the sheet. + init(title: String, dismissButton: String, app: XCUIApplication) throws { + self.title = title + self.dismissButton = dismissButton + try super.init(expectedElementGetters: [{ $0.navigationBars[title] }], app: app) + } + + func dismiss() { + app.navigationBars[title].buttons[dismissButton].tap() + } +} diff --git a/Tests/JetpackUITests/Screens/SiteMenuScreen.swift b/Tests/JetpackUITests/Screens/SiteMenuScreen.swift new file mode 100644 index 000000000000..dbbe80997e7e --- /dev/null +++ b/Tests/JetpackUITests/Screens/SiteMenuScreen.swift @@ -0,0 +1,90 @@ +import XCTest + +/// The full site menu, opened from My Site's "More" row. +final class SiteMenuScreen: ScreenObject { + private let tableGetter: ElementGetter = { + $0.tables["Blog Details Table"] + } + + var table: XCUIElement { tableGetter(app) } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [tableGetter], app: app) + } + + func goToPosts() throws -> PostsScreen { + try open(row: "Blog Post Row") + return try PostsScreen(app: app) + } + + func goToPages() throws -> PagesScreen { + try open(row: "Site Pages Row") + return try PagesScreen(app: app) + } + + func goToMedia() throws -> MediaScreen { + try open(row: "Media Row") + return try MediaScreen(app: app) + } + + func goToComments() throws -> CommentsScreen { + try open(row: "Comments Row") + return try CommentsScreen(app: app) + } + + func goToStats() throws -> StatsScreen { + try open(row: "Stats Row") + return try StatsScreen(app: app) + } + + func goToSubscribers() throws -> SubscribersScreen { + try open(row: "Subscribers Row") + return try SubscribersScreen(app: app) + } + + func goToSocial() throws -> SocialScreen { + try open(row: "Social Row") + return try SocialScreen(app: app) + } + + func goToBlazeCampaigns() throws -> BlazeCampaignsScreen { + try open(row: "Blaze Row") + return try BlazeCampaignsScreen(app: app) + } + + func goToActivityLog() throws -> ActivityLogScreen { + try open(row: "Activity Log Row") + return try ActivityLogScreen(app: app) + } + + func goToUsers() throws -> UsersScreen { + try open(row: "Users Row") + return try UsersScreen(app: app) + } + + func goToThemes() throws -> ThemesScreen { + try open(row: "Themes Row") + return try ThemesScreen(app: app) + } + + func goToMenus() throws -> MenusScreen { + try open(row: "Menus Row") + return try MenusScreen(app: app) + } + + func goToDomains() throws -> DomainsScreen { + try open(row: "Domains Row") + return try DomainsScreen(app: app) + } + + func goToSiteSettings() throws -> SiteSettingsScreen { + try open(row: "Settings Row") + return try SiteSettingsScreen(app: app) + } + + private func open(row identifier: String) throws { + let row = table.cells[identifier] + try scroll(to: row, in: table) + row.tap() + } +} diff --git a/Tests/JetpackUITests/Screens/SitePickerScreen.swift b/Tests/JetpackUITests/Screens/SitePickerScreen.swift new file mode 100644 index 000000000000..f74a168c644e --- /dev/null +++ b/Tests/JetpackUITests/Screens/SitePickerScreen.swift @@ -0,0 +1,28 @@ +import XCTest + +/// The list of the account's sites, for switching the selected site. +final class SitePickerScreen: ScreenObject { + private let navigationBarGetter: ElementGetter = { + $0.navigationBars["My Sites"] + } + + private let closeButtonGetter: ElementGetter = { + $0.buttons["my-sites-cancel-button"] + } + + var closeButton: XCUIElement { closeButtonGetter(app) } + + func site(named name: String) -> XCUIElement { + app.staticTexts[name] + } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [navigationBarGetter, closeButtonGetter], app: app) + } + + @discardableResult + func close() throws -> MySiteScreen { + closeButton.tap() + return try MySiteScreen(app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/SiteSettingsScreen.swift b/Tests/JetpackUITests/Screens/SiteSettingsScreen.swift new file mode 100644 index 000000000000..c1b9d88a46d6 --- /dev/null +++ b/Tests/JetpackUITests/Screens/SiteSettingsScreen.swift @@ -0,0 +1,12 @@ +import XCTest + +/// The site's settings. +final class SiteSettingsScreen: ScreenObject { + private let tableGetter: ElementGetter = { + $0.tables["siteSettingsTable"] + } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [tableGetter, Self.navigationBarTitle("Settings")], app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/SocialConnectionScreen.swift b/Tests/JetpackUITests/Screens/SocialConnectionScreen.swift new file mode 100644 index 000000000000..a5d7da01fdfc --- /dev/null +++ b/Tests/JetpackUITests/Screens/SocialConnectionScreen.swift @@ -0,0 +1,12 @@ +import XCTest + +/// The settings for one connected social media account. +final class SocialConnectionScreen: ScreenObject { + private let disconnectButtonGetter: ElementGetter = { + $0.buttons["Disconnect"] + } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [disconnectButtonGetter], app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/SocialScreen.swift b/Tests/JetpackUITests/Screens/SocialScreen.swift new file mode 100644 index 000000000000..90b69f4731cc --- /dev/null +++ b/Tests/JetpackUITests/Screens/SocialScreen.swift @@ -0,0 +1,21 @@ +import XCTest + +/// The site's social media connections. +final class SocialScreen: ScreenObject { + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [Self.navigationBarTitle("Social")], app: app) + } + + /// The first connected account. The list also has a button that connects a new one, which + /// is there before the accounts have loaded, so "the first row" isn't enough to find one. + private var firstConnection: XCUIElement { + app.collectionViews.firstMatch.cells.buttons + .matching(NSPredicate(format: "label != 'Connect a New Account'")) + .firstMatch + } + + func goToFirstConnection() throws -> SocialConnectionScreen { + try tapFirst(firstConnection, named: "social connections") + return try SocialConnectionScreen(app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/StatsCardCustomizationScreen.swift b/Tests/JetpackUITests/Screens/StatsCardCustomizationScreen.swift new file mode 100644 index 000000000000..bd7e3ffabdc0 --- /dev/null +++ b/Tests/JetpackUITests/Screens/StatsCardCustomizationScreen.swift @@ -0,0 +1,18 @@ +import XCTest + +/// The sheet for customizing a Traffic tab card: a chart card's metrics, or a top list card's +/// data type. +final class StatsCardCustomizationScreen: ScreenObject { + private let title: String + + init(title: String, app: XCUIApplication) throws { + self.title = title + try super.init(expectedElementGetters: [{ $0.navigationBars[title] }], app: app) + } + + @discardableResult + func cancel() throws -> StatsScreen { + app.navigationBars[title].buttons["Cancel"].tap() + return try StatsScreen(app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/StatsDetailsScreen.swift b/Tests/JetpackUITests/Screens/StatsDetailsScreen.swift new file mode 100644 index 000000000000..96ceaa3c917c --- /dev/null +++ b/Tests/JetpackUITests/Screens/StatsDetailsScreen.swift @@ -0,0 +1,9 @@ +import XCTest + +/// A screen pushed from a stats card, identified by its title: a top list's full list, the stats +/// for one of its items, or the details of an insight. +final class StatsDetailsScreen: ScreenObject { + init(title: String, app: XCUIApplication) throws { + try super.init(expectedElementGetters: [Self.navigationBarTitle(title)], app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/StatsScreen+Insights.swift b/Tests/JetpackUITests/Screens/StatsScreen+Insights.swift new file mode 100644 index 000000000000..97d878a835fb --- /dev/null +++ b/Tests/JetpackUITests/Screens/StatsScreen+Insights.swift @@ -0,0 +1,67 @@ +import XCTest + +/// The Insights and Subscribers tabs. Their cards have no accessibility identifiers, so they're +/// found by their titles. +extension StatsScreen { + enum Insight: String { + case totalLikes = "Total Likes" + case totalComments = "Total Comments" + case totalSubscribers = "Total Subscribers" + } + + enum InsightsChart: String, CaseIterable { + case visitors = "Visitors" + case views = "Views" + } + + private func card(titled title: String) -> XCUIElement { + app.tables.cells.containing(.staticText, identifier: title).firstMatch + } + + // MARK: - Insights + + func goToViewsAndVisitors() throws -> StatsDetailsScreen { + // The button is in the tab's first card, which loads a moment after the tab appears. + // Scrolling before then would scroll past where it's about to be. + let week = app.tables.buttons["Week"] + try waitFor(week) + try scrollAndTap(week) + return try StatsDetailsScreen(title: "Views & Visitors", app: app) + } + + /// Switches the Views & Visitors card's chart. + @discardableResult + func select(_ chart: InsightsChart) throws -> Self { + let button = app.segmentedControls.buttons[chart.rawValue] + try scroll(to: button, in: content, waitsForExistence: false) + try select(tab: button) + return self + } + + func goToDetails(of insight: Insight) throws -> StatsDetailsScreen { + try scrollAndTap(card(titled: insight.rawValue).buttons["View more"]) + return try StatsDetailsScreen(title: insight.rawValue, app: app) + } + + func goToLatestPost() throws -> WebPreviewScreen { + try scrollAndTap(card(titled: "Latest Post Summary")) + return try WebPreviewScreen(app: app) + } + + func goToManageStatsCards() throws -> ManageStatsCardsScreen { + try tap(app.navigationBars.buttons["Gear shape"]) + return try ManageStatsCardsScreen(app: app) + } + + func goToManageStatsCardsFromAddCard() throws -> ManageStatsCardsScreen { + try scrollAndTap(app.tables.cells["Add stats card"]) + return try ManageStatsCardsScreen(app: app) + } + + // MARK: - Subscribers + + func goToAllSubscribers() throws -> SubscribersScreen { + try scrollAndTap(app.tables.buttons["View more"].firstMatch) + return try SubscribersScreen(app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/StatsScreen+Traffic.swift b/Tests/JetpackUITests/Screens/StatsScreen+Traffic.swift new file mode 100644 index 000000000000..e7f541e39163 --- /dev/null +++ b/Tests/JetpackUITests/Screens/StatsScreen+Traffic.swift @@ -0,0 +1,190 @@ +import XCTest + +/// The Traffic tab: the Today card, the chart card, the top list cards and the date controls. +extension StatsScreen { + /// What a top list card lists. A card's menu switches it between these. + enum DataType: String, CaseIterable { + case authors + case videos + case archive + case referrers + case searchTerms + case utm + case locations + case devices + case externalLinks + case fileDownloads + case postsAndPages + + var title: String { + switch self { + case .authors: "Authors" + case .videos: "Videos" + case .archive: "Archive" + case .referrers: "Referrers" + case .searchTerms: "Search Terms" + case .utm: "UTM" + case .locations: "Locations" + case .devices: "Devices" + case .externalLinks: "Clicks" + case .fileDownloads: "File Downloads" + case .postsAndPages: "Posts & Pages" + } + } + } + + enum Metric: String, CaseIterable { + case visitors, likes, comments, posts, views + } + + enum LocationLevel: String, CaseIterable { + case regions = "Regions" + case cities = "Cities" + case countries = "Countries" + } + + // MARK: - Elements + + var todayCard: XCUIElement { app.buttons["today_card"] } + var chartCard: XCUIElement { app.otherElements["chart_card"] } + var addCardButton: XCUIElement { app.buttons["stats_add_card_button"] } + var dateRangeButton: XCUIElement { app.buttons["stats_date_range_button"] } + var dateBackwardButton: XCUIElement { app.buttons["stats_date_range_backward_button"] } + var dateForwardButton: XCUIElement { app.buttons["stats_date_range_forward_button"] } + + /// The first top list card's title, which reads " card". + var firstTopListCardTitle: XCUIElement { + app.buttons.matching(identifier: "top_list_card_title").firstMatch + } + + private var locationLevelButton: XCUIElement { app.buttons["top_list_card_location_level_button"] } + + /// The first card listing `dataType`. + private func card(_ dataType: DataType) -> XCUIElement { + app.otherElements.matching(identifier: "top_list_card_\(dataType.rawValue)").firstMatch + } + + // MARK: - Today Card + + /// Narrows the date range to today. + @discardableResult + func tapTodayCard() throws -> Self { + try scrollAndTap(todayCard) + return self + } + + func openTodayCardMenu() throws -> MenuComponent { + try scrollAndTap(app.buttons["today_card_more_button"]) + return try MenuComponent(expecting: "Delete Card", app: app) + } + + // MARK: - Chart Card + + @discardableResult + func select(_ metric: Metric) throws -> Self { + try select(tab: app.buttons["chart_card_metric_\(metric.rawValue)"]) + return self + } + + func openChartCardMenu() throws -> MenuComponent { + try scrollAndTap(app.buttons["chart_card_more_button"]) + return try MenuComponent(expecting: "Show Data", app: app) + } + + func goToChartData() throws -> ChartDataScreen { + try openChartCardMenu().select("Show Data") + return try ChartDataScreen(app: app) + } + + func goToChartCardCustomization() throws -> StatsCardCustomizationScreen { + try openChartCardMenu().select("Edit Card") + return try StatsCardCustomizationScreen(title: "Select Metrics", app: app) + } + + // MARK: - Top List Cards + + func openMenu(ofCardListing dataType: DataType) throws -> MenuComponent { + try scrollAndTap(card(dataType).buttons["top_list_card_more_button"]) + return try MenuComponent(expecting: "Edit Card", app: app) + } + + func goToCustomization(ofCardListing dataType: DataType) throws -> StatsCardCustomizationScreen { + try openMenu(ofCardListing: dataType).select("Edit Card") + return try StatsCardCustomizationScreen(title: "Select Data Type", app: app) + } + + func openDataTypeMenu(ofCardListing dataType: DataType) throws -> MenuComponent { + try scrollAndTap(card(dataType).buttons["top_list_card_title"]) + return try MenuComponent(expecting: DataType.fileDownloads.title, app: app) + } + + /// Switches the card listing `current` to list `dataType` instead. + @discardableResult + func switchCard(listing current: DataType, to dataType: DataType) throws -> Self { + try openDataTypeMenu(ofCardListing: current).select(dataType.title) + return self + } + + func goToAllItems(ofCardListing dataType: DataType) throws -> StatsDetailsScreen { + try scrollAndTap(card(dataType).buttons["top_list_card_show_all_button"]) + return try StatsDetailsScreen(title: dataType.title, app: app) + } + + /// Opens the stats for the first item in a card. Only some data types have item stats, and a + /// card only lists items that have stats in the date range. + func goToFirstItem(ofCardListing dataType: DataType, titled title: String) throws -> StatsDetailsScreen { + let item = card(dataType).buttons.matching(identifier: "top_list_item").firstMatch + try scroll( + to: card(dataType).buttons["top_list_card_title"], + in: content, + maxSwipes: Self.maxSwipes, + waitsForExistence: false + ) + guard item.pollForExistence(timeout: Self.defaultWaitTimeout) else { + throw XCTSkip("This site has no \(dataType.title) stats in the date range") + } + try scrollAndTap(item) + return try StatsDetailsScreen(title: title, app: app) + } + + func openLocationLevelMenu() throws -> MenuComponent { + try scrollAndTap(locationLevelButton) + return try MenuComponent(expecting: LocationLevel.cities.rawValue, app: app) + } + + @discardableResult + func select(_ level: LocationLevel) throws -> Self { + try openLocationLevelMenu().select(level.rawValue) + try wait(until: "the locations card listing \(level.rawValue)") { + locationLevelButton.label.hasPrefix(level.rawValue) + } + return self + } + + // MARK: - Adding Cards and the Time Zone + + func openAddCardMenu() throws -> MenuComponent { + try scrollAndTap(addCardButton) + return try MenuComponent(expecting: "Top List, See your top performing content", app: app) + } + + /// Opens the popover explaining which time zone the stats are in. + @discardableResult + func openTimeZoneInfo() throws -> Self { + try scrollAndTap(app.buttons["stats_timezone_button"]) + try waitFor(app.staticTexts["Site Time Zone"]) + return self + } + + // MARK: - Date Range + + func openDateRangeMenu() throws -> MenuComponent { + try tap(dateRangeButton) + return try MenuComponent(expecting: "Custom Range…", app: app) + } + + func goToCustomDateRange() throws -> CustomDateRangeScreen { + try openDateRangeMenu().select("Custom Range…") + return try CustomDateRangeScreen(app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/StatsScreen.swift b/Tests/JetpackUITests/Screens/StatsScreen.swift new file mode 100644 index 000000000000..a94b485d03c6 --- /dev/null +++ b/Tests/JetpackUITests/Screens/StatsScreen.swift @@ -0,0 +1,62 @@ +import XCTest + +/// The site's stats. +/// +/// The Traffic tab's cards are in `StatsScreen+Traffic.swift`, and the Insights and Subscribers +/// tabs' in `StatsScreen+Insights.swift`. +final class StatsScreen: ScreenObject { + enum Tab: String, CaseIterable { + case traffic, insights, subscribers + } + + private let dashboardGetter: ElementGetter = { + $0.otherElements["stats-dashboard"] + } + + private let filterBarGetter: ElementGetter = { + $0.otherElements["site-stats-dashboard-filter-bar"] + } + + /// The container of the selected tab's cards. + var content: XCUIElement { dashboardGetter(app) } + var filterBar: XCUIElement { filterBarGetter(app) } + + /// The Traffic tab's date controls float over its cards. + override var bottomOverlays: [XCUIElement] { + [app.buttons["stats_date_range_button"]] + super.bottomOverlays + } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [dashboardGetter, filterBarGetter], app: app) + } + + /// The Locations card's map pans when a swipe starts on it, and it fills the middle of the + /// screen for part of the way down, so this drags along the margin beside the cards instead. + override func swipeUp(_ scrollView: XCUIElement) { + let start = scrollView.coordinate(withNormalizedOffset: CGVector(dx: 0.99, dy: 0.7)) + let end = scrollView.coordinate(withNormalizedOffset: CGVector(dx: 0.99, dy: 0.3)) + start.press(forDuration: 0.05, thenDragTo: end) + } + + @discardableResult + func select(_ tab: Tab) throws -> Self { + try select(tab: filterBar.buttons[tab.rawValue]) + return self + } + + func openNavigationBarMenu() throws -> MenuComponent { + try tap(app.navigationBars.buttons["More"]) + return try MenuComponent(expecting: "Send Feedback", app: app) + } + + /// How many swipes it can take to reach the bottom of the Traffic tab. Its length depends on + /// how much data its cards have to show. + static let maxSwipes = 24 + + /// Scrolls the selected tab to `element` and taps it. The cards are in a lazy stack, so one + /// that's further down doesn't exist until it's scrolled to. + func scrollAndTap(_ element: XCUIElement) throws { + try scroll(to: element, in: content, maxSwipes: Self.maxSwipes, waitsForExistence: false) + element.tap() + } +} diff --git a/Tests/JetpackUITests/Screens/SubscriberDetailsScreen.swift b/Tests/JetpackUITests/Screens/SubscriberDetailsScreen.swift new file mode 100644 index 000000000000..d1d64bf67053 --- /dev/null +++ b/Tests/JetpackUITests/Screens/SubscriberDetailsScreen.swift @@ -0,0 +1,12 @@ +import XCTest + +/// The details of one subscriber. +final class SubscriberDetailsScreen: ScreenObject { + private let contentGetter: ElementGetter = { + $0.scrollViews["subscriber-details"] + } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [contentGetter], app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/SubscribersScreen.swift b/Tests/JetpackUITests/Screens/SubscribersScreen.swift new file mode 100644 index 000000000000..1086177e01c8 --- /dev/null +++ b/Tests/JetpackUITests/Screens/SubscribersScreen.swift @@ -0,0 +1,13 @@ +import XCTest + +/// The site's subscribers list. +final class SubscribersScreen: ScreenObject { + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [Self.navigationBarTitle("Subscribers")], app: app) + } + + func goToFirstSubscriber() throws -> SubscriberDetailsScreen { + try tapFirst(firstRow(in: app.collectionViews.firstMatch), named: "subscribers") + return try SubscriberDetailsScreen(app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/ThemesScreen.swift b/Tests/JetpackUITests/Screens/ThemesScreen.swift new file mode 100644 index 000000000000..ede098dfc0e3 --- /dev/null +++ b/Tests/JetpackUITests/Screens/ThemesScreen.swift @@ -0,0 +1,8 @@ +import XCTest + +/// The theme browser. +final class ThemesScreen: ScreenObject { + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [Self.navigationBarTitle("Themes")], app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/TitledScreen.swift b/Tests/JetpackUITests/Screens/TitledScreen.swift new file mode 100644 index 000000000000..4b1af7a2d743 --- /dev/null +++ b/Tests/JetpackUITests/Screens/TitledScreen.swift @@ -0,0 +1,8 @@ +import XCTest + +/// A pushed screen with nothing to identify it but its title. +final class TitledScreen: ScreenObject { + init(title: String, app: XCUIApplication) throws { + try super.init(expectedElementGetters: [Self.navigationBarTitle(title)], app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/UserDetailsScreen.swift b/Tests/JetpackUITests/Screens/UserDetailsScreen.swift new file mode 100644 index 000000000000..b7ae0465876e --- /dev/null +++ b/Tests/JetpackUITests/Screens/UserDetailsScreen.swift @@ -0,0 +1,12 @@ +import XCTest + +/// The details of one of the site's users. +final class UserDetailsScreen: ScreenObject { + private let tableGetter: ElementGetter = { + $0.tables["person_table_view"] + } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [tableGetter], app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/UsersScreen.swift b/Tests/JetpackUITests/Screens/UsersScreen.swift new file mode 100644 index 000000000000..ebf38848600a --- /dev/null +++ b/Tests/JetpackUITests/Screens/UsersScreen.swift @@ -0,0 +1,17 @@ +import XCTest + +/// The site's users list. +final class UsersScreen: ScreenObject { + private let tableGetter: ElementGetter = { + $0.tables["users_table_view"] + } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [tableGetter, Self.navigationBarTitle("Users")], app: app) + } + + func goToFirstUser() throws -> UserDetailsScreen { + try tapFirst(tableGetter(app).cells.firstMatch, named: "users") + return try UserDetailsScreen(app: app) + } +} diff --git a/Tests/JetpackUITests/Screens/WebPreviewScreen.swift b/Tests/JetpackUITests/Screens/WebPreviewScreen.swift new file mode 100644 index 000000000000..850636344307 --- /dev/null +++ b/Tests/JetpackUITests/Screens/WebPreviewScreen.swift @@ -0,0 +1,18 @@ +import XCTest + +/// The in-app browser showing a post as it appears on the site. +final class WebPreviewScreen: ScreenObject { + private let dismissButtonGetter: ElementGetter = { + $0.buttons["Dismiss"] + } + + init(app: XCUIApplication) throws { + try super.init(expectedElementGetters: [dismissButtonGetter, { $0.webViews.firstMatch }], app: app) + } + + @discardableResult + func dismiss() throws -> StatsScreen { + dismissButtonGetter(app).tap() + return try StatsScreen(app: app) + } +} diff --git a/Tests/JetpackUITests/Support/JetpackUITestCase+Analytics.swift b/Tests/JetpackUITests/Support/JetpackUITestCase+Analytics.swift new file mode 100644 index 000000000000..919372bbb60d --- /dev/null +++ b/Tests/JetpackUITests/Support/JetpackUITestCase+Analytics.swift @@ -0,0 +1,64 @@ +import XCTest + +extension JetpackUITestCase { + struct AnalyticsEventNotSentError: Error, CustomStringConvertible { + let name: String + let properties: [String: String] + let timeout: TimeInterval + let sent: [AnalyticsEvent] + + var description: String { + let expected = properties.isEmpty ? name : "\(name) with \(properties)" + let sent = sent.map(\.description).joined(separator: "\n") + return "\(expected) was not sent within \(timeout) seconds. The app sent:\n\(sent)" + } + } + + /// How long to wait for an analytics event unless told otherwise. + /// + /// The app queues the events it tracks and sends them in batches: once a second when it runs + /// against the fixtures, where a test is waiting for them, and every 15 seconds otherwise. + static let analyticsEventTimeout: TimeInterval = 10 + + /// The analytics events the app has tracked since it launched for this test and has sent to + /// Tracks, in the order it tracked them. + /// + /// These are read from the app's requests, so they're what Tracks would have received. Only a + /// suite on the fixtures backend can read them: against a real account they go to Tracks. + func sentAnalyticsEvents() throws -> [AnalyticsEvent] { + guard let requestLog else { + throw RequestLogUnavailableError() + } + // The app also sends the events an earlier launch tracked and didn't get to send. + return try requestLog.analyticsEvents().filter { $0.date >= launchDate } + } + + /// Waits for the app to send an analytics event, and returns the most recent one. + /// + /// - Parameters: + /// - name: The event's name as Tracks receives it, with the app's prefix. + /// - properties: Properties the event has to have. It may have others. + @discardableResult + func waitForAnalyticsEvent( + _ name: String, + properties: [String: String] = [:], + timeout: TimeInterval = analyticsEventTimeout + ) throws -> AnalyticsEvent { + try XCTContext.runActivity(named: "Wait for the analytics event \(name)") { _ in + let deadline = Date(timeIntervalSinceNow: timeout) + while true { + let events = try sentAnalyticsEvents() + let match = events.last { event in + event.name == name && properties.allSatisfy { event.properties[$0.key] == $0.value } + } + if let match { + return match + } + guard Date() < deadline else { + throw AnalyticsEventNotSentError(name: name, properties: properties, timeout: timeout, sent: events) + } + Thread.sleep(forTimeInterval: 0.1) + } + } + } +} diff --git a/Tests/JetpackUITests/Support/JetpackUITestCase+Requests.swift b/Tests/JetpackUITests/Support/JetpackUITestCase+Requests.swift new file mode 100644 index 000000000000..615f70b9b3a9 --- /dev/null +++ b/Tests/JetpackUITests/Support/JetpackUITestCase+Requests.swift @@ -0,0 +1,64 @@ +import XCTest + +extension JetpackUITestCase { + struct RequestLogUnavailableError: Error, CustomStringConvertible { + let description = "Only a suite on the fixtures backend can read what the app has sent" + } + + /// The requests the app has made since it launched for this test that no fixture answered. + /// + /// The app got a 404 for each, so whatever asked for it is showing an error or nothing. + func unansweredRequests() throws -> [RequestLog.Request] { + guard let requestLog else { + throw RequestLogUnavailableError() + } + return try requestLog.requests().filter { $0.fixture == nil } + } + + /// How many times the app has requested each endpoint since it launched for this test. + /// + /// An endpoint is a method, a host and a path. The query isn't part of it, so requests for + /// different pages or dates of the same thing count towards one endpoint. + /// + /// Only a suite on the fixtures backend can count them: against a real account the app's + /// requests go to the network, where a test can't see them. + func requestCounts() throws -> [RequestLog.Endpoint: Int] { + guard let requestLog else { + throw RequestLogUnavailableError() + } + return try requestLog.requestCounts() + } + + /// How many times the app has requested one endpoint since it launched for this test. + func requestCount( + _ method: String = "GET", + host: String = "public-api.wordpress.com", + path: String + ) throws -> Int { + try requestCounts()[RequestLog.Endpoint(method: method, host: host, path: path), default: 0] + } + + /// Fails the test if the app has requested any endpoint more than `limit` times since it + /// launched, and lists the ones it has. + /// + /// - Parameter ignored: Endpoints that are meant to be requested repeatedly, such as the one + /// the app sends its analytics events to. + func assertNoEndpointRequested( + moreThan limit: Int, + ignoring ignored: Set = [], + file: StaticString = #filePath, + line: UInt = #line + ) throws { + let repeated = try requestCounts() + .filter { $0.value > limit && !ignored.contains($0.key) } + // The most requested first. + .sorted { $0.value != $1.value ? $0.value > $1.value : $0.key.description < $1.key.description } + .map { "\($0.value) × \($0.key)" } + XCTAssertTrue( + repeated.isEmpty, + "Requested more than \(limit) times:\n\(repeated.joined(separator: "\n"))", + file: file, + line: line + ) + } +} diff --git a/Tests/JetpackUITests/Support/JetpackUITestCase+SentRequests.swift b/Tests/JetpackUITests/Support/JetpackUITestCase+SentRequests.swift new file mode 100644 index 000000000000..f1f4858db144 --- /dev/null +++ b/Tests/JetpackUITests/Support/JetpackUITestCase+SentRequests.swift @@ -0,0 +1,55 @@ +import XCTest + +extension JetpackUITestCase { + struct RequestNotSentError: Error, CustomStringConvertible { + let endpoint: RequestLog.Endpoint + let timeout: TimeInterval + let sent: [RequestLog.Request] + + var description: String { + let sent = sent.map(\.description).joined(separator: "\n") + return "The app didn't send \(endpoint) within \(timeout) seconds. With that method, it sent:\n\(sent)" + } + } + + /// Waits for the app to send a request to an endpoint, and returns the most recent one. + /// + /// This is how a test checks that an action reached the server: tap Like, then wait for the + /// request that likes the post. The request carries the status it was answered with and the + /// fixture that answered it, so the test can also check that the app got the response it + /// went on to show. + /// + /// The app sends a request some time after the tap that causes it, which is why this waits + /// rather than reading the log once. + /// + /// Only a suite on the fixtures backend can do this: against a real account the app's + /// requests go to the network, where a test can't see them. + func waitForRequest( + _ method: String, + host: String = "public-api.wordpress.com", + path: String, + timeout: TimeInterval = 10 + ) throws -> RequestLog.Request { + guard let requestLog else { + throw RequestLogUnavailableError() + } + + let endpoint = RequestLog.Endpoint(method: method, host: host, path: path) + let deadline = Date(timeIntervalSinceNow: timeout) + while true { + let requests = try requestLog.requests() + let match = requests.last { $0.method == method && $0.url.host() == host && $0.url.path() == path } + if let match { + return match + } + guard Date() < deadline else { + throw RequestNotSentError( + endpoint: endpoint, + timeout: timeout, + sent: requests.filter { $0.method == method } + ) + } + RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.25)) + } + } +} diff --git a/Tests/JetpackUITests/Support/JetpackUITestCase.swift b/Tests/JetpackUITests/Support/JetpackUITestCase.swift new file mode 100644 index 000000000000..ccbd91d26fd8 --- /dev/null +++ b/Tests/JetpackUITests/Support/JetpackUITestCase.swift @@ -0,0 +1,189 @@ +import XCTest + +/// The base class for Jetpack UI tests. +/// +/// Launches the app signed in to WordPress.com with the `-wpcom-token` launch argument, which +/// completes sign-in without any taps, so tests start on My Site. +@MainActor +class JetpackUITestCase: XCTestCase { + /// Where the app under test gets its data from. + enum Backend { + /// WordPress.com, signed in to the account `TestCredentials` has a token for. + case live + /// The fixtures in `Tests/JetpackUITests/Fixtures`, which answer every request the app + /// makes. The account and its sites are always the same, so a test can assert on them. + case fixtures + } + + /// Where this suite's tests get their data from. + class var backend: Backend { .live } + + /// Whether the app's data is wiped before every test. + /// + /// A reset app has to sign in again, which syncs the account's sites and takes a while. Suites + /// whose tests leave the app as they found it can return `false` to share one sign-in across + /// their tests. + class var resetsAppBeforeEachTest: Bool { true } + + /// Whether the next test has to start from a reset app even if its suite shares a sign-in: + /// the first test of the run, and the test after one from a suite that resets, since such a + /// suite is free to leave the app changed. + private static var nextTestMustReset = true + + /// The backend the previous test ran against. The two backends sign in to different accounts, + /// so a test on the other one has to start from a reset app too. + private static var previousBackend: Backend? + + /// Whether the app has yet to be launched in this run. + private static var isFirstLaunch = true + + private(set) var app = XCUIApplication() + + /// What the app has sent in this test, when it runs against the fixtures. + private(set) var requestLog: RequestLog? + + /// When the app was launched for this test. + private(set) var launchDate = Date.distantPast + + override func setUp() async throws { + try await super.setUp() + + // In UI tests it's usually best to stop immediately when a failure occurs. + continueAfterFailure = false + + let token: String + switch Self.backend { + case .live: + guard let liveToken = TestCredentials.wpcomToken else { + throw XCTSkip( + "No WordPress.com token. Set TEST_RUNNER_WPCOM_TOKEN or save one to ~/.wpcom-token on the host Mac." + ) + } + token = liveToken + case .fixtures: + // The fixtures answer the same way whatever the token is. + token = "fixture-token" + } + + app.launchArguments = [ + "-wpcom-token", token, + // A freshly reset app shows its TipKit tips, whose popovers cover the screen under test. + "-com.apple.TipKit.HideAllTips", "1", + // After enough activity the app asks whether you're enjoying it, in an alert that can + // appear over any screen. + "-AppRatingsSkipRatingCurrentVersion", "YES", + // The first time the Notifications tab is shown the app asks to send push notifications, + // in a sheet that covers the list a moment after the list appears. + "-NotificationPrimerAlertWasDisplayed", "YES", + // XCTest waits for the app's animations to finish before every tap and query. + "-ui-test-disable-animations" + ] + if Self.backend == .fixtures { + let fixtures = try Self.fixturesDirectory + let requestLog = FileManager.default.temporaryDirectory.appending(path: "\(UUID().uuidString).log") + self.requestLog = RequestLog(file: requestLog) + // The Simulator doesn't sandbox the app, so it can read the test bundle and write the log. + app.launchArguments += [ + "-ui-test-http-fixtures", fixtures.path(percentEncoded: false), + "-ui-test-http-log", requestLog.path(percentEncoded: false) + ] + } + if Self.resetsAppBeforeEachTest || Self.nextTestMustReset || Self.backend != Self.previousBackend { + app.launchArguments.append("-ui-test-reset-everything") + } + Self.nextTestMustReset = Self.resetsAppBeforeEachTest + Self.previousBackend = Self.backend + XCUIElement.firstCheckDelay = Self.backend == .live ? 1 : 0 + launchDate = Date() + app.launch() + try checkAppServesFixtures() + if Self.isFirstLaunch { + Self.isFirstLaunch = false + waitOutColdStart() + } + } + + /// Gives the first launch of a run longer to get to My Site than a test allows it. + /// + /// CI runs the tests on a Simulator it has just erased and booted, where the first launch + /// has taken more than 76 seconds to sign in, against under 10 for every launch after it. A + /// test gives My Site 60 seconds to appear, which the first test of a run then failed by. + /// + /// If My Site never appears, the test's own wait for it is what fails. + private func waitOutColdStart() { + _ = app.otherElements["my_site"].poll(timeout: 180) { $0.exists } + } + + /// Fails a test on the fixtures backend when the app isn't serving them. + /// + /// The fixtures are only in an app built with the `UI_TEST_HTTP_FIXTURES` compilation + /// condition. Any other build ignores the launch arguments above and sends its requests to + /// WordPress.com, where the test would fail on whichever screen first needed the fixture + /// account. + /// + /// The app creates the request log as it starts serving the fixtures, before it finishes + /// launching, so a log that isn't there by now means it isn't serving them. + private func checkAppServesFixtures() throws { + guard let requestLog else { + return + } + let deadline = Date(timeIntervalSinceNow: 5) + while !FileManager.default.fileExists(atPath: requestLog.file.path(percentEncoded: false)) { + guard Date() < deadline else { + throw FixturesNotCompiledInError() + } + RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.1)) + } + } + + struct FixturesNotCompiledInError: Error, CustomStringConvertible { + let description = """ + The app was built without the HTTP fixtures this test runs against. They're only compiled in when the \ + build sets the UI_TEST_HTTP_FIXTURES compilation condition, which a build made in Xcode doesn't. See \ + "Running the tests" in docs/ui-tests.md. + """ + } + + /// The fixtures the app runs against: the ones in the test bundle, unless the `UI_TEST_FIXTURES` + /// environment variable names another folder. + /// + /// Pointing it at `Tests/JetpackUITests/Fixtures` in the source tree runs the tests against + /// fixtures as they're being edited, without rebuilding to copy them into the bundle. + private static var fixturesDirectory: URL { + get throws { + if let directory = ProcessInfo.processInfo.environment["UI_TEST_FIXTURES"] { + return URL(filePath: directory) + } + return try XCTUnwrap( + Bundle(for: JetpackUITestCase.self).url(forResource: "Fixtures", withExtension: nil), + "The Fixtures folder is missing from the test bundle" + ) + } + } + + override func tearDown() async throws { + // Most failures are an element that wasn't where a screen object expected it, and the + // hierarchy shows what was there instead. + if let testRun, testRun.totalFailureCount > 0 { + let attachment = XCTAttachment(string: app.debugDescription) + attachment.name = "App hierarchy at failure" + add(attachment) + + // A screen that didn't load has usually asked for something the fixtures don't have. + // The log marks those requests "(no fixture)". + if let requests = try? requestLog?.requests() { + let attachment = XCTAttachment(string: requests.map(\.description).joined(separator: "\n")) + attachment.name = "HTTP requests" + add(attachment) + } + if let events = try? sentAnalyticsEvents(), !events.isEmpty { + let attachment = XCTAttachment(string: events.map(\.description).joined(separator: "\n")) + attachment.name = "Analytics events" + add(attachment) + } + } + + app.terminate() + try await super.tearDown() + } +} diff --git a/Tests/JetpackUITests/Support/RequestLog.swift b/Tests/JetpackUITests/Support/RequestLog.swift new file mode 100644 index 000000000000..2803fb4effe5 --- /dev/null +++ b/Tests/JetpackUITests/Support/RequestLog.swift @@ -0,0 +1,123 @@ +import Foundation + +/// What the app has sent in a test, read from the log it writes when it runs against the fixtures. +struct RequestLog { + /// A request the app made. The app writes these as `RecordedRequest`, in the `HTTPFixtures` + /// module. + struct Request: Decodable, CustomStringConvertible { + let method: String + let url: URL + let body: String? + let status: Int + + /// The mapping that answered the request, or `nil` when none matched. + let fixture: String? + + var description: String { + "\(status) \(method) \(url.absoluteString) \(fixture ?? "(no fixture)")" + } + } + + /// What a request is for, whatever its query: a method, a host and a path. + struct Endpoint: Hashable, CustomStringConvertible { + let method: String + let host: String + let path: String + + var description: String { + "\(method) \(host)\(path)" + } + } + + let file: URL + + /// Every request the app has made, in order. + func requests() throws -> [Request] { + try String(contentsOf: file, encoding: .utf8) + .split(separator: "\n", omittingEmptySubsequences: false) + // What follows the last line break is either nothing or a line the app is still writing. + .dropLast() + .map { try JSONDecoder().decode(Request.self, from: Data($0.utf8)) } + } + + /// How many times the app has requested each endpoint. + func requestCounts() throws -> [Endpoint: Int] { + try requests() + .reduce(into: [:]) { counts, request in + let endpoint = Endpoint( + method: request.method, + host: request.url.host() ?? "", + path: request.url.path() + ) + counts[endpoint, default: 0] += 1 + } + } + + /// The analytics events the app has sent to Tracks, in the order it tracked them. + /// + /// The app queues the events it tracks and sends them in batches, so an event gets here some + /// time after the action that caused it. + func analyticsEvents() throws -> [AnalyticsEvent] { + try requests() + .filter { $0.url.path() == "/rest/v1.1/tracks/record" && (200..<300).contains($0.status) } + .flatMap { try AnalyticsEvent.events(inBatch: $0.body ?? "") } + .sorted { $0.date < $1.date } + } +} + +/// An analytics event the app sent to Tracks. +struct AnalyticsEvent: CustomStringConvertible { + /// The event's name as Tracks receives it, which starts with the app's prefix: + /// `jpios_stats_accessed`. + let name: String + + /// When the app tracked the event. It sends it later, with the next batch. + let date: Date + + /// The event's properties, with every value as text. They include the ones the app adds to + /// every event to describe the user and the device. + let properties: [String: String] + + /// The name, and the properties that are the event's own. + var description: String { + let ownProperties = + properties + .filter { !$0.key.hasPrefix("_") && !$0.key.hasPrefix("device_info_") } + .sorted { $0.key < $1.key } + .map { "\($0.key): \($0.value)" } + return ownProperties.isEmpty ? name : "\(name) <\(ownProperties.joined(separator: ", "))>" + } + + /// The events in the body of a request to Tracks. + static func events(inBatch body: String) throws -> [AnalyticsEvent] { + let batch = try JSONSerialization.jsonObject(with: Data(body.utf8)) as? [String: Any] + let sharedProperties = batch?["commonProps"] as? [String: Any] ?? [:] + let events = batch?["events"] as? [[String: Any]] ?? [] + + return events.compactMap { event in + guard let name = event["_en"] as? String, let milliseconds = event["_ts"] as? Double else { + return nil + } + // Tracks leaves out of an event the properties it has in common with its batch. + let properties = + sharedProperties + .merging(event) { _, own in own } + .filter { $0.key != "_en" && $0.key != "_ts" } + return AnalyticsEvent( + name: name, + date: Date(timeIntervalSince1970: milliseconds / 1000), + properties: properties.mapValues(text) + ) + } + } + + private static func text(_ value: Any) -> String { + switch value { + case let string as String: string + case let number as NSNumber where CFGetTypeID(number) == CFBooleanGetTypeID(): + number.boolValue ? "true" : "false" + case let number as NSNumber: number.stringValue + default: "\(value)" + } + } +} diff --git a/Tests/JetpackUITests/Support/ScreenObject.swift b/Tests/JetpackUITests/Support/ScreenObject.swift new file mode 100644 index 000000000000..f47cb89aa6e4 --- /dev/null +++ b/Tests/JetpackUITests/Support/ScreenObject.swift @@ -0,0 +1,215 @@ +import XCTest + +/// The base class for screen objects (the page object pattern). +/// +/// A screen object exposes the elements and actions for one screen, or one component of a screen, +/// so tests read as a chain of user actions instead of element queries. Navigation methods return +/// the screen they navigate to: +/// +/// ```swift +/// try MySiteScreen(app: app) +/// .goToCreateSheet() +/// .goToBlogPost() +/// ``` +/// +/// Initializing a screen waits for its first expected element to become hittable and throws if it +/// doesn't, so constructing a screen object doubles as the assertion that the app reached it. +/// +/// Adapted from [Automattic/ScreenObject](https://github.com/Automattic/ScreenObject), which the UI +/// tests removed in #25399 depended on. +@MainActor +class ScreenObject { + typealias ElementGetter = (XCUIApplication) -> XCUIElement + + struct ScreenNotLoadedError: Error, CustomStringConvertible { + let screen: String + let element: String + let timeout: TimeInterval + + var description: String { + "\(screen) did not load: \(element) was not hittable after \(timeout) seconds" + } + } + + struct ElementNotReachedError: Error, CustomStringConvertible { + let element: String + let expectation: String + + var description: String { + "\(element) \(expectation)" + } + } + + static let defaultWaitTimeout: TimeInterval = 20 + + /// An element getter for the title shown in the navigation bar. + static func navigationBarTitle(_ title: String) -> ElementGetter { + { $0.navigationBars.staticTexts[title] } + } + + let app: XCUIApplication + + private let expectedElementGetters: [ElementGetter] + private let waitTimeout: TimeInterval + + /// - Parameters: + /// - expectedElementGetters: The elements that identify the screen. The first one is awaited + /// at initialization; `waitForScreen()` awaits them all. + /// - waitTimeout: How long to wait for each expected element to become hittable. + init( + expectedElementGetters: [ElementGetter], + app: XCUIApplication, + waitTimeout: TimeInterval = defaultWaitTimeout + ) throws { + precondition(!expectedElementGetters.isEmpty, "A screen needs at least one expected element") + + self.app = app + self.expectedElementGetters = expectedElementGetters + self.waitTimeout = waitTimeout + + try waitForScreen(firstElementOnly: true) + } + + /// Waits for the expected elements to become hittable. + @discardableResult + func waitForScreen(firstElementOnly: Bool = false) throws -> Self { + let getters = firstElementOnly ? Array(expectedElementGetters.prefix(1)) : expectedElementGetters + + try XCTContext.runActivity(named: "Wait for \(Self.self)") { _ in + for getter in getters { + let element = getter(app) + guard element.poll(timeout: waitTimeout, until: { $0.exists && $0.isHittable }) else { + throw ScreenNotLoadedError(screen: "\(Self.self)", element: "\(element)", timeout: waitTimeout) + } + } + } + + return self + } + + /// The elements that float over the bottom of the screen's content. + /// + /// An element underneath one still reports itself as hittable, so a tap on it lands on the + /// floating element instead. + var bottomOverlays: [XCUIElement] { [app.tabBars.firstMatch] } + + /// Scrolls `scrollView` up until `element` can be tapped. + /// + /// - Parameter waitsForExistence: Whether to wait for `element` to exist before scrolling. + /// Pass `false` for content in a lazy stack, which only exists once it's scrolled to. + func scroll( + to element: XCUIElement, + in scrollView: XCUIElement, + maxSwipes: Int = 8, + waitsForExistence: Bool = true + ) throws { + if waitsForExistence { + try waitFor(element) + } + + var swipes = 0 + while !canTap(element) { + guard swipes < maxSwipes else { + let state = + element.exists + ? "hittable: \(element.isHittable), frame: \(element.frame), " + + "overlays: \(bottomOverlays.filter(\.exists).map(\.frame))" + : "it doesn't exist" + throw ElementNotReachedError( + element: "\(element)", + expectation: "could not be tapped after \(maxSwipes) swipes (\(state))" + ) + } + swipeUp(scrollView) + swipes += 1 + } + } + + /// Scrolls `scrollView` up by one swipe. A screen overrides this when something in its + /// content would take the swipe for itself. + func swipeUp(_ scrollView: XCUIElement) { + scrollView.swipeUp(velocity: .slow) + } + + private func canTap(_ element: XCUIElement) -> Bool { + guard element.exists else { + return false + } + + // Asking whether an element that's off screen is hittable can itself fail the test, so + // rule that out from its frame first. + let center = CGPoint(x: element.frame.midX, y: element.frame.midY) + guard !element.frame.isEmpty, app.frame.contains(center) else { + return false + } + guard bottomOverlays.allSatisfy({ !$0.exists || center.y < $0.frame.minY }) else { + return false + } + return element.isHittable + } + + /// Polls `condition` until it holds. + /// + /// - Parameter expectation: What was being waited for, to complete the sentence " + /// did not see…" in the error thrown on timeout. + func wait(until expectation: String, _ condition: () -> Bool) throws { + let deadline = Date(timeIntervalSinceNow: waitTimeout) + while !condition() { + guard Date() < deadline else { + throw ElementNotReachedError(element: "\(Self.self)", expectation: "did not see \(expectation)") + } + RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.1)) + } + } + + /// Taps the navigation bar's back button. + func goBack() { + app.navigationBars.buttons["BackButton"].firstMatch.tap() + } + + /// Waits for `element` to appear. + func waitFor(_ element: XCUIElement) throws { + guard element.pollForExistence(timeout: waitTimeout) else { + throw ElementNotReachedError(element: "\(element)", expectation: "did not appear") + } + } + + /// Taps `element` once it appears. + func tap(_ element: XCUIElement) throws { + try waitFor(element) + element.tap() + } + + /// Taps the first item of a list once it appears, and skips the test if it never does. + /// + /// What a list holds is up to the site the tests are signed in to, and it changes over time: + /// activity ages out, a quiet week has no referrers. A list with nothing to open isn't a + /// failure of the app. + /// + /// - Parameter name: What the item is, to complete the sentence "This site has no…". + func tapFirst(_ item: XCUIElement, named name: String) throws { + guard item.pollForExistence(timeout: waitTimeout) else { + throw XCTSkip("This site has no \(name) to open") + } + item.tap() + } + + /// The first row of `list` that can be tapped. Section headers and footers are cells too, but + /// only the rows that navigate somewhere contain a button. + func firstRow(in list: XCUIElement) -> XCUIElement { + list.cells.containing(.button, identifier: nil).firstMatch + } + + /// Taps a filter tab and waits for it to become selected. + func select(tab: XCUIElement) throws { + tab.tap() + try waitForSelection(of: tab) + } + + /// Waits for a filter tab to be the selected one. + func waitForSelection(of tab: XCUIElement) throws { + guard tab.poll(timeout: waitTimeout, until: { $0.exists && $0.isSelected }) else { + throw ElementNotReachedError(element: "\(tab)", expectation: "was not selected") + } + } +} diff --git a/Tests/JetpackUITests/Support/TestCredentials.swift b/Tests/JetpackUITests/Support/TestCredentials.swift new file mode 100644 index 000000000000..73c226743aa8 --- /dev/null +++ b/Tests/JetpackUITests/Support/TestCredentials.swift @@ -0,0 +1,30 @@ +import Foundation + +enum TestCredentials { + /// The WordPress.com bearer token the app signs in with, resolved the same way as + /// `Scripts/sim-signin.sh`: the `WPCOM_TOKEN` environment variable, then `~/.wpcom-token` on + /// the host Mac. + /// + /// `xcodebuild` forwards `TEST_RUNNER_`-prefixed variables to the test runner with the prefix + /// removed, so pass the token as `TEST_RUNNER_WPCOM_TOKEN` when running from the command line. + static var wpcomToken: String? { + let environment = ProcessInfo.processInfo.environment + + if let token = environment["WPCOM_TOKEN"].flatMap(normalized) { + return token + } + + // The test runner runs in the Simulator, so `~` is the Simulator's home directory rather + // than the Mac's. The Simulator exposes the Mac's home directory in `SIMULATOR_HOST_HOME`. + guard let hostHome = environment["SIMULATOR_HOST_HOME"] else { + return nil + } + let tokenFile = URL(filePath: hostHome).appending(path: ".wpcom-token") + return (try? String(contentsOf: tokenFile, encoding: .utf8)).flatMap(normalized) + } + + private static func normalized(_ token: String) -> String? { + let token = token.trimmingCharacters(in: .whitespacesAndNewlines) + return token.isEmpty ? nil : token + } +} diff --git a/Tests/JetpackUITests/Support/XCUIElement+Polling.swift b/Tests/JetpackUITests/Support/XCUIElement+Polling.swift new file mode 100644 index 000000000000..94f217b3d4d8 --- /dev/null +++ b/Tests/JetpackUITests/Support/XCUIElement+Polling.swift @@ -0,0 +1,44 @@ +import XCTest + +extension XCUIElement { + /// How long a wait pauses between checks. + private static let pollInterval: TimeInterval = 0.1 + + /// How long a wait holds off before its first check. + /// + /// Nothing, against the fixtures: they answer at once, so what a screen shows is there as soon + /// as the screen is. + /// + /// Against a real account it's a second, which is what XCTest's own waits take before they + /// first check. A screen's content arrives over the network some time after the screen does, + /// and the suites that run against an account lean on that second in places: a list that + /// reloads as each part of it arrives can move or replace the row a test was about to act on. + static var firstCheckDelay: TimeInterval = 0 + + /// Waits for `condition` to hold, checking it every tenth of a second. + /// + /// Use this in place of XCTest's own waits, `waitForExistence(timeout:)` and + /// `wait(for:toEqual:timeout:)`. Those check once a second, and not for the first time until a + /// second has passed, so each one takes a second even when what it waits for is already there. + /// A test makes dozens of them. + /// + /// - Returns: Whether the condition held before the timeout. + func poll(timeout: TimeInterval, until condition: (XCUIElement) -> Bool) -> Bool { + let deadline = Date(timeIntervalSinceNow: timeout) + if Self.firstCheckDelay > 0 { + RunLoop.current.run(until: Date(timeIntervalSinceNow: Self.firstCheckDelay)) + } + while !condition(self) { + guard Date() < deadline else { + return false + } + RunLoop.current.run(until: Date(timeIntervalSinceNow: Self.pollInterval)) + } + return true + } + + /// Waits for the element to exist. See `poll(timeout:until:)`. + func pollForExistence(timeout: TimeInterval) -> Bool { + poll(timeout: timeout) { $0.exists } + } +} diff --git a/Tests/JetpackUITests/Tests/Me/MeTests.swift b/Tests/JetpackUITests/Tests/Me/MeTests.swift new file mode 100644 index 000000000000..735f1ecb2399 --- /dev/null +++ b/Tests/JetpackUITests/Tests/Me/MeTests.swift @@ -0,0 +1,92 @@ +import XCTest + +/// Covers the Me tab: the account, its settings, the app's settings, help and About. +/// +/// Runs on the fixtures backend, whose account never changes, so the tests assert on what the +/// screens show. They only read, so they share one sign-in. +final class MeTests: JetpackUITestCase { + override class var backend: Backend { .fixtures } + override class var resetsAppBeforeEachTest: Bool { false } + + private func me() throws -> MeScreen { + try MySiteScreen(app: app) + .goToMe() + } + + func testAccount() throws { + let me = try me() + + XCTAssertEqual(me.displayName.label, "e2eflowtestingmobile") + XCTAssertEqual(me.username.label, "@e2eflowtestingmobile") + } + + func testMyProfile() throws { + try me() + .goToMyProfile() + .waitForScreen() + .done() + } + + func testAccountSettings() throws { + let settings = try me() + .goToAccountSettings() + + let values = [ + "Username": "e2eflowtestingmobile", + "Email": "e2eflowtestingmobile@example.com", + "Primary Site": "Tri-County Real Estate" + ] + for (row, value) in values { + XCTAssertTrue(settings.row(row).staticTexts[value].pollForExistence(timeout: 10), "\(row) isn't \(value)") + } + } + + func testAccountSettingsScreens() throws { + let settings = try me() + .goToAccountSettings() + + for setting in AccountSettingsScreen.Setting.allCases { + try settings.goTo(setting).goBack() + try settings.waitForScreen() + } + + try settings.goToPrimarySitePicker().dismiss() + try settings.waitForScreen() + } + + func testAppSettingsScreens() throws { + let settings = try me() + .goToAppSettings() + + for section in AppSettingsScreen.Section.allCases { + try settings.goTo(section).goBack() + try settings.waitForScreen() + } + } + + func testHelp() throws { + let help = try me() + .goToHelp() + .waitForScreen() + + for row in [help.contactSupportRow, help.ticketsRow, help.contactEmailRow, help.versionRow] { + XCTAssertTrue(row.pollForExistence(timeout: 10), "\(row) is missing") + } + + try help.goToLogs().goBack() + try help.waitForScreen() + } + + func testAbout() throws { + let about = try me() + .goToAbout() + .waitForScreen() + + for row in ["Share with Friends", "Blog", "Legal and More", "Automattic Family", "Work With Us"] { + XCTAssertTrue(about.row(row).pollForExistence(timeout: 10), "\(row) is missing") + } + + try about.goToLegal().goBack() + try about.close() + } +} diff --git a/Tests/JetpackUITests/Tests/MySite/AnalyticsTests.swift b/Tests/JetpackUITests/Tests/MySite/AnalyticsTests.swift new file mode 100644 index 000000000000..a75225bf8253 --- /dev/null +++ b/Tests/JetpackUITests/Tests/MySite/AnalyticsTests.swift @@ -0,0 +1,28 @@ +import XCTest + +/// Covers the analytics events the app sends to Tracks. +/// +/// Only the fixtures backend can see them: the app's requests to Tracks are answered by a fixture, +/// and the test reads what they carried. +final class AnalyticsTests: JetpackUITestCase { + override class var backend: Backend { .fixtures } + override class var resetsAppBeforeEachTest: Bool { false } + + func testShowingMySiteIsTracked() throws { + try MySiteScreen(app: app) + .waitForScreen() + + try waitForAnalyticsEvent("jpios_my_site_dashboard_shown", properties: ["blog_id": "106707880"]) + } + + func testOpeningStatsFromAQuickActionIsTracked() throws { + try MySiteScreen(app: app) + .goToStats() + .waitForScreen() + + let event = try waitForAnalyticsEvent("jpios_stats_accessed") + XCTAssertEqual(event.properties["tap_source"], "quick_actions") + XCTAssertEqual(event.properties["tab_source"], "dashboard") + XCTAssertEqual(event.properties["blog_id"], "106707880") + } +} diff --git a/Tests/JetpackUITests/Tests/MySite/DashboardCardTests.swift b/Tests/JetpackUITests/Tests/MySite/DashboardCardTests.swift new file mode 100644 index 000000000000..7ba75ffa6cfe --- /dev/null +++ b/Tests/JetpackUITests/Tests/MySite/DashboardCardTests.swift @@ -0,0 +1,127 @@ +import XCTest + +/// Covers the cards on My Site's dashboard: what each card, its header, its rows and its menu open. +/// +/// These tests only read, so they share one sign-in. The ones that open the editor close it +/// without making a change. +final class DashboardCardTests: JetpackUITestCase { + override class var resetsAppBeforeEachTest: Bool { false } + + // MARK: - Prompts + + func testPromptsCardResponses() throws { + try MySiteScreen(app: app) + .goToPromptResponsesFromDashboardCard() + .waitForScreen() + } + + func testPromptsCardMenuPromptsList() throws { + try MySiteScreen(app: app) + .goToPromptsListFromDashboardCardMenu() + .waitForScreen() + } + + func testPromptsCardMenuLearnMore() throws { + try MySiteScreen(app: app) + .goToPromptsIntroductionFromDashboardCardMenu() + .waitForScreen() + .close() + } + + // MARK: - Blaze + + func testBlazeCard() throws { + try MySiteScreen(app: app) + .goToBlazeFromDashboardCard() + .waitForScreen() + .close() + } + + func testBlazeCardMenuLearnMore() throws { + try MySiteScreen(app: app) + .goToBlazeFromDashboardCardMenu() + .waitForScreen() + .close() + } + + // MARK: - Today's Stats + + func testTodaysStatsCard() throws { + try MySiteScreen(app: app) + .goToStatsFromDashboardCard() + .waitForScreen() + } + + // MARK: - Draft Posts + + func testDraftPostsCardHeader() throws { + try MySiteScreen(app: app) + .goToDraftsFromDashboardCard() + .waitForScreen() + .waitForSelection(of: .drafts) + } + + func testDraftPostsCardMenuViewAll() throws { + try MySiteScreen(app: app) + .goToDraftsFromDashboardCardMenu() + .waitForScreen() + .waitForSelection(of: .drafts) + } + + func testDraftPostsCardRow() throws { + try MySiteScreen(app: app) + .goToFirstDraftFromDashboardCard() + .waitForScreen() + .closeAndDiscardChanges() + } + + // MARK: - Pages + + func testPagesCardHeader() throws { + try MySiteScreen(app: app) + .goToPagesFromDashboardCard() + .waitForScreen() + } + + func testPagesCardMenuAllPages() throws { + try MySiteScreen(app: app) + .goToPagesFromDashboardCardMenu() + .waitForScreen() + } + + func testPagesCardRow() throws { + try MySiteScreen(app: app) + .goToFirstPageFromDashboardCard() + .waitForScreen() + .closeAndDiscardChanges() + } + + // MARK: - Activity Log + + func testActivityLogCardHeader() throws { + try MySiteScreen(app: app) + .goToActivityLogFromDashboardCard() + .waitForScreen() + } + + func testActivityLogCardMenuAllActivity() throws { + try MySiteScreen(app: app) + .goToActivityLogFromDashboardCardMenu() + .waitForScreen() + } + + func testActivityLogCardRow() throws { + try MySiteScreen(app: app) + .goToFirstActivityFromDashboardCard() + .waitForScreen() + } + + // MARK: - Personalize + + func testPersonalizeCard() throws { + try MySiteScreen(app: app) + .goToPersonalizeHomeScreen() + .waitForScreen() + .close() + } +} diff --git a/Tests/JetpackUITests/Tests/MySite/EditorTests.swift b/Tests/JetpackUITests/Tests/MySite/EditorTests.swift new file mode 100644 index 000000000000..f654e74a410f --- /dev/null +++ b/Tests/JetpackUITests/Tests/MySite/EditorTests.swift @@ -0,0 +1,9 @@ +import XCTest + +final class EditorTests: JetpackUITestCase { + func testOpenAndDiscardNewPost() throws { + try MySiteScreen(app: app) + .goToNewPost() + .closeAndDiscardChanges() + } +} diff --git a/Tests/JetpackUITests/Tests/MySite/FixtureAccountTests.swift b/Tests/JetpackUITests/Tests/MySite/FixtureAccountTests.swift new file mode 100644 index 000000000000..f7c752313bb3 --- /dev/null +++ b/Tests/JetpackUITests/Tests/MySite/FixtureAccountTests.swift @@ -0,0 +1,26 @@ +import XCTest + +/// Covers the app signed in to the fixture account. +/// +/// The account's data never changes, so these tests assert on what the screens show, which the +/// tests that run against a real account can't. They only read, so they share one sign-in. +final class FixtureAccountTests: JetpackUITestCase { + override class var backend: Backend { .fixtures } + override class var resetsAppBeforeEachTest: Bool { false } + + func testMySiteShowsThePrimarySite() throws { + let mySite = try MySiteScreen(app: app) + + XCTAssertEqual(mySite.siteTitle.label, "Tri-County Real Estate") + XCTAssertEqual(mySite.siteURL.label, "tricountyrealestate.wordpress.com") + } + + func testSitePickerListsTheAccountsSites() throws { + let sitePicker = try MySiteScreen(app: app) + .goToSitePicker() + + for name in ["Tri-County Real Estate", "Four Paws Dog Grooming", "Weekend Bakes"] { + XCTAssertTrue(sitePicker.site(named: name).pollForExistence(timeout: 10), "\(name) isn't listed") + } + } +} diff --git a/Tests/JetpackUITests/Tests/MySite/MySiteTests.swift b/Tests/JetpackUITests/Tests/MySite/MySiteTests.swift new file mode 100644 index 000000000000..92310e5689ae --- /dev/null +++ b/Tests/JetpackUITests/Tests/MySite/MySiteTests.swift @@ -0,0 +1,39 @@ +import XCTest + +/// Covers the screens reachable from My Site's header and quick actions. +/// +/// These tests only read, so they share one sign-in. +final class MySiteTests: JetpackUITestCase { + override class var resetsAppBeforeEachTest: Bool { false } + + func testSitePicker() throws { + try MySiteScreen(app: app) + .goToSitePicker() + .waitForScreen() + .close() + } + + func testStatsQuickAction() throws { + try MySiteScreen(app: app) + .goToStats() + .waitForScreen() + } + + func testPostsQuickAction() throws { + try MySiteScreen(app: app) + .goToPosts() + .waitForScreen() + } + + func testPagesQuickAction() throws { + try MySiteScreen(app: app) + .goToPages() + .waitForScreen() + } + + func testMediaQuickAction() throws { + try MySiteScreen(app: app) + .goToMedia() + .waitForScreen() + } +} diff --git a/Tests/JetpackUITests/Tests/MySite/RequestCountTests.swift b/Tests/JetpackUITests/Tests/MySite/RequestCountTests.swift new file mode 100644 index 000000000000..15cc4b85aa35 --- /dev/null +++ b/Tests/JetpackUITests/Tests/MySite/RequestCountTests.swift @@ -0,0 +1,17 @@ +import XCTest + +/// Covers how often the app requests an endpoint. +/// +/// Only the fixtures backend can count the app's requests. Each test signs in from a reset app, +/// so the counts include everything a sign-in requests. +final class RequestCountTests: JetpackUITestCase { + override class var backend: Backend { .fixtures } + + func testSigningInFetchesTheAccountAndItsSitesOnce() throws { + try MySiteScreen(app: app) + .waitForScreen() + + XCTAssertEqual(try requestCount(path: "/rest/v1.1/me"), 1) + XCTAssertEqual(try requestCount(path: "/rest/v1.2/me/sites"), 1) + } +} diff --git a/Tests/JetpackUITests/Tests/MySite/SiteMenuDetailTests.swift b/Tests/JetpackUITests/Tests/MySite/SiteMenuDetailTests.swift new file mode 100644 index 000000000000..f4a90ab9ba44 --- /dev/null +++ b/Tests/JetpackUITests/Tests/MySite/SiteMenuDetailTests.swift @@ -0,0 +1,80 @@ +import XCTest + +/// Covers the detail screen each site menu list opens for one of its items. +/// +/// These tests only read, so they share one sign-in. The ones that open the editor close it +/// without making a change. +final class SiteMenuDetailTests: JetpackUITestCase { + override class var resetsAppBeforeEachTest: Bool { false } + + private func siteMenu() throws -> SiteMenuScreen { + try MySiteScreen(app: app) + .goToSiteMenu() + } + + func testPost() throws { + let editor = try siteMenu() + .goToPosts() + .select(.published) + .goToFirstPost() + .waitForScreen() + + editor.close() + try PostsScreen(app: app).waitForScreen() + } + + func testPage() throws { + let editor = try siteMenu() + .goToPages() + .select(.published) + .goToFirstPage() + .waitForScreen() + + editor.close() + try PagesScreen(app: app).waitForScreen() + } + + func testComment() throws { + try siteMenu() + .goToComments() + .select(.all) + .goToFirstComment() + .waitForScreen() + } + + func testSubscriber() throws { + try siteMenu() + .goToSubscribers() + .goToFirstSubscriber() + .waitForScreen() + } + + func testSocialConnection() throws { + try siteMenu() + .goToSocial() + .goToFirstConnection() + .waitForScreen() + } + + func testActivity() throws { + try siteMenu() + .goToActivityLog() + .goToFirstActivity() + .waitForScreen() + } + + func testUser() throws { + try siteMenu() + .goToUsers() + .goToFirstUser() + .waitForScreen() + } + + func testDomain() throws { + try siteMenu() + .goToDomains() + .goToFirstDomain() + .waitForScreen() + .dismiss() + } +} diff --git a/Tests/JetpackUITests/Tests/MySite/SiteMenuTests.swift b/Tests/JetpackUITests/Tests/MySite/SiteMenuTests.swift new file mode 100644 index 000000000000..231617e653cc --- /dev/null +++ b/Tests/JetpackUITests/Tests/MySite/SiteMenuTests.swift @@ -0,0 +1,119 @@ +import XCTest + +/// Covers the screens reachable from the site menu, which My Site's "More" row opens. +/// +/// These tests only read, so they share one sign-in. +final class SiteMenuTests: JetpackUITestCase { + override class var resetsAppBeforeEachTest: Bool { false } + + private func siteMenu() throws -> SiteMenuScreen { + try MySiteScreen(app: app) + .goToSiteMenu() + } + + // MARK: - Content + + func testPosts() throws { + let posts = try siteMenu() + .goToPosts() + .waitForScreen() + + for filter in PostsScreen.Filter.allCases.reversed() { + try posts.select(filter) + } + } + + func testPages() throws { + let pages = try siteMenu() + .goToPages() + .waitForScreen() + + for filter in PagesScreen.Filter.allCases.reversed() { + try pages.select(filter) + } + } + + func testMedia() throws { + try siteMenu() + .goToMedia() + .waitForScreen() + } + + func testComments() throws { + let comments = try siteMenu() + .goToComments() + .waitForScreen() + + for filter in CommentsScreen.Filter.allCases.reversed() { + try comments.select(filter) + } + } + + // MARK: - Traffic + + func testStats() throws { + let stats = try siteMenu() + .goToStats() + .waitForScreen() + + for tab in StatsScreen.Tab.allCases.reversed() { + try stats.select(tab) + } + } + + func testSubscribers() throws { + try siteMenu() + .goToSubscribers() + .waitForScreen() + } + + func testSocial() throws { + try siteMenu() + .goToSocial() + .waitForScreen() + } + + func testBlazeCampaigns() throws { + try siteMenu() + .goToBlazeCampaigns() + .waitForScreen() + } + + // MARK: - Maintenance + + func testActivityLog() throws { + try siteMenu() + .goToActivityLog() + .waitForScreen() + } + + func testUsers() throws { + try siteMenu() + .goToUsers() + .waitForScreen() + } + + func testThemes() throws { + try siteMenu() + .goToThemes() + .waitForScreen() + } + + func testMenus() throws { + try siteMenu() + .goToMenus() + .waitForScreen() + } + + func testDomains() throws { + try siteMenu() + .goToDomains() + .waitForScreen() + } + + func testSiteSettings() throws { + try siteMenu() + .goToSiteSettings() + .waitForScreen() + } +} diff --git a/Tests/JetpackUITests/Tests/Notifications/NotificationsTests.swift b/Tests/JetpackUITests/Tests/Notifications/NotificationsTests.swift new file mode 100644 index 000000000000..75f67801a16f --- /dev/null +++ b/Tests/JetpackUITests/Tests/Notifications/NotificationsTests.swift @@ -0,0 +1,97 @@ +import XCTest + +/// Covers the Notifications tab: the list, its filters, each kind of notification and the menu. +/// +/// Runs on the fixtures backend. Showing the tab marks the account's notifications as seen, and +/// opening one marks it as read, so against a real account these tests would change it. The +/// fixture account always has the same five notifications, which the tests assert on. +final class NotificationsTests: JetpackUITestCase { + override class var backend: Backend { .fixtures } + override class var resetsAppBeforeEachTest: Bool { false } + + private enum Fixture { + static let likes = "Amechie Ajimobi and 5 others liked your post" + static let comment = "Reyansh Pawar commented on" + static let post = "Kate Williams posted on" + static let followers = "Pamela Nguyen and 4 others followed your blog" + static let achievement = "October 5: Your best day for likes" + + static let all = [likes, comment, post, followers, achievement] + } + + private func notifications() throws -> NotificationsScreen { + try MySiteScreen(app: app) + .goToNotifications() + } + + func testListShowsEveryNotification() throws { + let notifications = try notifications() + .select(.all) + + for text in Fixture.all { + try notifications.waitFor(notifications.notification(beginningWith: text)) + } + } + + func testFilters() throws { + let notifications = try notifications() + + let expected: [(NotificationsScreen.Filter, [String])] = [ + (.unread, [Fixture.likes, Fixture.post, Fixture.followers]), + (.comments, [Fixture.comment]), + (.subscribers, [Fixture.followers]), + (.likes, [Fixture.likes]), + (.all, Fixture.all) + ] + for (filter, texts) in expected { + try notifications.select(filter) + try notifications.wait(until: "\(texts.count) notifications under \(filter)") { + notifications.notifications.count == texts.count + } + for text in texts { + XCTAssertTrue( + notifications.notification(beginningWith: text).pollForExistence(timeout: 10), + "\(text) isn't under \(filter)" + ) + } + } + } + + func testLikesNotification() throws { + try notifications() + .goToNotification(beginningWith: Fixture.likes, titled: "6 Likes") + .waitForScreen() + } + + func testCommentNotification() throws { + try notifications() + .goToNotification(beginningWith: Fixture.comment, titled: "Comment") + .waitForScreen() + } + + func testFollowersNotification() throws { + try notifications() + .goToNotification(beginningWith: Fixture.followers, titled: "5 Followers") + .waitForScreen() + } + + func testAchievementNotification() throws { + try notifications() + .goToNotification(beginningWith: Fixture.achievement, titled: "5 Likes") + .waitForScreen() + } + + func testSteppingBetweenNotifications() throws { + try notifications() + .goToNotification(beginningWith: Fixture.likes, titled: "6 Likes") + .goToPreviousNotification(titled: "Comment") + .goToNextNotification(titled: "6 Likes") + .waitForScreen() + } + + func testMenu() throws { + try notifications() + .openMenu() + .waitForItems(["Mark All As Read", "Notification Settings"]) + } +} diff --git a/Tests/JetpackUITests/Tests/Reader/ReaderActionTests.swift b/Tests/JetpackUITests/Tests/Reader/ReaderActionTests.swift new file mode 100644 index 000000000000..ec70fc978154 --- /dev/null +++ b/Tests/JetpackUITests/Tests/Reader/ReaderActionTests.swift @@ -0,0 +1,43 @@ +import XCTest + +/// Covers the Reader's actions on a post, and that each one reaches the server. +/// +/// Runs on the fixtures backend, where the "server" is the fixtures: the app's requests are +/// logged with the fixture that answered each, so a test can check both that the action was sent +/// and that the app showed what came back. An action changes what the app has stored, so each +/// test starts from a reset app. +final class ReaderActionTests: JetpackUITestCase { + override class var backend: Backend { .fixtures } + + private enum Fixture { + static let post = "Optimizing Meat 2.0" + /// The endpoint that likes that post, which is post 125073 on site 70135762. + static let likeEndpoint = "/rest/v1.1/sites/70135762/posts/125073/likes/new" + static let likeFixture = "wpcom/reader/reader_like_post.json" + } + + func testLikingAPost() throws { + let reader = try MySiteScreen(app: app) + .goToReader() + + // Nothing is liked to begin with. + let likes = try reader.goTo(.likes) + try likes.wait(until: "an empty Likes stream") { likes.isEmpty } + + let recent = try likes.goBackToMenu().goTo(.recent) + try recent.waitFor(recent.likeButton(ofPostTitled: Fixture.post)) + XCTAssertEqual(recent.likeButton(ofPostTitled: Fixture.post).label, "Like. 34 likes.") + + try recent.like(postTitled: Fixture.post) + + // The server was asked to like the post, once, and said it had. + let request = try waitForRequest("POST", path: Fixture.likeEndpoint) + XCTAssertEqual(request.status, 200) + XCTAssertEqual(request.fixture, Fixture.likeFixture) + XCTAssertEqual(try requestCount("POST", path: Fixture.likeEndpoint), 1) + + // The post is now in the Likes stream, which the app fetches again from the server. + let likesAfter = try recent.goBackToMenu().goTo(.likes) + try likesAfter.waitFor(likesAfter.post(titled: Fixture.post)) + } +} diff --git a/Tests/JetpackUITests/Tests/Reader/ReaderTests.swift b/Tests/JetpackUITests/Tests/Reader/ReaderTests.swift new file mode 100644 index 000000000000..1093fdc2306a --- /dev/null +++ b/Tests/JetpackUITests/Tests/Reader/ReaderTests.swift @@ -0,0 +1,104 @@ +import XCTest + +/// Covers the Reader tab: its menu, its streams, a post and a post's menu. +/// +/// Runs on the fixtures backend. Opening a post in the Reader counts as a view of it and can mark +/// it as seen, so against a real account these tests would leave a trace. The fixture account +/// always has the same subscriptions and posts, which the tests assert on. +final class ReaderTests: JetpackUITestCase { + override class var backend: Backend { .fixtures } + override class var resetsAppBeforeEachTest: Bool { false } + + private enum Fixture { + static let post = "Optimizing Meat 2.0" + static let postSite = "Longreads" + static let postAuthor = "Aaron Gilbreath" + static let subscriptions = ["Automattic Design", "WordPress.com News"] + } + + private func reader() throws -> ReaderScreen { + try MySiteScreen(app: app) + .goToReader() + } + + func testMenuListsTheSubscriptions() throws { + let reader = try reader() + + for name in Fixture.subscriptions { + XCTAssertTrue(reader.menu.staticTexts[name].pollForExistence(timeout: 10), "\(name) isn't in the menu") + } + } + + func testMenuEditing() throws { + try reader() + .toggleEditing() + .toggleEditing() + } + + func testRecent() throws { + let recent = try reader() + .goTo(.recent) + + try recent.waitFor(recent.post(titled: Fixture.post)) + } + + func testSaved() throws { + let saved = try reader() + .goTo(.saved) + + try saved.wait(until: "an empty Saved stream") { saved.isEmpty } + } + + func testLikes() throws { + let likes = try reader() + .goTo(.likes) + + try likes.wait(until: "an empty Likes stream") { likes.isEmpty } + } + + func testSearch() throws { + let search = try reader() + .goTo(.search) + + try search.waitFor(app.searchFields.firstMatch) + for scope in ["posts", "sites"] { + XCTAssertTrue(app.buttons[scope].pollForExistence(timeout: 10), "The \(scope) scope is missing") + } + } + + func testSubscriptions() throws { + let subscriptions = try reader() + .goTo(.subscriptions) + + for name in Fixture.subscriptions { + let row = app.buttons.matching(NSPredicate(format: "label BEGINSWITH %@", name)).firstMatch + try subscriptions.waitFor(row) + } + } + + func testSubscribedSite() throws { + try reader() + .goToSubscription(named: "WordPress.com News") + .waitForScreen() + } + + func testPost() throws { + let post = try reader() + .goTo(.recent) + .goToPost(titled: Fixture.post) + .waitForScreen() + + XCTAssertTrue(post.site(named: Fixture.postSite).pollForExistence(timeout: 10), "The post's site isn't shown") + XCTAssertTrue( + post.author(named: Fixture.postAuthor).pollForExistence(timeout: 10), + "The post's author isn't shown" + ) + } + + func testPostMenu() throws { + try reader() + .goTo(.recent) + .openMenu(ofPostTitled: Fixture.post) + .waitForItems(["Share", "Copy Link", "View in Browser", "Unsubscribe"]) + } +} diff --git a/Tests/JetpackUITests/Tests/Stats/StatsCustomizationTests.swift b/Tests/JetpackUITests/Tests/Stats/StatsCustomizationTests.swift new file mode 100644 index 000000000000..42c8e3b41435 --- /dev/null +++ b/Tests/JetpackUITests/Tests/Stats/StatsCustomizationTests.swift @@ -0,0 +1,126 @@ +import XCTest + +/// Covers the Stats buttons that change what the Traffic tab shows: the chart's metric, type and +/// granularity, a top list's data type, the date range, and the cards themselves. +/// +/// The app stores these choices on the device, not on the site, so each test starts from a reset +/// app instead of sharing a sign-in. +final class StatsCustomizationTests: JetpackUITestCase { + private func stats() throws -> StatsScreen { + try MySiteScreen(app: app) + .goToStats() + } + + func testChartCard() throws { + let stats = try stats() + + for metric in StatsScreen.Metric.allCases { + try stats.select(metric) + } + + // Chart type + try stats.openChartCardMenu().select("Lines") + var menu = try stats.openChartCardMenu() + try stats.wait(until: "the Lines chart type selected") { menu.item("Lines").isSelected } + try menu.select("Bars") + + // Granularity: the item that opens the submenu is titled with the current one. + try stats.openChartCardMenu().select("Days").select("Weeks") + menu = try stats.openChartCardMenu() + try menu.waitForItems(["Weeks"]) + } + + func testTopListCard() throws { + let stats = try stats() + + var current = StatsScreen.DataType.postsAndPages + for dataType in StatsScreen.DataType.allCases { + try stats.switchCard(listing: current, to: dataType) + try stats.wait(until: "the first top list card listing \(dataType.title)") { + stats.firstTopListCardTitle.label == "\(dataType.title) card" + } + current = dataType + } + + for level in StatsScreen.LocationLevel.allCases { + try stats.select(level) + } + } + + func testDateRange() throws { + let stats = try stats() + + // Presets: these three title the date range button. + for preset in ["Last 30 Days", "Last 12 Months", "Last 7 Days"] { + try stats.openDateRangeMenu().select(preset) + try stats.wait(until: "the date range \(preset)") { stats.dateRangeButton.label.hasPrefix(preset) } + } + + // Presets: the rest title it with their dates. + for preset in ["Today", "This Week", "This Month", "This Year", "Last 7 Days"] { + try stats.openDateRangeMenu().select(preset) + try stats.waitFor(stats.chartCard) + } + + // Navigation + let range = stats.dateRangeButton.label + stats.dateBackwardButton.tap() + try stats.wait(until: "an earlier date range") { stats.dateRangeButton.label != range } + let earlierRange = stats.dateRangeButton.label + stats.dateForwardButton.tap() + try stats.wait(until: "a later date range") { stats.dateRangeButton.label != earlierRange } + + // Comparison period + try stats.openDateRangeMenu().select(beginningWith: "Compare With…").select("No Comparison") + // The item is titled with the comparison period unless there isn't one. + try stats.openDateRangeMenu().waitForItems(["Compare With…"]) + } + + func testTodayCard() throws { + let stats = try stats() + + let range = stats.dateRangeButton.label + try stats.tapTodayCard() + try stats.wait(until: "the date range narrowed to today") { stats.dateRangeButton.label != range } + } + + // A card only lists items that have stats in the date range, and a quiet site can go a week + // without a view or a referrer, so these two widen the range before opening an item. + + func testPostStats() throws { + let stats = try stats() + + try stats.openDateRangeMenu().select("Last 12 Months") + try stats + .goToFirstItem(ofCardListing: .postsAndPages, titled: "Post Stats") + .waitForScreen() + } + + func testReferrerStats() throws { + let stats = try stats() + + try stats.openDateRangeMenu().select("Last 12 Months") + try stats + .goToFirstItem(ofCardListing: .referrers, titled: "Referrer") + .waitForScreen() + } + + func testCardLayout() throws { + let stats = try stats() + + // Move + try stats.waitFor(stats.todayCard) + try stats.openChartCardMenu().select("Move Card").select("Move to Top") + try stats.wait(until: "the chart card above the Today card") { + stats.chartCard.frame.minY < stats.todayCard.frame.minY + } + + // Delete + try stats.openTodayCardMenu().select("Delete Card") + try stats.wait(until: "the Today card removed") { !stats.todayCard.exists } + + // Add + try stats.openAddCardMenu().select(beginningWith: "Today,") + try stats.wait(until: "the Today card added back") { stats.todayCard.exists } + } +} diff --git a/Tests/JetpackUITests/Tests/Stats/StatsFixtureTests.swift b/Tests/JetpackUITests/Tests/Stats/StatsFixtureTests.swift new file mode 100644 index 000000000000..a4c2e0d90e1c --- /dev/null +++ b/Tests/JetpackUITests/Tests/Stats/StatsFixtureTests.swift @@ -0,0 +1,110 @@ +import XCTest + +/// Checks that the fixtures have everything Stats asks for, so that its screens show data. +/// +/// Each test walks part of Stats and then fails if a request went unanswered, or if Stats reported +/// that a card failed to load, which is what happens when a fixture has the wrong shape. +/// +/// The walks change what the Traffic tab shows, which the app remembers, so each test starts from +/// a reset app. +final class StatsFixtureTests: JetpackUITestCase { + override class var backend: Backend { .fixtures } + + private func stats() throws -> StatsScreen { + try MySiteScreen(app: app) + .goToStats() + } + + func testTrafficCards() throws { + let stats = try stats() + + // Cards below the fold only load once they're scrolled to, and the button to add one is + // below them all. + try stats.scroll( + to: stats.addCardButton, + in: stats.content, + maxSwipes: StatsScreen.maxSwipes, + waitsForExistence: false + ) + + try assertStatsLoaded() + } + + func testEveryTopList() throws { + let stats = try stats() + + var current = StatsScreen.DataType.postsAndPages + for dataType in StatsScreen.DataType.allCases { + try stats.switchCard(listing: current, to: dataType) + try stats.wait(until: "the first top list card listing \(dataType.title)") { + stats.firstTopListCardTitle.label == "\(dataType.title) card" + } + current = dataType + } + + for level in StatsScreen.LocationLevel.allCases { + try stats.select(level) + } + + try assertStatsLoaded() + } + + func testEveryDateRange() throws { + let stats = try stats() + + let presets = ["Today", "This Week", "This Month", "This Year", "Last 30 Days", "Last 12 Months", "Last 7 Days"] + for preset in presets { + try stats.openDateRangeMenu().select(preset) + try stats.waitFor(stats.chartCard) + } + + try assertStatsLoaded() + } + + func testPostStats() throws { + _ = try stats() + .goToFirstItem(ofCardListing: .postsAndPages, titled: "Post Stats") + + try assertStatsLoaded() + } + + func testInsightsTab() throws { + let stats = try stats() + .select(.insights) + scrollToTheEnd(of: stats) + + try assertStatsLoaded() + } + + func testSubscribersTab() throws { + let stats = try stats() + .select(.subscribers) + scrollToTheEnd(of: stats) + + try assertStatsLoaded() + } + + /// Scrolls through a tab, so that it asks for what it only loads once it's on screen. + private func scrollToTheEnd(of stats: StatsScreen) { + for _ in 0..<6 { + stats.swipeUp(stats.content) + } + } + + /// Fails if Stats asked for something no fixture answered, or reported an error loading a card. + private func assertStatsLoaded(file: StaticString = #filePath, line: UInt = #line) throws { + // Stats reports its errors as analytics events, which the app sends once a second when it + // runs against the fixtures. + Thread.sleep(forTimeInterval: 3) + + let unanswered = try unansweredRequests() + .filter { $0.url.path().contains("/stats") || $0.url.path().contains("/posts/") } + .map { "No fixture for \($0.method) \($0.url.absoluteString)" } + let errors = try sentAnalyticsEvents() + .filter { $0.name == "jpios_jetpack_stats_error_encountered" } + .map { "Stats reported \($0)" } + let problems = Set(unanswered + errors).sorted() + + XCTAssertTrue(problems.isEmpty, problems.joined(separator: "\n"), file: file, line: line) + } +} diff --git a/Tests/JetpackUITests/Tests/Stats/StatsTests.swift b/Tests/JetpackUITests/Tests/Stats/StatsTests.swift new file mode 100644 index 000000000000..97a194c85df4 --- /dev/null +++ b/Tests/JetpackUITests/Tests/Stats/StatsTests.swift @@ -0,0 +1,204 @@ +import XCTest + +/// Covers what every button on the Stats screen opens, on each of its three tabs. +/// +/// These tests open menus, sheets and detail screens without choosing anything in them, so they +/// share one sign-in. `StatsCustomizationTests` covers the buttons that change what Stats shows. +final class StatsTests: JetpackUITestCase { + override class var resetsAppBeforeEachTest: Bool { false } + + private func stats(_ tab: StatsScreen.Tab = .traffic) throws -> StatsScreen { + try MySiteScreen(app: app) + .goToStats() + .select(tab) + } + + // MARK: - Traffic + + func testNavigationBarMenu() throws { + try stats() + .openNavigationBarMenu() + .waitForItems(["Disable New Stats", "Send Feedback"]) + } + + func testTodayCardMenu() throws { + try stats() + .openTodayCardMenu() + .waitForItems(["Learn More", "Move Card", "Delete Card"]) + } + + func testChartCardMenu() throws { + try stats() + .openChartCardMenu() + .waitForItems(["Lines", "Bars", "Show Data", "Learn More", "Move Card", "Edit Card", "Delete Card"]) + } + + func testChartCardMoveMenu() throws { + try stats() + .openChartCardMenu() + .select("Move Card") + .waitForItems(["Move Up", "Move to Top", "Move Down", "Move to Bottom"]) + } + + func testChartCardGranularityMenu() throws { + try stats() + .openChartCardMenu() + .select("Days") + .waitForItems(["Automatic", "Weeks", "Months", "Years"]) + } + + func testChartData() throws { + try stats() + .goToChartData() + .waitForScreen() + .close() + } + + func testChartCardCustomization() throws { + try stats() + .goToChartCardCustomization() + .waitForScreen() + .cancel() + } + + func testTopListCardMenu() throws { + try stats() + .openMenu(ofCardListing: .postsAndPages) + .waitForItems(["Learn More", "Move Card", "Edit Card", "Delete Card"]) + } + + func testTopListCardCustomization() throws { + try stats() + .goToCustomization(ofCardListing: .postsAndPages) + .waitForScreen() + .cancel() + } + + func testTopListCardDataTypeMenu() throws { + try stats() + .openDataTypeMenu(ofCardListing: .postsAndPages) + .waitForItems(StatsScreen.DataType.allCases.map(\.title)) + } + + func testPostsAndPagesShowAll() throws { + try stats() + .goToAllItems(ofCardListing: .postsAndPages) + .waitForScreen() + } + + func testReferrersShowAll() throws { + try stats() + .goToAllItems(ofCardListing: .referrers) + .waitForScreen() + } + + func testLocationsShowAll() throws { + try stats() + .goToAllItems(ofCardListing: .locations) + .waitForScreen() + } + + func testLocationLevelMenu() throws { + try stats() + .openLocationLevelMenu() + .waitForItems(StatsScreen.LocationLevel.allCases.map(\.rawValue)) + } + + func testAddCardMenu() throws { + try stats() + .openAddCardMenu() + .waitForScreen() + } + + func testTimeZoneInfo() throws { + try stats() + .openTimeZoneInfo() + } + + func testDateRangeMenu() throws { + let presets = ["Last 7 Days", "Last 30 Days", "Last 12 Months", "Today", "This Week", "This Month", "This Year"] + try stats() + .openDateRangeMenu() + .waitForItems(presets + ["More…"]) + } + + func testComparisonMenu() throws { + let menu = try stats() + .openDateRangeMenu() + .select(beginningWith: "Compare With…") + + try menu.waitForItems(["No Comparison"]) + try menu.waitFor(menu.item(beginningWith: "Preceding Period")) + try menu.waitFor(menu.item(beginningWith: "Last Year")) + } + + func testCustomDateRange() throws { + try stats() + .goToCustomDateRange() + .waitForScreen() + .cancel() + } + + // MARK: - Insights + + func testInsightsViewsAndVisitors() throws { + try stats(.insights) + .goToViewsAndVisitors() + .waitForScreen() + } + + func testInsightsChart() throws { + let stats = try stats(.insights) + + for chart in StatsScreen.InsightsChart.allCases { + try stats.select(chart) + } + } + + func testInsightsTotalLikes() throws { + try stats(.insights) + .goToDetails(of: .totalLikes) + .waitForScreen() + } + + func testInsightsTotalComments() throws { + try stats(.insights) + .goToDetails(of: .totalComments) + .waitForScreen() + } + + func testInsightsTotalSubscribers() throws { + try stats(.insights) + .goToDetails(of: .totalSubscribers) + .waitForScreen() + } + + func testInsightsLatestPost() throws { + try stats(.insights) + .goToLatestPost() + .waitForScreen() + .dismiss() + } + + func testInsightsManageCards() throws { + try stats(.insights) + .goToManageStatsCards() + .waitForScreen() + .close() + } + + func testInsightsAddCard() throws { + try stats(.insights) + .goToManageStatsCardsFromAddCard() + .waitForScreen() + .close() + } + + // MARK: - Subscribers + + func testSubscribersViewMore() throws { + try stats(.subscribers) + .goToAllSubscribers() + .waitForScreen() + } +} diff --git a/WordPress/Classes/Login/WordPressDotComAuthenticator.swift b/WordPress/Classes/Login/WordPressDotComAuthenticator.swift index fba48eead683..1c3b4315cea4 100644 --- a/WordPress/Classes/Login/WordPressDotComAuthenticator.swift +++ b/WordPress/Classes/Login/WordPressDotComAuthenticator.swift @@ -57,6 +57,15 @@ struct WordPressDotComAuthenticator { rawValue: "WordPressDotComAuthenticatorCallbackURL" ) + /// A WordPress.com bearer token supplied as a launch argument, used to sign a Simulator in + /// without the web flow. Reads `-wpcom-token`, falling back to the legacy + /// `-ui-test-wpcom-token` argument for backward compatibility. + static var launchArgumentToken: String? { + let defaults = UserDefaults.standard + return defaults.string(forKey: "wpcom-token") + ?? defaults.string(forKey: "ui-test-wpcom-token") + } + static func redirectURI(for scheme: String) -> String { "\(scheme)://oauth2-callback" } @@ -131,7 +140,7 @@ struct WordPressDotComAuthenticator { let token: String do { - if let tokenLaunchArgument = UserDefaults.standard.string(forKey: "ui-test-wpcom-token") { + if let tokenLaunchArgument = Self.launchArgumentToken { token = tokenLaunchArgument } else { token = try await authenticate( diff --git a/WordPress/Classes/System/Root View/RootViewCoordinator.swift b/WordPress/Classes/System/Root View/RootViewCoordinator.swift index 2de493c3b197..da952d486b5e 100644 --- a/WordPress/Classes/System/Root View/RootViewCoordinator.swift +++ b/WordPress/Classes/System/Root View/RootViewCoordinator.swift @@ -92,6 +92,7 @@ class RootViewCoordinator { self.rootViewPresenter = nil WordPressAppDelegate.shared?.autoSignInUITestSite() + WordPressAppDelegate.shared?.autoSignInWPComAccountFromLaunchArgumentIfNeeded() } private func createPresenter(_ appType: AppUIType) -> RootViewPresenter { diff --git a/WordPress/Classes/System/UITesting/UITestConfigurator.swift b/WordPress/Classes/System/UITesting/UITestConfigurator.swift index 2f217301c150..2724870530c9 100644 --- a/WordPress/Classes/System/UITesting/UITestConfigurator.swift +++ b/WordPress/Classes/System/UITesting/UITestConfigurator.swift @@ -1,11 +1,23 @@ -import Foundation +import UIKit import WordPressData +#if UI_TEST_HTTP_FIXTURES +import HTTPFixtures +#endif + struct UITestConfigurator { static func prepareApplicationForUITests() { if CommandLine.arguments.contains("-ui-test-reset-everything") { resetEverything() } + if CommandLine.arguments.contains("-ui-test-disable-animations") { + // A UI test waits for the app's animations to finish before every tap and query. + UIView.setAnimationsEnabled(false) + } + + #if UI_TEST_HTTP_FIXTURES + serveHTTPFixturesIfNeeded() + #endif } private static func resetEverything() { @@ -17,4 +29,36 @@ struct UITestConfigurator { UserDefaults.standard.removeObject(forKey: key) } } + + #if UI_TEST_HTTP_FIXTURES + /// Whether the app is answering its network requests from fixtures. + static var isServingHTTPFixtures: Bool { + UserDefaults.standard.string(forKey: "ui-test-http-fixtures") != nil + } + + /// Answers the app's network requests from the fixtures in the directory passed as the + /// `-ui-test-http-fixtures` launch argument, so UI tests run against data that doesn't change. + /// + /// The `-ui-test-http-log` launch argument names a file to log every request to. + /// + /// This has to run before the app creates a `URLSession`. See `FixtureURLProtocol`. + /// + /// Only a build that sets the `UI_TEST_HTTP_FIXTURES` compilation condition has this, or the + /// `HTTPFixtures` module it uses. The build for the UI tests sets it: see `docs/ui-tests.md`. + private static func serveHTTPFixturesIfNeeded() { + let defaults = UserDefaults.standard + guard let directory = defaults.string(forKey: "ui-test-http-fixtures") else { + return + } + + do { + let fixtures = try FixtureSet(directory: URL(filePath: directory)) + let requestLog = defaults.string(forKey: "ui-test-http-log").map { URL(filePath: $0) } + FixtureURLProtocol.install(fixtures: fixtures, requestLog: requestLog) + } catch { + // A test that ran against the network instead would fail in ways that don't point here. + fatalError("Failed to load the HTTP fixtures in \(directory): \(error)") + } + } + #endif } diff --git a/WordPress/Classes/System/WordPressAppDelegate.swift b/WordPress/Classes/System/WordPressAppDelegate.swift index 86e84d1139b0..c49480353346 100644 --- a/WordPress/Classes/System/WordPressAppDelegate.swift +++ b/WordPress/Classes/System/WordPressAppDelegate.swift @@ -63,6 +63,10 @@ public class WordPressAppDelegate: UIResponder, UIApplicationDelegate { private let remoteFeatureFlagStore = RemoteFeatureFlagStore() private let remoteConfigStore = RemoteConfigStore() + /// Limits the `-wpcom-token` launch-argument sign-in to a single attempt per process, + /// so signing out (which returns to the login screen) doesn't immediately re-sign in. + private var didAttemptLaunchArgumentSignIn = false + private var mainContext: NSManagedObjectContext { ContextManager.shared.mainContext } @@ -915,4 +919,36 @@ extension WordPressAppDelegate { } ) } + + /// Completes WordPress.com sign-in automatically when a bearer token is supplied via the + /// `-wpcom-token` launch argument, so a Simulator can be signed in with a single + /// `simctl launch` and no taps on the login screen. + /// + /// No-op when the argument is absent, a WordPress.com account is already signed in, or a + /// launch-argument sign-in was already attempted this process. The last case matters because + /// signing out returns to the login screen — without it, the still-present token would + /// immediately sign the account back in. + func autoSignInWPComAccountFromLaunchArgumentIfNeeded() { + guard WordPressDotComAuthenticator.launchArgumentToken != nil else { + return + } + guard !didAttemptLaunchArgumentSignIn else { + return + } + guard (try? WPAccount.lookupDefaultWordPressComAccount(in: ContextManager.shared.mainContext)) == nil else { + return + } + guard let presenter = window?.topmostPresentedViewController else { + return + } + didAttemptLaunchArgumentSignIn = true + Task { @MainActor in + guard await WordPressDotComAuthenticator().signIn(from: presenter, context: .default) != nil else { + return + } + // Creating the account isn't enough on its own — without this the app stays on the + // login screen. Swap the window root to the signed-in app (no epilogue, so no taps). + windowManager.showUI() + } + } } diff --git a/WordPress/Classes/Utility/Analytics/AnalyticsTrackerAutomatticTracks.swift b/WordPress/Classes/Utility/Analytics/AnalyticsTrackerAutomatticTracks.swift index ffb11bcd8ab5..41ae0c0131fd 100644 --- a/WordPress/Classes/Utility/Analytics/AnalyticsTrackerAutomatticTracks.swift +++ b/WordPress/Classes/Utility/Analytics/AnalyticsTrackerAutomatticTracks.swift @@ -31,6 +31,14 @@ import BuildSettingsKit tracksService.eventNamePrefix = eventNamePrefix tracksService.platform = platform self.appURLScheme = appURLScheme + + #if UI_TEST_HTTP_FIXTURES + // A UI test reads the app's events out of the requests that send them, so don't make it + // wait the usual 15 seconds for each batch. + if UITestConfigurator.isServingHTTPFixtures { + tracksService.queueSendInterval = 1 + } + #endif } // MARK: - WPAnalyticsTracker diff --git a/WordPress/Classes/ViewRelated/Blog/Blog Dashboard/Cards/Posts/BlogDashboardCardFrameView.swift b/WordPress/Classes/ViewRelated/Blog/Blog Dashboard/Cards/Posts/BlogDashboardCardFrameView.swift index 0ca553a27860..7735ba463981 100644 --- a/WordPress/Classes/ViewRelated/Blog/Blog Dashboard/Cards/Posts/BlogDashboardCardFrameView.swift +++ b/WordPress/Classes/ViewRelated/Blog/Blog Dashboard/Cards/Posts/BlogDashboardCardFrameView.swift @@ -33,6 +33,7 @@ class BlogDashboardCardFrameView: UIView { titleLabel.adjustsFontForContentSizeCategory = true titleLabel.font = .preferredFont(forTextStyle: .subheadline).withWeight(.semibold) titleLabel.accessibilityTraits = .button + titleLabel.accessibilityIdentifier = "dashboard-card-header" titleLabel.numberOfLines = 0 return titleLabel }() @@ -49,6 +50,7 @@ class BlogDashboardCardFrameView: UIView { button.tintColor = UIColor.secondaryLabel button.isAccessibilityElement = true button.accessibilityLabel = Strings.ellipsisButtonAccessibilityLabel + button.accessibilityIdentifier = "dashboard-card-more-button" button.accessibilityTraits = .button button.isHidden = true button.setContentHuggingPriority(.defaultHigh, for: .horizontal) diff --git a/WordPress/Classes/ViewRelated/Blog/Blog Dashboard/ViewModel/BlogDashboardViewModel.swift b/WordPress/Classes/ViewRelated/Blog/Blog Dashboard/ViewModel/BlogDashboardViewModel.swift index 9f2815254f06..de5d2f7f3755 100644 --- a/WordPress/Classes/ViewRelated/Blog/Blog Dashboard/ViewModel/BlogDashboardViewModel.swift +++ b/WordPress/Classes/ViewRelated/Blog/Blog Dashboard/ViewModel/BlogDashboardViewModel.swift @@ -77,6 +77,7 @@ final class BlogDashboardViewModel { case .cards(let cardModel): let cellType = cardModel.cardType.cell let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellType.defaultReuseID, for: indexPath) + cell.accessibilityIdentifier = "dashboard-card-\(cardModel.cardType.rawValue)" if var cellConfigurable = cell as? BlogDashboardCardConfigurable { cellConfigurable.row = indexPath.row cellConfigurable.configure(blog: blog, viewController: viewController, model: cardModel) diff --git a/WordPress/Classes/ViewRelated/Blog/Blog Details/BlogDetailsTableViewModel.swift b/WordPress/Classes/ViewRelated/Blog/Blog Details/BlogDetailsTableViewModel.swift index 8a3180fd56a4..4eb2aaf5a9e4 100644 --- a/WordPress/Classes/ViewRelated/Blog/Blog Details/BlogDetailsTableViewModel.swift +++ b/WordPress/Classes/ViewRelated/Blog/Blog Details/BlogDetailsTableViewModel.swift @@ -1142,6 +1142,7 @@ extension Row { Row( kind: .comments, title: Strings.comments, + accessibilityIdentifier: "Comments Row", image: (UIImage(named: "site-menu-comments"))?.imageFlippedForRightToLeftLayoutDirection(), action: { [weak viewController] userInfo in // When called from showDetailView, use .link as source (matching Objective-C behavior) @@ -1258,6 +1259,7 @@ extension Row { Row( kind: .themes, title: Strings.themes, + accessibilityIdentifier: "Themes Row", image: UIImage(named: "site-menu-themes"), action: { [weak viewController] _ in viewController?.showThemes() @@ -1269,6 +1271,7 @@ extension Row { Row( kind: .menu, title: Strings.menus, + accessibilityIdentifier: "Menus Row", image: UIImage.gridicon(.menus).imageFlippedForRightToLeftLayoutDirection(), action: { [weak viewController] _ in viewController?.showMenus() @@ -1325,6 +1328,7 @@ extension Row { Row( kind: .subscribers, title: Strings.subscribers, + accessibilityIdentifier: "Subscribers Row", image: UIImage(named: "wpl-mail"), action: { [weak viewController] _ in MainActor.assumeIsolated { @@ -1429,6 +1433,7 @@ extension Row { Row( kind: .sharing, title: Strings.socialRowTitle, + accessibilityIdentifier: "Social Row", image: UIImage(named: "site-menu-social"), action: { [weak viewController] userInfo in // When called from showDetailView, use .link as source (matching Objective-C behavior) diff --git a/WordPress/Classes/ViewRelated/Blog/Subscribers/Details/SubscriberDetailsView.swift b/WordPress/Classes/ViewRelated/Blog/Subscribers/Details/SubscriberDetailsView.swift index 279e2057d87b..10d17016feea 100644 --- a/WordPress/Classes/ViewRelated/Blog/Subscribers/Details/SubscriberDetailsView.swift +++ b/WordPress/Classes/ViewRelated/Blog/Subscribers/Details/SubscriberDetailsView.swift @@ -28,6 +28,7 @@ struct SubscriberDetailsView: View { .padding() .disabled(isDeleting) } + .accessibilityIdentifier("subscriber-details") .task { await refresh() } diff --git a/WordPress/Classes/ViewRelated/Domains/Views/SiteDomainsView.swift b/WordPress/Classes/ViewRelated/Domains/Views/SiteDomainsView.swift index f770c0f9ad3b..173e7364031d 100644 --- a/WordPress/Classes/ViewRelated/Domains/Views/SiteDomainsView.swift +++ b/WordPress/Classes/ViewRelated/Domains/Views/SiteDomainsView.swift @@ -97,6 +97,7 @@ struct SiteDomainsView: View { .foregroundColor(.secondary.opacity(0.5)) } } + .accessibilityIdentifier("site-domain-row") } else { AllDomainsListCardView(viewModel: row.viewModel, padding: 0) } diff --git a/WordPress/Classes/ViewRelated/People/Controllers/PersonViewController.swift b/WordPress/Classes/ViewRelated/People/Controllers/PersonViewController.swift index e1d6d36726a0..e1012e7fbd10 100644 --- a/WordPress/Classes/ViewRelated/People/Controllers/PersonViewController.swift +++ b/WordPress/Classes/ViewRelated/People/Controllers/PersonViewController.swift @@ -85,6 +85,7 @@ final class PersonViewController: UITableViewController { super.viewDidLoad() WPStyleGuide.configureAutomaticHeightRows(for: tableView) + tableView.accessibilityIdentifier = "person_table_view" } override func viewWillAppear(_ animated: Bool) { diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index f4dc1effa9b4..b08f42e15282 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -228,6 +228,13 @@ remoteGlobalIDString = 0CED016F2D95B897003015CF; remoteInfo = Keystone; }; + 24753234306C77300075CFDD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = FABB1F8F2602FC2C00C8785C; + remoteInfo = Jetpack; + }; 3FCFFAFD2994A949002840C9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; @@ -530,6 +537,7 @@ 24351059264DC1E2009BB2B6 /* Jetpack.release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Jetpack.release.xcconfig; sourceTree = ""; }; 24351253264DCA08009BB2B6 /* Secrets.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Secrets.swift; path = ../Secrets/Secrets.swift; sourceTree = BUILT_PRODUCTS_DIR; }; 2439B1DB264ECBDF00239130 /* Jetpack.alpha.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Jetpack.alpha.xcconfig; sourceTree = ""; }; + 2475322C306C77300075CFDD /* JetpackUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = JetpackUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 24AE9E66264B34E500AC7F15 /* Secrets-example.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Secrets-example.swift"; sourceTree = ""; }; 24B54FAE2624F8430041B18E /* JetpackRelease-Alpha.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "JetpackRelease-Alpha.entitlements"; sourceTree = ""; }; 24B54FAF2624F84C0041B18E /* JetpackRelease.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = JetpackRelease.entitlements; sourceTree = ""; }; @@ -800,6 +808,13 @@ ); target = E16AB92914D978240047A2E5 /* WordPressTest */; }; + 24753236306C77300075CFDD /* Exceptions for "JetpackUITests" folder in "JetpackUITests" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + JetpackUITests.xctestplan, + ); + target = 2475322B306C77300075CFDD /* JetpackUITests */; + }; 3F1A64F82DA7ABC300786B92 /* Exceptions for "Classes" folder in "Reader" target */ = { isa = PBXFileSystemSynchronizedBuildFileExceptionSet; membershipExceptions = ( @@ -944,6 +959,17 @@ path = Recoleta; sourceTree = ""; }; + 2475322D306C77300075CFDD /* JetpackUITests */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 24753236306C77300075CFDD /* Exceptions for "JetpackUITests" folder in "JetpackUITests" target */, + ); + explicitFolders = ( + Fixtures, + ); + path = JetpackUITests; + sourceTree = ""; + }; 24CE57C42CD3375200C7B37D /* Classes */ = { isa = PBXFileSystemSynchronizedRootGroup; exceptions = ( @@ -1068,6 +1094,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 24753229306C77300075CFDD /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 4A8280FA2E5FE9B60037E180 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -1183,6 +1216,7 @@ 0C73A9BD2DAEDFDE00CC0F3A /* KeystoneTests */, 0C3313C62E0439A9000C3760 /* MiniatureTests */, 4A8280FE2E5FE9B60037E180 /* WordPressKitTests */, + 2475322D306C77300075CFDD /* JetpackUITests */, ); name = Tests; path = ../Tests; @@ -1220,6 +1254,7 @@ 0C3313B72E0439A8000C3760 /* Miniature.app */, 0C3313C32E0439A9000C3760 /* MiniatureTests.xctest */, 4A8280FD2E5FE9B60037E180 /* WordPressKitTests.xctest */, + 2475322C306C77300075CFDD /* JetpackUITests.xctest */, ); name = Products; sourceTree = ""; @@ -1719,6 +1754,29 @@ productReference = 1D6058910D05DD3D006BFB54 /* WordPress.app */; productType = "com.apple.product-type.application"; }; + 2475322B306C77300075CFDD /* JetpackUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 24753233306C77300075CFDD /* Build configuration list for PBXNativeTarget "JetpackUITests" */; + buildPhases = ( + 24753228306C77300075CFDD /* Sources */, + 24753229306C77300075CFDD /* Frameworks */, + 2475322A306C77300075CFDD /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 24753235306C77300075CFDD /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + 2475322D306C77300075CFDD /* JetpackUITests */, + ); + name = JetpackUITests; + packageProductDependencies = ( + ); + productName = JetpackUITests; + productReference = 2475322C306C77300075CFDD /* JetpackUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; 4A8280FC2E5FE9B60037E180 /* WordPressKitTests */ = { isa = PBXNativeTarget; buildConfigurationList = 4A8281062E5FE9B70037E180 /* Build configuration list for PBXNativeTarget "WordPressKitTests" */; @@ -1994,6 +2052,10 @@ }; }; }; + 2475322B306C77300075CFDD = { + CreatedOnToolsVersion = 27.0; + TestTargetID = FABB1F8F2602FC2C00C8785C; + }; 4A8280FC2E5FE9B60037E180 = { CreatedOnToolsVersion = 16.4; TestTargetID = 1D6058900D05DD3D006BFB54; @@ -2112,6 +2174,7 @@ 0C3313B62E0439A8000C3760 /* Miniature */, 0C3313C22E0439A9000C3760 /* MiniatureTests */, 4A8280FC2E5FE9B60037E180 /* WordPressKitTests */, + 2475322B306C77300075CFDD /* JetpackUITests */, ); }; /* End PBXProject section */ @@ -2172,6 +2235,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 2475322A306C77300075CFDD /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 4A8280FB2E5FE9B60037E180 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -2688,6 +2758,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 24753228306C77300075CFDD /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 4A8280F92E5FE9B60037E180 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -2790,6 +2867,11 @@ target = 0CED016F2D95B897003015CF /* Keystone */; targetProxy = 0C5A8A7A2D9B22F100C25301 /* PBXContainerItemProxy */; }; + 24753235306C77300075CFDD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = FABB1F8F2602FC2C00C8785C /* Jetpack */; + targetProxy = 24753234306C77300075CFDD /* PBXContainerItemProxy */; + }; 3FCFFAFE2994A949002840C9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = FFA8E22A1F94E3DE0002170F /* SwiftLint */; @@ -3815,6 +3897,139 @@ }; name = Release; }; + 24753230306C77300075CFDD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GENERATE_INFOPLIST_FILE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.automattic.jetpack.JetpackUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SUPPORTED_PLATFORMS = iphonesimulator; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 6.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = Jetpack; + }; + name = Debug; + }; + 24753231306C77300075CFDD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GENERATE_INFOPLIST_FILE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.automattic.jetpack.JetpackUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SUPPORTED_PLATFORMS = iphonesimulator; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 6.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = Jetpack; + }; + name = Release; + }; + 24753232306C77300075CFDD /* Release-Alpha */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GENERATE_INFOPLIST_FILE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.automattic.jetpack.JetpackUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SUPPORTED_PLATFORMS = iphonesimulator; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 6.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = Jetpack; + }; + name = "Release-Alpha"; + }; 4A8281032E5FE9B60037E180 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = F14B5F70208E648200439554 /* WordPress.debug.xcconfig */; @@ -5307,6 +5522,16 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 24753233306C77300075CFDD /* Build configuration list for PBXNativeTarget "JetpackUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 24753230306C77300075CFDD /* Debug */, + 24753231306C77300075CFDD /* Release */, + 24753232306C77300075CFDD /* Release-Alpha */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 4A8281062E5FE9B70037E180 /* Build configuration list for PBXNativeTarget "WordPressKitTests" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/WordPress/WordPress.xcodeproj/xcshareddata/xcschemes/Jetpack.xcscheme b/WordPress/WordPress.xcodeproj/xcshareddata/xcschemes/Jetpack.xcscheme index b5ed1ba936d6..a88749f34c1b 100644 --- a/WordPress/WordPress.xcodeproj/xcshareddata/xcschemes/Jetpack.xcscheme +++ b/WordPress/WordPress.xcodeproj/xcshareddata/xcschemes/Jetpack.xcscheme @@ -27,31 +27,13 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - shouldUseLaunchSchemeArgsEnv = "YES" - shouldAutocreateTestPlan = "YES"> - - - - - - - - - - - - - - + shouldUseLaunchSchemeArgsEnv = "YES"> + + + + # target a specific simulator +``` + +`make sim-login` forwards to `Scripts/sim-signin.sh`, which you can run directly with the same options as flags — `--app`, `--device`, `--reset`: + +```bash +Scripts/sim-signin.sh --app wordpress --reset +``` + +`--reset` uninstalls and reinstalls the app for a clean slate — more thorough than the in-app data wipe (it also clears caches and cookies) and race-free (the reinstall is synchronous). The app must already be installed. + +The token is resolved from `WPCOM_TOKEN`, then `~/.wpcom-token`; if none is set the script prompts you to paste one (hidden) and offers to save it to `~/.wpcom-token` for next time. There's deliberately no command-line token flag — a token passed as an argument would be saved in your shell history. Set it once (export `WPCOM_TOKEN` in `~/.zshrc`, or write `~/.wpcom-token`) and you never pass it again. + +Or launch directly with the bearer token. The app finishes sign-in automatically while it sits on the login screen — no taps required: ```bash xcrun simctl launch --terminate-running-process booted org.wordpress \ - -ui-test-wpcom-token + -wpcom-token ``` -On the sign-in screen, tap **"Continue with WordPress.com"**. +The legacy `-ui-test-wpcom-token` argument is still accepted for backward compatibility. + +This raw form also saves the token in your shell history — `make sim-login` avoids that, since you never type the token. (Either way the token appears briefly in `ps` while `simctl launch` runs; that's inherent to passing it as a launch argument.) ## Self-hosted site diff --git a/docs/ui-tests.md b/docs/ui-tests.md new file mode 100644 index 000000000000..443e3e3b6ef5 --- /dev/null +++ b/docs/ui-tests.md @@ -0,0 +1,282 @@ +# UI Tests + +The `JetpackUITests` target holds the XCUITest UI tests for the Jetpack app. Most suites drive a real app build signed in to a real WordPress.com account, so they need a WordPress.com bearer token to run. A suite can instead run against [fixtures](#fixtures), which needs no token. + +## Running the tests + +The tests sign in with the same token as `make sim-login` (see [Simulator Sign-In](simulator-sign-in.md)): the `WPCOM_TOKEN` environment variable, then `~/.wpcom-token` on the Mac. Without a token, every test that needs one is skipped rather than failed. + +In Xcode, select the **Jetpack** scheme and a Simulator destination, then run the tests from the Test Navigator. `JetpackUITests` is the scheme's default test plan. This runs the suites that sign in to a real account, and not the ones that run against the fixtures: see below. + +From the command line: + +```bash +xcodebuild \ + -workspace WordPress.xcworkspace \ + -scheme Jetpack \ + -testPlan JetpackUITests \ + -destination 'platform=iOS Simulator,name=iPhone 18 Pro' \ + test \ + SWIFT_ACTIVE_COMPILATION_CONDITIONS='$(inherited) UI_TEST_HTTP_FIXTURES' +``` + +The last line is a build setting, and the suites that run against the [fixtures](#fixtures) need it. The code that serves the fixtures is left out of the app unless the build sets the `UI_TEST_HTTP_FIXTURES` compilation condition ([The build flag](#the-build-flag) has the details), and the command line is the only place it can be set from: Xcode has no way to give a compilation condition to a Swift package module, which is where that code is. Against an app built without it, such as one built in Xcode, each test in those suites fails as soon as the app has launched, with a message that says the fixtures weren't compiled in. + +fastlane's `test` lane sets it for the Jetpack scheme: + +```bash +bundle exec fastlane test scheme:Jetpack only_testing:JetpackUITests/ReaderTests +``` + +`xcodebuild` doesn't pass its own environment to the test runner, but it forwards any variable prefixed with `TEST_RUNNER_` with the prefix removed. To supply the token from the environment instead of `~/.wpcom-token`, export it as `TEST_RUNNER_WPCOM_TOKEN`. + +The tests only run on a Simulator, because the token file is read from the Mac's home directory. + +## Structure + +``` +Tests/JetpackUITests +├── JetpackUITests.xctestplan +├── Screens # One screen object per screen or component +├── Support # The test case and screen object base classes, credentials +└── Tests # The test cases, in a folder per area of the app +``` + +The folder is synchronized with the `JetpackUITests` target, so a new file is picked up without editing the project file. + +The suites are grouped by area of the app: `Me`, `MySite`, `Notifications`, `Reader` and `Stats`. Put a new suite in the folder for its area. + +## In CI + +CI runs the suites that run against the [fixtures](#fixtures), and not the ones that need a real account, which it has no token for. A suite is picked up by its `backend` override, so a new one runs without editing the pipeline. + +Each area runs in a job of its own, so that they run at the same time: the "UI Tests" step in `.buildkite/pipeline.yml` has a matrix of the folders under `Tests`. A new folder has to be added to it, and every job fails if it finds a fixture-backed suite in a folder that isn't there, so one can't be left out unnoticed. + +Each job runs its suites one after another on one Simulator. `test_without_building` can spread them over clones of the Simulator instead, when it's given `concurrent_workers`, but CI doesn't: a clone starts cold, and with four starting at once the first test on each took over a minute to reach My Site and timed out, so the run was no faster than one Simulator and had failures. + +## Writing a test + +Subclass `JetpackUITestCase`. Its `setUp` launches a freshly reset app signed in to WordPress.com, so every test starts on My Site. + +Resetting means signing in again, which syncs the account's sites and adds around 20 seconds to a test. A suite whose tests leave the app as they found it can override `resetsAppBeforeEachTest` to return `false`: its tests then relaunch the app still signed in. The app is still reset before the first test of the run, and before the first test that follows a suite that resets, since such a suite is free to leave the app changed. + +Keep the default for a suite that changes anything the app stores on the device. `StatsCustomizationTests` does, for example: it switches chart metrics, data types and date ranges, and adds and removes cards, all of which the app remembers. + +Tests are written against screen objects rather than element queries. A screen object exposes the elements and actions for one screen, and each navigation method returns the screen it navigates to: + +```swift +final class EditorTests: JetpackUITestCase { + func testOpenAndDiscardNewPost() throws { + try MySiteScreen(app: app) + .goToNewPost() + .closeAndDiscardChanges() + } +} +``` + +To add a screen, subclass `ScreenObject` and pass it the elements that identify the screen. Initializing a screen object waits for the first of those elements to become hittable and throws if it doesn't, so constructing one doubles as the assertion that the app reached that screen. + +To wait for an element, use `pollForExistence(timeout:)` or `poll(timeout:until:)`, or a screen object's `waitFor` and `tap`, which are built on them. Don't use XCTest's `waitForExistence(timeout:)` or `wait(for:toEqual:timeout:)`: they check once a second and not before the first second is up, so each one takes a second even when the element is already there, and a test makes dozens of them. + +Against the fixtures those waits check right away, because the fixtures answer at once and a screen's content is there when the screen is. Against a real account they hold off for a second first, as XCTest's do. Content arrives over the network after its screen, and those suites lean on that second in places: a list that reloads as each part of it arrives can move or replace the row a test was about to act on. A screen object that waits for its content to finish loading wouldn't need it. + +The tests launch the app with `-ui-test-disable-animations`, which turns off UIKit's animations. XCTest waits for the app's animations to finish before every tap and query, and a swipe scrolls a list just as far with them off. + +The first launch of a run gets three minutes to reach My Site, where a test gives it one. CI runs on a Simulator it has just erased and booted, and the first sign-in there has taken over 76 seconds, against under 10 for every launch after it. + +Identify elements by accessibility identifier where the app sets one. Several screens don't have one yet; their screen objects fall back to the navigation bar title, which works because the test plan pins the app's language to English. + +Because the tests run against a real account, a test must leave the account as it found it — discard drafts instead of publishing them, and undo any setting it changes. + +## What the tests check, and what they don't + +The suites that run against a real account check that each screen, menu and sheet opens, and that controls change state: a filter becomes selected, a date range changes, a card moves. They don't check content. Nothing in them asserts a post's title, a stat's value or the site's name, so they aren't tied to one account. Asserting on content is what the [fixtures](#fixtures) are for. + +They do need the account's site to have something to open, and what a site has changes over time: activity ages out of the activity log, and a quiet week has no referrers. A test whose card isn't on the dashboard, or whose list has nothing in it, is skipped with a message saying what was missing rather than failed. A skip therefore means "this site couldn't exercise that path today", so read the skipped tests in a run as well as the failures. + +When a test fails, its attachments include the app's accessibility hierarchy at the moment of failure. + +## Fixtures + +A suite can run against a fixed set of data instead of a real account by overriding `backend`: + +```swift +final class FixtureAccountTests: JetpackUITestCase { + override class var backend: Backend { .fixtures } + + func testMySiteShowsThePrimarySite() throws { + let mySite = try MySiteScreen(app: app) + + XCTAssertEqual(mySite.siteTitle.label, "Tri-County Real Estate") + } +} +``` + +The app then answers every request it makes from the files in `Tests/JetpackUITests/Fixtures`, and nothing reaches WordPress.com. Such a suite needs no token, can assert on content, and has no account to leave as it found it. + +The fixtures describe one account, `e2eflowtestingmobile`, with three sites: Tri-County Real Estate (the primary site, on the Personal plan), Four Paws Dog Grooming (Free) and Weekend Bakes (Pro). They're the WireMock mappings that the UI tests removed in #25399 ran against, restored from before #25673 deleted them, so they predate some of what the app requests today. See [Finding what's missing](#finding-whats-missing). + +The two backends sign in to different accounts, so the app is also reset before a test that runs on a different backend from the test before it. + +Use the fixtures for any screen that changes the account just by being looked at. Showing the Notifications tab marks the account's notifications as seen, opening a notification marks it as read, and opening a post in the Reader counts as a view of it and can mark it as seen. `NotificationsTests` and `ReaderTests` run on the fixtures for that reason, and `MeTests` does so that it can assert on the account's details. + +### How it works + +`JetpackUITestCase` passes the app the path of the fixtures in the `-ui-test-http-fixtures` launch argument. The app loads them into a `FixtureSet` and puts `FixtureURLProtocol` in front of every `URLSession`; both are in the `HTTPFixtures` module. That's below the app's API clients, so one mechanism covers them all: WordPressKit, Alamofire and wordpress-rs each send their requests through a `URLSession`. + +It doesn't cover requests that leave the app's process another way: the content of a web view, which includes the block editor's own requests, background uploads, the notifications WebSocket and media playback. Those still go to the network, where the fixture account's token is no good. + +### The build flag + +None of that is in the app unless it's built for it. Every file in the `HTTPFixtures` module is wrapped in `#if UI_TEST_HTTP_FIXTURES`, and so is the code in `UITestConfigurator` that reads the launch arguments. A build that doesn't set that compilation condition compiles the module to nothing, and has no code in it that can reroute a request or that knows the launch arguments. + +No configuration or scheme in the project sets the condition. A build gets it as a build setting on the `xcodebuild` command line, which reaches the package's modules as well as the app's own targets: + +``` +SWIFT_ACTIVE_COMPILATION_CONDITIONS='$(inherited) UI_TEST_HTTP_FIXTURES' +``` + +fastlane passes that in two places. The `test` lane does for the Jetpack scheme, whose tests are these ones. `build_jetpack_for_testing` does when it's given `http_fixtures:true`, which is how CI builds the app the UI tests run against. + +SwiftLint's `http_fixtures_build_flag` rule fails a file in the module that doesn't start with the condition, so a new file can't be left out of it. + +The module's unit tests, `HTTPFixturesTests`, are compiled out with it. To run them, set the condition: + +```bash +swift test -Xswiftc -DUI_TEST_HTTP_FIXTURES --filter HTTPFixturesTests +``` + +CI's Swift package tests do. Without it the target has one test, which is reported as skipped with that command in its message. The target isn't in `WordPressUnitTests.xctestplan`, because the build for those tests doesn't set the condition. + +### Writing a fixture + +Each file under `Fixtures/mappings` is a [WireMock stub mapping](https://wiremock.org/docs/stubbing/): a request matcher and the response to answer with. + +```json +{ + "request": { + "method": "GET", + "urlPath": "/rest/v1.1/sites/106707880/posts", + "queryParameters": { + "status": { "equalTo": "draft,pending" } + } + }, + "response": { + "status": 200, + "jsonBody": { "found": 0, "posts": [] } + } +} +``` + +A mapping matches on the method, path, query and body of a request, and never on its host, so the same files answer for `public-api.wordpress.com`, a site's own address and anything else the app talks to. + +Only the parts of the format the fixtures use are supported: + +- **Request**: `method`; one of `url`, `urlPath`, `urlPattern` and `urlPathPattern`; `queryParameters` with `equalTo`, `matches` or `absent`; `bodyPatterns` with `equalTo`, `matches`, `equalToJson` or `matchesJsonPath`. +- **Response**: `status`, `headers`, `body` or `jsonBody`, and `fixedDelayMilliseconds`. +- **Templates** in a response, such as `{{request.requestLine.baseUrl}}` and `{{now offset='-3 days' format='yyyy-MM-dd'}}`. `ResponseTemplate` lists them all. Use `{{now}}` for any date the app compares with today, such as the days of a stats chart. +- **Scenarios** (`scenarioName`, `requiredScenarioState` and `newScenarioState`), which let one request change what a later one gets, so that a post appears in the posts list once it's been published. +- **The `stats-series` transformer**, for a response with a row for every period in the interval the request asks for. See [Stats](#stats). + +A mapping that uses anything else fails to load, and the app won't launch with fixtures it can't load. The `HTTPFixturesTests` unit tests load the same files, so they report the problem without launching the app. + +The fixtures are copied into the test bundle when it's built. To try a change without rebuilding, point the tests at the source folder with the `UI_TEST_FIXTURES` environment variable, which `xcodebuild` forwards as `TEST_RUNNER_UI_TEST_FIXTURES`: + +```bash +TEST_RUNNER_UI_TEST_FIXTURES="$PWD/Tests/JetpackUITests/Fixtures" xcodebuild \ + -workspace WordPress.xcworkspace \ + -scheme Jetpack \ + -testPlan JetpackUITests \ + -destination 'platform=iOS Simulator,name=iPhone 18 Pro' \ + -only-testing:JetpackUITests/StatsFixtureTests \ + test-without-building +``` + +When more than one mapping matches a request, the one with the lowest `priority` answers; the default is 5. Between mappings of equal priority, the one with more query, body and scenario conditions answers, and after that the first by file path. Give overlapping mappings a `priority` rather than relying on their paths. + +### Stats + +The fixtures answer everything the Stats screens ask for, on all three tabs, for every kind of top list and for every date range. `StatsFixtureTests` walks those screens and fails if a request went unanswered or if Stats reported that a card failed to load, which is what a fixture with the wrong shape causes. Run it after changing a stats fixture, or when the app starts asking Stats for something new. + +Most stats responses are the same whatever dates are asked for, so a top list shows the same posts and counts for today as for the year. The counts are sized for the last seven days, which is the range Stats opens on. + +Views, visitors and the other numbers charted over time can't work that way. The app asks for an interval, such as the last seven days by day, or today by hour, and charts every row it gets back, so the response has to have exactly the rows for that interval. Those come from the `stats-series` transformer, which generates them from a description of each field: + +```json +{ + "request": { + "method": "GET", + "urlPathPattern": "/rest/v1.1/sites/[0-9]+/stats/visits/*" + }, + "response": { + "status": 200, + "transformers": ["stats-series"], + "transformerParameters": { + "fields": [ + { "name": "views", "average": 432, "hourly": true }, + { "name": "visitors", "average": 268 } + ] + } + } +} +``` + +- `average` is what the field comes to on an average day. Each day's value varies around it, lower at weekends, and is computed from the date alone, so a day has the same value in every chart and on every run. +- `level` is for a running total, such as subscribers: its value today, which was lower by `growth` for every day before. +- `hourly` says whether the field has values by the hour. The others are null then, as they are from WordPress.com. + +### Analytics + +A suite on the fixtures backend can assert on the analytics events the app sends. The app's requests to Tracks are answered by a fixture like any other request, and the test reads the events out of them, so what it sees is what Tracks would have received: + +```swift +func testOpeningStatsFromAQuickActionIsTracked() throws { + try MySiteScreen(app: app) + .goToStats() + .waitForScreen() + + let event = try waitForAnalyticsEvent("jpios_stats_accessed") + XCTAssertEqual(event.properties["tap_source"], "quick_actions") +} +``` + +An event's name is the one Tracks receives, with the app's `jpios_` prefix. `waitForAnalyticsEvent` also takes properties the event has to have, which is how to pick one event out of several with the same name, and `sentAnalyticsEvents()` returns everything sent so far, for a test that needs to check an order or that an event wasn't sent. + +The app queues the events it tracks and sends them in batches. That's every 15 seconds normally, and once a second when it runs against the fixtures, so that a test isn't kept waiting for them. `waitForAnalyticsEvent` waits 10 seconds by default. + +Only the events the app tracked since it launched for the test are returned. The app also sends events an earlier launch tracked and didn't get to send, and those are left out. + +This isn't available against a real account, where the events go to Tracks. + +### Request counts + +A suite on the fixtures backend can count the app's requests, to check that it doesn't ask for the same thing more often than it should: + +```swift +func testSigningInFetchesTheAccountAndItsSitesOnce() throws { + try MySiteScreen(app: app) + .waitForScreen() + + XCTAssertEqual(try requestCount(path: "/rest/v1.1/me"), 1) + XCTAssertEqual(try requestCount(path: "/rest/v1.2/me/sites"), 1) +} +``` + +Requests are counted by endpoint: a method, a host and a path. The query isn't part of it, so requests for different pages or dates of the same thing count towards one endpoint. `requestCount` means `GET` and `public-api.wordpress.com` unless told otherwise. `requestCounts()` returns the count for every endpoint, and `assertNoEndpointRequested(moreThan:)` fails with a list of the endpoints the app has requested more often than a limit. + +The counts start when the app launches for the test, so a suite that shares one sign-in across its tests doesn't count what signing in requests. A count is of the requests made so far, and the app goes on making requests after a screen appears, so a count read as soon as a screen appears can miss a repeat that comes later. + +A count includes the requests the fixtures didn't answer. The app gets an error for those, which can change how often it asks, so check that an endpoint has a fixture before reading much into its count. + +### Finding what's missing + +A request no mapping matches gets a 404, which the app handles like any failed request: a card stays empty, or a screen shows its error state. + +A test can list them with `unansweredRequests()`. `StatsFixtureTests` does, to fail when Stats asks for something the fixtures don't have. + +When a test on the fixtures backend fails, its attachments include **Analytics events**, which lists the events the app sent, and **HTTP requests**, which lists every request the app made and the mapping that answered it. The ones that need a fixture end in `(no fixture)`: + +``` +200 GET https://public-api.wordpress.com/rest/v1.1/me?locale=en wpcom/me/me.json +404 GET https://public-api.wordpress.com/wpcom/v2/mobile/remote-config?locale=en (no fixture) +``` diff --git a/fastlane/lanes/build.rb b/fastlane/lanes/build.rb index e4e8895035ed..7e220fd39a8f 100644 --- a/fastlane/lanes/build.rb +++ b/fastlane/lanes/build.rb @@ -32,6 +32,13 @@ # use the build number we set! COMMON_EXPORT_OPTIONS = { manageAppVersionAndBuildNumber: false }.freeze +# The build setting that compiles the HTTP fixtures into the app, for the UI tests that run against +# them. No build has any of that code without it. See docs/ui-tests.md. +# +# It's passed on the command line because that's the only way to reach the `HTTPFixtures` module as +# well as the app: a Swift package's targets don't read the project's build settings. +HTTP_FIXTURES_XCARGS = "SWIFT_ACTIVE_COMPILATION_CONDITIONS='$(inherited) UI_TEST_HTTP_FIXTURES'" + # Lanes related to Building and Testing the code # platform :ios do @@ -51,6 +58,8 @@ # bundle exec fastlane test scheme:Jetpack # @example Clean build before testing: # bundle exec fastlane test clean:true + # @example Run one suite of the UI tests: + # bundle exec fastlane test scheme:Jetpack only_testing:JetpackUITests/ReaderTests # desc 'Run tests locally' lane :test do |scheme: 'WordPress', device: 'iPhone 18 Pro', ios_version: nil, only_testing: nil, clean: false| @@ -62,7 +71,10 @@ deployment_target_version: ios_version, only_testing: only_testing, clean: clean, - skip_package_dependencies_resolution: !clean + skip_package_dependencies_resolution: !clean, + # The Jetpack scheme's tests are the UI tests, and the suites that run against the HTTP + # fixtures need them compiled in. + xcargs: scheme == 'Jetpack' ? HTTP_FIXTURES_XCARGS : nil ) end @@ -89,6 +101,8 @@ # # @option [String] device the name of the Simulator device to run the tests on # @option [String] ios_version the Deployment Target version to use while testing + # @option [Boolean] http_fixtures Whether to compile in the HTTP fixtures, which the UI test suites + # that run against fixtures need (default: false) # # @called_by CI # @@ -100,7 +114,8 @@ derived_data_path: DERIVED_DATA_PATH, build_for_testing: true, device: options[:device], - deployment_target_version: options[:ios_version] + deployment_target_version: options[:ios_version], + xcargs: options[:http_fixtures] ? HTTP_FIXTURES_XCARGS : nil ) end @@ -111,6 +126,14 @@ # @option [String] name The (partial) name of the `*.xctestrun` file to run # @option [String] device Name of the simulator device to run the test on # @option [String] ios_version The deployment target version to test on + # @option [String] only_testing Comma-separated tests to run, each `Target/Class` or + # `Target/Class/method`. Runs every test in the xctestrun file when omitted. + # @option [Boolean] reset_simulator Whether to erase the Simulator first (default: true). A CI job + # runs in a VM made for it, so its Simulator has nothing to erase, and it has started booting + # it by now. + # @option [Integer] concurrent_workers How many Simulators to run the tests on at once. Xcode clones + # the device and hands each clone whole test classes, so more than one only helps when there's + # more than one class to run. Runs on the one device when omitted. # # @called_by CI # @@ -125,19 +148,52 @@ UI.user_error!("Unable to find .xctestrun file at #{build_products_path}.") if xctestrun_path.nil? || !File.exist?(xctestrun_path) - # The only supported mode runs the WordPress unit tests (xctestrun name `WordPressUnitTests`). + # Two modes are supported, and the scheme can be inferred from the xctestrun name: + # + # - (WordPress, WordPressUnitTests): the unit tests + # - (Jetpack, JetpackUITests): the UI tests + ui_tests = options[:name].include?('JetpackUITests') + scheme = ui_tests ? 'Jetpack' : 'WordPress' + + workers = options[:concurrent_workers].to_i + parallel = workers > 1 + + # The tests are already built, so the project has nothing more to tell xcodebuild. Left to work + # it out, scan resolves every Swift package and then reads the build settings, which took 150 + # seconds of a 7-minute UI test job. What it reads them for is given to it here instead: where + # the build is, the app's name, and the oldest iOS the app runs on. + # + # It also reads them to choose a Simulator, so this is only for a caller that names one. + project_settings = { deployment_target_version: options[:ios_version] } + if options[:device] + deployment_target = File.read(File.join(PROJECT_ROOT_FOLDER, 'config', 'Common.xcconfig'))[/^IPHONEOS_DEPLOYMENT_TARGET\s*=\s*([\d.]+)/, 1] + project_settings = { + deployment_target_version: options[:ios_version] || deployment_target, + derived_data_path: DERIVED_DATA_PATH, + app_name: scheme, + skip_package_dependencies_resolution: true, + # Fail if anything still asks for the build settings, instead of quietly paying for them again. + disallow_xcodebuild_settings_lookup: true + } + end + run_tests( workspace: WORKSPACE_PATH, - scheme: 'WordPress', + scheme: scheme, device: options[:device], - deployment_target_version: options[:ios_version], + **project_settings, ensure_devices_found: true, test_without_building: true, xctestrun: xctestrun_path, + only_testing: options[:only_testing]&.split(','), + parallel_testing: parallel ? true : nil, + concurrent_workers: parallel ? workers : nil, output_directory: File.join(PROJECT_ROOT_FOLDER, 'build', 'results'), - reset_simulator: true, + reset_simulator: options.fetch(:reset_simulator, true), result_bundle: true, - output_types: 'junit' + output_types: 'junit', + # After a UI test run Xcode otherwise spends up to ten minutes on `simctl diagnose`. + xcargs: ui_tests ? '-collect-test-diagnostics never' : nil ) end