import { describe, expect, it } from 'vitest';
import { WEBSOCKET_COMMANDS } from '../../src/contracts/websocket-commands.js';
import {
  buildPayloadValidator,
  validateCommandPayload,
} from '../../src/contracts/validate-payload.js';

describe('contract payload validation (Zod)', () => {
  it('accepts quitHabit legacy string payload', () => {
    const result = validateCommandPayload(WEBSOCKET_COMMANDS.quitHabit, 'smoking');
    expect(result.valid).toBe(true);
  });

  it('accepts quitHabit structured payload', () => {
    const result = validateCommandPayload(WEBSOCKET_COMMANDS.quitHabit, { habitId: 'smoking' });
    expect(result.valid).toBe(true);
  });

  it('rejects quitHabit numeric payload', () => {
    const result = validateCommandPayload(WEBSOCKET_COMMANDS.quitHabit, 42);
    expect(result.valid).toBe(false);
  });

  it('builds validators for all manifest commands', () => {
    for (const [name, contract] of Object.entries(WEBSOCKET_COMMANDS)) {
      expect(() => buildPayloadValidator(contract), name).not.toThrow();
    }
  });
});
