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,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature 'Review Admin', js: true do
|
4
|
+
stub_authorization!
|
5
|
+
|
6
|
+
given!(:review) { create(:review) }
|
7
|
+
|
8
|
+
context 'index' do
|
9
|
+
background do
|
10
|
+
visit spree.admin_reviews_path
|
11
|
+
end
|
12
|
+
|
13
|
+
scenario 'list reviews' do
|
14
|
+
expect(page).to have_text review.product.name
|
15
|
+
end
|
16
|
+
|
17
|
+
scenario 'approve reviews' do
|
18
|
+
expect(review.approved).to be false
|
19
|
+
within("tr#review_#{review.id}") do
|
20
|
+
find('.approve').click
|
21
|
+
end
|
22
|
+
expect(review.reload.approved).to be true
|
23
|
+
end
|
24
|
+
|
25
|
+
scenario 'edit reviews' do
|
26
|
+
expect(page).to have_text review.product.name
|
27
|
+
within("tr#review_#{review.id}") do
|
28
|
+
find('.edit').click
|
29
|
+
end
|
30
|
+
|
31
|
+
expect(page).to have_text 'Editing'
|
32
|
+
expect(page).to have_text review.title
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature 'Reviews', js: true do
|
4
|
+
given!(:someone) { create(:user, email: 'ryan@spree.com') }
|
5
|
+
given!(:review) { create(:review, :approved, user: someone) }
|
6
|
+
|
7
|
+
background do
|
8
|
+
Spree::Reviews::Config.include_unapproved_reviews = false
|
9
|
+
end
|
10
|
+
|
11
|
+
context 'product with no review' do
|
12
|
+
given!(:product_no_reviews) { create(:product) }
|
13
|
+
scenario 'informs that no reviews has been written yet' do
|
14
|
+
visit spree.product_path(product_no_reviews)
|
15
|
+
expect(page).to have_text Spree.t(:no_reviews_available)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Regression test for #103
|
19
|
+
context "shows correct number of previews" do
|
20
|
+
background do
|
21
|
+
FactoryGirl.create_list :review, 3, product: product_no_reviews, approved: true
|
22
|
+
Spree::Reviews::Config[:preview_size] = 2
|
23
|
+
end
|
24
|
+
|
25
|
+
scenario "displayed reviews are limited by the set preview size" do
|
26
|
+
visit spree.product_path(product_no_reviews)
|
27
|
+
expect(page.all(".review").count).to eql(2)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'when anonymous user' do
|
33
|
+
background do
|
34
|
+
Spree::Reviews::Config.require_login = true
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'visit product with review' do
|
38
|
+
background do
|
39
|
+
visit spree.product_path(review.product)
|
40
|
+
end
|
41
|
+
|
42
|
+
scenario 'should see review title' do
|
43
|
+
expect(page).to have_text review.title
|
44
|
+
end
|
45
|
+
|
46
|
+
scenario 'can not create review' do
|
47
|
+
expect(page).not_to have_text Spree.t(:write_your_own_review)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'when logged in user' do
|
53
|
+
given!(:user) { create(:user) }
|
54
|
+
|
55
|
+
background do
|
56
|
+
sign_in_as! user
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'visit product with review' do
|
60
|
+
background do
|
61
|
+
visit spree.product_path(review.product)
|
62
|
+
end
|
63
|
+
|
64
|
+
scenario 'can see review title' do
|
65
|
+
expect(page).to have_text review.title
|
66
|
+
end
|
67
|
+
|
68
|
+
scenario 'can see create new review button' do
|
69
|
+
expect(page).to have_text Spree.t(:write_your_own_review)
|
70
|
+
end
|
71
|
+
|
72
|
+
scenario 'can create new review' do
|
73
|
+
click_on Spree.t(:write_your_own_review)
|
74
|
+
|
75
|
+
expect(page).to have_text Spree.t(:leave_us_a_review_for, name: review.product.name)
|
76
|
+
|
77
|
+
within '#new_review' do
|
78
|
+
click_star(3)
|
79
|
+
|
80
|
+
fill_in 'review_name', with: user.email
|
81
|
+
fill_in 'review_title', with: 'Great product!'
|
82
|
+
fill_in 'review_review', with: 'Some big review text..'
|
83
|
+
click_on 'Submit your review'
|
84
|
+
end
|
85
|
+
|
86
|
+
expect(page.find('.flash.notice', text: Spree.t(:review_successfully_submitted))).to be_truthy
|
87
|
+
expect(page).not_to have_text 'Some big review text..'
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
private
|
93
|
+
|
94
|
+
def sign_in_as!(user)
|
95
|
+
visit spree.login_path
|
96
|
+
within '#new_spree_user' do
|
97
|
+
fill_in 'Email', with: user.email
|
98
|
+
fill_in 'Password', with: user.password
|
99
|
+
end
|
100
|
+
click_button 'Login'
|
101
|
+
end
|
102
|
+
|
103
|
+
def click_star(num)
|
104
|
+
page.all(:xpath, "//a[@title='#{num} stars']")[0].click
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::ReviewsHelper do
|
4
|
+
context 'star' do
|
5
|
+
specify do
|
6
|
+
expect(star('a_class')).to eq '<span class="a_class"> ✮ </span>'
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
context 'mk_stars' do
|
11
|
+
specify do
|
12
|
+
matches = mk_stars(2).scan(/unlit/)
|
13
|
+
expect(matches.length).to eq 3
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'txt_stars' do
|
19
|
+
specify do
|
20
|
+
expect(txt_stars(2, true)).to eq '2 out of 5'
|
21
|
+
end
|
22
|
+
|
23
|
+
specify do
|
24
|
+
expect(txt_stars(3, false)).to be_a String
|
25
|
+
expect(txt_stars(3, false)).to eq('3')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::FeedbackReview do
|
4
|
+
context 'validations' do
|
5
|
+
it 'validates by default' do
|
6
|
+
build(:feedback_review).should be_valid
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'validates with a nil user' do
|
10
|
+
build(:feedback_review, user: nil).should be_valid
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'does not validate with a nil review' do
|
14
|
+
build(:feedback_review, review: nil).should_not be_valid
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'rating' do
|
18
|
+
it 'does not validate when no rating is specified' do
|
19
|
+
build(:feedback_review, rating: nil).should_not be_valid
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'does not validate when the rating is not a number' do
|
23
|
+
build(:feedback_review, rating: 'not_a_number').should_not be_valid
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'does not validate when the rating is a float' do
|
27
|
+
build(:feedback_review, rating: 2.718).should_not be_valid
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'does not validate when the rating is less than 1' do
|
31
|
+
build(:feedback_review, rating: 0).should_not be_valid
|
32
|
+
build(:feedback_review, rating: -5).should_not be_valid
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'does not validate when the rating is greater than 5' do
|
36
|
+
build(:feedback_review, rating: 6).should_not be_valid
|
37
|
+
build(:feedback_review, rating: 8).should_not be_valid
|
38
|
+
end
|
39
|
+
|
40
|
+
(1..5).each do |i|
|
41
|
+
it "validates when the rating is #{i}" do
|
42
|
+
build(:feedback_review, rating: i).should be_valid
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'scopes' do
|
49
|
+
context 'most_recent_first' do
|
50
|
+
let!(:feedback_review_1) { create(:feedback_review, created_at: 10.days.ago) }
|
51
|
+
let!(:feedback_review_2) { create(:feedback_review, created_at: 2.days.ago) }
|
52
|
+
let!(:feedback_review_3) { create(:feedback_review, created_at: 5.days.ago) }
|
53
|
+
|
54
|
+
it 'properly runs most_recent_first queries' do
|
55
|
+
Spree::FeedbackReview.most_recent_first.to_a.should eq([feedback_review_2, feedback_review_3, feedback_review_1])
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'defaults to most_recent_first queries' do
|
59
|
+
Spree::FeedbackReview.all.to_a.should eq([feedback_review_2, feedback_review_3, feedback_review_1])
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'localized' do
|
64
|
+
let!(:en_feedback_review_1) { create(:feedback_review, locale: 'en', created_at: 10.days.ago) }
|
65
|
+
let!(:en_feedback_review_2) { create(:feedback_review, locale: 'en', created_at: 2.days.ago) }
|
66
|
+
let!(:en_feedback_review_3) { create(:feedback_review, locale: 'en', created_at: 5.days.ago) }
|
67
|
+
|
68
|
+
let!(:es_feedback_review_1) { create(:feedback_review, locale: 'es', created_at: 10.days.ago) }
|
69
|
+
let!(:fr_feedback_review_1) { create(:feedback_review, locale: 'fr', created_at: 10.days.ago) }
|
70
|
+
|
71
|
+
it 'properly runs localized queries' do
|
72
|
+
Spree::FeedbackReview.localized('en').to_a.should eq([en_feedback_review_2, en_feedback_review_3, en_feedback_review_1])
|
73
|
+
Spree::FeedbackReview.localized('es').to_a.should eq([es_feedback_review_1])
|
74
|
+
Spree::FeedbackReview.localized('fr').to_a.should eq([fr_feedback_review_1])
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::Product do
|
4
|
+
it { should respond_to(:avg_rating) }
|
5
|
+
it { should respond_to(:reviews) }
|
6
|
+
it { should respond_to(:stars) }
|
7
|
+
|
8
|
+
context '#stars' do
|
9
|
+
let(:product) { build(:product) }
|
10
|
+
|
11
|
+
it 'rounds' do
|
12
|
+
product.stub(:avg_rating).and_return(3.7)
|
13
|
+
expect(product.stars).to eq(4)
|
14
|
+
|
15
|
+
product.stub(:avg_rating).and_return(2.3)
|
16
|
+
expect(product.stars).to eq(2)
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
it 'handles a nil value' do
|
21
|
+
product.stub(:avg_rating).and_return(nil)
|
22
|
+
expect {
|
23
|
+
expect(product.stars).to eq(0)
|
24
|
+
}.not_to raise_error
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context '#recalculate_rating' do
|
29
|
+
let!(:product) { create(:product) }
|
30
|
+
|
31
|
+
context 'when there are approved reviews' do
|
32
|
+
let!(:approved_review_1) { create(:review, product: product, approved: true, rating: 4) }
|
33
|
+
let!(:approved_review_2) { create(:review, product: product, approved: true, rating: 5) }
|
34
|
+
let!(:unapproved_review_1) { create(:review, product: product, approved: false, rating: 4) }
|
35
|
+
|
36
|
+
it "updates the product average rating and ignores unapproved reviews" do
|
37
|
+
product.avg_rating = 0
|
38
|
+
product.reviews_count = 0
|
39
|
+
product.save!
|
40
|
+
|
41
|
+
product.recalculate_rating
|
42
|
+
product.avg_rating.should eq(4.5)
|
43
|
+
product.reviews_count.should eq(2)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'when no approved reviews' do
|
48
|
+
let!(:unapproved_review_1) { create(:review, product: product, approved: false, rating: 4) }
|
49
|
+
|
50
|
+
it "updates the product average rating and ignores unapproved reviews" do
|
51
|
+
product.avg_rating = 3
|
52
|
+
product.reviews_count = 20
|
53
|
+
product.save!
|
54
|
+
|
55
|
+
product.recalculate_rating
|
56
|
+
product.avg_rating.should eq(0)
|
57
|
+
product.reviews_count.should eq(0)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,169 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::Review do
|
4
|
+
|
5
|
+
context 'validations' do
|
6
|
+
it 'validates by default' do
|
7
|
+
build(:review).should be_valid
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'validates with a nil user' do
|
11
|
+
build(:review, user: nil).should be_valid
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'does not validate with a nil review' do
|
15
|
+
build(:review, review: nil).should_not be_valid
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'rating' do
|
19
|
+
it 'does not validate when no rating is specified' do
|
20
|
+
build(:review, rating: nil).should_not be_valid
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'doesnot validate when the rating is not a number' do
|
24
|
+
build(:review, rating: 'not_a_number').should_not be_valid
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'does validate when the rating is a float' do
|
28
|
+
build(:review, rating: 2.718).should be_valid
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'does not validate when the rating is less than 1' do
|
32
|
+
build(:review, rating: 0).should_not be_valid
|
33
|
+
build(:review, rating: -5).should_not be_valid
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'does not validate when the rating is greater than 5' do
|
37
|
+
build(:review, rating: 6).should_not be_valid
|
38
|
+
build(:review, rating: 8).should_not be_valid
|
39
|
+
end
|
40
|
+
|
41
|
+
(1..5).each do |i|
|
42
|
+
it "validates when the rating is #{i}" do
|
43
|
+
build(:review, rating: i).should be_valid
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'review body' do
|
49
|
+
it 'should not be valid without a body' do
|
50
|
+
build(:review, review: nil).should_not be_valid
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'scopes' do
|
56
|
+
context 'most_recent_first' do
|
57
|
+
let!(:review_1) { create(:review, created_at: 10.days.ago) }
|
58
|
+
let!(:review_2) { create(:review, created_at: 2.days.ago) }
|
59
|
+
let!(:review_3) { create(:review, created_at: 5.days.ago) }
|
60
|
+
|
61
|
+
it 'properly runs most_recent_first queries' do
|
62
|
+
Spree::Review.most_recent_first.to_a.should eq([review_2, review_3, review_1])
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'defaults to most_recent_first queries' do
|
66
|
+
Spree::Review.all.to_a.should eq([review_2, review_3, review_1])
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'oldest_first' do
|
71
|
+
let!(:review_1) { create(:review, created_at: 10.days.ago) }
|
72
|
+
let!(:review_2) { create(:review, created_at: 2.days.ago) }
|
73
|
+
let!(:review_3) { create(:review, created_at: 5.days.ago) }
|
74
|
+
let!(:review_4) { create(:review, created_at: 1.days.ago) }
|
75
|
+
|
76
|
+
before do
|
77
|
+
reset_spree_preferences
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'properly runs oldest_first queries' do
|
81
|
+
Spree::Review.oldest_first.to_a.should eq([review_1, review_3, review_2, review_4])
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'uses oldest_first for preview' do
|
85
|
+
reset_spree_preferences
|
86
|
+
Spree::Review.preview.to_a.should eq([review_1, review_3, review_2])
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context 'localized' do
|
91
|
+
let!(:en_review_1) { create(:review, locale: 'en', created_at: 10.days.ago) }
|
92
|
+
let!(:en_review_2) { create(:review, locale: 'en', created_at: 2.days.ago) }
|
93
|
+
let!(:en_review_3) { create(:review, locale: 'en', created_at: 5.days.ago) }
|
94
|
+
|
95
|
+
let!(:es_review_1) { create(:review, locale: 'es', created_at: 10.days.ago) }
|
96
|
+
let!(:fr_review_1) { create(:review, locale: 'fr', created_at: 10.days.ago) }
|
97
|
+
|
98
|
+
it 'properly runs localized queries' do
|
99
|
+
Spree::Review.localized('en').to_a.should eq([en_review_2, en_review_3, en_review_1])
|
100
|
+
Spree::Review.localized('es').to_a.should eq([es_review_1])
|
101
|
+
Spree::Review.localized('fr').to_a.should eq([fr_review_1])
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context 'approved / not_approved / default_approval_filter' do
|
106
|
+
let!(:approved_review_1) { create(:review, approved: true, created_at: 10.days.ago) }
|
107
|
+
let!(:approved_review_2) { create(:review, approved: true, created_at: 2.days.ago) }
|
108
|
+
let!(:approved_review_3) { create(:review, approved: true, created_at: 5.days.ago) }
|
109
|
+
|
110
|
+
let!(:unapproved_review_1) { create(:review, approved: false, created_at: 7.days.ago) }
|
111
|
+
let!(:unapproved_review_2) { create(:review, approved: false, created_at: 1.days.ago) }
|
112
|
+
|
113
|
+
it 'properly runs approved and unapproved queries' do
|
114
|
+
Spree::Review.approved.to_a.should eq([approved_review_2, approved_review_3, approved_review_1])
|
115
|
+
Spree::Review.not_approved.to_a.should eq([unapproved_review_2, unapproved_review_1])
|
116
|
+
|
117
|
+
Spree::Reviews::Config[:include_unapproved_reviews] = true
|
118
|
+
Spree::Review.default_approval_filter.to_a.should eq([unapproved_review_2,
|
119
|
+
approved_review_2,
|
120
|
+
approved_review_3,
|
121
|
+
unapproved_review_1,
|
122
|
+
approved_review_1])
|
123
|
+
|
124
|
+
Spree::Reviews::Config[:include_unapproved_reviews] = false
|
125
|
+
Spree::Review.default_approval_filter.to_a.should eq([approved_review_2, approved_review_3, approved_review_1])
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
context "#recalculate_product_rating" do
|
131
|
+
let(:product) { create(:product) }
|
132
|
+
let!(:review) { create(:review, product: product) }
|
133
|
+
|
134
|
+
before { product.reviews << review }
|
135
|
+
|
136
|
+
it "if approved" do
|
137
|
+
review.should_receive(:recalculate_product_rating)
|
138
|
+
review.approved = true
|
139
|
+
review.save!
|
140
|
+
end
|
141
|
+
|
142
|
+
it "if not approved" do
|
143
|
+
review.should_not_receive(:recalculate_product_rating)
|
144
|
+
review.save!
|
145
|
+
end
|
146
|
+
|
147
|
+
it "updates the product average rating" do
|
148
|
+
review.product.should_receive(:recalculate_rating)
|
149
|
+
review.approved = true
|
150
|
+
review.save!
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
context "#feedback_stars" do
|
155
|
+
let!(:review) { create(:review) }
|
156
|
+
before do
|
157
|
+
3.times do |i|
|
158
|
+
f = Spree::FeedbackReview.new
|
159
|
+
f.review = review
|
160
|
+
f.rating = (i+1)
|
161
|
+
f.save
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
it "should return the average rating from feedback reviews" do
|
166
|
+
review.feedback_stars.should == 2
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require "cancan/matchers"
|
4
|
+
|
5
|
+
describe Spree::ReviewsAbility do
|
6
|
+
context '.allow_anonymous_reviews?' do
|
7
|
+
it 'should depend on Spree::Reviews::Config[:require_login]' do
|
8
|
+
Spree::Reviews::Config[:require_login] = false
|
9
|
+
Spree::ReviewsAbility.allow_anonymous_reviews?.should be true
|
10
|
+
Spree::Reviews::Config[:require_login] = true
|
11
|
+
Spree::ReviewsAbility.allow_anonymous_reviews?.should be false
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'permissions' do
|
16
|
+
let(:user_without_email) { double(:user, email: nil) }
|
17
|
+
let(:user_with_email) { double(:user, email: 'a@b.com') }
|
18
|
+
|
19
|
+
context 'when anonymous reviews are allowed' do
|
20
|
+
before do
|
21
|
+
Spree::Reviews::Config[:require_login] = false
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'lets anyone create a review or feedback review' do
|
25
|
+
[user_without_email, user_with_email].each do |u|
|
26
|
+
Spree::ReviewsAbility.new(u).should be_able_to(:create, Spree::Review.new)
|
27
|
+
Spree::ReviewsAbility.new(u).should be_able_to(:create, Spree::FeedbackReview.new)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'when anonymous reviews are not allowed' do
|
33
|
+
before do
|
34
|
+
Spree::Reviews::Config[:require_login] = true
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'only allows users with an email to create a review or feedback review' do
|
38
|
+
Spree::ReviewsAbility.new(user_without_email).should_not be_able_to(:create, Spree::Review.new)
|
39
|
+
Spree::ReviewsAbility.new(user_without_email).should_not be_able_to(:create, Spree::FeedbackReview.new)
|
40
|
+
|
41
|
+
Spree::ReviewsAbility.new(user_with_email).should be_able_to(:create, Spree::Review.new)
|
42
|
+
Spree::ReviewsAbility.new(user_with_email).should be_able_to(:create, Spree::FeedbackReview.new)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::ReviewsConfiguration do
|
4
|
+
subject { Spree::ReviewsConfiguration.new }
|
5
|
+
|
6
|
+
before do
|
7
|
+
reset_spree_preferences
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should have the include_unapproved_reviews preference' do
|
11
|
+
subject.should respond_to(:preferred_include_unapproved_reviews)
|
12
|
+
subject.should respond_to(:preferred_include_unapproved_reviews=)
|
13
|
+
subject.preferred_include_unapproved_reviews.should be false
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should have the preview_size preference' do
|
17
|
+
subject.should respond_to(:preferred_preview_size)
|
18
|
+
subject.should respond_to(:preferred_preview_size=)
|
19
|
+
subject.preferred_preview_size.should eq(3)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should have the show_email preference' do
|
23
|
+
subject.should respond_to(:preferred_show_email)
|
24
|
+
subject.should respond_to(:preferred_show_email=)
|
25
|
+
subject.preferred_show_email.should be false
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should have the feedback_rating preference' do
|
29
|
+
subject.should respond_to(:preferred_feedback_rating)
|
30
|
+
subject.should respond_to(:preferred_feedback_rating=)
|
31
|
+
subject.preferred_feedback_rating.should be false
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should have the require_login preference' do
|
35
|
+
subject.should respond_to(:preferred_require_login)
|
36
|
+
subject.should respond_to(:preferred_require_login=)
|
37
|
+
subject.preferred_require_login.should be true
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should have the track_locale preference' do
|
41
|
+
subject.should respond_to(:preferred_track_locale)
|
42
|
+
subject.should respond_to(:preferred_track_locale=)
|
43
|
+
subject.preferred_track_locale.should be false
|
44
|
+
end
|
45
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start 'rails'
|
3
|
+
|
4
|
+
ENV["RAILS_ENV"] = "test"
|
5
|
+
|
6
|
+
require File.expand_path("../dummy/config/environment.rb", __FILE__)
|
7
|
+
require 'rspec/rails'
|
8
|
+
require 'ffaker'
|
9
|
+
require 'database_cleaner'
|
10
|
+
require 'capybara'
|
11
|
+
require 'capybara/rspec'
|
12
|
+
require 'capybara/rails'
|
13
|
+
require 'capybara/poltergeist'
|
14
|
+
|
15
|
+
Dir[File.join(File.dirname(__FILE__), "support/**/*.rb")].each {|f| require f }
|
16
|
+
|
17
|
+
require 'spree/testing_support/factories'
|
18
|
+
require 'spree/testing_support/controller_requests'
|
19
|
+
require 'spree/testing_support/authorization_helpers'
|
20
|
+
require 'spree/testing_support/preferences'
|
21
|
+
require 'spree/testing_support/url_helpers'
|
22
|
+
|
23
|
+
FactoryGirl.find_definitions
|
24
|
+
|
25
|
+
RSpec.configure do |config|
|
26
|
+
config.include Spree::TestingSupport::ControllerRequests
|
27
|
+
config.include Spree::TestingSupport::Preferences
|
28
|
+
config.include FactoryGirl::Syntax::Methods
|
29
|
+
config.include Spree::TestingSupport::UrlHelpers
|
30
|
+
config.infer_spec_type_from_file_location!
|
31
|
+
config.use_transactional_fixtures = false
|
32
|
+
|
33
|
+
config.before(:suite) do
|
34
|
+
DatabaseCleaner.strategy = :transaction
|
35
|
+
DatabaseCleaner.clean_with(:truncation)
|
36
|
+
end
|
37
|
+
|
38
|
+
config.before do
|
39
|
+
DatabaseCleaner.strategy = RSpec.current_example.metadata[:js] ? :truncation : :transaction
|
40
|
+
DatabaseCleaner.start
|
41
|
+
end
|
42
|
+
|
43
|
+
config.after do
|
44
|
+
DatabaseCleaner.clean
|
45
|
+
end
|
46
|
+
|
47
|
+
Capybara.javascript_driver = :poltergeist
|
48
|
+
end
|