Skip to content

Instantly share code, notes, and snippets.

@amk221
Last active November 17, 2015 14:09
Show Gist options
  • Save amk221/d6e3626ea3a5201d8d14 to your computer and use it in GitHub Desktop.
Save amk221/d6e3626ea3a5201d8d14 to your computer and use it in GitHub Desktop.
Ember Data test for numeric serialized IDs
// jscs:disable maximumLineLength
import { test, moduleFor } from 'ember-qunit';
import Model from 'ember-data/model';
import run from 'ember-runloop';
import DS from 'ember-data';
import ApplicationSerializer from 'capsule/pods/application/serializer';
import { hasMany, belongsTo } from 'ember-data/relationships';
const { EmbeddedRecordsMixin } = DS;
moduleFor('serializer:application');
test('#serialize numeric IDs', function(assert) {
assert.expect(1);
this.registry.register('serializer:primary-model',
ApplicationSerializer.extend(EmbeddedRecordsMixin, {
attrs: {
embeddedHasManys: {
embedded: 'always'
},
embeddedBelongsTo: {
embedded: 'always'
}
}
}));
this.registry.register('model:primary-model', Model.extend({
embeddedHasManys: hasMany('embeddedHasMany'),
embeddedBelongsTo: belongsTo('embeddedBelongsTo'),
sideloadedHasManys: hasMany('sideloadedHasMany'),
sideloadedBelongsTo: belongsTo('sideloadedBelongsTo')
}));
this.registry.register('model:embedded-has-many', Model);
this.registry.register('model:embedded-belongs-to', Model);
this.registry.register('model:sideloaded-has-many', Model);
this.registry.register('model:sideloaded-belongs-to', Model);
let store = this.container.lookup('service:store');
let primaryModel;
let embeddedHasMany;
let embeddedBelongsTo;
let sideloadedHasMany;
let sideloadedBelongsTo;
run(function() {
primaryModel = store.createRecord('primary-model', {id: '1'});
embeddedHasMany = store.createRecord('embedded-has-many', {id: '2'});
embeddedBelongsTo = store.createRecord('embedded-belongs-to', {id: '3'});
sideloadedHasMany = store.createRecord('sideloaded-belongs-to', {id: '4'});
sideloadedBelongsTo = store.createRecord('sideloaded-belongs-to', {id: '5'});
primaryModel.get('embeddedHasManys').pushObject(embeddedHasMany);
primaryModel.set('embeddedBelongsTo', embeddedBelongsTo);
primaryModel.get('sideloadedHasManys').pushObject(sideloadedHasMany);
primaryModel.set('sideloadedBelongsTo', sideloadedBelongsTo);
});
let json = primaryModel.serialize({ includeId: true });
assert.deepEqual(json, {
id: 1,
embeddedHasManys: [{ id: 2 }],
embeddedBelongsTo: { id: 3 },
sideloadedHasManys: [4],
sideloadedBelongsTo: 5
});
});
import RESTSerializer from 'ember-data/serializers/rest';
const { isArray } = Array;
/**
* Extend's Ember Data's REST Serializer to make all IDs Numbers.
* @issue https://github.com/emberjs/data/issues/3078
*/
export default RESTSerializer.extend({
_serializeId(id) {
return parseInt(id, 10);
},
serialize(snapshot, options) {
let json = this._super(snapshot, options);
if (json.id && options.includeId) {
json.id = this._serializeId(json.id);
}
return json;
},
serializeHasMany: function(snapshot, json, relationship) {
this._super(snapshot, json, relationship);
let ids = json[relationship.key];
if (isArray(ids)) {
ids.map((id, index) => ids[index] = this._serializeId(id));
}
},
serializeBelongsTo: function(snapshot, json, relationship) {
this._super(snapshot, json, relationship);
let key = relationship.key;
json[key] = this._serializeId(json[key]);
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment