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.
- checksums.yaml +4 -4
- data/.circleci/config.yml +6 -0
- data/.gem_release.yml +5 -0
- data/.gitignore +13 -6
- data/.rspec +1 -1
- data/.rubocop.yml +3 -321
- data/.rubocop_todo.yml +197 -0
- data/CHANGELOG.md +155 -0
- data/Gemfile +14 -17
- data/{LICENSE.md → LICENSE} +1 -1
- data/README.md +63 -41
- data/Rakefile +3 -20
- data/app/assets/stylesheets/spree/frontend/solidus_reviews.css +4 -0
- data/app/controllers/spree/feedback_reviews_controller.rb +2 -8
- data/app/controllers/spree/reviews_controller.rb +29 -2
- data/app/decorators/controllers/solidus_reviews/spree/{admin/products_controller_decorator.rb → products_controller_decorator.rb} +0 -4
- data/app/decorators/models/solidus_reviews/spree/product_decorator.rb +6 -5
- data/app/helpers/spree/reviews_helper.rb +6 -6
- data/app/models/spree/feedback_review.rb +2 -2
- data/app/models/spree/permission_sets/review_display.rb +11 -0
- data/app/models/spree/permission_sets/review_management.rb +11 -0
- data/app/models/spree/review.rb +25 -10
- data/app/models/spree/reviews_ability.rb +7 -2
- data/app/models/spree/reviews_configuration.rb +10 -1
- data/app/overrides/add_reviews_tab_to_admin.rb +12 -4
- data/app/overrides/add_reviews_to_admin_configuration_sidebar.rb +12 -5
- data/app/views/spree/admin/review_settings/edit.html.erb +7 -0
- data/app/views/spree/admin/reviews/edit.html.erb +4 -2
- data/app/views/spree/admin/reviews/index.html.erb +9 -5
- data/app/views/spree/api/reviews/_feedback_review.json.jbuilder +1 -1
- data/app/views/spree/api/reviews/_review.json.jbuilder +1 -1
- data/app/views/spree/reviews/_form.html.erb +6 -4
- data/app/views/spree/reviews/edit.html.erb +3 -0
- data/app/views/spree/shared/_review.html.erb +6 -4
- data/bin/console +17 -0
- data/bin/rails +5 -5
- data/bin/rails-engine +13 -0
- data/bin/rails-sandbox +16 -0
- data/bin/rake +7 -0
- data/bin/sandbox +86 -0
- data/bin/setup +8 -0
- data/config/locales/de-CH.yml +1 -1
- data/config/locales/de.yml +1 -1
- data/config/locales/en-GB.yml +2 -1
- data/config/locales/en.yml +2 -1
- data/config/locales/es.yml +2 -1
- data/config/locales/fr.yml +1 -1
- data/config/locales/it.yml +1 -1
- data/config/locales/pl.yml +1 -1
- data/config/locales/pt-BR.yml +1 -1
- data/config/locales/pt.yml +1 -1
- data/config/locales/ro.yml +1 -1
- data/config/locales/sv.yml +1 -1
- data/config/locales/tr.yml +1 -1
- data/config/locales/uk.yml +1 -1
- data/config/locales/zh-CN.yml +1 -1
- data/config/locales/zh-TW.yml +1 -1
- data/config/routes.rb +3 -1
- data/db/migrate/20120123141326_recalculate_ratings.rb +1 -2
- data/db/migrate/20190613165528_add_verified_purchaser_to_reviews.rb +2 -0
- data/lib/controllers/spree/api/feedback_reviews_controller.rb +91 -0
- data/lib/controllers/spree/api/reviews_controller.rb +16 -14
- data/lib/generators/solidus_reviews/install/install_generator.rb +8 -7
- data/lib/solidus_reviews/engine.rb +26 -0
- data/lib/solidus_reviews/version.rb +5 -0
- data/lib/solidus_reviews.rb +4 -4
- data/solidus_reviews.gemspec +31 -34
- data/spec/controllers/spree/admin/feedback_reviews_controller_spec.rb +1 -1
- data/spec/controllers/spree/admin/review_settings_controller_spec.rb +3 -4
- data/spec/controllers/spree/admin/reviews_controller_spec.rb +3 -3
- data/spec/controllers/spree/api/feedback_reviews_controller_spec.rb +136 -0
- data/spec/controllers/spree/api/reviews_controller_spec.rb +27 -25
- data/spec/controllers/spree/feedback_reviews_controller_spec.rb +8 -8
- data/spec/controllers/spree/reviews_controller_spec.rb +145 -8
- data/spec/features/admin_spec.rb +6 -6
- data/spec/features/reviews_spec.rb +33 -32
- data/spec/fixtures/thinking-cat.jpg +0 -0
- data/spec/models/feedback_review_spec.rb +13 -13
- data/spec/models/product_spec.rb +13 -10
- data/spec/models/review_spec.rb +64 -41
- data/spec/models/reviews_ability_spec.rb +14 -14
- data/spec/models/reviews_configuration_spec.rb +21 -10
- data/spec/spec_helper.rb +18 -13
- data/spec/support/config.rb +7 -0
- data/spec/support/factories.rb +3 -0
- metadata +52 -213
- data/CONTRIBUTING.md +0 -28
- data/lib/spree_reviews/engine.rb +0 -22
- data/spec/controllers/spree/products_controller_spec.rb +0 -11
data/spec/models/review_spec.rb
CHANGED
@@ -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)).
|
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')).
|
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)).
|
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)).
|
34
|
-
expect(build(:review, rating: -5)).
|
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)).
|
39
|
-
expect(build(:review, rating: 8)).
|
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
|
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 '
|
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(
|
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(
|
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.
|
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(
|
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(
|
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(
|
101
|
-
expect(
|
102
|
-
expect(
|
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.
|
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(
|
116
|
-
expect(
|
117
|
-
|
118
|
-
Spree::Reviews::Config
|
119
|
-
expect(
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
Spree::Reviews::Config
|
126
|
-
expect(
|
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
|
-
|
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).
|
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
|
-
|
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 '
|
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
|
-
|
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
|
-
|
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
|
-
|
9
|
-
it '
|
10
|
-
Spree::Reviews::Config
|
11
|
-
expect(
|
12
|
-
Spree::Reviews::Config
|
13
|
-
expect(
|
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
|
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(
|
29
|
-
expect(
|
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
|
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(
|
41
|
-
expect(
|
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(
|
44
|
-
expect(
|
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 {
|
6
|
+
subject { described_class.new }
|
7
7
|
|
8
8
|
before do
|
9
|
-
|
10
|
-
subject.preference_store = subject.default_preferences
|
9
|
+
subject.reset
|
11
10
|
end
|
12
11
|
|
13
|
-
it '
|
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 '
|
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 '
|
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 '
|
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 '
|
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 '
|
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 '
|
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
|
-
|
4
|
-
|
3
|
+
# Configure Rails Environment
|
4
|
+
ENV['RAILS_ENV'] = 'test'
|
5
5
|
|
6
|
-
|
6
|
+
# Run Coverage report
|
7
|
+
require 'solidus_dev_support/rspec/coverage'
|
7
8
|
|
8
|
-
|
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
|
-
|
11
|
-
require '
|
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
|
-
|
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.
|
26
|
+
config.use_transactional_fixtures = false
|
21
27
|
|
22
|
-
|
23
|
-
|
24
|
-
|
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
|