0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-02-24 23:48:13 -05:00

Fixed normalization of attrs in Mirage config and tests (#872)

no issue

We weren't being consistent in our use of Mirage's `normalizedRequestAttrs()` method which meant that in certain cases Mirage's internal database had duplicated attrs, the original set being `camelCase` and the new/updated set being `underscore_case` which was not only confusing but can lead to errors or unexpected behaviour in tests.

- updated Mirage config to always normalize where necessary
- updated tests to always use `camelCase` attrs
- added `HEAD` route handler for gravatar to avoid unknown route noise in tests
This commit is contained in:
Kevin Ansfield 2017-09-28 03:33:00 +01:00 committed by Aileen Nowak
parent 62ef94760a
commit fb549645f8
8 changed files with 42 additions and 40 deletions

View file

@ -72,6 +72,10 @@ export function testConfig() {
}; };
}); });
this.head('http://www.gravatar.com/avatar/:md5', function () {
return '';
}, 200);
this.get('http://www.gravatar.com/avatar/:md5', function () { this.get('http://www.gravatar.com/avatar/:md5', function () {
return ''; return '';
}, 200); }, 200);

View file

@ -53,8 +53,8 @@ export default function mockAuthentication(server) {
/* Setup ---------------------------------------------------------------- */ /* Setup ---------------------------------------------------------------- */
server.post('/authentication/setup', function ({roles, users}, request) { server.post('/authentication/setup', function ({roles, users}) {
let [attrs] = JSON.parse(request.requestBody).setup; let attrs = this.normalizedRequestAttrs();
let role = roles.findBy({name: 'Owner'}); let role = roles.findBy({name: 'Owner'});
// create owner role unless already exists // create owner role unless already exists

View file

@ -28,10 +28,10 @@ export default function mockInvites(server) {
/* eslint-disable camelcase */ /* eslint-disable camelcase */
attrs.token = `${invites.all().models.length}-token`; attrs.token = `${invites.all().models.length}-token`;
attrs.expires = moment.utc().add(1, 'day').valueOf(); attrs.expires = moment.utc().add(1, 'day').valueOf();
attrs.created_at = moment.utc().format(); attrs.createdAt = moment.utc().format();
attrs.created_by = 1; attrs.createdBy = 1;
attrs.updated_at = moment.utc().format(); attrs.updatedAt = moment.utc().format();
attrs.updated_by = 1; attrs.updatedBy = 1;
attrs.status = 'sent'; attrs.status = 'sent';
/* eslint-enable camelcase */ /* eslint-enable camelcase */

View file

@ -56,8 +56,8 @@ export default function mockPosts(server) {
}); });
// Handle embedded author in post // Handle embedded author in post
server.put('/posts/:id/', ({posts}, request) => { server.put('/posts/:id/', function ({posts}, request) {
let {posts: [post]} = JSON.parse(request.requestBody); let post = this.normalizedRequestAttrs();
let {author} = post; let {author} = post;
delete post.author; delete post.author;

View file

@ -5,8 +5,8 @@ import {paginatedResponse} from '../utils';
export default function mockSubscribers(server) { export default function mockSubscribers(server) {
server.get('/subscribers/', paginatedResponse('subscribers')); server.get('/subscribers/', paginatedResponse('subscribers'));
server.post('/subscribers/', function ({subscribers}, request) { server.post('/subscribers/', function ({subscribers}) {
let [attrs] = JSON.parse(request.requestBody).subscribers; let attrs = this.normalizedRequestAttrs();
let subscriber = subscribers.findBy({email: attrs.email}); let subscriber = subscribers.findBy({email: attrs.email});
if (subscriber) { if (subscriber) {
@ -18,8 +18,8 @@ export default function mockSubscribers(server) {
}] }]
}); });
} else { } else {
attrs.created_at = new Date(); attrs.createdAt = new Date();
attrs.created_by = 0; attrs.createdBy = 0;
return subscribers.create(attrs); return subscribers.create(attrs);
} }

View file

@ -3,8 +3,8 @@ import {isBlank} from '@ember/utils';
import {paginatedResponse} from '../utils'; import {paginatedResponse} from '../utils';
export default function mockTags(server) { export default function mockTags(server) {
server.post('/tags/', function ({tags}, {requestBody}) { server.post('/tags/', function ({tags}) {
let [attrs] = JSON.parse(requestBody).tags; let attrs = this.normalizedRequestAttrs();
if (isBlank(attrs.slug) && !isBlank(attrs.name)) { if (isBlank(attrs.slug) && !isBlank(attrs.name)) {
attrs.slug = dasherize(attrs.name); attrs.slug = dasherize(attrs.name);

View file

@ -567,7 +567,7 @@ describe('Acceptance: Editor', function() {
).to.match(/cannot be longer than 300/); ).to.match(/cannot be longer than 300/);
expect( expect(
server.db.posts[0].custom_excerpt, server.db.posts.find(post.id).customExcerpt,
'saved excerpt after validation error' 'saved excerpt after validation error'
).to.be.blank; ).to.be.blank;
@ -576,7 +576,7 @@ describe('Acceptance: Editor', function() {
await triggerEvent('[data-test-field="custom-excerpt"]', 'blur'); await triggerEvent('[data-test-field="custom-excerpt"]', 'blur');
expect( expect(
server.db.posts[0].custom_excerpt, server.db.posts.find(post.id).customExcerpt,
'saved excerpt' 'saved excerpt'
).to.equal('Testing excerpt'); ).to.equal('Testing excerpt');
@ -596,7 +596,7 @@ describe('Acceptance: Editor', function() {
).to.match(/cannot be longer than 65535/); ).to.match(/cannot be longer than 65535/);
expect( expect(
server.db.posts[0].codeinjection_head, server.db.posts.find(post.id).codeinjectionHead,
'saved header injection after validation error' 'saved header injection after validation error'
).to.be.blank; ).to.be.blank;
@ -605,7 +605,7 @@ describe('Acceptance: Editor', function() {
await triggerEvent(headerCM.getInputField(), 'blur'); await triggerEvent(headerCM.getInputField(), 'blur');
expect( expect(
server.db.posts[0].codeinjection_head, server.db.posts.find(post.id).codeinjectionHead,
'saved header injection' 'saved header injection'
).to.equal('<script src="http://example.com/inject-head.js"></script>'); ).to.equal('<script src="http://example.com/inject-head.js"></script>');
@ -620,7 +620,7 @@ describe('Acceptance: Editor', function() {
).to.match(/cannot be longer than 65535/); ).to.match(/cannot be longer than 65535/);
expect( expect(
server.db.posts[0].codeinjection_foot, server.db.posts.find(post.id).codeinjectionFoot,
'saved footer injection after validation error' 'saved footer injection after validation error'
).to.be.blank; ).to.be.blank;
@ -629,7 +629,7 @@ describe('Acceptance: Editor', function() {
await triggerEvent(footerCM.getInputField(), 'blur'); await triggerEvent(footerCM.getInputField(), 'blur');
expect( expect(
server.db.posts[0].codeinjection_foot, server.db.posts.find(post.id).codeinjectionFoot,
'saved footer injection' 'saved footer injection'
).to.equal('<script src="http://example.com/inject-foot.js"></script>'); ).to.equal('<script src="http://example.com/inject-foot.js"></script>');
@ -656,7 +656,7 @@ describe('Acceptance: Editor', function() {
).to.match(/cannot be longer than 300/); ).to.match(/cannot be longer than 300/);
expect( expect(
server.db.posts[0].twitter_title, server.db.posts.find(post.id).twitterTitle,
'saved twitter title after validation error' 'saved twitter title after validation error'
).to.be.blank; ).to.be.blank;
@ -666,7 +666,7 @@ describe('Acceptance: Editor', function() {
await triggerEvent('[data-test-field="twitter-title"]', 'blur'); await triggerEvent('[data-test-field="twitter-title"]', 'blur');
expect( expect(
server.db.posts[0].twitter_title, server.db.posts.find(post.id).twitterTitle,
'saved twitter title' 'saved twitter title'
).to.equal('Test Twitter Title'); ).to.equal('Test Twitter Title');
@ -680,7 +680,7 @@ describe('Acceptance: Editor', function() {
).to.match(/cannot be longer than 500/); ).to.match(/cannot be longer than 500/);
expect( expect(
server.db.posts[0].twitter_description, server.db.posts.find(post.id).twitterDescription,
'saved twitter description after validation error' 'saved twitter description after validation error'
).to.be.blank; ).to.be.blank;
@ -690,7 +690,7 @@ describe('Acceptance: Editor', function() {
await triggerEvent('[data-test-field="twitter-description"]', 'blur'); await triggerEvent('[data-test-field="twitter-description"]', 'blur');
expect( expect(
server.db.posts[0].twitter_description, server.db.posts.find(post.id).twitterDescription,
'saved twitter description' 'saved twitter description'
).to.equal('Test Twitter Description'); ).to.equal('Test Twitter Description');
@ -717,7 +717,7 @@ describe('Acceptance: Editor', function() {
).to.match(/cannot be longer than 300/); ).to.match(/cannot be longer than 300/);
expect( expect(
server.db.posts[0].og_title, server.db.posts.find(post.id).ogTitle,
'saved facebook title after validation error' 'saved facebook title after validation error'
).to.be.blank; ).to.be.blank;
@ -727,7 +727,7 @@ describe('Acceptance: Editor', function() {
await triggerEvent('[data-test-field="og-title"]', 'blur'); await triggerEvent('[data-test-field="og-title"]', 'blur');
expect( expect(
server.db.posts[0].og_title, server.db.posts.find(post.id).ogTitle,
'saved facebook title' 'saved facebook title'
).to.equal('Test Facebook Title'); ).to.equal('Test Facebook Title');
@ -741,7 +741,7 @@ describe('Acceptance: Editor', function() {
).to.match(/cannot be longer than 500/); ).to.match(/cannot be longer than 500/);
expect( expect(
server.db.posts[0].og_description, server.db.posts.find(post.id).ogDescription,
'saved facebook description after validation error' 'saved facebook description after validation error'
).to.be.blank; ).to.be.blank;
@ -751,7 +751,7 @@ describe('Acceptance: Editor', function() {
await triggerEvent('[data-test-field="og-description"]', 'blur'); await triggerEvent('[data-test-field="og-description"]', 'blur');
expect( expect(
server.db.posts[0].og_description, server.db.posts.find(post.id).ogDescription,
'saved facebook description' 'saved facebook description'
).to.equal('Test Facebook Description'); ).to.equal('Test Facebook Description');

View file

@ -238,8 +238,8 @@ describe('Acceptance: Setup', function () {
invalidateSession(application); invalidateSession(application);
server.loadFixtures('roles'); server.loadFixtures('roles');
server.post('/invites', function ({invites}, request) { server.post('/invites/', function ({invites}) {
let [params] = JSON.parse(request.requestBody).invites; let attrs = this.normalizedRequestAttrs();
postCount++; postCount++;
@ -256,17 +256,15 @@ describe('Acceptance: Setup', function () {
} }
// TODO: duplicated from mirage/config/invites - extract method? // TODO: duplicated from mirage/config/invites - extract method?
/* eslint-disable camelcase */ attrs.token = `${invites.all().models.length}-token`;
params.token = `${invites.all().models.length}-token`; attrs.expires = moment.utc().add(1, 'day').valueOf();
params.expires = moment.utc().add(1, 'day').valueOf(); attrs.createdAt = moment.utc().format();
params.created_at = moment.utc().format(); attrs.createdBy = 1;
params.created_by = 1; attrs.updatedAt = moment.utc().format();
params.updated_at = moment.utc().format(); attrs.updatedBy = 1;
params.updated_by = 1; attrs.status = 'sent';
params.status = 'sent';
/* eslint-enable camelcase */
return invites.create(params); return invites.create(attrs);
}); });
// complete step 2 so we can access step 3 // complete step 2 so we can access step 3