{"id":1860,"date":"2015-01-19T09:00:02","date_gmt":"2015-01-19T09:00:02","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1860"},"modified":"2024-01-31T10:03:23","modified_gmt":"2024-01-31T18:03:23","slug":"mocking-couchbase","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/","title":{"rendered":"Mocking Couchbase Cluster with CouchbaseMock"},"content":{"rendered":"<p><strong><em>Disclaimer<\/em><\/strong>: Always test your application against a real Couchbase Cluster to ensure proper proper functionality<\/p>\n<h2>About CouchbaseMock<\/h2>\n<p>A little known project known as\u00a0<a href=\"https:\/\/github.com\/couchbase\/CouchbaseMock\">CouchbaseMock<\/a>\u00a0has existed for quite a while here at Couchbase. A long long time ago, back when Couchbase was still known as <a href=\"https:\/\/www.couchbase.com\/blog\/what-exactly-membase\/\">Membase<\/a>, we needed a simple application to act as a server to test that the clients functioned properly.<\/p>\n<p>CouchbaseMock still serves this purpose today;\u00a0although we run an extensive suite of tests against a real cluster before each SDK release, the CouchbaseMock is still used for\u00a0<em>smoke testing<\/em>\u00a0(or\u00a0sanity testing) before each commit is merged to the Git repository.<\/p>\n<p>The ubiquity of Java and the small footprint of the mock (about a 2.5MB download) make it ideal for serving as a cluster in resource constrained systems, where a full Couchbase Cluster cannot be installed. The mock additionally contains some special commands to simulate various operations (Such as failover, rebalance, and replication) in a controlled and detereminstic manner.<\/p>\n<p>In the past few weeks, I have been working on adding\u00a0<em>view\u00a0<\/em>support to the Mock! &#8211; you&#8217;ve heard correctly: the mock can now understand design documents, and run user-defined map or reduce functions against all documents in its database. View support was required so that I could integrate higher level functionality within the C SDK (libcouchbase), the details of which will be published in a different post.<\/p>\n<h2>MapReduce Views in CouchbaseMock<\/h2>\n<p>The mock responds properly to all the view related APIs that Couchbase offers. You can use the SDK of your choice (or\u00a0<em>curl<\/em>) to issue the appropriate REST API calls to create design documents and query views.<\/p>\n<p>Implementing views in the Java mock was done by embedding\u00a0<a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Rhino_documentation\">Mozilla\u00a0Rhino<\/a>\u00a0(a JavaScript interpreter written in Java) into the mock. JavaScript\u00a0<em>map<\/em>\u00a0and\u00a0<em>reduce<\/em>\u00a0functions are parsed by Rhino, and are represented as Java objects to the rest of the mock code.<\/p>\n<p>Special care was taken to ensure the functionality of views mirrored that of Couchbase to the smallest level of detail &#8211; this was a bit challenging, especially in the case of sorting items &#8211; as Couchbase&#8217;s sorting works a bit differently than &#8220;traditional&#8221; JavaScript sorting.<\/p>\n<p>The actual JSON output was also formatted to insert line breaks after each row, to make it easier to read from the terminal.<\/p>\n<p>Finally, the actual\u00a0<em>beer-sample<\/em>\u00a0database is also bundled with the Mock. Using XZ compression, the database takes up very little room in the actual download.<\/p>\n<h2>Administrative REST API in CouchbaseMock<\/h2>\n<p>The mock also allows the creation and deletion of buckets on the fly. You can accomplish this using the same REST API that Couchbase understands. Currently only basic bucket creation, deletion, and listing are supported, but more features may be implemented in the future.<\/p>\n<h2>Running CouchbaseMock<\/h2>\n<p>To use CouchbaseMock, first get it from the source repository:<\/p>\n<pre>git clone git:\/\/github.com\/couchbase\/CouchbaseMock\r\n\r\n# Ensure you have Maven and a JDK installed. On debian this might look like\r\n\r\n# sudo apt-get install openjdk-7-jdk maven\r\n\r\ncd CouchbaseMock\r\n\r\nmvn package<\/pre>\n<p>Once built, you should have a <em>CouchbaseMock-1.0.0-.jar<\/em> in the\u00a0<em>target<\/em>\u00a0directory within the source repository. The\u00a0\u00a0is the abbreviated sha1 from git.<\/p>\n<p>Finally, using it is as simple as running:<\/p>\n<pre class=\"p1\"><span class=\"s1\">java -jar target\/CouchbaseMock-1.0.0-gd58ed25.jar<\/span> -S<\/pre>\n<p class=\"p1\">The\u00a0<em>-S<\/em>\u00a0option enables the\u00a0<em>beer-sample<\/em>\u00a0bucket. By default the mock will run on port\u00a0<em>8091<\/em>, but this can be customized using the command line options.<\/p>\n<p class=\"p1\">Once the mock is up and running, you may interact with it from the SDK of your choosing; this includes things like performing key-value operations, defining\/querying views, and creating\/destroying buckets.<\/p>\n<h2 class=\"p1\">Final Notes<\/h2>\n<p>The CouchbaseMock is a convenient way to spin up &#8220;something like&#8221; a Couchbase cluster. It should work as a drop-in for most applications and SDKs &#8211; in fact, the view tests for the Mock itself are more or less copy\/pasted from the Java SDK.<\/p>\n<p>The mock is an internal project and its primary aim is SDK testing. As such, the mock is not the official way to test applications using Couchbase, nor is there any guarantee of stability regarding the mock&#8217;s features and interfaces &#8211; things may be added or removed as necessary.<\/p>\n<p>The above being said, the mock remains a convenient way to test basic functionality of applications using couchbase (or SDKs!) without requiring a full cluster install.<\/p>\n<p>Additionally, if your application itself is written in Java, you may even wish to venture inside the Mock&#8217;s source code for ways to embed it within tests.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Disclaimer: Always test your application against a real Couchbase Cluster to ensure proper proper functionality About CouchbaseMock A little known project known as\u00a0CouchbaseMock\u00a0has existed for quite a while here at Couchbase. A long long time ago, back when Couchbase was [&hellip;]<\/p>\n","protected":false},"author":38,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"ppma_author":[8997],"class_list":["post-1860","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Mocking Couchbase Cluster by Running CouchbaseMock<\/title>\n<meta name=\"description\" content=\"The CouchbaseMock is a convenient way to spin up \u201csomething like\u201d a Couchbase cluster. Find out how it works as a drop-in for most applications and SDKs.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mocking Couchbase Cluster with CouchbaseMock\" \/>\n<meta property=\"og:description\" content=\"The CouchbaseMock is a convenient way to spin up \u201csomething like\u201d a Couchbase cluster. Find out how it works as a drop-in for most applications and SDKs.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-01-19T09:00:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-31T18:03:23+00:00\" \/>\n<meta name=\"author\" content=\"Mark Nunberg, Software Engineer, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mark Nunberg, Software Engineer, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/\"},\"author\":{\"name\":\"Mark Nunberg, Software Engineer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/76a75284da32b6f257c8e5e156e6e016\"},\"headline\":\"Mocking Couchbase Cluster with CouchbaseMock\",\"datePublished\":\"2015-01-19T09:00:02+00:00\",\"dateModified\":\"2024-01-31T18:03:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/\"},\"wordCount\":716,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/\",\"name\":\"Mocking Couchbase Cluster by Running CouchbaseMock\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2015-01-19T09:00:02+00:00\",\"dateModified\":\"2024-01-31T18:03:23+00:00\",\"description\":\"The CouchbaseMock is a convenient way to spin up \u201csomething like\u201d a Couchbase cluster. Find out how it works as a drop-in for most applications and SDKs.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mocking Couchbase Cluster with CouchbaseMock\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/76a75284da32b6f257c8e5e156e6e016\",\"name\":\"Mark Nunberg, Software Engineer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/895cad0986a0ab674fda857b6ba71ce0\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d5a465565eb8a3990192957806a9bc2989ba9f52a5f953d988b5e8afff3b6dc7?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d5a465565eb8a3990192957806a9bc2989ba9f52a5f953d988b5e8afff3b6dc7?s=96&d=mm&r=g\",\"caption\":\"Mark Nunberg, Software Engineer, Couchbase\"},\"description\":\"Mark Nunberg is a software engineer working at Couchbase. He maintains the C client library (libcouchbase) as well as the Python client. He also developed the Perl client (for use at his previous company) - which initially led him to working at Couchbase. Prior to joining Couchbase, he worked on distributed and high performance routing systems at an eCommerce analytics firm. Mark studied Linguistics at the Hebrew University of Jerusalem.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/mark-nunberg\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Mocking Couchbase Cluster by Running CouchbaseMock","description":"The CouchbaseMock is a convenient way to spin up \u201csomething like\u201d a Couchbase cluster. Find out how it works as a drop-in for most applications and SDKs.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/","og_locale":"en_US","og_type":"article","og_title":"Mocking Couchbase Cluster with CouchbaseMock","og_description":"The CouchbaseMock is a convenient way to spin up \u201csomething like\u201d a Couchbase cluster. Find out how it works as a drop-in for most applications and SDKs.","og_url":"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/","og_site_name":"The Couchbase Blog","article_published_time":"2015-01-19T09:00:02+00:00","article_modified_time":"2024-01-31T18:03:23+00:00","author":"Mark Nunberg, Software Engineer, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Mark Nunberg, Software Engineer, Couchbase","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/"},"author":{"name":"Mark Nunberg, Software Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/76a75284da32b6f257c8e5e156e6e016"},"headline":"Mocking Couchbase Cluster with CouchbaseMock","datePublished":"2015-01-19T09:00:02+00:00","dateModified":"2024-01-31T18:03:23+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/"},"wordCount":716,"commentCount":2,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/","url":"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/","name":"Mocking Couchbase Cluster by Running CouchbaseMock","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2015-01-19T09:00:02+00:00","dateModified":"2024-01-31T18:03:23+00:00","description":"The CouchbaseMock is a convenient way to spin up \u201csomething like\u201d a Couchbase cluster. Find out how it works as a drop-in for most applications and SDKs.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/mocking-couchbase\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Mocking Couchbase Cluster with CouchbaseMock"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"The Couchbase Blog","description":"Couchbase, the NoSQL Database","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/76a75284da32b6f257c8e5e156e6e016","name":"Mark Nunberg, Software Engineer, Couchbase","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/895cad0986a0ab674fda857b6ba71ce0","url":"https:\/\/secure.gravatar.com\/avatar\/d5a465565eb8a3990192957806a9bc2989ba9f52a5f953d988b5e8afff3b6dc7?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d5a465565eb8a3990192957806a9bc2989ba9f52a5f953d988b5e8afff3b6dc7?s=96&d=mm&r=g","caption":"Mark Nunberg, Software Engineer, Couchbase"},"description":"Mark Nunberg is a software engineer working at Couchbase. He maintains the C client library (libcouchbase) as well as the Python client. He also developed the Perl client (for use at his previous company) - which initially led him to working at Couchbase. Prior to joining Couchbase, he worked on distributed and high performance routing systems at an eCommerce analytics firm. Mark studied Linguistics at the Hebrew University of Jerusalem.","url":"https:\/\/www.couchbase.com\/blog\/author\/mark-nunberg\/"}]}},"authors":[{"term_id":8997,"user_id":38,"is_guest":0,"slug":"mark-nunberg","display_name":"Mark Nunberg, Software Engineer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/d5a465565eb8a3990192957806a9bc2989ba9f52a5f953d988b5e8afff3b6dc7?s=96&d=mm&r=g","author_category":"","last_name":"Nunberg","first_name":"Mark","job_title":"","user_url":"","description":"Mark Nunberg is a software engineer working at Couchbase. He maintains the C client library (libcouchbase) as well as the Python client. He also developed the Perl client (for use at his previous company) - which initially led him to working at Couchbase. Prior to joining Couchbase, he worked on distributed and high performance routing systems at an eCommerce analytics firm. Mark studied Linguistics at the Hebrew University of Jerusalem."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/1860","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/users\/38"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=1860"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/1860\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=1860"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=1860"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=1860"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=1860"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}