diff --git a/deckhand/tests/functional/gabbits/revision-diff-success.yaml b/deckhand/tests/functional/gabbits/revision-diff-success.yaml new file mode 100644 index 00000000..b756490d --- /dev/null +++ b/deckhand/tests/functional/gabbits/revision-diff-success.yaml @@ -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. diff --git a/docs/design.md b/docs/design.md index d776a240..4d22c9d0 100644 --- a/docs/design.md +++ b/docs/design.md @@ -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.