{"id":1402,"date":"2022-03-08T08:32:28","date_gmt":"2022-03-08T15:32:28","guid":{"rendered":"https:\/\/bullyrooks.com\/?p=1402"},"modified":"2022-03-13T17:26:00","modified_gmt":"2022-03-14T00:26:00","slug":"kube-cloud-pt6-fulfill-the-consumer-contract-test-for-rest-endpoint","status":"publish","type":"post","link":"https:\/\/bullyrooks.com\/index.php\/2022\/03\/08\/kube-cloud-pt6-fulfill-the-consumer-contract-test-for-rest-endpoint\/","title":{"rendered":"Kube Cloud Pt6 | Fulfill the Consumer Contract Test for REST Endpoint"},"content":{"rendered":"\n<p>Now we need to fulfill our contract with the consumer.  We just need to add a few pieces that that a consumer build will trigger a provider verification.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Add a Verification Workflow<\/h2>\n\n\n\n<p>Go back to your branch in <code>message-generator<\/code> and add a new github action workflow called <code>verify-changed-pact.yaml<\/code> with this content<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>name: Verify changed pact\n\non:\n  repository_dispatch:\n    types:\n      - pact_changed\n\nenv:\n  PACTFLOW_URL: https:\/\/bullyrooks.pactflow.io\n  PACTFLOW_TOKEN: ${{secrets.PACTFLOW_TOKEN}}\n  PACTBROKER_HOST: bullyrooks.pactflow.io\n  GIT_COMMIT: ${{ github.sha }}\n  GITHUB_REF: ${{ github.ref }}\n  PACT_URL: ${{ github.event.client_payload.pact_url }}\n\njobs:\n  verify-changed-pact:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\/checkout@v3\n        with:\n          fetch-depth: 0  # Shallow clones should be disabled for a better relevancy of analysis\n\n      - uses: actions-ecosystem\/action-get-latest-tag@v1\n        id: get-latest-tag\n\n      - name: Echo release version\n        run: |\n          echo \"RELEASE_VERSION=${{ steps.get-latest-tag.outputs.tag }}\" &gt;&gt; $GITHUB_ENV\n          echo ${{ env.RELEASE_VERSION }}\n      - name: Set up JDK 11\n        uses: actions\/setup-java@v2.5.0\n        with:\n          java-version: '11'\n          distribution: 'adopt'\n          cache: maven\n      - name: Verify Contract Tests\n        run: |\n          .\/mvnw -B verify -Pcontract -X \\\n          -Dpactbroker.host=${{env.PACTBROKER_HOST}} \\\n          -Dpact.verifier.publishResults=true \\\n          -Dpact.provider.version=${{ env.RELEASE_VERSION }} \\\n          -Dpact.provider.branch=main \\\n          -Dpact.provider.tag=okteto \\\n          -DPACT_CONSUMER_SELECTOR_TAG=okteto,pre-okteto,development\n<\/code><\/pre>\n\n\n\n<p>This is a unique workflow that will only verify and publish the results of the provider tests you can see that it&#8217;s being triggered by a repository dispatch action.  We&#8217;re going to setup a webhook callback in pactflow to trigger this.<\/p>\n\n\n\n<p>This is not a breaking change, so go ahead and build to the feature branch and merge to main.  We&#8217;ll need this on main in order to let the consumer build trigger it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Create the Verification Webhook<\/h2>\n\n\n\n<p>I&#8217;m following the <a href=\"https:\/\/docs.test.pactflow.io\/docs\/workshops\/ci-cd\/set-up-ci\/configure-webhook\">pactflow documentation here<\/a> where they explain how to setup a personal access token and add it to the secrets in pactflow in order to create the webhook.  I&#8217;ll skip most of that.<\/p>\n\n\n\n<p>This is what my webhook looks like:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"751\" height=\"765\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-15.png?resize=751%2C765&#038;ssl=1\" alt=\"\" class=\"wp-image-1420\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-15.png?w=751&amp;ssl=1 751w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-15.png?resize=295%2C300&amp;ssl=1 295w\" sizes=\"auto, (max-width: 751px) 100vw, 751px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"715\" height=\"232\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-16.png?resize=715%2C232&#038;ssl=1\" alt=\"\" class=\"wp-image-1421\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-16.png?w=715&amp;ssl=1 715w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-16.png?resize=300%2C97&amp;ssl=1 300w\" sizes=\"auto, (max-width: 715px) 100vw, 715px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Kick Off the Build<\/h2>\n\n\n\n<p>Go back into github, find your pull request and go to the build failure.  You should see a button that will let you rebuild.  Click that button<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"190\" height=\"79\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-17.png?resize=190%2C79&#038;ssl=1\" alt=\"\" class=\"wp-image-1422\" data-recalc-dims=\"1\"\/><\/figure>\n\n\n\n<p>You should see your build succeed:<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"672\" height=\"351\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-18.png?resize=672%2C351&#038;ssl=1\" alt=\"\" class=\"wp-image-1423\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-18.png?w=672&amp;ssl=1 672w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-18.png?resize=300%2C157&amp;ssl=1 300w\" sizes=\"auto, (max-width: 672px) 100vw, 672px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>And your pull request should look ready for merge<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"825\" height=\"546\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-19.png?resize=825%2C546&#038;ssl=1\" alt=\"\" class=\"wp-image-1424\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-19.png?w=825&amp;ssl=1 825w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-19.png?resize=300%2C199&amp;ssl=1 300w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-19.png?resize=768%2C508&amp;ssl=1 768w\" sizes=\"auto, (max-width: 825px) 100vw, 825px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>Additionally, if you look at the builds in message-generator you should see that your verification workflow passed:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"960\" height=\"265\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-20-1024x283.png?resize=960%2C265&#038;ssl=1\" alt=\"\" class=\"wp-image-1425\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-20.png?resize=1024%2C283&amp;ssl=1 1024w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-20.png?resize=300%2C83&amp;ssl=1 300w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-20.png?resize=768%2C212&amp;ssl=1 768w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-20.png?w=1259&amp;ssl=1 1259w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>And if you look at your pact in pactflow you should see that the feature branch of consumer contract was fulfilled by the version in okteto<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"960\" height=\"335\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-21.png?resize=960%2C335&#038;ssl=1\" alt=\"\" class=\"wp-image-1426\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-21.png?w=1024&amp;ssl=1 1024w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-21.png?resize=300%2C105&amp;ssl=1 300w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-21.png?resize=768%2C268&amp;ssl=1 768w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>So go ahead and merge to main.  Again, we should see cloud-application succeed<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"847\" height=\"143\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-22.png?resize=847%2C143&#038;ssl=1\" alt=\"\" class=\"wp-image-1427\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-22.png?w=847&amp;ssl=1 847w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-22.png?resize=300%2C51&amp;ssl=1 300w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-22.png?resize=768%2C130&amp;ssl=1 768w\" sizes=\"auto, (max-width: 847px) 100vw, 847px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>We should see the verification pass<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"841\" height=\"122\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-23.png?resize=841%2C122&#038;ssl=1\" alt=\"\" class=\"wp-image-1428\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-23.png?w=841&amp;ssl=1 841w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-23.png?resize=300%2C44&amp;ssl=1 300w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-23.png?resize=768%2C111&amp;ssl=1 768w\" sizes=\"auto, (max-width: 841px) 100vw, 841px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>And we should see that our contract is fulfilled and that the environments for all of the services are in okteto<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"960\" height=\"583\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-24.png?resize=960%2C583&#038;ssl=1\" alt=\"\" class=\"wp-image-1429\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-24.png?w=990&amp;ssl=1 990w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-24.png?resize=300%2C182&amp;ssl=1 300w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-24.png?resize=768%2C466&amp;ssl=1 768w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" data-recalc-dims=\"1\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<div class=\"entry-summary\">\nNow we need to fulfill our contract with the consumer. We just&hellip;\n<\/div>\n<div class=\"link-more\"><a href=\"https:\/\/bullyrooks.com\/index.php\/2022\/03\/08\/kube-cloud-pt6-fulfill-the-consumer-contract-test-for-rest-endpoint\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &ldquo;Kube Cloud Pt6 | Fulfill the Consumer Contract Test for REST Endpoint&rdquo;<\/span>&hellip;<\/a><\/div>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[41],"tags":[199,147,197,198,43],"course":[196],"class_list":["post-1402","post","type-post","status-publish","format-standard","hentry","category-software-development","tag-contract-testing","tag-github-actions","tag-pact","tag-pactflow","tag-spring-boot","course-kube-cloud-pt6-contract-testing","entry"],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":1377,"url":"https:\/\/bullyrooks.com\/index.php\/2022\/03\/08\/kube-cloud-pt6-consumer-contract-tests-for-rest-endpoints\/","url_meta":{"origin":1402,"position":0},"title":"Kube Cloud Pt6 | Consumer Contract Tests for REST Endpoints","author":"Bullyrook","date":"March 8, 2022","format":false,"excerpt":"Let's start with cloud-application, create a new branch git checkout -b client-contract Lets add the necessary dependencies to our pom.xml <pact.version>4.0.10<\/pact.version> <pact.provider.maven.plugin>4.3.5<\/pact.provider.maven.plugin> <\/properties> ... <!-- Contract Testing --> <dependency> <groupId>au.com.dius<\/groupId> <artifactId>pact-jvm-consumer-junit5<\/artifactId> <version>${pact.version}<\/version> <scope>test<\/scope> <\/dependency> ... <plugin> <groupId>au.com.dius.pact.provider<\/groupId> <artifactId>maven<\/artifactId> <version${pact.provider.maven.plugin}<\/version> <configuration> <pactBrokerUrl>${env.PACTFLOW_URL}<\/pactBrokerUrl> <pactBrokerToken>${env.PACTFLOW_TOKEN}<\/pactBrokerToken> <projectVersion>${env.PACT_PUBLISH_CONSUMER_VERSION}<\/projectVersion> <pactBrokerAuthenticationScheme>Bearer<\/pactBrokerAuthenticationScheme> <\/configuration> <\/plugin> Pact is mostly a\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/Screen-Shot-2022-03-02-at-2.04.53-PM.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/Screen-Shot-2022-03-02-at-2.04.53-PM.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/Screen-Shot-2022-03-02-at-2.04.53-PM.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/Screen-Shot-2022-03-02-at-2.04.53-PM.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/Screen-Shot-2022-03-02-at-2.04.53-PM.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":1387,"url":"https:\/\/bullyrooks.com\/index.php\/2022\/03\/08\/kube-cloud-pt6-provider-contract-test-for-rest-endpoints\/","url_meta":{"origin":1402,"position":1},"title":"Kube Cloud Pt6 | Provider Contract Test for REST Endpoints","author":"Bullyrook","date":"March 8, 2022","format":false,"excerpt":"Now lets move over to message-generator repo and create a new branch git checkout -b provider-test Pom Updates for Dependencies Update the pom.xml to pull in both the provider test library and the plugin ... <pact.version>4.3.5<\/pact.version> <maven-failsafe-plugin.version>3.0.0-M5<\/maven-failsafe-plugin.version> <maven-surefire-plugin.version>3.0.0-M5<\/maven-surefire-plugin.version> <pact.maven.plugin.version>4.3.5<\/pact.maven.plugin.version> <\/properties> ... <profiles> <profile> <id>contract<\/id> <build> <plugins> <plugin> <artifactId>maven-surefire-plugin<\/artifactId> <version>${maven-surefire-plugin.version}<\/version> <configuration>\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-10.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":1439,"url":"https:\/\/bullyrooks.com\/index.php\/2022\/03\/13\/kube-cloud-pt6-synchronous-contract-testing-conclusion\/","url_meta":{"origin":1402,"position":2},"title":"Kube Cloud Pt6 | Synchronous Contract Testing Conclusion","author":"Bullyrook","date":"March 13, 2022","format":false,"excerpt":"This course absolutely warrants a final thoughts page. Contract testing can be quite powerful, but it has to be done correctly and that means that you need quite a bit of engineering experience not only from a software development side, but also from an operations CICD side as well. First\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1395,"url":"https:\/\/bullyrooks.com\/index.php\/2022\/03\/12\/kube-cloud-pt6-update-to-consumer-contract\/","url_meta":{"origin":1402,"position":3},"title":"Kube Cloud Pt6 | Break the Contract from a Consumer Change","author":"Bullyrook","date":"March 12, 2022","format":false,"excerpt":"We're going to go back to cloud-application at this point and update our client to expect a field that isn't being currently provided (message generated date). This should break our contract test and prevent us from deploying, but there's some updates we need to make to support this. Add the\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-25.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-25.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/03\/image-25.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":1115,"url":"https:\/\/bullyrooks.com\/index.php\/2021\/07\/24\/automated-terraform-deploy-using-github-actions\/","url_meta":{"origin":1402,"position":4},"title":"Automated Terraform Deploy Using Github Actions","author":"Bullyrook","date":"July 24, 2021","format":false,"excerpt":"Now we just need to build and deploy our application automatically so that whenever we push changes to the main branch, they'll automatically become available through our endpoint. Create Our Artifact Storage We're going to use a 'poor man's artifactory' to store our compiled .jar files. With our current build\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-34.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":1205,"url":"https:\/\/bullyrooks.com\/index.php\/2022\/01\/04\/kube-cloud-automate-kube-deploy\/","url_meta":{"origin":1402,"position":5},"title":"Kube Cloud | Automate Kube Deploy","author":"Bullyrook","date":"January 4, 2022","format":false,"excerpt":"Lets improve our CD pipeline by automating deployment. Update Build Pipeline I only want main to deploy on successful build. So add these lines to the end of the main.yaml github action workflow - name: Deploy uses: WyriHaximus\/github-action-helm3@v2 with: exec: | helm repo add bullyrooks https:\/\/bullyrooks.github.io\/helm-charts\/ helm repo update helm\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-36.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-36.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-36.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/posts\/1402","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/comments?post=1402"}],"version-history":[{"count":1,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/posts\/1402\/revisions"}],"predecessor-version":[{"id":1430,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/posts\/1402\/revisions\/1430"}],"wp:attachment":[{"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/media?parent=1402"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/categories?post=1402"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/tags?post=1402"},{"taxonomy":"course","embeddable":true,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/course?post=1402"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}