solidus_virtual_gift_card 1.0.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 (60) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/.rspec +1 -0
  4. data/Gemfile +10 -0
  5. data/LICENSE +26 -0
  6. data/README.md +52 -0
  7. data/Rakefile +21 -0
  8. data/app/assets/javascripts/spree/backend/solidus_virtual_gift_card.coffee +9 -0
  9. data/app/assets/stylesheets/spree/backend/solidus_virtual_gift_card.css +7 -0
  10. data/app/controllers/spree/admin/gift_cards_controller.rb +54 -0
  11. data/app/controllers/spree/api/gift_cards_controller.rb +23 -0
  12. data/app/mailers/spree/gift_card_mailer.rb +8 -0
  13. data/app/models/concerns/spree/gift_cards/line_item_concerns.rb +17 -0
  14. data/app/models/concerns/spree/gift_cards/order_concerns.rb +34 -0
  15. data/app/models/concerns/spree/redemption_code_generator.rb +10 -0
  16. data/app/models/spree/line_item_decorator.rb +1 -0
  17. data/app/models/spree/order_decorator.rb +1 -0
  18. data/app/models/spree/permission_sets/virtual_gift_card_display.rb +9 -0
  19. data/app/models/spree/permission_sets/virtual_gift_card_management.rb +9 -0
  20. data/app/models/spree/store_credit_category_decorator.rb +2 -0
  21. data/app/models/spree/virtual_gift_card.rb +75 -0
  22. data/app/overrides/admin_item_view_gift_card_codes.rb +13 -0
  23. data/app/overrides/admin_user_sidebar_store_credits.rb +6 -0
  24. data/app/overrides/admin_user_sub_menu.rb +6 -0
  25. data/app/views/spree/admin/gift_cards/_lookup_form.html.erb +8 -0
  26. data/app/views/spree/admin/gift_cards/_redemption_form.html.erb +8 -0
  27. data/app/views/spree/admin/gift_cards/index.html.erb +1 -0
  28. data/app/views/spree/admin/gift_cards/lookup.html.erb +16 -0
  29. data/app/views/spree/admin/gift_cards/show.html.erb +32 -0
  30. data/app/views/spree/admin/orders/_gift_card_redemption_codes.html.erb +3 -0
  31. data/app/views/spree/admin/users/_gift_card_sidebar.html.erb +3 -0
  32. data/app/views/spree/admin/users/_sub_menu.html.erb +10 -0
  33. data/app/views/spree/gift_card_mailer/gift_card_email.text.erb +7 -0
  34. data/bin/rails +7 -0
  35. data/circle.yml +6 -0
  36. data/config/initializers/gift_card_store_credit_event_originator.rb +7 -0
  37. data/config/locales/en.yml +21 -0
  38. data/config/routes.rb +23 -0
  39. data/db/migrate/20140623152903_create_virtual_gift_card.rb +16 -0
  40. data/db/migrate/20140624175113_seed_gift_card_category.rb +5 -0
  41. data/db/migrate/20140627185148_add_timestamps_to_gift_cards.rb +6 -0
  42. data/db/migrate/20140702153907_add_gift_card_flag_to_products.rb +5 -0
  43. data/db/migrate/20140707200431_add_line_item_to_gift_card.rb +7 -0
  44. data/db/seeds.rb +1 -0
  45. data/lib/generators/solidus_virtual_gift_card/install/install_generator.rb +36 -0
  46. data/lib/solidus_virtual_gift_card.rb +2 -0
  47. data/lib/spree_virtual_gift_card/engine.rb +20 -0
  48. data/lib/spree_virtual_gift_card/factories.rb +13 -0
  49. data/solidus_virtual_gift_card.gemspec +31 -0
  50. data/spec/controllers/spree/admin/gift_cards_controller_spec.rb +111 -0
  51. data/spec/controllers/spree/api/gift_cards_controller_spec.rb +88 -0
  52. data/spec/models/concerns/spree/redemption_code_generator_spec.rb +42 -0
  53. data/spec/models/spree/line_item_spec.rb +30 -0
  54. data/spec/models/spree/order_spec.rb +90 -0
  55. data/spec/models/spree/permission_sets/virtual_gift_card_display_spec.rb +22 -0
  56. data/spec/models/spree/permission_sets/virtual_gift_card_management_spec.rb +21 -0
  57. data/spec/models/spree/store_credit_category_spec.rb +23 -0
  58. data/spec/models/spree/virtual_gift_card_spec.rb +179 -0
  59. data/spec/spec_helper.rb +74 -0
  60. metadata +258 -0
@@ -0,0 +1,179 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::VirtualGiftCard do
4
+ let!(:gc_category) { create(:store_credit_gift_card_category) }
5
+ let!(:credit_type) { create(:secondary_credit_type, name: "Non-expiring") }
6
+
7
+ context 'validations' do
8
+ let(:invalid_gift_card) { Spree::VirtualGiftCard.new(amount: 0, currency: 'USD', purchaser: create(:user)) }
9
+
10
+ context 'given an amount less than one' do
11
+ it 'is not valid' do
12
+ expect(invalid_gift_card).not_to be_valid
13
+ end
14
+
15
+ it 'adds an error to amount' do
16
+ invalid_gift_card.save
17
+ expect(invalid_gift_card.errors.full_messages).to include 'Amount must be greater than 0'
18
+ end
19
+ end
20
+ end
21
+
22
+ context 'before create callbacks' do
23
+ let(:gift_card) { Spree::VirtualGiftCard.new(amount: 20, currency: 'USD', purchaser: create(:user), line_item: create(:line_item) ) }
24
+ subject { gift_card.save }
25
+
26
+ context 'a redemption code is set already' do
27
+ before { gift_card.redemption_code = 'foo' }
28
+ it 'keeps that redemption code' do
29
+ subject
30
+ expect(gift_card.redemption_code).to eq 'foo'
31
+ end
32
+ end
33
+
34
+ context 'no collision on redemption code' do
35
+ it 'sets an initial redemption code' do
36
+ subject
37
+ expect(gift_card.redemption_code).to be_present
38
+ end
39
+ end
40
+
41
+
42
+ context 'there is a collision on redemption code' do
43
+ context 'the existing giftcard has not been redeemed yet' do
44
+ let!(:existing_giftcard) { create(:virtual_gift_card) }
45
+ let(:expected_code) { 'EXPECTEDCODE' }
46
+ let(:generator) { Spree::RedemptionCodeGenerator }
47
+
48
+ it 'recursively generates redemption codes' do
49
+ expect(generator).to receive(:generate_redemption_code).and_return(existing_giftcard.redemption_code)
50
+ expect(generator).to receive(:generate_redemption_code).and_return(expected_code)
51
+
52
+ subject
53
+
54
+ expect(gift_card.redemption_code).to eq expected_code
55
+ end
56
+ end
57
+
58
+ context 'the existing gift card has been redeemed' do
59
+ let!(:existing_giftcard) { create(:virtual_gift_card, redeemed_at: Time.now) }
60
+ let(:generator) { Spree::RedemptionCodeGenerator }
61
+
62
+ it 'recursively generates redemption codes' do
63
+ expect(generator).to receive(:generate_redemption_code).and_return(existing_giftcard.redemption_code)
64
+
65
+ subject
66
+
67
+ expect(gift_card.redemption_code).to eq existing_giftcard.redemption_code
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ describe '#redeemed?' do
74
+ let(:gift_card) { Spree::VirtualGiftCard.new(amount: 20, currency: 'USD') }
75
+ subject { gift_card.save }
76
+
77
+ it 'is redeemed if there is a redeemed_at set' do
78
+ gift_card.redeemed_at = Time.now
79
+ subject
80
+ expect(gift_card.redeemed?).to be true
81
+ end
82
+
83
+ it 'is not redeemed if there is no timestamp for redeemed_at' do
84
+ subject
85
+ expect(gift_card.redeemed?).to be false
86
+ end
87
+ end
88
+
89
+ describe '#redeem' do
90
+ let(:gift_card) { Spree::VirtualGiftCard.create(amount: 20, currency: 'USD', purchaser: create(:user), line_item: create(:line_item)) }
91
+ let(:redeemer) { create(:user) }
92
+ subject { gift_card.redeem(redeemer) }
93
+
94
+ context 'it has already been redeemed' do
95
+ before { gift_card.redeemed_at = Date.yesterday }
96
+
97
+ it 'should return false' do
98
+ expect(subject).to be false
99
+ end
100
+
101
+ context 'does nothing to the gift card' do
102
+ it 'should not create a store credit' do
103
+ expect(gift_card.store_credit).not_to be_present
104
+ end
105
+
106
+ it 'should not update the gift card' do
107
+ expect { subject }.to_not change{ gift_card }
108
+ end
109
+ end
110
+ end
111
+
112
+ context 'it has not been redeemed already' do
113
+ context 'generates a store credit' do
114
+ before { subject }
115
+ let(:store_credit) { gift_card.store_credit }
116
+
117
+ it 'sets the relationship' do
118
+ expect(store_credit).to be_present
119
+ end
120
+
121
+ it 'sets the store credit amount' do
122
+ expect(store_credit.amount).to eq gift_card.amount
123
+ end
124
+
125
+ it 'sets the store credit currency' do
126
+ expect(store_credit.currency).to eq gift_card.currency
127
+ end
128
+
129
+ it "sets the 'Gift Card' category" do
130
+ expect(store_credit.category).to eq gc_category
131
+ end
132
+
133
+ it 'sets the redeeming user on the store credit' do
134
+ expect(store_credit.user).to eq redeemer
135
+ end
136
+
137
+ it 'sets the created_by user on the store credit' do
138
+ expect(store_credit.created_by).to eq redeemer
139
+ end
140
+
141
+ it 'sets a memo on store credit for admins to reference the redemption code' do
142
+ expect(store_credit.memo).to eq gift_card.memo
143
+ end
144
+ end
145
+
146
+ it 'returns true' do
147
+ expect(subject).to be true
148
+ end
149
+
150
+ it 'sets redeemed_at' do
151
+ subject
152
+ expect(gift_card.redeemed_at).to be_present
153
+ end
154
+
155
+ it 'sets the redeeming user association' do
156
+ subject
157
+ expect(gift_card.redeemer).to be_present
158
+ end
159
+
160
+ it 'sets the admin as the store credit event originator' do
161
+ expect { subject }.to change { Spree::StoreCreditEvent.count }.by(1)
162
+ expect(Spree::StoreCreditEvent.last.originator).to eq gift_card
163
+ end
164
+ end
165
+ end
166
+
167
+ describe '#formatted_redemption_code' do
168
+ let(:redemption_code) { 'AAAABBBBCCCCDDDD' }
169
+ let(:formatted_redemption_code) { 'AAAA-BBBB-CCCC-DDDD' }
170
+ let(:gift_card) { Spree::VirtualGiftCard.create(amount: 20, currency: 'USD') }
171
+
172
+ subject { gift_card.formatted_redemption_code }
173
+
174
+ it 'inserts dashes into the code after every 4 characters' do
175
+ expect(gift_card).to receive(:redemption_code).and_return(redemption_code)
176
+ expect(subject).to eq formatted_redemption_code
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,74 @@
1
+ # Run Coverage report
2
+ require 'simplecov'
3
+ SimpleCov.start do
4
+ add_filter 'spec'
5
+ add_group 'Controllers', 'app/controllers'
6
+ add_group 'Helpers', 'app/helpers'
7
+ add_group 'Mailers', 'app/mailers'
8
+ add_group 'Models', 'app/models'
9
+ add_group 'Views', 'app/views'
10
+ add_group 'Libraries', 'lib'
11
+ end
12
+
13
+ # Configure Rails Environment
14
+ ENV['RAILS_ENV'] = 'test'
15
+
16
+ require File.expand_path('../dummy/config/environment.rb', __FILE__)
17
+
18
+ require 'rspec/rails'
19
+
20
+ require 'database_cleaner'
21
+ require 'ffaker'
22
+
23
+ require 'spree/testing_support/factories'
24
+ require 'spree/testing_support/controller_requests'
25
+ require 'spree/testing_support/authorization_helpers'
26
+ require 'spree/testing_support/url_helpers'
27
+
28
+ require 'cancan/matchers'
29
+
30
+ require "spree_virtual_gift_card/factories"
31
+
32
+ Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |f| require f }
33
+
34
+ RSpec.configure do |config|
35
+ config.infer_spec_type_from_file_location!
36
+ config.mock_with :rspec
37
+
38
+ config.color = true
39
+ config.order = "random"
40
+
41
+ config.expose_current_running_example_as :example
42
+ config.fail_fast = ENV["FAIL_FAST"] || false
43
+
44
+ config.filter_run focus: true
45
+ config.run_all_when_everything_filtered = true
46
+ config.use_transactional_fixtures = false
47
+
48
+ config.example_status_persistence_file_path = "./spec/examples.txt"
49
+
50
+ config.include FactoryGirl::Syntax::Methods
51
+ config.include Spree::TestingSupport::ControllerRequests, type: :controller
52
+ config.include Spree::TestingSupport::UrlHelpers, type: :controller
53
+
54
+ # Ensure Suite is set to use transactions for speed.
55
+ config.before :suite do
56
+ DatabaseCleaner.strategy = :transaction
57
+ DatabaseCleaner.clean_with :truncation
58
+ end
59
+
60
+ # Before each spec check if it is a Javascript test and switch between using
61
+ # database transactions or not where necessary.
62
+ config.before :each do |example|
63
+ DatabaseCleaner.strategy = :truncation
64
+ DatabaseCleaner.start
65
+
66
+ Spree::Api::Config[:requires_authentication] = true
67
+ Spree::Config.reset
68
+ end
69
+
70
+ # After each spec clean the database.
71
+ config.after :each do
72
+ DatabaseCleaner.clean
73
+ end
74
+ end
metadata ADDED
@@ -0,0 +1,258 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: solidus_virtual_gift_card
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Bonobos
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-08-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: solidus
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 1.0.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: 1.2.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 1.0.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 1.2.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: rspec-rails
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '3.2'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '3.2'
47
+ - !ruby/object:Gem::Dependency
48
+ name: simplecov
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: sqlite3
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: sass-rails
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: coffee-rails
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: factory_girl
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: capybara
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: database_cleaner
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ - !ruby/object:Gem::Dependency
146
+ name: ffaker
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ description:
160
+ email: engineering@bonobos.com
161
+ executables: []
162
+ extensions: []
163
+ extra_rdoc_files: []
164
+ files:
165
+ - ".gitignore"
166
+ - ".rspec"
167
+ - Gemfile
168
+ - LICENSE
169
+ - README.md
170
+ - Rakefile
171
+ - app/assets/javascripts/spree/backend/solidus_virtual_gift_card.coffee
172
+ - app/assets/stylesheets/spree/backend/solidus_virtual_gift_card.css
173
+ - app/controllers/spree/admin/gift_cards_controller.rb
174
+ - app/controllers/spree/api/gift_cards_controller.rb
175
+ - app/mailers/spree/gift_card_mailer.rb
176
+ - app/models/concerns/spree/gift_cards/line_item_concerns.rb
177
+ - app/models/concerns/spree/gift_cards/order_concerns.rb
178
+ - app/models/concerns/spree/redemption_code_generator.rb
179
+ - app/models/spree/line_item_decorator.rb
180
+ - app/models/spree/order_decorator.rb
181
+ - app/models/spree/permission_sets/virtual_gift_card_display.rb
182
+ - app/models/spree/permission_sets/virtual_gift_card_management.rb
183
+ - app/models/spree/store_credit_category_decorator.rb
184
+ - app/models/spree/virtual_gift_card.rb
185
+ - app/overrides/admin_item_view_gift_card_codes.rb
186
+ - app/overrides/admin_user_sidebar_store_credits.rb
187
+ - app/overrides/admin_user_sub_menu.rb
188
+ - app/views/spree/admin/gift_cards/_lookup_form.html.erb
189
+ - app/views/spree/admin/gift_cards/_redemption_form.html.erb
190
+ - app/views/spree/admin/gift_cards/index.html.erb
191
+ - app/views/spree/admin/gift_cards/lookup.html.erb
192
+ - app/views/spree/admin/gift_cards/show.html.erb
193
+ - app/views/spree/admin/orders/_gift_card_redemption_codes.html.erb
194
+ - app/views/spree/admin/users/_gift_card_sidebar.html.erb
195
+ - app/views/spree/admin/users/_sub_menu.html.erb
196
+ - app/views/spree/gift_card_mailer/gift_card_email.text.erb
197
+ - bin/rails
198
+ - circle.yml
199
+ - config/initializers/gift_card_store_credit_event_originator.rb
200
+ - config/locales/en.yml
201
+ - config/routes.rb
202
+ - db/migrate/20140623152903_create_virtual_gift_card.rb
203
+ - db/migrate/20140624175113_seed_gift_card_category.rb
204
+ - db/migrate/20140627185148_add_timestamps_to_gift_cards.rb
205
+ - db/migrate/20140702153907_add_gift_card_flag_to_products.rb
206
+ - db/migrate/20140707200431_add_line_item_to_gift_card.rb
207
+ - db/seeds.rb
208
+ - lib/generators/solidus_virtual_gift_card/install/install_generator.rb
209
+ - lib/solidus_virtual_gift_card.rb
210
+ - lib/spree_virtual_gift_card/engine.rb
211
+ - lib/spree_virtual_gift_card/factories.rb
212
+ - solidus_virtual_gift_card.gemspec
213
+ - spec/controllers/spree/admin/gift_cards_controller_spec.rb
214
+ - spec/controllers/spree/api/gift_cards_controller_spec.rb
215
+ - spec/models/concerns/spree/redemption_code_generator_spec.rb
216
+ - spec/models/spree/line_item_spec.rb
217
+ - spec/models/spree/order_spec.rb
218
+ - spec/models/spree/permission_sets/virtual_gift_card_display_spec.rb
219
+ - spec/models/spree/permission_sets/virtual_gift_card_management_spec.rb
220
+ - spec/models/spree/store_credit_category_spec.rb
221
+ - spec/models/spree/virtual_gift_card_spec.rb
222
+ - spec/spec_helper.rb
223
+ homepage: http://www.bonobos.com
224
+ licenses:
225
+ - BSD-3
226
+ metadata: {}
227
+ post_install_message:
228
+ rdoc_options: []
229
+ require_paths:
230
+ - lib
231
+ required_ruby_version: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - ">="
234
+ - !ruby/object:Gem::Version
235
+ version: '2.1'
236
+ required_rubygems_version: !ruby/object:Gem::Requirement
237
+ requirements:
238
+ - - ">="
239
+ - !ruby/object:Gem::Version
240
+ version: '0'
241
+ requirements:
242
+ - none
243
+ rubyforge_project:
244
+ rubygems_version: 2.2.5
245
+ signing_key:
246
+ specification_version: 4
247
+ summary: Virtual gift card for purchase, drops into the user's account as store credit
248
+ test_files:
249
+ - spec/controllers/spree/admin/gift_cards_controller_spec.rb
250
+ - spec/controllers/spree/api/gift_cards_controller_spec.rb
251
+ - spec/models/concerns/spree/redemption_code_generator_spec.rb
252
+ - spec/models/spree/line_item_spec.rb
253
+ - spec/models/spree/order_spec.rb
254
+ - spec/models/spree/permission_sets/virtual_gift_card_display_spec.rb
255
+ - spec/models/spree/permission_sets/virtual_gift_card_management_spec.rb
256
+ - spec/models/spree/store_credit_category_spec.rb
257
+ - spec/models/spree/virtual_gift_card_spec.rb
258
+ - spec/spec_helper.rb