Files

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