README neu gegliedert, Beispiel für einen produktiven Lauf, Fehlersuche und Umstiegshinweise

This commit is contained in:
wkh
2026-10-09 21:55:16 +02:00
parent baf09d3947
commit 0b72635e08
6 changed files with 1070 additions and 536 deletions
+33 -4
View File
@@ -4,15 +4,15 @@ require 'open3'
require 'fileutils'
#
# the examples of README.md section 1: the code in the documentation is the file,
# the examples of README.md section 2: the code in the documentation is the file,
# and every example runs and produces the documented result
#
class DocExamplesTest < PipelineTest
DOC = File.read(File.join(ROOT, 'README.md'))
EXAMPLES = DOC.scan(/<!-- beispiel: (\S+) -->\n```ruby\n(.*?)\n```/m)
def run_example dir, name, *args
env = { 'BUNDLE_GEMFILE' => File.join(ROOT, 'Gemfile') }
def run_example dir, name, *args, env: {}
env = { 'BUNDLE_GEMFILE' => File.join(ROOT, 'Gemfile') }.merge(env)
Open3.capture3(env, RbConfig.ruby, File.join(ROOT, 'bin/etl'), 'run', File.join(ROOT, name), "--out=#{dir}", *args,
chdir: dir)
end
@@ -20,7 +20,7 @@ class DocExamplesTest < PipelineTest
def test_documented_code_equals_files
assert_equal %w[examples/kunden_import.rb examples/rechnungen_satzarten.rb examples/bewegungen_inkrementell.rb
examples/eigenes_plugin.rb examples/rest_lesen.rb examples/rest_schreiben.rb
examples/rest_zu_rest.rb], EXAMPLES.map(&:first)
examples/rest_zu_rest.rb examples/buchungen_export.rb], EXAMPLES.map(&:first)
EXAMPLES.each do |file, code|
assert_equal File.read(File.join(ROOT, file)).rstrip, code.rstrip, "#{file} differs from README.md"
end
@@ -152,4 +152,33 @@ class DocExamplesTest < PipelineTest
end
end
end
def test_buchungen_export
with_tmpdir do |dir|
env = { 'BUCHHALTUNG_DB' => "#{dir}/buchhaltung.sqlite3", 'SLACK_TOKEN' => nil }
out, err, status = run_example(dir, 'examples/buchungen_export.rb', '--dry-run', env:)
assert_equal 0, status.exitstatus, err
refute File.exist?("#{dir}/buchhaltung.sqlite3")
2.times do
out, err, status = run_example(dir, 'examples/buchungen_export.rb', env:)
assert_equal 0, status.exitstatus, err
end
assert_includes out, 'buchungen_export: read=7 written=7 rejected=0 betrag=0/0'
db = DataPipeline::SqliteStorage.new(database: "#{dir}/buchhaltung.sqlite3", query: 'select * from buchungen order by belnr, buzei')
rows = db.read
db.close
assert_equal 7, rows.size # upsert: the second run updates instead of inserting
assert_equal({ 'belnr' => '5100000002', 'buzei' => 3, 'datum' => '2026-10-02', 'konto' => '2000', 'shkzg' => 'H',
'dmbtr' => '409.80', 'betrag' => -409.8, 'buchungstext' => 'Papeterie Zürcher AG' }, rows[4])
assert_equal 'ohne Text', rows[5]['buchungstext']
csv = File.read("#{dir}/buchungen_sap.csv", encoding: 'Windows-1252').encode('UTF-8')
assert_includes csv, "5100000001;1;2026-10-01;1020;S;1250.00;Zahlung Müller GmbH\n"
history = DataPipeline.history("#{dir}/runs.ndjson", name: 'buchungen_export')
assert_equal [true, true, true], history.map { |run| run['ok'] }
assert_equal [true, false, false], history.map { |run| run['dry_run'] }
end
end
end