Skip to content

Commit

Permalink
began work on localStorage adapter
Browse files Browse the repository at this point in the history
  • Loading branch information
thomasboyt committed Feb 19, 2012
1 parent ad0a505 commit 249f60a
Show file tree
Hide file tree
Showing 2 changed files with 133 additions and 0 deletions.
50 changes: 50 additions & 0 deletions packages/ember-data/lib/adapters/localStorage_adapter.js
@@ -0,0 +1,50 @@
var get = Ember.get, set = Ember.set, getPath = Ember.getPath;

DS.localStorageAdapter = DS.Adapter.extend({
createRecord: function(store, type, model) {
var records = this.local.get(type);
var id = records.length + 1;
model.set('id', id)

var data = get(model, 'data');
records[id] = data;

this.local.set(type, records);
store.didCreateRecord(model, data);
},
updateRecord: function(store, type, model) {
var id = get(model, 'id');
var data = get(model, 'data');

var records = this.local.get(type);
records[id] = data;

this.local.set(type, records);
store.didUpdateRecord(model, data);
},

find: function(store, type, id) {
var records = this.local.get(type);
store.load(type, records[id]);
},

findAll: function(store, type) {
var records = this.local.get(type);

if (records) {
store.loadMany(type, records)
}
},


local: {
set: function(key, value) {
localStorage.setItem(key, JSON.stringify(value));
},
get: function(key) {
var value = localStorage.getItem(key);
value = JSON.parse(value) || [];
return value;
}
}
});
83 changes: 83 additions & 0 deletions packages/ember-data/tests/unit/localStorage_adapter_test.js
@@ -0,0 +1,83 @@
require('ember-data/adapters/localStorage_adapter');

var get = SC.get, set = SC.set;

var adapter, store;
var Person, person, people;
var Role, role, roles;

localStorage.clear();

module("the localStorage adapter", {
setup: function() {
adapter = DS.localStorageAdapter.create();

store = DS.Store.create({
adapter: adapter
});

Person = DS.Model.extend({
name: DS.attr('string')
})
Person.toString = function() {
return "App.Person";
}

Role = DS.Model.extend({
name: DS.attr('string'),
primaryKey: '_id'
})
Role.toString = function() {
return "App.Role";
}
},
teardown: function() {
adapter.destroy();
store.destroy();

if (person) { person.destroy(); }
}
});

var expectState = function(state, value, p) {
p = p || person;

if (value === undefined) { value = true; }

var flag = "is" + state.charAt(0).toUpperCase() + state.substr(1);

equal(get(p, flag), value, "the person is " + (value === false ? "not " : "") + state);
};

test("creating a person makes a save to localStorage, with the data", function() {
set(adapter, 'bulkCommit', false);

person = store.createRecord(Person, {name: "Tom Dale"});

expectState('new');
store.commit();

expectState('saving', false);
equal(person, store.find(Person, 1), 'it is now possible to retrieve the person by the ID supplied')

});

test("updating a person makes a save to the same key with the new data", function() {
set(adapter, 'bulkCommit', false);

store.load(Person, { id: 1, name: "Yehuda Katz" });

person = store.find(Person, 1);

expectState('new', false);
expectState('loaded');
expectState('dirty', false);

set(person, 'name', "Brohuda Brokatz");

expectState('dirty');
store.commit();
expectState('saving', false);

equal(person, store.find(Person, 1), "the same person is retrieved by the same ID");
});

0 comments on commit 249f60a

Please sign in to comment.