solidus_reviews 1.0.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +35 -0
  3. data/.gem_release.yml +5 -0
  4. data/.github/stale.yml +17 -0
  5. data/.gitignore +12 -8
  6. data/.rspec +1 -1
  7. data/.rubocop.yml +2 -0
  8. data/.rubocop_todo.yml +221 -0
  9. data/CHANGELOG.md +132 -0
  10. data/Gemfile +17 -3
  11. data/{LICENSE.md → LICENSE} +2 -2
  12. data/README.md +33 -50
  13. data/Rakefile +5 -18
  14. data/app/controllers/spree/admin/feedback_reviews_controller.rb +3 -1
  15. data/app/controllers/spree/admin/review_settings_controller.rb +3 -1
  16. data/app/controllers/spree/admin/reviews_controller.rb +9 -6
  17. data/app/controllers/spree/feedback_reviews_controller.rb +19 -19
  18. data/app/controllers/spree/reviews_controller.rb +38 -7
  19. data/app/decorators/controllers/solidus_reviews/spree/products_controller_decorator.rb +15 -0
  20. data/app/decorators/helpers/solidus_reviews/spree/api/api_helpers_decorator.rb +33 -0
  21. data/app/decorators/models/solidus_reviews/spree/product_decorator.rb +31 -0
  22. data/app/decorators/models/solidus_reviews/spree/user_decorator.rb +15 -0
  23. data/app/helpers/spree/reviews_helper.rb +15 -5
  24. data/app/models/spree/feedback_review.rb +7 -6
  25. data/app/models/spree/permission_sets/review_display.rb +11 -0
  26. data/app/models/spree/permission_sets/review_management.rb +11 -0
  27. data/app/models/spree/review.rb +46 -13
  28. data/app/models/spree/reviews_ability.rb +24 -5
  29. data/app/models/spree/reviews_configuration.rb +25 -8
  30. data/app/overrides/add_reviews_after_product_properties.rb +7 -5
  31. data/app/overrides/add_reviews_tab_to_admin.rb +20 -4
  32. data/app/overrides/add_reviews_to_admin_configuration_sidebar.rb +20 -5
  33. data/app/views/spree/admin/feedback_reviews/index.html.erb +9 -9
  34. data/app/views/spree/admin/review_settings/edit.html.erb +71 -35
  35. data/app/views/spree/admin/reviews/_form.html.erb +26 -5
  36. data/app/views/spree/admin/reviews/edit.html.erb +5 -3
  37. data/app/views/spree/admin/reviews/index.html.erb +104 -88
  38. data/app/views/spree/api/reviews/_feedback_review.json.jbuilder +5 -0
  39. data/app/views/spree/api/reviews/_review.json.jbuilder +11 -0
  40. data/app/views/spree/api/reviews/index.json.jbuilder +6 -0
  41. data/app/views/spree/api/reviews/show.json.jbuilder +3 -0
  42. data/app/views/spree/feedback_reviews/_form.html.erb +5 -5
  43. data/app/views/spree/feedback_reviews/_summary.html.erb +3 -3
  44. data/app/views/spree/feedback_reviews/create.js.erb +2 -2
  45. data/app/views/spree/reviews/_form.html.erb +17 -10
  46. data/app/views/spree/reviews/edit.html.erb +3 -0
  47. data/app/views/spree/reviews/new.html.erb +2 -2
  48. data/app/views/spree/shared/_rating.html.erb +3 -3
  49. data/app/views/spree/shared/_review.html.erb +31 -19
  50. data/app/views/spree/shared/_review_summary.html.erb +3 -3
  51. data/app/views/spree/shared/_reviews.html.erb +6 -6
  52. data/app/views/spree/shared/_shortrating.html.erb +2 -2
  53. data/bin/console +17 -0
  54. data/bin/rails +13 -3
  55. data/bin/setup +8 -0
  56. data/config/initializers/constants.rb +2 -0
  57. data/config/initializers/load_preferences.rb +2 -0
  58. data/config/locales/de-CH.yml +15 -2
  59. data/config/locales/de.yml +15 -2
  60. data/config/locales/en-GB.yml +16 -3
  61. data/config/locales/en.yml +16 -2
  62. data/config/locales/es.yml +16 -3
  63. data/config/locales/fr.yml +15 -3
  64. data/config/locales/it.yml +79 -0
  65. data/config/locales/pl.yml +15 -3
  66. data/config/locales/pt-BR.yml +15 -3
  67. data/config/locales/pt.yml +15 -3
  68. data/config/locales/ro.yml +16 -4
  69. data/config/locales/ru.yml +14 -2
  70. data/config/locales/sv.yml +15 -2
  71. data/config/locales/tr.yml +15 -3
  72. data/config/locales/uk.yml +15 -2
  73. data/config/locales/zh-CN.yml +15 -2
  74. data/config/locales/zh-TW.yml +15 -2
  75. data/config/routes.rb +21 -2
  76. data/db/migrate/20081020220724_create_reviews.rb +4 -2
  77. data/db/migrate/20101222083309_create_feedback_reviews.rb +5 -3
  78. data/db/migrate/20110406083603_add_rating_to_products.rb +7 -5
  79. data/db/migrate/20110606150524_add_user_to_reviews.rb +4 -2
  80. data/db/migrate/20110806093221_add_ip_address_to_reviews.rb +3 -1
  81. data/db/migrate/20120110172331_namespace_tables.rb +3 -1
  82. data/db/migrate/20120123141326_recalculate_ratings.rb +7 -7
  83. data/db/migrate/20120712182514_add_locale_to_reviews.rb +4 -2
  84. data/db/migrate/20120712182627_add_locale_to_feedback_reviews.rb +4 -2
  85. data/db/migrate/20140703200946_add_show_identifier_to_reviews.rb +3 -1
  86. data/db/migrate/20190613165528_add_verified_purchaser_to_reviews.rb +7 -0
  87. data/lib/controllers/spree/api/feedback_reviews_controller.rb +91 -0
  88. data/lib/controllers/spree/api/reviews_controller.rb +113 -0
  89. data/lib/generators/solidus_reviews/install/install_generator.rb +5 -4
  90. data/lib/solidus_reviews.rb +7 -5
  91. data/lib/solidus_reviews/engine.rb +26 -0
  92. data/lib/solidus_reviews/factories.rb +3 -1
  93. data/lib/solidus_reviews/factories/feedback_review_factory.rb +6 -5
  94. data/lib/solidus_reviews/factories/review_factory.rb +19 -9
  95. data/lib/solidus_reviews/version.rb +5 -0
  96. data/solidus_reviews.gemspec +32 -32
  97. data/spec/controllers/{admin → spree/admin}/feedback_reviews_controller_spec.rb +10 -8
  98. data/spec/controllers/spree/admin/review_settings_controller_spec.rb +58 -0
  99. data/spec/controllers/spree/admin/reviews_controller_spec.rb +65 -0
  100. data/spec/controllers/spree/api/feedback_reviews_controller_spec.rb +136 -0
  101. data/spec/controllers/spree/api/reviews_controller_spec.rb +238 -0
  102. data/spec/controllers/spree/feedback_reviews_controller_spec.rb +75 -0
  103. data/spec/controllers/spree/reviews_controller_spec.rb +298 -0
  104. data/spec/features/admin_spec.rb +9 -6
  105. data/spec/features/reviews_spec.rb +54 -37
  106. data/spec/helpers/review_helper_spec.rb +3 -2
  107. data/spec/models/feedback_review_spec.rb +19 -17
  108. data/spec/models/product_spec.rb +49 -24
  109. data/spec/models/review_spec.rb +133 -52
  110. data/spec/models/reviews_ability_spec.rb +16 -14
  111. data/spec/models/reviews_configuration_spec.rb +46 -26
  112. data/spec/spec_helper.rb +13 -44
  113. data/spec/support/config.rb +7 -0
  114. data/spec/support/factories.rb +3 -0
  115. data/vendor/assets/javascripts/jquery.rating.js +389 -376
  116. metadata +81 -190
  117. data/.travis.yml +0 -18
  118. data/CONTRIBUTING.md +0 -28
  119. data/app/controllers/spree/products_controller_decorator.rb +0 -5
  120. data/app/models/spree/product_decorator.rb +0 -21
  121. data/lib/spree_reviews/engine.rb +0 -17
  122. data/spec/controllers/admin/review_settings_controller_spec.rb +0 -57
  123. data/spec/controllers/admin/reviews_controller_spec.rb +0 -63
  124. data/spec/controllers/feedback_reviews_controller_spec.rb +0 -71
  125. data/spec/controllers/products_controller_spec.rb +0 -9
  126. data/spec/controllers/reviews_controller_spec.rb +0 -136
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Spree::ReviewsHelper do
@@ -11,7 +13,6 @@ describe Spree::ReviewsHelper do
11
13
  specify do
12
14
  matches = mk_stars(2).scan(/unlit/)
13
15
  expect(matches.length).to eq 3
14
-
15
16
  end
16
17
  end
17
18
 
@@ -25,4 +26,4 @@ describe Spree::ReviewsHelper do
25
26
  expect(txt_stars(3, false)).to eq('3')
26
27
  end
27
28
  end
28
- end
29
+ end
@@ -1,45 +1,47 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Spree::FeedbackReview do
4
6
  context 'validations' do
5
7
  it 'validates by default' do
6
- build(:feedback_review).should be_valid
8
+ expect(build(:feedback_review)).to be_valid
7
9
  end
8
10
 
9
11
  it 'validates with a nil user' do
10
- build(:feedback_review, user: nil).should be_valid
12
+ expect(build(:feedback_review, user: nil)).to be_valid
11
13
  end
12
14
 
13
15
  it 'does not validate with a nil review' do
14
- build(:feedback_review, review: nil).should_not be_valid
16
+ expect(build(:feedback_review, review: nil)).not_to be_valid
15
17
  end
16
18
 
17
19
  context 'rating' do
18
20
  it 'does not validate when no rating is specified' do
19
- build(:feedback_review, rating: nil).should_not be_valid
21
+ expect(build(:feedback_review, rating: nil)).not_to be_valid
20
22
  end
21
23
 
22
24
  it 'does not validate when the rating is not a number' do
23
- build(:feedback_review, rating: 'not_a_number').should_not be_valid
25
+ expect(build(:feedback_review, rating: 'not_a_number')).not_to be_valid
24
26
  end
25
27
 
26
28
  it 'does not validate when the rating is a float' do
27
- build(:feedback_review, rating: 2.718).should_not be_valid
29
+ expect(build(:feedback_review, rating: 2.718)).not_to be_valid
28
30
  end
29
31
 
30
32
  it 'does not validate when the rating is less than 1' do
31
- build(:feedback_review, rating: 0).should_not be_valid
32
- build(:feedback_review, rating: -5).should_not be_valid
33
+ expect(build(:feedback_review, rating: 0)).not_to be_valid
34
+ expect(build(:feedback_review, rating: -5)).not_to be_valid
33
35
  end
34
36
 
35
37
  it 'does not validate when the rating is greater than 5' do
36
- build(:feedback_review, rating: 6).should_not be_valid
37
- build(:feedback_review, rating: 8).should_not be_valid
38
+ expect(build(:feedback_review, rating: 6)).not_to be_valid
39
+ expect(build(:feedback_review, rating: 8)).not_to be_valid
38
40
  end
39
41
 
40
42
  (1..5).each do |i|
41
43
  it "validates when the rating is #{i}" do
42
- build(:feedback_review, rating: i).should be_valid
44
+ expect(build(:feedback_review, rating: i)).to be_valid
43
45
  end
44
46
  end
45
47
  end
@@ -52,11 +54,11 @@ describe Spree::FeedbackReview do
52
54
  let!(:feedback_review_3) { create(:feedback_review, created_at: 5.days.ago) }
53
55
 
54
56
  it 'properly runs most_recent_first queries' do
55
- Spree::FeedbackReview.most_recent_first.to_a.should eq([feedback_review_2, feedback_review_3, feedback_review_1])
57
+ expect(described_class.most_recent_first.to_a).to eq([feedback_review_2, feedback_review_3, feedback_review_1])
56
58
  end
57
59
 
58
60
  it 'defaults to most_recent_first queries' do
59
- Spree::FeedbackReview.all.to_a.should eq([feedback_review_2, feedback_review_3, feedback_review_1])
61
+ expect(described_class.all.to_a).to eq([feedback_review_2, feedback_review_3, feedback_review_1])
60
62
  end
61
63
  end
62
64
 
@@ -69,10 +71,10 @@ describe Spree::FeedbackReview do
69
71
  let!(:fr_feedback_review_1) { create(:feedback_review, locale: 'fr', created_at: 10.days.ago) }
70
72
 
71
73
  it 'properly runs localized queries' do
72
- Spree::FeedbackReview.localized('en').to_a.should eq([en_feedback_review_2, en_feedback_review_3, en_feedback_review_1])
73
- Spree::FeedbackReview.localized('es').to_a.should eq([es_feedback_review_1])
74
- Spree::FeedbackReview.localized('fr').to_a.should eq([fr_feedback_review_1])
74
+ expect(described_class.localized('en').to_a).to eq([en_feedback_review_2, en_feedback_review_3, en_feedback_review_1])
75
+ expect(described_class.localized('es').to_a).to eq([es_feedback_review_1])
76
+ expect(described_class.localized('fr').to_a).to eq([fr_feedback_review_1])
75
77
  end
76
78
  end
77
79
  end
78
- end
80
+ end
@@ -1,31 +1,33 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Spree::Product do
4
- it { should respond_to(:avg_rating) }
5
- it { should respond_to(:reviews) }
6
- it { should respond_to(:stars) }
6
+ it { is_expected.to respond_to(:avg_rating) }
7
+ it { is_expected.to respond_to(:reviews) }
8
+ it { is_expected.to respond_to(:stars) }
7
9
 
8
- context '#stars' do
10
+ describe '#stars' do
9
11
  let(:product) { build(:product) }
10
12
 
11
13
  it 'rounds' do
12
- product.stub(:avg_rating).and_return(3.7)
14
+ allow(product).to receive(:avg_rating).and_return(3.7)
13
15
  expect(product.stars).to eq(4)
14
16
 
15
- product.stub(:avg_rating).and_return(2.3)
17
+ allow(product).to receive(:avg_rating).and_return(2.3)
16
18
  expect(product.stars).to eq(2)
17
19
  end
18
20
 
19
-
20
21
  it 'handles a nil value' do
21
- product.stub(:avg_rating).and_return(nil)
22
+ allow(product).to receive(:avg_rating).and_return(nil)
23
+
22
24
  expect {
23
25
  expect(product.stars).to eq(0)
24
26
  }.not_to raise_error
25
27
  end
26
28
  end
27
29
 
28
- context '#recalculate_rating' do
30
+ describe '#recalculate_rating' do
29
31
  let!(:product) { create(:product) }
30
32
 
31
33
  context 'when there are approved reviews' do
@@ -33,30 +35,53 @@ describe Spree::Product do
33
35
  let!(:approved_review_2) { create(:review, product: product, approved: true, rating: 5) }
34
36
  let!(:unapproved_review_1) { create(:review, product: product, approved: false, rating: 4) }
35
37
 
36
- it "updates the product average rating and ignores unapproved reviews" do
37
- product.avg_rating = 0
38
- product.reviews_count = 0
39
- product.save!
38
+ context "including unapproved reviews" do
39
+ before do
40
+ stub_spree_preferences(Spree::Reviews::Config, include_unapproved_reviews: true)
41
+ end
40
42
 
41
- product.recalculate_rating
42
- product.avg_rating.should eq(4.5)
43
- product.reviews_count.should eq(2)
43
+ it "updates the product average rating and ignores unapproved reviews" do
44
+ product.avg_rating = 0
45
+ product.reviews_count = 0
46
+ product.save!
47
+
48
+ product.recalculate_rating
49
+ expect(product.avg_rating).to eq(4.3)
50
+ expect(product.reviews_count).to eq(3)
51
+ end
52
+ end
53
+
54
+ context "only approved reviews" do
55
+ before do
56
+ stub_spree_preferences(Spree::Reviews::Config, include_unapproved_reviews: false)
57
+ end
58
+
59
+ it "updates the product average rating and ignores unapproved reviews" do
60
+ product.avg_rating = 0
61
+ product.reviews_count = 0
62
+ product.save!
63
+
64
+ product.recalculate_rating
65
+ expect(product.avg_rating).to eq(4.5)
66
+ expect(product.reviews_count).to eq(2)
67
+ end
44
68
  end
45
69
  end
46
70
 
47
- context 'when no approved reviews' do
71
+ context "without unapproved reviews" do
48
72
  let!(:unapproved_review_1) { create(:review, product: product, approved: false, rating: 4) }
49
73
 
74
+ before do
75
+ stub_spree_preferences(Spree::Reviews::Config, include_unapproved_reviews: false)
76
+ end
77
+
50
78
  it "updates the product average rating and ignores unapproved reviews" do
51
- product.avg_rating = 3
52
- product.reviews_count = 20
53
- product.save!
79
+ product.update_columns(avg_rating: 3, reviews_count: 20)
54
80
 
55
81
  product.recalculate_rating
56
- product.avg_rating.should eq(0)
57
- product.reviews_count.should eq(0)
82
+ expect(product.avg_rating).to eq(0)
83
+ expect(product.reviews_count).to eq(0)
58
84
  end
59
85
  end
60
-
61
86
  end
62
- end
87
+ end
@@ -1,53 +1,54 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Spree::Review do
4
-
5
6
  context 'validations' do
6
7
  it 'validates by default' do
7
- build(:review).should be_valid
8
+ expect(build(:review)).to be_valid
8
9
  end
9
10
 
10
11
  it 'validates with a nil user' do
11
- build(:review, user: nil).should be_valid
12
+ expect(build(:review, user: nil)).to be_valid
12
13
  end
13
14
 
14
- it 'does not validate with a nil review' do
15
- build(:review, review: nil).should_not be_valid
15
+ it 'validates with a nil review' do
16
+ expect(build(:review, review: nil)).to be_valid
16
17
  end
17
18
 
18
19
  context 'rating' do
19
20
  it 'does not validate when no rating is specified' do
20
- build(:review, rating: nil).should_not be_valid
21
+ expect(build(:review, rating: nil)).not_to be_valid
21
22
  end
22
23
 
23
24
  it 'does not validate when the rating is not a number' do
24
- build(:review, rating: 'not_a_number').should_not be_valid
25
+ expect(build(:review, rating: 'not_a_number')).not_to be_valid
25
26
  end
26
27
 
27
28
  it 'does not validate when the rating is a float' do
28
- build(:review, rating: 2.718).should_not be_valid
29
+ expect(build(:review, rating: 2.718)).not_to be_valid
29
30
  end
30
31
 
31
32
  it 'does not validate when the rating is less than 1' do
32
- build(:review, rating: 0).should_not be_valid
33
- build(:review, rating: -5).should_not be_valid
33
+ expect(build(:review, rating: 0)).not_to be_valid
34
+ expect(build(:review, rating: -5)).not_to be_valid
34
35
  end
35
36
 
36
37
  it 'does not validate when the rating is greater than 5' do
37
- build(:review, rating: 6).should_not be_valid
38
- build(:review, rating: 8).should_not be_valid
38
+ expect(build(:review, rating: 6)).not_to be_valid
39
+ expect(build(:review, rating: 8)).not_to be_valid
39
40
  end
40
41
 
41
42
  (1..5).each do |i|
42
- it "validates when the rating is #{i}" do
43
- build(:review, rating: i).should be_valid
43
+ it 'validates when the rating is #{i}' do
44
+ expect(build(:review, rating: i)).to be_valid
44
45
  end
45
46
  end
46
47
  end
47
48
 
48
49
  context 'review body' do
49
- it 'should not be valid without a body' do
50
- build(:review, review: nil).should_not be_valid
50
+ it 'is valid without a body' do
51
+ expect(build(:review, review: nil)).to be_valid
51
52
  end
52
53
  end
53
54
  end
@@ -59,11 +60,11 @@ describe Spree::Review do
59
60
  let!(:review_3) { create(:review, created_at: 5.days.ago) }
60
61
 
61
62
  it 'properly runs most_recent_first queries' do
62
- Spree::Review.most_recent_first.to_a.should eq([review_2, review_3, review_1])
63
+ expect(described_class.most_recent_first.to_a).to eq([review_2, review_3, review_1])
63
64
  end
64
65
 
65
66
  it 'defaults to most_recent_first queries' do
66
- Spree::Review.all.to_a.should eq([review_2, review_3, review_1])
67
+ expect(described_class.all.to_a).to eq([review_2, review_3, review_1])
67
68
  end
68
69
  end
69
70
 
@@ -71,18 +72,14 @@ describe Spree::Review do
71
72
  let!(:review_1) { create(:review, created_at: 10.days.ago) }
72
73
  let!(:review_2) { create(:review, created_at: 2.days.ago) }
73
74
  let!(:review_3) { create(:review, created_at: 5.days.ago) }
74
- let!(:review_4) { create(:review, created_at: 1.days.ago) }
75
-
76
- before do
77
- reset_spree_preferences
78
- end
75
+ let!(:review_4) { create(:review, created_at: 1.day.ago) }
79
76
 
80
77
  it 'properly runs oldest_first queries' do
81
- Spree::Review.oldest_first.to_a.should eq([review_1, review_3, review_2, review_4])
78
+ expect(described_class.oldest_first.to_a).to eq([review_1, review_3, review_2, review_4])
82
79
  end
83
80
 
84
81
  it 'uses oldest_first for preview' do
85
- Spree::Review.preview.to_a.should eq([review_1, review_3])
82
+ expect(described_class.preview.to_a).to eq([review_1, review_3, review_2])
86
83
  end
87
84
  end
88
85
 
@@ -95,9 +92,9 @@ describe Spree::Review do
95
92
  let!(:fr_review_1) { create(:review, locale: 'fr', created_at: 10.days.ago) }
96
93
 
97
94
  it 'properly runs localized queries' do
98
- Spree::Review.localized('en').to_a.should eq([en_review_2, en_review_3, en_review_1])
99
- Spree::Review.localized('es').to_a.should eq([es_review_1])
100
- Spree::Review.localized('fr').to_a.should eq([fr_review_1])
95
+ expect(described_class.localized('en').to_a).to eq([en_review_2, en_review_3, en_review_1])
96
+ expect(described_class.localized('es').to_a).to eq([es_review_1])
97
+ expect(described_class.localized('fr').to_a).to eq([fr_review_1])
101
98
  end
102
99
  end
103
100
 
@@ -107,62 +104,146 @@ describe Spree::Review do
107
104
  let!(:approved_review_3) { create(:review, approved: true, created_at: 5.days.ago) }
108
105
 
109
106
  let!(:unapproved_review_1) { create(:review, approved: false, created_at: 7.days.ago) }
110
- let!(:unapproved_review_2) { create(:review, approved: false, created_at: 1.days.ago) }
107
+ let!(:unapproved_review_2) { create(:review, approved: false, created_at: 1.day.ago) }
111
108
 
112
109
  it 'properly runs approved and unapproved queries' do
113
- Spree::Review.approved.to_a.should eq([approved_review_2, approved_review_3, approved_review_1])
114
- Spree::Review.not_approved.to_a.should eq([unapproved_review_2, unapproved_review_1])
115
-
116
- Spree::Reviews::Config[:include_unapproved_reviews] = true
117
- Spree::Review.default_approval_filter.to_a.should eq([unapproved_review_2,
118
- approved_review_2,
119
- approved_review_3,
120
- unapproved_review_1,
121
- approved_review_1])
122
-
123
- Spree::Reviews::Config[:include_unapproved_reviews] = false
124
- Spree::Review.default_approval_filter.to_a.should eq([approved_review_2, approved_review_3, approved_review_1])
110
+ expect(described_class.approved.to_a).to eq([approved_review_2, approved_review_3, approved_review_1])
111
+ expect(described_class.not_approved.to_a).to eq([unapproved_review_2, unapproved_review_1])
112
+
113
+ stub_spree_preferences(Spree::Reviews::Config, include_unapproved_reviews: true)
114
+ expect(described_class.default_approval_filter.to_a).to eq([unapproved_review_2,
115
+ approved_review_2,
116
+ approved_review_3,
117
+ unapproved_review_1,
118
+ approved_review_1])
119
+
120
+ stub_spree_preferences(Spree::Reviews::Config, include_unapproved_reviews: false)
121
+ expect(described_class.default_approval_filter.to_a).to eq([approved_review_2, approved_review_3, approved_review_1])
125
122
  end
126
123
  end
127
124
  end
128
125
 
129
- context "#recalculate_product_rating" do
126
+ describe '#recalculate_product_rating' do
130
127
  let(:product) { create(:product) }
131
128
  let!(:review) { create(:review, product: product) }
132
129
 
133
130
  before { product.reviews << review }
134
131
 
135
- it "if approved" do
136
- review.should_receive(:recalculate_product_rating)
132
+ it 'if approved' do
133
+ expect(review).to receive(:recalculate_product_rating)
137
134
  review.approved = true
138
135
  review.save!
139
136
  end
140
137
 
141
- it "if not approved" do
142
- review.should_not_receive(:recalculate_product_rating)
138
+ it 'if not approved' do
139
+ expect(review).not_to receive(:recalculate_product_rating)
143
140
  review.save!
144
141
  end
145
142
 
146
- it "updates the product average rating" do
147
- review.product.should_receive(:recalculate_rating)
143
+ it 'updates the product average rating' do
144
+ expect(review.product).to receive(:recalculate_rating)
148
145
  review.approved = true
149
146
  review.save!
150
147
  end
151
148
  end
152
149
 
153
- context "#feedback_stars" do
150
+ describe '#feedback_stars' do
154
151
  let!(:review) { create(:review) }
152
+
155
153
  before do
156
154
  3.times do |i|
157
155
  f = Spree::FeedbackReview.new
158
156
  f.review = review
159
- f.rating = (i+1)
157
+ f.rating = (i + 1)
160
158
  f.save
161
159
  end
162
160
  end
163
161
 
164
- it "should return the average rating from feedback reviews" do
165
- review.feedback_stars.should == 2
162
+ it 'returns the average rating from feedback reviews' do
163
+ expect(review.feedback_stars).to eq 2
164
+ end
165
+ end
166
+
167
+ describe '#email' do
168
+ it 'returns email from user' do
169
+ user = build(:user, email: 'john@smith.com')
170
+ review = build(:review, user: user)
171
+ expect(review.email).to eq('john@smith.com')
172
+ end
173
+ end
174
+
175
+ context 'images' do
176
+ it 'supports images' do
177
+ review = build(:review, images: [build(:image)])
178
+ expect(review.images).not_to eq(nil)
179
+ end
180
+
181
+ it 'respects order' do
182
+ image_1 = build(:image, position: 2)
183
+ image_2 = build(:image, position: 1)
184
+ review = create(:review, images: [image_1, image_2])
185
+ review.reload
186
+ expect(review.images.first).to eq(image_2)
187
+ end
188
+ end
189
+
190
+ describe "#verify_purchaser" do
191
+ let(:order) { create(:completed_order_with_totals) }
192
+ let(:product) { order.products.first }
193
+ let(:user) { order.user }
194
+ let(:review) { build(:review, user: user, product: product) }
195
+
196
+ it "returns true if the user has purchased the product" do
197
+ expect(review.verified_purchaser).to eq(false)
198
+ review.verify_purchaser
199
+ expect(review.verified_purchaser).to eq(true)
200
+ end
201
+
202
+ it "returns false if the user has not purchased the product" do
203
+ review.user = create(:user)
204
+ expect(review.verified_purchaser).to eq(false)
205
+ review.verify_purchaser
206
+ expect(review.verified_purchaser).to eq(false)
207
+ end
208
+
209
+ it "returns nothing if there is no user_id or product_id" do
210
+ review.product_id = nil
211
+ expect(review.verified_purchaser).to eq(false)
212
+ review.verify_purchaser
213
+ expect(review.verified_purchaser).to eq(false)
214
+
215
+ review.product_id = product.id
216
+ review.user_id = nil
217
+ expect(review.verified_purchaser).to eq(false)
218
+ review.verify_purchaser
219
+ expect(review.verified_purchaser).to eq(false)
220
+ end
221
+ end
222
+
223
+ describe "#approve_review" do
224
+ let(:order) { create(:completed_order_with_totals) }
225
+ let(:product) { order.products.first }
226
+ let(:user) { order.user }
227
+ let(:review) { build(:review, title: '', review: '', user: user, product: product) }
228
+
229
+ it "auto approves star only review" do
230
+ stub_spree_preferences(Spree::Reviews::Config, approve_star_only: true)
231
+
232
+ expect(review.approved).to eq(false)
233
+ review.approve_review
234
+ expect(review.approved).to eq(true)
235
+ end
236
+
237
+ it "auto approves star only review for verified purchaser" do
238
+ stub_spree_preferences(Spree::Reviews::Config, approve_star_only_for_verified_purchaser: true)
239
+
240
+ expect(review.verified_purchaser).to eq(false)
241
+ expect(review.approved).to eq(false)
242
+ review.verify_purchaser
243
+ expect(review.verified_purchaser).to eq(true)
244
+ expect(review.approved).to eq(false)
245
+ review.approve_review
246
+ expect(review.approved).to eq(true)
166
247
  end
167
248
  end
168
249
  end