jiffyshirts_spree_reviews 2.3.1.1
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 +7 -0
- data/.gitignore +10 -0
- data/.rspec +1 -0
- data/.travis.yml +11 -0
- data/Gemfile +6 -0
- data/Guardfile +9 -0
- data/LICENSE.md +26 -0
- data/README.md +54 -0
- data/Rakefile +15 -0
- data/app/assets/images/store/reviews/delete.gif +0 -0
- data/app/assets/images/store/reviews/star.gif +0 -0
- data/app/assets/javascripts/spree/backend/jiffyshirts_spree_reviews.js +7 -0
- data/app/assets/javascripts/spree/frontend/jiffyshirts_spree_reviews.js +7 -0
- data/app/assets/stylesheets/spree/backend/jiffyshirts_spree_reviews.css +3 -0
- data/app/assets/stylesheets/spree/frontend/jiffyshirts_spree_reviews.css.erb +83 -0
- data/app/controllers/spree/admin/feedback_reviews_controller.rb +6 -0
- data/app/controllers/spree/admin/review_settings_controller.rb +21 -0
- data/app/controllers/spree/admin/reviews_controller.rb +34 -0
- data/app/controllers/spree/feedback_reviews_controller.rb +41 -0
- data/app/controllers/spree/products_controller_decorator.rb +5 -0
- data/app/controllers/spree/reviews_controller.rb +48 -0
- data/app/helpers/spree/reviews_helper.rb +17 -0
- data/app/models/spree/feedback_review.rb +17 -0
- data/app/models/spree/product_decorator.rb +21 -0
- data/app/models/spree/review.rb +36 -0
- data/app/models/spree/reviews_ability.rb +17 -0
- data/app/models/spree/reviews_configuration.rb +23 -0
- data/app/overrides/add_reviews_after_product_properties.rb +5 -0
- data/app/overrides/add_reviews_tab_to_admin.rb +4 -0
- data/app/overrides/add_reviews_to_admin_configuration_sidebar.rb +5 -0
- data/app/overrides/fix_highlighting_of_products_tab.rb +5 -0
- data/app/views/spree/admin/feedback_reviews/index.html.erb +44 -0
- data/app/views/spree/admin/review_settings/edit.html.erb +40 -0
- data/app/views/spree/admin/reviews/_form.html.erb +22 -0
- data/app/views/spree/admin/reviews/edit.html.erb +26 -0
- data/app/views/spree/admin/reviews/index.html.erb +111 -0
- data/app/views/spree/feedback_reviews/_form.html.erb +13 -0
- data/app/views/spree/feedback_reviews/_summary.html.erb +6 -0
- data/app/views/spree/feedback_reviews/create.js.erb +7 -0
- data/app/views/spree/reviews/_form.html.erb +27 -0
- data/app/views/spree/reviews/_stars.html.erb +13 -0
- data/app/views/spree/reviews/index.html.erb +1 -0
- data/app/views/spree/reviews/new.html.erb +3 -0
- data/app/views/spree/shared/_rating.html.erb +15 -0
- data/app/views/spree/shared/_review.html.erb +24 -0
- data/app/views/spree/shared/_review_summary.html.erb +9 -0
- data/app/views/spree/shared/_reviews.html.erb +15 -0
- data/app/views/spree/shared/_shortrating.html.erb +9 -0
- data/config/initializers/constants.rb +1 -0
- data/config/initializers/load_preferences.rb +5 -0
- data/config/locales/de-CH.yml +67 -0
- data/config/locales/de.yml +67 -0
- data/config/locales/en-GB.yml +67 -0
- data/config/locales/en.yml +65 -0
- data/config/locales/es.yml +67 -0
- data/config/locales/fr.yml +67 -0
- data/config/locales/pl.yml +71 -0
- data/config/locales/pt-BR.yml +67 -0
- data/config/locales/pt.yml +68 -0
- data/config/locales/ro.yml +75 -0
- data/config/locales/ru.yml +73 -0
- data/config/locales/sv.yml +65 -0
- data/config/locales/tr.yml +67 -0
- data/config/routes.rb +17 -0
- data/db/migrate/20081020220724_create_reviews.rb +21 -0
- data/db/migrate/20101222083309_create_feedback_reviews.rb +17 -0
- data/db/migrate/20110406083603_add_rating_to_products.rb +21 -0
- data/db/migrate/20110606150524_add_user_to_reviews.rb +9 -0
- data/db/migrate/20110806093221_add_ip_address_to_reviews.rb +9 -0
- data/db/migrate/20120110172331_namespace_tables.rb +6 -0
- data/db/migrate/20120123141326_recalculate_ratings.rb +20 -0
- data/db/migrate/20120712182514_add_locale_to_reviews.rb +9 -0
- data/db/migrate/20120712182627_add_locale_to_feedback_reviews.rb +9 -0
- data/db/sample/ratings.yml +16 -0
- data/db/sample/reviews.yml +59 -0
- data/jiffyshirts_spree_reviews.gemspec +31 -0
- data/lib/generators/jiffyshirts_spree_reviews/install/install_generator.rb +30 -0
- data/lib/jiffyshirts_spree_reviews/engine.rb +23 -0
- data/lib/jiffyshirts_spree_reviews.rb +4 -0
- data/script/rails +5 -0
- data/spec/controllers/admin/feedback_reviews_controller_spec.rb +29 -0
- data/spec/controllers/admin/review_settings_controller_spec.rb +57 -0
- data/spec/controllers/admin/reviews_controller_spec.rb +63 -0
- data/spec/controllers/feedback_reviews_controller_spec.rb +71 -0
- data/spec/controllers/products_controller_spec.rb +9 -0
- data/spec/controllers/reviews_controller_spec.rb +136 -0
- data/spec/factories/feedback_review_factory.rb +8 -0
- data/spec/factories/review_factory.rb +15 -0
- data/spec/features/admin_spec.rb +35 -0
- data/spec/features/reviews_spec.rb +106 -0
- data/spec/helpers/review_helper_spec.rb +28 -0
- data/spec/models/feedback_review_spec.rb +78 -0
- data/spec/models/product_spec.rb +62 -0
- data/spec/models/review_spec.rb +169 -0
- data/spec/models/reviews_ability_spec.rb +46 -0
- data/spec/models/reviews_configuration_spec.rb +45 -0
- data/spec/spec_helper.rb +48 -0
- data/vendor/assets/javascripts/jquery.rating.js +376 -0
- metadata +339 -0
@@ -0,0 +1,21 @@
|
|
1
|
+
class AddRatingToProducts < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
if table_exists?('products')
|
4
|
+
add_column :products, :avg_rating, :decimal, :default => 0.0, :null => false, :precision => 7, :scale => 5
|
5
|
+
add_column :products, :reviews_count, :integer, :default => 0, :null => false
|
6
|
+
elsif table_exists?('spree_products')
|
7
|
+
add_column :spree_products, :avg_rating, :decimal, :default => 0.0, :null => false, :precision => 7, :scale => 5
|
8
|
+
add_column :spree_products, :reviews_count, :integer, :default => 0, :null => false
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.down
|
13
|
+
if table_exists?('products')
|
14
|
+
remove_column :products, :reviews_count
|
15
|
+
remove_column :products, :avg_rating
|
16
|
+
elsif table_exists?('spree_products')
|
17
|
+
remove_column :spree_products, :reviews_count
|
18
|
+
remove_column :spree_products, :avg_rating
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class RecalculateRatings < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
Spree::Product.reset_column_information
|
4
|
+
|
5
|
+
Spree::Product.update_all :reviews_count => 0
|
6
|
+
|
7
|
+
Spree::Product.joins(:reviews).where("spree_reviews.id IS NOT NULL").find_each do |p|
|
8
|
+
Spree::Product.update_counters p.id, :reviews_count => p.reviews.approved.length
|
9
|
+
|
10
|
+
# recalculate_product_rating exists on the review, not the product
|
11
|
+
if p.reviews.approved.count > 0
|
12
|
+
p.reviews.approved.first.recalculate_product_rating
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def down
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
<%
|
2
|
+
require 'faker'
|
3
|
+
%>
|
4
|
+
r1:
|
5
|
+
product: ror_tote
|
6
|
+
name: <%= Faker::Name.first_name %> <%= Faker::Name.last_name %>
|
7
|
+
location: here
|
8
|
+
rating: 4
|
9
|
+
title: "more uses for this item"
|
10
|
+
review: <%= Faker::Lorem.paragraph %>
|
11
|
+
approved: true
|
12
|
+
r2:
|
13
|
+
product: ror_tote
|
14
|
+
name: <%= Faker::Name.first_name %> <%= Faker::Name.last_name %>
|
15
|
+
location: here
|
16
|
+
rating: 3
|
17
|
+
title: "further comments"
|
18
|
+
review: <%= Faker::Lorem.paragraph %>
|
19
|
+
approved: false
|
20
|
+
r3:
|
21
|
+
product: ror_ringer
|
22
|
+
name: <%= Faker::Name.first_name %> <%= Faker::Name.last_name %>
|
23
|
+
location: here
|
24
|
+
rating: 4
|
25
|
+
title: "essential wear"
|
26
|
+
review: <%= Faker::Lorem.paragraph %>
|
27
|
+
approved: false
|
28
|
+
r4:
|
29
|
+
product: apache_baseball_jersey
|
30
|
+
name: <%= Faker::Name.first_name %> <%= Faker::Name.last_name %>
|
31
|
+
location: here
|
32
|
+
rating: 2
|
33
|
+
title: "not impressed"
|
34
|
+
review: <%= Faker::Lorem.paragraph %>
|
35
|
+
approved: true
|
36
|
+
r5:
|
37
|
+
product: ror_ringer
|
38
|
+
name: <%= Faker::Name.first_name %> <%= Faker::Name.last_name %>
|
39
|
+
location: an office
|
40
|
+
rating: 5
|
41
|
+
title: "I have one for every day of the week"
|
42
|
+
review: <%= Faker::Lorem.paragraph %>
|
43
|
+
approved: true
|
44
|
+
r6:
|
45
|
+
product: ror_ringer
|
46
|
+
name: <%= Faker::Name.first_name %> <%= Faker::Name.last_name %>
|
47
|
+
location: here
|
48
|
+
rating: 4
|
49
|
+
title: "cooler than my toga"
|
50
|
+
review: <%= Faker::Lorem.paragraph %>
|
51
|
+
approved: true
|
52
|
+
r7:
|
53
|
+
product: ror_ringer
|
54
|
+
name: <%= Faker::Name.first_name %> <%= Faker::Name.last_name %>
|
55
|
+
location: emerald city
|
56
|
+
rating: 2
|
57
|
+
title: "my other half didn't like it"
|
58
|
+
review: <%= Faker::Lorem.paragraph %>
|
59
|
+
approved: false
|
@@ -0,0 +1,31 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.platform = Gem::Platform::RUBY
|
3
|
+
s.name = 'jiffyshirts_spree_reviews'
|
4
|
+
s.version = '2.3.1.1'
|
5
|
+
s.summary = 'Basic review and ratings facility for Spree'
|
6
|
+
s.authors = ['CrowdInt']
|
7
|
+
s.description = s.summary
|
8
|
+
s.required_ruby_version = '>= 1.9.3'
|
9
|
+
|
10
|
+
s.homepage = 'https://github.com/alexesba/spree_reviews.git'
|
11
|
+
|
12
|
+
s.files = `git ls-files`.split("\n")
|
13
|
+
s.test_files = `git ls-files -- spec/*`.split("\n")
|
14
|
+
s.require_path = 'lib'
|
15
|
+
s.requirements << 'none'
|
16
|
+
|
17
|
+
s.add_dependency 'spree_core', '~> 2.3.0'
|
18
|
+
|
19
|
+
s.add_development_dependency 'ffaker'
|
20
|
+
s.add_development_dependency 'capybara', '~> 2.2.1'
|
21
|
+
s.add_development_dependency 'database_cleaner', '1.2.0'
|
22
|
+
s.add_development_dependency 'poltergeist', '1.5.0'
|
23
|
+
s.add_development_dependency 'rspec-rails', '~> 2.14'
|
24
|
+
s.add_development_dependency 'factory_girl', '~> 4.4'
|
25
|
+
s.add_development_dependency 'pg'
|
26
|
+
s.add_development_dependency 'simplecov', '~> 0.7.1'
|
27
|
+
s.add_development_dependency 'coffee-rails', '~> 4.0.0'
|
28
|
+
s.add_development_dependency 'sass-rails', '~> 4.0.0'
|
29
|
+
s.add_development_dependency 'guard-rspec'
|
30
|
+
s.add_development_dependency 'pry'
|
31
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module JiffyshirtsSpreeReviews
|
2
|
+
module Generators
|
3
|
+
class InstallGenerator < Rails::Generators::Base
|
4
|
+
|
5
|
+
class_option :auto_run_migrations, :type => :boolean, :default => false
|
6
|
+
|
7
|
+
def add_javascripts
|
8
|
+
append_file "vendor/assets/javascripts/spree/frontend/all.js", "//= require spree/frontend/jiffyshirts_spree_reviews\n"
|
9
|
+
append_file "vendor/assets/javascripts/spree/backend/all.js", "//= require spree/backend/jiffyshirts_spree_reviews\n"
|
10
|
+
end
|
11
|
+
|
12
|
+
def add_stylesheets
|
13
|
+
inject_into_file "vendor/assets/stylesheets/spree/frontend/all.css", " *= require spree/frontend/jiffyshirts_spree_reviews\n", :before => /\*\//, :verbose => true
|
14
|
+
end
|
15
|
+
|
16
|
+
def add_migrations
|
17
|
+
run 'bundle exec rake railties:install:migrations FROM=jiffy_shirst_spree_reviews'
|
18
|
+
end
|
19
|
+
|
20
|
+
def run_migrations
|
21
|
+
run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask 'Would you like to run the migrations now? [Y/n]')
|
22
|
+
if run_migrations
|
23
|
+
run 'bundle exec rake db:migrate'
|
24
|
+
else
|
25
|
+
puts 'Skipping rake db:migrate, don\'t forget to run it!'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module JiffyshirtsSpreeReviews
|
2
|
+
class Engine < Rails::Engine
|
3
|
+
require 'spree/core'
|
4
|
+
isolate_namespace Spree
|
5
|
+
engine_name 'jiffyshirts_spree_reviews'
|
6
|
+
|
7
|
+
config.autoload_paths += %W(#{config.root}/lib)
|
8
|
+
|
9
|
+
def self.activate
|
10
|
+
Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
|
11
|
+
Rails.configuration.cache_classes ? require(c) : load(c)
|
12
|
+
end
|
13
|
+
Spree::Ability.register_ability(Spree::ReviewsAbility)
|
14
|
+
end
|
15
|
+
config.to_prepare &method(:activate).to_proc
|
16
|
+
|
17
|
+
# use rspec for tests
|
18
|
+
config.generators do |g|
|
19
|
+
g.test_framework :rspec
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
data/script/rails
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::Admin::FeedbackReviewsController do
|
4
|
+
stub_authorization!
|
5
|
+
|
6
|
+
before do
|
7
|
+
user = create(:admin_user)
|
8
|
+
controller.stub(:try_spree_current_user => user)
|
9
|
+
end
|
10
|
+
|
11
|
+
context '#index' do
|
12
|
+
let!(:review) { create(:review)}
|
13
|
+
let!(:other_review) { create(:review) }
|
14
|
+
|
15
|
+
let!(:feedback_review_1) { create(:feedback_review, created_at: 10.days.ago, review: review) }
|
16
|
+
let!(:feedback_review_2) { create(:feedback_review, created_at: 2.days.ago, review: review) }
|
17
|
+
let!(:feedback_review_3) { create(:feedback_review, created_at: 5.days.ago, review: review) }
|
18
|
+
|
19
|
+
let!(:other_feedback_review_1) { create(:feedback_review, created_at: 10.days.ago, review: other_review) }
|
20
|
+
let!(:other_feedback_review_2) { create(:feedback_review, created_at: 2.days.ago, review: other_review) }
|
21
|
+
|
22
|
+
it 'looks up feedback reviews for the specified review and renders the template' do
|
23
|
+
spree_get :index, review_id: review.id
|
24
|
+
response.status.should eq(200)
|
25
|
+
response.should render_template(:index)
|
26
|
+
assigns(:collection).should eq([feedback_review_2, feedback_review_3, feedback_review_1])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::Admin::ReviewSettingsController do
|
4
|
+
stub_authorization!
|
5
|
+
|
6
|
+
before do
|
7
|
+
user = create(:admin_user)
|
8
|
+
controller.stub(:try_spree_current_user => user)
|
9
|
+
end
|
10
|
+
|
11
|
+
context '#update' do
|
12
|
+
it 'redirects to edit-review-settings page' do
|
13
|
+
spree_put :update, preferences: { preview_size: 4 }
|
14
|
+
response.should redirect_to spree.edit_admin_review_settings_path
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'For parameters:
|
18
|
+
preview_size: 4,
|
19
|
+
show_email: false,
|
20
|
+
feedback_rating: false,
|
21
|
+
require_login: true,
|
22
|
+
track_locale: true' do
|
23
|
+
|
24
|
+
it 'sets preferred_preview_size to 4' do
|
25
|
+
spree_put :update, preferences: { preview_size: 4 }
|
26
|
+
Spree::Reviews::Config.preferred_preview_size.should eq 4
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'sets preferred_show_email to false' do
|
30
|
+
spree_put :update, preferences: { show_email: false }
|
31
|
+
Spree::Reviews::Config.preferred_show_email.should be false
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'sets preferred_feedback_rating to false' do
|
35
|
+
spree_put :update, preferences: { feedback_rating: false }
|
36
|
+
Spree::Reviews::Config.preferred_feedback_rating.should be false
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'sets preferred_require_login to true' do
|
40
|
+
spree_put :update, preferences: { require_login: true }
|
41
|
+
Spree::Reviews::Config.preferred_require_login.should be true
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'sets preferred_track_locale to true' do
|
45
|
+
spree_put :update, preferences: { track_locale: true }
|
46
|
+
Spree::Reviews::Config.preferred_track_locale.should be true
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context '#edit' do
|
52
|
+
it 'should render the edit template' do
|
53
|
+
spree_get :edit
|
54
|
+
response.should render_template(:edit)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::Admin::ReviewsController do
|
4
|
+
stub_authorization!
|
5
|
+
|
6
|
+
let(:product) { create(:product) }
|
7
|
+
let(:review) { create(:review, approved: false) }
|
8
|
+
|
9
|
+
before do
|
10
|
+
user = create(:admin_user)
|
11
|
+
controller.stub(try_spree_current_user: user)
|
12
|
+
end
|
13
|
+
|
14
|
+
context '#index' do
|
15
|
+
it 'list reviews' do
|
16
|
+
reviews = [
|
17
|
+
create(:review, product: product),
|
18
|
+
create(:review, product: product)
|
19
|
+
]
|
20
|
+
spree_get :index, product_id: product.slug
|
21
|
+
assigns[:reviews].should =~ reviews
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context '#approve' do
|
26
|
+
it 'show notice message when approved' do
|
27
|
+
review.update_attribute(:approved, true)
|
28
|
+
spree_get :approve, id: review.id
|
29
|
+
response.should redirect_to spree.admin_reviews_path
|
30
|
+
flash[:notice].should eq Spree.t(:info_approve_review)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'show error message when not approved' do
|
34
|
+
Spree::Review.any_instance.stub(:update_attribute).and_return(false)
|
35
|
+
spree_get :approve, id: review.id
|
36
|
+
flash[:error].should eq Spree.t(:error_approve_review)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context '#edit' do
|
41
|
+
specify do
|
42
|
+
spree_get :edit, id: review.id
|
43
|
+
response.status.should eq(200)
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'when product is nil' do
|
47
|
+
before do
|
48
|
+
review.product = nil
|
49
|
+
review.save!
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'flash error' do
|
53
|
+
spree_get :edit, id: review.id
|
54
|
+
flash[:error].should eq Spree.t(:error_no_product)
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'redirect to admin-reviews page' do
|
58
|
+
spree_get :edit, id: review.id
|
59
|
+
response.should redirect_to spree.admin_reviews_path
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::FeedbackReviewsController do
|
4
|
+
let(:user) { create(:user) }
|
5
|
+
let(:product) { create(:product) }
|
6
|
+
let(:review) { create(:review, user: user) }
|
7
|
+
let(:valid_attributes) do
|
8
|
+
{ review_id: review.id,
|
9
|
+
user_id: user.id,
|
10
|
+
feedback_review: {
|
11
|
+
rating: '4 stars',
|
12
|
+
comment: 'some comment'
|
13
|
+
}}
|
14
|
+
end
|
15
|
+
|
16
|
+
before do
|
17
|
+
controller.stub spree_current_user: user
|
18
|
+
controller.stub spree_user_signed_in?: true
|
19
|
+
request.env['HTTP_REFERER'] = '/'
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#create' do
|
23
|
+
it 'creates a new feedback review' do
|
24
|
+
rating = 4
|
25
|
+
comment = Faker::Lorem.paragraphs(3).join("\n")
|
26
|
+
expect {
|
27
|
+
spree_post :create, { review_id: review.id,
|
28
|
+
feedback_review: { comment: comment,
|
29
|
+
rating: rating },
|
30
|
+
format: :js }
|
31
|
+
response.status.should eq(200)
|
32
|
+
response.should render_template(:create)
|
33
|
+
}.to change(Spree::Review, :count).by(1)
|
34
|
+
feedback_review = Spree::FeedbackReview.last
|
35
|
+
feedback_review.comment.should eq(comment)
|
36
|
+
feedback_review.review.should eq(review)
|
37
|
+
feedback_review.rating.should eq(rating)
|
38
|
+
feedback_review.user.should eq(user)
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'redirects back to the calling page' do
|
43
|
+
spree_post :create, valid_attributes
|
44
|
+
response.should redirect_to '/'
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'sets locale on feedback-review if required by config' do
|
48
|
+
Spree::Reviews::Config.preferred_track_locale = true
|
49
|
+
spree_post :create, valid_attributes
|
50
|
+
assigns[:review].locale.should eq I18n.locale.to_s
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'fails when user is not authorized' do
|
54
|
+
controller.stub(:authorize!) { raise }
|
55
|
+
expect {
|
56
|
+
spree_post :create, valid_attributes
|
57
|
+
}.to raise_error
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'removes all non-numbers from ratings parameter' do
|
61
|
+
spree_post :create, valid_attributes
|
62
|
+
controller.params[:feedback_review][:rating].should eq '4'
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'do not create feedback-review if review doesnt exist' do
|
66
|
+
expect {
|
67
|
+
spree_post :create, valid_attributes.merge!({review_id: nil})
|
68
|
+
}.to raise_error
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::ReviewsController do
|
4
|
+
let(:user) { create(:user) }
|
5
|
+
let(:product) { create(:product) }
|
6
|
+
let(:review_params) do
|
7
|
+
{ product_id: product.slug,
|
8
|
+
review: { rating: 3,
|
9
|
+
name: 'Ryan Bigg',
|
10
|
+
title: 'Great Product',
|
11
|
+
review: 'Some big review text..' } }
|
12
|
+
end
|
13
|
+
|
14
|
+
before do
|
15
|
+
controller.stub :spree_current_user => user
|
16
|
+
controller.stub :spree_user_signed_in? => true
|
17
|
+
end
|
18
|
+
|
19
|
+
context '#index' do
|
20
|
+
context 'for a product that does not exist' do
|
21
|
+
it 'responds with a 404' do
|
22
|
+
spree_get :index, product_id: 'not_real'
|
23
|
+
response.status.should eq(404)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'for a valid product' do
|
28
|
+
it 'list approved reviews' do
|
29
|
+
approved_reviews = [
|
30
|
+
create(:review, :approved, product: product),
|
31
|
+
create(:review, :approved, product: product)
|
32
|
+
]
|
33
|
+
spree_get :index, product_id: product.slug
|
34
|
+
assigns[:approved_reviews].should =~ approved_reviews
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context '#new' do
|
40
|
+
context 'for a product that does not exist' do
|
41
|
+
it 'responds with a 404' do
|
42
|
+
spree_get :new, product_id: 'not_real'
|
43
|
+
response.status.should eq(404)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'fail if the user is not authorized to create a review' do
|
48
|
+
controller.stub(:authorize!) { raise }
|
49
|
+
expect {
|
50
|
+
spree_post :new, product_id: product.slug
|
51
|
+
assert_match 'ryanbig', response.body
|
52
|
+
}.to raise_error
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'render the new template' do
|
56
|
+
spree_get :new, product_id: product.slug
|
57
|
+
response.status.should eq(200)
|
58
|
+
response.should render_template(:new)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context '#create' do
|
63
|
+
before { controller.stub spree_current_user: user }
|
64
|
+
|
65
|
+
context 'for a product that does not exist' do
|
66
|
+
it 'responds with a 404' do
|
67
|
+
spree_post :create, product_id: 'not_real'
|
68
|
+
response.status.should eq(404)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'creates a new review' do
|
73
|
+
expect {
|
74
|
+
spree_post :create, review_params
|
75
|
+
}.to change(Spree::Review, :count).by(1)
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'sets the ip-address of the remote' do
|
79
|
+
request.stub(remote_ip: '127.0.0.1')
|
80
|
+
spree_post :create, review_params
|
81
|
+
assigns[:review].ip_address.should eq '127.0.0.1'
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'fails if the user is not authorized to create a review' do
|
85
|
+
controller.stub(:authorize!) { raise }
|
86
|
+
expect{
|
87
|
+
spree_post :create, review_params
|
88
|
+
}.to raise_error
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'flashes the notice' do
|
92
|
+
spree_post :create, review_params
|
93
|
+
flash[:notice].should eq Spree.t(:review_successfully_submitted)
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'redirects to product page' do
|
97
|
+
spree_post :create, review_params
|
98
|
+
response.should redirect_to spree.product_path(product)
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'removes all non-numbers from ratings param' do
|
102
|
+
spree_post :create, review_params
|
103
|
+
controller.params[:review][:rating].should eq '3'
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'sets the current spree user as reviews user' do
|
107
|
+
spree_post :create, review_params
|
108
|
+
review_params[:review].merge!(user_id: user.id)
|
109
|
+
assigns[:review][:user_id] = user.id
|
110
|
+
assigns[:review][:user_id].should eq user.id
|
111
|
+
end
|
112
|
+
|
113
|
+
context 'with invalid params' do
|
114
|
+
it 'renders new when review.save fails' do
|
115
|
+
Spree::Review.any_instance.stub(:save).and_return(false)
|
116
|
+
spree_post :create, review_params
|
117
|
+
response.should render_template :new
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'does not create a review' do
|
121
|
+
expect(Spree::Review.count).to eq 0
|
122
|
+
spree_post :create, review_params[:review].merge!({rating: 'not_a_number'})
|
123
|
+
expect(Spree::Review.count).to eq 0
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
# It always sets the locale so preference pointless
|
128
|
+
context 'when config requires locale tracking:' do
|
129
|
+
it 'sets the locale' do
|
130
|
+
Spree::Reviews::Config.preferred_track_locale = true
|
131
|
+
spree_post :create, review_params
|
132
|
+
assigns[:review].locale.should eq I18n.locale.to_s
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
FactoryGirl.define do
|
2
|
+
factory :review, :class => Spree::Review do |f|
|
3
|
+
name { generate(:random_email) }
|
4
|
+
title { generate(:random_string) }
|
5
|
+
review { generate(:random_description) }
|
6
|
+
rating { rand(1..5) }
|
7
|
+
approved false
|
8
|
+
user
|
9
|
+
product
|
10
|
+
|
11
|
+
trait :approved do
|
12
|
+
approved true
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|