import { describe, it, expect } from 'vitest'
import { sanitizeString, sanitizeIdentifier, sanitizeLabel } from '../../server/utils/validation.js'

describe('sanitize', () => {
  describe('sanitizeString', () => {
    it.each([
      ['  test  ', 'test'],
      ['\n\ttest\n\t', 'test'],
      ['valid string', 'valid string'],
      ['test123', 'test123'],
    ])('trims whitespace and preserves valid: %s -> %s', (input, expected) => {
      expect(sanitizeString(input)).toBe(expected)
    })

    it.each([null, undefined, 123, {}])('returns empty for non-string: %s', (input) => {
      expect(sanitizeString(input)).toBe('')
    })

    it('truncates strings exceeding max length', () => {
      expect(sanitizeString('a'.repeat(2000), 1000).length).toBe(1000)
      expect(sanitizeString('a'.repeat(2000)).length).toBe(1000)
    })
  })

  describe('sanitizeIdentifier', () => {
    it.each([
      ['test123', 'test123'],
      ['test_user', 'test_user'],
      ['Test123', 'Test123'],
      ['_test', '_test'],
      ['  test123  ', 'test123'],
    ])('accepts valid identifier: %s -> %s', (input, expected) => {
      expect(sanitizeIdentifier(input)).toBe(expected)
    })

    it.each([
      ['test-user'],
      ['test.user'],
      ['test user'],
      ['test@user'],
      [''],
      ['   '],
      ['a'.repeat(256)],
    ])('rejects invalid identifier: %s', (input) => {
      expect(sanitizeIdentifier(input)).toBe('')
    })

    it.each([null, undefined, 123])('returns empty for non-string: %s', (input) => {
      expect(sanitizeIdentifier(input)).toBe('')
    })
  })

  describe('sanitizeLabel', () => {
    it.each([
      ['  test label  ', 'test label'],
      ['Valid Label', 'Valid Label'],
      ['Test 123', 'Test 123'],
    ])('trims whitespace and preserves valid: %s -> %s', (input, expected) => {
      expect(sanitizeLabel(input)).toBe(expected)
    })

    it.each([null, undefined])('returns empty for non-string: %s', (input) => {
      expect(sanitizeLabel(input)).toBe('')
    })

    it('truncates long labels', () => {
      expect(sanitizeLabel('a'.repeat(2000), 500).length).toBe(500)
      expect(sanitizeLabel('a'.repeat(2000)).length).toBe(1000)
    })
  })
})
