Ghost/ghost/core/test/e2e-api/admin/snippets.test.js
Elena Baidakova 7f184d2451
Added support for filtering snippets to mobiledoc/lexical (#16636)
refs TryGhost/Team#2904


<!-- Leave the line below if you'd like GitHub Copilot to generate a
summary from your commit -->
<!--
copilot:summary
-->
### <samp>🤖 Generated by Copilot at b3f5423</samp>

This pull request adds support for multiple formats of snippet content,
especially the `lexical` format, to the Ghost CMS. It modifies the
snippets API, model, and test files to handle the format conversion,
filtering, and serialization of snippets.
2023-04-17 10:54:08 +04:00

251 lines
7.2 KiB
JavaScript

const {agentProvider, fixtureManager, matchers} = require('../../utils/e2e-framework');
const {anyContentVersion, 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({
'content-version': anyContentVersion,
etag: anyEtag,
location: anyLocationFor('snippets')
});
});
it('Can browse', async function () {
await agent
.get('snippets')
.expectStatus(200)
.matchBodySnapshot({
snippets: new Array(2).fill(matchSnippet)
})
.matchHeaderSnapshot({
'content-version': anyContentVersion,
etag: anyEtag
});
});
it('Can read', async function () {
await agent
.get(`snippets/${fixtureManager.get('snippets', 0).id}/`)
.expectStatus(200)
.matchBodySnapshot({
snippets: [matchSnippet]
})
.matchHeaderSnapshot({
'content-version': anyContentVersion,
etag: anyEtag
});
});
it('Can read lexical', async function () {
await agent
.get(`snippets/${fixtureManager.get('snippets', 0).id}/?formats=lexical`)
.expectStatus(200)
.matchBodySnapshot({
snippets: [matchSnippet]
})
.matchHeaderSnapshot({
'content-version': anyContentVersion,
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({
'content-version': anyContentVersion,
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({
'content-version': anyContentVersion,
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({
'content-version': anyContentVersion,
etag: anyEtag,
location: anyLocationFor('snippets')
});
const newSnippet = body.snippets[0];
await agent
.delete(`snippets/${newSnippet.id}`)
.expectStatus(204)
.expectEmptyBody()
.matchHeaderSnapshot({
'content-version': anyContentVersion,
etag: anyEtag
});
await agent
.get(`snippets/${newSnippet.id}/`)
.expectStatus(404)
.matchBodySnapshot({
errors: [{
id: anyErrorId
}]
})
.matchHeaderSnapshot({
'content-version': anyContentVersion,
etag: anyEtag
});
});
it('Cannot destroy non-existent snippet', async function () {
await agent
.delete('snippets/abcd1234abcd1234abcd1234')
.expectStatus(404)
.matchBodySnapshot({
errors: [{
id: anyErrorId
}]
})
.matchHeaderSnapshot({
'content-version': anyContentVersion,
etag: anyEtag
});
});
it('Can add lexical', async function () {
const snippet = {
name: 'test lexical',
lexical: JSON.stringify({node: 'text'}),
mobiledoc: '{}'
};
await agent
.post('snippets/?formats=lexical')
.body({snippets: [snippet]})
.expectStatus(201)
.matchBodySnapshot({
snippets: [matchSnippet]
})
.matchHeaderSnapshot({
'content-version': anyContentVersion,
etag: anyEtag,
location: anyLocationFor('snippets')
});
});
it('Can browse lexical', async function () {
await agent
.get('snippets?formats=lexical&filter=lexical:-null')
.expectStatus(200)
.matchBodySnapshot({
snippets: new Array(1).fill(matchSnippet)
})
.matchHeaderSnapshot({
'content-version': anyContentVersion,
etag: anyEtag
});
});
it('Can edit lexical', async function () {
const snippetToChange = {
name: 'change me',
mobiledoc: '{}',
lexical: '{}'
};
const snippetChanged = {
name: 'changed lexical',
mobiledoc: '{}',
lexical: JSON.stringify({node: 'text'})
};
const {body} = await agent
.post(`snippets/?formats=lexical`)
.body({snippets: [snippetToChange]})
.expectStatus(201)
.matchBodySnapshot({
snippets: [matchSnippet]
})
.matchHeaderSnapshot({
'content-version': anyContentVersion,
etag: anyEtag,
location: anyLocationFor('snippets')
});
const newsnippet = body.snippets[0];
await agent
.put(`snippets/${newsnippet.id}/?formats=lexical`)
.body({snippets: [snippetChanged]})
.expectStatus(200)
.matchBodySnapshot({
snippets: [matchSnippet]
})
.matchHeaderSnapshot({
'content-version': anyContentVersion,
etag: anyEtag
});
});
});