crud-service 0.0.9 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/api.rb DELETED
@@ -1,129 +0,0 @@
1
- module CrudService
2
- module Api
3
- # This mixin provides a static method, crud_api, to configure a sinatra class with the
4
- # provided resource name, service and api_options
5
- def crud_api(resource_name, service_name, primary_key_name, api_options = {})
6
-
7
- defaults = {
8
- :enable_read => true,
9
- :enable_write => true,
10
- :enable_options => true,
11
- :enable_get_all => true,
12
- :enable_get => true,
13
- :enable_post => true,
14
- :enable_put => true,
15
- :enable_delete => true,
16
- }
17
- api_options.merge!(defaults) { |key, v1, v2| v1 }
18
-
19
- if api_options[:enable_options]
20
- options '/'+resource_name do
21
- 204
22
- end
23
- end
24
-
25
- if api_options[:enable_write]
26
-
27
- if api_options[:enable_post]
28
- post '/'+resource_name do
29
- service = settings.send(service_name)
30
-
31
- # Get The data
32
- begin
33
- data = JSON.parse(request.body.read)
34
- rescue Exception => e
35
- return 400
36
- end
37
-
38
- # Valid POST?
39
- return 400 unless service.valid_insert?(data)
40
-
41
- # Already Exists?
42
- return 409 if service.exists_by_primary_key?(data[primary_key_name])
43
-
44
- # Do Insert
45
- record = service.insert(data)
46
-
47
- # Other Error
48
- return 500 if record == false
49
-
50
- # Output new record
51
- JSON.fast_generate record
52
- end
53
- end
54
-
55
- if api_options[:enable_put]
56
- put '/'+resource_name+'/:'+primary_key_name do
57
- service = settings.send(service_name)
58
-
59
- # Must Exist
60
- return 404 unless service.exists_by_primary_key?(params[primary_key_name.to_sym])
61
-
62
- # Get The Data
63
- begin
64
- data = JSON.parse(request.body.read)
65
- rescue Exception => e
66
- return 400
67
- end
68
-
69
- # Valid Update?
70
- return 400 unless service.valid_update?(data)
71
-
72
- # Do Update
73
- record = service.update_by_primary_key(params[primary_key_name.to_sym],data)
74
-
75
- # Other Error
76
- return 500 if record.nil?
77
-
78
- # Return new Region
79
- JSON.fast_generate record
80
- end
81
- end
82
-
83
- if api_options[:enable_delete]
84
- delete '/'+resource_name+'/:'+primary_key_name do
85
- service = settings.send(service_name)
86
-
87
- # Must Exist
88
- return 404 unless service.exists_by_primary_key?(params[primary_key_name.to_sym])
89
-
90
- # Do Delete
91
- return 400 unless service.delete_by_primary_key(params[primary_key_name.to_sym])
92
-
93
- 204
94
- end
95
- end
96
-
97
- end
98
-
99
- if api_options[:enable_read]
100
-
101
- if api_options[:enable_get]
102
- get '/'+resource_name do
103
- service = settings.send(service_name)
104
-
105
- sanitize_params(params)
106
- # Check query validity
107
- return 400 unless service.valid_query?(params)
108
-
109
- # Return Regions on Query
110
- JSON.fast_generate service.get_all_by_query(params)
111
- end
112
- end
113
-
114
- if api_options[:enable_get_all]
115
- get '/'+resource_name+'/:'+primary_key_name do
116
- service = self.settings.send(service_name)
117
-
118
- sanitize_params(params)
119
- return 400 unless service.valid_query?(params)
120
-
121
- record = service.get_one_by_query(params)
122
- return 404 if record.nil?
123
- JSON.fast_generate record
124
- end
125
- end
126
- end
127
- end
128
- end
129
- end
@@ -1,12 +0,0 @@
1
- require "coveralls"
2
- Coveralls.wear!
3
- SimpleCov.coverage_dir('spec/coverage')
4
-
5
- require "dotenv"
6
- Dotenv.load
7
-
8
- require "crud-service"
9
-
10
- RSpec.configure do |c|
11
- c.include Helpers
12
- end
@@ -1,30 +0,0 @@
1
- module Helpers
2
- def mysql_mock
3
- mysql = double("Mysql2")
4
- mysql.stub(:escape) do |s|
5
- Mysql2::Client.escape(s)
6
- end
7
- mysql
8
- end
9
-
10
- # Mock a Mysql Result object that returns each_hash
11
- def mysql_result_mock(data)
12
- result = double(result)
13
- mock = result.stub(:each)
14
-
15
- data.each do |hash|
16
- mock = mock.and_yield(hash)
17
- end
18
-
19
- result.stub(:count).and_return(data.length)
20
-
21
- result
22
- end
23
-
24
- # Make the supplied memcache_mock null (no hits, null write)
25
- def memcache_null(memcache_mock)
26
- @mock_memcache.stub(:get).and_return(nil)
27
- @mock_memcache.stub(:set).and_return(nil)
28
- @mock_memcache.stub(:incr).and_return(nil)
29
- end
30
- end
@@ -1,1174 +0,0 @@
1
- require "helper"
2
-
3
- describe CrudService::Dal do
4
- before(:each) do
5
- @mock_mysql = mysql_mock
6
- @mock_memcache = double('Memcache')
7
- @mock_log = double('Log')
8
-
9
- @generic_dal = CrudService::Dal.new(@mock_mysql, @mock_memcache, @mock_log)
10
- @generic_dal.table_name = "testtable"
11
- @generic_dal.cache_prefix = "prefix"
12
- end
13
-
14
- describe '#initialize' do
15
- it 'should inject dependencies correctly' do
16
- @generic_dal.mysql.should eq @mock_mysql
17
- @generic_dal.memcache.should eq @mock_memcache
18
- @generic_dal.log.should eq @mock_log
19
- end
20
- end
21
-
22
- describe '#cached_query' do
23
- it 'should attempt to query the cache before the database' do
24
-
25
- testdata = [ { "field_one" => "one" } ]
26
-
27
- mock_result = mysql_result_mock(testdata)
28
-
29
- query = 'test invalid query'
30
- query_hash = "prefix-"+Digest::MD5.hexdigest(query+":testtable-1")
31
-
32
- @mock_memcache.should_receive(:get).ordered.with("prefix-testtable-version").and_return(1)
33
- @mock_memcache.should_receive(:get).ordered.with(query_hash).and_return(nil)
34
- @mock_mysql.should_receive(:query).with(query).and_return(mock_result)
35
- @mock_memcache.should_receive(:set).ordered.with(query_hash, testdata)
36
-
37
- @generic_dal.cached_query(query,[]).should eq testdata
38
- end
39
-
40
- it 'should not attempt to query the database on a cache hit' do
41
- testdata = [ { "field_one" => "one" } ]
42
- query = 'test invalid query'
43
- query_hash = "prefix-"+Digest::MD5.hexdigest(query+":testtable-1")
44
-
45
- @mock_memcache.should_receive(:get).ordered.with("prefix-testtable-version").and_return(1)
46
- @mock_memcache.should_receive(:get).ordered.with(query_hash).and_return(testdata)
47
- @mock_mysql.should_not_receive(:query)
48
- @mock_memcache.should_not_receive(:set).ordered
49
-
50
- @generic_dal.cached_query(query,[]).should eq testdata
51
- end
52
-
53
- it 'should handle zero record return' do
54
- memcache_null(@mock_memcache)
55
-
56
- query = 'test invalid query'
57
-
58
- @mock_mysql.should_receive(:query).with(query).and_return(mysql_result_mock([]))
59
-
60
- @generic_dal.cached_query(query,[]).should eq([])
61
- end
62
-
63
- it 'should write a new table version to cache when not found' do
64
- testdata = [ { "field_one" => "one" } ]
65
-
66
- mock_result = mysql_result_mock(testdata)
67
-
68
- query = 'test invalid query'
69
- query_hash = "prefix-"+Digest::MD5.hexdigest(query+":testtable-1")
70
-
71
- @mock_memcache.should_receive(:get).ordered.with("prefix-testtable-version").and_return(nil)
72
- @mock_memcache.should_receive(:get).ordered.with("prefix-testtable-version").and_return(nil)
73
- @mock_memcache.should_receive(:set).ordered.with("prefix-testtable-version",1,nil,{:raw=>true})
74
- @mock_memcache.should_receive(:get).ordered.with(query_hash).and_return(nil)
75
- @mock_mysql.should_receive(:query).ordered.with(query).and_return(mock_result)
76
- @mock_memcache.should_receive(:set).ordered.with(query_hash, testdata)
77
-
78
- @generic_dal.cached_query(query,[]).should eq testdata
79
- end
80
-
81
- it 'should miss the cache when a table version has changed' do
82
- testdata = [ { "field_one" => "one" } ]
83
-
84
- mock_result = mysql_result_mock(testdata)
85
-
86
- query = 'test invalid query'
87
- query_hash = "prefix-"+Digest::MD5.hexdigest(query+":testtable-1")
88
-
89
- @mock_memcache.should_receive(:get).ordered.with("prefix-testtable-version").and_return(1)
90
- @mock_memcache.should_receive(:get).ordered.with(query_hash).and_return(nil)
91
- @mock_mysql.should_receive(:query).with(query).and_return(mock_result)
92
- @mock_memcache.should_receive(:set).ordered.with(query_hash, testdata)
93
-
94
- @generic_dal.cached_query(query,[]).should eq testdata
95
-
96
- query_hash = "prefix-"+Digest::MD5.hexdigest(query+":testtable-2")
97
-
98
- @mock_memcache.should_receive(:get).ordered.with("prefix-testtable-version").and_return(2)
99
- @mock_memcache.should_receive(:get).ordered.with(query_hash).and_return(nil)
100
- @mock_mysql.should_receive(:query).with(query).and_return(mock_result)
101
- @mock_memcache.should_receive(:set).ordered.with(query_hash, testdata)
102
-
103
- @generic_dal.cached_query(query,[]).should eq testdata
104
- end
105
-
106
- end
107
-
108
- describe '#build_where' do
109
- it 'should return an empty string when called with no query' do
110
- query = { }
111
- @generic_dal.build_where(query).should eq ""
112
- end
113
-
114
- it 'should return a valid where clause when called with a single field query string value' do
115
- query = { "one" => "two" }
116
- @generic_dal.build_where(query).should eq "(`one` = 'two')"
117
- end
118
-
119
- it 'should return a valid where clause when called with a single field query integer value' do
120
- query = { "one" => 2 }
121
- @generic_dal.build_where(query).should eq "(`one` = 2)"
122
- end
123
-
124
- it 'should return a valid where clause when called with a single field query float value' do
125
- query = { "one" => 2.123 }
126
- @generic_dal.build_where(query).should eq "(`one` = 2.123)"
127
- end
128
-
129
- it 'should return a valid where clause when called with a multiple field query' do
130
- query = { "one" => "two", "three" => "four" }
131
- @generic_dal.build_where(query).should eq "(`one` = 'two') AND (`three` = 'four')"
132
- end
133
-
134
- it 'should return a valid where clause when called with a query with a nil value' do
135
- query = { "one" => "two", "three" => nil}
136
- @generic_dal.build_where(query).should eq "(`one` = 'two') AND (`three` IS NULL)"
137
- end
138
-
139
- it 'should escape field names' do
140
- query = { "on`=1; DROP TABLE countries" => "two" }
141
- @generic_dal.build_where(query).should eq "(`on=1; DROP TABLE countries` = 'two')"
142
- end
143
-
144
- it 'should escape field values when string based' do
145
- query = { "one" => "two'; DROP TABLE countries;" }
146
- @generic_dal.build_where(query).should eq "(`one` = 'two\\'; DROP TABLE countries;')"
147
- end
148
-
149
- it 'should not build include or exclude into queries' do
150
- query = { "one" => 2, "include" => "subdivisions", "exclude" => "countries", "two"=>3 }
151
- @generic_dal.build_where(query).should eq "(`one` = 2) AND (`two` = 3)"
152
- end
153
- end
154
-
155
- describe '#build_where_ns_ns' do
156
- it 'should return an empty string when called with no query' do
157
- query = { }
158
- @generic_dal.build_where_ns(query,'a').should eq ""
159
- end
160
-
161
- it 'should return a valid where clause when called with a single field query string value' do
162
- query = { "one" => "two" }
163
- @generic_dal.build_where_ns(query,'b').should eq "(`b`.`one` = 'two')"
164
- end
165
-
166
- it 'should return a valid where clause when called with a single field query integer value' do
167
- query = { "one" => 2 }
168
- @generic_dal.build_where_ns(query,'c').should eq "(`c`.`one` = 2)"
169
- end
170
-
171
- it 'should return a valid where clause when called with a single field query float value' do
172
- query = { "one" => 2.123 }
173
- @generic_dal.build_where_ns(query,'d').should eq "(`d`.`one` = 2.123)"
174
- end
175
-
176
- it 'should return a valid where clause when called with a multiple field query' do
177
- query = { "one" => "two", "three" => "four" }
178
- @generic_dal.build_where_ns(query,'e').should eq "(`e`.`one` = 'two') AND (`e`.`three` = 'four')"
179
- end
180
-
181
- it 'should return a valid where clause when called with a query with a nil value' do
182
- query = { "one" => "two", "three" => nil}
183
- @generic_dal.build_where_ns(query,'f').should eq "(`f`.`one` = 'two') AND (`f`.`three` IS NULL)"
184
- end
185
-
186
- it 'should escape field names' do
187
- query = { "on`=1; DROP TABLE countries" => "two" }
188
- @generic_dal.build_where_ns(query,'g').should eq "(`g`.`on=1; DROP TABLE countries` = 'two')"
189
- end
190
-
191
- it 'should escape field values when string based' do
192
- query = { "one" => "two'; DROP TABLE countries;" }
193
- @generic_dal.build_where_ns(query,'h').should eq "(`h`.`one` = 'two\\'; DROP TABLE countries;')"
194
- end
195
-
196
- it 'should not build include or exclude into queries' do
197
- query = { "one" => 2, "include" => "subdivisions", "exclude" => "countries", "two"=>3 }
198
- @generic_dal.build_where_ns(query,'i').should eq "(`i`.`one` = 2) AND (`i`.`two` = 3)"
199
- end
200
- end
201
-
202
- describe '#build_fields' do
203
- it 'should return an empty string with no fields' do
204
- @generic_dal.build_select_fields([],nil).should eq ""
205
- end
206
-
207
- it 'should return fields correctly' do
208
- @generic_dal.build_select_fields(['one','two'],nil).should eq "`one`,`two`"
209
- end
210
-
211
- it 'should return namespaced fields correctly' do
212
- @generic_dal.build_select_fields(['one','two'],'a').should eq "`a`.`one`,`a`.`two`"
213
- end
214
- end
215
-
216
- describe '#build_fields' do
217
- before(:each) do
218
- @generic_dal.fields = {
219
- "test1" => { :type=>:string },
220
- "test2" => { :type=>:string },
221
- "testX" => { :type=>:string },
222
- }
223
- end
224
-
225
- it 'should return all fields with nil excludes' do
226
- @generic_dal.build_fields({}).should eq "`test1`,`test2`,`testX`"
227
- end
228
-
229
- it 'should return all fields with empty excludes' do
230
- @generic_dal.build_fields({"exclude"=>nil}).should eq "`test1`,`test2`,`testX`"
231
- end
232
-
233
- it 'should exclude a single field' do
234
- @generic_dal.build_fields({"exclude"=>'test1'}).should eq "`test2`,`testX`"
235
- end
236
-
237
- it 'should exclude multiple fields' do
238
- @generic_dal.build_fields({"exclude"=>'test1,testX'}).should eq "`test2`"
239
- end
240
- end
241
-
242
- describe '#build_fields_with_ns' do
243
- before(:each) do
244
- @generic_dal.fields = {
245
- "test1" => { :type=>:string },
246
- "test2" => { :type=>:string },
247
- "testX" => { :type=>:string },
248
- }
249
- end
250
-
251
- it 'should return all fields with nil excludes' do
252
- @generic_dal.build_fields_with_ns({},'a').should eq "`a`.`test1`,`a`.`test2`,`a`.`testX`"
253
- end
254
-
255
- it 'should return all fields with empty excludes' do
256
- @generic_dal.build_fields_with_ns({"exclude"=>nil},'b').should eq "`b`.`test1`,`b`.`test2`,`b`.`testX`"
257
- end
258
-
259
- it 'should exclude a single field' do
260
- @generic_dal.build_fields_with_ns({"exclude"=>'test1'},'c').should eq "`c`.`test2`,`c`.`testX`"
261
- end
262
-
263
- it 'should exclude multiple fields' do
264
- @generic_dal.build_fields_with_ns({"exclude"=>'test1,testX'},'d').should eq "`d`.`test2`"
265
- end
266
- end
267
-
268
- describe '#get_includes' do
269
- before(:each) do
270
- @generic_dal.fields = ["test1", "test2", "testX"]
271
- end
272
-
273
- it 'should return an empty array with a nil query' do
274
- @generic_dal.get_includes(nil).should eq []
275
- end
276
-
277
- it 'should return an empty array with no fields or includes' do
278
- query = { }
279
- @generic_dal.get_includes(query).should eq []
280
- end
281
-
282
- it 'should return an empty array with fields and no includes' do
283
- query = { "field2" => "xxas"}
284
- @generic_dal.get_includes(query).should eq []
285
- end
286
-
287
- it 'should return a single include' do
288
- query = { "include"=>"test1" }
289
- @generic_dal.get_includes(query).should eq ['test1']
290
- end
291
-
292
- it 'should return multiple includes' do
293
- query = { "include"=>"test1,test2"}
294
- @generic_dal.get_includes(query).should eq ['test1','test2']
295
- end
296
- end
297
-
298
- describe '#get_excludes' do
299
- before(:each) do
300
- @generic_dal.fields = {
301
- "test1" => { :type=>:string },
302
- "test2" => { :type=>:string },
303
- "testX" => { :type=>:string },
304
- }
305
- end
306
-
307
- it 'should return an empty array with a nil query' do
308
- @generic_dal.get_excludes(nil).should eq []
309
- end
310
-
311
- it 'should return an empty array with no fields or excludes' do
312
- query = { }
313
- @generic_dal.get_excludes(query).should eq []
314
- end
315
-
316
- it 'should return an empty array with fields and no excludes' do
317
- query = { "field2" => "xxas"}
318
- @generic_dal.get_excludes(query).should eq []
319
- end
320
-
321
- it 'should return a single exclude' do
322
- query = { "exclude"=>"test1", "field2" => "xxas"}
323
- @generic_dal.get_excludes(query).should eq ['test1']
324
- end
325
-
326
- it 'should return multiple excludes' do
327
- query = { "exclude"=>"test1,test2"}
328
- @generic_dal.get_excludes(query).should eq ['test1','test2']
329
- end
330
- end
331
-
332
- describe '#build_equal_condition' do
333
- it 'should return IS NULL for a nil' do
334
- @generic_dal.build_equal_condition(nil).should eq 'IS NULL'
335
- end
336
-
337
- it 'should return correct response for an integer' do
338
- @generic_dal.build_equal_condition(1).should eq '= 1'
339
- end
340
-
341
- it 'should return correct response for a float' do
342
- @generic_dal.build_equal_condition(1.123).should eq '= 1.123'
343
- end
344
-
345
- it 'should return correct response for a string' do
346
- @generic_dal.build_equal_condition('ABC').should eq "= 'ABC'"
347
- end
348
-
349
- it 'should return correct escaped response for a string' do
350
- @generic_dal.build_equal_condition("AB'; DROP TABLE test_table --").should eq "= 'AB\\'; DROP TABLE test_table --'"
351
- end
352
- end
353
-
354
- describe '#valid_query?' do
355
- before(:each) do
356
- @generic_dal.fields = {
357
- "one" => { :type=>:string },
358
- "two" => { :type=>:string },
359
- "three" => { :type=>:string },
360
- }
361
- @generic_dal.relations = {
362
- "four" => { :type=>:string },
363
- "five" => { :type=>:string },
364
- "six" => { :type=>:string },
365
- }
366
- end
367
-
368
- it 'should return true with valid fields' do
369
- @generic_dal.valid_query?({"one"=>1}).should be true
370
- end
371
-
372
- it 'should return false with invalid fields' do
373
- @generic_dal.valid_query?({"five"=>1}).should be false
374
- end
375
-
376
- it 'should return true with valid relations' do
377
- @generic_dal.valid_query?({"include"=>'four,five'}).should be true
378
- end
379
-
380
- it 'should return false with invalid relations' do
381
- @generic_dal.valid_query?({"include"=>'ten'}).should be false
382
- end
383
-
384
- it 'should return false with nil' do
385
- @generic_dal.valid_query?(nil).should be false
386
- end
387
-
388
- it 'should return true with no fields' do
389
- @generic_dal.valid_query?({}).should be true
390
- end
391
-
392
- it 'should return true regardless of include' do
393
- @generic_dal.valid_query?({"one"=>1,"include"=>"two"}).should be true
394
- end
395
-
396
- it 'should return true regardless of exclude' do
397
- @generic_dal.valid_query?({"one"=>1,"exclude"=>"one"}).should be true
398
- end
399
-
400
- it 'should return false as cannot exclude a relation' do
401
- @generic_dal.valid_query?({"one"=>1,"exclude"=>"five"}).should be false
402
- end
403
- end
404
-
405
- describe '#escape_str_field' do
406
- it 'should escape single quotes' do
407
- @generic_dal.escape_str_field("ABC'BC").should eq "ABC\\'BC"
408
- end
409
-
410
- it 'should remove backtics' do
411
- @generic_dal.escape_str_field("ABC`BC").should eq "ABCBC"
412
- end
413
-
414
- it 'should resolve symbols as well as strings' do
415
- @generic_dal.escape_str_field(:testing).should eq "testing"
416
- end
417
- end
418
-
419
- describe '#get_all_by_query' do
420
- it 'should call cached_query with the correct query for one field' do
421
- memcache_null(@mock_memcache)
422
- @generic_dal.fields = {
423
- "one" => { :type=>:string },
424
- "two" => { :type=>:string },
425
- }
426
- @generic_dal.table_name = 'test_table'
427
-
428
- @mock_mysql.should_receive(:query).with("SELECT `one`,`two` FROM `test_table` WHERE (`field` = 'test2')")
429
-
430
- @generic_dal.get_all_by_query({ :field => 'test2' })
431
- end
432
-
433
- it 'should call cached_query with the correct query for multiple fields' do
434
- memcache_null(@mock_memcache)
435
- @generic_dal.fields = {
436
- "one" => { :type=>:string },
437
- "two" => { :type=>:string },
438
- }
439
- @generic_dal.table_name = 'test_table'
440
-
441
- @mock_mysql.should_receive(:query).with("SELECT `one`,`two` FROM `test_table` WHERE (`field` = 'test2') AND (`twofield` = 2) AND (`nullfield` IS NULL)")
442
-
443
- @generic_dal.get_all_by_query({ :field => 'test2', "twofield" =>2, "nullfield" => nil })
444
- end
445
- end
446
-
447
- describe '#get_last_id' do
448
- it 'should call mysql last_id' do
449
- @mock_mysql.should_receive(:last_id)
450
- @generic_dal.get_last_id
451
- end
452
- end
453
-
454
- describe '#get_one' do
455
- before(:each) do
456
- memcache_null(@mock_memcache)
457
-
458
- @generic_dal.fields = {
459
- "one" => { :type=>:string },
460
- "two" => { :type=>:string },
461
- }
462
-
463
- @generic_dal.table_name = 'test_table'
464
-
465
- @mock_result = mysql_result_mock([
466
- { "field_one" => "one" },
467
- { "field_one" => "two" }
468
- ])
469
- end
470
-
471
- it 'should call cached_query with the correct query for one field and return a single object' do
472
- @mock_mysql.should_receive(:query)
473
- .with("SELECT `one`,`two` FROM `test_table` WHERE (`field` = 'test2')")
474
- .and_return(@mock_result)
475
-
476
- @generic_dal.get_one({ :field => 'test2' }).should eq({ "field_one" => "one" })
477
- end
478
-
479
- it 'should call cached_query with the correct query for one field and return a single object' do
480
- @mock_mysql.should_receive(:query)
481
- .with("SELECT `one`,`two` FROM `test_table` WHERE (`field` = 'test2') AND (`field_two` = 'test3')")
482
- .and_return(@mock_result)
483
-
484
- @generic_dal.get_one({ :field => 'test2', :field_two => 'test3' }).should eq({ "field_one" => "one" })
485
- end
486
- end
487
-
488
- describe '#map_to_hash_by_primary_key' do
489
- before(:each) do
490
- @generic_dal.primary_key = 'id'
491
- end
492
-
493
- it 'should return an empty hash when given an empty array' do
494
- test = []
495
-
496
- @generic_dal.map_to_hash_by_primary_key(test).should eq({})
497
- end
498
-
499
- it 'should correctly map an array' do
500
- test = [
501
- { "id" => 1, "field_one" => "one" },
502
- { "id" => 2.5, "field_one" => "two point five" },
503
- { "id" => "3", "field_one" => "three" },
504
- { "id" => nil, "field_one" => "four" }
505
- ]
506
-
507
- @generic_dal.map_to_hash_by_primary_key(test).should eq({
508
- 1 => { "id" => 1, "field_one" => "one" },
509
- 2.5 => { "id" => 2.5, "field_one" => "two point five" },
510
- "3" => { "id" => "3", "field_one" => "three" },
511
- nil => { "id" => nil, "field_one" => "four" }
512
- })
513
- end
514
- end
515
-
516
- describe '#remove_key_from_hash_of_arrays!' do
517
-
518
- it 'should remove a key from each hash in each array in each hash value' do
519
-
520
- test = {
521
- 'one' => [ ],
522
- 2 => [ {"x" => 'a', "y" => 'b', 'z' => 'c' } ],
523
- nil => [ {"x" => 'd', "y" => 'e', 'z' => 'f' }, {"x" => 'g', "y" => 'h', 'z' => 'i' } ],
524
- }
525
-
526
- @generic_dal.remove_key_from_hash_of_arrays!(test,'z')
527
-
528
- test.should eq({
529
- 'one' => [ ],
530
- 2 => [ {"x" => 'a', "y" => 'b'} ],
531
- nil => [ {"x" => 'd', "y" => 'e' }, {"x" => 'g', "y" => 'h' } ],
532
- })
533
-
534
- end
535
- end
536
-
537
- describe '#map_to_hash_of_arrays_by_key' do
538
- it 'should return an empty hash when given an empty array' do
539
- test = []
540
-
541
- @generic_dal.map_to_hash_of_arrays_by_key(test,'field_one').should eq({})
542
- end
543
-
544
- it 'should correctly map an array' do
545
- test = [
546
- { "id" => 1, "field_one" => 1 },
547
- { "id" => 2.5, "field_one" => "two point five" },
548
- { "id" => "3", "field_one" => "three" },
549
- { "id" => nil, "field_one" => 4.5 },
550
- { "id" => nil, "field_one" => 1 },
551
- { "id" => 90, "field_one" => "two point five" },
552
- { "id" => nil, "field_one" => "four" },
553
- { "id" => "16", "field_one" => "three" },
554
- { "id" => 2.1, "field_one" => 4.5 },
555
- { "id" => 328, "field_one" => "one" },
556
- { "id" => nil, "field_one" => nil },
557
- { "id" => 123, "field_one" => nil },
558
- ]
559
-
560
- @generic_dal.map_to_hash_of_arrays_by_key(test,'field_one').should eq({
561
- nil => [
562
- { "id" => nil, "field_one" => nil },
563
- { "id" => 123, "field_one" => nil },
564
- ],
565
- 1 => [
566
- { "id" => 1, "field_one" => 1 },
567
- { "id" => nil, "field_one" => 1 },
568
- ],
569
- "two point five" => [
570
- { "id" => 2.5, "field_one" => "two point five" },
571
- { "id" => 90, "field_one" => "two point five" },
572
- ],
573
- "three" => [
574
- { "id" => "3", "field_one" => "three" },
575
- { "id" => "16", "field_one" => "three" },
576
- ],
577
- "four" => [
578
- { "id" => nil, "field_one" => "four" },
579
- ],
580
- 4.5 => [
581
- { "id" => nil, "field_one" => 4.5 },
582
- { "id" => 2.1, "field_one" => 4.5 },
583
- ],
584
- "one" => [
585
- { "id" => 328, "field_one" => "one" },
586
- ]
587
- })
588
- end
589
- end
590
-
591
- describe '#add_field_from_map!' do
592
- it 'should map correctly' do
593
- records = [
594
- {"id"=>1, "fk_code"=>"EU", "name"=>"Test1" },
595
- {"id"=>2, "fk_code"=>"EU", "name"=>"Test2" },
596
- {"id"=>3, "fk_code"=>"AU", "name"=>"Test3" },
597
- {"id"=>4, "fk_code"=>"GB", "name"=>"Test4" },
598
- {"id"=>5, "fk_code"=>"US", "name"=>"Test5" },
599
- {"id"=>6, "fk_code"=>nil, "name"=>"Test5" },
600
- ]
601
-
602
- map = {
603
- 'EU' => 1,
604
- 'AU' => { "name"=>"one" },
605
- 'US' => nil,
606
- 'GB' => "test!"
607
- }
608
-
609
- @generic_dal.add_field_from_map!(records, map, 'fk_field', 'fk_code')
610
-
611
- records.should eq [
612
- {"id"=>1, "fk_code"=>"EU", "name"=>"Test1", "fk_field"=>1 },
613
- {"id"=>2, "fk_code"=>"EU", "name"=>"Test2", "fk_field"=>1 },
614
- {"id"=>3, "fk_code"=>"AU", "name"=>"Test3", "fk_field"=>{ "name"=>"one" } },
615
- {"id"=>4, "fk_code"=>"GB", "name"=>"Test4", "fk_field"=>"test!" },
616
- {"id"=>5, "fk_code"=>"US", "name"=>"Test5", "fk_field"=>nil },
617
- {"id"=>6, "fk_code"=>nil, "name"=>"Test5" },
618
- ]
619
-
620
- end
621
- end
622
-
623
- describe '#get_relation_query_sql' do
624
- it 'should return the correct sql for a has_one relation with no query' do
625
-
626
- @generic_dal.table_name = "currencies"
627
-
628
- rel = {
629
- :type => :has_one,
630
- :table => 'countries',
631
- :table_key => 'default_currency_code',
632
- :this_key => 'code',
633
- :table_fields => 'code_alpha_2,name',
634
- }
635
-
636
- @generic_dal.get_relation_query_sql(rel,{}).should eq(
637
- "SELECT `a`.`code_alpha_2`,`a`.`name`,`b`.`code` AS `_table_key` FROM `countries` AS `a`, `currencies` AS `b` WHERE (`a`.`default_currency_code` = `b`.`code`)"
638
- )
639
-
640
- end
641
-
642
- it 'should return the correct sql for a has_one relation with a query' do
643
-
644
- @generic_dal.table_name = "currencies"
645
-
646
- rel = {
647
- :type => :has_one,
648
- :table => 'countries',
649
- :table_key => 'default_currency_code',
650
- :this_key => 'code',
651
- :table_fields => 'code_alpha_2,name',
652
- }
653
-
654
- @generic_dal.get_relation_query_sql(rel,{'testfield'=>1}).should eq(
655
- "SELECT `a`.`code_alpha_2`,`a`.`name`,`b`.`code` AS `_table_key` FROM `countries` AS `a`, `currencies` AS `b` WHERE (`a`.`default_currency_code` = `b`.`code`) AND (`b`.`testfield` = 1)"
656
- )
657
-
658
- end
659
-
660
- it 'should return the correct sql for a has_many relation' do
661
-
662
- @generic_dal.table_name = "houses"
663
-
664
- rel = {
665
- :type => :has_many,
666
- :table => 'cats',
667
- :table_key => 'house_id',
668
- :this_key => 'id',
669
- :table_fields => 'cat_id,name',
670
- }
671
-
672
- @generic_dal.get_relation_query_sql(rel,{}).should eq(
673
- "SELECT `a`.`cat_id`,`a`.`name`,`b`.`id` AS `_table_key` FROM `cats` AS `a`, `houses` AS `b` WHERE (`a`.`house_id` = `b`.`id`)"
674
- )
675
-
676
- end
677
-
678
- it 'should return the correct sql for a has_many relation with a query' do
679
-
680
- @generic_dal.table_name = "houses"
681
-
682
- rel = {
683
- :type => :has_many,
684
- :table => 'cats',
685
- :table_key => 'house_id',
686
- :this_key => 'id',
687
- :table_fields => 'cat_id,name',
688
- }
689
-
690
- @generic_dal.get_relation_query_sql(rel,{"colour"=>"ginger"}).should eq(
691
- "SELECT `a`.`cat_id`,`a`.`name`,`b`.`id` AS `_table_key` FROM `cats` AS `a`, `houses` AS `b` WHERE (`a`.`house_id` = `b`.`id`) AND (`b`.`colour` = 'ginger')"
692
- )
693
-
694
- end
695
-
696
- it 'should return the correct sql for a has_many_through relation' do
697
-
698
- @generic_dal.table_name = "countries"
699
-
700
- rel = {
701
- :type => :has_many_through,
702
- :table => 'regions',
703
- :link_table => 'region_countries',
704
- :link_key => 'country_code_alpha_2',
705
- :link_field => 'region_code',
706
- :table_key => 'code',
707
- :this_key => 'code_alpha_2',
708
- :table_fields => 'code,name',
709
- }
710
-
711
- @generic_dal.get_relation_query_sql(rel,{}).should eq(
712
- "SELECT `a`.`code`,`a`.`name`,`c`.`code_alpha_2` AS `_table_key` FROM `regions` AS `a`, `region_countries` AS `b`, `countries` AS `c` WHERE (`a`.`code` = `b`.`region_code` AND `b`.`country_code_alpha_2` = `c`.`code_alpha_2`)"
713
- )
714
-
715
- end
716
-
717
- it 'should return the correct sql for a has_many_through relation with a query' do
718
-
719
- @generic_dal.table_name = "countries"
720
-
721
- rel = {
722
- :type => :has_many_through,
723
- :table => 'regions',
724
- :link_table => 'region_countries',
725
- :link_key => 'country_code_alpha_2',
726
- :link_field => 'region_code',
727
- :table_key => 'code',
728
- :this_key => 'code_alpha_2',
729
- :table_fields => 'code,name',
730
- }
731
-
732
- @generic_dal.get_relation_query_sql(rel,{"default_currency_code"=>"EUR"}).should eq(
733
- "SELECT `a`.`code`,`a`.`name`,`c`.`code_alpha_2` AS `_table_key` FROM `regions` AS `a`, `region_countries` AS `b`, `countries` AS `c` WHERE (`a`.`code` = `b`.`region_code` AND `b`.`country_code_alpha_2` = `c`.`code_alpha_2`) AND (`c`.`default_currency_code` = 'EUR')"
734
- )
735
-
736
- end
737
- end
738
-
739
- describe "#get_relation_tables" do
740
- it 'should return the correct tables for a has_one relation' do
741
- @generic_dal.table_name = "currencies"
742
-
743
- rel = {
744
- :type => :has_one,
745
- :table => 'countries',
746
- :table_key => 'default_currency_code',
747
- :this_key => 'code',
748
- :table_fields => 'code_alpha_2,name',
749
- }
750
-
751
- @generic_dal.get_relation_tables(rel).should eq(["countries", "currencies"])
752
- end
753
-
754
- it 'should return the correct tables for a has_many relation' do
755
- @generic_dal.table_name = "houses"
756
-
757
- rel = {
758
- :type => :has_many,
759
- :table => 'cats',
760
- :table_key => 'house_id',
761
- :this_key => 'id',
762
- :table_fields => 'cat_id,name',
763
- }
764
-
765
- @generic_dal.get_relation_tables(rel).should eq(["cats", "houses"])
766
- end
767
-
768
- it 'should return the correct tables for a has_many_through relation' do
769
- @generic_dal.table_name = "countries"
770
-
771
- rel = {
772
- :type => :has_many_through,
773
- :table => 'regions',
774
- :link_table => 'region_countries',
775
- :link_key => 'country_code_alpha_2',
776
- :link_field => 'region_code',
777
- :table_key => 'code',
778
- :this_key => 'code_alpha_2',
779
- :table_fields => 'code,name',
780
- }
781
-
782
- @generic_dal.get_relation_tables(rel).should eq(["countries","region_countries","regions"])
783
- end
784
- end
785
-
786
- describe '#expire_table_cache' do
787
- it 'should set a table version when it doesnt exist' do
788
-
789
- @mock_memcache.should_receive(:get).ordered.with("prefix-testtable-version").and_return(nil)
790
- @mock_memcache.should_receive(:set).ordered.with("prefix-testtable-version",1,nil,{:raw=>true}).and_return(nil)
791
-
792
- @generic_dal.expire_table_cache(['testtable'])
793
- end
794
-
795
- it 'should increment a table version when it exists' do
796
-
797
- @mock_memcache.should_receive(:get).ordered.with("prefix-testtable-version").and_return(1)
798
- @mock_memcache.should_receive(:incr).ordered.with("prefix-testtable-version",1,nil).and_return(nil)
799
-
800
- @generic_dal.expire_table_cache(['testtable'])
801
- end
802
-
803
- it 'should expire multiple tables' do
804
-
805
- @mock_memcache.should_receive(:get).ordered.with("prefix-testtable-version").and_return(1)
806
- @mock_memcache.should_receive(:incr).ordered.with("prefix-testtable-version",1,nil).and_return(nil)
807
- @mock_memcache.should_receive(:get).ordered.with("prefix-tabletwo-version").and_return(1)
808
- @mock_memcache.should_receive(:incr).ordered.with("prefix-tabletwo-version",1,nil).and_return(nil)
809
-
810
- @generic_dal.expire_table_cache(['testtable','tabletwo'])
811
- end
812
- end
813
-
814
- describe '#exists_by_primary_key?' do
815
- before do
816
- memcache_null(@mock_memcache)
817
-
818
- @generic_dal.table_name = 'pktesttable'
819
- @generic_dal.primary_key = 'id'
820
-
821
- @mock_result = mysql_result_mock([ { "c" => 1 } ])
822
- end
823
-
824
- it 'should call cached_query with correct sql with a numeric primary key' do
825
- @mock_mysql.should_receive(:query).with("SELECT COUNT(*) AS `c` FROM `pktesttable` WHERE (`id` = 2002)").and_return(@mock_result)
826
-
827
- @generic_dal.exists_by_primary_key?(2002).should eq(true)
828
- end
829
-
830
- it 'should call cached_query with correct sql with a string primary key' do
831
- @mock_mysql.should_receive(:query).with("SELECT COUNT(*) AS `c` FROM `pktesttable` WHERE (`id` = 'test')").and_return(@mock_result)
832
-
833
- @generic_dal.exists_by_primary_key?('test').should eq(true)
834
- end
835
-
836
- it 'should return true when count is not 0' do
837
- @mock_result = mysql_result_mock([ { "c" => 1 } ])
838
-
839
- @mock_mysql.should_receive(:query).with("SELECT COUNT(*) AS `c` FROM `pktesttable` WHERE (`id` = 'test')").and_return(@mock_result)
840
-
841
- @generic_dal.exists_by_primary_key?('test').should eq(true)
842
- end
843
-
844
- it 'should return false when count is 0' do
845
- @mock_result = mysql_result_mock([ { "c" => 0 } ])
846
-
847
- @mock_mysql.should_receive(:query).with("SELECT COUNT(*) AS `c` FROM `pktesttable` WHERE (`id` = 'test')").and_return(@mock_result)
848
-
849
- @generic_dal.exists_by_primary_key?('test').should eq(false)
850
- end
851
- end
852
-
853
- describe '#valid_insert?' do
854
- it 'should return false if object nil' do
855
- @generic_dal.valid_insert?(nil).should eq(false)
856
- end
857
-
858
- it 'should return false if object empty' do
859
- @generic_dal.valid_insert?({}).should eq(false)
860
- end
861
-
862
- it 'should return true if all fields exist' do
863
- @generic_dal.fields = {
864
- "one" => { :type=>:string },
865
- "two" => { :type=>:string },
866
- }
867
-
868
- @generic_dal.valid_insert?({ "one"=>"1", "two"=>"2" }).should eq(true)
869
- end
870
-
871
- it 'should return false if fields do not exist' do
872
- @generic_dal.fields = {
873
- "one" => { :type=>:string },
874
- "two" => { :type=>:string },
875
- }
876
-
877
- @generic_dal.valid_insert?({ "five"=>"1", "two"=>"2" }).should eq(false)
878
- end
879
-
880
- it 'should return true if data is within the max length' do
881
- @generic_dal.fields = {
882
- "one" => { :type=>:string },
883
- "two" => { :type=>:string, :length=>4 },
884
- }
885
-
886
- @generic_dal.valid_insert?({ "one"=>"1", "two"=>"2" }).should eq(true)
887
- end
888
-
889
- it 'should return false if data is greater than the max length' do
890
- @generic_dal.fields = {
891
- "one" => { :type=>:string },
892
- "two" => { :type=>:string, :length=>4 },
893
- }
894
-
895
- @generic_dal.valid_insert?({ "one"=>"1", "two"=>"22332" }).should eq(false)
896
- end
897
-
898
- it 'should return false if required key is missing' do
899
- @generic_dal.fields = {
900
- "one" => { :type=>:string },
901
- "two" => { :type=>:string, :required=>true },
902
- }
903
-
904
- @generic_dal.valid_insert?({ "one"=>"1" }).should eq(false)
905
- end
906
-
907
- it 'should return true if required keys are ok' do
908
- @generic_dal.fields = {
909
- "one" => { :type=>:string, :required=>true },
910
- "two" => { :type=>:string, :required=>true },
911
- }
912
-
913
- @generic_dal.valid_insert?({ "one"=>"1","two"=>"2" }).should eq(true)
914
- end
915
- end
916
-
917
- describe '#valid_update?' do
918
- it 'should return false if object nil' do
919
- @generic_dal.valid_update?(nil).should eq(false)
920
- end
921
-
922
- it 'should return false if object empty' do
923
- @generic_dal.valid_update?({}).should eq(false)
924
- end
925
-
926
- it 'should return true if all fields exist' do
927
- @generic_dal.fields = {
928
- "one" => { :type=>:string },
929
- "two" => { :type=>:string },
930
- }
931
-
932
- @generic_dal.valid_update?({ "one"=>"1", "two"=>"2" }).should eq(true)
933
- end
934
-
935
- it 'should return false if fields do not exist' do
936
- @generic_dal.fields = {
937
- "one" => { :type=>:string },
938
- "two" => { :type=>:string },
939
- }
940
-
941
- @generic_dal.valid_update?({ "five"=>"1", "two"=>"2" }).should eq(false)
942
- end
943
-
944
- it 'should return false if data is greater than the max length' do
945
- @generic_dal.fields = {
946
- "one" => { :type=>:string },
947
- "two" => { :type=>:string, :length=>4 },
948
- }
949
-
950
- @generic_dal.valid_update?({ "one"=>"1", "two"=>"22332" }).should eq(false)
951
- end
952
- end
953
-
954
- describe "#escape_value" do
955
- it 'should return NULL for nil' do
956
- @generic_dal.escape_value(nil).should eq('NULL')
957
- end
958
-
959
- it 'should return integer for int/float' do
960
- @generic_dal.escape_value(1).should eq('1')
961
- @generic_dal.escape_value(1.45).should eq('1.45')
962
- end
963
-
964
- it 'should return a quoted string for string' do
965
- @generic_dal.escape_value('test').should eq("'test'")
966
- end
967
-
968
- it 'should escape sql values properly' do
969
- @generic_dal.escape_value("test '; DROP TABLE test; --").should eq("'test \\'; DROP TABLE test; --'")
970
- end
971
- end
972
-
973
- describe "#build_insert" do
974
- it 'should return correct SQL fragment for basic fields' do
975
- data = {
976
- "one" => 1,
977
- "two" => "2",
978
- "three" => nil,
979
- }
980
-
981
- @generic_dal.build_insert(data).should eq("(`one`, `two`, `three`) VALUES (1, '2', NULL)")
982
- end
983
-
984
- it 'should escape field names and data' do
985
- data = {
986
- "one`; DROP TABLE test; -- " => 1,
987
- "two" => "two",
988
- "three" => "'; DROP TABLE test; --'",
989
- }
990
-
991
- @generic_dal.build_insert(data).should eq("(`one; DROP TABLE test; -- `, `two`, `three`) VALUES (1, 'two', '\\'; DROP TABLE test; --\\'')")
992
- end
993
- end
994
-
995
- describe "#build_update" do
996
- it 'should return correct SQL fragment for basic fields' do
997
- data = {
998
- "one" => 1,
999
- "two" => "two",
1000
- "three" => nil,
1001
- }
1002
-
1003
- @generic_dal.build_update(data).should eq("`one` = 1, `two` = 'two', `three` = NULL")
1004
- end
1005
-
1006
- it 'should escape field names and data' do
1007
- data = {
1008
- "one`; DROP TABLE test; -- " => 1,
1009
- "two" => "2",
1010
- "three" => "'; DROP TABLE test; --'",
1011
- }
1012
-
1013
- @generic_dal.build_update(data).should eq("`one; DROP TABLE test; -- ` = 1, `two` = '2', `three` = '\\'; DROP TABLE test; --\\''")
1014
- end
1015
- end
1016
-
1017
- describe "#get_all_related_tables" do
1018
- it 'should return the table name for nil relations' do
1019
- @generic_dal.table_name = 'test1'
1020
-
1021
- @generic_dal.relations = nil
1022
-
1023
- @generic_dal.get_all_related_tables.should eq(["test1"])
1024
- end
1025
-
1026
- it 'should return the table name for empty relations' do
1027
- @generic_dal.table_name = 'test1'
1028
-
1029
- @generic_dal.relations = {}
1030
-
1031
- @generic_dal.get_all_related_tables.should eq(["test1"])
1032
- end
1033
-
1034
- it 'should return the table name for a single relations' do
1035
- @generic_dal.table_name = 'test1'
1036
-
1037
- @generic_dal.relations = {
1038
- 'countries' => {
1039
- :type => :has_one,
1040
- :table => 'countries',
1041
- :table_key => 'default_currency_code',
1042
- :this_key => 'code',
1043
- :table_fields => 'code_alpha_2,name',
1044
- },
1045
- }
1046
-
1047
- @generic_dal.get_all_related_tables.should eq(["countries","test1"])
1048
- end
1049
-
1050
-
1051
- it 'should return the correct table names for multiple relations with dedupe' do
1052
- @generic_dal.table_name = 'test1'
1053
-
1054
- @generic_dal.relations = {
1055
- 'countries' => {
1056
- :type => :has_one,
1057
- :table => 'countries',
1058
- :table_key => 'default_currency_code',
1059
- :this_key => 'code',
1060
- :table_fields => 'code_alpha_2,name',
1061
- },
1062
- 'countries2' => {
1063
- :type => :has_many,
1064
- :table => 'countries',
1065
- :table_key => 'default_currency_code',
1066
- :this_key => 'code',
1067
- :table_fields => 'code_alpha_2,name',
1068
- },
1069
- 'regions' => {
1070
- :type => :has_many_through,
1071
- :table => 'regions',
1072
- :link_table => 'region_countries',
1073
- :link_key => 'country_code_alpha_2',
1074
- :link_field => 'region_code',
1075
- :table_key => 'code',
1076
- :this_key => 'code_alpha_2',
1077
- :table_fields => 'code,name',
1078
- }
1079
- }
1080
-
1081
- @generic_dal.get_all_related_tables.should eq(["countries", "region_countries", "regions", "test1"])
1082
- end
1083
- end
1084
-
1085
- describe '#insert' do
1086
- it 'should call the correct sql and expire the correct cache' do
1087
- testdata = { "field_one" => "one" }
1088
-
1089
- @generic_dal.table_name = "test_table"
1090
- @generic_dal.fields = {
1091
- "field_one" => { :type => :integer }
1092
- }
1093
- @generic_dal.auto_primary_key = false
1094
-
1095
- query = "INSERT INTO `test_table` (`field_one`) VALUES ('one')"
1096
-
1097
- @mock_mysql.should_receive(:query).ordered.with(query)
1098
- @mock_mysql.should_not_receive(:last_id)
1099
-
1100
- @mock_memcache.should_receive(:get).ordered.with('prefix-test_table-version').and_return(1)
1101
- @mock_memcache.should_receive(:incr).ordered.with('prefix-test_table-version',1,nil)
1102
-
1103
- @mock_memcache.should_receive(:get).ordered.with('prefix-test_table-version').and_return(1)
1104
- @mock_memcache.should_receive(:get).ordered.and_return([{ "field_one" => "one","id"=>1 }])
1105
-
1106
- @generic_dal.insert(testdata)
1107
- end
1108
-
1109
- it 'should call last_id when auto_primary_key is true' do
1110
- testdata = { "field_one" => "one" }
1111
-
1112
- @generic_dal.table_name = "test_table"
1113
- @generic_dal.fields = {
1114
- "field_one" => { :type => :integer }
1115
- }
1116
- @generic_dal.auto_primary_key = true
1117
-
1118
- query = "INSERT INTO `test_table` (`field_one`) VALUES ('one')"
1119
-
1120
- @mock_mysql.should_receive(:query).ordered.with(query)
1121
- @mock_mysql.should_receive(:last_id)
1122
-
1123
- @mock_memcache.should_receive(:get).ordered.with('prefix-test_table-version').and_return(1)
1124
- @mock_memcache.should_receive(:incr).ordered.with('prefix-test_table-version',1,nil)
1125
-
1126
- @mock_memcache.should_receive(:get).ordered.with('prefix-test_table-version').and_return(1)
1127
- @mock_memcache.should_receive(:get).ordered.and_return([{ "field_one" => "one","id"=>1 }])
1128
- @mock_memcache.should_not_receive(:last_id)
1129
-
1130
- @generic_dal.insert(testdata)
1131
- end
1132
- end
1133
-
1134
- describe '#update_by_primary_key' do
1135
- it 'should call the correct sql and expire the correct cache' do
1136
- testdata = { "field_one" => "two" }
1137
-
1138
- @generic_dal.table_name = "test_table"
1139
- @generic_dal.primary_key = "code"
1140
- @generic_dal.fields = {
1141
- "field_one" => { :type => :integer }
1142
- }
1143
-
1144
- query = "UPDATE `test_table` SET `field_one` = 'two' WHERE (`code` = 2)"
1145
-
1146
- @mock_mysql.should_receive(:query).ordered.with(query)
1147
-
1148
- @mock_memcache.should_receive(:get).ordered.with('prefix-test_table-version').and_return(1)
1149
- @mock_memcache.should_receive(:incr).ordered.with('prefix-test_table-version',1,nil)
1150
-
1151
- @mock_memcache.should_receive(:get).ordered.with('prefix-test_table-version').and_return(1)
1152
- @mock_memcache.should_receive(:get).ordered.and_return([{ "field_one" => "two","id"=>2}])
1153
-
1154
- @generic_dal.update_by_primary_key(2, testdata)
1155
- end
1156
- end
1157
-
1158
- describe '#delete_by_primary_key' do
1159
- it 'should call the correct sql and expire the correct cache' do
1160
-
1161
- @generic_dal.table_name = "test_table"
1162
- @generic_dal.primary_key = "code"
1163
-
1164
- query = "DELETE FROM `test_table` WHERE (`code` = 'three')"
1165
-
1166
- @mock_mysql.should_receive(:query).ordered.with(query)
1167
- @mock_memcache.should_receive(:get).ordered.with('prefix-test_table-version').and_return(1)
1168
- @mock_memcache.should_receive(:incr).ordered.with('prefix-test_table-version',1,nil)
1169
-
1170
- @generic_dal.delete_by_primary_key('three')
1171
- end
1172
- end
1173
-
1174
- end