73 lines
3.1 KiB
JavaScript
73 lines
3.1 KiB
JavaScript
import { describe, it, expect, vi } from 'vitest';
|
|
import { DockerManager } from '../src/docker.js';
|
|
// Mock dockerode
|
|
vi.mock('dockerode', () => {
|
|
return {
|
|
default: class MockDocker {
|
|
getContainer = vi.fn((id) => ({
|
|
exec: vi.fn(async (opts) => {
|
|
const cmd = opts.Cmd.join(' ');
|
|
const isUsesWarning = cmd.includes('Action step');
|
|
const stdoutText = isUsesWarning
|
|
? '[CISandbox] Action step: actions/checkout@v4\nNote: \'uses\' actions are not yet supported in CISandbox. Convert to \'run\' or modify the step to debug.'
|
|
: 'hello';
|
|
return {
|
|
start: vi.fn(async () => {
|
|
const { EventEmitter } = await import('events');
|
|
const ee = new EventEmitter();
|
|
process.nextTick(() => {
|
|
const buf = Buffer.alloc(8 + stdoutText.length);
|
|
buf[0] = 1;
|
|
buf.write(stdoutText, 8);
|
|
ee.emit('data', buf);
|
|
ee.emit('end');
|
|
});
|
|
return ee;
|
|
}),
|
|
inspect: vi.fn(async () => ({ ExitCode: 0 })),
|
|
};
|
|
}),
|
|
stop: vi.fn(async () => { }),
|
|
}));
|
|
getImage = vi.fn(() => ({
|
|
inspect: vi.fn(async () => ({})),
|
|
}));
|
|
createContainer = vi.fn(async () => ({ id: 'abc123', start: vi.fn(async () => { }) }));
|
|
pull = vi.fn(async () => {
|
|
const { EventEmitter } = await import('events');
|
|
const ee = new EventEmitter();
|
|
process.nextTick(() => ee.emit('end'));
|
|
return ee;
|
|
});
|
|
modem = { followProgress: vi.fn((_, cb) => cb()) };
|
|
},
|
|
};
|
|
});
|
|
describe('DockerManager', () => {
|
|
it('checks image existence', async () => {
|
|
const dm = new DockerManager();
|
|
const exists = await dm.imageExists('node:20-slim');
|
|
expect(exists).toBe(true);
|
|
});
|
|
it('creates a container', async () => {
|
|
const dm = new DockerManager();
|
|
const id = await dm.createContainer('node:20-slim', {
|
|
workspace: '/tmp',
|
|
env: { FOO: 'bar' },
|
|
});
|
|
expect(id).toBe('abc123');
|
|
});
|
|
it('executes a step', async () => {
|
|
const dm = new DockerManager();
|
|
const result = await dm.execInContainer('abc123', { run: 'echo hello' });
|
|
expect(result.exitCode).toBe(0);
|
|
expect(result.stdout).toContain('hello');
|
|
});
|
|
it('handles uses steps with warning', async () => {
|
|
const dm = new DockerManager();
|
|
const result = await dm.execInContainer('abc123', { uses: 'actions/checkout@v4' });
|
|
expect(result.exitCode).toBe(0);
|
|
expect(result.stdout).toContain('not yet supported');
|
|
});
|
|
});
|
|
//# sourceMappingURL=docker.test.js.map
|