counter_culture 2.2.2 → 2.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +65 -0
  3. data/.travis.yml +23 -6
  4. data/Appraisals +22 -0
  5. data/CHANGELOG.md +8 -0
  6. data/Gemfile +6 -45
  7. data/README.md +2 -2
  8. data/Rakefile +7 -35
  9. data/counter_culture.gemspec +40 -175
  10. data/gemfiles/rails_4.2.gemfile +10 -0
  11. data/gemfiles/rails_5.0.gemfile +10 -0
  12. data/gemfiles/rails_5.1.gemfile +10 -0
  13. data/gemfiles/rails_5.2.gemfile +10 -0
  14. data/gemfiles/rails_6.0.0.rc1.gemfile +10 -0
  15. data/lib/counter_culture.rb +1 -0
  16. data/lib/counter_culture/counter.rb +11 -3
  17. data/lib/counter_culture/version.rb +3 -0
  18. data/run_tests_locally.sh +18 -0
  19. metadata +88 -122
  20. data/VERSION +0 -1
  21. data/spec/counter_culture_spec.rb +0 -2282
  22. data/spec/models/another_post.rb +0 -13
  23. data/spec/models/another_post_comment.rb +0 -4
  24. data/spec/models/candidate.rb +0 -3
  25. data/spec/models/candidate_profile.rb +0 -3
  26. data/spec/models/categ.rb +0 -13
  27. data/spec/models/category.rb +0 -3
  28. data/spec/models/company.rb +0 -11
  29. data/spec/models/conditional_dependent.rb +0 -7
  30. data/spec/models/conditional_main.rb +0 -3
  31. data/spec/models/conversation.rb +0 -4
  32. data/spec/models/has_non_pk_id.rb +0 -4
  33. data/spec/models/has_string_id.rb +0 -4
  34. data/spec/models/industry.rb +0 -2
  35. data/spec/models/person.rb +0 -4
  36. data/spec/models/poly_employee.rb +0 -3
  37. data/spec/models/poly_image.rb +0 -15
  38. data/spec/models/poly_product.rb +0 -4
  39. data/spec/models/post.rb +0 -10
  40. data/spec/models/post_comment.rb +0 -6
  41. data/spec/models/product.rb +0 -9
  42. data/spec/models/review.rb +0 -34
  43. data/spec/models/simple_dependent.rb +0 -5
  44. data/spec/models/simple_main.rb +0 -7
  45. data/spec/models/simple_review.rb +0 -3
  46. data/spec/models/soft_delete_discard.rb +0 -7
  47. data/spec/models/soft_delete_paranoia.rb +0 -7
  48. data/spec/models/subcateg.rb +0 -14
  49. data/spec/models/transaction.rb +0 -15
  50. data/spec/models/twitter_review.rb +0 -6
  51. data/spec/models/user.rb +0 -46
  52. data/spec/models/with_module/model1.rb +0 -8
  53. data/spec/models/with_module/model2.rb +0 -7
  54. data/spec/rails_app/.gitignore +0 -15
  55. data/spec/rails_app/Gemfile +0 -41
  56. data/spec/rails_app/README.rdoc +0 -261
  57. data/spec/rails_app/Rakefile +0 -7
  58. data/spec/rails_app/app/assets/images/rails.png +0 -0
  59. data/spec/rails_app/app/assets/javascripts/application.js +0 -15
  60. data/spec/rails_app/app/assets/stylesheets/application.css +0 -13
  61. data/spec/rails_app/app/controllers/application_controller.rb +0 -3
  62. data/spec/rails_app/app/helpers/application_helper.rb +0 -2
  63. data/spec/rails_app/app/mailers/.gitkeep +0 -0
  64. data/spec/rails_app/app/models/.gitkeep +0 -0
  65. data/spec/rails_app/app/views/layouts/application.html.erb +0 -14
  66. data/spec/rails_app/config.ru +0 -4
  67. data/spec/rails_app/config/application.rb +0 -62
  68. data/spec/rails_app/config/boot.rb +0 -6
  69. data/spec/rails_app/config/database.yml +0 -25
  70. data/spec/rails_app/config/environment.rb +0 -5
  71. data/spec/rails_app/config/environments/development.rb +0 -32
  72. data/spec/rails_app/config/environments/test.rb +0 -31
  73. data/spec/rails_app/config/initializers/backtrace_silencers.rb +0 -7
  74. data/spec/rails_app/config/initializers/inflections.rb +0 -15
  75. data/spec/rails_app/config/initializers/mime_types.rb +0 -5
  76. data/spec/rails_app/config/initializers/paper_trail.rb +0 -1
  77. data/spec/rails_app/config/initializers/secret_token.rb +0 -12
  78. data/spec/rails_app/config/initializers/session_store.rb +0 -8
  79. data/spec/rails_app/config/initializers/wrap_parameters.rb +0 -14
  80. data/spec/rails_app/config/locales/en.yml +0 -5
  81. data/spec/rails_app/config/routes.rb +0 -58
  82. data/spec/rails_app/db/seeds.rb +0 -7
  83. data/spec/rails_app/lib/assets/.gitkeep +0 -0
  84. data/spec/rails_app/lib/tasks/.gitkeep +0 -0
  85. data/spec/rails_app/log/.gitkeep +0 -0
  86. data/spec/rails_app/public/404.html +0 -26
  87. data/spec/rails_app/public/422.html +0 -26
  88. data/spec/rails_app/public/500.html +0 -25
  89. data/spec/rails_app/public/favicon.ico +0 -0
  90. data/spec/rails_app/public/index.html +0 -241
  91. data/spec/rails_app/public/robots.txt +0 -5
  92. data/spec/rails_app/script/rails +0 -6
  93. data/spec/rails_app/test/fixtures/.gitkeep +0 -0
  94. data/spec/rails_app/test/functional/.gitkeep +0 -0
  95. data/spec/rails_app/test/integration/.gitkeep +0 -0
  96. data/spec/rails_app/test/performance/browsing_test.rb +0 -12
  97. data/spec/rails_app/test/test_helper.rb +0 -13
  98. data/spec/rails_app/test/unit/.gitkeep +0 -0
  99. data/spec/rails_app/vendor/assets/javascripts/.gitkeep +0 -0
  100. data/spec/rails_app/vendor/assets/stylesheets/.gitkeep +0 -0
  101. data/spec/rails_app/vendor/plugins/.gitkeep +0 -0
  102. data/spec/schema.rb +0 -255
  103. data/spec/spec_helper.rb +0 -32
  104. data/test_rails_versions.sh +0 -26
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 2.2.2
@@ -1,2282 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- require 'models/company'
4
- require 'models/industry'
5
- require 'models/product'
6
- require 'models/review'
7
- require 'models/simple_review'
8
- require 'models/twitter_review'
9
- require 'models/user'
10
- require 'models/category'
11
- require 'models/has_string_id'
12
- require 'models/has_non_pk_id'
13
- require 'models/simple_main'
14
- require 'models/simple_dependent'
15
- require 'models/conditional_main'
16
- require 'models/conditional_dependent'
17
- require 'models/post'
18
- require 'models/post_comment'
19
- require 'models/categ'
20
- require 'models/subcateg'
21
- require 'models/another_post'
22
- require 'models/another_post_comment'
23
- require 'models/person'
24
- require 'models/transaction'
25
- require 'models/soft_delete_discard'
26
- require 'models/soft_delete_paranoia'
27
- require 'models/conversation'
28
- require 'models/candidate_profile'
29
- require 'models/candidate'
30
- require 'models/with_module/model1'
31
- require 'models/with_module/model2'
32
-
33
- require 'database_cleaner'
34
- DatabaseCleaner.strategy = :deletion
35
-
36
- describe "CounterCulture" do
37
- before(:each) do
38
- DatabaseCleaner.clean
39
- end
40
-
41
- it "should use relation foreign_key correctly" do
42
- post = AnotherPost.new
43
- comment = post.comments.build
44
- comment.comment = 'Comment'
45
- post.save!
46
- post.reload
47
- expect(post.another_post_comments_count).to eq(1)
48
- end
49
-
50
- it "should fix counts using relation foreign_key correctly" do
51
- post = AnotherPost.new
52
- comment = post.comments.build
53
- comment.comment = 'Comment'
54
- post.save!
55
- post.reload
56
- expect(post.another_post_comments_count).to eq(1)
57
- expect(post.comments.size).to eq(1)
58
-
59
- post.another_post_comments_count = 2
60
- post.save!
61
-
62
- fixed = AnotherPostComment.counter_culture_fix_counts
63
- expect(fixed.length).to eq(1)
64
-
65
- post.reload
66
- expect(post.another_post_comments_count).to eq(1)
67
- end
68
-
69
- it "increments counter cache on create" do
70
- user = User.create
71
- product = Product.create
72
-
73
- expect(user.reviews_count).to eq(0)
74
- expect(product.reviews_count).to eq(0)
75
- expect(user.review_approvals_count).to eq(0)
76
-
77
- user.reviews.create :user_id => user.id, :product_id => product.id, :approvals => 13
78
-
79
- user.reload
80
- product.reload
81
-
82
- expect(user.reviews_count).to eq(1)
83
- expect(user.review_approvals_count).to eq(13)
84
- expect(product.reviews_count).to eq(1)
85
- end
86
-
87
- it "decrements counter cache on destroy" do
88
- user = User.create
89
- product = Product.create
90
-
91
- expect(user.reviews_count).to eq(0)
92
- expect(product.reviews_count).to eq(0)
93
- expect(user.review_approvals_count).to eq(0)
94
-
95
- review = Review.create :user_id => user.id, :product_id => product.id, :approvals => 69
96
-
97
- user.reload
98
- product.reload
99
-
100
- expect(user.reviews_count).to eq(1)
101
- expect(product.reviews_count).to eq(1)
102
- expect(user.review_approvals_count).to eq(69)
103
-
104
- review.destroy
105
-
106
- user.reload
107
- product.reload
108
-
109
- expect(user.reviews_count).to eq(0)
110
- expect(user.review_approvals_count).to eq(0)
111
- expect(product.reviews_count).to eq(0)
112
- end
113
-
114
- it "updates counter cache on update" do
115
- user1 = User.create
116
- user2 = User.create
117
- product = Product.create
118
-
119
- expect(user1.reviews_count).to eq(0)
120
- expect(user2.reviews_count).to eq(0)
121
- expect(product.reviews_count).to eq(0)
122
- expect(user1.review_approvals_count).to eq(0)
123
- expect(user2.review_approvals_count).to eq(0)
124
-
125
- review = Review.create :user_id => user1.id, :product_id => product.id, :approvals => 42
126
-
127
- user1.reload
128
- user2.reload
129
- product.reload
130
-
131
- expect(user1.reviews_count).to eq(1)
132
- expect(user2.reviews_count).to eq(0)
133
- expect(product.reviews_count).to eq(1)
134
- expect(user1.review_approvals_count).to eq(42)
135
- expect(user2.review_approvals_count).to eq(0)
136
-
137
- review.user = user2
138
- review.save!
139
-
140
- user1.reload
141
- user2.reload
142
- product.reload
143
-
144
- expect(user1.reviews_count).to eq(0)
145
- expect(user2.reviews_count).to eq(1)
146
- expect(product.reviews_count).to eq(1)
147
- expect(user1.review_approvals_count).to eq(0)
148
- expect(user2.review_approvals_count).to eq(42)
149
-
150
- review.update_attribute(:approvals, 69)
151
- expect(user2.reload.review_approvals_count).to eq(69)
152
- end
153
-
154
- it "works with multiple saves in one transcation" do
155
- user = User.create
156
- product = Product.create
157
-
158
- expect(user.reviews_count).to eq(0)
159
- expect(user.review_approvals_count).to eq(0)
160
-
161
- Review.transaction do
162
- review1 = Review.create!(user_id: user.id, product_id: product.id, approvals: 0)
163
-
164
- user.reload
165
- expect(user.reviews_count).to eq(1)
166
- expect(user.review_approvals_count).to eq(0)
167
-
168
- review1.update_attributes!(approvals: 42)
169
-
170
- user.reload
171
- expect(user.reviews_count).to eq(1)
172
- expect(user.review_approvals_count).to eq(42)
173
-
174
- review2 = Review.create!(user_id: user.id, product_id: product.id, approvals: 1)
175
-
176
- user.reload
177
- expect(user.reviews_count).to eq(2)
178
- expect(user.review_approvals_count).to eq(43)
179
- end
180
- end
181
-
182
- it "treats null delta column values as 0" do
183
- user = User.create
184
- product = Product.create
185
-
186
- expect(user.reviews_count).to eq(0)
187
- expect(product.reviews_count).to eq(0)
188
- expect(user.review_approvals_count).to eq(0)
189
-
190
- review = Review.create :user_id => user.id, :product_id => product.id, :approvals => nil
191
-
192
- user.reload
193
- product.reload
194
-
195
- expect(user.reviews_count).to eq(1)
196
- expect(user.review_approvals_count).to eq(0)
197
- expect(product.reviews_count).to eq(1)
198
- end
199
-
200
- it "increments second-level counter cache on create" do
201
- company = Company.create
202
- user = User.create :manages_company_id => company.id
203
- product = Product.create
204
-
205
- expect(company.reviews_count).to eq(0)
206
- expect(user.reviews_count).to eq(0)
207
- expect(product.reviews_count).to eq(0)
208
- expect(company.review_approvals_count).to eq(0)
209
-
210
- review = Review.create :user_id => user.id, :product_id => product.id, :approvals => 314
211
-
212
- company.reload
213
- user.reload
214
- product.reload
215
-
216
- expect(company.reviews_count).to eq(1)
217
- expect(company.review_approvals_count).to eq(314)
218
- expect(user.reviews_count).to eq(1)
219
- expect(product.reviews_count).to eq(1)
220
- end
221
-
222
- it "decrements second-level counter cache on destroy" do
223
- company = Company.create
224
- user = User.create :manages_company_id => company.id
225
- product = Product.create
226
-
227
- expect(company.reviews_count).to eq(0)
228
- expect(user.reviews_count).to eq(0)
229
- expect(product.reviews_count).to eq(0)
230
- expect(company.review_approvals_count).to eq(0)
231
-
232
- review = Review.create :user_id => user.id, :product_id => product.id, :approvals => 314
233
-
234
- user.reload
235
- product.reload
236
- company.reload
237
-
238
- expect(user.reviews_count).to eq(1)
239
- expect(product.reviews_count).to eq(1)
240
- expect(company.reviews_count).to eq(1)
241
- expect(company.review_approvals_count).to eq(314)
242
-
243
- review.destroy
244
-
245
- user.reload
246
- product.reload
247
- company.reload
248
-
249
- expect(user.reviews_count).to eq(0)
250
- expect(product.reviews_count).to eq(0)
251
- expect(company.reviews_count).to eq(0)
252
- expect(company.review_approvals_count).to eq(0)
253
- end
254
-
255
- it "updates second-level counter cache on update" do
256
- company1 = Company.create
257
- company2 = Company.create
258
- user1 = User.create :manages_company_id => company1.id
259
- user2 = User.create :manages_company_id => company2.id
260
- product = Product.create
261
-
262
- expect(user1.reviews_count).to eq(0)
263
- expect(user2.reviews_count).to eq(0)
264
- expect(company1.reviews_count).to eq(0)
265
- expect(company2.reviews_count).to eq(0)
266
- expect(product.reviews_count).to eq(0)
267
- expect(company1.review_approvals_count).to eq(0)
268
- expect(company2.review_approvals_count).to eq(0)
269
-
270
- review = Review.create :user_id => user1.id, :product_id => product.id, :approvals => 69
271
-
272
- user1.reload
273
- user2.reload
274
- company1.reload
275
- company2.reload
276
- product.reload
277
-
278
- expect(user1.reviews_count).to eq(1)
279
- expect(user2.reviews_count).to eq(0)
280
- expect(company1.reviews_count).to eq(1)
281
- expect(company2.reviews_count).to eq(0)
282
- expect(product.reviews_count).to eq(1)
283
- expect(company1.review_approvals_count).to eq(69)
284
- expect(company2.review_approvals_count).to eq(0)
285
-
286
- review.user = user2
287
- review.save!
288
-
289
- user1.reload
290
- user2.reload
291
- company1.reload
292
- company2.reload
293
- product.reload
294
-
295
- expect(user1.reviews_count).to eq(0)
296
- expect(user2.reviews_count).to eq(1)
297
- expect(company1.reviews_count).to eq(0)
298
- expect(company2.reviews_count).to eq(1)
299
- expect(product.reviews_count).to eq(1)
300
- expect(company1.review_approvals_count).to eq(0)
301
- expect(company2.review_approvals_count).to eq(69)
302
-
303
- review.update_attribute(:approvals, 42)
304
- expect(company2.reload.review_approvals_count).to eq(42)
305
- end
306
-
307
- it "increments custom counter cache column on create" do
308
- user = User.create
309
- product = Product.create
310
-
311
- expect(product.rexiews_count).to eq(0)
312
-
313
- review = Review.create :user_id => user.id, :product_id => product.id
314
-
315
- product.reload
316
-
317
- expect(product.rexiews_count).to eq(1)
318
- end
319
-
320
- it "decrements custom counter cache column on destroy" do
321
- user = User.create
322
- product = Product.create
323
-
324
- expect(product.rexiews_count).to eq(0)
325
-
326
- review = Review.create :user_id => user.id, :product_id => product.id
327
-
328
- product.reload
329
-
330
- expect(product.rexiews_count).to eq(1)
331
-
332
- review.destroy
333
-
334
- product.reload
335
-
336
- expect(product.rexiews_count).to eq(0)
337
- end
338
-
339
- it "updates custom counter cache column on update" do
340
- user = User.create
341
- product1 = Product.create
342
- product2 = Product.create
343
-
344
- expect(product1.rexiews_count).to eq(0)
345
- expect(product2.rexiews_count).to eq(0)
346
-
347
- review = Review.create :user_id => user.id, :product_id => product1.id
348
-
349
- product1.reload
350
- product2.reload
351
-
352
- expect(product1.rexiews_count).to eq(1)
353
- expect(product2.rexiews_count).to eq(0)
354
-
355
- review.product = product2
356
- review.save!
357
-
358
- product1.reload
359
- product2.reload
360
-
361
- expect(product1.rexiews_count).to eq(0)
362
- expect(product2.rexiews_count).to eq(1)
363
- end
364
-
365
- it "handles nil column name in custom counter cache on create" do
366
- user = User.create
367
- product = Product.create
368
-
369
- expect(user.using_count).to eq(0)
370
- expect(user.tried_count).to eq(0)
371
-
372
- review = Review.create :user_id => user.id, :product_id => product.id, :review_type => nil
373
-
374
- user.reload
375
-
376
- expect(user.using_count).to eq(0)
377
- expect(user.tried_count).to eq(0)
378
- end
379
-
380
- it "handles nil column name in custom counter cache on destroy" do
381
- user = User.create
382
- product = Product.create
383
-
384
- expect(user.using_count).to eq(0)
385
- expect(user.tried_count).to eq(0)
386
-
387
- review = Review.create :user_id => user.id, :product_id => product.id, :review_type => nil
388
-
389
- product.reload
390
-
391
- expect(user.using_count).to eq(0)
392
- expect(user.tried_count).to eq(0)
393
-
394
- review.destroy
395
-
396
- product.reload
397
-
398
- expect(user.using_count).to eq(0)
399
- expect(user.tried_count).to eq(0)
400
- end
401
-
402
- it "handles nil column name in custom counter cache on update" do
403
- product = Product.create
404
- user1 = User.create
405
- user2 = User.create
406
-
407
- expect(user1.using_count).to eq(0)
408
- expect(user1.tried_count).to eq(0)
409
- expect(user2.using_count).to eq(0)
410
- expect(user2.tried_count).to eq(0)
411
-
412
- review = Review.create :user_id => user1.id, :product_id => product.id, :review_type => nil
413
-
414
- user1.reload
415
- user2.reload
416
-
417
- expect(user1.using_count).to eq(0)
418
- expect(user1.tried_count).to eq(0)
419
- expect(user2.using_count).to eq(0)
420
- expect(user2.tried_count).to eq(0)
421
-
422
- review.user = user2
423
- review.save!
424
-
425
- user1.reload
426
- user2.reload
427
-
428
- expect(user1.using_count).to eq(0)
429
- expect(user1.tried_count).to eq(0)
430
- expect(user2.using_count).to eq(0)
431
- expect(user2.tried_count).to eq(0)
432
- end
433
-
434
- describe "conditional counts on update" do
435
- let(:product) {Product.create!}
436
- let(:user) {User.create!}
437
-
438
- it "should increment and decrement if changing column name" do
439
- expect(user.using_count).to eq(0)
440
- expect(user.tried_count).to eq(0)
441
-
442
- review = Review.create :user_id => user.id, :product_id => product.id, :review_type => "using"
443
- user.reload
444
-
445
- expect(user.using_count).to eq(1)
446
- expect(user.tried_count).to eq(0)
447
-
448
- review.review_type = "tried"
449
- review.save!
450
-
451
- user.reload
452
-
453
- expect(user.using_count).to eq(0)
454
- expect(user.tried_count).to eq(1)
455
- end
456
-
457
- it "should increment if changing from a nil column name" do
458
- expect(user.using_count).to eq(0)
459
- expect(user.tried_count).to eq(0)
460
-
461
- review = Review.create :user_id => user.id, :product_id => product.id, :review_type => nil
462
- user.reload
463
-
464
- expect(user.using_count).to eq(0)
465
- expect(user.tried_count).to eq(0)
466
-
467
- review.review_type = "tried"
468
- review.save!
469
-
470
- user.reload
471
-
472
- expect(user.using_count).to eq(0)
473
- expect(user.tried_count).to eq(1)
474
- end
475
-
476
- it "should decrement if changing column name to nil" do
477
- expect(user.using_count).to eq(0)
478
- expect(user.tried_count).to eq(0)
479
-
480
- review = Review.create :user_id => user.id, :product_id => product.id, :review_type => "using"
481
- user.reload
482
-
483
- expect(user.using_count).to eq(1)
484
- expect(user.tried_count).to eq(0)
485
-
486
- review.review_type = nil
487
- review.save!
488
-
489
- user.reload
490
-
491
- expect(user.using_count).to eq(0)
492
- expect(user.tried_count).to eq(0)
493
- end
494
-
495
- it "should decrement if changing column name to nil without errors using default scope" do
496
- User.with_default_scope do
497
- expect(user.using_count).to eq(0)
498
- expect(user.tried_count).to eq(0)
499
-
500
- review = Review.create :user_id => user.id, :product_id => product.id, :review_type => "using"
501
- user.reload
502
-
503
- expect(user.using_count).to eq(1)
504
- expect(user.tried_count).to eq(0)
505
-
506
- review.review_type = nil
507
- review.save!
508
-
509
- user.reload
510
-
511
- expect(user.using_count).to eq(0)
512
- expect(user.tried_count).to eq(0)
513
- end
514
- end
515
- end
516
-
517
- it "increments third-level counter cache on create" do
518
- industry = Industry.create
519
- company = Company.create :industry_id => industry.id
520
- user = User.create :manages_company_id => company.id
521
- product = Product.create
522
-
523
- expect(industry.reviews_count).to eq(0)
524
- expect(industry.review_approvals_count).to eq(0)
525
- expect(company.reviews_count).to eq(0)
526
- expect(user.reviews_count).to eq(0)
527
- expect(product.reviews_count).to eq(0)
528
-
529
- review = Review.create :user_id => user.id, :product_id => product.id, :approvals => 42
530
-
531
- industry.reload
532
- company.reload
533
- user.reload
534
- product.reload
535
-
536
- expect(industry.reviews_count).to eq(1)
537
- expect(industry.review_approvals_count).to eq(42)
538
- expect(company.reviews_count).to eq(1)
539
- expect(user.reviews_count).to eq(1)
540
- expect(product.reviews_count).to eq(1)
541
- end
542
-
543
- it "decrements third-level counter cache on destroy" do
544
- industry = Industry.create
545
- company = Company.create :industry_id => industry.id
546
- user = User.create :manages_company_id => company.id
547
- product = Product.create
548
-
549
- expect(industry.reviews_count).to eq(0)
550
- expect(industry.review_approvals_count).to eq(0)
551
- expect(company.reviews_count).to eq(0)
552
- expect(user.reviews_count).to eq(0)
553
- expect(product.reviews_count).to eq(0)
554
-
555
- review = Review.create :user_id => user.id, :product_id => product.id, :approvals => 42
556
-
557
- industry.reload
558
- company.reload
559
- user.reload
560
- product.reload
561
-
562
- expect(industry.reviews_count).to eq(1)
563
- expect(industry.review_approvals_count).to eq(42)
564
- expect(company.reviews_count).to eq(1)
565
- expect(user.reviews_count).to eq(1)
566
- expect(product.reviews_count).to eq(1)
567
-
568
- review.destroy
569
-
570
- industry.reload
571
- company.reload
572
- user.reload
573
- product.reload
574
-
575
- expect(industry.reviews_count).to eq(0)
576
- expect(industry.review_approvals_count).to eq(0)
577
- expect(company.reviews_count).to eq(0)
578
- expect(user.reviews_count).to eq(0)
579
- expect(product.reviews_count).to eq(0)
580
- end
581
-
582
- it "updates third-level counter cache on update" do
583
- industry1 = Industry.create
584
- industry2 = Industry.create
585
- company1 = Company.create :industry_id => industry1.id
586
- company2 = Company.create :industry_id => industry2.id
587
- user1 = User.create :manages_company_id => company1.id
588
- user2 = User.create :manages_company_id => company2.id
589
- product = Product.create
590
-
591
- expect(industry1.reviews_count).to eq(0)
592
- expect(industry2.reviews_count).to eq(0)
593
- expect(company1.reviews_count).to eq(0)
594
- expect(company2.reviews_count).to eq(0)
595
- expect(user1.reviews_count).to eq(0)
596
- expect(user2.reviews_count).to eq(0)
597
- expect(industry1.review_approvals_count).to eq(0)
598
- expect(industry2.review_approvals_count).to eq(0)
599
-
600
- review = Review.create :user_id => user1.id, :product_id => product.id, :approvals => 42
601
-
602
- industry1.reload
603
- industry2.reload
604
- company1.reload
605
- company2.reload
606
- user1.reload
607
- user2.reload
608
-
609
- expect(industry1.reviews_count).to eq(1)
610
- expect(industry2.reviews_count).to eq(0)
611
- expect(company1.reviews_count).to eq(1)
612
- expect(company2.reviews_count).to eq(0)
613
- expect(user1.reviews_count).to eq(1)
614
- expect(user2.reviews_count).to eq(0)
615
- expect(industry1.review_approvals_count).to eq(42)
616
- expect(industry2.review_approvals_count).to eq(0)
617
-
618
- review.user = user2
619
- review.save!
620
-
621
- industry1.reload
622
- industry2.reload
623
- company1.reload
624
- company2.reload
625
- user1.reload
626
- user2.reload
627
-
628
- expect(industry1.reviews_count).to eq(0)
629
- expect(industry2.reviews_count).to eq(1)
630
- expect(company1.reviews_count).to eq(0)
631
- expect(company2.reviews_count).to eq(1)
632
- expect(user1.reviews_count).to eq(0)
633
- expect(user2.reviews_count).to eq(1)
634
- expect(industry1.review_approvals_count).to eq(0)
635
- expect(industry2.review_approvals_count).to eq(42)
636
-
637
- review.update_attribute(:approvals, 69)
638
- expect(industry2.reload.review_approvals_count).to eq(69)
639
- end
640
-
641
- it "increments third-level custom counter cache on create" do
642
- industry = Industry.create
643
- company = Company.create :industry_id => industry.id
644
- user = User.create :manages_company_id => company.id
645
- product = Product.create
646
-
647
- expect(industry.rexiews_count).to eq(0)
648
-
649
- review = Review.create :user_id => user.id, :product_id => product.id
650
-
651
- industry.reload
652
-
653
- expect(industry.rexiews_count).to eq(1)
654
- end
655
-
656
- it "decrements third-level custom counter cache on destroy" do
657
- industry = Industry.create
658
- company = Company.create :industry_id => industry.id
659
- user = User.create :manages_company_id => company.id
660
- product = Product.create
661
-
662
- expect(industry.rexiews_count).to eq(0)
663
-
664
- review = Review.create :user_id => user.id, :product_id => product.id
665
-
666
- industry.reload
667
- expect(industry.rexiews_count).to eq(1)
668
-
669
- review.destroy
670
-
671
- industry.reload
672
- expect(industry.rexiews_count).to eq(0)
673
- end
674
-
675
- it "updates third-level custom counter cache on update" do
676
- industry1 = Industry.create
677
- industry2 = Industry.create
678
- company1 = Company.create :industry_id => industry1.id
679
- company2 = Company.create :industry_id => industry2.id
680
- user1 = User.create :manages_company_id => company1.id
681
- user2 = User.create :manages_company_id => company2.id
682
- product = Product.create
683
-
684
- expect(industry1.rexiews_count).to eq(0)
685
- expect(industry2.rexiews_count).to eq(0)
686
-
687
- review = Review.create :user_id => user1.id, :product_id => product.id
688
-
689
- industry1.reload
690
- expect(industry1.rexiews_count).to eq(1)
691
- industry2.reload
692
- expect(industry2.rexiews_count).to eq(0)
693
-
694
- review.user = user2
695
- review.save!
696
-
697
- industry1.reload
698
- expect(industry1.rexiews_count).to eq(0)
699
- industry2.reload
700
- expect(industry2.rexiews_count).to eq(1)
701
- end
702
-
703
- it "correctly handles dynamic delta magnitude" do
704
- user = User.create
705
- product = Product.create
706
-
707
- review_heavy = Review.create(
708
- :user_id => user.id,
709
- :review_type => 'using',
710
- :product_id => product.id,
711
- :heavy => true,
712
- )
713
- user.reload
714
- expect(user.dynamic_delta_count).to eq(2)
715
-
716
- review_light = Review.create(
717
- :user_id => user.id,
718
- :product_id => product.id,
719
- :review_type => 'using',
720
- :heavy => false,
721
- )
722
- user.reload
723
- expect(user.dynamic_delta_count).to eq(3)
724
-
725
- review_heavy.destroy
726
- user.reload
727
- expect(user.dynamic_delta_count).to eq(1)
728
-
729
- review_light.destroy
730
- user.reload
731
- expect(user.dynamic_delta_count).to eq(0)
732
- end
733
-
734
- it "correctly handles non-dynamic custom delta magnitude" do
735
- user = User.create
736
- product = Product.create
737
-
738
- review1 = Review.create(
739
- :user_id => user.id,
740
- :review_type => 'using',
741
- :product_id => product.id
742
- )
743
- user.reload
744
- expect(user.custom_delta_count).to eq(3)
745
-
746
- review2 = Review.create(
747
- :user_id => user.id,
748
- :review_type => 'using',
749
- :product_id => product.id
750
- )
751
- user.reload
752
- expect(user.custom_delta_count).to eq(6)
753
-
754
- review1.destroy
755
- user.reload
756
- expect(user.custom_delta_count).to eq(3)
757
-
758
- review2.destroy
759
- user.reload
760
- expect(user.custom_delta_count).to eq(0)
761
- end
762
-
763
- it "increments dynamic counter cache on create" do
764
- user = User.create
765
- product = Product.create
766
-
767
- expect(user.using_count).to eq(0)
768
- expect(user.tried_count).to eq(0)
769
-
770
- review_using = Review.create :user_id => user.id, :product_id => product.id, :review_type => 'using'
771
-
772
- user.reload
773
-
774
- expect(user.using_count).to eq(1)
775
- expect(user.tried_count).to eq(0)
776
-
777
- review_tried = Review.create :user_id => user.id, :product_id => product.id, :review_type => 'tried'
778
-
779
- user.reload
780
-
781
- expect(user.using_count).to eq(1)
782
- expect(user.tried_count).to eq(1)
783
- end
784
-
785
- it "decrements dynamic counter cache on destroy" do
786
- user = User.create
787
- product = Product.create
788
-
789
- expect(user.using_count).to eq(0)
790
- expect(user.tried_count).to eq(0)
791
-
792
- review_using = Review.create :user_id => user.id, :product_id => product.id, :review_type => 'using'
793
-
794
- user.reload
795
-
796
- expect(user.using_count).to eq(1)
797
- expect(user.tried_count).to eq(0)
798
-
799
- review_tried = Review.create :user_id => user.id, :product_id => product.id, :review_type => 'tried'
800
-
801
- user.reload
802
-
803
- expect(user.using_count).to eq(1)
804
- expect(user.tried_count).to eq(1)
805
-
806
- review_tried.destroy
807
-
808
- user.reload
809
-
810
- expect(user.using_count).to eq(1)
811
- expect(user.tried_count).to eq(0)
812
-
813
- review_using.destroy
814
-
815
- user.reload
816
-
817
- expect(user.using_count).to eq(0)
818
- expect(user.tried_count).to eq(0)
819
- end
820
-
821
- it "increments third-level dynamic counter cache on create" do
822
- industry = Industry.create
823
- company = Company.create :industry_id => industry.id
824
- user = User.create :manages_company_id => company.id
825
- product = Product.create
826
-
827
- expect(industry.using_count).to eq(0)
828
- expect(industry.tried_count).to eq(0)
829
-
830
- review_using = Review.create :user_id => user.id, :product_id => product.id, :review_type => 'using'
831
-
832
- industry.reload
833
-
834
- expect(industry.using_count).to eq(1)
835
- expect(industry.tried_count).to eq(0)
836
-
837
- review_tried = Review.create :user_id => user.id, :product_id => product.id, :review_type => 'tried'
838
-
839
- industry.reload
840
-
841
- expect(industry.using_count).to eq(1)
842
- expect(industry.tried_count).to eq(1)
843
- end
844
-
845
- it "decrements third-level custom counter cache on destroy" do
846
- industry = Industry.create
847
- company = Company.create :industry_id => industry.id
848
- user = User.create :manages_company_id => company.id
849
- product = Product.create
850
-
851
- expect(industry.using_count).to eq(0)
852
- expect(industry.tried_count).to eq(0)
853
-
854
- review_using = Review.create :user_id => user.id, :product_id => product.id, :review_type => 'using'
855
-
856
- industry.reload
857
-
858
- expect(industry.using_count).to eq(1)
859
- expect(industry.tried_count).to eq(0)
860
-
861
- review_tried = Review.create :user_id => user.id, :product_id => product.id, :review_type => 'tried'
862
-
863
- industry.reload
864
-
865
- expect(industry.using_count).to eq(1)
866
- expect(industry.tried_count).to eq(1)
867
-
868
- review_tried.destroy
869
-
870
- industry.reload
871
-
872
- expect(industry.using_count).to eq(1)
873
- expect(industry.tried_count).to eq(0)
874
-
875
- review_using.destroy
876
-
877
- industry.reload
878
-
879
- expect(industry.using_count).to eq(0)
880
- expect(industry.tried_count).to eq(0)
881
- end
882
-
883
- it "updates third-level custom counter cache on update" do
884
- industry1 = Industry.create
885
- industry2 = Industry.create
886
- company1 = Company.create :industry_id => industry1.id
887
- company2 = Company.create :industry_id => industry2.id
888
- user1 = User.create :manages_company_id => company1.id
889
- user2 = User.create :manages_company_id => company2.id
890
- product = Product.create
891
-
892
- expect(industry1.using_count).to eq(0)
893
- expect(industry1.tried_count).to eq(0)
894
- expect(industry2.using_count).to eq(0)
895
- expect(industry2.tried_count).to eq(0)
896
-
897
- review_using = Review.create :user_id => user1.id, :product_id => product.id, :review_type => 'using'
898
-
899
- industry1.reload
900
- industry2.reload
901
-
902
- expect(industry1.using_count).to eq(1)
903
- expect(industry1.tried_count).to eq(0)
904
- expect(industry2.using_count).to eq(0)
905
- expect(industry2.tried_count).to eq(0)
906
-
907
- review_tried = Review.create :user_id => user1.id, :product_id => product.id, :review_type => 'tried'
908
-
909
- industry1.reload
910
- industry2.reload
911
-
912
- expect(industry1.using_count).to eq(1)
913
- expect(industry1.tried_count).to eq(1)
914
- expect(industry2.using_count).to eq(0)
915
- expect(industry2.tried_count).to eq(0)
916
-
917
- review_tried.user = user2
918
- review_tried.save!
919
-
920
- industry1.reload
921
- industry2.reload
922
-
923
- expect(industry1.using_count).to eq(1)
924
- expect(industry1.tried_count).to eq(0)
925
- expect(industry2.using_count).to eq(0)
926
- expect(industry2.tried_count).to eq(1)
927
-
928
- review_using.user = user2
929
- review_using.save!
930
-
931
- industry1.reload
932
- industry2.reload
933
-
934
- expect(industry1.using_count).to eq(0)
935
- expect(industry1.tried_count).to eq(0)
936
- expect(industry2.using_count).to eq(1)
937
- expect(industry2.tried_count).to eq(1)
938
- end
939
-
940
- it "should overwrite foreign-key values on create" do
941
- 3.times { Category.create }
942
- Category.all {|category| expect(category.products_count).to eq(0) }
943
-
944
- product = Product.create :category_id => Category.first.id
945
- Category.all {|category| expect(category.products_count).to eq(1) }
946
- end
947
-
948
- it "should overwrite foreign-key values on destroy" do
949
- 3.times { Category.create }
950
- Category.all {|category| expect(category.products_count).to eq(0) }
951
-
952
- product = Product.create :category_id => Category.first.id
953
- Category.all {|category| expect(category.products_count).to eq(1) }
954
-
955
- product.destroy
956
- Category.all {|category| expect(category.products_count).to eq(0) }
957
- end
958
-
959
- it "should overwrite foreign-key values on destroy" do
960
- 3.times { Category.create }
961
- Category.all {|category| expect(category.products_count).to eq(0) }
962
-
963
- product = Product.create :category_id => Category.first.id
964
- Category.all {|category| expect(category.products_count).to eq(1) }
965
-
966
- product.category = nil
967
- product.save!
968
- Category.all {|category| expect(category.products_count).to eq(0) }
969
- end
970
-
971
- it "should not report correct counts when fix_counts is called" do
972
- user1 = User.create
973
- user2 = User.create
974
-
975
- review1 = Review.create user_id: user1.id, product: Product.create
976
- review2 = Review.create user_id: user2.id, product: Product.create
977
-
978
- user1.update_column :reviews_count, 2
979
-
980
- expect(Review.counter_culture_fix_counts(skip_unsupported: true)).to eq([{ entity: 'User', id: user1.id, what: 'reviews_count', right: 1, wrong: 2 }])
981
- end
982
-
983
- it 'should update the timestamp when fixing counts with `touch: true`' do
984
- product = Product.create
985
- review = Review.create product: product
986
-
987
- product.update_column :reviews_count, 2
988
-
989
- product.reload
990
-
991
- old_product_updated_at = product.updated_at
992
-
993
- Timecop.travel(1.second.from_now) do
994
- Review.counter_culture_fix_counts(skip_unsupported: true, only: :product, touch: true)
995
-
996
- product.reload
997
-
998
- expect(product.updated_at).to be > old_product_updated_at
999
- end
1000
- end
1001
-
1002
- it 'should not update the timestamp when fixing counts without `touch: true`' do
1003
- product = Product.create
1004
- review = Review.create product: product
1005
-
1006
- product.update_column :reviews_count, 2
1007
-
1008
- product.reload
1009
-
1010
- old_product_updated_at = product.updated_at
1011
-
1012
- Timecop.travel(2.second.from_now) do
1013
- Review.counter_culture_fix_counts(skip_unsupported: true, only: :product)
1014
-
1015
- product.reload
1016
-
1017
- expect(product.updated_at).to eq old_product_updated_at
1018
- end
1019
- end
1020
-
1021
- it 'should update the timestamp of a custom column when fixing counts with touch: rexiews_updated_at' do
1022
- product = Product.create
1023
- review = Review.create product: product
1024
-
1025
- product.update_column :rexiews_count, 2
1026
-
1027
- product.reload
1028
-
1029
- old_rexiews_updated_at = product.rexiews_updated_at
1030
-
1031
- Timecop.travel(1.second.from_now) do
1032
- Review.counter_culture_fix_counts(skip_unsupported: true, touch: :rexiews_updated_at)
1033
-
1034
- product.reload
1035
-
1036
- expect(product.rexiews_updated_at).to be > old_rexiews_updated_at
1037
- end
1038
- end
1039
-
1040
- it "should fix a simple counter cache correctly" do
1041
- user = User.create
1042
- product = Product.create
1043
-
1044
- expect(user.reviews_count).to eq(0)
1045
- expect(product.reviews_count).to eq(0)
1046
- expect(user.review_approvals_count).to eq(0)
1047
-
1048
- review = Review.create :user_id => user.id, :product_id => product.id, :approvals => 69
1049
-
1050
- user.reload
1051
- product.reload
1052
-
1053
- expect(user.reviews_count).to eq(1)
1054
- expect(product.reviews_count).to eq(1)
1055
- expect(user.review_approvals_count).to eq(69)
1056
-
1057
- user.reviews_count = 0
1058
- product.reviews_count = 2
1059
- user.review_approvals_count = 7
1060
- user.save!
1061
- product.save!
1062
-
1063
- fixed = Review.counter_culture_fix_counts :skip_unsupported => true
1064
- expect(fixed.length).to eq(3)
1065
-
1066
- user.reload
1067
- product.reload
1068
-
1069
- expect(user.reviews_count).to eq(1)
1070
- expect(product.reviews_count).to eq(1)
1071
- expect(user.review_approvals_count).to eq(69)
1072
- end
1073
-
1074
- it "should fix where the count should go back to zero correctly" do
1075
- user = User.create
1076
- product = Product.create
1077
-
1078
- expect(user.reviews_count).to eq(0)
1079
-
1080
- user.reviews_count = -1
1081
- user.save!
1082
-
1083
- fixed = Review.counter_culture_fix_counts :skip_unsupported => true
1084
- expect(fixed.length).to eq(1)
1085
-
1086
- user.reload
1087
-
1088
- expect(user.reviews_count).to eq(0)
1089
-
1090
- end
1091
-
1092
- it "should fix a STI counter cache correctly" do
1093
- company = Company.create
1094
- user = User.create :manages_company_id => company.id
1095
- product = Product.create
1096
-
1097
- expect(company.twitter_reviews_count).to eq(0)
1098
- expect(product.twitter_reviews_count).to eq(0)
1099
-
1100
- review = Review.create :user_id => user.id, :product_id => product.id, :approvals => 42
1101
- twitter_review = TwitterReview.create :user_id => user.id, :product_id => product.id, :approvals => 32
1102
-
1103
- company.reload
1104
- user.reload
1105
- product.reload
1106
-
1107
- expect(company.twitter_reviews_count).to eq(1)
1108
- expect(product.twitter_reviews_count).to eq(1)
1109
-
1110
- company.twitter_reviews_count = 2
1111
- product.twitter_reviews_count = 2
1112
- company.save!
1113
- product.save!
1114
-
1115
- TwitterReview.counter_culture_fix_counts :skip_unsupported => true
1116
-
1117
- company.reload
1118
- product.reload
1119
-
1120
- expect(company.twitter_reviews_count).to eq(1)
1121
- expect(product.twitter_reviews_count).to eq(1)
1122
- end
1123
-
1124
- it "handles an inherited STI counter cache correctly" do
1125
- company = Company.create
1126
- user = User.create :manages_company_id => company.id
1127
- product = Product.create
1128
- SimpleReview.create :user_id => user.id, :product_id => product.id
1129
- product.reload
1130
- expect(product.reviews_count).to eq(1)
1131
- expect(product.simple_reviews_count).to eq(1)
1132
-
1133
- Review.create :user_id => user.id, :product_id => product.id
1134
- product.reload
1135
- expect(product.reviews_count).to eq(2)
1136
- expect(product.simple_reviews_count).to eq(1)
1137
- end
1138
-
1139
- it "should fix a second-level counter cache correctly" do
1140
- company = Company.create
1141
- user = User.create :manages_company_id => company.id
1142
- product = Product.create
1143
-
1144
- expect(company.reviews_count).to eq(0)
1145
- expect(user.reviews_count).to eq(0)
1146
- expect(product.reviews_count).to eq(0)
1147
- expect(company.review_approvals_count).to eq(0)
1148
-
1149
- review = Review.create :user_id => user.id, :product_id => product.id, :approvals => 42
1150
-
1151
- company.reload
1152
- user.reload
1153
- product.reload
1154
-
1155
- expect(company.reviews_count).to eq(1)
1156
- expect(user.reviews_count).to eq(1)
1157
- expect(product.reviews_count).to eq(1)
1158
- expect(company.review_approvals_count).to eq(42)
1159
-
1160
- company.reviews_count = 2
1161
- company.review_approvals_count = 7
1162
- user.reviews_count = 3
1163
- product.reviews_count = 4
1164
- company.save!
1165
- user.save!
1166
- product.save!
1167
-
1168
- Review.counter_culture_fix_counts :skip_unsupported => true
1169
- company.reload
1170
- user.reload
1171
- product.reload
1172
-
1173
- expect(company.reviews_count).to eq(1)
1174
- expect(user.reviews_count).to eq(1)
1175
- expect(product.reviews_count).to eq(1)
1176
- expect(company.review_approvals_count).to eq(42)
1177
- end
1178
-
1179
- it "should fix a custom counter cache correctly" do
1180
- user = User.create
1181
- product = Product.create
1182
-
1183
- expect(product.rexiews_count).to eq(0)
1184
-
1185
- review = Review.create :user_id => user.id, :product_id => product.id
1186
-
1187
- product.reload
1188
-
1189
- expect(product.rexiews_count).to eq(1)
1190
-
1191
- product.rexiews_count = 2
1192
- product.save!
1193
-
1194
- Review.counter_culture_fix_counts :skip_unsupported => true
1195
-
1196
- product.reload
1197
- expect(product.rexiews_count).to eq(1)
1198
- end
1199
-
1200
- it "should fix a dynamic counter cache correctly" do
1201
- user = User.create
1202
- product = Product.create
1203
-
1204
- expect(user.using_count).to eq(0)
1205
- expect(user.tried_count).to eq(0)
1206
-
1207
- review_using = Review.create :user_id => user.id, :product_id => product.id, :review_type => 'using'
1208
-
1209
- user.reload
1210
-
1211
- expect(user.using_count).to eq(1)
1212
- expect(user.tried_count).to eq(0)
1213
-
1214
- review_tried = Review.create :user_id => user.id, :product_id => product.id, :review_type => 'tried'
1215
-
1216
- user.reload
1217
-
1218
- expect(user.using_count).to eq(1)
1219
- expect(user.tried_count).to eq(1)
1220
-
1221
- user.using_count = 2
1222
- user.tried_count = 3
1223
- user.save!
1224
-
1225
- Review.counter_culture_fix_counts :skip_unsupported => true
1226
-
1227
- user.reload
1228
-
1229
- expect(user.using_count).to eq(1)
1230
- expect(user.tried_count).to eq(1)
1231
-
1232
- review_tried = Review.create :user_id => user.id, :product_id => product.id, :review_type => 'null'
1233
-
1234
- user.reload
1235
-
1236
- expect(user.using_count).to eq(1)
1237
- expect(user.tried_count).to eq(1)
1238
-
1239
- user.using_count = 2
1240
- user.tried_count = 3
1241
- user.save!
1242
-
1243
- Review.counter_culture_fix_counts :skip_unsupported => true
1244
-
1245
- user.reload
1246
-
1247
- expect(user.using_count).to eq(1)
1248
- expect(user.tried_count).to eq(1)
1249
- end
1250
-
1251
- it "should fix a string counter cache correctly" do
1252
- string_id = HasStringId.create({:id => "bbb"})
1253
-
1254
- user = User.create :has_string_id_id => string_id.id
1255
-
1256
- string_id.reload
1257
- expect(string_id.users_count).to eq(1)
1258
-
1259
- user2 = User.create :has_string_id_id => string_id.id
1260
-
1261
- string_id.reload
1262
- expect(string_id.users_count).to eq(2)
1263
-
1264
- string_id.users_count = 123
1265
- string_id.save!
1266
-
1267
- string_id.reload
1268
- expect(string_id.users_count).to eq(123)
1269
-
1270
- User.counter_culture_fix_counts
1271
-
1272
- string_id.reload
1273
- expect(string_id.users_count).to eq(2)
1274
- end
1275
-
1276
- it "should fix a counter cache with no DB-level primary_key index correctly" do
1277
- non_pk_id = HasNonPkId.create(id: (HasNonPkId.maximum(:id) || 1) + 1)
1278
-
1279
- user = User.create(has_non_pk_id_id: non_pk_id.id)
1280
-
1281
- non_pk_id.reload
1282
- expect(non_pk_id.users_count).to eq(1)
1283
-
1284
- user2 = User.create(has_non_pk_id_id: non_pk_id.id)
1285
-
1286
- non_pk_id.reload
1287
- expect(non_pk_id.users_count).to eq(2)
1288
-
1289
- non_pk_id.users_count = 123
1290
- non_pk_id.save!
1291
-
1292
- non_pk_id.reload
1293
- expect(non_pk_id.users_count).to eq(123)
1294
-
1295
- User.counter_culture_fix_counts
1296
-
1297
- non_pk_id.reload
1298
- expect(non_pk_id.users_count).to eq(2)
1299
- end
1300
-
1301
- it "should fix a static delta magnitude column correctly" do
1302
- user = User.create
1303
- product = Product.create
1304
-
1305
- Review.create(
1306
- :user_id => user.id,
1307
- :review_type => 'using',
1308
- :product_id => product.id
1309
- )
1310
-
1311
- user.reload
1312
- expect(user.custom_delta_count).to eq(3)
1313
-
1314
- user.update_attributes(:custom_delta_count => 5)
1315
-
1316
- Review.counter_culture_fix_counts(:skip_unsupported => true)
1317
-
1318
- user.reload
1319
- expect(user.custom_delta_count).to eq(3)
1320
- end
1321
-
1322
- it "should work correctly for relationships with custom names" do
1323
- company = Company.create
1324
- user1 = User.create :manages_company_id => company.id
1325
-
1326
- company.reload
1327
- expect(company.managers_count).to eq(1)
1328
-
1329
- user2 = User.create :manages_company_id => company.id
1330
-
1331
- company.reload
1332
- expect(company.managers_count).to eq(2)
1333
-
1334
- user2.destroy
1335
-
1336
- company.reload
1337
- expect(company.managers_count).to eq(1)
1338
-
1339
- company2 = Company.create
1340
- user1.manages_company_id = company2.id
1341
- user1.save!
1342
-
1343
- company.reload
1344
- expect(company.managers_count).to eq(0)
1345
- end
1346
-
1347
- it "should work correctly with string keys" do
1348
- string_id = HasStringId.create(id: "1")
1349
- string_id2 = HasStringId.create(id: "abc")
1350
-
1351
- user = User.create :has_string_id_id => string_id.id
1352
-
1353
- string_id.reload
1354
- expect(string_id.users_count).to eq(1)
1355
-
1356
- user2 = User.create :has_string_id_id => string_id.id
1357
-
1358
- string_id.reload
1359
- expect(string_id.users_count).to eq(2)
1360
-
1361
- user2.has_string_id_id = string_id2.id
1362
- user2.save!
1363
-
1364
- string_id.reload
1365
- string_id2.reload
1366
- expect(string_id.users_count).to eq(1)
1367
- expect(string_id2.users_count).to eq(1)
1368
-
1369
- user2.destroy
1370
- string_id.reload
1371
- string_id2.reload
1372
- expect(string_id.users_count).to eq(1)
1373
- expect(string_id2.users_count).to eq(0)
1374
-
1375
- user.destroy
1376
- string_id.reload
1377
- string_id2.reload
1378
- expect(string_id.users_count).to eq(0)
1379
- expect(string_id2.users_count).to eq(0)
1380
- end
1381
-
1382
- it "should raise a good error message when calling fix_counts with no caches defined" do
1383
- expect { Category.counter_culture_fix_counts }.to raise_error "No counter cache defined on Category"
1384
- end
1385
-
1386
- it "should log if verbose option is true" do
1387
- logger = Rails.logger
1388
- io = StringIO.new
1389
- io_logger = Logger.new(io)
1390
- Rails.logger = io_logger
1391
-
1392
- # first, clean up
1393
- SimpleDependent.delete_all
1394
- SimpleMain.delete_all
1395
-
1396
- 2.times do
1397
- main = SimpleMain.create
1398
- 3.times { main.simple_dependents.create }
1399
- end
1400
-
1401
- SimpleDependent.counter_culture_fix_counts :batch_size => 1, verbose: true
1402
-
1403
- expect(io.string).to include(
1404
- "Performing reconciling of SimpleDependent#simple_main.")
1405
- expect(io.string).to include(
1406
- "..")
1407
- expect(io.string).to include(
1408
- "Finished reconciling of SimpleDependent#simple_main.")
1409
- Rails.logger = logger
1410
- end
1411
-
1412
- MANY = CI_TEST_RUN ? 1000 : 20
1413
- A_FEW = CI_TEST_RUN ? 50: 10
1414
- A_BATCH = CI_TEST_RUN ? 100: 10
1415
-
1416
- it "should support batch processing" do
1417
- # first, clean up
1418
- SimpleDependent.delete_all
1419
- SimpleMain.delete_all
1420
-
1421
- expect_any_instance_of(CounterCulture::Reconciler::Reconciliation).to receive(:update_count_for_batch).exactly(MANY/A_BATCH).times
1422
-
1423
- MANY.times do |i|
1424
- main = SimpleMain.create
1425
- 3.times { main.simple_dependents.create }
1426
- end
1427
-
1428
- SimpleDependent.counter_culture_fix_counts :batch_size => A_BATCH
1429
- end
1430
-
1431
- it "should correctly fix the counter caches with conditionals" do
1432
- updated = SimpleMain.create
1433
- updated.simple_dependents.create
1434
- not_updated = SimpleMain.create
1435
- not_updated.simple_dependents.create
1436
- SimpleMain.all.update_all simple_dependents_count: 3
1437
-
1438
- SimpleDependent.counter_culture_fix_counts only: :simple_main, where: { simple_mains: { id: updated.id } }
1439
-
1440
- expect(updated.reload.simple_dependents_count).to eq(1)
1441
- expect(not_updated.reload.simple_dependents_count).to eq(3)
1442
- end
1443
-
1444
- it "should correctly fix the counter caches with thousands of records" do
1445
- # first, clean up
1446
- SimpleDependent.delete_all
1447
- SimpleMain.delete_all
1448
-
1449
- MANY.times do |i|
1450
- main = SimpleMain.create
1451
- 3.times { main.simple_dependents.create }
1452
- end
1453
-
1454
- SimpleMain.find_each { |main| expect(main.simple_dependents_count).to eq(3) }
1455
-
1456
- SimpleMain.order(Arel.sql('random()')).limit(A_FEW).update_all simple_dependents_count: 1
1457
- SimpleDependent.counter_culture_fix_counts :batch_size => A_BATCH
1458
-
1459
- SimpleMain.find_each { |main| expect(main.simple_dependents_count).to eq(3) }
1460
- end
1461
-
1462
- it "should correctly fix the counter caches for thousands of records when counter is conditional" do
1463
- # first, clean up
1464
- ConditionalDependent.delete_all
1465
- ConditionalMain.delete_all
1466
-
1467
- MANY.times do |i|
1468
- main = ConditionalMain.create
1469
- 3.times { main.conditional_dependents.create(:condition => main.id % 2 == 0) }
1470
- end
1471
-
1472
- ConditionalMain.find_each { |main| expect(main.conditional_dependents_count).to eq(main.id % 2 == 0 ? 3 : 0) }
1473
-
1474
- ConditionalMain.order(Arel.sql('random()')).limit(A_FEW).update_all :conditional_dependents_count => 1
1475
- ConditionalDependent.counter_culture_fix_counts :batch_size => A_BATCH
1476
-
1477
- ConditionalMain.find_each { |main| expect(main.conditional_dependents_count).to eq(main.id % 2 == 0 ? 3 : 0) }
1478
- end
1479
-
1480
- it "should correctly fix the counter caches when no dependent record exists for some of main records" do
1481
- # first, clean up
1482
- SimpleDependent.delete_all
1483
- SimpleMain.delete_all
1484
-
1485
- MANY.times do |i|
1486
- main = SimpleMain.create
1487
- (main.id % 4).times { main.simple_dependents.create }
1488
- end
1489
-
1490
- SimpleMain.find_each { |main| expect(main.simple_dependents_count).to eq(main.id % 4) }
1491
-
1492
- SimpleMain.order(Arel.sql('random()')).limit(A_FEW).update_all simple_dependents_count: 1
1493
- SimpleDependent.counter_culture_fix_counts :batch_size => A_BATCH
1494
-
1495
- SimpleMain.find_each { |main| expect(main.simple_dependents_count).to eq(main.id % 4) }
1496
- end
1497
-
1498
- it "should correctly sum up float values" do
1499
- user = User.create
1500
-
1501
- r1 = Review.create :user_id => user.id, :value => 3.4
1502
-
1503
- user.reload
1504
- expect(user.review_value_sum.round(1)).to eq(3.4)
1505
-
1506
- r2 = Review.create :user_id => user.id, :value => 7.2
1507
-
1508
- user.reload
1509
- expect(user.review_value_sum.round(1)).to eq(10.6)
1510
-
1511
- r3 = Review.create :user_id => user.id, :value => 5
1512
-
1513
- user.reload
1514
- expect(user.review_value_sum.round(1)).to eq(15.6)
1515
-
1516
- r2.destroy
1517
-
1518
- user.reload
1519
- expect(user.review_value_sum.round(1)).to eq(8.4)
1520
-
1521
- r3.destroy
1522
-
1523
- user.reload
1524
- expect(user.review_value_sum.round(1)).to eq(3.4)
1525
-
1526
- r1.destroy
1527
-
1528
- user.reload
1529
- expect(user.review_value_sum.round(1)).to eq(0)
1530
- end
1531
-
1532
- it "should correctly fix float values that came out of sync" do
1533
- user = User.create
1534
-
1535
- r1 = Review.create :user_id => user.id, :value => 3.4
1536
- r2 = Review.create :user_id => user.id, :value => 7.2
1537
- r3 = Review.create :user_id => user.id, :value => 5
1538
-
1539
- user.update_column(:review_value_sum, 0)
1540
- Review.counter_culture_fix_counts skip_unsupported: true
1541
-
1542
- user.reload
1543
- expect(user.review_value_sum.round(1)).to eq(15.6)
1544
-
1545
- r2.destroy
1546
-
1547
- user.update_column(:review_value_sum, 0)
1548
- Review.counter_culture_fix_counts skip_unsupported: true
1549
-
1550
- user.reload
1551
- expect(user.review_value_sum.round(1)).to eq(8.4)
1552
-
1553
- r3.destroy
1554
-
1555
- user.update_column(:review_value_sum, 0)
1556
- Review.counter_culture_fix_counts skip_unsupported: true
1557
-
1558
- user.reload
1559
- expect(user.review_value_sum.round(1)).to eq(3.4)
1560
-
1561
- r1.destroy
1562
-
1563
- user.update_column(:review_value_sum, 0)
1564
- Review.counter_culture_fix_counts skip_unsupported: true
1565
-
1566
- user.reload
1567
- expect(user.review_value_sum.round(1)).to eq(0)
1568
- end
1569
-
1570
- it "should update the timestamp if touch: true is set" do
1571
- user = User.create
1572
- product = Product.create
1573
-
1574
- Timecop.travel(1.second.from_now) do
1575
- review = Review.create :user_id => user.id, :product_id => product.id
1576
-
1577
- user.reload; product.reload
1578
-
1579
- expect(user.created_at.to_i).to eq(user.updated_at.to_i)
1580
- expect(product.created_at.to_i).to be < product.updated_at.to_i
1581
- end
1582
- end
1583
-
1584
- it "should update the timestamp for custom column if touch: rexiews_updated_at is set" do
1585
- product = Product.create
1586
-
1587
- Timecop.travel(1.second.from_now) do
1588
- Review.create :product_id => product.id
1589
-
1590
- product.reload
1591
-
1592
- expect(product.created_at.to_i).to be < product.rexiews_updated_at.to_i
1593
- expect(product.created_at.to_i).to be < product.updated_at.to_i
1594
- end
1595
- end
1596
-
1597
- it "should update counts correctly when creating using nested attributes" do
1598
- user = User.create(:reviews_attributes => [{:some_text => 'abc'}, {:some_text => 'xyz'}])
1599
- user.reload
1600
- expect(user.reviews_count).to eq(2)
1601
- end
1602
-
1603
- it "should use relation primary_key correctly" do
1604
- subcateg = Subcateg.create :subcat_id => Subcateg::SUBCAT_1
1605
- post = Post.new
1606
- post.subcateg = subcateg
1607
- post.save!
1608
- subcateg.reload
1609
- expect(subcateg.posts_count).to eq(1)
1610
- end
1611
-
1612
- it "should use relation primary key on counter destination table correctly when fixing counts" do
1613
- subcateg = Subcateg.create :subcat_id => Subcateg::SUBCAT_1
1614
- post = Post.new
1615
- post.subcateg = subcateg
1616
- post.save!
1617
-
1618
- subcateg.posts_count = -1
1619
- subcateg.save!
1620
-
1621
- fixed = Post.counter_culture_fix_counts :only => :subcateg
1622
-
1623
- expect(fixed.length).to eq(1)
1624
- expect(subcateg.reload.posts_count).to eq(1)
1625
- end
1626
-
1627
- it "should use primary key on counted records table correctly when fixing counts" do
1628
- subcateg = Subcateg.create :subcat_id => Subcateg::SUBCAT_1
1629
- post = Post.new
1630
- post.subcateg = subcateg
1631
- post.save!
1632
-
1633
- post_comment = PostComment.create!(:post_id => post.id)
1634
-
1635
- post.comments_count = -1
1636
- post.save!
1637
-
1638
- fixed = PostComment.counter_culture_fix_counts
1639
- expect(fixed.length).to eq(1)
1640
- expect(post.reload.comments_count).to eq(1)
1641
- end
1642
-
1643
- it "should use multi-level relation primary key on counter destination table correctly when fixing counts" do
1644
- categ = Categ.create :cat_id => Categ::CAT_1
1645
- subcateg = Subcateg.new :subcat_id => Subcateg::SUBCAT_1
1646
- subcateg.categ = categ
1647
- subcateg.save!
1648
-
1649
- post = Post.new
1650
- post.subcateg = subcateg
1651
- post.save!
1652
-
1653
- categ.posts_count = -1
1654
- categ.save!
1655
-
1656
- fixed = Post.counter_culture_fix_counts :only => [[:subcateg, :categ]]
1657
-
1658
- expect(fixed.length).to eq(1)
1659
- expect(categ.reload.posts_count).to eq(1)
1660
- end
1661
-
1662
- it "works correctly with a has_one association in the middle" do
1663
- candidate_profile1 = CandidateProfile.create(candidate: Candidate.create)
1664
- candidate1 = candidate_profile1.candidate
1665
- candidate_profile2 = CandidateProfile.create(candidate: Candidate.create)
1666
- candidate2 = candidate_profile2.candidate
1667
-
1668
- expect(candidate_profile1.conversations_count).to eq(0)
1669
- expect(candidate_profile2.conversations_count).to eq(0)
1670
-
1671
- conversation1 = Conversation.create(candidate: candidate1)
1672
- expect(candidate_profile1.reload.conversations_count).to eq(1)
1673
-
1674
- conversation2 = Conversation.create(candidate: candidate2)
1675
- expect(candidate_profile2.reload.conversations_count).to eq(1)
1676
-
1677
- conversation2.candidate = candidate1
1678
- conversation2.save!
1679
-
1680
- expect(candidate_profile1.reload.conversations_count).to eq(2)
1681
- expect(candidate_profile2.reload.conversations_count).to eq(0)
1682
-
1683
- candidate_profile1.update_column(:conversations_count, 99)
1684
- candidate_profile2.update_column(:conversations_count, 99)
1685
-
1686
- Conversation.counter_culture_fix_counts
1687
-
1688
- expect(candidate_profile1.reload.conversations_count).to eq(2)
1689
- expect(candidate_profile2.reload.conversations_count).to eq(0)
1690
-
1691
- conversation2.destroy
1692
- expect(candidate_profile1.reload.conversations_count).to eq(1)
1693
- expect(candidate_profile2.reload.conversations_count).to eq(0)
1694
-
1695
- conversation1.destroy
1696
- expect(candidate_profile1.reload.conversations_count).to eq(0)
1697
- expect(candidate_profile2.reload.conversations_count).to eq(0)
1698
- end
1699
-
1700
- describe "#previous_model" do
1701
- let(:user){User.create :name => "John Smith", :manages_company_id => 1}
1702
-
1703
- it "should return a copy of the original model" do
1704
- user.name = "Joe Smith"
1705
- user.manages_company_id = 2
1706
-
1707
- if Rails.version >= "5.1.0"
1708
- # must save to make the actual "saved_changes" available in Rails 5.1
1709
- # whereas we simply use the "changed_attributes" before that
1710
- user.save!
1711
- end
1712
- prev = CounterCulture::Counter.new(user, :foobar, {}).previous_model(user)
1713
-
1714
- expect(prev.name).to eq("John Smith")
1715
- expect(prev.manages_company_id).to eq(1)
1716
-
1717
- expect(user.name).to eq("Joe Smith")
1718
- expect(user.manages_company_id).to eq(2)
1719
- end
1720
- end
1721
-
1722
- describe "self referential counter cache" do
1723
- it "increments counter cache on create" do
1724
- company = Company.create!
1725
- company.children << Company.create!
1726
-
1727
- company.reload
1728
- expect(company.children_count).to eq(1)
1729
- end
1730
-
1731
- it "decrements counter cache on destroy" do
1732
- company = Company.create!
1733
- company.children << Company.create!
1734
-
1735
- company.reload
1736
- expect(company.children_count).to eq(1)
1737
-
1738
- company.children.first.destroy
1739
-
1740
- company.reload
1741
- expect(company.children_count).to eq(0)
1742
- end
1743
-
1744
- it "fixes counter cache" do
1745
- company = Company.create!
1746
- company.children << Company.create!
1747
-
1748
- company.children_count = -1
1749
- company.save!
1750
-
1751
- fixed = Company.counter_culture_fix_counts
1752
- expect(fixed.length).to eq(1)
1753
- expect(company.reload.children_count).to eq(1)
1754
- end
1755
- end
1756
-
1757
- describe "dynamic column names with totaling instead of counting" do
1758
- it "should correctly sum up the values" do
1759
- person = Person.create!
1760
-
1761
- earning_transaction = Transaction.create(monetary_value: 10, person: person)
1762
-
1763
- person.reload
1764
- expect(person.money_earned_total).to eq(10)
1765
-
1766
- spending_transaction = Transaction.create(monetary_value: -20, person: person)
1767
- person.reload
1768
- expect(person.money_spent_total).to eq(-20)
1769
- end
1770
-
1771
- it "should show the correct changes when changes are present" do
1772
- person = Person.create(id:100)
1773
-
1774
- earning_transaction = Transaction.create(monetary_value: 10, person: person)
1775
- spending_transaction = Transaction.create(monetary_value: -20, person: person)
1776
-
1777
- # Overwrite the values for the person so they are incorrect
1778
- person.reload
1779
- person.money_earned_total = 0
1780
- person.money_spent_total = 0
1781
- person.save
1782
-
1783
- fixed = Transaction.counter_culture_fix_counts
1784
- expect(fixed.length).to eq(2)
1785
- expect(fixed).to eq([
1786
- {:entity=>"Person", :id=>person.id, :what=>"money_earned_total", :wrong=>0, :right=>10},
1787
- {:entity=>"Person", :id=>person.id, :what=>"money_spent_total", :wrong=>0, :right=>-20}
1788
- ])
1789
- end
1790
- end
1791
-
1792
- describe "when using discard for soft deletes" do
1793
- it "works" do
1794
- company = Company.create!
1795
- expect(company.soft_delete_discards_count).to eq(0)
1796
- sd = SoftDeleteDiscard.create!(company_id: company.id)
1797
- expect(company.reload.soft_delete_discards_count).to eq(1)
1798
-
1799
- sd.discard
1800
- sd.reload
1801
- expect(sd).to be_discarded
1802
- expect(company.reload.soft_delete_discards_count).to eq(0)
1803
-
1804
- company.update_attributes(soft_delete_discards_count: 100)
1805
- expect(company.reload.soft_delete_discards_count).to eq(100)
1806
- SoftDeleteDiscard.counter_culture_fix_counts
1807
- expect(company.reload.soft_delete_discards_count).to eq(0)
1808
-
1809
- sd.undiscard
1810
- expect(company.reload.soft_delete_discards_count).to eq(1)
1811
- end
1812
-
1813
- it "runs destroy callback only once" do
1814
-
1815
- company = Company.create!
1816
- sd = SoftDeleteDiscard.create!(company_id: company.id)
1817
-
1818
- expect(company.reload.soft_delete_discards_count).to eq(1)
1819
-
1820
- sd.discard
1821
- expect(company.reload.soft_delete_discards_count).to eq(0)
1822
-
1823
- sd.discard
1824
- expect(company.reload.soft_delete_discards_count).to eq(0)
1825
- end
1826
-
1827
- it "runs restore callback only once" do
1828
- company = Company.create!
1829
- sd = SoftDeleteDiscard.create!(company_id: company.id)
1830
-
1831
- expect(company.reload.soft_delete_discards_count).to eq(1)
1832
-
1833
- sd.discard
1834
- expect(company.reload.soft_delete_discards_count).to eq(0)
1835
-
1836
- sd.undiscard
1837
- expect(company.reload.soft_delete_discards_count).to eq(1)
1838
-
1839
- sd.undiscard
1840
- expect(company.reload.soft_delete_discards_count).to eq(1)
1841
- end
1842
-
1843
- describe "when calling hard-destroy" do
1844
- it "does not run destroy callback for discarded records" do
1845
- company = Company.create!
1846
- sd = SoftDeleteDiscard.create!(company_id: company.id)
1847
-
1848
- expect(company.reload.soft_delete_discards_count).to eq(1)
1849
-
1850
- sd.discard
1851
- expect(company.reload.soft_delete_discards_count).to eq(0)
1852
-
1853
- sd.destroy
1854
- expect(company.reload.soft_delete_discards_count).to eq(0)
1855
- end
1856
-
1857
- it "runs destroy callback for undiscarded records" do
1858
- company = Company.create!
1859
- sd = SoftDeleteDiscard.create!(company_id: company.id)
1860
-
1861
- expect(company.reload.soft_delete_discards_count).to eq(1)
1862
-
1863
- sd.destroy
1864
- expect(company.reload.soft_delete_discards_count).to eq(0)
1865
- end
1866
- end
1867
-
1868
- describe "dynamic column names with totaling instead of counting" do
1869
- describe 'when updating discarded records' do
1870
- it 'does not update sum' do
1871
- company = Company.create!
1872
- sd = SoftDeleteDiscard.create!(company_id: company.id, value: 5)
1873
-
1874
- expect(company.reload.soft_delete_discard_values_sum).to eq(5)
1875
-
1876
- sd.discard
1877
- expect(company.reload.soft_delete_discard_values_sum).to eq(0)
1878
-
1879
- sd.update value: 10
1880
- expect(company.reload.soft_delete_discard_values_sum).to eq(0)
1881
- end
1882
- end
1883
-
1884
- describe 'when updating undiscarded records' do
1885
- it 'updates sum' do
1886
- company = Company.create!
1887
- sd = SoftDeleteDiscard.create!(company_id: company.id, value: 5)
1888
-
1889
- expect(company.reload.soft_delete_discard_values_sum).to eq(5)
1890
-
1891
- sd.update value: 10
1892
- expect(company.reload.soft_delete_discard_values_sum).to eq(10)
1893
- end
1894
- end
1895
- end
1896
- end
1897
-
1898
- describe "when using paranoia for soft deletes" do
1899
- it "works" do
1900
- company = Company.create!
1901
- expect(company.soft_delete_paranoia_count).to eq(0)
1902
- sd = SoftDeleteParanoia.create!(company_id: company.id)
1903
- expect(company.reload.soft_delete_paranoia_count).to eq(1)
1904
-
1905
- sd.destroy
1906
- sd.reload
1907
- expect(sd.deleted_at).to be_truthy
1908
- expect(company.reload.soft_delete_paranoia_count).to eq(0)
1909
-
1910
- company.update_attributes(soft_delete_paranoia_count: 100)
1911
- expect(company.reload.soft_delete_paranoia_count).to eq(100)
1912
- SoftDeleteParanoia.counter_culture_fix_counts
1913
- expect(company.reload.soft_delete_paranoia_count).to eq(0)
1914
-
1915
- sd.restore
1916
- expect(company.reload.soft_delete_paranoia_count).to eq(1)
1917
- end
1918
-
1919
- it "runs destroy callback only once" do
1920
- company = Company.create!
1921
- sd = SoftDeleteParanoia.create!(company_id: company.id)
1922
-
1923
- expect(company.reload.soft_delete_paranoia_count).to eq(1)
1924
-
1925
- sd.destroy
1926
- expect(company.reload.soft_delete_paranoia_count).to eq(0)
1927
-
1928
- sd.destroy
1929
- expect(company.reload.soft_delete_paranoia_count).to eq(0)
1930
- end
1931
-
1932
- it "runs restore callback only once" do
1933
- company = Company.create!
1934
- sd = SoftDeleteParanoia.create!(company_id: company.id)
1935
-
1936
- expect(company.reload.soft_delete_paranoia_count).to eq(1)
1937
-
1938
- sd.destroy
1939
- expect(company.reload.soft_delete_paranoia_count).to eq(0)
1940
-
1941
- sd.restore
1942
- expect(company.reload.soft_delete_paranoia_count).to eq(1)
1943
-
1944
- sd.restore
1945
- expect(company.reload.soft_delete_paranoia_count).to eq(1)
1946
- end
1947
-
1948
- describe "when calling paranoia really destroy" do
1949
- it "does not run destroy callback for paranoia destroyed records" do
1950
- company = Company.create!
1951
- sd = SoftDeleteParanoia.create!(company_id: company.id)
1952
-
1953
- expect(company.reload.soft_delete_paranoia_count).to eq(1)
1954
-
1955
- sd.destroy
1956
- expect(company.reload.soft_delete_paranoia_count).to eq(0)
1957
-
1958
- sd.really_destroy!
1959
- expect(company.reload.soft_delete_paranoia_count).to eq(0)
1960
- end
1961
-
1962
- it "runs really destroy callback for paranoia undestroyed records" do
1963
- company = Company.create!
1964
- expect(company.soft_delete_paranoia_count).to eq(0)
1965
- sd = SoftDeleteParanoia.create!(company_id: company.id)
1966
- expect(company.reload.soft_delete_paranoia_count).to eq(1)
1967
-
1968
- sd.really_destroy!
1969
- expect{ sd.reload }.to raise_error(ActiveRecord::RecordNotFound)
1970
- expect(company.reload.soft_delete_paranoia_count).to eq(0)
1971
- end
1972
- end
1973
-
1974
- describe "dynamic column names with totaling instead of counting" do
1975
- describe 'when updating soft deleted records' do
1976
- it 'does not update sum' do
1977
- company = Company.create!
1978
- sd = SoftDeleteParanoia.create!(company_id: company.id, value: 5)
1979
-
1980
- expect(company.reload.soft_delete_paranoia_values_sum).to eq(5)
1981
-
1982
- sd.destroy
1983
- expect(company.reload.soft_delete_paranoia_values_sum).to eq(0)
1984
-
1985
- sd.update value: 10
1986
- expect(company.reload.soft_delete_paranoia_values_sum).to eq(0)
1987
- end
1988
- end
1989
-
1990
- describe 'when updating undestroyed records' do
1991
- it 'updates sum' do
1992
- company = Company.create!
1993
- sd = SoftDeleteParanoia.create!(company_id: company.id, value: 5)
1994
-
1995
- expect(company.reload.soft_delete_paranoia_values_sum).to eq(5)
1996
-
1997
- sd.update value: 10
1998
- expect(company.reload.soft_delete_paranoia_values_sum).to eq(10)
1999
- end
2000
- end
2001
- end
2002
- end
2003
-
2004
- describe "with polymorphic_associations" do
2005
- before(:all) do
2006
- require 'models/poly_image'
2007
- require 'models/poly_employee'
2008
- require 'models/poly_product'
2009
- end
2010
- let(:employee) { PolyEmployee.create(id: 3000) }
2011
- let(:product1) { PolyProduct.create() }
2012
- let(:product2) { PolyProduct.create() }
2013
- let(:special_url) { "http://images.example.com/special.png" }
2014
-
2015
- def mess_up_counts
2016
- PolyEmployee.update_all(poly_images_count: 100, poly_images_count_dup: 100, special_poly_images_count: 100)
2017
- PolyProduct.update_all(poly_images_count: 100, poly_images_count_dup: 100, special_poly_images_count: 100)
2018
- end
2019
-
2020
- describe "default" do
2021
- it "increments / decrements counter caches correctly" do
2022
- expect(employee.poly_images_count).to eq(0)
2023
- expect(product1.poly_images_count).to eq(0)
2024
- img1 = PolyImage.create(imageable: employee)
2025
- expect(employee.reload.poly_images_count).to eq(1)
2026
- expect(product1.reload.poly_images_count).to eq(0)
2027
- img2 = PolyImage.create(imageable: product1)
2028
- expect(employee.reload.poly_images_count).to eq(1)
2029
- expect(product1.reload.poly_images_count).to eq(1)
2030
- img3 = PolyImage.create(imageable: product1)
2031
- expect(employee.reload.poly_images_count).to eq(1)
2032
- expect(product1.reload.poly_images_count).to eq(2)
2033
- img3.destroy
2034
- expect(employee.reload.poly_images_count).to eq(1)
2035
- expect(product1.reload.poly_images_count).to eq(1)
2036
- img2.imageable = employee
2037
- img2.save!
2038
- expect(employee.reload.poly_images_count).to eq(2)
2039
- expect(product1.reload.poly_images_count).to eq(0)
2040
- end
2041
-
2042
- it "decrements counter caches on update correctly" do
2043
- img = PolyImage.create(imageable: product1)
2044
- img.imageable = employee
2045
- img.save!
2046
- expect(product1.reload.poly_images_count).to eq(0)
2047
- expect(employee.reload.poly_images_count).to eq(1)
2048
- end
2049
-
2050
- it "can fix counts for polymorphic correctly" do
2051
- 2.times { PolyImage.create(imageable: employee) }
2052
- 1.times { PolyImage.create(imageable: product1) }
2053
- mess_up_counts
2054
-
2055
- PolyImage.counter_culture_fix_counts
2056
-
2057
- expect(product2.reload.poly_images_count).to eq(0)
2058
- expect(product1.reload.poly_images_count).to eq(1)
2059
- expect(employee.reload.poly_images_count).to eq(2)
2060
- end
2061
-
2062
- it "can handle nil values" do
2063
- img = PolyImage.create(imageable: employee)
2064
- PolyImage.create(imageable: nil)
2065
- mess_up_counts
2066
-
2067
- PolyImage.counter_culture_fix_counts
2068
-
2069
- expect(employee.reload.poly_images_count).to eq(1)
2070
-
2071
- img.imageable = nil
2072
- img.save!
2073
-
2074
- expect(employee.reload.poly_images_count).to eq(0)
2075
-
2076
- img.imageable = employee
2077
- img.save!
2078
-
2079
- expect(employee.reload.poly_images_count).to eq(1)
2080
- end
2081
- end
2082
- describe "custom column name" do
2083
- it "increments counter cache on create" do
2084
- expect(employee.poly_images_count_dup).to eq(0)
2085
- expect(product1.poly_images_count_dup).to eq(0)
2086
- img1 = PolyImage.create(imageable: employee)
2087
- expect(employee.reload.poly_images_count_dup).to eq(1)
2088
- expect(product1.reload.poly_images_count_dup).to eq(0)
2089
- img2 = PolyImage.create(imageable: product1)
2090
- expect(employee.reload.poly_images_count_dup).to eq(1)
2091
- expect(product1.reload.poly_images_count_dup).to eq(1)
2092
- img3 = PolyImage.create(imageable: product1)
2093
- expect(employee.reload.poly_images_count_dup).to eq(1)
2094
- expect(product1.reload.poly_images_count_dup).to eq(2)
2095
- img3.destroy
2096
- expect(employee.reload.poly_images_count_dup).to eq(1)
2097
- expect(product1.reload.poly_images_count_dup).to eq(1)
2098
- img2.imageable = employee
2099
- img2.save!
2100
- expect(employee.reload.poly_images_count_dup).to eq(2)
2101
- expect(product1.reload.poly_images_count_dup).to eq(0)
2102
- end
2103
-
2104
- it "decrements counter caches on update correctly" do
2105
- img = PolyImage.create(imageable: product1)
2106
- img.imageable = employee
2107
- img.save!
2108
- expect(employee.reload.poly_images_count_dup).to eq(1)
2109
- expect(product1.reload.poly_images_count_dup).to eq(0)
2110
- end
2111
-
2112
- it "can fix counts for polymorphic correctly" do
2113
- 2.times { PolyImage.create(imageable: employee) }
2114
- 1.times { PolyImage.create(imageable: product1) }
2115
- mess_up_counts
2116
-
2117
- PolyImage.counter_culture_fix_counts
2118
-
2119
- expect(product2.reload.poly_images_count_dup).to eq(0)
2120
- expect(product1.reload.poly_images_count_dup).to eq(1)
2121
- expect(employee.reload.poly_images_count_dup).to eq(2)
2122
- end
2123
- end
2124
- describe "conditional counts" do
2125
- it "increments counter cache on create" do
2126
- expect(employee.special_poly_images_count).to eq(0)
2127
- expect(product1.special_poly_images_count).to eq(0)
2128
- PolyImage.create(imageable: employee)
2129
- expect(employee.reload.special_poly_images_count).to eq(0)
2130
- expect(product1.special_poly_images_count).to eq(0)
2131
- PolyImage.create(imageable: product1)
2132
- expect(employee.reload.special_poly_images_count).to eq(0)
2133
- expect(product1.reload.special_poly_images_count).to eq(0)
2134
- img1 = PolyImage.create(imageable: employee, url: special_url)
2135
- expect(employee.reload.special_poly_images_count).to eq(1)
2136
- expect(product1.special_poly_images_count).to eq(0)
2137
- img2 = PolyImage.create(imageable: product1, url: special_url)
2138
- expect(employee.reload.special_poly_images_count).to eq(1)
2139
- expect(product1.reload.special_poly_images_count).to eq(1)
2140
- img2.destroy
2141
- expect(employee.reload.special_poly_images_count).to eq(1)
2142
- expect(product1.reload.special_poly_images_count).to eq(0)
2143
- img1.imageable = product1
2144
- img1.save!
2145
- expect(employee.reload.special_poly_images_count).to eq(0)
2146
- expect(product1.reload.special_poly_images_count).to eq(1)
2147
- end
2148
-
2149
- it "can fix counts for polymorphic correctly" do
2150
- 4.times { PolyImage.create(imageable: employee) }
2151
- 2.times { PolyImage.create(imageable: employee, url: special_url) }
2152
- 1.times { PolyImage.create(imageable: product1) }
2153
- 1.times { PolyImage.create(imageable: product1, url: special_url) }
2154
- mess_up_counts
2155
-
2156
- PolyImage.counter_culture_fix_counts
2157
-
2158
- expect(product2.reload.special_poly_images_count).to eq(0)
2159
- expect(employee.reload.special_poly_images_count).to eq(2)
2160
- expect(product1.reload.special_poly_images_count).to eq(1)
2161
- end
2162
-
2163
- it "can deal with changes to condition" do
2164
- img1 = PolyImage.create(imageable: employee)
2165
- expect {img1.update_attributes!(url: special_url)}
2166
- .to change { employee.reload.special_poly_images_count }.from(0).to(1)
2167
- end
2168
-
2169
- it "can deal with changes to condition" do
2170
- img1 = PolyImage.create(imageable: employee, url: special_url)
2171
- expect {img1.update_attributes!(url: "normal url")}
2172
- .to change { employee.reload.special_poly_images_count }.from(1).to(0)
2173
- end
2174
- end
2175
- end
2176
-
2177
- describe "with papertrail support", versioning: true do
2178
- it "creates a papertrail version when changed" do
2179
- unless papertrail_supported_here?
2180
- skip("Unsupported in this combination of Ruby and Rails")
2181
- end
2182
-
2183
- user = User.create
2184
- product = Product.create
2185
-
2186
- expect(product.reviews_count).to eq(0)
2187
- expect(product.versions.count).to eq(1)
2188
-
2189
- user.reviews.create :user_id => user.id, :product_id => product.id, :approvals => 13
2190
-
2191
- product.reload
2192
-
2193
- expect(product.reviews_count).to eq(1)
2194
- expect(product.versions.count).to eq(2)
2195
-
2196
- attrs_from_versions = YAML.load(product.versions.reorder(:id).last.object)
2197
- # should be the value before the counter change
2198
- expect(attrs_from_versions['reviews_count']).to eq(0)
2199
-
2200
- user.reviews.create :user_id => user.id, :product_id => product.id, :approvals => 13
2201
-
2202
- product.reload
2203
-
2204
- expect(product.reviews_count).to eq(2)
2205
- expect(product.versions.count).to eq(3)
2206
-
2207
- attrs_from_versions = YAML.load(product.versions.reorder(:id).last.object)
2208
- # should be the value before the counter change
2209
- expect(attrs_from_versions['reviews_count']).to eq(1)
2210
- end
2211
-
2212
- context "counter-cache model versioning" do
2213
- let!(:main_obj) { SimpleMain.create(created_at: 1.day.ago, updated_at: 1.day.ago) }
2214
-
2215
- it "updates the updated_at of the parent variant" do
2216
- unless papertrail_supported_here?
2217
- skip("Unsupported in this combination of Ruby and Rails")
2218
- end
2219
-
2220
- the_time = Time.now.utc
2221
- Timecop.freeze(the_time) do
2222
- main_obj.simple_dependents.create!
2223
- expect(main_obj.reload.updated_at.to_i).to eq(the_time.to_i)
2224
- end
2225
- end
2226
-
2227
- it "sets the created_at time of the new version row to the current time" do
2228
- unless papertrail_supported_here?
2229
- skip("Unsupported in this combination of Ruby and Rails")
2230
- end
2231
-
2232
- the_time = Time.now.utc
2233
- Timecop.freeze(the_time) do
2234
- main_obj.simple_dependents.create!
2235
- expect(main_obj.versions.last.created_at.to_i).to eq(the_time.to_i)
2236
- end
2237
- end
2238
- end
2239
-
2240
- it "does not create a papertrail version when papertrail flag not set" do
2241
- unless papertrail_supported_here?
2242
- skip("Unsupported in this combination of Ruby and Rails")
2243
- end
2244
-
2245
- user = User.create
2246
- product = Product.create
2247
-
2248
- expect(user.reviews_count).to eq(0)
2249
- expect(user.versions.count).to eq(1)
2250
-
2251
- user.reviews.create :user_id => user.id, :product_id => product.id, :approvals => 13
2252
-
2253
- user.reload
2254
-
2255
- expect(user.reviews_count).to eq(1)
2256
- expect(user.versions.count).to eq(1)
2257
- end
2258
- end
2259
-
2260
- describe "with a module for the model" do
2261
- it "works" do
2262
- model2 = WithModule::Model2.create!
2263
- 5.times { WithModule::Model1.create!(model2: model2) }
2264
-
2265
- model2.reload
2266
- expect(model2.model1s_count).to eq(5)
2267
-
2268
- model2.update_column(:model1s_count, -1)
2269
-
2270
- WithModule::Model1.counter_culture_fix_counts
2271
-
2272
- model2.reload
2273
- expect(model2.model1s_count).to eq(5)
2274
- end
2275
- end
2276
-
2277
- private
2278
- def papertrail_supported_here?
2279
- return false if Rails.version < "5.0.0"
2280
- true
2281
- end
2282
- end