solidus_reviews 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +8 -318
- data/.rubocop_todo.yml +221 -0
- data/CHANGELOG.md +100 -0
- data/Gemfile +11 -10
- data/README.md +29 -44
- data/app/controllers/spree/feedback_reviews_controller.rb +2 -8
- data/app/controllers/spree/reviews_controller.rb +1 -1
- data/app/decorators/models/solidus_reviews/spree/product_decorator.rb +6 -5
- data/app/helpers/spree/reviews_helper.rb +5 -5
- data/app/models/spree/feedback_review.rb +1 -1
- data/app/models/spree/review.rb +9 -8
- data/app/models/spree/reviews_ability.rb +2 -2
- data/app/views/spree/api/reviews/_feedback_review.json.jbuilder +1 -1
- data/app/views/spree/api/reviews/_review.json.jbuilder +1 -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/reviews_controller.rb +16 -14
- data/lib/generators/solidus_reviews/install/install_generator.rb +1 -1
- data/lib/solidus_reviews.rb +4 -2
- data/lib/{spree_reviews → solidus_reviews}/engine.rb +3 -3
- data/lib/solidus_reviews/version.rb +5 -0
- data/solidus_reviews.gemspec +14 -23
- 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/reviews_controller_spec.rb +27 -25
- data/spec/controllers/spree/feedback_reviews_controller_spec.rb +7 -7
- data/spec/controllers/spree/products_controller_spec.rb +1 -1
- data/spec/controllers/spree/reviews_controller_spec.rb +6 -7
- data/spec/features/admin_spec.rb +6 -6
- data/spec/features/reviews_spec.rb +32 -31
- data/spec/models/feedback_review_spec.rb +13 -13
- data/spec/models/product_spec.rb +13 -10
- data/spec/models/review_spec.rb +36 -40
- data/spec/models/reviews_ability_spec.rb +14 -14
- data/spec/models/reviews_configuration_spec.rb +9 -10
- data/spec/spec_helper.rb +4 -19
- data/spec/support/config.rb +7 -0
- data/spec/support/factories.rb +3 -0
- metadata +18 -180
- data/CONTRIBUTING.md +0 -28
@@ -11,7 +11,7 @@ module SolidusReviews
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def add_stylesheets
|
14
|
-
inject_into_file "vendor/assets/stylesheets/spree/frontend/all.css", " *= require spree/frontend/solidus_reviews\n", before:
|
14
|
+
inject_into_file "vendor/assets/stylesheets/spree/frontend/all.css", " *= require spree/frontend/solidus_reviews\n", before: %r{\*/}, verbose: true
|
15
15
|
end
|
16
16
|
|
17
17
|
def add_migrations
|
data/lib/solidus_reviews.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
module
|
3
|
+
module SolidusReviews
|
4
4
|
class Engine < Rails::Engine
|
5
5
|
require 'spree/core'
|
6
|
-
isolate_namespace Spree
|
6
|
+
isolate_namespace ::Spree
|
7
7
|
engine_name 'solidus_reviews'
|
8
8
|
|
9
9
|
def self.activate
|
10
10
|
Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
|
11
11
|
Rails.configuration.cache_classes ? require(c) : load(c)
|
12
12
|
end
|
13
|
-
Spree::Ability.register_ability(Spree::ReviewsAbility)
|
13
|
+
::Spree::Ability.register_ability(::Spree::ReviewsAbility)
|
14
14
|
end
|
15
15
|
|
16
16
|
if SolidusSupport.api_available?
|
data/solidus_reviews.gemspec
CHANGED
@@ -1,37 +1,28 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
$:.push File.expand_path('lib', __dir__)
|
4
|
+
require 'solidus_reviews/version'
|
5
|
+
|
3
6
|
Gem::Specification.new do |s|
|
4
|
-
s.platform
|
5
|
-
s.name
|
6
|
-
s.version
|
7
|
-
s.summary
|
7
|
+
s.platform = Gem::Platform::RUBY
|
8
|
+
s.name = 'solidus_reviews'
|
9
|
+
s.version = SolidusReviews::VERSION
|
10
|
+
s.summary = 'Review and rating functionality for your Solidus store.'
|
8
11
|
s.authors = ['Solidus Contrib']
|
9
12
|
s.description = s.summary
|
10
13
|
s.required_ruby_version = '>= 1.9.3'
|
11
14
|
|
12
|
-
s.homepage
|
13
|
-
s.license
|
15
|
+
s.homepage = 'https://github.com/solidusio-contrib/solidus_reviews'
|
16
|
+
s.license = 'BSD-3'
|
14
17
|
|
15
|
-
s.files
|
16
|
-
s.test_files
|
18
|
+
s.files = `git ls-files`.split("\n")
|
19
|
+
s.test_files = `git ls-files -- spec/*`.split("\n")
|
17
20
|
s.require_path = 'lib'
|
18
21
|
s.requirements << 'none'
|
19
22
|
|
20
|
-
s.add_dependency 'deface', '~> 1'
|
23
|
+
s.add_dependency 'deface', '~> 1.0'
|
21
24
|
s.add_dependency 'solidus', ['>= 1.4', '< 3']
|
22
|
-
s.add_dependency 'solidus_support'
|
25
|
+
s.add_dependency 'solidus_support'
|
23
26
|
|
24
|
-
s.add_development_dependency '
|
25
|
-
s.add_development_dependency 'capybara-screenshot'
|
26
|
-
s.add_development_dependency 'coffee-rails'
|
27
|
-
s.add_development_dependency 'database_cleaner'
|
28
|
-
s.add_development_dependency 'ffaker'
|
29
|
-
s.add_development_dependency 'poltergeist'
|
30
|
-
s.add_development_dependency 'pry'
|
31
|
-
s.add_development_dependency 'rspec-rails', '~> 4.0.0.beta2'
|
32
|
-
s.add_development_dependency 'rubocop', '~> 0.53.0'
|
33
|
-
s.add_development_dependency 'sass-rails'
|
34
|
-
s.add_development_dependency 'selenium-webdriver'
|
35
|
-
s.add_development_dependency 'simplecov'
|
36
|
-
s.add_development_dependency 'sqlite3'
|
27
|
+
s.add_development_dependency 'solidus_extension_dev_tools'
|
37
28
|
end
|
@@ -10,7 +10,7 @@ describe Spree::Admin::FeedbackReviewsController do
|
|
10
10
|
allow(controller).to receive(:spree_current_user).and_return(user)
|
11
11
|
end
|
12
12
|
|
13
|
-
|
13
|
+
describe '#index' do
|
14
14
|
let!(:review) { create(:review) }
|
15
15
|
let!(:other_review) { create(:review) }
|
16
16
|
|
@@ -10,7 +10,7 @@ describe Spree::Admin::ReviewSettingsController do
|
|
10
10
|
allow(controller).to receive(:spree_current_user).and_return(user)
|
11
11
|
end
|
12
12
|
|
13
|
-
|
13
|
+
describe '#update' do
|
14
14
|
it 'redirects to edit-review-settings page' do
|
15
15
|
put :update, params: { preferences: { preview_size: 4 } }
|
16
16
|
expect(response).to redirect_to spree.edit_admin_review_settings_path
|
@@ -22,7 +22,6 @@ describe Spree::Admin::ReviewSettingsController do
|
|
22
22
|
feedback_rating: false,
|
23
23
|
require_login: true,
|
24
24
|
track_locale: true' do
|
25
|
-
|
26
25
|
it 'sets preferred_preview_size to 4' do
|
27
26
|
put :update, params: { preferences: { preview_size: 4 } }
|
28
27
|
expect(Spree::Reviews::Config.preferred_preview_size).to eq 4
|
@@ -50,8 +49,8 @@ describe Spree::Admin::ReviewSettingsController do
|
|
50
49
|
end
|
51
50
|
end
|
52
51
|
|
53
|
-
|
54
|
-
it '
|
52
|
+
describe '#edit' do
|
53
|
+
it 'renders the edit template' do
|
55
54
|
get :edit
|
56
55
|
expect(response).to render_template(:edit)
|
57
56
|
end
|
@@ -13,7 +13,7 @@ describe Spree::Admin::ReviewsController do
|
|
13
13
|
allow(controller).to receive(:spree_current_user).and_return(user)
|
14
14
|
end
|
15
15
|
|
16
|
-
|
16
|
+
describe '#index' do
|
17
17
|
it 'list reviews' do
|
18
18
|
reviews = [
|
19
19
|
create(:review, product: product),
|
@@ -24,7 +24,7 @@ describe Spree::Admin::ReviewsController do
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
|
27
|
+
describe '#approve' do
|
28
28
|
it 'show notice message when approved' do
|
29
29
|
review.update_attribute(:approved, true)
|
30
30
|
get :approve, params: { id: review.id }
|
@@ -39,7 +39,7 @@ describe Spree::Admin::ReviewsController do
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
-
|
42
|
+
describe '#edit' do
|
43
43
|
specify do
|
44
44
|
get :edit, params: { id: review.id }
|
45
45
|
expect(response.status).to eq(200)
|
@@ -24,7 +24,7 @@ describe Spree::Api::ReviewsController, type: :controller do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
context 'there are no reviews for a product' do
|
27
|
-
it '
|
27
|
+
it 'returns an empty array' do
|
28
28
|
expect(Spree::Review.count).to be >= 0
|
29
29
|
expect(subject["reviews"]).to be_empty
|
30
30
|
end
|
@@ -53,7 +53,7 @@ describe Spree::Api::ReviewsController, type: :controller do
|
|
53
53
|
end
|
54
54
|
|
55
55
|
context 'there are no reviews for the user' do
|
56
|
-
it '
|
56
|
+
it 'returns an empty array' do
|
57
57
|
expect(Spree::Review.count).to be >= 0
|
58
58
|
expect(subject["reviews"]).to be_empty
|
59
59
|
end
|
@@ -81,7 +81,7 @@ describe Spree::Api::ReviewsController, type: :controller do
|
|
81
81
|
context 'when it is the users review' do
|
82
82
|
before { review.update(user_id: user.id) }
|
83
83
|
|
84
|
-
it '
|
84
|
+
it 'returns the review' do
|
85
85
|
expect(subject).not_to be_empty
|
86
86
|
expect(subject["product_id"]).to eq(product.id)
|
87
87
|
expect(subject["name"]).to eq(review[:name])
|
@@ -94,7 +94,7 @@ describe Spree::Api::ReviewsController, type: :controller do
|
|
94
94
|
end
|
95
95
|
|
96
96
|
context 'when it is not the users review' do
|
97
|
-
it '
|
97
|
+
it 'returns with not authorized' do
|
98
98
|
expect(subject["error"]).not_to be_empty
|
99
99
|
expect(subject["error"]).to match(/not authorized/i)
|
100
100
|
end
|
@@ -102,7 +102,7 @@ describe Spree::Api::ReviewsController, type: :controller do
|
|
102
102
|
context 'and it the review is approved' do
|
103
103
|
before { review.update(approved: true) }
|
104
104
|
|
105
|
-
it '
|
105
|
+
it 'returns the review' do
|
106
106
|
expect(subject).not_to be_empty
|
107
107
|
expect(subject["product_id"]).to eq(product.id)
|
108
108
|
expect(subject["name"]).to eq(review[:name])
|
@@ -116,6 +116,12 @@ describe Spree::Api::ReviewsController, type: :controller do
|
|
116
116
|
end
|
117
117
|
|
118
118
|
describe '#create' do
|
119
|
+
subject do
|
120
|
+
params = { product_id: product.id, token: user.spree_api_key, format: 'json' }.merge(review_params)
|
121
|
+
post :create, params: params
|
122
|
+
JSON.parse(response.body)
|
123
|
+
end
|
124
|
+
|
119
125
|
let(:review_params) do
|
120
126
|
{
|
121
127
|
"user_id": user.id,
|
@@ -126,25 +132,19 @@ describe Spree::Api::ReviewsController, type: :controller do
|
|
126
132
|
}
|
127
133
|
end
|
128
134
|
|
129
|
-
subject do
|
130
|
-
params = { product_id: product.id, token: user.spree_api_key, format: 'json' }.merge(review_params)
|
131
|
-
post :create, params: params
|
132
|
-
JSON.parse(response.body)
|
133
|
-
end
|
134
|
-
|
135
135
|
context 'when user has already reviewed this product' do
|
136
136
|
before do
|
137
137
|
review.update(user_id: user.id)
|
138
138
|
end
|
139
139
|
|
140
|
-
it '
|
140
|
+
it 'returns with a fail' do
|
141
141
|
expect(subject["error"]).not_to be_empty
|
142
142
|
expect(subject["error"]).to match(/invalid resource/i)
|
143
143
|
end
|
144
144
|
end
|
145
145
|
|
146
146
|
context 'when it is a users first review for the product' do
|
147
|
-
it '
|
147
|
+
it 'returns success with review' do
|
148
148
|
expect(subject).not_to be_empty
|
149
149
|
expect(subject["product_id"]).to eq(product.id)
|
150
150
|
expect(subject["name"]).to eq(review_params[:name])
|
@@ -157,7 +157,13 @@ describe Spree::Api::ReviewsController, type: :controller do
|
|
157
157
|
end
|
158
158
|
|
159
159
|
describe '#update' do
|
160
|
+
subject do
|
161
|
+
put :update, params: params
|
162
|
+
JSON.parse(response.body)
|
163
|
+
end
|
164
|
+
|
160
165
|
before { review.update(approved: true, user_id: user.id) }
|
166
|
+
|
161
167
|
let(:params) { { product_id: product.id, id: review.id, token: user.spree_api_key, format: 'json' }.merge(review_params) }
|
162
168
|
|
163
169
|
let(:review_params) do
|
@@ -169,13 +175,8 @@ describe Spree::Api::ReviewsController, type: :controller do
|
|
169
175
|
}
|
170
176
|
end
|
171
177
|
|
172
|
-
subject do
|
173
|
-
put :update, params: params
|
174
|
-
JSON.parse(response.body)
|
175
|
-
end
|
176
|
-
|
177
178
|
context 'when a user updates their own review' do
|
178
|
-
it '
|
179
|
+
it 'successfullies update the review and set approved back to false' do
|
179
180
|
original = review
|
180
181
|
expect(original.approved?).to be true
|
181
182
|
expect(subject["id"]).to eq(original.id)
|
@@ -195,7 +196,7 @@ describe Spree::Api::ReviewsController, type: :controller do
|
|
195
196
|
other_user.generate_spree_api_key!
|
196
197
|
end
|
197
198
|
|
198
|
-
it '
|
199
|
+
it 'returns an error' do
|
199
200
|
expect(subject["error"]).not_to be_empty
|
200
201
|
expect(subject["error"]).to match(/not authorized/i)
|
201
202
|
end
|
@@ -203,16 +204,17 @@ describe Spree::Api::ReviewsController, type: :controller do
|
|
203
204
|
end
|
204
205
|
|
205
206
|
describe '#destroy' do
|
206
|
-
before { review.update(approved: true, user_id: user.id) }
|
207
|
-
let(:params) { { product_id: product.id, id: review.id, token: user.spree_api_key, format: 'json' } }
|
208
|
-
|
209
207
|
subject do
|
210
208
|
delete :destroy, params: params
|
211
209
|
JSON.parse(response.body)
|
212
210
|
end
|
213
211
|
|
212
|
+
before { review.update(approved: true, user_id: user.id) }
|
213
|
+
|
214
|
+
let(:params) { { product_id: product.id, id: review.id, token: user.spree_api_key, format: 'json' } }
|
215
|
+
|
214
216
|
context "when a user destroys their own review" do
|
215
|
-
it '
|
217
|
+
it 'returns the deleted review' do
|
216
218
|
expect(subject["id"]).to eq(review.id)
|
217
219
|
expect(subject["product_id"]).to eq(product.id)
|
218
220
|
expect(Spree::Review.find_by(id: review.id)).to be_falsey
|
@@ -227,7 +229,7 @@ describe Spree::Api::ReviewsController, type: :controller do
|
|
227
229
|
other_user.generate_spree_api_key!
|
228
230
|
end
|
229
231
|
|
230
|
-
it '
|
232
|
+
it 'returns an error' do
|
231
233
|
expect(subject["error"]).not_to be_empty
|
232
234
|
expect(subject["error"]).to match(/not authorized/i)
|
233
235
|
end
|
@@ -27,11 +27,11 @@ describe Spree::FeedbackReviewsController do
|
|
27
27
|
comment = ['Thanks for your review!', 'Cheers'].join("\n")
|
28
28
|
expect {
|
29
29
|
post :create, params: { review_id: review.id,
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
},
|
34
|
-
|
30
|
+
feedback_review: {
|
31
|
+
comment: comment,
|
32
|
+
rating: rating
|
33
|
+
},
|
34
|
+
format: :js }
|
35
35
|
expect(response.status).to eq(200)
|
36
36
|
expect(response).to render_template(:create)
|
37
37
|
}.to change(Spree::Review, :count).by(1)
|
@@ -48,7 +48,7 @@ describe Spree::FeedbackReviewsController do
|
|
48
48
|
end
|
49
49
|
|
50
50
|
it 'sets locale on feedback-review if required by config' do
|
51
|
-
Spree::Reviews::Config
|
51
|
+
stub_spree_preferences(Spree::Reviews::Config, track_locale: true)
|
52
52
|
post :create, params: valid_attributes
|
53
53
|
expect(assigns[:review].locale).to eq I18n.locale.to_s
|
54
54
|
end
|
@@ -68,7 +68,7 @@ describe Spree::FeedbackReviewsController do
|
|
68
68
|
|
69
69
|
it 'do not create feedback-review if review doesnt exist' do
|
70
70
|
expect {
|
71
|
-
post :create, params: valid_attributes.merge!(
|
71
|
+
post :create, params: valid_attributes.merge!(review_id: nil)
|
72
72
|
}.to raise_error ActionController::UrlGenerationError
|
73
73
|
end
|
74
74
|
end
|
@@ -4,7 +4,7 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
describe Spree::ProductsController do
|
6
6
|
[:avg_rating, :reviews_count].each do |attrib|
|
7
|
-
it "
|
7
|
+
it "adds #{attrib} to the set of allowed attributes" do
|
8
8
|
expect(controller.permitted_product_attributes).to include(attrib)
|
9
9
|
end
|
10
10
|
end
|
@@ -13,8 +13,7 @@ describe Spree::ReviewsController, type: :controller do
|
|
13
13
|
review: 'Some big review text..',
|
14
14
|
images: [
|
15
15
|
fixture_file_upload(File.new(Spree::Core::Engine.root + 'spec/fixtures/thinking-cat.jpg'))
|
16
|
-
] }
|
17
|
-
}
|
16
|
+
] } }
|
18
17
|
end
|
19
18
|
|
20
19
|
before do
|
@@ -22,7 +21,7 @@ describe Spree::ReviewsController, type: :controller do
|
|
22
21
|
allow(controller).to receive(:spree_user_signed_in?).and_return(true)
|
23
22
|
end
|
24
23
|
|
25
|
-
|
24
|
+
describe '#index' do
|
26
25
|
context 'for a product that does not exist' do
|
27
26
|
it 'responds with a 404' do
|
28
27
|
expect {
|
@@ -43,7 +42,7 @@ describe Spree::ReviewsController, type: :controller do
|
|
43
42
|
end
|
44
43
|
end
|
45
44
|
|
46
|
-
|
45
|
+
describe '#new' do
|
47
46
|
context 'for a product that does not exist' do
|
48
47
|
it 'responds with a 404' do
|
49
48
|
expect {
|
@@ -68,7 +67,7 @@ describe Spree::ReviewsController, type: :controller do
|
|
68
67
|
end
|
69
68
|
end
|
70
69
|
|
71
|
-
|
70
|
+
describe '#create' do
|
72
71
|
before { allow(controller).to receive(:spree_current_user).and_return(user) }
|
73
72
|
|
74
73
|
context 'for a product that does not exist' do
|
@@ -146,7 +145,7 @@ describe Spree::ReviewsController, type: :controller do
|
|
146
145
|
|
147
146
|
it 'does not create a review' do
|
148
147
|
expect(Spree::Review.count).to eq 0
|
149
|
-
post :create, params: review_params.merge(
|
148
|
+
post :create, params: review_params.merge(review: { rating: 'not_a_number' })
|
150
149
|
expect(Spree::Review.count).to eq 0
|
151
150
|
end
|
152
151
|
end
|
@@ -154,7 +153,7 @@ describe Spree::ReviewsController, type: :controller do
|
|
154
153
|
# It always sets the locale so preference pointless
|
155
154
|
context 'when config requires locale tracking:' do
|
156
155
|
it 'sets the locale' do
|
157
|
-
Spree::Reviews::Config
|
156
|
+
stub_spree_preferences(Spree::Reviews::Config, track_locale: true)
|
158
157
|
post :create, params: review_params
|
159
158
|
expect(assigns[:review].locale).to eq I18n.locale.to_s
|
160
159
|
end
|
data/spec/features/admin_spec.rb
CHANGED
@@ -2,21 +2,21 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
RSpec.
|
5
|
+
RSpec.describe 'Review Admin' do
|
6
6
|
stub_authorization!
|
7
7
|
|
8
|
-
|
8
|
+
let!(:review) { create(:review) }
|
9
9
|
|
10
10
|
context 'index' do
|
11
|
-
|
11
|
+
before do
|
12
12
|
visit spree.admin_reviews_path
|
13
13
|
end
|
14
14
|
|
15
|
-
|
15
|
+
it 'list reviews' do
|
16
16
|
expect(page).to have_text review.product.name
|
17
17
|
end
|
18
18
|
|
19
|
-
|
19
|
+
it 'approve reviews' do
|
20
20
|
expect(review.approved).to be false
|
21
21
|
within("tr#review_#{review.id}") do
|
22
22
|
find('.approve').click
|
@@ -24,7 +24,7 @@ RSpec.feature 'Review Admin' do
|
|
24
24
|
expect(review.reload.approved).to be true
|
25
25
|
end
|
26
26
|
|
27
|
-
|
27
|
+
it 'edit reviews' do
|
28
28
|
expect(page).to have_text review.product.name
|
29
29
|
within("tr#review_#{review.id}") do
|
30
30
|
find('.edit').click
|