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.
Files changed (99) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +11 -0
  5. data/Gemfile +6 -0
  6. data/Guardfile +9 -0
  7. data/LICENSE.md +26 -0
  8. data/README.md +54 -0
  9. data/Rakefile +15 -0
  10. data/app/assets/images/store/reviews/delete.gif +0 -0
  11. data/app/assets/images/store/reviews/star.gif +0 -0
  12. data/app/assets/javascripts/spree/backend/jiffyshirts_spree_reviews.js +7 -0
  13. data/app/assets/javascripts/spree/frontend/jiffyshirts_spree_reviews.js +7 -0
  14. data/app/assets/stylesheets/spree/backend/jiffyshirts_spree_reviews.css +3 -0
  15. data/app/assets/stylesheets/spree/frontend/jiffyshirts_spree_reviews.css.erb +83 -0
  16. data/app/controllers/spree/admin/feedback_reviews_controller.rb +6 -0
  17. data/app/controllers/spree/admin/review_settings_controller.rb +21 -0
  18. data/app/controllers/spree/admin/reviews_controller.rb +34 -0
  19. data/app/controllers/spree/feedback_reviews_controller.rb +41 -0
  20. data/app/controllers/spree/products_controller_decorator.rb +5 -0
  21. data/app/controllers/spree/reviews_controller.rb +48 -0
  22. data/app/helpers/spree/reviews_helper.rb +17 -0
  23. data/app/models/spree/feedback_review.rb +17 -0
  24. data/app/models/spree/product_decorator.rb +21 -0
  25. data/app/models/spree/review.rb +36 -0
  26. data/app/models/spree/reviews_ability.rb +17 -0
  27. data/app/models/spree/reviews_configuration.rb +23 -0
  28. data/app/overrides/add_reviews_after_product_properties.rb +5 -0
  29. data/app/overrides/add_reviews_tab_to_admin.rb +4 -0
  30. data/app/overrides/add_reviews_to_admin_configuration_sidebar.rb +5 -0
  31. data/app/overrides/fix_highlighting_of_products_tab.rb +5 -0
  32. data/app/views/spree/admin/feedback_reviews/index.html.erb +44 -0
  33. data/app/views/spree/admin/review_settings/edit.html.erb +40 -0
  34. data/app/views/spree/admin/reviews/_form.html.erb +22 -0
  35. data/app/views/spree/admin/reviews/edit.html.erb +26 -0
  36. data/app/views/spree/admin/reviews/index.html.erb +111 -0
  37. data/app/views/spree/feedback_reviews/_form.html.erb +13 -0
  38. data/app/views/spree/feedback_reviews/_summary.html.erb +6 -0
  39. data/app/views/spree/feedback_reviews/create.js.erb +7 -0
  40. data/app/views/spree/reviews/_form.html.erb +27 -0
  41. data/app/views/spree/reviews/_stars.html.erb +13 -0
  42. data/app/views/spree/reviews/index.html.erb +1 -0
  43. data/app/views/spree/reviews/new.html.erb +3 -0
  44. data/app/views/spree/shared/_rating.html.erb +15 -0
  45. data/app/views/spree/shared/_review.html.erb +24 -0
  46. data/app/views/spree/shared/_review_summary.html.erb +9 -0
  47. data/app/views/spree/shared/_reviews.html.erb +15 -0
  48. data/app/views/spree/shared/_shortrating.html.erb +9 -0
  49. data/config/initializers/constants.rb +1 -0
  50. data/config/initializers/load_preferences.rb +5 -0
  51. data/config/locales/de-CH.yml +67 -0
  52. data/config/locales/de.yml +67 -0
  53. data/config/locales/en-GB.yml +67 -0
  54. data/config/locales/en.yml +65 -0
  55. data/config/locales/es.yml +67 -0
  56. data/config/locales/fr.yml +67 -0
  57. data/config/locales/pl.yml +71 -0
  58. data/config/locales/pt-BR.yml +67 -0
  59. data/config/locales/pt.yml +68 -0
  60. data/config/locales/ro.yml +75 -0
  61. data/config/locales/ru.yml +73 -0
  62. data/config/locales/sv.yml +65 -0
  63. data/config/locales/tr.yml +67 -0
  64. data/config/routes.rb +17 -0
  65. data/db/migrate/20081020220724_create_reviews.rb +21 -0
  66. data/db/migrate/20101222083309_create_feedback_reviews.rb +17 -0
  67. data/db/migrate/20110406083603_add_rating_to_products.rb +21 -0
  68. data/db/migrate/20110606150524_add_user_to_reviews.rb +9 -0
  69. data/db/migrate/20110806093221_add_ip_address_to_reviews.rb +9 -0
  70. data/db/migrate/20120110172331_namespace_tables.rb +6 -0
  71. data/db/migrate/20120123141326_recalculate_ratings.rb +20 -0
  72. data/db/migrate/20120712182514_add_locale_to_reviews.rb +9 -0
  73. data/db/migrate/20120712182627_add_locale_to_feedback_reviews.rb +9 -0
  74. data/db/sample/ratings.yml +16 -0
  75. data/db/sample/reviews.yml +59 -0
  76. data/jiffyshirts_spree_reviews.gemspec +31 -0
  77. data/lib/generators/jiffyshirts_spree_reviews/install/install_generator.rb +30 -0
  78. data/lib/jiffyshirts_spree_reviews/engine.rb +23 -0
  79. data/lib/jiffyshirts_spree_reviews.rb +4 -0
  80. data/script/rails +5 -0
  81. data/spec/controllers/admin/feedback_reviews_controller_spec.rb +29 -0
  82. data/spec/controllers/admin/review_settings_controller_spec.rb +57 -0
  83. data/spec/controllers/admin/reviews_controller_spec.rb +63 -0
  84. data/spec/controllers/feedback_reviews_controller_spec.rb +71 -0
  85. data/spec/controllers/products_controller_spec.rb +9 -0
  86. data/spec/controllers/reviews_controller_spec.rb +136 -0
  87. data/spec/factories/feedback_review_factory.rb +8 -0
  88. data/spec/factories/review_factory.rb +15 -0
  89. data/spec/features/admin_spec.rb +35 -0
  90. data/spec/features/reviews_spec.rb +106 -0
  91. data/spec/helpers/review_helper_spec.rb +28 -0
  92. data/spec/models/feedback_review_spec.rb +78 -0
  93. data/spec/models/product_spec.rb +62 -0
  94. data/spec/models/review_spec.rb +169 -0
  95. data/spec/models/reviews_ability_spec.rb +46 -0
  96. data/spec/models/reviews_configuration_spec.rb +45 -0
  97. data/spec/spec_helper.rb +48 -0
  98. data/vendor/assets/javascripts/jquery.rating.js +376 -0
  99. 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,9 @@
1
+ class AddUserToReviews < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :reviews, :user_id, :integer, :null => true
4
+ end
5
+
6
+ def self.down
7
+ remove_column :reviews, :user_id
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class AddIpAddressToReviews < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :reviews, :ip_address, :string
4
+ end
5
+
6
+ def self.down
7
+ remove_column :reviews, :ip_address
8
+ end
9
+ end
@@ -0,0 +1,6 @@
1
+ class NamespaceTables < ActiveRecord::Migration
2
+ def change
3
+ rename_table :reviews, :spree_reviews
4
+ rename_table :feedback_reviews, :spree_feedback_reviews
5
+ end
6
+ 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,9 @@
1
+ class AddLocaleToReviews < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :spree_reviews, :locale, :string, :default => 'en'
4
+ end
5
+
6
+ def self.down
7
+ remove_column :spree_reviews, :locale
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class AddLocaleToFeedbackReviews < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :spree_feedback_reviews, :locale, :string, :default => 'en'
4
+ end
5
+
6
+ def self.down
7
+ remove_column :spree_feedback_reviews, :locale
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ t1:
2
+ product: ror_jr_spaghetti
3
+ value: 3.56
4
+ count: 20
5
+ t2:
6
+ product: ror_bag
7
+ value: 2.56
8
+ count: 30
9
+ t3:
10
+ product: ror_tote
11
+ value: 3.94
12
+ count: 10
13
+ t4:
14
+ product: apache_baseball_jersey
15
+ value: 1.49
16
+ count: 6
@@ -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
@@ -0,0 +1,4 @@
1
+ require 'sass/rails'
2
+ require 'spree_core'
3
+ require 'jiffyshirts_spree_reviews/engine'
4
+ require 'coffee_script'
data/script/rails ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ ENGINE_PATH = File.expand_path('../..', __FILE__)
5
+ load File.expand_path('../../spec/dummy/script/rails', __FILE__)
@@ -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,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::ProductsController do
4
+ [:avg_rating, :reviews_count].each do |attrib|
5
+ it "should add #{attrib} to the set of allowed attributes" do
6
+ controller.permitted_product_attributes.should include(attrib)
7
+ end
8
+ end
9
+ 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,8 @@
1
+ FactoryGirl.define do
2
+ factory :feedback_review, :class => Spree::FeedbackReview do |f|
3
+ user
4
+ review
5
+ comment { generate(:random_description) }
6
+ rating { rand(1..5) }
7
+ end
8
+ 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