initial commit

This commit is contained in:
viehlieb 2023-01-19 17:33:00 +01:00
commit afc14ba244
37 changed files with 3539 additions and 0 deletions

View file

@ -0,0 +1,25 @@
# frozen_string_literal: true
require 'spec_helper'
require_relative '../../../lib/foodsoft_article_import'
describe FoodsoftArticleImport do
files_path = File.expand_path '../../files', __dir__
bioromeo_files_path = File.join(files_path, 'bioromeo')
dummy_article = { order_number: '1', name: 'Wilde aardappels', article_category: 'Aardappels "nieuwe oogst"',
deposit: 0, manufacturer: nil, origin: 'Noordoostpolder, NL', price: 5.0, tax: 6, unit: '5kg', unit_quantity: 1, note: 'Skal 1234; 123456; Demeter 123456; (Kopervrij)' }
empty = {}
context 'bioromeo' do
it 'parses file correctly with type parameter bioromeo' do
FoodsoftArticleImport.parse(File.open(File.join(bioromeo_files_path, 'bioromeo_flawless.csv')),
type: 'bioromeo') do |new_attrs, _status, _line|
next if new_attrs.nil?
expect(new_attrs).to eq dummy_article
end
end
end
end

View file

@ -0,0 +1,86 @@
# frozen_string_literal: true
require 'spec_helper'
require_relative '../../../lib/foodsoft_article_import'
describe FoodsoftArticleImport do
files_path = File.expand_path '../../files', __dir__
bnn_files_path = File.join(files_path, 'bnn')
dummy_article = { name: 'Greek Dressing - Kräuter Mix', order_number: '64721', note: 'Oregano, Basilikum und Minze',
manufacturer: 'Medousa, Griechenland Importe', origin: 'GR', article_category: 'Kräutermischungen', unit: '35g', price: '2,89', tax: 7.0, unit_quantity: '6' }
article = dummy_article.merge({ deposit: 0.08 })
article_special = article.merge(note: 'Sonderpreis: 2,89 von 20230101 bis 20230201')
article_2 = dummy_article.merge({ manufacturer: nil, article_category: nil })
article_custom_code = article.merge(article_category: 'Schuhe')
empty = {}
context 'bnn' do
it 'parses bnn file correctly without type parameter' do
FoodsoftArticleImport.parse(File.open(File.join(bnn_files_path,
'bnn_flawless.BNN'))) do |new_attrs, status, _line|
expect(new_attrs).to eq article
expect(status).to eq :outlisted
end
end
it 'parses file correctly with type parameter' do
FoodsoftArticleImport.parse(File.open(File.join(bnn_files_path, 'bnn_flawless.BNN')),
type: 'bnn') do |new_attrs, status, _line|
expect(new_attrs).to eq article
expect(status).to eq :outlisted
end
end
it 'raises error wenn wrong type (except dnb_xml) specified' do
expect do
FoodsoftArticleImport.parse(File.open(File.join(bnn_files_path, 'bnn_flawless.BNN')),
type: 'foodsoft')
end.to raise_error(RuntimeError)
expect do
FoodsoftArticleImport.parse(File.open(File.join(bnn_files_path, 'bnn_flawless.BNN')),
type: 'bioromeo')
end.to raise_error(RuntimeError)
expect(FoodsoftArticleImport.parse(File.open(File.join(bnn_files_path, 'bnn_flawless.BNN')),
type: 'dnb_xml')).to eq []
end
it 'parses article with special correctly' do
FoodsoftArticleImport.parse(File.open(File.join(bnn_files_path, 'bnn_flawless_special.BNN')),
type: 'bnn') do |new_attrs, status, _line|
expect(new_attrs).to eq article_special
expect(status).to eq :special
end
end
it 'parses missing entries correctly' do
FoodsoftArticleImport.parse(File.open(File.join(bnn_files_path, 'bnn_missing_entries.BNN')),
type: 'bnn') do |new_attrs, status, _line|
expect(new_attrs).to eq article_2
expect(status).to eq nil
end
end
it 'skips rows without order_number' do
FoodsoftArticleImport.parse(File.open(File.join(bnn_files_path, 'bnn_missing_order_number.BNN')),
type: 'bnn') do |new_attrs, _status, _line|
expect(new_attrs).to eq empty
end
end
it 'joins custom_codes file' do
custom_file_path = File.join(files_path, 'custom_codes.yml').to_s
FoodsoftArticleImport.parse(File.open(File.join(bnn_files_path, 'bnn_flawless_category.BNN')),
custom_file_path: custom_file_path, type: 'bnn') do |new_attrs, _status, _line|
expect(new_attrs).to eq article_custom_code
end
end
it 'parses file with different encoding' do
# the bnn file is loaded with encoding ibm850. If file is not ibm850 encoded, some characters might look weird
FoodsoftArticleImport.parse(File.open(File.join(bnn_files_path, 'bnn_bad_encoding.BNN')),
type: 'bnn') do |new_attrs, _status, _line|
expect(new_attrs[:order_number]).to eq('64721')
expect(new_attrs[:name]).to eq('Greek Dressing - Kräuter Mix')
end
end
end
end

View file

@ -0,0 +1,68 @@
# frozen_string_literal: true
require 'spec_helper'
require_relative '../../../lib/foodsoft_article_import'
describe FoodsoftArticleImport do
files_path = File.expand_path '../../files', __dir__
foodsoft_files_path = File.join(files_path, 'foodsoft')
dummy_article = { order_number: '1', name: 'product', note: 'bio', manufacturer: 'someone', origin: 'eu',
unit: '1 kg', price: '1.23', tax: '6', unit_quantity: '10', article_category: 'coolstuff', deposit: '0' }
dummy_article_2 = { order_number: '12', name: 'other product', note: 'bio', manufacturer: 'someone',
origin: 'eu', unit: '2 kg', price: '3.45', tax: '6', unit_quantity: '10', article_category: 'coolstuff', deposit: '0' }
articles = [dummy_article, dummy_article_2]
dummy_article_3 = dummy_article.merge({ order_number: ':d8df298' })
dummy_article_4 = dummy_article_2.merge({ order_number: ':1f37e39' })
articles_number_generated = [dummy_article_3, dummy_article_4]
empty = {}
context 'foodsoft' do
it 'parses file correctly with type parameter foodsoft' do
count = 0
FoodsoftArticleImport.parse(File.open(File.join(foodsoft_files_path, 'foodsoft_flawless.csv')),
type: 'foodsoft') do |new_attrs, status, _line|
expect(new_attrs).to eq articles[count]
expect(status).to eq nil
count += 1
end
end
it 'raises error wenn wrong type specified' do
expect do
FoodsoftArticleImport.parse(File.open(File.join(foodsoft_files_path, 'foodsoft_flawless.csv')),
type: 'bioromeo')
end.to raise_error(Roo::HeaderRowNotFoundError)
expect(FoodsoftArticleImport.parse(File.open(File.join(foodsoft_files_path, 'foodsoft_flawless.csv')),
type: 'odin')).to eq []
expect(FoodsoftArticleImport.parse(File.open(File.join(foodsoft_files_path, 'foodsoft_flawless.csv')),
type: 'bnn')).to eq []
end
it 'parses missing entries correctly' do
FoodsoftArticleImport.parse(File.open(File.join(foodsoft_files_path, 'foodsoft_missing_entries.csv')),
type: 'foodsoft') do |new_attrs, status, _line|
expect(status).to eq 'Error: unit, price and tax must be entered'
expect(new_attrs[:unit]).to eq '1 kg'
expect(new_attrs[:manufacturer]).to eq nil
end
end
it 'generates order numbers for articles without order number' do
count = 0
FoodsoftArticleImport.parse(File.open(File.join(foodsoft_files_path, 'foodsoft_generate_order_number.csv')),
type: 'foodsoft') do |new_attrs, _status, _line|
expect(new_attrs).to eq articles_number_generated[count]
count += 1
end
end
xit 'joins custom_codes file' do
custom_file_path = File.join(files_path, 'custom_codes.yml').to_s
FoodsoftArticleImport.parse(File.open(File.join(foodsoft_files_path, 'foodsoft_flawless_custom_category.csv')),
custom_file_path: custom_file_path, type: 'foodsoft') do |new_attrs, _status, _line|
expect(new_attrs[:article_category]).to eq 'Test Indeling - Test Subindeling'
end
end
end
end

View file

@ -0,0 +1,84 @@
# frozen_string_literal: true
require 'spec_helper'
require_relative '../../../lib/foodsoft_article_import'
describe FoodsoftArticleImport do
files_path = File.expand_path '../../files', __dir__
odin_files_path = File.join(files_path, 'odin')
dummy_article = { order_number: '0109', name: 'nucli rose', note: 'Biologisch', manufacturer: 'NELEMAN',
origin: 'ES', unit: '750gr', price: '4.52', unit_quantity: '6', tax: '21', deposit: '0', article_category: '' }
empty = {}
context 'odin/dnb_xml' do
it 'parses file correctly with type parameter dnb_xml' do
FoodsoftArticleImport.parse(File.open(File.join(odin_files_path, 'odin_flawless.xml')),
type: 'dnb_xml') do |new_attrs, status, _line|
expect(new_attrs).to eq dummy_article
expect(status).to eq nil
end
end
it 'parses file correctly with type parameter odin' do
FoodsoftArticleImport.parse(File.open(File.join(odin_files_path, 'odin_flawless.xml')),
type: 'odin') do |new_attrs, status, _line|
expect(new_attrs).to eq dummy_article
expect(status).to eq nil
end
end
it 'raises error wenn wrong type specified' do
expect do
FoodsoftArticleImport.parse(File.open(File.join(odin_files_path, 'odin_flawless.xml')),
type: 'foodsoft')
end.to raise_error(RuntimeError)
expect do
FoodsoftArticleImport.parse(File.open(File.join(odin_files_path, 'odin_flawless.xml')),
type: 'bioromeo')
end.to raise_error(RuntimeError)
expect do
FoodsoftArticleImport.parse(File.open(File.join(odin_files_path, 'odin_flawless.xml')),
type: 'bnn')
end.to raise_error(CSV::MalformedCSVError)
end
it 'parses missing entries correctly' do
FoodsoftArticleImport.parse(File.open(File.join(odin_files_path, 'odin_missing_entries.xml')),
type: 'odin') do |new_attrs, status, _line|
expect(status).to eq :outlisted
expect(new_attrs[:unit]).to eq '750st'
expect(new_attrs[:manufacturer]).to eq ''
end
end
it 'skips rows without order_number' do
FoodsoftArticleImport.parse(File.open(File.join(odin_files_path, 'odin_missing_order_number.xml')),
type: 'odin') do |new_attrs, _status, _line|
expect(new_attrs).to eq empty
end
end
it 'joins custom_codes file' do
custom_file_path = File.join(files_path, 'custom_codes.yml').to_s
FoodsoftArticleImport.parse(File.open(File.join(odin_files_path, 'odin_flawless_custom_category.xml')),
custom_file_path: custom_file_path, type: 'odin') do |new_attrs, _status, _line|
expect(new_attrs[:article_category]).to eq 'Test Indeling - Test Subindeling'
end
end
xit 'parses dummy_article with special correctly' do
# TODO: find out whether there are special prices for odin files
FoodsoftArticleImport.parse(File.open(File.join(odin_files_path, 'bnn_flawless_special.BNN')),
type: 'bnn') do |new_attrs, _status, _line|
expect(new_attrs.manufacturer).to eq nil
expect(new_attrs.unit).to eq '750st'
end
end
xit 'parses file with different encoding' do
# the bnn file is loaded with encoding ibm850. If file is not ibm850 encoded, some characters might look weird
FoodsoftArticleImport.parse(File.open(File.join(odin_files_path, 'bnn_bad_encoding.BNN')),
type: 'bnn') do |new_attrs, _status, _line|
expect(new_attrs[:order_number]).to eq('64721')
expect(new_attrs[:name]).to eq('Greek Dressing - Kräuter Mix')
end
end
end
end