import { describe, it, expect, beforeEach } from 'vitest' import { initCommissionCalculator } from '../../assets/modules/commission-calculator.js' describe('initCommissionCalculator', () => { beforeEach(() => { document.body.innerHTML = '' }) it('does nothing without calculator element', () => { expect(() => initCommissionCalculator()).not.toThrow() }) it('does nothing without price input', () => { document.body.innerHTML = '
' expect(() => initCommissionCalculator()).not.toThrow() }) it('uses default stripe rate and fixed when not provided', () => { document.body.innerHTML = `
` initCommissionCalculator() // Default stripe: 10 * 1.5% + 0.25 = 0.40 expect(document.getElementById('calc-stripe').textContent).toBe('- 0,40 \u20AC') }) function setupCalculator(eticketRate = '5', price = '') { document.body.innerHTML = `
` initCommissionCalculator() } it('shows zero values when price is empty', () => { setupCalculator('5', '') expect(document.getElementById('calc-price').textContent).toBe('0,00 \u20AC') expect(document.getElementById('calc-net').textContent).toBe('0,00 \u20AC') }) it('calculates commissions for 10 EUR with 5% eticket rate', () => { setupCalculator('5', '10') // E-Ticket: 10 * 5% = 0.50 // Stripe: 10 * 1.5% + 0.25 = 0.40 // Total: 0.90 // Net: 9.10 expect(document.getElementById('calc-price').textContent).toBe('10,00 \u20AC') expect(document.getElementById('calc-eticket').textContent).toBe('- 0,50 \u20AC') expect(document.getElementById('calc-stripe').textContent).toBe('- 0,40 \u20AC') expect(document.getElementById('calc-total').textContent).toBe('- 0,90 \u20AC') expect(document.getElementById('calc-net').textContent).toBe('9,10 \u20AC') }) it('calculates with 0% eticket rate', () => { setupCalculator('0', '20') // E-Ticket: 0 // Stripe: 20 * 1.5% + 0.25 = 0.55 // Net: 19.45 expect(document.getElementById('calc-eticket').textContent).toBe('- 0,00 \u20AC') expect(document.getElementById('calc-stripe').textContent).toBe('- 0,55 \u20AC') expect(document.getElementById('calc-net').textContent).toBe('19,45 \u20AC') }) it('updates on input event', () => { setupCalculator('5', '0') const input = document.getElementById('billet_price') input.value = '15' input.dispatchEvent(new Event('input', { bubbles: true })) // E-Ticket: 15 * 5% = 0.75 // Stripe: 15 * 1.5% + 0.25 = 0.475 → 0.48 // Total: 1.225 → 1.23 (but floating point...) expect(document.getElementById('calc-price').textContent).toBe('15,00 \u20AC') expect(document.getElementById('calc-eticket').textContent).toBe('- 0,75 \u20AC') const net = document.getElementById('calc-net').textContent expect(net).toContain('\u20AC') }) it('net is never negative', () => { setupCalculator('99', '0.01') // With 99% commission the net would be very low or negative after stripe const net = document.getElementById('calc-net').textContent expect(net).toBe('0,00 \u20AC') }) })