108 lines
2.9 KiB
JavaScript
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
|