diff --git a/src/modules/banking/bank-cards/application/bank-cards.service.ts b/src/modules/banking/bank-cards/application/bank-cards.service.ts index 7a777f9..e1e6d74 100644 --- a/src/modules/banking/bank-cards/application/bank-cards.service.ts +++ b/src/modules/banking/bank-cards/application/bank-cards.service.ts @@ -103,13 +103,9 @@ export class BankCardsService { id, name: dto.name ?? previous.name, bankName: - dto.bankName === undefined - ? (previous.bankName ?? undefined) - : (dto.bankName ?? undefined), + dto.bankName === undefined ? previous.bankName : dto.bankName, lastFour: - dto.lastFour === undefined - ? (previous.lastFour ?? undefined) - : (dto.lastFour ?? undefined), + dto.lastFour === undefined ? previous.lastFour : dto.lastFour, paymentSystem: dto.paymentSystem === undefined ? previous.paymentSystem diff --git a/test/bank-cards.e2e-spec.ts b/test/bank-cards.e2e-spec.ts index cfa6de5..97effb8 100644 --- a/test/bank-cards.e2e-spec.ts +++ b/test/bank-cards.e2e-spec.ts @@ -188,6 +188,17 @@ describe('Manual bank cards configured HTTP and real SQLite', () => { ).toBe(0); expect((await summary('2026-08', card.id)).net.value).toBe('0'); }); + it('retains omitted metadata on a name-only patch and clears explicit nulls', async () => { + const card = await createCard('0', owner, { bankName: 'Bank', lastFour: '1234' }); + const renamed = (await auth('patch', '/' + card.id) + .send({ version: card.version, name: 'Renamed' }).expect(200)).body as BankCardDto; + expect(renamed).toMatchObject({ name: 'Renamed', bankName: 'Bank', lastFour: '1234' }); + const cleared = (await auth('patch', '/' + card.id) + .send({ version: renamed.version, bankName: null, lastFour: null }).expect(200)).body as BankCardDto; + expect(cleared).toMatchObject({ name: 'Renamed', bankName: null, lastFour: null }); + expect(cleared.version).toBe(renamed.version + 1); + }); + it('rejects explicit null on nonnullable write fields without changing values or versions', async () => { const card = await createCard(); const expense = await createOp(op(card.id));