Anker aus der laufenden Definition, und ein Test, der sich selbst durchwinkt
Zwei Fehler aus dem ersten Lauf des Rauchtests, beide von mir. Der Anker fuer transfer_employee stammte aus 20260727120200 und fand nichts: die Funktion ist seither dynamisch gepatcht worden, die Belegungsabfrage ist zweizeilig und beruecksichtigt den Stichtag. Dieselbe Falle wie immer, nur diesmal nicht im Rumpf einer Funktion, sondern im Anker auf sie -- fuer hire_employee und rehire_employee stimmten die Anker, weil sie aus der zuletzt erzeugten Fassung kamen. Die Migration war nie angewendet (sie bricht als Ganzes ab), deshalb die Datei korrigiert statt eine neue geschrieben. Und der Rauchtest hat sich an einer Stelle selbst durchgewunken: das `raise` fuer den Fehlschlag stand innerhalb des Blocks mit exception-Zweig, wurde also vom eigenen Handler gefangen -- und weil seine Meldung das Wort "vorgemerkte" enthielt, bestand die Pruefung auf die erwartete Fehlermeldung. Der Schritt galt als bestanden, obwohl die Migration gar nicht angewendet war. Jetzt merkt sich der Block nur, ob es ging, und ausgewertet wird danach.
This commit is contained in:
@@ -115,10 +115,20 @@ end
|
|||||||
$migration$;
|
$migration$;
|
||||||
|
|
||||||
-- ═══ transfer_employee ════════════════════════════════════════════
|
-- ═══ transfer_employee ════════════════════════════════════════════
|
||||||
|
--
|
||||||
|
-- Der Anker steht auf der zweiten Zeile der Belegungsabfrage. Die erste
|
||||||
|
-- Fassung dieser Migration zielte auf
|
||||||
|
--
|
||||||
|
-- where pa.position_id = v_target_position and pa.valid_to is null;
|
||||||
|
--
|
||||||
|
-- also auf den Wortlaut aus 20260727120200 — und fand nichts. Die Funktion ist
|
||||||
|
-- seither dynamisch gepatcht worden: die Abfrage ist zweizeilig und
|
||||||
|
-- berücksichtigt den Stichtag. Dieselbe Falle wie immer, nur diesmal nicht im
|
||||||
|
-- Rumpf einer Funktion, sondern im Anker auf sie.
|
||||||
do $migration$
|
do $migration$
|
||||||
declare
|
declare
|
||||||
v_alt constant text := $anker$where pa.position_id = v_target_position and pa.valid_to is null;$anker$;
|
v_alt constant text := $anker$and (pa.valid_to is null or pa.valid_to > v_effective);$anker$;
|
||||||
v_neu constant text := $anker$where pa.position_id = v_target_position and pa.valid_to is null;
|
v_neu constant text := $anker$and (pa.valid_to is null or pa.valid_to > v_effective);
|
||||||
|
|
||||||
declare
|
declare
|
||||||
v_vorgemerkt date := planstelle_vorgemerkt(v_target_position, v_effective, v_employee_id);
|
v_vorgemerkt date := planstelle_vorgemerkt(v_target_position, v_effective, v_employee_id);
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ declare
|
|||||||
v_stelle uuid;
|
v_stelle uuid;
|
||||||
v_offen int;
|
v_offen int;
|
||||||
v_meldung text;
|
v_meldung text;
|
||||||
|
v_ging boolean;
|
||||||
begin
|
begin
|
||||||
select id into v_wurzel from org_units where parent_id is null;
|
select id into v_wurzel from org_units where parent_id is null;
|
||||||
select id into v_ort from locations order by name limit 1;
|
select id into v_ort from locations order by name limit 1;
|
||||||
@@ -120,19 +121,28 @@ begin
|
|||||||
perform transfer_employee(jsonb_build_object(
|
perform transfer_employee(jsonb_build_object(
|
||||||
'employee_id', v_a, 'target_position_id', v_p4, 'effective_date', (current_date + 10)::text));
|
'employee_id', v_a, 'target_position_id', v_p4, 'effective_date', (current_date + 10)::text));
|
||||||
|
|
||||||
|
-- Der Fehlschlag wird **ausserhalb** des Blocks ausgewertet. Ein `raise`
|
||||||
|
-- innerhalb landet im eigenen exception-Zweig — und weil seine Meldung das
|
||||||
|
-- Wort „vorgemerkte" enthielt, bestand der Schritt beim ersten Lauf, obwohl
|
||||||
|
-- die Migration gar nicht angewendet war. Ein Test, der sich selbst
|
||||||
|
-- durchwinkt, ist schlimmer als keiner.
|
||||||
|
v_ging := false;
|
||||||
begin
|
begin
|
||||||
perform hire_employee(jsonb_build_object(
|
perform hire_employee(jsonb_build_object(
|
||||||
'personnel_number', v_nr + 1, 'first_name', 'Rauch', 'last_name', 'Test-B',
|
'personnel_number', v_nr + 1, 'first_name', 'Rauch', 'last_name', 'Test-B',
|
||||||
'gender', 'm', 'birth_date', '1990-01-01', 'location_id', v_ort,
|
'gender', 'm', 'birth_date', '1990-01-01', 'location_id', v_ort,
|
||||||
'position_id', v_p4, 'entry_date', current_date::text));
|
'position_id', v_p4, 'entry_date', current_date::text));
|
||||||
raise exception 'Die vorgemerkte Planstelle liess sich besetzen.';
|
v_ging := true;
|
||||||
exception
|
exception
|
||||||
when others then
|
when others then v_meldung := SQLERRM;
|
||||||
v_meldung := SQLERRM;
|
|
||||||
if v_meldung not like '%vorgemerkt%' then
|
|
||||||
raise exception 'Erwartet wurde die Meldung zur Vormerkung, kam aber: %', v_meldung;
|
|
||||||
end if;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
if v_ging then
|
||||||
|
raise exception 'Die vorgemerkte Planstelle liess sich besetzen — die Pruefung greift nicht.';
|
||||||
|
end if;
|
||||||
|
if v_meldung not like '%bereits eine Versetzung vorgemerkt%' then
|
||||||
|
raise exception 'Erwartet wurde die Meldung zur Vormerkung, kam aber: %', v_meldung;
|
||||||
|
end if;
|
||||||
raise notice '5/8 Vorgemerkte Planstelle wird abgewiesen';
|
raise notice '5/8 Vorgemerkte Planstelle wird abgewiesen';
|
||||||
|
|
||||||
-- Die eigene Vormerkung darf nicht im Weg stehen: dieselbe Versetzung noch
|
-- Die eigene Vormerkung darf nicht im Weg stehen: dieselbe Versetzung noch
|
||||||
|
|||||||
Reference in New Issue
Block a user