diff --git a/dist/amd/factory-guy.js b/dist/amd/factory-guy.js index 85ed876b..d167ddc9 100644 --- a/dist/amd/factory-guy.js +++ b/dist/amd/factory-guy.js @@ -441,12 +441,45 @@ var FactoryGuy = { @returns {Object} json fixture data */ pushFixture: function (modelClass, fixture) { + var index; if (!modelClass.FIXTURES) { modelClass.FIXTURES = []; } - modelClass.FIXTURES.push(fixture); + + index = this.indexOfFixture(modelClass.FIXTURES, fixture); + + if (index > -1) { + modelClass.FIXTURES[index] = fixture; + } else { + modelClass.FIXTURES.push(fixture); + } + return fixture; }, + + /** + Used in compliment with pushFixture in order to + ensure we don't push duplicate fixtures + + @private + @param {Array} fixtures + @param {String|Integer} id of fixture to find + @returns {Object} fixture + */ + indexOfFixture: function(fixtures, fixture) { + var index = -1, + id = fixture.id + ''; + Ember.A(fixtures).find(function(r, i) { + if ('' + Ember.get(r, 'id') === id) { + index = i; + return true; + } else { + return false; + } + }); + return index; + }, + /** Clears all model definitions */ diff --git a/dist/ember-data-factory-guy.js b/dist/ember-data-factory-guy.js index a2559111..f06d3287 100644 --- a/dist/ember-data-factory-guy.js +++ b/dist/ember-data-factory-guy.js @@ -436,12 +436,45 @@ var FactoryGuy = { @returns {Object} json fixture data */ pushFixture: function (modelClass, fixture) { + var index; if (!modelClass.FIXTURES) { modelClass.FIXTURES = []; } - modelClass.FIXTURES.push(fixture); + + index = this.indexOfFixture(modelClass.FIXTURES, fixture); + + if (index > -1) { + modelClass.FIXTURES[index] = fixture; + } else { + modelClass.FIXTURES.push(fixture); + } + return fixture; }, + + /** + Used in compliment with pushFixture in order to + ensure we don't push duplicate fixtures + + @private + @param {Array} fixtures + @param {String|Integer} id of fixture to find + @returns {Object} fixture + */ + indexOfFixture: function(fixtures, fixture) { + var index = -1, + id = fixture.id + ''; + Ember.A(fixtures).find(function(r, i) { + if ('' + Ember.get(r, 'id') === id) { + index = i; + return true; + } else { + return false; + } + }); + return index; + }, + /** Clears all model definitions */ diff --git a/dist/ember-data-factory-guy.min.js b/dist/ember-data-factory-guy.min.js index 99dd51b9..0f149f7b 100644 --- a/dist/ember-data-factory-guy.min.js +++ b/dist/ember-data-factory-guy.min.js @@ -1 +1 @@ -var Sequence=function(fn){var index=1;this.next=function(){return fn.call(this,index++)};this.reset=function(){index=1}};var MissingSequenceError=function(message){this.toString=function(){return message}};if(FactoryGuy!==undefined){FactoryGuy.sequence=Sequence;FactoryGuy.missingSequenceError=MissingSequenceError}var ModelDefinition=function(model,config){var sequences={};var traits={};var defaultAttributes={};var namedModels={};var modelId=1;var sequenceName=null;this.model=model;this.matchesName=function(name){return model==name||namedModels[name]};this.nextId=function(){return modelId++};this.generate=function(name,sequenceFn){if(sequenceFn){if(!sequences[name]){sequences[name]=new Sequence(sequenceFn)}}var sequence=sequences[name];if(!sequence){throw new MissingSequenceError("Can not find that sequence named ["+sequenceName+"] in '"+model+"' definition")}return sequence.next()};this.build=function(name,opts,traitArgs){var traitsObj={};traitArgs.forEach(function(trait){$.extend(traitsObj,traits[trait])});var modelAttributes=namedModels[name]||{};var fixture=$.extend({},defaultAttributes,modelAttributes,traitsObj,opts);for(var attribute in fixture){if(Ember.typeOf(fixture[attribute])=="function"){fixture[attribute]=fixture[attribute].call(this,fixture)}else if(Ember.typeOf(fixture[attribute])=="object"){fixture[attribute]=FactoryGuy.build(attribute,fixture[attribute])}}if(!fixture.id){fixture.id=this.nextId()}return fixture};this.buildList=function(name,number,traits,opts){var arr=[];for(var i=0;i-1){modelClass.FIXTURES[index]=fixture}else{modelClass.FIXTURES.push(fixture)}return fixture},indexOfFixture:function(fixtures,fixture){var index=-1,id=fixture.id+"";Ember.A(fixtures).find(function(r,i){if(""+Ember.get(r,"id")===id){index=i;return true}else{return false}});return index},clear:function(opts){if(!opts){this.modelDefinitions={}}}};(function(){DS.Store.reopen({usingFixtureAdapter:function(){var adapter=this.adapterFor("application");return adapter instanceof DS.FixtureAdapter},makeFixture:function(){var store=this;var fixture=FactoryGuy.build.apply(FactoryGuy,arguments);var name=arguments[0];var modelName=FactoryGuy.lookupModelForFixtureName(name);var modelType=store.modelFor(modelName);if(this.usingFixtureAdapter()){this.setAssociationsForFixtureAdapter(modelType,modelName,fixture);return FactoryGuy.pushFixture(modelType,fixture)}else{return store.makeModel(modelType,fixture)}},makeModel:function(modelType,fixture){var store=this,modelName=store.modelFor(modelType).typeKey,model;Em.run(function(){store.findEmbeddedAssociationsForRESTAdapter(modelType,fixture);if(fixture.type){modelName=fixture.type.underscore();modelType=store.modelFor(modelName)}model=store.push(modelName,fixture);store.setAssociationsForRESTAdapter(modelType,modelName,model)});return model},makeList:function(){var arr=[];var number=arguments[1];for(var i=0;i -1) { + modelClass.FIXTURES[index] = fixture; + } else { + modelClass.FIXTURES.push(fixture); + } + return fixture; }, + + /** + Used in compliment with pushFixture in order to + ensure we don't push duplicate fixtures + + @private + @param {Array} fixtures + @param {String|Integer} id of fixture to find + @returns {Object} fixture + */ + indexOfFixture: function(fixtures, fixture) { + var index = -1, + id = fixture.id + ''; + Ember.A(fixtures).find(function(r, i) { + if ('' + Ember.get(r, 'id') === id) { + index = i; + return true; + } else { + return false; + } + }); + return index; + }, + /** Clears all model definitions */ @@ -282,4 +315,4 @@ var FactoryGuy = { this.modelDefinitions = {}; } } -}; \ No newline at end of file +}; diff --git a/tests/factory_guy_test.js b/tests/factory_guy_test.js index 5f41a627..6fb904af 100644 --- a/tests/factory_guy_test.js +++ b/tests/factory_guy_test.js @@ -203,3 +203,26 @@ test("#lookupModelForFixtureName", function() { equal(FactoryGuy.lookupModelForFixtureName('fake'), undefined, "return nothing if can't find definition"); }); +asyncTest("#pushFixture", function() { + var User = store.modelFor('user'), + user = store.makeFixture('user'), + duplicateUser = FactoryGuy.build('user', { id: user.id, name: 'monkey' }), + differentUser = FactoryGuy.build('user'), + usersById = {}; + + usersById[duplicateUser.id] = duplicateUser; + usersById[differentUser.id] = differentUser; + + FactoryGuy.pushFixture(User, duplicateUser); + FactoryGuy.pushFixture(User, differentUser); + + store.find('user').then(function(users) { + ok(users.get('length') === 2); + + users.forEach(function(user) { + equal(user.get('name'), usersById[user.get('id')].name, "Updates model fixture if duplicate id found"); + }); + + start(); + }); +}); diff --git a/vendor/assets/javascripts/ember_data_factory_guy.js b/vendor/assets/javascripts/ember_data_factory_guy.js index 74c80c85..7f20a65f 100644 --- a/vendor/assets/javascripts/ember_data_factory_guy.js +++ b/vendor/assets/javascripts/ember_data_factory_guy.js @@ -436,12 +436,45 @@ var FactoryGuy = { @returns {Object} json fixture data */ pushFixture: function (modelClass, fixture) { + var index; if (!modelClass.FIXTURES) { modelClass.FIXTURES = []; } - modelClass.FIXTURES.push(fixture); + + index = this.indexOfFixture(modelClass.FIXTURES, fixture); + + if (index > -1) { + modelClass.FIXTURES[index] = fixture; + } else { + modelClass.FIXTURES.push(fixture); + } + return fixture; }, + + /** + Used in compliment with pushFixture in order to + ensure we don't push duplicate fixtures + + @private + @param {Array} fixtures + @param {String|Integer} id of fixture to find + @returns {Object} fixture + */ + indexOfFixture: function(fixtures, fixture) { + var index = -1, + id = fixture.id + ''; + Ember.A(fixtures).find(function(r, i) { + if ('' + Ember.get(r, 'id') === id) { + index = i; + return true; + } else { + return false; + } + }); + return index; + }, + /** Clears all model definitions */ @@ -1023,9 +1056,6 @@ if (FactoryGuy !== undefined) { } // Inspect the data submitted in the request (either POST body or GET query string) if ( handler.data ) { -// console.log('request.data', requestSettings.data ) -// console.log('handler.data', handler.data ) -// console.log('data equal', isMockDataEqual(handler.data, requestSettings.data) ) if ( ! requestSettings.data || !isMockDataEqual(handler.data, requestSettings.data) ) { // They're not identical, do not mock this request return null;