Standardise client property names to camelCase

closes #6018
- added keyForAttribute method in application serializer
- override keyForAttribute in settings serializer to not apply camelCase/underscore conversion
- rename under_scored properties to camelCased
This commit is contained in:
Kevin P. Kucharczyk 2016-01-23 19:12:22 +01:00
parent 15144dd551
commit c4371a36f2
22 changed files with 164 additions and 152 deletions

View File

@ -18,8 +18,8 @@ export default Component.extend({
scratchName: boundOneWay('tag.name'),
scratchSlug: boundOneWay('tag.slug'),
scratchDescription: boundOneWay('tag.description'),
scratchMetaTitle: boundOneWay('tag.meta_title'),
scratchMetaDescription: boundOneWay('tag.meta_description'),
scratchMetaTitle: boundOneWay('tag.metaTitle'),
scratchMetaDescription: boundOneWay('tag.metaDescription'),
isViewingSubview: false,

View File

@ -23,8 +23,8 @@ export default Component.extend({
return Ember.String.htmlSafe(`background-image: url(${url})`);
}),
lastLogin: computed('user.last_login', function () {
let lastLogin = this.get('user.last_login');
lastLogin: computed('user.lastLogin', function () {
let lastLogin = this.get('user.lastLogin');
return lastLogin ? lastLogin.fromNow() : '(Never)';
})

View File

@ -14,8 +14,8 @@ export default Component.extend({
notifications: service(),
createdAt: computed('user.created_at', function () {
let createdAt = this.get('user.created_at');
createdAt: computed('user.createdAt', function () {
let createdAt = this.get('user.createdAt');
return createdAt ? createdAt.fromNow() : '';
}),

View File

@ -85,8 +85,8 @@ export default Controller.extend(SettingsMenuMixin, {
this.set('lastPromise', promise);
},
metaTitleScratch: boundOneWay('model.meta_title'),
metaDescriptionScratch: boundOneWay('model.meta_description'),
metaTitleScratch: boundOneWay('model.metaTitle'),
metaDescriptionScratch: boundOneWay('model.metaDescription'),
seoTitle: computed('model.titleScratch', 'metaTitleScratch', function () {
let metaTitle = this.get('metaTitleScratch') || '';
@ -291,13 +291,13 @@ export default Controller.extend(SettingsMenuMixin, {
*/
setPublishedAt(userInput) {
let newPublishedAt = parseDateString(userInput);
let publishedAt = moment(this.get('model.published_at'));
let publishedAt = moment(this.get('model.publishedAt'));
let errMessage = '';
if (!userInput) {
// Clear out the published_at field for a draft
// Clear out the publishedAt field for a draft
if (this.get('model.isDraft')) {
this.set('model.published_at', null);
this.set('model.publishedAt', null);
}
return;
@ -324,7 +324,7 @@ export default Controller.extend(SettingsMenuMixin, {
}
// Validation complete
this.set('model.published_at', newPublishedAt);
this.set('model.publishedAt', newPublishedAt);
// If this is a new post. Don't save the model. Defer the save
// to the user pressing the save button
@ -339,7 +339,7 @@ export default Controller.extend(SettingsMenuMixin, {
},
setMetaTitle(metaTitle) {
let property = 'meta_title';
let property = 'metaTitle';
let model = this.get('model');
let currentTitle = model.get(property) || '';
@ -360,7 +360,7 @@ export default Controller.extend(SettingsMenuMixin, {
},
setMetaDescription(metaDescription) {
let property = 'meta_description';
let property = 'metaDescription';
let model = this.get('model');
let currentDescription = model.get(property) || '';

View File

@ -5,18 +5,18 @@ const {equal} = computed;
// a custom sort function is needed in order to sort the posts list the same way the server would:
// status: ASC
// published_at: DESC
// updated_at: DESC
// publishedAt: DESC
// updatedAt: DESC
// id: DESC
function comparator(item1, item2) {
let updated1 = item1.get('updated_at');
let updated2 = item2.get('updated_at');
let updated1 = item1.get('updatedAt');
let updated2 = item2.get('updatedAt');
let idResult,
publishedAtResult,
statusResult,
updatedAtResult;
// when `updated_at` is undefined, the model is still
// when `updatedAt` is undefined, the model is still
// being written to with the results from the server
if (item1.get('isNew') || !updated1) {
return -1;
@ -48,8 +48,8 @@ function comparator(item1, item2) {
}
function publishedAtCompare(item1, item2) {
let published1 = item1.get('published_at');
let published2 = item2.get('published_at');
let published1 = item1.get('publishedAt');
let published2 = item2.get('publishedAt');
if (!published1 && !published2) {
return 0;
@ -74,7 +74,7 @@ export default Controller.extend({
postListFocused: equal('keyboardFocus', 'postList'),
postContentFocused: equal('keyboardFocus', 'postContent'),
sortedPosts: computed('model.@each.status', 'model.@each.published_at', 'model.@each.isNew', 'model.@each.updated_at', function () {
sortedPosts: computed('model.@each.status', 'model.@each.publishedAt', 'model.@each.isNew', 'model.@each.updatedAt', function () {
let postsArray = this.get('model').toArray();
return postsArray.sort(comparator);

View File

@ -308,8 +308,8 @@ export default Mixin.create({
}
this.set('model.title', this.get('model.titleScratch'));
this.set('model.meta_title', psmController.get('metaTitleScratch'));
this.set('model.meta_description', psmController.get('metaDescriptionScratch'));
this.set('model.metaTitle', psmController.get('metaTitleScratch'));
this.set('model.metaDescription', psmController.get('metaDescriptionScratch'));
if (!this.get('model.slug')) {
// Cancel any pending slug generation that may still be queued in the

View File

@ -24,16 +24,16 @@ export default Model.extend(ValidationEngine, {
page: attr('boolean', {defaultValue: false}),
status: attr('string', {defaultValue: 'draft'}),
language: attr('string', {defaultValue: 'en_US'}),
meta_title: attr('string'),
meta_description: attr('string'),
metaTitle: attr('string'),
metaDescription: attr('string'),
author: belongsTo('user', {async: true}),
author_id: attr('number'),
updated_at: attr('moment-date'),
updated_by: attr(),
published_at: attr('moment-date'),
published_by: belongsTo('user', {async: true}),
created_at: attr('moment-date'),
created_by: attr(),
authorId: attr('number'),
updatedAt: attr('moment-date'),
updatedBy: attr(),
publishedAt: attr('moment-date'),
publishedBy: belongsTo('user', {async: true}),
createdAt: attr('moment-date'),
createdBy: attr(),
tags: hasMany('tag', {
embedded: 'always',
async: false
@ -81,7 +81,7 @@ export default Model.extend(ValidationEngine, {
},
isAuthoredByUser(user) {
return parseInt(user.get('id'), 10) === parseInt(this.get('author_id'), 10);
return parseInt(user.get('id'), 10) === parseInt(this.get('authorId'), 10);
}
});

View File

@ -9,10 +9,10 @@ export default Model.extend({
uuid: attr('string'),
name: attr('string'),
description: attr('string'),
created_at: attr('moment-date'),
updated_at: attr('moment-date'),
created_by: attr(),
updated_by: attr(),
createdAt: attr('moment-date'),
updatedAt: attr('moment-date'),
createdBy: attr(),
updatedBy: attr(),
lowerCaseName: computed('name', function () {
return this.get('name').toLocaleLowerCase();

View File

@ -11,13 +11,13 @@ export default Model.extend(ValidationEngine, {
slug: attr('string'),
description: attr('string'),
parent: attr(),
meta_title: attr('string'),
meta_description: attr('string'),
metaTitle: attr('string'),
metaDescription: attr('string'),
image: attr('string'),
hidden: attr('boolean'),
created_at: attr('moment-date'),
updated_at: attr('moment-date'),
created_by: attr(),
updated_by: attr(),
createdAt: attr('moment-date'),
updatedAt: attr('moment-date'),
createdBy: attr(),
updatedBy: attr(),
count: attr('raw')
});

View File

@ -26,13 +26,13 @@ export default Model.extend(ValidationEngine, {
accessibility: attr('string'),
status: attr('string'),
language: attr('string', {defaultValue: 'en_US'}),
meta_title: attr('string'),
meta_description: attr('string'),
last_login: attr('moment-date'),
created_at: attr('moment-date'),
created_by: attr('number'),
updated_at: attr('moment-date'),
updated_by: attr('number'),
metaTitle: attr('string'),
metaDescription: attr('string'),
lastLogin: attr('moment-date'),
createdAt: attr('moment-date'),
createdBy: attr('number'),
updatedAt: attr('moment-date'),
updatedBy: attr('number'),
roles: hasMany('role', {
embedded: 'always',
async: false

View File

@ -1,6 +1,10 @@
import Ember from 'ember';
import RESTSerializer from 'ember-data/serializers/rest';
const {
decamelize
} = Ember.String;
export default RESTSerializer.extend({
serializeIntoHash(hash, type, record, options) {
// Our API expects an id on the posted object
@ -15,5 +19,9 @@ export default RESTSerializer.extend({
delete data.uuid;
hash[root] = [data];
},
keyForAttribute(attr) {
return decamelize(attr);
}
});

View File

@ -12,10 +12,10 @@ export default ApplicationSerializer.extend(EmbeddedRecordsMixin, {
},
normalize(typeClass, hash, prop) {
// this is to enable us to still access the raw author_id
// this is to enable us to still access the raw authorId
// without requiring an extra get request (since it is an
// async relationship).
hash.author_id = hash.author;
hash.authorId = hash.author;
return this._super(typeClass, hash, prop);
},
@ -47,7 +47,7 @@ export default ApplicationSerializer.extend(EmbeddedRecordsMixin, {
delete data.uuid;
delete data.html;
// Inserted locally as a convenience.
delete data.author_id;
delete data.authorId;
// Read-only virtual property.
delete data.url;

View File

@ -30,6 +30,10 @@ export default ApplicationSerializer.extend({
return this._super(store, primaryModelClass, payload, id, requestType);
},
keyForAttribute(attr) {
return attr;
},
_extractObjectFromArrayPayload(_payload) {
let payload = {id: '0'};

View File

@ -57,17 +57,17 @@
<div class="settings-menu-content">
<form>
{{#gh-form-group errors=tag.errors hasValidated=tag.hasValidated property="meta_title"}}
{{#gh-form-group errors=tag.errors hasValidated=tag.hasValidated property="metaTitle"}}
<label for="meta-title">Meta Title</label>
{{gh-input id="meta-title" name="meta_title" type="text" value=scratchMetaTitle focus-out=(action 'setProperty' 'meta_title')}}
{{gh-error-message errors=tag.errors property="meta_title"}}
{{gh-input id="meta-title" name="metaTitle" type="text" value=scratchMetaTitle focus-out=(action 'setProperty' 'metaTitle')}}
{{gh-error-message errors=tag.errors property="metaTitle"}}
<p>Recommended: <b>70</b> characters. Youve used {{gh-count-down-characters scratchMetaTitle 70}}</p>
{{/gh-form-group}}
{{#gh-form-group errors=tag.errors hasValidated=tag.hasValidated property="meta_description"}}
{{#gh-form-group errors=tag.errors hasValidated=tag.hasValidated property="metaDescription"}}
<label for="meta-description">Meta Description</label>
{{gh-textarea id="meta-description" name="meta_description" value=scratchMetaDescription focus-out=(action 'setProperty' 'meta_description')}}
{{gh-error-message errors=tag.errors property="meta_description"}}
{{gh-textarea id="meta-description" name="metaDescription" value=scratchMetaDescription focus-out=(action 'setProperty' 'metaDescription')}}
{{gh-error-message errors=tag.errors property="metaDescription"}}
<p>Recommended: <b>156</b> characters. Youve used {{gh-count-down-characters scratchMetaDescription 156}}</p>
{{/gh-form-group}}

View File

@ -28,7 +28,7 @@
{{#gh-form-group errors=model.errors property="post-setting-date"}}
<label for="post-setting-date">Publish Date</label>
{{gh-datetime-input value=model.published_at
{{gh-datetime-input value=model.publishedAt
update=(action "setPublishedAt")
inputClass="post-setting-date"
inputId="post-setting-date"
@ -109,18 +109,18 @@
<div class="settings-menu-content">
<form {{action "discardEnter" on="submit"}}>
{{#gh-form-group errors=model.errors property="meta_title"}}
{{#gh-form-group errors=model.errors property="metaTitle"}}
<label for="meta-title">Meta Title</label>
{{gh-input class="post-setting-meta-title" id="meta-title" value=metaTitleScratch name="post-setting-meta-title" focus-out="setMetaTitle" stopEnterKeyDownPropagation="true"}}
<p>Recommended: <b>70</b> characters. Youve used {{gh-count-down-characters metaTitleScratch 70}}</p>
{{gh-error-message errors=model.errors property="meta_title"}}
{{gh-error-message errors=model.errors property="metaTitle"}}
{{/gh-form-group}}
{{#gh-form-group errors=model.errors property="meta_description"}}
{{#gh-form-group errors=model.errors property="metaDescription"}}
<label for="meta-description">Meta Description</label>
{{gh-textarea class="gh-input post-setting-meta-description" id="meta-description" value=metaDescriptionScratch name="post-setting-meta-description" focus-out="setMetaDescription" stopEnterKeyDownPropagation="true"}}
<p>Recommended: <b>156</b> characters. Youve used {{gh-count-down-characters metaDescriptionScratch 156}}</p>
{{gh-error-message errors=model.errors property="meta_description"}}
{{gh-error-message errors=model.errors property="metaDescription"}}
{{/gh-form-group}}
<div class="form-group">

View File

@ -24,8 +24,8 @@
{{#if post.page}}
<span class="page">Page</span>
{{else}}
<time datetime="{{post.published_at}}" class="date published">
Published {{gh-format-timeago post.published_at}}
<time datetime="{{post.publishedAt}}" class="date published">
Published {{gh-format-timeago post.publishedAt}}
</time>
{{/if}}
{{else}}

View File

@ -18,19 +18,19 @@ export default BaseValidator.create({
},
metaTitle(model) {
let metaTitle = model.get('meta_title');
let metaTitle = model.get('metaTitle');
if (!validator.isLength(metaTitle, 0, 150)) {
model.get('errors').add('meta_title', 'Meta Title cannot be longer than 150 characters.');
model.get('errors').add('metaTitle', 'Meta Title cannot be longer than 150 characters.');
this.invalidate();
}
},
metaDescription(model) {
let metaDescription = model.get('meta_description');
let metaDescription = model.get('metaDescription');
if (!validator.isLength(metaDescription, 0, 200)) {
model.get('errors').add('meta_description', 'Meta Description cannot be longer than 200 characters.');
model.get('errors').add('metaDescription', 'Meta Description cannot be longer than 200 characters.');
this.invalidate();
}
}

View File

@ -37,19 +37,19 @@ export default BaseValidator.create({
},
metaTitle(model) {
let metaTitle = model.get('meta_title');
let metaTitle = model.get('metaTitle');
if (!validator.isLength(metaTitle, 0, 150)) {
model.get('errors').add('meta_title', 'Meta Title cannot be longer than 150 characters.');
model.get('errors').add('metaTitle', 'Meta Title cannot be longer than 150 characters.');
this.invalidate();
}
},
metaDescription(model) {
let metaDescription = model.get('meta_description');
let metaDescription = model.get('metaDescription');
if (!validator.isLength(metaDescription, 0, 200)) {
model.get('errors').add('meta_description', 'Meta Description cannot be longer than 200 characters.');
model.get('errors').add('metaDescription', 'Meta Description cannot be longer than 200 characters.');
this.invalidate();
}
}

View File

@ -29,8 +29,8 @@ describeComponent(
name: 'Test',
slug: 'test',
description: 'Description.',
meta_title: 'Meta Title',
meta_description: 'Meta description',
metaTitle: 'Meta Title',
metaDescription: 'Meta description',
errors: DS.Errors.create(),
hasValidated: []
});
@ -72,8 +72,8 @@ describeComponent(
expect(this.$('input[name="name"]').val(), 'name field value').to.equal('Test');
expect(this.$('input[name="slug"]').val(), 'slug field value').to.equal('test');
expect(this.$('textarea[name="description"]').val(), 'description field value').to.equal('Description.');
expect(this.$('input[name="meta_title"]').val(), 'meta_title field value').to.equal('Meta Title');
expect(this.$('textarea[name="meta_description"]').val(), 'meta_description field value').to.equal('Meta description');
expect(this.$('input[name="metaTitle"]').val(), 'metaTitle field value').to.equal('Meta Title');
expect(this.$('textarea[name="metaDescription"]').val(), 'metaDescription field value').to.equal('Meta description');
});
it('can switch between main/meta settings', function () {
@ -112,15 +112,15 @@ describeComponent(
this.$('input[name="name"]').val('New name');
this.$('input[name="slug"]').val('new-slug');
this.$('textarea[name="description"]').val('New description');
this.$('input[name="meta_title"]').val('New meta_title');
this.$('textarea[name="meta_description"]').val('New meta_description');
this.$('input[name="metaTitle"]').val('New metaTitle');
this.$('textarea[name="metaDescription"]').val('New metaDescription');
});
expect(this.get('tag.name'), 'tag name').to.equal('Test');
expect(this.get('tag.slug'), 'tag slug').to.equal('test');
expect(this.get('tag.description'), 'tag description').to.equal('Description.');
expect(this.get('tag.meta_title'), 'tag meta_title').to.equal('Meta Title');
expect(this.get('tag.meta_description'), 'tag meta_description').to.equal('Meta description');
expect(this.get('tag.metaTitle'), 'tag metaTitle').to.equal('Meta Title');
expect(this.get('tag.metaDescription'), 'tag metaDescription').to.equal('Meta description');
});
it('triggers setProperty action on blur of all fields', function () {
@ -154,16 +154,16 @@ describeComponent(
this.$('textarea[name="description"]').val('New description');
});
expectedProperty = 'meta_title';
expectedValue = 'New meta_title';
expectedProperty = 'metaTitle';
expectedValue = 'New metaTitle';
run(() => {
this.$('input[name="meta_title"]').val('New meta_title');
this.$('input[name="metaTitle"]').val('New metaTitle');
});
expectedProperty = 'meta_description';
expectedValue = 'New meta_description';
expectedProperty = 'metaDescription';
expectedValue = 'New metaDescription';
run(() => {
this.$('textarea[name="meta_description"]').val('New meta_description');
this.$('textarea[name="metaDescription"]').val('New metaDescription');
});
});
@ -180,11 +180,11 @@ describeComponent(
errors.add('description', 'is too long');
hasValidated.push('description');
errors.add('meta_title', 'is too long');
hasValidated.push('meta_title');
errors.add('metaTitle', 'is too long');
hasValidated.push('metaTitle');
errors.add('meta_description', 'is too long');
hasValidated.push('meta_description');
errors.add('metaDescription', 'is too long');
hasValidated.push('metaDescription');
this.render(hbs`
{{gh-tag-settings-form tag=tag setProperty=(action 'setProperty')}}
@ -201,13 +201,13 @@ describeComponent(
let descriptionFormGroup = this.$('textarea[name="description"]').closest('.form-group');
expect(descriptionFormGroup.hasClass('error'), 'description form group has error state').to.be.true;
let metaTitleFormGroup = this.$('input[name="meta_title"]').closest('.form-group');
expect(metaTitleFormGroup.hasClass('error'), 'meta_title form group has error state').to.be.true;
expect(metaTitleFormGroup.find('.response').length, 'meta_title form group has error message').to.equal(1);
let metaTitleFormGroup = this.$('input[name="metaTitle"]').closest('.form-group');
expect(metaTitleFormGroup.hasClass('error'), 'metaTitle form group has error state').to.be.true;
expect(metaTitleFormGroup.find('.response').length, 'metaTitle form group has error message').to.equal(1);
let metaDescriptionFormGroup = this.$('textarea[name="meta_description"]').closest('.form-group');
expect(metaDescriptionFormGroup.hasClass('error'), 'meta_description form group has error state').to.be.true;
expect(metaDescriptionFormGroup.find('.response').length, 'meta_description form group has error message').to.equal(1);
let metaDescriptionFormGroup = this.$('textarea[name="metaDescription"]').closest('.form-group');
expect(metaDescriptionFormGroup.hasClass('error'), 'metaDescription form group has error state').to.be.true;
expect(metaDescriptionFormGroup.find('.response').length, 'metaDescription form group has error message').to.equal(1);
});
it('displays char count for text fields', function () {
@ -218,7 +218,7 @@ describeComponent(
let descriptionFormGroup = this.$('textarea[name="description"]').closest('.form-group');
expect(descriptionFormGroup.find('.word-count').text(), 'description char count').to.equal('12');
let metaDescriptionFormGroup = this.$('textarea[name="meta_description"]').closest('.form-group');
let metaDescriptionFormGroup = this.$('textarea[name="metaDescription"]').closest('.form-group');
expect(metaDescriptionFormGroup.find('.word-count').text(), 'description char count').to.equal('16');
});
@ -229,9 +229,9 @@ describeComponent(
expect(this.$('.seo-preview-title').text(), 'displays meta title if present').to.equal('Meta Title');
run(() => {
this.set('tag.meta_title', '');
this.set('tag.metaTitle', '');
});
expect(this.$('.seo-preview-title').text(), 'falls back to tag name without meta_title').to.equal('Test');
expect(this.$('.seo-preview-title').text(), 'falls back to tag name without metaTitle').to.equal('Test');
run(() => {
this.set('tag.name', (new Array(151).join('x')));
@ -260,9 +260,9 @@ describeComponent(
expect(this.$('.seo-preview-description').text(), 'displays meta description if present').to.equal('Meta description');
run(() => {
this.set('tag.meta_description', '');
this.set('tag.metaDescription', '');
});
expect(this.$('.seo-preview-description').text(), 'falls back to tag description without meta_description').to.equal('Description.');
expect(this.$('.seo-preview-description').text(), 'falls back to tag description without metaDescription').to.equal('Description.');
run(() => {
this.set('tag.description', (new Array(200).join('x')));

View File

@ -50,18 +50,18 @@ describeModule(
});
});
it('metaTitleScratch is one-way bound to model.meta_title', function () {
it('metaTitleScratch is one-way bound to model.metaTitle', function () {
let controller = this.subject({
model: Ember.Object.create({
meta_title: 'a title'
metaTitle: 'a title'
})
});
expect(controller.get('model.meta_title')).to.equal('a title');
expect(controller.get('model.metaTitle')).to.equal('a title');
expect(controller.get('metaTitleScratch')).to.equal('a title');
run(function () {
controller.set('model.meta_title', 'a different title');
controller.set('model.metaTitle', 'a different title');
expect(controller.get('metaTitleScratch')).to.equal('a different title');
});
@ -69,30 +69,30 @@ describeModule(
run(function () {
controller.set('metaTitleScratch', 'changed directly');
expect(controller.get('model.meta_title')).to.equal('a different title');
expect(controller.get('model.metaTitle')).to.equal('a different title');
expect(controller.get('metaTitleScratch')).to.equal('changed directly');
});
run(function () {
// test that the one-way binding is still in place
controller.set('model.meta_title', 'should update');
controller.set('model.metaTitle', 'should update');
expect(controller.get('metaTitleScratch')).to.equal('should update');
});
});
it('metaDescriptionScratch is one-way bound to model.meta_description', function () {
it('metaDescriptionScratch is one-way bound to model.metaDescription', function () {
let controller = this.subject({
model: Ember.Object.create({
meta_description: 'a description'
metaDescription: 'a description'
})
});
expect(controller.get('model.meta_description')).to.equal('a description');
expect(controller.get('model.metaDescription')).to.equal('a description');
expect(controller.get('metaDescriptionScratch')).to.equal('a description');
run(function () {
controller.set('model.meta_description', 'a different description');
controller.set('model.metaDescription', 'a different description');
expect(controller.get('metaDescriptionScratch')).to.equal('a different description');
});
@ -100,23 +100,23 @@ describeModule(
run(function () {
controller.set('metaDescriptionScratch', 'changed directly');
expect(controller.get('model.meta_description')).to.equal('a different description');
expect(controller.get('model.metaDescription')).to.equal('a different description');
expect(controller.get('metaDescriptionScratch')).to.equal('changed directly');
});
run(function () {
// test that the one-way binding is still in place
controller.set('model.meta_description', 'should update');
controller.set('model.metaDescription', 'should update');
expect(controller.get('metaDescriptionScratch')).to.equal('should update');
});
});
describe('seoTitle', function () {
it('should be the meta_title if one exists', function () {
it('should be the metaTitle if one exists', function () {
let controller = this.subject({
model: Ember.Object.create({
meta_title: 'a meta-title',
metaTitle: 'a meta-title',
titleScratch: 'should not be used'
})
});
@ -134,10 +134,10 @@ describeModule(
expect(controller.get('seoTitle')).to.equal('should be the meta-title');
});
it('should be the meta_title if both title and meta_title exist', function () {
it('should be the metaTitle if both title and metaTitle exist', function () {
let controller = this.subject({
model: Ember.Object.create({
meta_title: 'a meta-title',
metaTitle: 'a meta-title',
titleScratch: 'a title'
})
});
@ -145,10 +145,10 @@ describeModule(
expect(controller.get('seoTitle')).to.equal('a meta-title');
});
it('should revert to the title if explicit meta_title is removed', function () {
it('should revert to the title if explicit metaTitle is removed', function () {
let controller = this.subject({
model: Ember.Object.create({
meta_title: 'a meta-title',
metaTitle: 'a meta-title',
titleScratch: 'a title'
})
});
@ -156,7 +156,7 @@ describeModule(
expect(controller.get('seoTitle')).to.equal('a meta-title');
run(function () {
controller.set('model.meta_title', '');
controller.set('model.metaTitle', '');
expect(controller.get('seoTitle')).to.equal('a title');
});
@ -182,10 +182,10 @@ describeModule(
});
describe('seoDescription', function () {
it('should be the meta_description if one exists', function () {
it('should be the metaDescription if one exists', function () {
let controller = this.subject({
model: Ember.Object.create({
meta_description: 'a description'
metaDescription: 'a description'
})
});

View File

@ -37,7 +37,7 @@ describeModel(
it('isAuthoredByUser is correct', function () {
/* jscs:disable requireCamelCaseOrUpperCaseIdentifiers */
let model = this.subject({
author_id: 15
authorId: 15
});
/* jscs:enable requireCamelCaseOrUpperCaseIdentifiers */
let user = Ember.Object.create({id: '15'});
@ -45,7 +45,7 @@ describeModel(
expect(model.isAuthoredByUser(user)).to.be.ok;
Ember.run(function () {
model.set('author_id', 1);
model.set('authorId', 1);
expect(model.isAuthoredByUser(user)).to.not.be.ok;
});

View File

@ -17,8 +17,8 @@ const Tag = Ember.Object.extend(ValidationEngine, {
name: null,
description: null,
meta_title: null,
meta_description: null
metaTitle: null,
metaDescription: null
});
// TODO: These tests have way too much duplication, consider creating test
@ -224,14 +224,14 @@ describe('Unit: Validator: tag-settings', function () {
expect(tag.get('hasValidated'), 'hasValidated').to.include('description');
});
// TODO: we have both meta_title and metaTitle property names on the
// TODO: we have both metaTitle and metaTitle property names on the
// model/validator respectively - this should be standardised
it('passes with a valid meta_title', function () {
// longest valid meta_title
const tag = Tag.create({meta_title: (new Array(151).join('x'))});
it('passes with a valid metaTitle', function () {
// longest valid metaTitle
const tag = Tag.create({metaTitle: (new Array(151).join('x'))});
let passed = false;
expect(tag.get('meta_title').length, 'meta_title length').to.equal(150);
expect(tag.get('metaTitle').length, 'metaTitle length').to.equal(150);
run(() => {
tag.validate({property: 'metaTitle'}).then(() => {
@ -243,13 +243,13 @@ describe('Unit: Validator: tag-settings', function () {
expect(tag.get('hasValidated'), 'hasValidated').to.include('metaTitle');
});
it('validates meta_title length', function () {
// shortest invalid meta_title
const tag = Tag.create({meta_title: (new Array(152).join('x'))});
it('validates metaTitle length', function () {
// shortest invalid metaTitle
const tag = Tag.create({metaTitle: (new Array(152).join('x'))});
let passed = false;
let errors;
expect(tag.get('meta_title').length, 'meta_title length').to.equal(151);
expect(tag.get('metaTitle').length, 'metaTitle length').to.equal(151);
run(() => {
tag.validate({property: 'metaTitle'}).then(() => {
@ -257,22 +257,22 @@ describe('Unit: Validator: tag-settings', function () {
});
});
errors = tag.get('errors').errorsFor('meta_title')[0];
expect(errors.attribute, 'errors.meta_title.attribute').to.equal('meta_title');
expect(errors.message, 'errors.meta_title.message').to.equal('Meta Title cannot be longer than 150 characters.');
errors = tag.get('errors').errorsFor('metaTitle')[0];
expect(errors.attribute, 'errors.metaTitle.attribute').to.equal('metaTitle');
expect(errors.message, 'errors.metaTitle.message').to.equal('Meta Title cannot be longer than 150 characters.');
expect(passed, 'passed').to.be.false;
expect(tag.get('hasValidated'), 'hasValidated').to.include('metaTitle');
});
// TODO: we have both meta_description and metaDescription property names on
// TODO: we have both metaDescription and metaDescription property names on
// the model/validator respectively - this should be standardised
it('passes with a valid meta_description', function () {
it('passes with a valid metaDescription', function () {
// longest valid description
const tag = Tag.create({meta_description: (new Array(201).join('x'))});
const tag = Tag.create({metaDescription: (new Array(201).join('x'))});
let passed = false;
expect(tag.get('meta_description').length, 'meta_description length').to.equal(200);
expect(tag.get('metaDescription').length, 'metaDescription length').to.equal(200);
run(() => {
tag.validate({property: 'metaDescription'}).then(() => {
@ -284,13 +284,13 @@ describe('Unit: Validator: tag-settings', function () {
expect(tag.get('hasValidated'), 'hasValidated').to.include('metaDescription');
});
it('validates meta_description length', function () {
// shortest invalid meta_description
const tag = Tag.create({meta_description: (new Array(202).join('x'))});
it('validates metaDescription length', function () {
// shortest invalid metaDescription
const tag = Tag.create({metaDescription: (new Array(202).join('x'))});
let passed = false;
let errors;
expect(tag.get('meta_description').length, 'meta_description length').to.equal(201);
expect(tag.get('metaDescription').length, 'metaDescription length').to.equal(201);
run(() => {
tag.validate({property: 'metaDescription'}).then(() => {
@ -298,9 +298,9 @@ describe('Unit: Validator: tag-settings', function () {
});
});
errors = tag.get('errors').errorsFor('meta_description')[0];
expect(errors.attribute, 'errors.meta_description.attribute').to.equal('meta_description');
expect(errors.message, 'errors.meta_description.message').to.equal('Meta Description cannot be longer than 200 characters.');
errors = tag.get('errors').errorsFor('metaDescription')[0];
expect(errors.attribute, 'errors.metaDescription.attribute').to.equal('metaDescription');
expect(errors.message, 'errors.metaDescription.message').to.equal('Meta Description cannot be longer than 200 characters.');
expect(passed, 'passed').to.be.false;
expect(tag.get('hasValidated'), 'hasValidated').to.include('metaDescription');