From e638d72e70b574dafd430bd689a1f1a6793870c5 Mon Sep 17 00:00:00 2001 From: Naz Date: Tue, 22 Aug 2023 13:18:07 +0800 Subject: [PATCH] Refactored collections e2e Admin API test suite refs https://github.com/TryGhost/Arch/issues/71 - With describe/it block levels mixed on the top level of the test suite the order fo test execution was scattered around. Having "describe" groups for each of the BREAD methods makes things more organized and readable. --- .../__snapshots__/collections.test.js.snap | 408 +++++++++--------- .../test/e2e-api/admin/collections.test.js | 328 +++++++------- 2 files changed, 371 insertions(+), 365 deletions(-) diff --git a/ghost/core/test/e2e-api/admin/__snapshots__/collections.test.js.snap b/ghost/core/test/e2e-api/admin/__snapshots__/collections.test.js.snap index 4df1f46dfe..d1940f21cf 100644 --- a/ghost/core/test/e2e-api/admin/__snapshots__/collections.test.js.snap +++ b/ghost/core/test/e2e-api/admin/__snapshots__/collections.test.js.snap @@ -1,5 +1,38 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`Collections API Add Can add a Collection 1: [body] 1`] = ` +Object { + "collections": Array [ + Object { + "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, + "description": "Test Collection Description", + "feature_image": null, + "filter": null, + "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, + "slug": "test-collection", + "title": "Test Collection", + "type": "manual", + "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, + }, + ], +} +`; + +exports[`Collections API Add Can add a Collection 2: [headers] 1`] = ` +Object { + "access-control-allow-origin": "http://127.0.0.1:2369", + "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", + "content-length": "277", + "content-type": "application/json; charset=utf-8", + "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, + "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, + "location": StringMatching /https\\?:\\\\/\\\\/\\.\\*\\?\\\\/collections\\\\/\\[a-f0-9\\]\\{24\\}\\\\//, + "vary": "Accept-Version, Origin, Accept-Encoding", + "x-cache-invalidate": "/*", + "x-powered-by": "Express", +} +`; + exports[`Collections API Automatic Collection Filtering Creates an automatic Collection with a featured filter 1: [body] 1`] = ` Object { "collections": Array [ @@ -1332,40 +1365,7 @@ Object { } `; -exports[`Collections API Can add a Collection 1: [body] 1`] = ` -Object { - "collections": Array [ - Object { - "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - "description": "Test Collection Description", - "feature_image": null, - "filter": null, - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "slug": "test-collection", - "title": "Test Collection", - "type": "manual", - "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - }, - ], -} -`; - -exports[`Collections API Can add a Collection 2: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "277", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "location": StringMatching /https\\?:\\\\/\\\\/\\.\\*\\?\\\\/collections\\\\/\\[a-f0-9\\]\\{24\\}\\\\//, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-cache-invalidate": "/*", - "x-powered-by": "Express", -} -`; - -exports[`Collections API Can delete a Collection 1: [body] 1`] = ` +exports[`Collections API Delete Can delete a Collection 1: [body] 1`] = ` Object { "collections": Array [ Object { @@ -1383,7 +1383,7 @@ Object { } `; -exports[`Collections API Can delete a Collection 2: [headers] 1`] = ` +exports[`Collections API Delete Can delete a Collection 2: [headers] 1`] = ` Object { "access-control-allow-origin": "http://127.0.0.1:2369", "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", @@ -1398,9 +1398,9 @@ Object { } `; -exports[`Collections API Can delete a Collection 3: [body] 1`] = `Object {}`; +exports[`Collections API Delete Can delete a Collection 3: [body] 1`] = `Object {}`; -exports[`Collections API Can delete a Collection 4: [headers] 1`] = ` +exports[`Collections API Delete Can delete a Collection 4: [headers] 1`] = ` Object { "access-control-allow-origin": "http://127.0.0.1:2369", "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", @@ -1412,7 +1412,7 @@ Object { } `; -exports[`Collections API Can delete a Collection 5: [body] 1`] = ` +exports[`Collections API Delete Can delete a Collection 5: [body] 1`] = ` Object { "errors": Array [ Object { @@ -1430,7 +1430,7 @@ Object { } `; -exports[`Collections API Can delete a Collection 6: [headers] 1`] = ` +exports[`Collections API Delete Can delete a Collection 6: [headers] 1`] = ` Object { "access-control-allow-origin": "http://127.0.0.1:2369", "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", @@ -1443,170 +1443,7 @@ Object { } `; -exports[`Collections API Can read a Collection by id and slug 1: [body] 1`] = ` -Object { - "collections": Array [ - Object { - "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - "description": null, - "feature_image": null, - "filter": null, - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "slug": "test-collection-to-read", - "title": "Test Collection to Read", - "type": "manual", - "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - }, - ], -} -`; - -exports[`Collections API Can read a Collection by id and slug 2: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "268", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "location": StringMatching /https\\?:\\\\/\\\\/\\.\\*\\?\\\\/collections\\\\/\\[a-f0-9\\]\\{24\\}\\\\//, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-cache-invalidate": "/*", - "x-powered-by": "Express", -} -`; - -exports[`Collections API Can read a Collection by id and slug 3: [body] 1`] = ` -Object { - "collections": Array [ - Object { - "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - "description": null, - "feature_image": null, - "filter": null, - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "slug": "test-collection-to-read", - "title": "Test Collection to Read", - "type": "manual", - "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - }, - ], -} -`; - -exports[`Collections API Can read a Collection by id and slug 4: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "268", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-powered-by": "Express", -} -`; - -exports[`Collections API Can read a Collection by id and slug 5: [body] 1`] = ` -Object { - "collections": Array [ - Object { - "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - "description": null, - "feature_image": null, - "filter": null, - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "slug": "test-collection-to-read", - "title": "Test Collection to Read", - "type": "manual", - "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - }, - ], -} -`; - -exports[`Collections API Can read a Collection by id and slug 6: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "268", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-powered-by": "Express", -} -`; - -exports[`Collections API Can read a Collection by id and slug and include the post counts 1: [body] 1`] = ` -Object { - "collections": Array [ - Object { - "count": Object { - "posts": 2, - }, - "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - "description": "Featured posts", - "feature_image": null, - "filter": "featured:true", - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "slug": "featured", - "title": "Featured", - "type": "automatic", - "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - }, - ], -} -`; - -exports[`Collections API Can read a Collection by id and slug and include the post counts 2: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "284", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-powered-by": "Express", -} -`; - -exports[`Collections API Can read a Collection by id and slug and include the post counts 3: [body] 1`] = ` -Object { - "collections": Array [ - Object { - "count": Object { - "posts": 2, - }, - "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - "description": "Featured posts", - "feature_image": null, - "filter": "featured:true", - "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, - "slug": "featured", - "title": "Featured", - "type": "automatic", - "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, - }, - ], -} -`; - -exports[`Collections API Can read a Collection by id and slug and include the post counts 4: [headers] 1`] = ` -Object { - "access-control-allow-origin": "http://127.0.0.1:2369", - "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", - "content-length": "284", - "content-type": "application/json; charset=utf-8", - "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, - "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, - "vary": "Accept-Version, Origin, Accept-Encoding", - "x-powered-by": "Express", -} -`; - -exports[`Collections API Cannot delete a built in collection 1: [body] 1`] = ` +exports[`Collections API Delete Cannot delete a built in collection 1: [body] 1`] = ` Object { "errors": Array [ Object { @@ -1624,7 +1461,7 @@ Object { } `; -exports[`Collections API Cannot delete a built in collection 2: [headers] 1`] = ` +exports[`Collections API Delete Cannot delete a built in collection 2: [headers] 1`] = ` Object { "access-control-allow-origin": "http://127.0.0.1:2369", "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", @@ -1699,3 +1536,166 @@ Object { "x-powered-by": "Express", } `; + +exports[`Collections API Read Can read a Collection by id and slug 1: [body] 1`] = ` +Object { + "collections": Array [ + Object { + "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, + "description": null, + "feature_image": null, + "filter": null, + "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, + "slug": "test-collection-to-read", + "title": "Test Collection to Read", + "type": "manual", + "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, + }, + ], +} +`; + +exports[`Collections API Read Can read a Collection by id and slug 2: [headers] 1`] = ` +Object { + "access-control-allow-origin": "http://127.0.0.1:2369", + "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", + "content-length": "268", + "content-type": "application/json; charset=utf-8", + "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, + "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, + "location": StringMatching /https\\?:\\\\/\\\\/\\.\\*\\?\\\\/collections\\\\/\\[a-f0-9\\]\\{24\\}\\\\//, + "vary": "Accept-Version, Origin, Accept-Encoding", + "x-cache-invalidate": "/*", + "x-powered-by": "Express", +} +`; + +exports[`Collections API Read Can read a Collection by id and slug 3: [body] 1`] = ` +Object { + "collections": Array [ + Object { + "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, + "description": null, + "feature_image": null, + "filter": null, + "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, + "slug": "test-collection-to-read", + "title": "Test Collection to Read", + "type": "manual", + "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, + }, + ], +} +`; + +exports[`Collections API Read Can read a Collection by id and slug 4: [headers] 1`] = ` +Object { + "access-control-allow-origin": "http://127.0.0.1:2369", + "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", + "content-length": "268", + "content-type": "application/json; charset=utf-8", + "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, + "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, + "vary": "Accept-Version, Origin, Accept-Encoding", + "x-powered-by": "Express", +} +`; + +exports[`Collections API Read Can read a Collection by id and slug 5: [body] 1`] = ` +Object { + "collections": Array [ + Object { + "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, + "description": null, + "feature_image": null, + "filter": null, + "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, + "slug": "test-collection-to-read", + "title": "Test Collection to Read", + "type": "manual", + "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, + }, + ], +} +`; + +exports[`Collections API Read Can read a Collection by id and slug 6: [headers] 1`] = ` +Object { + "access-control-allow-origin": "http://127.0.0.1:2369", + "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", + "content-length": "268", + "content-type": "application/json; charset=utf-8", + "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, + "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, + "vary": "Accept-Version, Origin, Accept-Encoding", + "x-powered-by": "Express", +} +`; + +exports[`Collections API Read Can read a Collection by id and slug and include the post counts 1: [body] 1`] = ` +Object { + "collections": Array [ + Object { + "count": Object { + "posts": 2, + }, + "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, + "description": "Featured posts", + "feature_image": null, + "filter": "featured:true", + "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, + "slug": "featured", + "title": "Featured", + "type": "automatic", + "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, + }, + ], +} +`; + +exports[`Collections API Read Can read a Collection by id and slug and include the post counts 2: [headers] 1`] = ` +Object { + "access-control-allow-origin": "http://127.0.0.1:2369", + "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", + "content-length": "284", + "content-type": "application/json; charset=utf-8", + "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, + "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, + "vary": "Accept-Version, Origin, Accept-Encoding", + "x-powered-by": "Express", +} +`; + +exports[`Collections API Read Can read a Collection by id and slug and include the post counts 3: [body] 1`] = ` +Object { + "collections": Array [ + Object { + "count": Object { + "posts": 2, + }, + "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, + "description": "Featured posts", + "feature_image": null, + "filter": "featured:true", + "id": StringMatching /\\[a-f0-9\\]\\{24\\}/, + "slug": "featured", + "title": "Featured", + "type": "automatic", + "updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/, + }, + ], +} +`; + +exports[`Collections API Read Can read a Collection by id and slug and include the post counts 4: [headers] 1`] = ` +Object { + "access-control-allow-origin": "http://127.0.0.1:2369", + "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", + "content-length": "284", + "content-type": "application/json; charset=utf-8", + "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, + "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, + "vary": "Accept-Version, Origin, Accept-Encoding", + "x-powered-by": "Express", +} +`; diff --git a/ghost/core/test/e2e-api/admin/collections.test.js b/ghost/core/test/e2e-api/admin/collections.test.js index 744070a715..16f046190e 100644 --- a/ghost/core/test/e2e-api/admin/collections.test.js +++ b/ghost/core/test/e2e-api/admin/collections.test.js @@ -60,32 +60,6 @@ describe('Collections API', function () { mockManager.restore(); }); - it('Can add a Collection', async function () { - const collection = { - title: 'Test Collection', - description: 'Test Collection Description' - }; - - const {body: {collections: [{id: collectionId}]}} = await agent - .post('/collections/') - .body({ - collections: [collection] - }) - .expectStatus(201) - .matchHeaderSnapshot({ - 'content-version': anyContentVersion, - etag: anyEtag, - location: anyLocationFor('collections') - }) - .matchBodySnapshot({ - collections: [matchCollection] - }); - - await agent - .delete(`/collections/${collectionId}/`) - .expectStatus(204); - }); - describe('Browse', function () { it('Can browse Collections', async function () { await agent @@ -120,90 +94,92 @@ describe('Collections API', function () { }); }); - it('Can read a Collection by id and slug', async function () { - const collection = { - title: 'Test Collection to Read' - }; + describe('Read', function () { + it('Can read a Collection by id and slug', async function () { + const collection = { + title: 'Test Collection to Read' + }; - const addResponse = await agent - .post('/collections/') - .body({ - collections: [collection] - }) - .expectStatus(201) - .matchHeaderSnapshot({ - 'content-version': anyContentVersion, - etag: anyEtag, - location: anyLocationFor('collections') - }) - .matchBodySnapshot({ - collections: [matchCollection] - }); + const addResponse = await agent + .post('/collections/') + .body({ + collections: [collection] + }) + .expectStatus(201) + .matchHeaderSnapshot({ + 'content-version': anyContentVersion, + etag: anyEtag, + location: anyLocationFor('collections') + }) + .matchBodySnapshot({ + collections: [matchCollection] + }); - const collectionId = addResponse.body.collections[0].id; + const collectionId = addResponse.body.collections[0].id; - const readResponse = await agent - .get(`/collections/${collectionId}/`) - .expectStatus(200) - .matchHeaderSnapshot({ - 'content-version': anyContentVersion, - etag: anyEtag - }) - .matchBodySnapshot({ - collections: [matchCollection] - }); + const readResponse = await agent + .get(`/collections/${collectionId}/`) + .expectStatus(200) + .matchHeaderSnapshot({ + 'content-version': anyContentVersion, + etag: anyEtag + }) + .matchBodySnapshot({ + collections: [matchCollection] + }); - assert.equal(readResponse.body.collections[0].title, 'Test Collection to Read'); + assert.equal(readResponse.body.collections[0].title, 'Test Collection to Read'); - const collectionSlug = addResponse.body.collections[0].slug; - const readBySlugResponse = await agent - .get(`/collections/slug/${collectionSlug}/`) - .expectStatus(200) - .matchHeaderSnapshot({ - 'content-version': anyContentVersion, - etag: anyEtag - }) - .matchBodySnapshot({ - collections: [matchCollection] - }); + const collectionSlug = addResponse.body.collections[0].slug; + const readBySlugResponse = await agent + .get(`/collections/slug/${collectionSlug}/`) + .expectStatus(200) + .matchHeaderSnapshot({ + 'content-version': anyContentVersion, + etag: anyEtag + }) + .matchBodySnapshot({ + collections: [matchCollection] + }); - assert.equal(readBySlugResponse.body.collections[0].title, 'Test Collection to Read'); + assert.equal(readBySlugResponse.body.collections[0].title, 'Test Collection to Read'); - await agent - .delete(`/collections/${collectionId}/`) - .expectStatus(204); - }); + await agent + .delete(`/collections/${collectionId}/`) + .expectStatus(204); + }); - it('Can read a Collection by id and slug and include the post counts', async function () { - const {body: {collections: [collection]}} = await agent.get(`/collections/slug/featured/?include=count.posts`) - .expectStatus(200) - .matchHeaderSnapshot({ - 'content-version': anyContentVersion, - etag: anyEtag - }) - .matchBodySnapshot({ - collections: [{ - ...matchCollection, - count: { - posts: 2 - } - }] - }); + it('Can read a Collection by id and slug and include the post counts', async function () { + const {body: {collections: [collection]}} = await agent.get(`/collections/slug/featured/?include=count.posts`) + .expectStatus(200) + .matchHeaderSnapshot({ + 'content-version': anyContentVersion, + etag: anyEtag + }) + .matchBodySnapshot({ + collections: [{ + ...matchCollection, + count: { + posts: 2 + } + }] + }); - await agent.get(`/collections/${collection.id}/?include=count.posts`) - .expectStatus(200) - .matchHeaderSnapshot({ - 'content-version': anyContentVersion, - etag: anyEtag - }) - .matchBodySnapshot({ - collections: [{ - ...matchCollection, - count: { - posts: 2 - } - }] - }); + await agent.get(`/collections/${collection.id}/?include=count.posts`) + .expectStatus(200) + .matchHeaderSnapshot({ + 'content-version': anyContentVersion, + etag: anyEtag + }) + .matchBodySnapshot({ + collections: [{ + ...matchCollection, + count: { + posts: 2 + } + }] + }); + }); }); describe('Edit', function () { @@ -267,72 +243,102 @@ describe('Collections API', function () { }); }); - it('Can delete a Collection', async function () { - const collection = { - title: 'Test Collection to Delete' - }; + describe('Add', function () { + it('Can add a Collection', async function () { + const collection = { + title: 'Test Collection', + description: 'Test Collection Description' + }; - const addResponse = await agent - .post('/collections/') - .body({ - collections: [collection] - }) - .expectStatus(201) - .matchHeaderSnapshot({ - 'content-version': anyContentVersion, - etag: anyEtag, - location: anyLocationFor('collections') - }) - .matchBodySnapshot({ - collections: [matchCollection] - }); + const {body: {collections: [{id: collectionId}]}} = await agent + .post('/collections/') + .body({ + collections: [collection] + }) + .expectStatus(201) + .matchHeaderSnapshot({ + 'content-version': anyContentVersion, + etag: anyEtag, + location: anyLocationFor('collections') + }) + .matchBodySnapshot({ + collections: [matchCollection] + }); - const collectionId = addResponse.body.collections[0].id; - - await agent - .delete(`/collections/${collectionId}/`) - .expectStatus(204) - .matchHeaderSnapshot({ - 'content-version': anyContentVersion, - etag: anyEtag - }) - .matchBodySnapshot(); - - await agent - .get(`/collections/${collectionId}/`) - .expectStatus(404) - .matchHeaderSnapshot({ - 'content-version': anyContentVersion, - etag: anyEtag - }) - .matchBodySnapshot({ - errors: [{ - id: anyErrorId - }] - }); + await agent + .delete(`/collections/${collectionId}/`) + .expectStatus(204); + }); }); - it('Cannot delete a built in collection', async function () { - const builtInCollection = await agent - .get('/collections/?filter=slug:featured') - .expectStatus(200); + describe('Delete', function () { + it('Can delete a Collection', async function () { + const collection = { + title: 'Test Collection to Delete' + }; - assert.ok(builtInCollection.body.collections); - assert.equal(builtInCollection.body.collections.length, 1); + const addResponse = await agent + .post('/collections/') + .body({ + collections: [collection] + }) + .expectStatus(201) + .matchHeaderSnapshot({ + 'content-version': anyContentVersion, + etag: anyEtag, + location: anyLocationFor('collections') + }) + .matchBodySnapshot({ + collections: [matchCollection] + }); - await agent - .delete(`/collections/${builtInCollection.body.collections[0].id}/`) - .expectStatus(405) - .matchHeaderSnapshot({ - 'content-version': anyContentVersion, - etag: anyEtag - }) - .matchBodySnapshot({ - errors: [{ - id: anyErrorId, - context: anyString - }] - }); + const collectionId = addResponse.body.collections[0].id; + + await agent + .delete(`/collections/${collectionId}/`) + .expectStatus(204) + .matchHeaderSnapshot({ + 'content-version': anyContentVersion, + etag: anyEtag + }) + .matchBodySnapshot(); + + await agent + .get(`/collections/${collectionId}/`) + .expectStatus(404) + .matchHeaderSnapshot({ + 'content-version': anyContentVersion, + etag: anyEtag + }) + .matchBodySnapshot({ + errors: [{ + id: anyErrorId + }] + }); + }); + + it('Cannot delete a built in collection', async function () { + const builtInCollection = await agent + .get('/collections/?filter=slug:featured') + .expectStatus(200); + + assert.ok(builtInCollection.body.collections); + assert.equal(builtInCollection.body.collections.length, 1); + + await agent + .delete(`/collections/${builtInCollection.body.collections[0].id}/`) + .expectStatus(405) + .matchHeaderSnapshot({ + 'content-version': anyContentVersion, + etag: anyEtag + }) + .matchBodySnapshot({ + errors: [{ + id: anyErrorId, + context: anyString + }] + }); + }); }); describe('Automatic Collection Filtering', function () {