Files
gridpilot.gg/tests/unit/domain/value-objects/SessionState.test.ts
2025-11-26 17:03:29 +01:00

254 lines
9.0 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { SessionState } from '../../../../packages/domain/value-objects/SessionState';
describe('SessionState Value Object', () => {
describe('create', () => {
it('should create PENDING state', () => {
const state = SessionState.create('PENDING');
expect(state.value).toBe('PENDING');
});
it('should create IN_PROGRESS state', () => {
const state = SessionState.create('IN_PROGRESS');
expect(state.value).toBe('IN_PROGRESS');
});
it('should create PAUSED state', () => {
const state = SessionState.create('PAUSED');
expect(state.value).toBe('PAUSED');
});
it('should create COMPLETED state', () => {
const state = SessionState.create('COMPLETED');
expect(state.value).toBe('COMPLETED');
});
it('should create FAILED state', () => {
const state = SessionState.create('FAILED');
expect(state.value).toBe('FAILED');
});
it('should create STOPPED_AT_STEP_18 state', () => {
const state = SessionState.create('STOPPED_AT_STEP_18');
expect(state.value).toBe('STOPPED_AT_STEP_18');
});
it('should create AWAITING_CHECKOUT_CONFIRMATION state', () => {
const state = SessionState.create('AWAITING_CHECKOUT_CONFIRMATION');
expect(state.value).toBe('AWAITING_CHECKOUT_CONFIRMATION');
});
it('should create CANCELLED state', () => {
const state = SessionState.create('CANCELLED');
expect(state.value).toBe('CANCELLED');
});
it('should throw error for invalid state', () => {
expect(() => SessionState.create('INVALID' as any)).toThrow('Invalid session state');
});
it('should throw error for empty string', () => {
expect(() => SessionState.create('' as any)).toThrow('Invalid session state');
});
});
describe('equals', () => {
it('should return true for equal states', () => {
const state1 = SessionState.create('PENDING');
const state2 = SessionState.create('PENDING');
expect(state1.equals(state2)).toBe(true);
});
it('should return false for different states', () => {
const state1 = SessionState.create('PENDING');
const state2 = SessionState.create('IN_PROGRESS');
expect(state1.equals(state2)).toBe(false);
});
});
describe('isPending', () => {
it('should return true for PENDING state', () => {
const state = SessionState.create('PENDING');
expect(state.isPending()).toBe(true);
});
it('should return false for IN_PROGRESS state', () => {
const state = SessionState.create('IN_PROGRESS');
expect(state.isPending()).toBe(false);
});
});
describe('isInProgress', () => {
it('should return true for IN_PROGRESS state', () => {
const state = SessionState.create('IN_PROGRESS');
expect(state.isInProgress()).toBe(true);
});
it('should return false for PENDING state', () => {
const state = SessionState.create('PENDING');
expect(state.isInProgress()).toBe(false);
});
});
describe('isCompleted', () => {
it('should return true for COMPLETED state', () => {
const state = SessionState.create('COMPLETED');
expect(state.isCompleted()).toBe(true);
});
it('should return false for IN_PROGRESS state', () => {
const state = SessionState.create('IN_PROGRESS');
expect(state.isCompleted()).toBe(false);
});
});
describe('isFailed', () => {
it('should return true for FAILED state', () => {
const state = SessionState.create('FAILED');
expect(state.isFailed()).toBe(true);
});
it('should return false for COMPLETED state', () => {
const state = SessionState.create('COMPLETED');
expect(state.isFailed()).toBe(false);
});
});
describe('isStoppedAtStep18', () => {
it('should return true for STOPPED_AT_STEP_18 state', () => {
const state = SessionState.create('STOPPED_AT_STEP_18');
expect(state.isStoppedAtStep18()).toBe(true);
});
it('should return false for COMPLETED state', () => {
const state = SessionState.create('COMPLETED');
expect(state.isStoppedAtStep18()).toBe(false);
});
});
describe('canTransitionTo', () => {
it('should allow transition from PENDING to IN_PROGRESS', () => {
const state = SessionState.create('PENDING');
expect(state.canTransitionTo(SessionState.create('IN_PROGRESS'))).toBe(true);
});
it('should allow transition from IN_PROGRESS to PAUSED', () => {
const state = SessionState.create('IN_PROGRESS');
expect(state.canTransitionTo(SessionState.create('PAUSED'))).toBe(true);
});
it('should allow transition from IN_PROGRESS to STOPPED_AT_STEP_18', () => {
const state = SessionState.create('IN_PROGRESS');
expect(state.canTransitionTo(SessionState.create('STOPPED_AT_STEP_18'))).toBe(true);
});
it('should allow transition from PAUSED to IN_PROGRESS', () => {
const state = SessionState.create('PAUSED');
expect(state.canTransitionTo(SessionState.create('IN_PROGRESS'))).toBe(true);
});
it('should not allow transition from COMPLETED to IN_PROGRESS', () => {
const state = SessionState.create('COMPLETED');
expect(state.canTransitionTo(SessionState.create('IN_PROGRESS'))).toBe(false);
});
it('should not allow transition from FAILED to IN_PROGRESS', () => {
const state = SessionState.create('FAILED');
expect(state.canTransitionTo(SessionState.create('IN_PROGRESS'))).toBe(false);
});
it('should not allow transition from STOPPED_AT_STEP_18 to IN_PROGRESS', () => {
const state = SessionState.create('STOPPED_AT_STEP_18');
expect(state.canTransitionTo(SessionState.create('IN_PROGRESS'))).toBe(false);
});
});
describe('isTerminal', () => {
it('should return true for COMPLETED state', () => {
const state = SessionState.create('COMPLETED');
expect(state.isTerminal()).toBe(true);
});
it('should return true for FAILED state', () => {
const state = SessionState.create('FAILED');
expect(state.isTerminal()).toBe(true);
});
it('should return true for STOPPED_AT_STEP_18 state', () => {
const state = SessionState.create('STOPPED_AT_STEP_18');
expect(state.isTerminal()).toBe(true);
});
it('should return false for PENDING state', () => {
const state = SessionState.create('PENDING');
expect(state.isTerminal()).toBe(false);
});
it('should return false for IN_PROGRESS state', () => {
const state = SessionState.create('IN_PROGRESS');
expect(state.isTerminal()).toBe(false);
});
it('should return false for PAUSED state', () => {
const state = SessionState.create('PAUSED');
expect(state.isTerminal()).toBe(false);
});
it('should return false for AWAITING_CHECKOUT_CONFIRMATION state', () => {
const state = SessionState.create('AWAITING_CHECKOUT_CONFIRMATION');
expect(state.isTerminal()).toBe(false);
});
it('should return true for CANCELLED state', () => {
const state = SessionState.create('CANCELLED');
expect(state.isTerminal()).toBe(true);
});
});
describe('state transitions with new states', () => {
it('should allow transition from IN_PROGRESS to AWAITING_CHECKOUT_CONFIRMATION', () => {
const state = SessionState.create('IN_PROGRESS');
expect(state.canTransitionTo(SessionState.create('AWAITING_CHECKOUT_CONFIRMATION'))).toBe(true);
});
it('should allow transition from AWAITING_CHECKOUT_CONFIRMATION to COMPLETED', () => {
const state = SessionState.create('AWAITING_CHECKOUT_CONFIRMATION');
expect(state.canTransitionTo(SessionState.create('COMPLETED'))).toBe(true);
});
it('should allow transition from AWAITING_CHECKOUT_CONFIRMATION to CANCELLED', () => {
const state = SessionState.create('AWAITING_CHECKOUT_CONFIRMATION');
expect(state.canTransitionTo(SessionState.create('CANCELLED'))).toBe(true);
});
it('should not allow transition from CANCELLED to any other state', () => {
const state = SessionState.create('CANCELLED');
expect(state.canTransitionTo(SessionState.create('IN_PROGRESS'))).toBe(false);
expect(state.canTransitionTo(SessionState.create('COMPLETED'))).toBe(false);
});
});
describe('isAwaitingCheckoutConfirmation', () => {
it('should return true for AWAITING_CHECKOUT_CONFIRMATION state', () => {
const state = SessionState.create('AWAITING_CHECKOUT_CONFIRMATION');
expect(state.isAwaitingCheckoutConfirmation()).toBe(true);
});
it('should return false for IN_PROGRESS state', () => {
const state = SessionState.create('IN_PROGRESS');
expect(state.isAwaitingCheckoutConfirmation()).toBe(false);
});
});
describe('isCancelled', () => {
it('should return true for CANCELLED state', () => {
const state = SessionState.create('CANCELLED');
expect(state.isCancelled()).toBe(true);
});
it('should return false for COMPLETED state', () => {
const state = SessionState.create('COMPLETED');
expect(state.isCancelled()).toBe(false);
});
});
});