Files

108 lines
2.9 KiB
JavaScript

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