solidus_reviews 1.2.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +6 -0
  3. data/.gem_release.yml +5 -0
  4. data/.gitignore +13 -6
  5. data/.rspec +1 -1
  6. data/.rubocop.yml +3 -321
  7. data/.rubocop_todo.yml +197 -0
  8. data/CHANGELOG.md +155 -0
  9. data/Gemfile +14 -17
  10. data/{LICENSE.md → LICENSE} +1 -1
  11. data/README.md +63 -41
  12. data/Rakefile +3 -20
  13. data/app/assets/stylesheets/spree/frontend/solidus_reviews.css +4 -0
  14. data/app/controllers/spree/feedback_reviews_controller.rb +2 -8
  15. data/app/controllers/spree/reviews_controller.rb +29 -2
  16. data/app/decorators/controllers/solidus_reviews/spree/{admin/products_controller_decorator.rb → products_controller_decorator.rb} +0 -4
  17. data/app/decorators/models/solidus_reviews/spree/product_decorator.rb +6 -5
  18. data/app/helpers/spree/reviews_helper.rb +6 -6
  19. data/app/models/spree/feedback_review.rb +2 -2
  20. data/app/models/spree/permission_sets/review_display.rb +11 -0
  21. data/app/models/spree/permission_sets/review_management.rb +11 -0
  22. data/app/models/spree/review.rb +25 -10
  23. data/app/models/spree/reviews_ability.rb +7 -2
  24. data/app/models/spree/reviews_configuration.rb +10 -1
  25. data/app/overrides/add_reviews_tab_to_admin.rb +12 -4
  26. data/app/overrides/add_reviews_to_admin_configuration_sidebar.rb +12 -5
  27. data/app/views/spree/admin/review_settings/edit.html.erb +7 -0
  28. data/app/views/spree/admin/reviews/edit.html.erb +4 -2
  29. data/app/views/spree/admin/reviews/index.html.erb +9 -5
  30. data/app/views/spree/api/reviews/_feedback_review.json.jbuilder +1 -1
  31. data/app/views/spree/api/reviews/_review.json.jbuilder +1 -1
  32. data/app/views/spree/reviews/_form.html.erb +6 -4
  33. data/app/views/spree/reviews/edit.html.erb +3 -0
  34. data/app/views/spree/shared/_review.html.erb +6 -4
  35. data/bin/console +17 -0
  36. data/bin/rails +5 -5
  37. data/bin/rails-engine +13 -0
  38. data/bin/rails-sandbox +16 -0
  39. data/bin/rake +7 -0
  40. data/bin/sandbox +86 -0
  41. data/bin/setup +8 -0
  42. data/config/locales/de-CH.yml +1 -1
  43. data/config/locales/de.yml +1 -1
  44. data/config/locales/en-GB.yml +2 -1
  45. data/config/locales/en.yml +2 -1
  46. data/config/locales/es.yml +2 -1
  47. data/config/locales/fr.yml +1 -1
  48. data/config/locales/it.yml +1 -1
  49. data/config/locales/pl.yml +1 -1
  50. data/config/locales/pt-BR.yml +1 -1
  51. data/config/locales/pt.yml +1 -1
  52. data/config/locales/ro.yml +1 -1
  53. data/config/locales/sv.yml +1 -1
  54. data/config/locales/tr.yml +1 -1
  55. data/config/locales/uk.yml +1 -1
  56. data/config/locales/zh-CN.yml +1 -1
  57. data/config/locales/zh-TW.yml +1 -1
  58. data/config/routes.rb +3 -1
  59. data/db/migrate/20120123141326_recalculate_ratings.rb +1 -2
  60. data/db/migrate/20190613165528_add_verified_purchaser_to_reviews.rb +2 -0
  61. data/lib/controllers/spree/api/feedback_reviews_controller.rb +91 -0
  62. data/lib/controllers/spree/api/reviews_controller.rb +16 -14
  63. data/lib/generators/solidus_reviews/install/install_generator.rb +8 -7
  64. data/lib/solidus_reviews/engine.rb +26 -0
  65. data/lib/solidus_reviews/version.rb +5 -0
  66. data/lib/solidus_reviews.rb +4 -4
  67. data/solidus_reviews.gemspec +31 -34
  68. data/spec/controllers/spree/admin/feedback_reviews_controller_spec.rb +1 -1
  69. data/spec/controllers/spree/admin/review_settings_controller_spec.rb +3 -4
  70. data/spec/controllers/spree/admin/reviews_controller_spec.rb +3 -3
  71. data/spec/controllers/spree/api/feedback_reviews_controller_spec.rb +136 -0
  72. data/spec/controllers/spree/api/reviews_controller_spec.rb +27 -25
  73. data/spec/controllers/spree/feedback_reviews_controller_spec.rb +8 -8
  74. data/spec/controllers/spree/reviews_controller_spec.rb +145 -8
  75. data/spec/features/admin_spec.rb +6 -6
  76. data/spec/features/reviews_spec.rb +33 -32
  77. data/spec/fixtures/thinking-cat.jpg +0 -0
  78. data/spec/models/feedback_review_spec.rb +13 -13
  79. data/spec/models/product_spec.rb +13 -10
  80. data/spec/models/review_spec.rb +64 -41
  81. data/spec/models/reviews_ability_spec.rb +14 -14
  82. data/spec/models/reviews_configuration_spec.rb +21 -10
  83. data/spec/spec_helper.rb +18 -13
  84. data/spec/support/config.rb +7 -0
  85. data/spec/support/factories.rb +3 -0
  86. metadata +52 -213
  87. data/CONTRIBUTING.md +0 -28
  88. data/lib/spree_reviews/engine.rb +0 -22
  89. data/spec/controllers/spree/products_controller_spec.rb +0 -11
@@ -18,36 +18,36 @@ describe Spree::Review do
18
18
 
19
19
  context 'rating' do
20
20
  it 'does not validate when no rating is specified' do
21
- expect(build(:review, rating: nil)).to_not be_valid
21
+ expect(build(:review, rating: nil)).not_to be_valid
22
22
  end
23
23
 
24
24
  it 'does not validate when the rating is not a number' do
25
- expect(build(:review, rating: 'not_a_number')).to_not be_valid
25
+ expect(build(:review, rating: 'not_a_number')).not_to be_valid
26
26
  end
27
27
 
28
28
  it 'does not validate when the rating is a float' do
29
- expect(build(:review, rating: 2.718)).to_not be_valid
29
+ expect(build(:review, rating: 2.718)).not_to be_valid
30
30
  end
31
31
 
32
32
  it 'does not validate when the rating is less than 1' do
33
- expect(build(:review, rating: 0)).to_not be_valid
34
- expect(build(:review, rating: -5)).to_not be_valid
33
+ expect(build(:review, rating: 0)).not_to be_valid
34
+ expect(build(:review, rating: -5)).not_to be_valid
35
35
  end
36
36
 
37
37
  it 'does not validate when the rating is greater than 5' do
38
- expect(build(:review, rating: 6)).to_not be_valid
39
- expect(build(:review, rating: 8)).to_not be_valid
38
+ expect(build(:review, rating: 6)).not_to be_valid
39
+ expect(build(:review, rating: 8)).not_to be_valid
40
40
  end
41
41
 
42
42
  (1..5).each do |i|
43
- it 'validates when the rating is #{i}' do
43
+ it "validates when the rating is #{i}" do
44
44
  expect(build(:review, rating: i)).to be_valid
45
45
  end
46
46
  end
47
47
  end
48
48
 
49
49
  context 'review body' do
50
- it 'should be valid without a body' do
50
+ it 'is valid without a body' do
51
51
  expect(build(:review, review: nil)).to be_valid
52
52
  end
53
53
  end
@@ -60,11 +60,11 @@ describe Spree::Review do
60
60
  let!(:review_3) { create(:review, created_at: 5.days.ago) }
61
61
 
62
62
  it 'properly runs most_recent_first queries' do
63
- expect(Spree::Review.most_recent_first.to_a).to eq([review_2, review_3, review_1])
63
+ expect(described_class.most_recent_first.to_a).to eq([review_2, review_3, review_1])
64
64
  end
65
65
 
66
66
  it 'defaults to most_recent_first queries' do
67
- expect(Spree::Review.all.to_a).to eq([review_2, review_3, review_1])
67
+ expect(described_class.all.to_a).to eq([review_2, review_3, review_1])
68
68
  end
69
69
  end
70
70
 
@@ -72,19 +72,14 @@ describe Spree::Review do
72
72
  let!(:review_1) { create(:review, created_at: 10.days.ago) }
73
73
  let!(:review_2) { create(:review, created_at: 2.days.ago) }
74
74
  let!(:review_3) { create(:review, created_at: 5.days.ago) }
75
- let!(:review_4) { create(:review, created_at: 1.days.ago) }
76
-
77
- before do
78
- reset_spree_preferences
79
- Spree::Reviews::Config.preference_store = Spree::Reviews::Config.default_preferences
80
- end
75
+ let!(:review_4) { create(:review, created_at: 1.day.ago) }
81
76
 
82
77
  it 'properly runs oldest_first queries' do
83
- expect(Spree::Review.oldest_first.to_a).to 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])
84
79
  end
85
80
 
86
81
  it 'uses oldest_first for preview' do
87
- expect(Spree::Review.preview.to_a).to eq([review_1, review_3, review_2])
82
+ expect(described_class.preview.to_a).to eq([review_1, review_3, review_2])
88
83
  end
89
84
  end
90
85
 
@@ -97,9 +92,9 @@ describe Spree::Review do
97
92
  let!(:fr_review_1) { create(:review, locale: 'fr', created_at: 10.days.ago) }
98
93
 
99
94
  it 'properly runs localized queries' do
100
- expect(Spree::Review.localized('en').to_a).to eq([en_review_2, en_review_3, en_review_1])
101
- expect(Spree::Review.localized('es').to_a).to eq([es_review_1])
102
- expect(Spree::Review.localized('fr').to_a).to 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])
103
98
  end
104
99
  end
105
100
 
@@ -109,26 +104,26 @@ describe Spree::Review do
109
104
  let!(:approved_review_3) { create(:review, approved: true, created_at: 5.days.ago) }
110
105
 
111
106
  let!(:unapproved_review_1) { create(:review, approved: false, created_at: 7.days.ago) }
112
- 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) }
113
108
 
114
109
  it 'properly runs approved and unapproved queries' do
115
- expect(Spree::Review.approved.to_a).to eq([approved_review_2, approved_review_3, approved_review_1])
116
- expect(Spree::Review.not_approved.to_a).to eq([unapproved_review_2, unapproved_review_1])
117
-
118
- Spree::Reviews::Config[:include_unapproved_reviews] = true
119
- expect(Spree::Review.default_approval_filter.to_a).to eq([unapproved_review_2,
120
- approved_review_2,
121
- approved_review_3,
122
- unapproved_review_1,
123
- approved_review_1])
124
-
125
- Spree::Reviews::Config[:include_unapproved_reviews] = false
126
- expect(Spree::Review.default_approval_filter.to_a).to 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])
127
122
  end
128
123
  end
129
124
  end
130
125
 
131
- context '#recalculate_product_rating' do
126
+ describe '#recalculate_product_rating' do
132
127
  let(:product) { create(:product) }
133
128
  let!(:review) { create(:review, product: product) }
134
129
 
@@ -141,7 +136,7 @@ describe Spree::Review do
141
136
  end
142
137
 
143
138
  it 'if not approved' do
144
- expect(review).to_not receive(:recalculate_product_rating)
139
+ expect(review).not_to receive(:recalculate_product_rating)
145
140
  review.save!
146
141
  end
147
142
 
@@ -152,8 +147,9 @@ describe Spree::Review do
152
147
  end
153
148
  end
154
149
 
155
- context '#feedback_stars' do
150
+ describe '#feedback_stars' do
156
151
  let!(:review) { create(:review) }
152
+
157
153
  before do
158
154
  3.times do |i|
159
155
  f = Spree::FeedbackReview.new
@@ -163,12 +159,12 @@ describe Spree::Review do
163
159
  end
164
160
  end
165
161
 
166
- it 'should return the average rating from feedback reviews' do
162
+ it 'returns the average rating from feedback reviews' do
167
163
  expect(review.feedback_stars).to eq 2
168
164
  end
169
165
  end
170
166
 
171
- context '#email' do
167
+ describe '#email' do
172
168
  it 'returns email from user' do
173
169
  user = build(:user, email: 'john@smith.com')
174
170
  review = build(:review, user: user)
@@ -191,7 +187,7 @@ describe Spree::Review do
191
187
  end
192
188
  end
193
189
 
194
- context "#verify_purchaser" do
190
+ describe "#verify_purchaser" do
195
191
  let(:order) { create(:completed_order_with_totals) }
196
192
  let(:product) { order.products.first }
197
193
  let(:user) { order.user }
@@ -223,4 +219,31 @@ describe Spree::Review do
223
219
  expect(review.verified_purchaser).to eq(false)
224
220
  end
225
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)
247
+ end
248
+ end
226
249
  end
@@ -5,12 +5,12 @@ require 'spec_helper'
5
5
  require "cancan/matchers"
6
6
 
7
7
  describe Spree::ReviewsAbility do
8
- context '.allow_anonymous_reviews?' do
9
- it 'should depend on Spree::Reviews::Config[:require_login]' do
10
- Spree::Reviews::Config[:require_login] = false
11
- expect(Spree::ReviewsAbility.allow_anonymous_reviews?).to be true
12
- Spree::Reviews::Config[:require_login] = true
13
- expect(Spree::ReviewsAbility.allow_anonymous_reviews?).to be false
8
+ describe '.allow_anonymous_reviews?' do
9
+ it 'depends on Spree::Reviews::Config[:require_login]' do
10
+ stub_spree_preferences(Spree::Reviews::Config, require_login: false)
11
+ expect(described_class.allow_anonymous_reviews?).to be true
12
+ stub_spree_preferences(Spree::Reviews::Config, require_login: true)
13
+ expect(described_class.allow_anonymous_reviews?).to be false
14
14
  end
15
15
  end
16
16
 
@@ -20,28 +20,28 @@ describe Spree::ReviewsAbility do
20
20
 
21
21
  context 'when anonymous reviews are allowed' do
22
22
  before do
23
- Spree::Reviews::Config[:require_login] = false
23
+ stub_spree_preferences(Spree::Reviews::Config, require_login: false)
24
24
  end
25
25
 
26
26
  it 'lets anyone create a review or feedback review' do
27
27
  [user_without_email, user_with_email].each do |u|
28
- expect(Spree::ReviewsAbility.new(u)).to be_able_to(:create, Spree::Review.new)
29
- expect(Spree::ReviewsAbility.new(u)).to be_able_to(:create, Spree::FeedbackReview.new)
28
+ expect(described_class.new(u)).to be_able_to(:create, Spree::Review.new)
29
+ expect(described_class.new(u)).to be_able_to(:create, Spree::FeedbackReview.new)
30
30
  end
31
31
  end
32
32
  end
33
33
 
34
34
  context 'when anonymous reviews are not allowed' do
35
35
  before do
36
- Spree::Reviews::Config[:require_login] = true
36
+ stub_spree_preferences(Spree::Reviews::Config, require_login: true)
37
37
  end
38
38
 
39
39
  it 'only allows users with an email to create a review or feedback review' do
40
- expect(Spree::ReviewsAbility.new(user_without_email)).to_not be_able_to(:create, Spree::Review.new)
41
- expect(Spree::ReviewsAbility.new(user_without_email)).to_not be_able_to(:create, Spree::FeedbackReview.new)
40
+ expect(described_class.new(user_without_email)).not_to be_able_to(:create, Spree::Review.new)
41
+ expect(described_class.new(user_without_email)).not_to be_able_to(:create, Spree::FeedbackReview.new)
42
42
 
43
- expect(Spree::ReviewsAbility.new(user_with_email)).to be_able_to(:create, Spree::Review.new)
44
- expect(Spree::ReviewsAbility.new(user_with_email)).to be_able_to(:create, Spree::FeedbackReview.new)
43
+ expect(described_class.new(user_with_email)).to be_able_to(:create, Spree::Review.new)
44
+ expect(described_class.new(user_with_email)).to be_able_to(:create, Spree::FeedbackReview.new)
45
45
  end
46
46
  end
47
47
  end
@@ -3,52 +3,63 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Spree::ReviewsConfiguration do
6
- subject { Spree::ReviewsConfiguration.new }
6
+ subject { described_class.new }
7
7
 
8
8
  before do
9
- reset_spree_preferences
10
- subject.preference_store = subject.default_preferences
9
+ subject.reset
11
10
  end
12
11
 
13
- it 'should have the include_unapproved_reviews preference' do
12
+ it 'has the include_unapproved_reviews preference' do
14
13
  expect(subject).to respond_to(:preferred_include_unapproved_reviews)
15
14
  expect(subject).to respond_to(:preferred_include_unapproved_reviews=)
16
15
  expect(subject.preferred_include_unapproved_reviews).to be false
17
16
  end
18
17
 
19
- it 'should have the preview_size preference' do
18
+ it 'has the preview_size preference' do
20
19
  expect(subject).to respond_to(:preferred_preview_size)
21
20
  expect(subject).to respond_to(:preferred_preview_size=)
22
21
  expect(subject.preferred_preview_size).to eq(3)
23
22
  end
24
23
 
25
- it 'should have the show_email preference' do
24
+ it 'has the show_email preference' do
26
25
  expect(subject).to respond_to(:preferred_show_email)
27
26
  expect(subject).to respond_to(:preferred_show_email=)
28
27
  expect(subject.preferred_show_email).to be false
29
28
  end
30
29
 
31
- it 'should have the show_verified_purchaser preference' do
30
+ it 'has the show_verified_purchaser preference' do
32
31
  expect(subject).to respond_to(:preferred_show_verified_purchaser)
33
32
  expect(subject).to respond_to(:preferred_show_verified_purchaser=)
34
33
  expect(subject.preferred_show_verified_purchaser).to be false
35
34
  end
36
35
 
37
- it 'should have the feedback_rating preference' do
36
+ it 'has the feedback_rating preference' do
38
37
  expect(subject).to respond_to(:preferred_feedback_rating)
39
38
  expect(subject).to respond_to(:preferred_feedback_rating=)
40
39
  expect(subject.preferred_feedback_rating).to be false
41
40
  end
42
41
 
43
- it 'should have the require_login preference' do
42
+ it 'has the require_login preference' do
44
43
  expect(subject).to respond_to(:preferred_require_login)
45
44
  expect(subject).to respond_to(:preferred_require_login=)
46
45
  expect(subject.preferred_require_login).to be true
47
46
  end
48
47
 
49
- it 'should have the track_locale preference' do
48
+ it 'has the track_locale preference' do
50
49
  expect(subject).to respond_to(:preferred_track_locale)
51
50
  expect(subject).to respond_to(:preferred_track_locale=)
52
51
  expect(subject.preferred_track_locale).to be false
53
52
  end
53
+
54
+ it 'has the approve_star_only preference' do
55
+ expect(subject).to respond_to(:preferred_approve_star_only)
56
+ expect(subject).to respond_to(:preferred_approve_star_only=)
57
+ expect(subject.preferred_approve_star_only).to be false
58
+ end
59
+
60
+ it 'has the approve_star_only_for_verified_purchaser preference' do
61
+ expect(subject).to respond_to(:preferred_approve_star_only_for_verified_purchaser)
62
+ expect(subject).to respond_to(:preferred_approve_star_only_for_verified_purchaser=)
63
+ expect(subject.preferred_approve_star_only_for_verified_purchaser).to be false
64
+ end
54
65
  end
data/spec/spec_helper.rb CHANGED
@@ -1,26 +1,31 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "simplecov"
4
- SimpleCov.start "rails"
3
+ # Configure Rails Environment
4
+ ENV['RAILS_ENV'] = 'test'
5
5
 
6
- ENV["RAILS_ENV"] ||= "test"
6
+ # Run Coverage report
7
+ require 'solidus_dev_support/rspec/coverage'
7
8
 
8
- require File.expand_path('dummy/config/environment.rb', __dir__)
9
+ # Create the dummy app if it's still missing.
10
+ dummy_env = "#{__dir__}/dummy/config/environment.rb"
11
+ system 'bin/rake extension:test_app' unless File.exist? dummy_env
12
+ require dummy_env
9
13
 
10
- require "solidus_support/extension/feature_helper"
11
- require 'spree/testing_support/controller_requests'
12
- require 'spree/testing_support/capybara_ext'
14
+ # Requires factories and other useful helpers defined in spree_core.
15
+ require 'solidus_dev_support/rspec/feature_helper'
13
16
 
14
- Dir[File.join(File.dirname(__FILE__), "support/**/*.rb")].each { |f| require f }
17
+ # Requires supporting ruby files with custom matchers and macros, etc,
18
+ # in spec/support/ and its subdirectories.
19
+ Dir["#{__dir__}/support/**/*.rb"].sort.each { |f| require f }
15
20
 
21
+ # Requires factories defined in lib/solidus_reviews/factories.rb
16
22
  require 'solidus_reviews/factories'
17
23
 
18
24
  RSpec.configure do |config|
19
25
  config.infer_spec_type_from_file_location!
20
- config.raise_errors_for_deprecations!
26
+ config.use_transactional_fixtures = false
21
27
 
22
- config.example_status_persistence_file_path = "./spec/examples.txt"
23
-
24
- config.include Spree::TestingSupport::UrlHelpers
25
- config.include Spree::TestingSupport::ControllerRequests, type: :controller
28
+ if Spree.solidus_gem_version < Gem::Version.new('2.11')
29
+ config.extend Spree::TestingSupport::AuthorizationHelpers::Request, type: :system
30
+ end
26
31
  end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.configure do |config|
4
+ config.before do
5
+ Spree::Reviews::Config.reset
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'solidus_reviews/factories'