--- title: Muck acceptance tests author: Lars Wirzenius / The Ick project ... Introduction ============================================================================= Muck is a persistent in-memory JSON store with an HTTP API and advanced access control using signed JWT access tokens. This document presents its automated acceptance tests, using a (for now hypothetical) language similar to the Gherkin langauge implemented by Cucumber. A happy path scenario ============================================================================= This scenario does some basic resource management via the Muck API. Start Muck. This also sets up access to it for the user by getting an access token, which will be used for all requests. > **given** a running Muck Check server status. > **given** I am _tomjon_ > **when** I make request _GET /status_ > **then** status code is _200_ > **and** response body is `{"resources":0}` Create a simple resource. Remember its id. > **when** I make request _POST /res_ with body `{"foo":"bar"}` > **then** status code is _201_ > **and** response has header _"Muck-Owner: tomjon"_ > **and** resource id is remembered as _ID_ > **and** resource revision is remembered as _REV1_ > > **when** I make request _GET /status_ > **then** status code is _200_ > **and** response body is `{"resources":1}` Retrieve the resource. > **when** I make request _GET /res_ with header _"Muck-Id: ${ID}"_ > **then** status code is _200_ > **and** response body is `{ "foo": "bar" }` > **and** response has header _"Muck-Id: ${ID}"_ > **and** response has header _"Muck-Revision: ${REV1}"_ > **and** response has header _"Muck-Owner: tomjon"_ Make sure another user can't retreive, update, or delete the resource. > **given** I am _verence_ > **when** I make request _GET /res with header "Muck-Id: ${ID}"_ > **then** status code is _404_ > > **when** I make request _PUT /res_ > with header _"Muck-Id: ${ID}"_ and > header _"Muck-Revision: ${REV1}"_ and > body `{"foo": "foobar"}` > > **then** status code is _404_ > > **when** I make request _DELETE /res_ with header _"Muck-Id: ${ID}"_ > **then** status code is _404_ Update the resource. > **given** I am _tomjon_ > **when** I make request _PUT /res_ with header _"Muck-Id: ${ID}"_ and > header _"Muck-Revision: wrong"_ and > body `{"foo": "foobar"}` > **then** status code is _400_ > > **when** I make request _PUT /res_ with header _"Muck-Id: ${ID}"_ and > header _"Muck-Revision: ${REV1}"_ and > body `{"foo": "foobar"}` > **then** status code is _200_ > **and** resource revision is remembered as _REV2_ Check the resource has been updated. > **when** I make request _GET /res_ with header _"Muck-Id: ${ID}"_ > **then** status code is _200_ > **and** response body is `{"foo": "foobar"}` > **and** response has header _"Muck-Id: ${ID}"_ > **and** response has header _"Muck-Revision: ${REV2}"_ > **and** response has header _"Muck-Owner: tomjon"_ Restart Muck. The resource should still exist. > **when** Muck is restarted > **and** I make request _GET /res_ with header _"Muck-Id: ${ID}"_ > **then** status code is _200_ > **and** response body is `{"foo":"foobar"}` > **and** response has header _"Muck-Id: ${ID}"_ > **and** response has header _"Muck-Revision: ${REV2}"_ > **and** response has header _"Muck-Owner: tomjon"_ Search for the resource. First with a condition that is no longer true. > **when** I make request _GET /search_ with body > `{"cond": [{"where": "data", "field": "foo", "pattern": "bar","op": "=="}]}` > **then** status code is _200_ > **and** response body is _{"resources": []}_ Now search for the correct value. > **when** user _tomjon_ makes request _GET /search_ with body > `{"cond": [{"where":"data","field":"foo","pattern":"foobar","op":"=="}]}` > **then** status code is _200_ > **and** response body is `{"resources": ["${ID}"]}` Delete the resource. > **when** user _tomjon_ makes request _DELETE /res_ with header _"Muck-Id: ${ID}"_ > **then** status code is _200_ > > **when** user _tomjon_ makes request _GET /res_ with header _"Muck-Id: ${ID}"_ > **then** status code is _404_ Restart Muck again. The resource should not exist. > **when** Muck is restarted > **and** user _tomjon_ makes request _GET /res_ with header _"Muck-Id: ${ID}"_ > **then** status code is _404_ All done.