Files
demo-ddd-without-oop/js-fp3.tests/account.test.js
T
2026-04-27 13:19:17 +01:00

55 lines
1.9 KiB
JavaScript

import { describe, it, expect } from 'vitest';
import { openAccount, withdraw } from '../js-fp3/domain/account.js';
import { createMoney } from '../js-fp3/domain/money.js';
describe('account domain', () => {
it('opening an account with a negative balance returns openingBalanceMustBeNonNegative', () => {
const result = openAccount('id-1', createMoney(-1));
expect(result.error.type).toBe('OpeningBalanceMustBeNonNegative');
});
it('withdrawing a zero amount returns amountMustBePositive', () => {
const account = openAccount('id-1', createMoney(100)).value;
const result = withdraw(account, createMoney(0));
expect(result.error.type).toBe('AmountMustBePositive');
});
it('withdrawing a negative amount returns amountMustBePositive', () => {
const account = openAccount('id-1', createMoney(100)).value;
const result = withdraw(account, createMoney(-10));
expect(result.error.type).toBe('AmountMustBePositive');
});
it('withdrawing more than the balance returns insufficientBalance', () => {
const account = openAccount('id-1', createMoney(100)).value;
const result = withdraw(account, createMoney(101));
expect(result.error.type).toBe('InsufficientBalance');
});
it('insufficientBalance error reports the current balance and attempted amount', () => {
const account = openAccount('id-1', createMoney(100)).value;
const error = withdraw(account, createMoney(150)).error;
expect(error.type).toBe('InsufficientBalance');
expect(error.balance.amount).toBe(100);
expect(error.amount.amount).toBe(150);
});
it('successive withdrawals are each applied to the running balance', () => {
const account = openAccount('id-1', createMoney(300)).value;
const updatedAccount1 = withdraw(account, createMoney(100)).value;
const updatedAccount2 = withdraw(updatedAccount1, createMoney(100)).value;
expect(updatedAccount2.balance.amount).toBe(100);
});
});