Prüfe Liebschaftskinder neben bestehenden Ehen
All checks were successful
Deploy to production / deploy (push) Successful in 2m55s

This commit is contained in:
Torsten Schulz (local)
2026-11-04 15:05:17 +01:00
parent c64f599fd7
commit 0178d33a21
2 changed files with 77 additions and 0 deletions

View File

@@ -235,6 +235,70 @@ test('database migration, persistence and daemon conception paths', {
marriage_pregnancy_due_at = NOW() - INTERVAL '1 hour'`);
const [births] = await db.query(sql('QUERY_GET_MARRIAGE_BIRTH_DELIVERIES'));
assert.equal(births.length, 1);
await t.test('a married mother can conceive with a lover and keeps the correct father', async () => {
await db.query(`
UPDATE falukant_data.character SET birthdate = CURRENT_DATE - INTERVAL '20 days',
fertile_from_age = 13, pregnancy_due_at = NULL;
INSERT INTO falukant_data.character (gender, birthdate, puberty_start_age, fertile_from_age)
VALUES ('male', CURRENT_DATE - INTERVAL '24 days', 10, 13);
UPDATE falukant_data.relationship SET relationship_type_id = 2, marriage_pregnancy_due_at = NULL;
INSERT INTO falukant_data.relationship VALUES (2, 1, 3, 1, NULL);
INSERT INTO falukant_data.relationship_state VALUES (1, true, 80, 50, NOW(), 'lover', 20);
`);
const [candidates] = await db.query(sql('QUERY_GET_LOVER_PREGNANCY_CANDIDATES'));
assert.equal(candidates.length, 1);
assert.equal(candidates[0].father_cid, 2);
// An already pending marital pregnancy blocks the same mother.
await db.query("UPDATE falukant_data.relationship SET marriage_pregnancy_due_at = NOW() + INTERVAL '18 hours' WHERE id = 2");
const [blocked] = await db.query(sql('QUERY_GET_LOVER_PREGNANCY_CANDIDATES'));
assert.equal(blocked.length, 0);
await db.query('UPDATE falukant_data.relationship SET marriage_pregnancy_due_at = NULL WHERE id = 2');
await db.query(sql('QUERY_SET_CHARACTER_PREGNANCY_FROM_LOVER'), { bind: [1, 2] });
await db.query(sql('QUERY_TRY_MARRIAGE_CONCEPTION_UPDATE'));
const [[marriage]] = await db.query('SELECT marriage_pregnancy_due_at FROM falukant_data.relationship WHERE id = 2');
assert.equal(marriage.marriage_pregnancy_due_at, null);
await db.query("UPDATE falukant_data.character SET pregnancy_due_at = NOW() - INTERVAL '1 hour' WHERE id = 1");
const [deliveries] = await db.query(sql('QUERY_GET_PLANNED_CHARACTER_BIRTH_DELIVERIES'));
assert.equal(deliveries.length, 1);
assert.equal(deliveries[0].father_cid, 2);
assert.equal(deliveries[0].birth_context, 'lover');
await db.query(sql('QUERY_INSERT_CHILD_RELATION_PLANNED_BIRTH'), { bind: [2, 1, 4, deliveries[0].birth_context] });
const [[child]] = await db.query('SELECT father_character_id, mother_character_id, birth_context FROM falukant_data.child_relation');
assert.deepEqual(child, { father_character_id: 2, mother_character_id: 1, birth_context: 'lover' });
});
await t.test('lover upkeep and penalties use game years rather than real years', async () => {
await db.query(`
ALTER TABLE falukant_data.character ADD COLUMN reputation INT DEFAULT 50;
ALTER TABLE falukant_data.relationship_state
ADD COLUMN discretion INT DEFAULT 50,
ADD COLUMN status_fit INT DEFAULT 0,
ADD COLUMN monthly_base_cost INT DEFAULT 30,
ADD COLUMN months_underfunded INT DEFAULT 0,
ADD COLUMN last_daily_processed_at TIMESTAMPTZ,
ADD COLUMN lover_last_installment_at TIMESTAMPTZ;
UPDATE falukant_data.relationship_state SET last_monthly_processed_at = NULL;
CREATE TABLE falukant_type.title (id INT PRIMARY KEY, tr TEXT);
INSERT INTO falukant_type.title VALUES (1, 'civil');
CREATE TABLE falukant_data.user_house (user_id INT, servant_discretion_modifier INT);
`);
for (const [motherAge, fatherAge, youngerAge] of [[20, 34, 20], [35, 16, 16]]) {
await db.query(`UPDATE falukant_data.character SET birthdate = CURRENT_DATE -
(CASE WHEN id = 1 THEN :motherAge ELSE :fatherAge END) * INTERVAL '1 day'`, {
replacements: { motherAge, fatherAge },
});
for (const name of [
'QUERY_GET_ACTIVE_LOVER_ROWS_FOR_DAILY',
'QUERY_GET_ACTIVE_LOVER_ROWS_FOR_MONTHLY',
'QUERY_GET_ACTIVE_LOVER_ROWS_FOR_INSTALLMENT',
]) {
const [rows] = await db.query(sql(name));
assert.equal(rows.length, 1, name);
assert.equal(rows[0].min_age_years, youngerAge, name);
}
}
});
});
await migration.down(qi);
const [[columns]] = await db.query(`SELECT count(*)::int AS count FROM information_schema.columns