Fehler behoben: Umlaute, Latin-1, Fehlermeldungen, atomares Schreiben

Spaltennamen mit Umlauten in Ausdrücken, Latin-1-Dateien als UTF-8,
Fehler als eine Zeile (RDB_DEBUG=1 für Backtrace), Werte mit Tab oder
Zeilenumbruch abgelehnt, Tabellen und Indexe über Temp-Datei und rename,
update.rdb gibt den Satz bei Editorfehler zurück, sorttable -r stabil.
This commit is contained in:
wkh
2026-10-30 09:48:42 +01:00
parent 9f6c450492
commit 75c2424307
11 changed files with 164 additions and 42 deletions
+48
View File
@@ -876,3 +876,51 @@ class TaxTablesTest < RdbCase
end
end
end
class RobustnessTest < RdbCase
def test_umlauts_in_column_names
write('uml', "Größe\tÜber\n-----\t----\n5\t7\n1\t2\n")
assert_equal ['5', '7'], data(rdb('row', 'Über > 3', file: 'uml')).first
assert_equal 1, data(rdb('row', 'Größe > 3', file: 'uml')).size
end
def test_latin1_data_is_read_and_written_as_utf8
File.binwrite(File.join(@dir, 'lat'), "Name\n----\n\xE4pfel\n")
assert_equal "Äpfel".downcase, data(rdb('row', 'Name ~ /pfel/', file: 'lat')).first.first
end
def test_errors_are_one_line_not_a_backtrace
_o, e, st = run3('update.rdb', 'inventory', stdin: "/[\n")
refute st.success?
assert_match(/update\.rdb: .*char-class/, e)
refute_match(/\.rb:\d+:in/, e)
end
def test_enter_refuses_a_value_with_a_tab
_o, e, st = run3('enter', '-1', 'inventory', stdin: "9\t9\n1\n2\n3\nthing\n")
refute st.success?
assert_match(/contains a tab/, e)
end
def test_sorttable_reverse_keeps_ties_in_order
out = rdb('sorttable', '-r', 'B', stdin: "A\tB\n-\t-\n1\tb\n2\ta\n3\tb\n4\ta\n")
assert_equal %w[1 3 2 4], data(out).map(&:first)
end
def test_update_keeps_the_record_when_the_editor_fails
before = File.read(File.join(@dir, 'inventory'))
_o, e, = run3('update.rdb', 'inventory', stdin: "1\ne\nq\n", env: { 'EDITOR' => 'false' })
assert_match(/editor false failed/, e)
assert_equal before, File.read(File.join(@dir, 'inventory'))
end
def test_write_file_is_complete_and_keeps_the_mode
path = File.join(@dir, 'wf')
File.write(path, 'old')
File.chmod(0o640, path)
Rdb.write_file(path, 'new')
assert_equal 'new', File.read(path)
assert_equal 0o640, File.stat(path).mode & 0o777
assert_empty Dir[File.join(@dir, 'wf.tmp*')]
end
end