48 lines
2.1 KiB
Ruby
48 lines
2.1 KiB
Ruby
require_relative '../test_helper'
|
|
|
|
# rename, select, cast, default
|
|
class StepsTest < PipelineTest
|
|
ROWS = [{ 'kunnr' => '1', 'betrag' => '12.50', 'datum' => '2026-10-09', 'land' => nil },
|
|
{ 'kunnr' => '2', 'betrag' => '', 'datum' => ' ', 'land' => 'DE' }].freeze
|
|
|
|
def test_rename_keeps_the_position
|
|
assert_equal [%w[kundennr betrag datum land]] * 2, output(ROWS) { rename 'kunnr' => 'kundennr' }.map(&:keys)
|
|
assert_equal [{ 'b' => 1 }], output([{ a: 1 }]) { rename a: 'b' }
|
|
end
|
|
|
|
def test_select_order_and_missing_keys
|
|
assert_equal [{ 'betrag' => '12.50', 'kunnr' => '1', 'x' => nil }], output(ROWS.first(1)) { select %w[betrag kunnr x] }
|
|
assert_equal [{ 'kunnr' => '1' }], output([{ kunnr: '1', b: 2 }]) { select 'kunnr' }
|
|
end
|
|
|
|
def test_cast_types_and_empty_values
|
|
rows = output(ROWS) { cast 'betrag' => :decimal, 'datum' => :date, 'kunnr' => :integer }
|
|
assert_equal [1, 12.5, Date.new(2026, 10, 9)], rows[0].values_at('kunnr', 'betrag', 'datum')
|
|
assert_equal [2, nil, nil], rows[1].values_at('kunnr', 'betrag', 'datum')
|
|
assert_equal [{ 'a' => '5' }], output([{ 'a' => 5 }]) { cast 'a' => :string }
|
|
assert_includes assert_raises(ArgumentError) { output(ROWS) { cast 'a' => :money } }.message, 'money unknown'
|
|
end
|
|
|
|
def test_cast_error_goes_to_on_error
|
|
target, stats = run_pipeline([{ 'n' => 'x' }, { 'n' => '3' }]) { on_error :skip; cast 'n' => :integer }
|
|
assert_equal [{ 'n' => 3 }], target.output
|
|
assert_equal [{ step: 'cast#1', error: 'n: "x" is not integer', row: { 'n' => 'x' } }], stats.errors
|
|
end
|
|
|
|
def test_default_value_and_lambda
|
|
rows = output(ROWS) { default 'land' => 'CH', 'datum' => ->(row) { "neu #{row['kunnr']}" }, 'neu' => 0 }
|
|
assert_equal [['CH', '2026-10-09', 0], ['DE', 'neu 2', 0]], rows.map { |r| r.values_at('land', 'datum', 'neu') }
|
|
end
|
|
|
|
def test_steps_chain_with_map_and_validate
|
|
rows = output(ROWS) do
|
|
rename 'kunnr' => 'id'
|
|
default 'betrag' => '0'
|
|
cast 'betrag' => :decimal
|
|
validate 'id' => { required: true }
|
|
select %w[id betrag]
|
|
end
|
|
assert_equal [{ 'id' => '1', 'betrag' => 12.5 }, { 'id' => '2', 'betrag' => 0.0 }], rows
|
|
end
|
|
end
|