Files
gridpilot.gg/core/automation/domain/value-objects/CheckoutState.test.ts
2025-12-16 13:53:23 +01:00

127 lines
4.9 KiB
TypeScript

import { describe, it, expect } from 'vitest';
/**
* CheckoutState Value Object - GREEN PHASE
*
* Tests for checkout button state detection.
*/
describe('CheckoutState Value Object', () => {
describe('READY state', () => {
it('should create READY state from btn-success class', () => {
const state = CheckoutState.fromButtonClasses('btn btn-success');
expect(state.getValue()).toBe(CheckoutStateEnum.READY);
});
it('should detect ready state correctly', () => {
const state = CheckoutState.fromButtonClasses('btn btn-success');
expect(state.isReady()).toBe(true);
expect(state.hasInsufficientFunds()).toBe(false);
});
it('should handle additional classes with btn-success', () => {
const state = CheckoutState.fromButtonClasses('btn btn-lg btn-success pull-right');
expect(state.getValue()).toBe(CheckoutStateEnum.READY);
});
it('should be case-insensitive for btn-success', () => {
const state = CheckoutState.fromButtonClasses('btn BTN-SUCCESS');
expect(state.getValue()).toBe(CheckoutStateEnum.READY);
});
});
describe('INSUFFICIENT_FUNDS state', () => {
it('should create INSUFFICIENT_FUNDS from btn-default without btn-success', () => {
const state = CheckoutState.fromButtonClasses('btn btn-default');
expect(state.getValue()).toBe(CheckoutStateEnum.INSUFFICIENT_FUNDS);
});
it('should detect insufficient funds correctly', () => {
const state = CheckoutState.fromButtonClasses('btn btn-default');
expect(state.isReady()).toBe(false);
expect(state.hasInsufficientFunds()).toBe(true);
});
it('should handle btn-primary as insufficient funds', () => {
const state = CheckoutState.fromButtonClasses('btn btn-primary');
expect(state.getValue()).toBe(CheckoutStateEnum.INSUFFICIENT_FUNDS);
});
it('should handle btn-warning as insufficient funds', () => {
const state = CheckoutState.fromButtonClasses('btn btn-warning');
expect(state.getValue()).toBe(CheckoutStateEnum.INSUFFICIENT_FUNDS);
});
it('should handle disabled button as insufficient funds', () => {
const state = CheckoutState.fromButtonClasses('btn btn-default disabled');
expect(state.getValue()).toBe(CheckoutStateEnum.INSUFFICIENT_FUNDS);
});
});
describe('UNKNOWN state', () => {
it('should create UNKNOWN when no btn class exists', () => {
const state = CheckoutState.fromButtonClasses('some-other-class');
expect(state.getValue()).toBe(CheckoutStateEnum.UNKNOWN);
});
it('should create UNKNOWN from empty string', () => {
const state = CheckoutState.fromButtonClasses('');
expect(state.getValue()).toBe(CheckoutStateEnum.UNKNOWN);
});
it('should detect unknown state correctly', () => {
const state = CheckoutState.fromButtonClasses('');
expect(state.isReady()).toBe(false);
expect(state.hasInsufficientFunds()).toBe(false);
});
});
describe('Edge Cases', () => {
it('should handle whitespace in class names', () => {
const state = CheckoutState.fromButtonClasses(' btn btn-success ');
expect(state.getValue()).toBe(CheckoutStateEnum.READY);
});
it('should handle multiple spaces between classes', () => {
const state = CheckoutState.fromButtonClasses('btn btn-success');
expect(state.getValue()).toBe(CheckoutStateEnum.READY);
});
it('should be immutable after creation', () => {
const state = CheckoutState.fromButtonClasses('btn btn-success');
const originalState = state.getValue();
expect(originalState).toBe(CheckoutStateEnum.READY);
// Verify no setters exist
const mutableState = state as unknown as { setState?: unknown };
expect(typeof mutableState.setState).toBe('undefined');
});
});
describe('BDD Scenarios', () => {
it('Given button with btn-success, When checking state, Then state is READY', () => {
const state = CheckoutState.fromButtonClasses('btn btn-success');
expect(state.getValue()).toBe(CheckoutStateEnum.READY);
});
it('Given button without btn-success, When checking state, Then state is INSUFFICIENT_FUNDS', () => {
const state = CheckoutState.fromButtonClasses('btn btn-default');
expect(state.getValue()).toBe(CheckoutStateEnum.INSUFFICIENT_FUNDS);
});
it('Given no button classes, When checking state, Then state is UNKNOWN', () => {
const state = CheckoutState.fromButtonClasses('');
expect(state.getValue()).toBe(CheckoutStateEnum.UNKNOWN);
});
it('Given READY state, When checking isReady, Then returns true', () => {
const state = CheckoutState.fromButtonClasses('btn btn-success');
expect(state.isReady()).toBe(true);
});
it('Given INSUFFICIENT_FUNDS state, When checking hasInsufficientFunds, Then returns true', () => {
const state = CheckoutState.fromButtonClasses('btn btn-default');
expect(state.hasInsufficientFunds()).toBe(true);
});
});
});