0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-01-20 22:42:53 -05:00

Updated snippets e2e tests to use new framework

- Snippets are are one of the most recently implemented full e2e features
- https://github.com/TryGhost/Ghost/commit/13f653a12 updated the serialier pattern
- This updates the tests so _everything_ is shiny and new
This commit is contained in:
Hannah Wolfe 2022-03-29 15:33:30 +01:00
parent f7ad32e76b
commit 130ffb4d63
No known key found for this signature in database
GPG key ID: AB586C3B5AE5C037
2 changed files with 312 additions and 140 deletions

View file

@ -0,0 +1,218 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`Snippets API Can add 1: [body] 1`] = `
Object {
"snippets": Array [
Object {
"created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/,
"id": StringMatching /\\[a-f0-9\\]\\{24\\}/,
"mobiledoc": "{}",
"name": "test",
"updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/,
},
],
}
`;
exports[`Snippets API Can add 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": "159",
"content-type": "application/json; charset=utf-8",
"etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/,
"location": StringMatching /https\\?:\\\\/\\\\/\\.\\*\\?\\\\/snippets\\\\/\\[a-f0-9\\]\\{24\\}\\\\//,
"vary": "Origin, Accept-Encoding",
"x-powered-by": "Express",
}
`;
exports[`Snippets API Can browse 1: [body] 1`] = `
Object {
"meta": Object {
"pagination": Object {
"limit": 15,
"next": null,
"page": 1,
"pages": 1,
"prev": null,
"total": 2,
},
},
"snippets": Array [
Object {
"created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/,
"id": StringMatching /\\[a-f0-9\\]\\{24\\}/,
"mobiledoc": "{}",
"name": "Test snippet 1",
"updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/,
},
Object {
"created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/,
"id": StringMatching /\\[a-f0-9\\]\\{24\\}/,
"mobiledoc": "{}",
"name": "test",
"updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/,
},
],
}
`;
exports[`Snippets API Can browse 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": "402",
"content-type": "application/json; charset=utf-8",
"etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/,
"vary": "Origin, Accept-Encoding",
"x-powered-by": "Express",
}
`;
exports[`Snippets API Can destroy 1: [body] 1`] = `
Object {
"snippets": Array [
Object {
"created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/,
"id": StringMatching /\\[a-f0-9\\]\\{24\\}/,
"mobiledoc": "{}",
"name": "destroy test",
"updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/,
},
],
}
`;
exports[`Snippets API Can destroy 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": "167",
"content-type": "application/json; charset=utf-8",
"etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/,
"location": StringMatching /https\\?:\\\\/\\\\/\\.\\*\\?\\\\/snippets\\\\/\\[a-f0-9\\]\\{24\\}\\\\//,
"vary": "Origin, Accept-Encoding",
"x-powered-by": "Express",
}
`;
exports[`Snippets API Can destroy 3: [body] 1`] = `Object {}`;
exports[`Snippets API Can destroy 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",
"etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/,
"vary": "Origin",
"x-powered-by": "Express",
}
`;
exports[`Snippets API Can destroy 5: [body] 1`] = `
Object {
"errors": Array [
Object {
"code": null,
"context": "Snippet not found.",
"details": null,
"help": null,
"id": StringMatching /\\[a-f0-9\\]\\{8\\}-\\[a-f0-9\\]\\{4\\}-\\[a-f0-9\\]\\{4\\}-\\[a-f0-9\\]\\{4\\}-\\[a-f0-9\\]\\{12\\}/,
"message": "Resource not found error, cannot read snippet.",
"property": null,
"type": "NotFoundError",
},
],
}
`;
exports[`Snippets API Can destroy 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": "226",
"content-type": "application/json; charset=utf-8",
"etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/,
"vary": "Origin, Accept-Encoding",
"x-powered-by": "Express",
}
`;
exports[`Snippets API Can edit 1: [body] 1`] = `
Object {
"snippets": Array [
Object {
"created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/,
"id": StringMatching /\\[a-f0-9\\]\\{24\\}/,
"mobiledoc": "{}",
"name": "change me",
"updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/,
},
],
}
`;
exports[`Snippets API Can edit 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": "164",
"content-type": "application/json; charset=utf-8",
"etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/,
"location": StringMatching /https\\?:\\\\/\\\\/\\.\\*\\?\\\\/snippets\\\\/\\[a-f0-9\\]\\{24\\}\\\\//,
"vary": "Origin, Accept-Encoding",
"x-powered-by": "Express",
}
`;
exports[`Snippets API Can edit 3: [body] 1`] = `
Object {
"snippets": Array [
Object {
"created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/,
"id": StringMatching /\\[a-f0-9\\]\\{24\\}/,
"mobiledoc": "{}",
"name": "changed",
"updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/,
},
],
}
`;
exports[`Snippets API Can edit 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": "162",
"content-type": "application/json; charset=utf-8",
"etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/,
"vary": "Origin, Accept-Encoding",
"x-powered-by": "Express",
}
`;
exports[`Snippets API Can read 1: [body] 1`] = `
Object {
"snippets": Array [
Object {
"created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/,
"id": StringMatching /\\[a-f0-9\\]\\{24\\}/,
"mobiledoc": "{}",
"name": "Test snippet 1",
"updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/,
},
],
}
`;
exports[`Snippets API Can read 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": "169",
"content-type": "application/json; charset=utf-8",
"etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/,
"vary": "Origin, Accept-Encoding",
"x-powered-by": "Express",
}
`;

View file

@ -1,96 +1,62 @@
const path = require('path');
const should = require('should');
const supertest = require('supertest');
const sinon = require('sinon');
const testUtils = require('../../utils');
const localUtils = require('./utils');
const config = require('../../../core/shared/config');
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 request;
after(function () {
sinon.restore();
});
let agent;
before(async function () {
await localUtils.startGhost();
request = supertest.agent(config.get('url'));
await localUtils.doAuth(request, 'snippets');
agent = await agentProvider.getAdminAPIAgent();
await fixtureManager.init('snippets');
await agent.loginAsOwner();
});
it('Can add', async function () {
const snippet = {
name: 'test',
// TODO: validate mobiledoc document
mobiledoc: JSON.stringify({})
};
const res = await request
.post(localUtils.API.getApiQuery(`snippets/`))
.send({snippets: [snippet]})
.set('Origin', config.get('url'))
.expect('Content-Type', /json/)
.expect('Cache-Control', testUtils.cacheRules.private)
.expect(201);
should.not.exist(res.headers['x-cache-invalidate']);
const jsonResponse = res.body;
should.exist(jsonResponse);
should.exist(jsonResponse.snippets);
jsonResponse.snippets.should.have.length(1);
jsonResponse.snippets[0].name.should.equal(snippet.name);
jsonResponse.snippets[0].mobiledoc.should.equal(snippet.mobiledoc);
should.exist(res.headers.location);
res.headers.location.should.equal(`http://127.0.0.1:2369${localUtils.API.getApiQuery('snippets/')}${res.body.snippets[0].id}/`);
await agent
.post('snippets/')
.body({snippets: [snippet]})
.expectStatus(201)
.matchBodySnapshot({
snippets: [matchSnippet]
})
.matchHeaderSnapshot({
etag: anyEtag,
location: anyLocationFor('snippets')
});
});
it('Can browse', async function () {
const res = await request
.get(localUtils.API.getApiQuery('snippets/'))
.set('Origin', config.get('url'))
.expect('Content-Type', /json/)
.expect('Cache-Control', testUtils.cacheRules.private)
.expect(200);
should.not.exist(res.headers['x-cache-invalidate']);
const jsonResponse = res.body;
should.exist(jsonResponse);
should.exist(jsonResponse.snippets);
// 1 from fixtures and 1 from "Can add" above
jsonResponse.snippets.should.have.length(2);
localUtils.API.checkResponse(jsonResponse.snippets[0], 'snippet');
// created in "Can add" above, individual tests are not idempotent
jsonResponse.snippets[1].name.should.eql('test');
testUtils.API.isISO8601(jsonResponse.snippets[0].created_at).should.be.true();
jsonResponse.snippets[0].created_at.should.be.an.instanceof(String);
jsonResponse.meta.pagination.should.have.property('page', 1);
jsonResponse.meta.pagination.should.have.property('limit', 15);
jsonResponse.meta.pagination.should.have.property('pages', 1);
jsonResponse.meta.pagination.should.have.property('total', 2);
jsonResponse.meta.pagination.should.have.property('next', null);
jsonResponse.meta.pagination.should.have.property('prev', null);
await agent
.get('snippets')
.expectStatus(200)
.matchBodySnapshot({
snippets: new Array(2).fill(matchSnippet)
})
.matchHeaderSnapshot({
etag: anyEtag
});
});
it('Can read', async function () {
const res = await request
.get(localUtils.API.getApiQuery(`snippets/${testUtils.DataGenerator.Content.snippets[0].id}/`))
.set('Origin', config.get('url'))
.expect('Content-Type', /json/)
.expect('Cache-Control', testUtils.cacheRules.private)
.expect(200);
should.not.exist(res.headers['x-cache-invalidate']);
const jsonResponse = res.body;
should.exist(jsonResponse);
should.exist(jsonResponse.snippets);
jsonResponse.snippets.should.have.length(1);
localUtils.API.checkResponse(jsonResponse.snippets[0], 'snippet');
await agent
.get(`snippets/${fixtureManager.get('snippets', 0).id}/`)
.expectStatus(200)
.matchBodySnapshot({
snippets: [matchSnippet]
})
.matchHeaderSnapshot({
etag: anyEtag
});
});
it('Can edit', async function () {
@ -104,43 +70,30 @@ describe('Snippets API', function () {
mobiledoc: '{}'
};
const res = await request
.post(localUtils.API.getApiQuery(`snippets/`))
.send({snippets: [snippetToChange]})
.set('Origin', config.get('url'))
.expect('Content-Type', /json/)
.expect('Cache-Control', testUtils.cacheRules.private)
.expect(201);
const {body} = await agent
.post(`snippets/`)
.body({snippets: [snippetToChange]})
.expectStatus(201)
.matchBodySnapshot({
snippets: [matchSnippet]
})
.matchHeaderSnapshot({
etag: anyEtag,
location: anyLocationFor('snippets')
});
should.not.exist(res.headers['x-cache-invalidate']);
const jsonResponse = res.body;
should.exist(jsonResponse);
should.exist(jsonResponse.snippets);
jsonResponse.snippets.should.have.length(1);
const newsnippet = body.snippets[0];
should.exist(res.headers.location);
res.headers.location.should.equal(`http://127.0.0.1:2369${localUtils.API.getApiQuery('snippets/')}${res.body.snippets[0].id}/`);
const newsnippet = jsonResponse.snippets[0];
const res2 = await request
.put(localUtils.API.getApiQuery(`snippets/${newsnippet.id}/`))
.send({snippets: [snippetChanged]})
.set('Origin', config.get('url'))
.expect('Content-Type', /json/)
.expect('Cache-Control', testUtils.cacheRules.private)
.expect(200);
should.not.exist(res2.headers['x-cache-invalidate']);
const jsonResponse2 = res2.body;
should.exist(jsonResponse2);
should.exist(jsonResponse2.snippets);
jsonResponse2.snippets.should.have.length(1);
localUtils.API.checkResponse(jsonResponse2.snippets[0], 'snippet');
jsonResponse2.snippets[0].name.should.equal(snippetChanged.name);
jsonResponse2.snippets[0].mobiledoc.should.equal(snippetChanged.mobiledoc);
await agent
.put(`snippets/${newsnippet.id}/`)
.body({snippets: [snippetChanged]})
.expectStatus(200)
.matchBodySnapshot({
snippets: [matchSnippet]
})
.matchHeaderSnapshot({
etag: anyEtag
});
});
it('Can destroy', async function () {
@ -149,37 +102,38 @@ describe('Snippets API', function () {
mobiledoc: '{}'
};
const res = await request
.post(localUtils.API.getApiQuery(`snippets/`))
.send({snippets: [snippet]})
.set('Origin', config.get('url'))
.expect('Content-Type', /json/)
.expect('Cache-Control', testUtils.cacheRules.private)
.expect(201);
should.not.exist(res.headers['x-cache-invalidate']);
const jsonResponse = res.body;
should.exist(jsonResponse);
should.exist(jsonResponse.snippets);
const newSnippet = jsonResponse.snippets[0];
await request
.delete(localUtils.API.getApiQuery(`snippets/${newSnippet.id}`))
.set('Origin', config.get('url'))
.expect('Cache-Control', testUtils.cacheRules.private)
.expect(204)
.expect((_res) => {
_res.body.should.be.empty();
const {body} = await agent
.post(`snippets/`)
.body({snippets: [snippet]})
.expectStatus(201)
.matchBodySnapshot({
snippets: [matchSnippet]
})
.matchHeaderSnapshot({
etag: anyEtag,
location: anyLocationFor('snippets')
});
await request
.get(localUtils.API.getApiQuery(`snippets/${newSnippet.id}/`))
.set('Origin', config.get('url'))
.expect('Content-Type', /json/)
.expect('Cache-Control', testUtils.cacheRules.private)
.expect(404);
const newSnippet = body.snippets[0];
await agent
.delete(`snippets/${newSnippet.id}`)
.expectStatus(204)
.matchBodySnapshot()
.matchHeaderSnapshot({
etag: anyEtag
});
await agent
.get(`snippets/${newSnippet.id}/`)
.expectStatus(404)
.matchBodySnapshot({
errors: [{
id: anyErrorId
}]
})
.matchHeaderSnapshot({
etag: anyEtag
});
});
});