Add basic revision diffing

This includes additions to the design doc and functional tests

Change-Id: I7281d8888fb259402646f211dd20f0bfdbd82b75
This commit is contained in:
Mark Burnett 2017-08-31 07:51:40 -05:00
parent daeb5f8774
commit 063aa01374
2 changed files with 298 additions and 0 deletions

View File

@ -0,0 +1,225 @@
# Test success path for rollback with a single bucket.
#
# 1. Purges existing data to ensure test isolation
# 2. Creates some initial documents (via 4 requests for different buckets)
# 3. Verify expected diffs for null revision
# - Each of the 4 initial document PUTs vs null
# - null vs itself
# 4. Modify bucket c
# 5. Delete bucket b
# 6. Create bucket f
# 7. Remove bucket f
# 8. Create bucket e
# 9. Verify diff between create_d and create_e
# 10. Verify diff of final state with null
defaults:
request_headers:
content-type: application/x-yaml
response_headers:
content-type: application/x-yaml
tests:
- name: purge
desc: Begin testing from known state.
DELETE: /api/v1.0/revisions
status: 204
- name: create_a
desc: Create documents in bucket a
PUT: /api/v1.0/bucket/bucket_a/documents
status: 200
data: |-
---
schema: example/Kind/v1
metadata:
schema: metadata/Document/v1
name: doc-a
layeringDefinition:
abstract: false
layer: site
data:
value: 1
...
- name: create_b
desc: Create documents in bucket b
PUT: /api/v1.0/bucket/bucket_b/documents
status: 200
data: |-
---
schema: example/Kind/v1
metadata:
schema: metadata/Document/v1
name: doc-b
layeringDefinition:
abstract: false
layer: site
data:
value: 2
...
- name: create_c
desc: Create documents in bucket c
PUT: /api/v1.0/bucket/bucket_c/documents
status: 200
data: |-
---
schema: example/Kind/v1
metadata:
schema: metadata/Document/v1
name: doc-c
layeringDefinition:
abstract: false
layer: site
data:
value: 3
...
- name: create_d
desc: Create documents in bucket d
PUT: /api/v1.0/bucket/bucket_d/documents
status: 200
data: |-
---
schema: example/Kind/v1
metadata:
schema: metadata/Document/v1
name: doc-d
layeringDefinition:
abstract: false
layer: site
data:
value: 4
...
- name: verify_null_first_revision
desc: Validates response for null diff for first revision
GET: /api/v1.0/revisions/0/diff/$HISTORY['create_a'].$RESPONSE['$.[0].status.revision']
status: 200
response_multidoc_jsonpaths:
$.[0]:
bucket_a: created
skip: Not implemented.
- name: verify_null_second_revision
desc: Validates response for null diff for second revision
GET: /api/v1.0/revisions/0/diff/$HISTORY['create_b'].$RESPONSE['$.[0].status.revision']
status: 200
response_multidoc_jsonpaths:
$.[0]:
bucket_a: created
bucket_b: created
skip: Not implemented.
- name: verify_null_third_revision
desc: Validates response for null diff for third revision
GET: /api/v1.0/revisions/0/diff/$HISTORY['create_c'].$RESPONSE['$.[0].status.revision']
status: 200
response_multidoc_jsonpaths:
$.[0]:
bucket_a: created
bucket_b: created
bucket_c: created
skip: Not implemented.
- name: verify_null_fourth_revision
desc: Validates response for null diff for fourth revision
GET: /api/v1.0/revisions/0/diff/$HISTORY['create_d'].$RESPONSE['$.[0].status.revision']
status: 200
response_multidoc_jsonpaths:
$.[0]:
bucket_a: created
bucket_b: created
bucket_c: created
bucket_d: created
skip: Not implemented.
- name: verify_null_self
desc: Validates response for null diff for fourth revision
GET: /api/v1.0/revisions/0/diff/0
status: 200
response_multidoc_jsonpaths:
$.[0]: {}
skip: Not implemented.
- name: update_c
desc: Update document in bucket c
PUT: /api/v1.0/bucket/bucket_c/documents
status: 200
data: |-
---
schema: example/Kind/v1
metadata:
schema: metadata/Document/v1
name: doc-c
layeringDefinition:
abstract: false
layer: site
data:
new_value: 7
...
skip: Not implemented.
- name: delete_b
desc: Delete documents from bucket b
PUT: /api/v1.0/bucket/bucket_b/documents
status: 200
data: ""
skip: Not implemented.
- name: create_f
desc: Create documents in bucket f
PUT: /api/v1.0/bucket/bucket_e/documents
status: 200
data: |-
---
schema: example/Kind/v1
metadata:
schema: metadata/Document/v1
name: doc-f
layeringDefinition:
abstract: false
layer: site
data:
value: 5
...
skip: Not implemented.
- name: delete_f
desc: Delete documents from bucket b
PUT: /api/v1.0/bucket/bucket_f/documents
status: 200
data: ""
skip: Not implemented.
- name: create_e
desc: Create documents in bucket e
PUT: /api/v1.0/bucket/bucket_e/documents
status: 200
data: |-
---
schema: example/Kind/v1
metadata:
schema: metadata/Document/v1
name: doc-e
layeringDefinition:
abstract: false
layer: site
data:
value: 6
...
skip: Not implemented.
- name: verify_diff_between_initial_4_buckets_and_present
desc: Validates response for null diff between the first 4 buckets and now
GET: /api/v1.0/revisions/$HISTORY['create_d'].$RESPONSE['$.[0].status.revision']/diff/$HISTORY['create_e'].$RESPONSE['$.[0].status.revision']
status: 200
response_multidoc_jsonpaths:
$.[0]:
bucket_a: unmodified
bucket_b: deleted
bucket_c: modified
bucket_d: unmodified
bucket_e: created
skip: Not implemented.

View File

@ -777,6 +777,79 @@ of `expired` indicates that the validation had succeeded, but the
This endpoint uses the `read_revision` action.
### GET `/revisions/{{revision_id}}/diff/{{comparison_revision_id}}`
This endpoint provides a basic comparison of revisions in terms of how the
buckets involved have changed. Only buckets with existing documents in either
of the two revisions in question will be reported; buckets with documents that
are only present in revisions between the two being compared are omitted from
this report.
The response will contain a status of `created`, `deleted`, `modified`, or
`unmodified` for each bucket.
The ordering of the two revision ids is not important.
For the purposes of diffing, the `revision_id` "0" is treated as a revision
with no documents, so queries comparing revision "0" to any other revision will
report "created" for each bucket in the compared revision.
Diffing a revision against itself will respond with the each of the buckets in
the revision as `unmodified`.
Diffing revision "0" against itself results in an empty dictionary as the response.
#### Examples
A response for a typical case, `GET /api/v1.0/revisions/6/diff/3` (or
equivalently `GET /api/v1.0/revisions/3/diff/6`).
```yaml
---
bucket_a: created
bucket_b: deleted
bucket_c: modified
bucket_d: unmodified
...
```
A response for diffing against an empty revision, `GET /api/v1.0/revisions/0/diff/6`:
```yaml
---
bucket_a: created
bucket_c: created
bucket_d: created
...
```
A response for diffing a revision against itself, `GET /api/v1.0/revisions/6/diff/6`:
```yaml
---
bucket_a: unmodified
bucket_c: unmodified
bucket_d: unmodified
...
```
Diffing two revisions that contain the same documents, `GET /api/v1.0/revisions/8/diff/11`:
```yaml
---
bucket_e: unmodified
bucket_f: unmodified
bucket_d: unmodified
...
```
Diffing revision zero with itself, `GET /api/v1.0/revisions/0/diff/0`:
```yaml
---
{}
...
```
### POST `/revisions/{{revision_id}}/validations/{{name}}`
Add the results of a validation for a particular revision.