import test from 'node:test';
import assert from 'node:assert/strict';
import { createKubectlQueue } from '../kubectl-queue.mjs';

test('SerialCommandQueue runs commands one at a time and resolves callbacks', async () => {
  const queue = createKubectlQueue({ name: 'test-kubectl' });
  const events = [];
  const startedAt = Date.now();

  const first = queue.enqueue('sleep 0.2; printf first', {
    timeoutMs: 2_000,
    onStart: (entry) => events.push(`start:${entry.id}`),
    onDone: (result) => events.push(`done:${result.id}`)
  });
  const second = queue.enqueue('printf second', {
    timeoutMs: 2_000,
    onStart: (entry) => events.push(`start:${entry.id}`),
    onDone: (result) => events.push(`done:${result.id}`)
  });

  const [firstResult, secondResult] = await Promise.all([first, second]);

  assert.equal(firstResult.ok, true);
  assert.equal(secondResult.ok, true);
  assert.equal(firstResult.stdout, 'first');
  assert.equal(secondResult.stdout, 'second');
  assert.deepEqual(events, ['start:1', 'done:1', 'start:2', 'done:2']);
  assert.equal(secondResult.queuedMs >= 150, true);
  assert.equal(Date.now() - startedAt >= 150, true);
});

test('SerialCommandQueue returns timeout result without rejecting', async () => {
  const queue = createKubectlQueue({ name: 'test-timeout' });
  const result = await queue.enqueue('sleep 2', { timeoutMs: 100 });
  assert.equal(result.ok, false);
  assert.equal(result.status, 124);
  assert.match(result.stderr, /Command timed out/);
});
