solidus_importer 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.readme/import-products-1.gif +0 -0
  3. data/.readme/import-products-2.gif +0 -0
  4. data/README.md +9 -1
  5. data/Rakefile +4 -0
  6. data/app/models/solidus_importer/order_updater.rb +6 -0
  7. data/app/models/solidus_importer/spree_core_importer_order.rb +50 -0
  8. data/bin/rails-sandbox +1 -1
  9. data/bin/sandbox +2 -0
  10. data/lib/solidus_importer.rb +1 -0
  11. data/lib/solidus_importer/base_importer.rb +9 -2
  12. data/lib/solidus_importer/configuration.rb +7 -2
  13. data/lib/solidus_importer/order_importer.rb +39 -0
  14. data/lib/solidus_importer/process_import.rb +5 -1
  15. data/lib/solidus_importer/process_row.rb +3 -1
  16. data/lib/solidus_importer/processors/bill_address.rb +52 -0
  17. data/lib/solidus_importer/processors/customer.rb +10 -7
  18. data/lib/solidus_importer/processors/customer_address.rb +44 -0
  19. data/lib/solidus_importer/processors/line_item.rb +33 -0
  20. data/lib/solidus_importer/processors/order.rb +41 -12
  21. data/lib/solidus_importer/processors/payment.rb +56 -0
  22. data/lib/solidus_importer/processors/ship_address.rb +52 -0
  23. data/lib/solidus_importer/processors/shipment.rb +86 -0
  24. data/lib/solidus_importer/version.rb +1 -1
  25. data/spec/features/solidus_importer/import_spec.rb +68 -4
  26. data/spec/features/solidus_importer/processors_spec.rb +14 -11
  27. data/spec/fixtures/solidus_importer/customers.csv +5 -3
  28. data/spec/fixtures/solidus_importer/orders.csv +2 -2
  29. data/spec/lib/solidus_importer/base_importer_spec.rb +10 -0
  30. data/spec/lib/solidus_importer/order_importer_spec.rb +63 -0
  31. data/spec/lib/solidus_importer/processors/bill_address_spec.rb +33 -0
  32. data/spec/lib/solidus_importer/processors/customer_address_spec.rb +67 -0
  33. data/spec/lib/solidus_importer/processors/customer_spec.rb +14 -1
  34. data/spec/lib/solidus_importer/processors/line_item_spec.rb +22 -0
  35. data/spec/lib/solidus_importer/processors/order_spec.rb +2 -23
  36. data/spec/lib/solidus_importer/processors/payment_spec.rb +31 -0
  37. data/spec/lib/solidus_importer/processors/ship_address_spec.rb +33 -0
  38. data/spec/lib/solidus_importer/processors/shipment_spec.rb +22 -0
  39. metadata +31 -9
  40. data/lib/solidus_importer/processors/address.rb +0 -47
  41. data/spec/lib/solidus_importer/processors/address_spec.rb +0 -18
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe SolidusImporter::Processors::BillAddress do
6
+ describe '#call' do
7
+ subject(:described_method) { described_class.call(context) }
8
+
9
+ let(:context) do
10
+ { data: data }
11
+ end
12
+ let(:data) do
13
+ {
14
+ 'Billing First Name' => 'John',
15
+ 'Billing Last Name' => 'Doe',
16
+ 'Billing Address1' => 'An address',
17
+ 'Billing Address2' => '',
18
+ 'Billing City' => 'A Beautyful city',
19
+ 'Billing Company' => 'A Company',
20
+ 'Billing Zip' => '00000',
21
+ 'Billing Phone' => '555-123123123',
22
+ 'Billing Country Code' => 'US',
23
+ 'Billing Province Code' => 'NM'
24
+ }
25
+ end
26
+
27
+ it 'put bill_address_attributes into order data' do
28
+ described_method
29
+ expect(context).to have_key(:order)
30
+ expect(context[:order][:bill_address_attributes]).not_to be_empty
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe SolidusImporter::Processors::CustomerAddress do
6
+ describe '#call' do
7
+ subject(:described_method) { described_class.call(context) }
8
+
9
+ let(:context) { { data: data, user: user } }
10
+ let(:user) { create(:user) }
11
+ let!(:state) { create(:state, state_code: 'WA', country_iso: 'US') }
12
+ let(:country) { state.country }
13
+ let(:data) do
14
+ {
15
+ 'First Name' => 'John',
16
+ 'Last Name' => 'Doe',
17
+ 'Address1' => 'My Cool Address, n.1',
18
+ 'Address2' => '',
19
+ 'City' => 'My beautiful City',
20
+ 'Zip' => '12345',
21
+ 'Phone' => '(555)-123123123',
22
+ 'Country Code' => 'US',
23
+ 'Province Code' => 'WA'
24
+ }
25
+ end
26
+ let(:address) { Spree::Address.last }
27
+
28
+ context 'when there is a state with the same code attached to another country' do
29
+ let!(:wrong_state) { create(:state, state_code: 'WA', country_iso: 'IT') }
30
+ let!(:state) { create(:state, state_code: 'XX', country_iso: 'US') }
31
+
32
+ it 'tries to fetch it from the current country' do
33
+ expect { described_method }.to change(Spree::Address, :count).by(1)
34
+ expect(Spree::Address.last.state).to be_nil
35
+ end
36
+
37
+ context 'when the country requires a states' do
38
+ before { country.update states_required: true }
39
+
40
+ it 'fails creating the address' do
41
+ expect { described_method }.not_to change(Spree::Address, :count)
42
+ end
43
+ end
44
+ end
45
+
46
+ it 'create an address' do
47
+ expect { described_method }.to change(Spree::Address, :count).by(1)
48
+
49
+ aggregate_failures do
50
+ expect(address.full_name).to eq("John Doe")
51
+ expect(address.address1).to eq('My Cool Address, n.1')
52
+ expect(address.address2).to eq('')
53
+ expect(address.city).to eq('My beautiful City')
54
+ expect(address.zipcode).to eq('12345')
55
+ expect(address.phone).to eq('(555)-123123123')
56
+ expect(address.country).to eq(country)
57
+ expect(address.state).to eq(state)
58
+ end
59
+ end
60
+
61
+ it 'adds the address in the user addressbook and set it as ship/bill address' do
62
+ expect { described_method }.to change(user.addresses, :count).by(1)
63
+ expect(user.bill_address).to eq address
64
+ expect(user.ship_address).to eq address
65
+ end
66
+ end
67
+ end
@@ -30,7 +30,20 @@ RSpec.describe SolidusImporter::Processors::Customer do
30
30
 
31
31
  context 'with a customer row with a file entity' do
32
32
  let(:context) do
33
- { data: build(:solidus_importer_row_customer, :with_import).data }
33
+ { data: build(:solidus_importer_row_customer, :with_import).data.merge(customer_address_data) }
34
+ end
35
+ let(:customer_address_data) do
36
+ {
37
+ 'First Name' => 'John',
38
+ 'Last Name' => 'Doe',
39
+ 'Address1' => 'My Cool Address, n.1',
40
+ 'Address2' => '',
41
+ 'City' => 'My beautiful City',
42
+ 'Zip' => '12345',
43
+ 'Phone' => '(555)-123123123',
44
+ 'Country Code' => 'US',
45
+ 'Province Code' => 'WA'
46
+ }
34
47
  end
35
48
  let(:result) { context.merge(user: Spree::User.last) }
36
49
 
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe SolidusImporter::Processors::LineItem do
6
+ describe '#call' do
7
+ subject(:described_method) { described_class.call(context) }
8
+
9
+ let(:context) do
10
+ { data: data }
11
+ end
12
+ let(:data) do
13
+ { 'Lineitem sku' => 'a-sku' }
14
+ end
15
+
16
+ it 'put line_items_attributes into order data' do
17
+ described_method
18
+ expect(context).to have_key(:order)
19
+ expect(context[:order][:line_items_attributes]).not_to be_empty
20
+ end
21
+ end
22
+ end
@@ -23,33 +23,12 @@ RSpec.describe SolidusImporter::Processors::Order do
23
23
  { data: data }
24
24
  end
25
25
  let(:data) { build(:solidus_importer_row_order, :with_import).data }
26
- let(:result) { context.merge(order: Spree::Order.last) }
27
26
 
28
27
  before { allow(Spree::Store).to receive(:default).and_return(build_stubbed(:store)) }
29
28
 
30
29
  it 'creates a new order' do
31
- expect { described_method }.to change { Spree::Order.count }.by(1)
32
- expect(described_method).to eq(result)
33
- end
34
-
35
- context 'with an existing valid order' do
36
- let!(:order) { create(:order, number: data['Name'], email: data['Email']) }
37
-
38
- it 'updates the order' do
39
- expect { described_method }.not_to(change{ Spree::Order.count })
40
- expect(described_method).to eq(result)
41
- expect(order.reload.email).to eq('an_email@example.com')
42
- end
43
- end
44
-
45
- context 'with an existing invalid order' do
46
- let!(:order) { create(:order, number: data['Name'], email: data['Email']) }
47
-
48
- before { order.update_column(:state, 'an invalid state') }
49
-
50
- it 'raises an exception' do
51
- expect { described_method }.to raise_error(ActiveRecord::RecordInvalid, /State is invalid/)
52
- end
30
+ described_method
31
+ expect(context[:order]).to match(hash_including(number: 'R123456789'))
53
32
  end
54
33
  end
55
34
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe SolidusImporter::Processors::Payment do
6
+ describe '#call' do
7
+ subject(:described_method) { described_class.call(context) }
8
+
9
+ let(:context) do
10
+ { data: data }
11
+ end
12
+ let(:data) do
13
+ {
14
+ 'Financial Status' => 'paid',
15
+ 'Lineitem price' => '10.5',
16
+ 'Lineitem quantity' => '2'
17
+ }
18
+ end
19
+ let(:expected_params) do
20
+ [{ payment_method: payment_method_name, amount: amount }]
21
+ end
22
+ let(:payment_method_name) { 'SolidusImporter PaymentMethod' }
23
+ let(:amount) { 21.0 }
24
+
25
+ it 'put payments_attributes into order data' do
26
+ described_method
27
+ expect(context).to have_key(:order)
28
+ expect(context[:order][:payments_attributes]).to eq expected_params
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe SolidusImporter::Processors::ShipAddress do
6
+ describe '#call' do
7
+ subject(:described_method) { described_class.call(context) }
8
+
9
+ let(:context) do
10
+ { data: data }
11
+ end
12
+ let(:data) do
13
+ {
14
+ 'Shipping First Name' => 'John',
15
+ 'Shipping Last Name' => 'Doe',
16
+ 'Shipping Address1' => 'An address',
17
+ 'Shipping Address2' => '',
18
+ 'Shipping City' => 'A Beautyful city',
19
+ 'Shipping Company' => 'A Company',
20
+ 'Shipping Zip' => '00000',
21
+ 'Shipping Phone' => '555-123123123',
22
+ 'Shipping Country Code' => 'US',
23
+ 'Shipping Province Code' => 'NM'
24
+ }
25
+ end
26
+
27
+ it 'put ship_address_attributes into order data' do
28
+ described_method
29
+ expect(context).to have_key(:order)
30
+ expect(context[:order][:ship_address_attributes]).not_to be_empty
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe SolidusImporter::Processors::Shipment do
6
+ describe '#call' do
7
+ subject(:described_method) { described_class.call(context) }
8
+
9
+ let(:context) do
10
+ { data: data }
11
+ end
12
+ let(:data) do
13
+ { 'Shipping Line Title' => 'ACME Shipping' }
14
+ end
15
+
16
+ it 'put shipments_attributes into order data' do
17
+ described_method
18
+ expect(context).to have_key(:order)
19
+ expect(context[:order][:shipments_attributes]).not_to be_empty
20
+ end
21
+ end
22
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solidus_importer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mattia Roccoberton
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-06-26 00:00:00.000000000 Z
11
+ date: 2021-01-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: solidus_core
@@ -69,6 +69,8 @@ files:
69
69
  - ".github/stale.yml"
70
70
  - ".gitignore"
71
71
  - ".hound.yml"
72
+ - ".readme/import-products-1.gif"
73
+ - ".readme/import-products-2.gif"
72
74
  - ".rspec"
73
75
  - ".rubocop.yml"
74
76
  - Gemfile
@@ -83,7 +85,9 @@ files:
83
85
  - app/controllers/spree/admin/solidus_importer/imports_controller.rb
84
86
  - app/jobs/solidus_importer/import_job.rb
85
87
  - app/models/solidus_importer/import.rb
88
+ - app/models/solidus_importer/order_updater.rb
86
89
  - app/models/solidus_importer/row.rb
90
+ - app/models/solidus_importer/spree_core_importer_order.rb
87
91
  - app/views/spree/admin/solidus_importer/import_rows/show.html.erb
88
92
  - app/views/spree/admin/solidus_importer/imports/_form.html.erb
89
93
  - app/views/spree/admin/solidus_importer/imports/index.html.erb
@@ -110,17 +114,23 @@ files:
110
114
  - lib/solidus_importer/engine.rb
111
115
  - lib/solidus_importer/exception.rb
112
116
  - lib/solidus_importer/factories.rb
117
+ - lib/solidus_importer/order_importer.rb
113
118
  - lib/solidus_importer/process_import.rb
114
119
  - lib/solidus_importer/process_row.rb
115
- - lib/solidus_importer/processors/address.rb
116
120
  - lib/solidus_importer/processors/base.rb
121
+ - lib/solidus_importer/processors/bill_address.rb
117
122
  - lib/solidus_importer/processors/customer.rb
123
+ - lib/solidus_importer/processors/customer_address.rb
124
+ - lib/solidus_importer/processors/line_item.rb
118
125
  - lib/solidus_importer/processors/log.rb
119
126
  - lib/solidus_importer/processors/option_types.rb
120
127
  - lib/solidus_importer/processors/option_values.rb
121
128
  - lib/solidus_importer/processors/order.rb
129
+ - lib/solidus_importer/processors/payment.rb
122
130
  - lib/solidus_importer/processors/product.rb
123
131
  - lib/solidus_importer/processors/product_images.rb
132
+ - lib/solidus_importer/processors/ship_address.rb
133
+ - lib/solidus_importer/processors/shipment.rb
124
134
  - lib/solidus_importer/processors/taxon.rb
125
135
  - lib/solidus_importer/processors/variant.rb
126
136
  - lib/solidus_importer/processors/variant_images.rb
@@ -143,17 +153,23 @@ files:
143
153
  - spec/fixtures/solidus_importer/thinking-cat.jpg
144
154
  - spec/jobs/solidus_importer/import_job_spec.rb
145
155
  - spec/lib/solidus_importer/base_importer_spec.rb
156
+ - spec/lib/solidus_importer/order_importer_spec.rb
146
157
  - spec/lib/solidus_importer/process_import_spec.rb
147
158
  - spec/lib/solidus_importer/process_row_spec.rb
148
- - spec/lib/solidus_importer/processors/address_spec.rb
149
159
  - spec/lib/solidus_importer/processors/base_spec.rb
160
+ - spec/lib/solidus_importer/processors/bill_address_spec.rb
161
+ - spec/lib/solidus_importer/processors/customer_address_spec.rb
150
162
  - spec/lib/solidus_importer/processors/customer_spec.rb
163
+ - spec/lib/solidus_importer/processors/line_item_spec.rb
151
164
  - spec/lib/solidus_importer/processors/log_spec.rb
152
165
  - spec/lib/solidus_importer/processors/option_types_spec.rb
153
166
  - spec/lib/solidus_importer/processors/option_values_spec.rb
154
167
  - spec/lib/solidus_importer/processors/order_spec.rb
168
+ - spec/lib/solidus_importer/processors/payment_spec.rb
155
169
  - spec/lib/solidus_importer/processors/product_images_spec.rb
156
170
  - spec/lib/solidus_importer/processors/product_spec.rb
171
+ - spec/lib/solidus_importer/processors/ship_address_spec.rb
172
+ - spec/lib/solidus_importer/processors/shipment_spec.rb
157
173
  - spec/lib/solidus_importer/processors/taxon_spec.rb
158
174
  - spec/lib/solidus_importer/processors/variant_images_spec.rb
159
175
  - spec/lib/solidus_importer/processors/variant_spec.rb
@@ -169,7 +185,7 @@ metadata:
169
185
  homepage_uri: https://github.com/nebulab/solidus_importer#readme
170
186
  source_code_uri: https://github.com/nebulab/solidus_importer#readme
171
187
  changelog_uri: https://github.com/nebulab/solidus_importer/releases
172
- post_install_message:
188
+ post_install_message:
173
189
  rdoc_options: []
174
190
  require_paths:
175
191
  - lib
@@ -184,8 +200,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
184
200
  - !ruby/object:Gem::Version
185
201
  version: '0'
186
202
  requirements: []
187
- rubygems_version: 3.1.2
188
- signing_key:
203
+ rubygems_version: 3.1.4
204
+ signing_key:
189
205
  specification_version: 4
190
206
  summary: Solidus Importer extension
191
207
  test_files:
@@ -206,17 +222,23 @@ test_files:
206
222
  - spec/fixtures/solidus_importer/thinking-cat.jpg
207
223
  - spec/jobs/solidus_importer/import_job_spec.rb
208
224
  - spec/lib/solidus_importer/base_importer_spec.rb
225
+ - spec/lib/solidus_importer/order_importer_spec.rb
209
226
  - spec/lib/solidus_importer/process_import_spec.rb
210
227
  - spec/lib/solidus_importer/process_row_spec.rb
211
- - spec/lib/solidus_importer/processors/address_spec.rb
212
228
  - spec/lib/solidus_importer/processors/base_spec.rb
229
+ - spec/lib/solidus_importer/processors/bill_address_spec.rb
230
+ - spec/lib/solidus_importer/processors/customer_address_spec.rb
213
231
  - spec/lib/solidus_importer/processors/customer_spec.rb
232
+ - spec/lib/solidus_importer/processors/line_item_spec.rb
214
233
  - spec/lib/solidus_importer/processors/log_spec.rb
215
234
  - spec/lib/solidus_importer/processors/option_types_spec.rb
216
235
  - spec/lib/solidus_importer/processors/option_values_spec.rb
217
236
  - spec/lib/solidus_importer/processors/order_spec.rb
237
+ - spec/lib/solidus_importer/processors/payment_spec.rb
218
238
  - spec/lib/solidus_importer/processors/product_images_spec.rb
219
239
  - spec/lib/solidus_importer/processors/product_spec.rb
240
+ - spec/lib/solidus_importer/processors/ship_address_spec.rb
241
+ - spec/lib/solidus_importer/processors/shipment_spec.rb
220
242
  - spec/lib/solidus_importer/processors/taxon_spec.rb
221
243
  - spec/lib/solidus_importer/processors/variant_images_spec.rb
222
244
  - spec/lib/solidus_importer/processors/variant_spec.rb
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SolidusImporter
4
- module Processors
5
- class Address < Base
6
- def call(context)
7
- @data = context.fetch(:data)
8
-
9
- return unless address?
10
-
11
- context.merge!(address: process_address)
12
- end
13
-
14
- private
15
-
16
- def process_address
17
- prepare_address.tap(&:save)
18
- end
19
-
20
- def prepare_address
21
- Spree::Address.new(
22
- firstname: @data['First Name'],
23
- lastname: @data['Last Name'],
24
- address1: @data['Address1'],
25
- address2: @data['Address2'],
26
- city: @data['City'],
27
- zipcode: @data['Zip'],
28
- phone: @data['Phone'],
29
- country: extract_country(@data['Country Code']),
30
- state: extract_state(@data['Province Code'])
31
- )
32
- end
33
-
34
- def extract_country(iso)
35
- Spree::Country.find_by(iso: iso)
36
- end
37
-
38
- def extract_state(iso)
39
- Spree::State.find_by(abbr: iso) || Spree::State.find_by(name: iso)
40
- end
41
-
42
- def address?
43
- @data['Address1'].present?
44
- end
45
- end
46
- end
47
- end