diff --git a/app/assets/javascripts/discourse/adapters/rest.js.es6 b/app/assets/javascripts/discourse/adapters/rest.js.es6 index 1afa6eb7f07..fb5f829f538 100644 --- a/app/assets/javascripts/discourse/adapters/rest.js.es6 +++ b/app/assets/javascripts/discourse/adapters/rest.js.es6 @@ -47,7 +47,7 @@ export default Ember.Object.extend({ find(type, id) { var self = this; return Discourse.ajax(this.pathFor(type, id)).then(function(result) { - return self._hydrate(type, result[self.serverName(type)]); + return self._hydrate(type, result[Ember.String.underscore(type)]); }); }, @@ -67,7 +67,8 @@ export default Ember.Object.extend({ destroyRecord(type, id) { return Discourse.ajax(this.pathFor(type, id), { method: 'DELETE' }).then(function(result) { - delete _identityMap[type][id]; + const forType = _identityMap[type]; + if (forType) { delete forType[id]; } return result; }); }, diff --git a/test/javascripts/helpers/create-pretender.js.es6 b/test/javascripts/helpers/create-pretender.js.es6 index 7cc2ff88645..5751ceaa5f5 100644 --- a/test/javascripts/helpers/create-pretender.js.es6 +++ b/test/javascripts/helpers/create-pretender.js.es6 @@ -19,6 +19,11 @@ function success() { return response({ success: true }); } +const _widgets = [ + {id: 123, name: 'Trout Lure'}, + {id: 124, name: 'Evil Repellant'} +]; + export default function() { var server = new Pretender(function() { @@ -84,6 +89,21 @@ export default function() { this.delete('/posts/:post_id', success); this.put('/posts/:post_id/recover', success); + + this.get('/widgets/:widget_id', function(request) { + const w = _widgets.findBy('id', parseInt(request.params.widget_id)); + if (w) { + return response({widget: w}); + } else { + return response(404); + } + }); + + this.get('/widgets', function() { + return response({ widgets: _widgets }); + }); + + this.delete('/widgets/:widget_id', success); }); diff --git a/test/javascripts/helpers/create-store.js.es6 b/test/javascripts/helpers/create-store.js.es6 new file mode 100644 index 00000000000..244fab70c7c --- /dev/null +++ b/test/javascripts/helpers/create-store.js.es6 @@ -0,0 +1,19 @@ +import Store from "discourse/models/store"; +import RestAdapter from 'discourse/adapters/rest'; + +let _restAdapter; +export default function() { + return Store.create({ + container: { + lookup(type) { + if (type === "adapter:rest") { + _restAdapter = _restAdapter || RestAdapter.create({ container: this }); + return (_restAdapter); + } + }, + + lookupFactory: function() { } + } + }); +} + diff --git a/test/javascripts/models/store-test.js.es6 b/test/javascripts/models/store-test.js.es6 new file mode 100644 index 00000000000..f460b4ba0eb --- /dev/null +++ b/test/javascripts/models/store-test.js.es6 @@ -0,0 +1,40 @@ +module('store:main'); + +import createStore from 'helpers/create-store'; + +test('createRecord', function() { + const store = createStore(); + const widget = store.createRecord('widget', {id: 111, name: 'hello'}); + equal(widget.get('name'), 'hello'); + equal(widget.get('id'), 111); +}); + +test('find', function() { + const store = createStore(); + store.find('widget', 123).then(function(w) { + equal(w.get('name'), 'Trout Lure'); + equal(w.get('id'), 123); + + // A second find by id returns the same object + store.find('widget', 123).then(function(w2) { + equal(w, w2); + }); + + }); +}); + +test('findAll', function() { + const store = createStore(); + store.findAll('widget').then(function(result) { + equal(result.length, 2); + const w = result.findBy('id', 124); + equal(w.get('name'), 'Evil Repellant'); + }); +}); + +test('destroyRecord', function() { + const store = createStore(); + store.destroyRecord('widget', 124).then(function(result) { + ok(result); + }); +});