modularity-rails 0.15.0 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. data/{LICENSE → MIT-LICENSE} +0 -0
  2. data/README.md +16 -15
  3. data/Rakefile +3 -14
  4. data/{vendor → app}/assets/javascripts/modularity/data/ajax_loader.coffee +0 -0
  5. data/{vendor → app}/assets/javascripts/modularity/data/cache.coffee +5 -0
  6. data/{vendor → app}/assets/javascripts/modularity/data/indexed_cache.coffee +8 -2
  7. data/{vendor → app}/assets/javascripts/modularity/data/persistence_manager.coffee +11 -0
  8. data/{vendor → app}/assets/javascripts/modularity/mixins/clickable.coffee +2 -2
  9. data/{vendor → app}/assets/javascripts/modularity/mixins/closable.coffee +0 -0
  10. data/{vendor/assets/javascripts/modularity.js.coffee → app/assets/javascripts/modularity/modularity.coffee} +3 -0
  11. data/{vendor → app}/assets/javascripts/modularity/modules/autogrow_textarea.coffee +2 -1
  12. data/{vendor → app}/assets/javascripts/modularity/modules/button.coffee +0 -0
  13. data/{vendor → app}/assets/javascripts/modularity/tools/array_tools.coffee +1 -0
  14. data/{vendor → app}/assets/javascripts/modularity/tools/object_tools.coffee +0 -0
  15. data/config/initializers/konacha.rb +6 -0
  16. data/lib/modularity-rails.rb +0 -1
  17. data/lib/modularity-rails/engine.rb +1 -0
  18. data/lib/modularity-rails/version.rb +1 -1
  19. metadata +80 -100
  20. data/.evergreen +0 -6
  21. data/.gitignore +0 -20
  22. data/.travis.yml +0 -8
  23. data/Gemfile +0 -4
  24. data/Guardfile +0 -8
  25. data/demo/.gitignore +0 -15
  26. data/demo/Gemfile +0 -23
  27. data/demo/README.rdoc +0 -261
  28. data/demo/Rakefile +0 -7
  29. data/demo/app/assets/images/rails.png +0 -0
  30. data/demo/app/assets/javascripts/application.coffee +0 -2
  31. data/demo/app/assets/stylesheets/application.css +0 -13
  32. data/demo/app/controllers/application_controller.rb +0 -3
  33. data/demo/app/helpers/application_helper.rb +0 -2
  34. data/demo/app/mailers/.gitkeep +0 -0
  35. data/demo/app/models/.gitkeep +0 -0
  36. data/demo/app/views/layouts/application.html.erb +0 -14
  37. data/demo/config.ru +0 -4
  38. data/demo/config/application.rb +0 -59
  39. data/demo/config/boot.rb +0 -6
  40. data/demo/config/database.yml +0 -25
  41. data/demo/config/environment.rb +0 -5
  42. data/demo/config/environments/development.rb +0 -37
  43. data/demo/config/environments/production.rb +0 -67
  44. data/demo/config/environments/test.rb +0 -37
  45. data/demo/config/initializers/backtrace_silencers.rb +0 -7
  46. data/demo/config/initializers/inflections.rb +0 -15
  47. data/demo/config/initializers/konacha.rb +0 -5
  48. data/demo/config/initializers/mime_types.rb +0 -5
  49. data/demo/config/initializers/secret_token.rb +0 -7
  50. data/demo/config/initializers/session_store.rb +0 -8
  51. data/demo/config/initializers/wrap_parameters.rb +0 -14
  52. data/demo/config/locales/en.yml +0 -5
  53. data/demo/config/routes.rb +0 -58
  54. data/demo/db/seeds.rb +0 -7
  55. data/demo/lib/assets/.gitkeep +0 -0
  56. data/demo/lib/tasks/.gitkeep +0 -0
  57. data/demo/log/.gitkeep +0 -0
  58. data/demo/public/404.html +0 -26
  59. data/demo/public/422.html +0 -26
  60. data/demo/public/500.html +0 -25
  61. data/demo/public/favicon.ico +0 -0
  62. data/demo/public/index.html +0 -241
  63. data/demo/public/robots.txt +0 -5
  64. data/demo/script/rails +0 -6
  65. data/demo/spec/javascripts/data/ajax_loader_spec.coffee +0 -132
  66. data/demo/spec/javascripts/data/cache_spec.coffee +0 -103
  67. data/demo/spec/javascripts/data/indexed_cache_spec.coffee +0 -51
  68. data/demo/spec/javascripts/data/persistence_manager_spec.coffee +0 -283
  69. data/demo/spec/javascripts/konacha_config.coffee +0 -2
  70. data/demo/spec/javascripts/mixins/closable_spec.coffee +0 -98
  71. data/demo/spec/javascripts/modularity_spec.coffee +0 -329
  72. data/demo/spec/javascripts/modules/autogrow_textarea_spec.coffee +0 -43
  73. data/demo/spec/javascripts/modules/button_spec.coffee +0 -39
  74. data/demo/spec/javascripts/modules/counter_button_spec.coffee +0 -57
  75. data/demo/spec/javascripts/sinon-chai.js +0 -116
  76. data/demo/spec/javascripts/sinon.js +0 -3555
  77. data/demo/spec/javascripts/spec_helper.coffee +0 -10
  78. data/demo/spec/javascripts/templates/autogrow_textarea.jst.ejs +0 -2
  79. data/demo/spec/javascripts/templates/button.jst.ejs +0 -3
  80. data/demo/spec/javascripts/templates/closable.jst.ejs +0 -14
  81. data/demo/spec/javascripts/templates/modularity.jst.ejs +0 -6
  82. data/demo/spec/javascripts/tools/array_tools_spec.coffee +0 -12
  83. data/demo/spec/javascripts/tools/object_tools_spec.coffee +0 -46
  84. data/demo/vendor/assets/javascripts/.gitkeep +0 -0
  85. data/demo/vendor/assets/stylesheets/.gitkeep +0 -0
  86. data/demo/vendor/plugins/.gitkeep +0 -0
  87. data/modularity-rails.gemspec +0 -22
  88. data/run_tests +0 -6
  89. data/vendor/assets/javascripts/modularity/modules/counter_button.coffee +0 -17
@@ -1,5 +0,0 @@
1
- # See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file
2
- #
3
- # To ban all spiders from the entire site uncomment the next two lines:
4
- # User-Agent: *
5
- # Disallow: /
@@ -1,6 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
-
4
- APP_PATH = File.expand_path('../../config/application', __FILE__)
5
- require File.expand_path('../../config/boot', __FILE__)
6
- require 'rails/commands'
@@ -1,132 +0,0 @@
1
- #= require spec_helper
2
- #= require modularity/data/ajax_loader
3
-
4
-
5
- describe 'ajax_loader', ->
6
-  
7
- ajax_loader = spy = spy_get = spy_fire = null
8
- beforeEach ->
9
- spy = sinon.spy()
10
- spy_get = sinon.spy jQuery, 'get'
11
- spy_fire = sinon.spy modularity, 'fire_global_event'
12
-
13
- afterEach ->
14
- spy_get.restore()
15
- spy_fire.restore()
16
-
17
- describe 'constructor', ->
18
-
19
- it "stores the 'cache' settings", ->
20
- loader = new modularity.AjaxLoader {caching: yes}
21
- expect(loader.caching).to.be.true
22
-
23
- it 'defaults to no caching', ->
24
- loader = new modularity.AjaxLoader {}
25
- expect(loader.caching).to.be.false
26
-
27
-
28
-  describe 'get', ->
29
- url = "/users/4"
30
-
31
- beforeEach ->
32
- ajax_loader = new modularity.AjaxLoader {caching: yes}
33
-
34
- describe 'first time request', ->
35
-
36
- beforeEach ->
37
- ajax_loader.get url, spy
38
-
39
- it 'makes an ajax request', ->
40
- expect(jQuery.get).to.have.been.calledOnce
41
-
42
- it 'saves the callback for later', ->
43
- expect(ajax_loader.cb_cache.get(url)).to.have.length 1
44
- expect(ajax_loader.cb_cache.get(url)[0]).to.equal spy
45
-
46
- it 'returns without calling the callback', ->
47
- expect(spy).to.not.have.been.called
48
-
49
-
50
- describe 'the request is already in progress', ->
51
-
52
- existing_cb = sinon.spy()
53
- new_cb = sinon.spy()
54
- beforeEach ->
55
- ajax_loader.cb_cache.add url, [existing_cb]
56
- ajax_loader.get url, new_cb
57
-
58
- it 'adds the callback to the callback cache', ->
59
- expect(ajax_loader.cb_cache.get(url)).to.have.length 2
60
- expect(ajax_loader.cb_cache.get(url)[0]).to.equal existing_cb
61
- expect(ajax_loader.cb_cache.get(url)[1]).to.equal new_cb
62
-
63
- it 'returns without calling the callback', ->
64
- expect(new_cb).to.not.have.been.called
65
-
66
- it 'does not make another ajax request', ->
67
- expect(jQuery.get).to.not.have.been.called
68
-
69
- it "does not fire the 'loading' event", ->
70
- expect(modularity.fire_global_event).to.not.have.been.called
71
-
72
-
73
- describe 'ajax request returns successfully', ->
74
-
75
- old_jquery_get = null
76
- beforeEach ->
77
- jquery_callback = null
78
- old_jquery_get = jQuery.get
79
- jQuery.get = (url, callback) -> callback 'result'
80
-
81
- afterEach ->
82
- jQuery.get = old_jquery_get
83
-
84
- describe 'with caching enabled', ->
85
- beforeEach ->
86
- ajax_loader.caching = true
87
- ajax_loader.get url, spy
88
-
89
- it 'calls the given callbacks with the server data', ->
90
- expect(spy.calledWith('result')).to.be.true
91
-
92
- it 'removes the callbacks from the callback cache', ->
93
- expect(ajax_loader.cb_cache.get(url)).to.be.undefined
94
-
95
- it 'stores the data in the data cache', ->
96
- expect(ajax_loader.data_cache.get(url)).to.equal 'result'
97
-
98
- it "fires the 'loading' event", ->
99
- expect(modularity.fire_global_event.calledWith('AJAX_LOADED')).to.be.true
100
-
101
-
102
- describe 'with caching disabled', ->
103
- beforeEach ->
104
- ajax_loader.caching = false
105
- ajax_loader.get url, spy
106
-
107
- it 'calls the given callbacks with the server data', ->
108
- expect(spy.calledWith('result')).to.be.true
109
-
110
- it 'removes the callbacks from the callback cache', ->
111
- expect(ajax_loader.cb_cache.get(url)).to.be.undefined
112
-
113
- it 'does not store the data in the data cache', ->
114
- expect(ajax_loader.data_cache.get(url)).to.be.undefined
115
-
116
- it "fires the 'loading' event", ->
117
- expect(modularity.fire_global_event.calledWith('AJAX_LOADED')).to.be.true
118
-
119
-
120
- describe 'the data has already been loaded', ->
121
-
122
-    it 'calls the callback with the cached data', ->
123
- ajax_loader.data_cache.add url, "my data"
124
-
125
- ajax_loader.get(url, spy)
126
-
127
- expect(spy).to.have.been.called
128
- expect(spy.calledWith('my data')).to.be.true
129
-
130
- it "does not fire the 'loading' event", ->
131
- expect(modularity.fire_global_event).to.not.have.been.called
132
-
@@ -1,103 +0,0 @@
1
- #= require spec_helper
2
- #= require modularity/data/cache
3
-
4
-
5
- describe 'Cache', ->
6
-
7
- cache = null
8
- beforeEach ->
9
- cache = new modularity.Cache()
10
-
11
-
12
- describe 'constructor', ->
13
-
14
- it 'initializes with an empty cache', ->
15
- cache.cache.should.eql({})
16
-
17
-
18
- describe 'add', ->
19
-
20
- it 'stores the given data in the cache', ->
21
- cache.add 'foo', 'bar'
22
- cache.cache.should.eql({'foo': 'bar'})
23
-
24
- it 'overwrites existing entries', ->
25
- cache.cache = {'foo', 'bar'}
26
- cache.add 'foo', 'new'
27
- (cache.cache['foo']).should.be.equal('new')
28
-
29
-
30
- describe 'remove', ->
31
-
32
- it 'removes the entry with the given key from the chache', ->
33
- cache.add 'foo', 'bar'
34
- cache.remove 'foo'
35
- expect(cache.get('foo')).to.be.undefined
36
- cache.length().should.equal 0
37
-
38
- it 'only removes the given data and leaves the rest of the cache alone', ->
39
- cache.add 1, 'one'
40
- cache.add 2, 'two'
41
- cache.remove 1
42
- expect(cache.get(1)).to.be.undefined
43
- expect(cache.get(2)).to.equal 'two'
44
- cache.length().should.equal 1
45
-
46
-
47
- describe 'get', ->
48
-
49
- it "returns undefined if the entry doesn't exist", ->
50
- expect(cache.get('zonk')).to.be.undefined
51
-
52
- it "returns the entry if it exists", ->
53
- cache.add 'foo', 'bar'
54
- cache.get('foo').should.equal('bar')
55
-
56
-
57
- describe 'getMany', ->
58
-
59
- result = null
60
- beforeEach ->
61
- cache.add('one', 1)
62
- cache.add('two', 2)
63
- result = cache.getMany ['one', 'three']
64
-
65
- it "returns the values that exist in the 'found' structure", ->
66
- result.found.should.eql({'one': 1})
67
-
68
- it "returns the values that don't exist in the 'missing' structure", ->
69
- result.missing.should.eql(['three'])
70
-
71
-
72
- describe 'length', ->
73
-
74
- it 'returns 0 for empty cache', ->
75
- cache.length().should.equal 0
76
-
77
- it 'returns the number of objects in the cache', ->
78
- cache.add('foo', 'bar')
79
- cache.add('fooz', 'baz')
80
- cache.length().should.equal(2)
81
-
82
-
83
- describe 'replaceAll', ->
84
-
85
- it 'replaces the whole cache with the given data', ->
86
- cache.add 'one', 1
87
- cache.replaceAll {'one': 2, two: 3}
88
- cache.length().should.equal(2)
89
- cache.get('one').should.equal(2)
90
- cache.get('two').should.equal(3)
91
-
92
- describe 'with 2 parameters', ->
93
-
94
- it 'parses the given array, and indexes on the given key', ->
95
- ten = {id: 10, value: 'ten'}
96
- twelve = {id: 12, value: 'twelve'}
97
-
98
- cache.replaceAll [ten, twelve], 'id'
99
-
100
- cache.length().should.equal 2
101
- cache.get(10).should.equal ten
102
- cache.get(12).should.equal twelve
103
-
@@ -1,51 +0,0 @@
1
- #= require spec_helper
2
- #= require modularity/data/indexed_cache
3
-
4
-
5
- describe 'IndexedCache', ->
6
-
7
- indexed_cache = null
8
- entry_1 = {id: 1, value: 'one'}
9
- entry_2 = {id: 2, value: 'two'}
10
- beforeEach ->
11
- indexed_cache = new modularity.IndexedCache 'id'
12
-
13
-
14
- describe 'constructor', ->
15
-
16
- it 'stores the given key attribute', ->
17
- indexed_cache.key.should == 'id'
18
-
19
-
20
- describe 'add', ->
21
-
22
- beforeEach ->
23
- indexed_cache.add entry_1
24
-
25
- it 'adds the given element', ->
26
- indexed_cache.cache.length().should.equal 1
27
- indexed_cache.cache.cache[1].should.eql entry_1
28
-
29
-
30
- describe 'add_all', ->
31
- it 'adds all the given elements', ->
32
- indexed_cache.add_all [entry_1, entry_2]
33
- indexed_cache.length().should.equal 2
34
- indexed_cache.cache.cache[1].should.eql entry_1
35
- indexed_cache.cache.cache[2].should.eql entry_2
36
-
37
-
38
- describe 'remove', ->
39
- it 'removes the given object from the server', ->
40
- indexed_cache.add entry_1
41
- indexed_cache.remove entry_1
42
- indexed_cache.length().should.equal 0
43
-
44
- describe 'get', ->
45
- it 'returns the element indexed by the given key', ->
46
- indexed_cache.add entry_1
47
- indexed_cache.get(1).should.eql entry_1
48
-
49
- it "returns undefined if the element doesn't exist", ->
50
- expect(indexed_cache.get(2)).to.be.undefined
51
-
@@ -1,283 +0,0 @@
1
- #= require spec_helper
2
- #= require modularity/data/persistence_manager
3
- #= require jquery
4
-
5
-
6
- describe 'PersistenceManager', ->
7
-
8
- # Global variables for testing.
9
- persistence_manager = null
10
- entry_1 = {id: 1, value: 'one'}
11
- entry_2 = {id: 2, value: 'two'}
12
-
13
- beforeEach ->
14
- persistence_manager = new modularity.PersistenceManager {url: '/users'}
15
-
16
-
17
- describe 'constructor', ->
18
-
19
- it 'initializes an empty server data cache', ->
20
- persistence_manager.server_data.length().should.equal 0
21
-
22
- it 'initializes an empty client data cache', ->
23
- persistence_manager.client_data.length().should.eql 0
24
-
25
- it 'stores the given base url', ->
26
- persistence_manager.base_url.should.equal '/users'
27
-
28
- it 'stores the given index key', ->
29
- persistence_manager = new modularity.PersistenceManager {key: 'my_key', url: '/users'}
30
- persistence_manager.key.should.equal 'my_key'
31
-
32
- it "uses 'id' as the default if no key is given", ->
33
- persistence_manager.key.should.equal 'id'
34
-
35
-
36
- describe 'add_all', ->
37
-
38
- it 'adds the given data to the server_data cache', ->
39
- spy = sinon.spy persistence_manager.server_data, 'add_all'
40
- data = [{id: 1}, {id: 2}]
41
- persistence_manager.add_all data
42
- spy.should.have.been.calledOnce
43
-
44
- describe 'create', ->
45
- new_obj = {value: 'foo'}
46
-
47
- beforeEach ->
48
- sinon.stub(jQuery, 'ajax').yieldsTo('success', entry_2)
49
-
50
- afterEach ->
51
- jQuery.ajax.restore()
52
-
53
- it 'makes an ajax POST request to the CREATE url on the server', ->
54
- persistence_manager.create new_obj, ->
55
- jQuery.ajax.should.have.been.calledOnce
56
- args = jQuery.ajax.args[0][0]
57
- args.url.should.equal '/users.json'
58
- args.type.should.equal 'POST'
59
-
60
- it 'sends the object as payload', ->
61
- persistence_manager.create new_obj, ->
62
- args = jQuery.ajax.args[0][0]
63
- args.data.should.equal new_obj
64
-
65
- it "doesn't updates the server cache immediately because the object doesn't have an id", ->
66
- persistence_manager.create new_obj, ->
67
- expect(persistence_manager.server_data.get(1)).to.be.undefined
68
-
69
- it 'updates the server cache with the server data when the call returns', (done) ->
70
- persistence_manager.create {value: 'bar'}, (server_obj) ->
71
- persistence_manager.server_data.get(server_obj.id).should.equal entry_2
72
- done()
73
-
74
- it 'calls the given callback when done', (done) ->
75
- persistence_manager.create new_obj, ->
76
- done()
77
-
78
-
79
- describe 'delete', ->
80
-
81
- beforeEach ->
82
- sinon.stub(jQuery, 'ajax').yieldsTo('success')
83
-
84
- afterEach ->
85
- jQuery.ajax.restore()
86
-
87
- it 'makes an ajax DELETE request to the item url on the server', ->
88
- persistence_manager.delete entry_1
89
- jQuery.ajax.should.have.been.calledOnce
90
- args = jQuery.ajax.args[0][0]
91
- args.url.should.equal '/users/1.json'
92
- args.type.should.equal 'DELETE'
93
-
94
- it 'removes the object from the client and server cache', ->
95
- persistence_manager.server_data.add entry_1
96
- persistence_manager.client_data.add entry_1
97
- persistence_manager.delete entry_1
98
- persistence_manager.server_data.length().should.equal 0
99
- persistence_manager.client_data.length().should.equal 0
100
-
101
- it 'calls the given callback when done', (done) ->
102
- persistence_manager.delete entry_1, ->
103
- done()
104
-
105
-
106
- describe 'entry_url', ->
107
-
108
- it 'returns the url to access a single entry', ->
109
- persistence_manager.entry_url(entry_1).should.equal '/users/1.json'
110
-
111
-
112
- describe 'load', ->
113
-
114
- describe 'entry exists in client data cache', ->
115
- it 'returns the entry from the @client_data cache if it exists there', (done) ->
116
- persistence_manager.client_data.add entry_1
117
- persistence_manager.load 1, (entry) ->
118
- entry.should.equal entry_1
119
- done()
120
-
121
- describe 'entry exists in server data cache', ->
122
-
123
- beforeEach ->
124
- persistence_manager.server_data.add entry_1
125
-
126
- it 'adds the entry to the client data cache', (done) ->
127
- persistence_manager.load 1, ->
128
- persistence_manager.client_data.length().should.equal 1
129
- persistence_manager.client_data.get(1).should.eql entry_1
130
- done()
131
-
132
- it 'returns the entry from the client data cache', (done) ->
133
- persistence_manager.load 1, (entry) ->
134
- client_cache_entry = persistence_manager.client_data.get 1
135
- entry.should.equal client_cache_entry
136
- done()
137
-
138
- it 'returns a different hash than the server data, so that the user can make changes to it', (done) ->
139
- persistence_manager.load 1, (entry) ->
140
- server_cache_entry = persistence_manager.server_data.get 1
141
-
142
- entry.should.not.equal server_cache_entry
143
- done()
144
-
145
-
146
- describe "entry doesn't exist on the client at all", ->
147
-
148
- beforeEach ->
149
- sinon.stub(jQuery, 'ajax').yieldsTo('success', entry_1)
150
-
151
- afterEach ->
152
- jQuery.ajax.restore()
153
-
154
- it "retrieves the entry from the server", (done) ->
155
- persistence_manager.load 1, ->
156
- jQuery.ajax.should.have.been.calledOnce
157
- done()
158
-
159
-
160
- it 'stores the entry in the server cache', (done) ->
161
- persistence_manager.load 1, ->
162
- persistence_manager.server_data.length().should.equal 1
163
- persistence_manager.server_data.get(1).should.equal entry_1
164
- done()
165
-
166
- it 'stores a replica of the entry in the client cache', (done) ->
167
- persistence_manager.load 1, ->
168
- persistence_manager.client_data.get(1).should.not.equal entry_1
169
- persistence_manager.client_data.get(1).should.eql entry_1
170
- done()
171
-
172
- it 'returns the client replica', (done) ->
173
- persistence_manager.load 1, (entry) ->
174
- persistence_manager.client_data.get(1).should.equal entry
175
- persistence_manager.server_data.get(1).should.not.equal entry
176
- done()
177
-
178
-
179
- describe 'load_all', ->
180
-
181
- loading_done_callback = null
182
- beforeEach ->
183
- sinon.stub(jQuery, 'ajax').yieldsTo('success', [entry_1, entry_2])
184
- loading_done_callback = sinon.spy()
185
- persistence_manager.load_all loading_done_callback, {'q': 'foo'},
186
-
187
- afterEach ->
188
- jQuery.ajax.restore()
189
-
190
- it 'makes a request to the INDEX action of the server', ->
191
- jQuery.ajax.should.have.been.calledOnce
192
- jQuery.ajax.args[0][0].url.should.equal '/users.json'
193
-
194
- it 'provides the given data as parameters to the request', ->
195
- jQuery.ajax.args[0][0].data.should.eql {'q': 'foo'}
196
-
197
- it 'fills the server cache with the response data', ->
198
- persistence_manager.server_data.length().should.eql 2
199
- persistence_manager.server_data.get(1).should.eql entry_1
200
- persistence_manager.server_data.get(2).should.eql entry_2
201
-
202
- it 'calls the given callback method when the data is available', ->
203
- loading_done_callback.should.have.been.calledOnce
204
-
205
-
206
- describe 'load_many', ->
207
-
208
- describe 'all snippets in cache', ->
209
- it 'returns an array of all requested snippets', ->
210
- persistence_manager.add_all [{id: 1}, {id: 2}, {id: 3}]
211
- persistence_manager.load_many [1,2], (snippets) ->
212
- expect(snippets).to.have.length 2
213
- expect(snippets[0].id).to.equal 1
214
- expect(snippets[1].id).to.equal 2
215
-
216
-
217
- describe 'some snippets are not cached', ->
218
-
219
- it 'loads the missing snippets from the server'
220
-
221
-
222
- describe 'save', ->
223
-
224
- describe 'for unsaved objects', ->
225
- it "calls the 'create' action", ->
226
- sinon.stub persistence_manager, 'create'
227
- persistence_manager.save {value: 'foo'}, ->
228
- persistence_manager.create.should.have.been.calledOnce
229
-
230
- describe 'for objects from the server', ->
231
- it "calls the 'update' action", ->
232
- sinon.stub persistence_manager, 'update'
233
- persistence_manager.save entry_1, ->
234
- persistence_manager.update.should.have.been.calledOnce
235
-
236
-
237
- describe 'update', ->
238
-
239
- beforeEach ->
240
- sinon.stub(jQuery, 'ajax').yieldsTo('success', entry_2)
241
- server_entry = {id: 1, title: 'server title', desc: 'server desc'}
242
- persistence_manager.server_data.add server_entry
243
-
244
- afterEach ->
245
- jQuery.ajax.restore()
246
-
247
- it 'makes an ajax PUT request to the UPDATE url on the server', ->
248
- persistence_manager.update entry_1, ->
249
- jQuery.ajax.should.have.been.calledOnce
250
- args = jQuery.ajax.args[0][0]
251
- args.url.should.equal '/users/1.json'
252
- args.type.should.equal 'PUT'
253
-
254
- it 'sends only updated colums of the object as payload', (done) ->
255
- persistence_manager.load 1, (client_entry) ->
256
- client_entry.title = 'client title'
257
-
258
- persistence_manager.update client_entry
259
-
260
-
261
- args = jQuery.ajax.args[0][0]
262
- args.data.should.eql {id: 1, title: 'client title'}
263
- done()
264
-
265
- it "doesn't perform the call if nothing is changed", (done) ->
266
- persistence_manager.load 1, (client_entry) ->
267
- persistence_manager.update client_entry
268
- jQuery.ajax.should.not.have.been.called
269
- done()
270
-
271
- it 'updates the server cache immediately with the given object', ->
272
- persistence_manager.update entry_1, ->
273
- persistence_manager.server_data.get(1).should.equal entry_1
274
-
275
- it 'updates the server cache with the server object when done', (done) ->
276
- persistence_manager.update entry_1, (server_obj) ->
277
- persistence_manager.server_data.get(2).should.equal entry_2
278
- done()
279
-
280
- it 'calls the given callback when done', (done) ->
281
- persistence_manager.update entry_1, ->
282
- done()
283
-