@accounter/server
Version:
Accounter GraphQL server
145 lines • 6.53 kB
JavaScript
import { describe, it, expect } from 'vitest';
import { formatNumeric, formatMoney, formatDecimal, parseNumeric } from './money.js';
describe('Factory Helpers: Money', () => {
describe('formatNumeric', () => {
it('should format positive integers', () => {
expect(formatNumeric(100)).toBe('100');
expect(formatNumeric(42)).toBe('42');
});
it('should format negative integers', () => {
expect(formatNumeric(-100)).toBe('-100');
expect(formatNumeric(-42)).toBe('-42');
});
it('should format positive decimals', () => {
expect(formatNumeric(100.5)).toBe('100.5');
expect(formatNumeric(42.99)).toBe('42.99');
});
it('should format negative decimals', () => {
expect(formatNumeric(-100.5)).toBe('-100.5');
expect(formatNumeric(-42.99)).toBe('-42.99');
});
it('should format zero', () => {
expect(formatNumeric(0)).toBe('0');
expect(formatNumeric(-0)).toBe('0');
});
it('should accept string inputs', () => {
expect(formatNumeric('100')).toBe('100');
expect(formatNumeric('100.50')).toBe('100.50');
expect(formatNumeric('-42.99')).toBe('-42.99');
});
it('should trim whitespace from string inputs', () => {
expect(formatNumeric(' 100 ')).toBe('100');
expect(formatNumeric(' -42.99 ')).toBe('-42.99');
});
it('should throw on invalid string input', () => {
expect(() => formatNumeric('abc')).toThrow('Invalid numeric string');
expect(() => formatNumeric('12.34.56')).toThrow('Invalid numeric string');
expect(() => formatNumeric('')).toThrow('Invalid numeric string');
});
it('should throw on NaN', () => {
expect(() => formatNumeric(NaN)).toThrow('Invalid numeric value');
});
it('should throw on Infinity', () => {
expect(() => formatNumeric(Infinity)).toThrow('Invalid numeric value');
expect(() => formatNumeric(-Infinity)).toThrow('Invalid numeric value');
});
it('should preserve precision', () => {
expect(formatNumeric(123.456789)).toBe('123.456789');
expect(formatNumeric('999.123456789')).toBe('999.123456789');
});
});
describe('formatMoney', () => {
it('should format money amounts', () => {
expect(formatMoney(10050)).toBe('10050');
expect(formatMoney(-2599)).toBe('-2599');
});
it('should accept string inputs', () => {
expect(formatMoney('10050')).toBe('10050');
expect(formatMoney('-2599')).toBe('-2599');
});
it('should handle zero', () => {
expect(formatMoney(0)).toBe('0');
});
it('should handle large amounts', () => {
expect(formatMoney(1000000)).toBe('1000000');
expect(formatMoney('999999999')).toBe('999999999');
});
});
describe('formatDecimal', () => {
it('should format with default 2 decimals', () => {
expect(formatDecimal(100.5)).toBe('100.50');
expect(formatDecimal(42)).toBe('42.00');
});
it('should format with custom decimals', () => {
expect(formatDecimal(100.5, 0)).toBe('101');
expect(formatDecimal(100.5, 1)).toBe('100.5');
expect(formatDecimal(100.5, 3)).toBe('100.500');
});
it('should round when necessary', () => {
expect(formatDecimal(42.123456, 2)).toBe('42.12');
expect(formatDecimal(42.126, 2)).toBe('42.13');
});
it('should handle negative numbers', () => {
expect(formatDecimal(-100.5, 2)).toBe('-100.50');
expect(formatDecimal(-42.99, 1)).toBe('-43.0');
});
it('should handle zero decimals', () => {
expect(formatDecimal(100.5, 0)).toBe('101');
expect(formatDecimal(100.4, 0)).toBe('100');
});
it('should throw on invalid decimals parameter', () => {
expect(() => formatDecimal(100, -1)).toThrow('Invalid decimals');
expect(() => formatDecimal(100, 1.5)).toThrow('Invalid decimals');
});
it('should throw on invalid amount', () => {
expect(() => formatDecimal(NaN, 2)).toThrow('Invalid decimal amount');
expect(() => formatDecimal(Infinity, 2)).toThrow('Invalid decimal amount');
});
it('should handle large decimal places', () => {
expect(formatDecimal(1.23456789, 8)).toBe('1.23456789');
});
});
describe('parseNumeric', () => {
it('should parse integer strings', () => {
expect(parseNumeric('100')).toBe(100);
expect(parseNumeric('-42')).toBe(-42);
});
it('should parse decimal strings', () => {
expect(parseNumeric('100.50')).toBe(100.5);
expect(parseNumeric('-42.99')).toBe(-42.99);
});
it('should parse zero', () => {
expect(parseNumeric('0')).toBe(0);
// -0 is normalized to +0
expect(parseNumeric('-0')).toBe(0);
});
it('should throw on invalid strings', () => {
expect(() => parseNumeric('abc')).toThrow('Cannot parse numeric value');
expect(() => parseNumeric('')).toThrow('Cannot parse numeric value');
expect(() => parseNumeric('12.34.56')).toThrow('Cannot parse numeric value');
});
it('should parse scientific notation', () => {
expect(parseNumeric('1e3')).toBe(1000);
expect(parseNumeric('1.5e2')).toBe(150);
});
it('should handle whitespace', () => {
expect(parseNumeric(' 100 ')).toBe(100);
});
});
describe('round-trip conversion', () => {
it('should preserve values through format and parse', () => {
const testValues = [0, 100, -42, 100.5, -42.99, 1234.56789];
testValues.forEach(value => {
const formatted = formatNumeric(value);
const parsed = parseNumeric(formatted);
expect(parsed).toBe(value);
});
});
it('should preserve string precision', () => {
const value = '123.456789';
const formatted = formatNumeric(value);
expect(formatted).toBe(value);
});
});
});
//# sourceMappingURL=money.test.js.map