counter_culture 1.8.0 → 2.7.0

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