← back to ClawCoder

src/tests/lib/suggester.test.ts

48 lines

import { describe, it, expect } from 'vitest'
import { generateSuggestions } from '@/lib/analyzer/suggester'
import { applySuggestions } from '@/lib/analyzer/applier'
import { analyzeClaudeMd } from '@/lib/analyzer/scorer'

const minimal = `# CLAUDE.md\n\n## My project\nThis is a simple app.\n`

describe('Suggestion Engine', () => {
  it('generates suggestions for minimal CLAUDE.md', () => {
    const analysis = analyzeClaudeMd(minimal)
    const suggestions = generateSuggestions(minimal, analysis)
    expect(suggestions.length).toBeGreaterThan(0)
    expect(suggestions[0].description).toBeTruthy()
    expect(suggestions[0].after).toBeTruthy()
  })

  it('does not generate suggestions for passing criteria', () => {
    const analysis = analyzeClaudeMd(minimal)
    const suggestions = generateSuggestions(minimal, analysis)
    const passingIds = analysis.criteria
      .filter(c => c.score === c.maxScore)
      .map(c => c.id)
    for (const s of suggestions) {
      expect(passingIds).not.toContain(s.criterion)
    }
  })
})

describe('Suggestion Applier', () => {
  it('applies suggestions to content', () => {
    const analysis = analyzeClaudeMd(minimal)
    const suggestions = generateSuggestions(minimal, analysis)
    if (suggestions.length > 0) {
      const result = applySuggestions(minimal, [suggestions[0]])
      expect(result.length).toBeGreaterThan(minimal.length)
    }
  })

  it('preserves original content when applying', () => {
    const analysis = analyzeClaudeMd(minimal)
    const suggestions = generateSuggestions(minimal, analysis)
    if (suggestions.length > 0) {
      const result = applySuggestions(minimal, [suggestions[0]])
      expect(result).toContain('# CLAUDE.md')
    }
  })
})