feat: CISandbox v1.0.0 — Interactive CI Pipeline Debugger with Local Env Sync
This commit is contained in:
Vendored
+108
@@ -0,0 +1,108 @@
|
||||
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
|
||||
Reference in New Issue
Block a user