Ghost/ghost/core/test/e2e-api/admin/snippets.test.js
Hannah Wolfe af94855349 Removed bluebird catch predicates from API endpoints
refs: https://github.com/TryGhost/Ghost/issues/14882

- I found a common pattern where catch predicates were being used to catch non-existent models in destroy methods, and sometimes elsewhere in the API endpoints
- The use of predicates is deprecated, and we're working to remove them from everywhere, so that we can remove bluebird
- In order to still handle these errors correctly, we needed a small change to mw-error-handler so that it can detect EmptyResponse errors from bookshelf, as well as 404s
Note: there is a small change as a result of this - the context on these errors now says "Resource not found" instead of "{ModelName} not found".
- I think this is acceptable for now, as we will be reviewing these errors in more depth later. It's quite easy to make changes, we just have to decide what with proper design input
2022-08-24 11:27:09 +01:00

154 lines
4.0 KiB
JavaScript

const {agentProvider, fixtureManager, matchers} = require('../../utils/e2e-framework');
const {anyEtag, anyLocationFor, anyObjectId, anyISODateTime, anyErrorId} = matchers;
const matchSnippet = {
id: anyObjectId,
created_at: anyISODateTime,
updated_at: anyISODateTime
};
describe('Snippets API', function () {
let agent;
before(async function () {
agent = await agentProvider.getAdminAPIAgent();
await fixtureManager.init('snippets');
await agent.loginAsOwner();
});
it('Can add', async function () {
const snippet = {
name: 'test',
mobiledoc: JSON.stringify({})
};
await agent
.post('snippets/')
.body({snippets: [snippet]})
.expectStatus(201)
.matchBodySnapshot({
snippets: [matchSnippet]
})
.matchHeaderSnapshot({
etag: anyEtag,
location: anyLocationFor('snippets')
});
});
it('Can browse', async function () {
await agent
.get('snippets')
.expectStatus(200)
.matchBodySnapshot({
snippets: new Array(2).fill(matchSnippet)
})
.matchHeaderSnapshot({
etag: anyEtag
});
});
it('Can read', async function () {
await agent
.get(`snippets/${fixtureManager.get('snippets', 0).id}/`)
.expectStatus(200)
.matchBodySnapshot({
snippets: [matchSnippet]
})
.matchHeaderSnapshot({
etag: anyEtag
});
});
it('Can edit', async function () {
const snippetToChange = {
name: 'change me',
mobiledoc: '{}'
};
const snippetChanged = {
name: 'changed',
mobiledoc: '{}'
};
const {body} = await agent
.post(`snippets/`)
.body({snippets: [snippetToChange]})
.expectStatus(201)
.matchBodySnapshot({
snippets: [matchSnippet]
})
.matchHeaderSnapshot({
etag: anyEtag,
location: anyLocationFor('snippets')
});
const newsnippet = body.snippets[0];
await agent
.put(`snippets/${newsnippet.id}/`)
.body({snippets: [snippetChanged]})
.expectStatus(200)
.matchBodySnapshot({
snippets: [matchSnippet]
})
.matchHeaderSnapshot({
etag: anyEtag
});
});
it('Can destroy', async function () {
const snippet = {
name: 'destroy test',
mobiledoc: '{}'
};
const {body} = await agent
.post(`snippets/`)
.body({snippets: [snippet]})
.expectStatus(201)
.matchBodySnapshot({
snippets: [matchSnippet]
})
.matchHeaderSnapshot({
etag: anyEtag,
location: anyLocationFor('snippets')
});
const newSnippet = body.snippets[0];
await agent
.delete(`snippets/${newSnippet.id}`)
.expectStatus(204)
.expectEmptyBody()
.matchHeaderSnapshot({
etag: anyEtag
});
await agent
.get(`snippets/${newSnippet.id}/`)
.expectStatus(404)
.matchBodySnapshot({
errors: [{
id: anyErrorId
}]
})
.matchHeaderSnapshot({
etag: anyEtag
});
});
it('Cannot destroy non-existent snippet', async function () {
await agent
.delete('snippets/abcd1234abcd1234abcd1234')
.expectStatus(404)
.matchBodySnapshot({
errors: [{
id: anyErrorId
}]
})
.matchHeaderSnapshot({
etag: anyEtag
});
});
});