solidus_reviews 1.0.0 → 1.1.0

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 (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