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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +8 -318
  3. data/.rubocop_todo.yml +221 -0
  4. data/CHANGELOG.md +100 -0
  5. data/Gemfile +11 -10
  6. data/README.md +29 -44
  7. data/app/controllers/spree/feedback_reviews_controller.rb +2 -8
  8. data/app/controllers/spree/reviews_controller.rb +1 -1
  9. data/app/decorators/models/solidus_reviews/spree/product_decorator.rb +6 -5
  10. data/app/helpers/spree/reviews_helper.rb +5 -5
  11. data/app/models/spree/feedback_review.rb +1 -1
  12. data/app/models/spree/review.rb +9 -8
  13. data/app/models/spree/reviews_ability.rb +2 -2
  14. data/app/views/spree/api/reviews/_feedback_review.json.jbuilder +1 -1
  15. data/app/views/spree/api/reviews/_review.json.jbuilder +1 -1
  16. data/db/migrate/20120123141326_recalculate_ratings.rb +1 -2
  17. data/db/migrate/20190613165528_add_verified_purchaser_to_reviews.rb +2 -0
  18. data/lib/controllers/spree/api/reviews_controller.rb +16 -14
  19. data/lib/generators/solidus_reviews/install/install_generator.rb +1 -1
  20. data/lib/solidus_reviews.rb +4 -2
  21. data/lib/{spree_reviews → solidus_reviews}/engine.rb +3 -3
  22. data/lib/solidus_reviews/version.rb +5 -0
  23. data/solidus_reviews.gemspec +14 -23
  24. data/spec/controllers/spree/admin/feedback_reviews_controller_spec.rb +1 -1
  25. data/spec/controllers/spree/admin/review_settings_controller_spec.rb +3 -4
  26. data/spec/controllers/spree/admin/reviews_controller_spec.rb +3 -3
  27. data/spec/controllers/spree/api/reviews_controller_spec.rb +27 -25
  28. data/spec/controllers/spree/feedback_reviews_controller_spec.rb +7 -7
  29. data/spec/controllers/spree/products_controller_spec.rb +1 -1
  30. data/spec/controllers/spree/reviews_controller_spec.rb +6 -7
  31. data/spec/features/admin_spec.rb +6 -6
  32. data/spec/features/reviews_spec.rb +32 -31
  33. data/spec/models/feedback_review_spec.rb +13 -13
  34. data/spec/models/product_spec.rb +13 -10
  35. data/spec/models/review_spec.rb +36 -40
  36. data/spec/models/reviews_ability_spec.rb +14 -14
  37. data/spec/models/reviews_configuration_spec.rb +9 -10
  38. data/spec/spec_helper.rb +4 -19
  39. data/spec/support/config.rb +7 -0
  40. data/spec/support/factories.rb +3 -0
  41. metadata +18 -180
  42. 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: /\*\//, verbose: true
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
@@ -2,7 +2,9 @@
2
2
 
3
3
  require 'solidus'
4
4
  require 'solidus_support'
5
- require 'sass/rails'
5
+ require 'sassc/rails'
6
6
  require 'deface'
7
- require 'spree_reviews/engine'
8
7
  require 'coffee_script'
8
+
9
+ require 'solidus_reviews/engine'
10
+ require 'solidus_reviews/version'
@@ -1,16 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module SpreeReviews
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?
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusReviews
4
+ VERSION = '1.3.0'
5
+ end
@@ -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 = Gem::Platform::RUBY
5
- s.name = 'solidus_reviews'
6
- s.version = '1.2.0'
7
- s.summary = 'Basic review and ratings facility for Solidus'
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 = 'https://github.com/solidusio-contrib/solidus_reviews/'
13
- s.license = 'BSD-3'
15
+ s.homepage = 'https://github.com/solidusio-contrib/solidus_reviews'
16
+ s.license = 'BSD-3'
14
17
 
15
- s.files = `git ls-files`.split("\n")
16
- s.test_files = `git ls-files -- spec/*`.split("\n")
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', '~> 0.1'
25
+ s.add_dependency 'solidus_support'
23
26
 
24
- s.add_development_dependency 'capybara'
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
- context '#index' do
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
- context '#update' do
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
- context '#edit' do
54
- it 'should render the edit template' do
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
- context '#index' do
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
- context '#approve' do
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
- context '#edit' do
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 'should return an empty array' do
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 'should return an empty array' do
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 'should return the review' do
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 'should return with not authorized' do
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 'should return the review' do
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 'should return with a fail' do
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 'should return success with review' do
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 'should successfully update the review and set approved back to false' do
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 'should return an error' do
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 'should return the deleted review' do
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 'should return an error' do
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
- feedback_review: {
31
- comment: comment,
32
- rating: rating
33
- },
34
- format: :js }
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.preferred_track_locale = true
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!({ review_id: nil })
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 "should add #{attrib} to the set of allowed attributes" do
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
- context '#index' do
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
- context '#new' do
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
- context '#create' do
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({ review: { rating: 'not_a_number' } })
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.preferred_track_locale = true
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
@@ -2,21 +2,21 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- RSpec.feature 'Review Admin' do
5
+ RSpec.describe 'Review Admin' do
6
6
  stub_authorization!
7
7
 
8
- given!(:review) { create(:review) }
8
+ let!(:review) { create(:review) }
9
9
 
10
10
  context 'index' do
11
- background do
11
+ before do
12
12
  visit spree.admin_reviews_path
13
13
  end
14
14
 
15
- scenario 'list reviews' do
15
+ it 'list reviews' do
16
16
  expect(page).to have_text review.product.name
17
17
  end
18
18
 
19
- scenario 'approve reviews' do
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
- scenario 'edit reviews' do
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