summaryrefslogtreecommitdiff
path: root/muck1.yarn
blob: 6cd73a36493a898bf7ec84c5f98347596833621d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
---
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.