solidus_reviews 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +322 -0
  3. data/.travis.yml +27 -14
  4. data/Gemfile +23 -8
  5. data/LICENSE.md +2 -2
  6. data/README.md +9 -11
  7. data/Rakefile +2 -0
  8. data/app/controllers/spree/admin/feedback_reviews_controller.rb +3 -1
  9. data/app/controllers/spree/admin/review_settings_controller.rb +3 -1
  10. data/app/controllers/spree/admin/reviews_controller.rb +9 -6
  11. data/app/controllers/spree/feedback_reviews_controller.rb +25 -19
  12. data/app/controllers/spree/products_controller_decorator.rb +2 -0
  13. data/app/controllers/spree/reviews_controller.rb +11 -7
  14. data/app/helpers/spree/api/api_helpers_decorator.rb +12 -0
  15. data/app/helpers/spree/reviews_helper.rb +15 -5
  16. data/app/models/spree/feedback_review.rb +5 -4
  17. data/app/models/spree/product_decorator.rb +5 -4
  18. data/app/models/spree/review.rb +28 -10
  19. data/app/models/spree/reviews_ability.rb +17 -3
  20. data/app/models/spree/reviews_configuration.rb +16 -8
  21. data/app/models/spree/user_decorator.rb +3 -0
  22. data/app/overrides/add_reviews_after_product_properties.rb +7 -5
  23. data/app/overrides/add_reviews_tab_to_admin.rb +12 -4
  24. data/app/overrides/add_reviews_to_admin_configuration_sidebar.rb +13 -5
  25. data/app/views/spree/admin/feedback_reviews/index.html.erb +9 -9
  26. data/app/views/spree/admin/review_settings/edit.html.erb +64 -35
  27. data/app/views/spree/admin/reviews/_form.html.erb +26 -5
  28. data/app/views/spree/admin/reviews/edit.html.erb +2 -2
  29. data/app/views/spree/admin/reviews/index.html.erb +100 -88
  30. data/app/views/spree/api/reviews/_review.json.jbuilder +8 -0
  31. data/app/views/spree/api/reviews/index.json.jbuilder +6 -0
  32. data/app/views/spree/api/reviews/show.json.jbuilder +3 -0
  33. data/app/views/spree/feedback_reviews/_form.html.erb +5 -5
  34. data/app/views/spree/feedback_reviews/_summary.html.erb +3 -3
  35. data/app/views/spree/feedback_reviews/create.js.erb +2 -2
  36. data/app/views/spree/reviews/_form.html.erb +15 -10
  37. data/app/views/spree/reviews/new.html.erb +2 -2
  38. data/app/views/spree/shared/_rating.html.erb +3 -3
  39. data/app/views/spree/shared/_review.html.erb +29 -19
  40. data/app/views/spree/shared/_review_summary.html.erb +3 -3
  41. data/app/views/spree/shared/_reviews.html.erb +6 -6
  42. data/app/views/spree/shared/_shortrating.html.erb +2 -2
  43. data/bin/rails +4 -2
  44. data/config/initializers/constants.rb +2 -0
  45. data/config/initializers/load_preferences.rb +2 -0
  46. data/config/locales/de-CH.yml +14 -1
  47. data/config/locales/de.yml +14 -1
  48. data/config/locales/en-GB.yml +14 -2
  49. data/config/locales/en.yml +14 -1
  50. data/config/locales/es.yml +14 -2
  51. data/config/locales/fr.yml +14 -2
  52. data/config/locales/it.yml +79 -0
  53. data/config/locales/pl.yml +14 -2
  54. data/config/locales/pt-BR.yml +14 -2
  55. data/config/locales/pt.yml +14 -2
  56. data/config/locales/ro.yml +15 -3
  57. data/config/locales/ru.yml +14 -2
  58. data/config/locales/sv.yml +14 -1
  59. data/config/locales/tr.yml +14 -2
  60. data/config/locales/uk.yml +14 -1
  61. data/config/locales/zh-CN.yml +14 -1
  62. data/config/locales/zh-TW.yml +14 -1
  63. data/config/routes.rb +18 -1
  64. data/db/migrate/20081020220724_create_reviews.rb +4 -2
  65. data/db/migrate/20101222083309_create_feedback_reviews.rb +5 -3
  66. data/db/migrate/20110406083603_add_rating_to_products.rb +7 -5
  67. data/db/migrate/20110606150524_add_user_to_reviews.rb +4 -2
  68. data/db/migrate/20110806093221_add_ip_address_to_reviews.rb +3 -1
  69. data/db/migrate/20120110172331_namespace_tables.rb +3 -1
  70. data/db/migrate/20120123141326_recalculate_ratings.rb +6 -5
  71. data/db/migrate/20120712182514_add_locale_to_reviews.rb +4 -2
  72. data/db/migrate/20120712182627_add_locale_to_feedback_reviews.rb +4 -2
  73. data/db/migrate/20140703200946_add_show_identifier_to_reviews.rb +3 -1
  74. data/db/migrate/20190613165528_add_verified_purchaser_to_reviews.rb +5 -0
  75. data/lib/controllers/spree/api/reviews_controller.rb +111 -0
  76. data/lib/generators/solidus_reviews/install/install_generator.rb +5 -4
  77. data/lib/solidus_reviews.rb +3 -1
  78. data/lib/solidus_reviews/factories.rb +3 -1
  79. data/lib/solidus_reviews/factories/feedback_review_factory.rb +6 -5
  80. data/lib/solidus_reviews/factories/review_factory.rb +19 -9
  81. data/lib/spree_reviews/engine.rb +7 -0
  82. data/solidus_reviews.gemspec +20 -18
  83. data/spec/controllers/admin/feedback_reviews_controller_spec.rb +9 -7
  84. data/spec/controllers/admin/review_settings_controller_spec.rb +18 -16
  85. data/spec/controllers/admin/reviews_controller_spec.rb +18 -16
  86. data/spec/controllers/feedback_reviews_controller_spec.rb +29 -25
  87. data/spec/controllers/products_controller_spec.rb +4 -2
  88. data/spec/controllers/reviews_controller_spec.rb +67 -40
  89. data/spec/controllers/spree/api/reviews_controller_spec.rb +233 -0
  90. data/spec/features/admin_spec.rb +3 -0
  91. data/spec/features/reviews_spec.rb +27 -11
  92. data/spec/helpers/review_helper_spec.rb +3 -2
  93. data/spec/models/feedback_review_spec.rb +19 -17
  94. data/spec/models/product_spec.rb +41 -19
  95. data/spec/models/review_spec.rb +100 -42
  96. data/spec/models/reviews_ability_spec.rb +10 -8
  97. data/spec/models/reviews_configuration_spec.rb +28 -19
  98. data/spec/spec_helper.rb +21 -35
  99. data/vendor/assets/javascripts/jquery.rating.js +389 -376
  100. metadata +108 -59
@@ -1,8 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  feature 'Reviews', js: true do
4
6
  given!(:someone) { create(:user, email: 'ryan@spree.com') }
5
7
  given!(:review) { create(:review, :approved, user: someone) }
8
+ given!(:unapproved_review) { create(:review, product: review.product) }
6
9
 
7
10
  background do
8
11
  Spree::Reviews::Config.include_unapproved_reviews = false
@@ -12,13 +15,13 @@ feature 'Reviews', js: true do
12
15
  given!(:product_no_reviews) { create(:product) }
13
16
  scenario 'informs that no reviews has been written yet' do
14
17
  visit spree.product_path(product_no_reviews)
15
- expect(page).to have_text Spree.t(:no_reviews_available)
18
+ expect(page).to have_text I18n.t('spree.no_reviews_available')
16
19
  end
17
20
 
18
21
  # Regression test for #103
19
22
  context "shows correct number of previews" do
20
23
  background do
21
- FactoryGirl.create_list :review, 3, product: product_no_reviews, approved: true
24
+ FactoryBot.create_list :review, 3, product: product_no_reviews, approved: true
22
25
  Spree::Reviews::Config[:preview_size] = 2
23
26
  end
24
27
 
@@ -44,7 +47,7 @@ feature 'Reviews', js: true do
44
47
  end
45
48
 
46
49
  scenario 'can not create review' do
47
- expect(page).not_to have_text Spree.t(:write_your_own_review)
50
+ expect(page).not_to have_text I18n.t('spree.write_your_own_review')
48
51
  end
49
52
  end
50
53
  end
@@ -65,14 +68,27 @@ feature 'Reviews', js: true do
65
68
  expect(page).to have_text review.title
66
69
  end
67
70
 
71
+ context 'with unapproved content allowed' do
72
+ background do
73
+ Spree::Reviews::Config[:include_unapproved_reviews] = true
74
+ Spree::Reviews::Config[:display_unapproved_reviews] = true
75
+ visit spree.product_path(review.product)
76
+ end
77
+
78
+ scenario 'can see unapproved content when allowed' do
79
+ expect(unapproved_review.approved?).to eq(false)
80
+ expect(page).to have_text unapproved_review.title
81
+ end
82
+ end
83
+
68
84
  scenario 'can see create new review button' do
69
- expect(page).to have_text Spree.t(:write_your_own_review)
85
+ expect(page).to have_text I18n.t('spree.write_your_own_review')
70
86
  end
71
87
 
72
88
  scenario 'can create new review' do
73
- click_on Spree.t(:write_your_own_review)
89
+ click_on I18n.t('spree.write_your_own_review')
74
90
 
75
- expect(page).to have_text Spree.t(:leave_us_a_review_for, name: review.product.name)
91
+ expect(page).to have_text I18n.t('spree.leave_us_a_review_for', name: review.product.name)
76
92
  expect(page).not_to have_text 'Show Identifier'
77
93
 
78
94
  within '#new_review' do
@@ -81,10 +97,11 @@ feature 'Reviews', js: true do
81
97
  fill_in 'review_name', with: user.email
82
98
  fill_in 'review_title', with: 'Great product!'
83
99
  fill_in 'review_review', with: 'Some big review text..'
100
+ attach_file 'review_images', Spree::Core::Engine.root + 'spec/fixtures/thinking-cat.jpg'
84
101
  click_on 'Submit your review'
85
102
  end
86
-
87
- expect(page.find('.flash.notice', text: Spree.t(:review_successfully_submitted))).to be_truthy
103
+
104
+ expect(page.find('.flash.notice', text: I18n.t('spree.review_successfully_submitted'))).to be_truthy
88
105
  expect(page).not_to have_text 'Some big review text..'
89
106
  end
90
107
  end
@@ -93,16 +110,15 @@ feature 'Reviews', js: true do
93
110
  context 'visit product with review where show_identifier is false' do
94
111
  given!(:user) { create(:user) }
95
112
  given!(:review) { create(:review, :approved, :hide_identifier, review: 'review text', user: user) }
96
-
113
+
97
114
  background do
98
115
  visit spree.product_path(review.product)
99
116
  end
100
117
 
101
118
  scenario 'show anonymous review' do
102
- expect(page).to have_text Spree.t(:anonymous)
119
+ expect(page).to have_text I18n.t('spree.anonymous')
103
120
  expect(page).to have_text 'review text'
104
121
  end
105
-
106
122
  end
107
123
 
108
124
  private
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Spree::ReviewsHelper do
@@ -11,7 +13,6 @@ describe Spree::ReviewsHelper do
11
13
  specify do
12
14
  matches = mk_stars(2).scan(/unlit/)
13
15
  expect(matches.length).to eq 3
14
-
15
16
  end
16
17
  end
17
18
 
@@ -25,4 +26,4 @@ describe Spree::ReviewsHelper do
25
26
  expect(txt_stars(3, false)).to eq('3')
26
27
  end
27
28
  end
28
- end
29
+ end
@@ -1,45 +1,47 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Spree::FeedbackReview do
4
6
  context 'validations' do
5
7
  it 'validates by default' do
6
- build(:feedback_review).should be_valid
8
+ expect(build(:feedback_review)).to be_valid
7
9
  end
8
10
 
9
11
  it 'validates with a nil user' do
10
- build(:feedback_review, user: nil).should be_valid
12
+ expect(build(:feedback_review, user: nil)).to be_valid
11
13
  end
12
14
 
13
15
  it 'does not validate with a nil review' do
14
- build(:feedback_review, review: nil).should_not be_valid
16
+ expect(build(:feedback_review, review: nil)).to_not be_valid
15
17
  end
16
18
 
17
19
  context 'rating' do
18
20
  it 'does not validate when no rating is specified' do
19
- build(:feedback_review, rating: nil).should_not be_valid
21
+ expect(build(:feedback_review, rating: nil)).to_not be_valid
20
22
  end
21
23
 
22
24
  it 'does not validate when the rating is not a number' do
23
- build(:feedback_review, rating: 'not_a_number').should_not be_valid
25
+ expect(build(:feedback_review, rating: 'not_a_number')).to_not be_valid
24
26
  end
25
27
 
26
28
  it 'does not validate when the rating is a float' do
27
- build(:feedback_review, rating: 2.718).should_not be_valid
29
+ expect(build(:feedback_review, rating: 2.718)).to_not be_valid
28
30
  end
29
31
 
30
32
  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
+ expect(build(:feedback_review, rating: 0)).to_not be_valid
34
+ expect(build(:feedback_review, rating: -5)).to_not be_valid
33
35
  end
34
36
 
35
37
  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
+ expect(build(:feedback_review, rating: 6)).to_not be_valid
39
+ expect(build(:feedback_review, rating: 8)).to_not be_valid
38
40
  end
39
41
 
40
42
  (1..5).each do |i|
41
43
  it "validates when the rating is #{i}" do
42
- build(:feedback_review, rating: i).should be_valid
44
+ expect(build(:feedback_review, rating: i)).to be_valid
43
45
  end
44
46
  end
45
47
  end
@@ -52,11 +54,11 @@ describe Spree::FeedbackReview do
52
54
  let!(:feedback_review_3) { create(:feedback_review, created_at: 5.days.ago) }
53
55
 
54
56
  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])
57
+ expect(Spree::FeedbackReview.most_recent_first.to_a).to eq([feedback_review_2, feedback_review_3, feedback_review_1])
56
58
  end
57
59
 
58
60
  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])
61
+ expect(Spree::FeedbackReview.all.to_a).to eq([feedback_review_2, feedback_review_3, feedback_review_1])
60
62
  end
61
63
  end
62
64
 
@@ -69,10 +71,10 @@ describe Spree::FeedbackReview do
69
71
  let!(:fr_feedback_review_1) { create(:feedback_review, locale: 'fr', created_at: 10.days.ago) }
70
72
 
71
73
  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])
74
+ expect(Spree::FeedbackReview.localized('en').to_a).to eq([en_feedback_review_2, en_feedback_review_3, en_feedback_review_1])
75
+ expect(Spree::FeedbackReview.localized('es').to_a).to eq([es_feedback_review_1])
76
+ expect(Spree::FeedbackReview.localized('fr').to_a).to eq([fr_feedback_review_1])
75
77
  end
76
78
  end
77
79
  end
78
- end
80
+ end
@@ -1,24 +1,26 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Spree::Product do
4
- it { should respond_to(:avg_rating) }
5
- it { should respond_to(:reviews) }
6
- it { should respond_to(:stars) }
6
+ it { is_expected.to respond_to(:avg_rating) }
7
+ it { is_expected.to respond_to(:reviews) }
8
+ it { is_expected.to respond_to(:stars) }
7
9
 
8
10
  context '#stars' do
9
11
  let(:product) { build(:product) }
10
12
 
11
13
  it 'rounds' do
12
- product.stub(:avg_rating).and_return(3.7)
14
+ allow(product).to receive(:avg_rating).and_return(3.7)
13
15
  expect(product.stars).to eq(4)
14
16
 
15
- product.stub(:avg_rating).and_return(2.3)
17
+ allow(product).to receive(:avg_rating).and_return(2.3)
16
18
  expect(product.stars).to eq(2)
17
19
  end
18
20
 
19
-
20
21
  it 'handles a nil value' do
21
- product.stub(:avg_rating).and_return(nil)
22
+ allow(product).to receive(:avg_rating).and_return(nil)
23
+
22
24
  expect {
23
25
  expect(product.stars).to eq(0)
24
26
  }.not_to raise_error
@@ -33,18 +35,39 @@ describe Spree::Product do
33
35
  let!(:approved_review_2) { create(:review, product: product, approved: true, rating: 5) }
34
36
  let!(:unapproved_review_1) { create(:review, product: product, approved: false, rating: 4) }
35
37
 
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!
38
+ context "including unapproved reviews" do
39
+ before(:all) do
40
+ Spree::Reviews::Config[:include_unapproved_reviews] = true
41
+ end
42
+ after(:all) do
43
+ Spree::Reviews::Config[:include_unapproved_reviews] = false
44
+ end
40
45
 
41
- product.recalculate_rating
42
- product.avg_rating.should eq(4.5)
43
- product.reviews_count.should eq(2)
46
+ it "updates the product average rating and ignores unapproved reviews" do
47
+ product.avg_rating = 0
48
+ product.reviews_count = 0
49
+ product.save!
50
+
51
+ product.recalculate_rating
52
+ expect(product.avg_rating).to eq(4.3)
53
+ expect(product.reviews_count).to eq(3)
54
+ end
55
+ end
56
+
57
+ context "only approved reviews" do
58
+ it "updates the product average rating and ignores unapproved reviews" do
59
+ product.avg_rating = 0
60
+ product.reviews_count = 0
61
+ product.save!
62
+
63
+ product.recalculate_rating
64
+ expect(product.avg_rating).to eq(4.5)
65
+ expect(product.reviews_count).to eq(2)
66
+ end
44
67
  end
45
68
  end
46
69
 
47
- context 'when no approved reviews' do
70
+ context "without unapproved reviews" do
48
71
  let!(:unapproved_review_1) { create(:review, product: product, approved: false, rating: 4) }
49
72
 
50
73
  it "updates the product average rating and ignores unapproved reviews" do
@@ -53,10 +76,9 @@ describe Spree::Product do
53
76
  product.save!
54
77
 
55
78
  product.recalculate_rating
56
- product.avg_rating.should eq(0)
57
- product.reviews_count.should eq(0)
79
+ expect(product.avg_rating).to eq(0)
80
+ expect(product.reviews_count).to eq(0)
58
81
  end
59
82
  end
60
-
61
83
  end
62
- end
84
+ end
@@ -1,53 +1,54 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Spree::Review do
4
-
5
6
  context 'validations' do
6
7
  it 'validates by default' do
7
- build(:review).should be_valid
8
+ expect(build(:review)).to be_valid
8
9
  end
9
10
 
10
11
  it 'validates with a nil user' do
11
- build(:review, user: nil).should be_valid
12
+ expect(build(:review, user: nil)).to be_valid
12
13
  end
13
14
 
14
- it 'does not validate with a nil review' do
15
- build(:review, review: nil).should_not be_valid
15
+ it 'validates with a nil review' do
16
+ expect(build(:review, review: nil)).to be_valid
16
17
  end
17
18
 
18
19
  context 'rating' do
19
20
  it 'does not validate when no rating is specified' do
20
- build(:review, rating: nil).should_not be_valid
21
+ expect(build(:review, rating: nil)).to_not be_valid
21
22
  end
22
23
 
23
24
  it 'does not validate when the rating is not a number' do
24
- build(:review, rating: 'not_a_number').should_not be_valid
25
+ expect(build(:review, rating: 'not_a_number')).to_not be_valid
25
26
  end
26
27
 
27
28
  it 'does not validate when the rating is a float' do
28
- build(:review, rating: 2.718).should_not be_valid
29
+ expect(build(:review, rating: 2.718)).to_not be_valid
29
30
  end
30
31
 
31
32
  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
33
+ expect(build(:review, rating: 0)).to_not be_valid
34
+ expect(build(:review, rating: -5)).to_not be_valid
34
35
  end
35
36
 
36
37
  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
38
+ expect(build(:review, rating: 6)).to_not be_valid
39
+ expect(build(:review, rating: 8)).to_not be_valid
39
40
  end
40
41
 
41
42
  (1..5).each do |i|
42
- it "validates when the rating is #{i}" do
43
- build(:review, rating: i).should be_valid
43
+ it 'validates when the rating is #{i}' do
44
+ expect(build(:review, rating: i)).to be_valid
44
45
  end
45
46
  end
46
47
  end
47
48
 
48
49
  context 'review body' do
49
- it 'should not be valid without a body' do
50
- build(:review, review: nil).should_not be_valid
50
+ it 'should be valid without a body' do
51
+ expect(build(:review, review: nil)).to be_valid
51
52
  end
52
53
  end
53
54
  end
@@ -59,11 +60,11 @@ describe Spree::Review do
59
60
  let!(:review_3) { create(:review, created_at: 5.days.ago) }
60
61
 
61
62
  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
+ expect(Spree::Review.most_recent_first.to_a).to eq([review_2, review_3, review_1])
63
64
  end
64
65
 
65
66
  it 'defaults to most_recent_first queries' do
66
- Spree::Review.all.to_a.should eq([review_2, review_3, review_1])
67
+ expect(Spree::Review.all.to_a).to eq([review_2, review_3, review_1])
67
68
  end
68
69
  end
69
70
 
@@ -75,14 +76,15 @@ describe Spree::Review do
75
76
 
76
77
  before do
77
78
  reset_spree_preferences
79
+ Spree::Reviews::Config.preference_store = Spree::Reviews::Config.default_preferences
78
80
  end
79
81
 
80
82
  it 'properly runs oldest_first queries' do
81
- Spree::Review.oldest_first.to_a.should eq([review_1, review_3, review_2, review_4])
83
+ expect(Spree::Review.oldest_first.to_a).to eq([review_1, review_3, review_2, review_4])
82
84
  end
83
85
 
84
86
  it 'uses oldest_first for preview' do
85
- Spree::Review.preview.to_a.should eq([review_1, review_3])
87
+ expect(Spree::Review.preview.to_a).to eq([review_1, review_3, review_2])
86
88
  end
87
89
  end
88
90
 
@@ -95,9 +97,9 @@ describe Spree::Review do
95
97
  let!(:fr_review_1) { create(:review, locale: 'fr', created_at: 10.days.ago) }
96
98
 
97
99
  it 'properly runs localized queries' do
98
- Spree::Review.localized('en').to_a.should eq([en_review_2, en_review_3, en_review_1])
99
- Spree::Review.localized('es').to_a.should eq([es_review_1])
100
- Spree::Review.localized('fr').to_a.should eq([fr_review_1])
100
+ expect(Spree::Review.localized('en').to_a).to eq([en_review_2, en_review_3, en_review_1])
101
+ expect(Spree::Review.localized('es').to_a).to eq([es_review_1])
102
+ expect(Spree::Review.localized('fr').to_a).to eq([fr_review_1])
101
103
  end
102
104
  end
103
105
 
@@ -110,59 +112,115 @@ describe Spree::Review do
110
112
  let!(:unapproved_review_2) { create(:review, approved: false, created_at: 1.days.ago) }
111
113
 
112
114
  it 'properly runs approved and unapproved queries' do
113
- Spree::Review.approved.to_a.should eq([approved_review_2, approved_review_3, approved_review_1])
114
- Spree::Review.not_approved.to_a.should eq([unapproved_review_2, unapproved_review_1])
115
+ expect(Spree::Review.approved.to_a).to eq([approved_review_2, approved_review_3, approved_review_1])
116
+ expect(Spree::Review.not_approved.to_a).to eq([unapproved_review_2, unapproved_review_1])
115
117
 
116
118
  Spree::Reviews::Config[:include_unapproved_reviews] = true
117
- Spree::Review.default_approval_filter.to_a.should eq([unapproved_review_2,
118
- approved_review_2,
119
- approved_review_3,
120
- unapproved_review_1,
121
- approved_review_1])
119
+ expect(Spree::Review.default_approval_filter.to_a).to eq([unapproved_review_2,
120
+ approved_review_2,
121
+ approved_review_3,
122
+ unapproved_review_1,
123
+ approved_review_1])
122
124
 
123
125
  Spree::Reviews::Config[:include_unapproved_reviews] = false
124
- Spree::Review.default_approval_filter.to_a.should eq([approved_review_2, approved_review_3, approved_review_1])
126
+ expect(Spree::Review.default_approval_filter.to_a).to eq([approved_review_2, approved_review_3, approved_review_1])
125
127
  end
126
128
  end
127
129
  end
128
130
 
129
- context "#recalculate_product_rating" do
131
+ context '#recalculate_product_rating' do
130
132
  let(:product) { create(:product) }
131
133
  let!(:review) { create(:review, product: product) }
132
134
 
133
135
  before { product.reviews << review }
134
136
 
135
- it "if approved" do
136
- review.should_receive(:recalculate_product_rating)
137
+ it 'if approved' do
138
+ expect(review).to receive(:recalculate_product_rating)
137
139
  review.approved = true
138
140
  review.save!
139
141
  end
140
142
 
141
- it "if not approved" do
142
- review.should_not_receive(:recalculate_product_rating)
143
+ it 'if not approved' do
144
+ expect(review).to_not receive(:recalculate_product_rating)
143
145
  review.save!
144
146
  end
145
147
 
146
- it "updates the product average rating" do
147
- review.product.should_receive(:recalculate_rating)
148
+ it 'updates the product average rating' do
149
+ expect(review.product).to receive(:recalculate_rating)
148
150
  review.approved = true
149
151
  review.save!
150
152
  end
151
153
  end
152
154
 
153
- context "#feedback_stars" do
155
+ context '#feedback_stars' do
154
156
  let!(:review) { create(:review) }
155
157
  before do
156
158
  3.times do |i|
157
159
  f = Spree::FeedbackReview.new
158
160
  f.review = review
159
- f.rating = (i+1)
161
+ f.rating = (i + 1)
160
162
  f.save
161
163
  end
162
164
  end
163
165
 
164
- it "should return the average rating from feedback reviews" do
165
- review.feedback_stars.should == 2
166
+ it 'should return the average rating from feedback reviews' do
167
+ expect(review.feedback_stars).to eq 2
168
+ end
169
+ end
170
+
171
+ context '#email' do
172
+ it 'returns email from user' do
173
+ user = build(:user, email: 'john@smith.com')
174
+ review = build(:review, user: user)
175
+ expect(review.email).to eq('john@smith.com')
176
+ end
177
+ end
178
+
179
+ context 'images' do
180
+ it 'supports images' do
181
+ review = build(:review, images: [build(:image)])
182
+ expect(review.images).not_to eq(nil)
183
+ end
184
+
185
+ it 'respects order' do
186
+ image_1 = build(:image, position: 2)
187
+ image_2 = build(:image, position: 1)
188
+ review = create(:review, images: [image_1, image_2])
189
+ review.reload
190
+ expect(review.images.first).to eq(image_2)
191
+ end
192
+ end
193
+
194
+ context "#verify_purchaser" do
195
+ let(:order) { create(:completed_order_with_totals) }
196
+ let(:product) { order.products.first }
197
+ let(:user) { order.user }
198
+ let(:review) { build(:review, user: user, product: product) }
199
+
200
+ it "returns true if the user has purchased the product" do
201
+ expect(review.verified_purchaser).to eq(false)
202
+ review.verify_purchaser
203
+ expect(review.verified_purchaser).to eq(true)
204
+ end
205
+
206
+ it "returns false if the user has not purchased the product" do
207
+ review.user = create(:user)
208
+ expect(review.verified_purchaser).to eq(false)
209
+ review.verify_purchaser
210
+ expect(review.verified_purchaser).to eq(false)
211
+ end
212
+
213
+ it "returns nothing if there is no user_id or product_id" do
214
+ review.product_id = nil
215
+ expect(review.verified_purchaser).to eq(false)
216
+ review.verify_purchaser
217
+ expect(review.verified_purchaser).to eq(false)
218
+
219
+ review.product_id = product.id
220
+ review.user_id = nil
221
+ expect(review.verified_purchaser).to eq(false)
222
+ review.verify_purchaser
223
+ expect(review.verified_purchaser).to eq(false)
166
224
  end
167
225
  end
168
226
  end