solidus_importer 0.1.0 → 0.2.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 (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