Reaktivierung haengt nur noch am Redesign, nicht am Grund

Ein CC, der nicht redesignt wurde, existiert unveraendert weiter und kommt
deshalb immer gratis zurueck - egal ob der Spieler inaktiv war oder die
Einheit voruebergehend aus dem Spiel genommen wurde. Bisher kostete der Fall
OTHER ein Guthaben, was die Regel unnoetig verkompliziert hat.

Damit der zweite Fall brauchbar wird, haelt inactiveNote den Grund im Klartext
fest ("Einheit bis Maerz entfernt"); die Notiz steht an der CC-Karte und wird
beim Reaktivieren wieder geleert.
This commit is contained in:
2026-09-18 14:09:59 +02:00
parent 3ec0ff4df1
commit f775b0a594
8 changed files with 96 additions and 36 deletions
+37 -7
View File
@@ -178,16 +178,46 @@ describe('Reaktivierung', () => {
assert.equal(result.balances.CC, before.CC - 1);
});
it('eine bezahlte Reaktivierung wird bei Gratis-Faellen verweigert', async () => {
it('auch ein aus anderem Grund entfernter CC kommt gratis zurueck', async () => {
const playerId = await freshPlayer('Einheit-weg');
await credits.bookCcPackage(playerId, ctx);
const created = await characters.createCharacter(playerId, { name: 'MTF-Operativer' }, ctx);
await characters.deactivateCharacter(
created.character.id,
'OTHER',
ctx,
'Einheit bis Maerz entfernt',
);
const deactivated = await db.prisma.character.findUniqueOrThrow({
where: { id: created.character.id },
});
assert.equal(deactivated.inactiveNote, 'Einheit bis Maerz entfernt', 'der Grund bleibt lesbar');
const before = await credits.getBalances(playerId);
const result = await characters.reactivateFree(created.character.id, ctx);
assert.equal(result.character.status, 'ACTIVE');
assert.equal(result.character.inactiveNote, null, 'die Notiz wird beim Zurueckholen geloescht');
assert.deepEqual(result.balances, before, 'kein Guthaben wurde bewegt');
});
it('eine bezahlte Reaktivierung wird bei jedem Gratis-Fall verweigert', async () => {
const playerId = await freshPlayer('Gratis-Fall');
await credits.bookCcPackage(playerId, ctx);
const created = await characters.createCharacter(playerId, { name: 'Geputzt' }, ctx);
await characters.deactivateCharacter(created.character.id, 'PLAYER_INACTIVITY', ctx);
await credits.bookCcPackage(playerId, ctx);
await assert.rejects(
() => characters.reactivatePaid(created.character.id, 'CC', ctx),
(error: Error & { code?: string }) => error.code === 'IS_FREE',
);
for (const reason of ['PLAYER_INACTIVITY', 'OTHER'] as const) {
const created = await characters.createCharacter(playerId, { name: `CC-${reason}` }, ctx);
await characters.deactivateCharacter(created.character.id, reason, ctx);
await assert.rejects(
() => characters.reactivatePaid(created.character.id, 'CC', ctx),
(error: Error & { code?: string }) => error.code === 'IS_FREE',
`Grund ${reason} darf nichts kosten`,
);
}
});
});