import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { writeFileSync, mkdirSync, rmSync } from 'fs'; import { join } from 'path'; import { parseWorkflow, listJobs, pickJob, normalizeRunsOn } from '../src/parser.js'; const TMP = join(process.cwd(), 'tmp-test'); describe('parser', () => { beforeEach(() => { mkdirSync(TMP, { recursive: true }); }); afterEach(() => { rmSync(TMP, { recursive: true, force: true }); }); it('parses a basic workflow', () => { const path = join(TMP, 'workflow.yml'); writeFileSync(path, ` name: Test Workflow on: push jobs: build: runs-on: ubuntu-latest steps: - run: echo hello `); const wf = parseWorkflow(path); expect(wf.name).toBe('Test Workflow'); expect(wf.jobs.build['runs-on']).toBe('ubuntu-latest'); expect(wf.jobs.build.steps).toHaveLength(1); }); it('lists all jobs', () => { const path = join(TMP, 'workflow.yml'); writeFileSync(path, ` name: Multi Job on: push jobs: build: runs-on: ubuntu-latest steps: - run: echo build test: runs-on: ubuntu-latest steps: - run: echo test `); const wf = parseWorkflow(path); const jobs = listJobs(wf); expect(jobs).toHaveLength(2); expect(jobs.map(j => j.name)).toEqual(['build', 'test']); }); it('picks specified job', () => { const path = join(TMP, 'workflow.yml'); writeFileSync(path, ` name: Multi Job on: push jobs: build: runs-on: ubuntu-latest steps: - run: echo build test: runs-on: ubuntu-latest steps: - run: echo test `); const wf = parseWorkflow(path); const picked = pickJob(wf, 'test'); expect(picked.name).toBe('test'); }); it('picks first job when only one exists', () => { const path = join(TMP, 'workflow.yml'); writeFileSync(path, ` name: Single Job on: push jobs: build: runs-on: ubuntu-latest steps: - run: echo build `); const wf = parseWorkflow(path); const picked = pickJob(wf); expect(picked.name).toBe('build'); }); it('throws when multiple jobs and no name given', () => { const path = join(TMP, 'workflow.yml'); writeFileSync(path, ` name: Multi Job on: push jobs: a: runs-on: ubuntu-latest steps: [] b: runs-on: ubuntu-latest steps: [] `); const wf = parseWorkflow(path); expect(() => pickJob(wf)).toThrow('Use --job'); }); it('throws on missing file', () => { expect(() => parseWorkflow(join(TMP, 'nonexistent.yml'))).toThrow(); }); it('normalizes runs-on values', () => { expect(normalizeRunsOn('ubuntu-latest')).toBe('node:20-slim'); expect(normalizeRunsOn('ubuntu-22.04')).toBe('node:20-slim'); expect(normalizeRunsOn('custom-image')).toBe('custom-image'); }); }); //# sourceMappingURL=parser.test.js.map