cruise 0.1.78

YAML-driven coding agent workflow orchestrator
Documentation
/**
 * Tests for PhaseBadge system-theme (light/dark mode) colour adaptation.
 *
 * The plan requires every dark-only grayscale colour class to be replaced with
 * a light-mode base plus a `dark:` override. PhaseBadge is a simple, focused
 * component that exercises this requirement for the gray palette.
 *
 * These tests will fail until PhaseBadge.tsx is updated.
 */
import { describe, it, expect, afterEach } from "vitest";
import { render, screen, cleanup } from "@testing-library/react";
import { PhaseBadge } from "../components/PhaseBadge";

afterEach(cleanup);

describe("PhaseBadge: system theme colours", () => {
  describe("Draft phase", () => {
    it("uses a light-mode background base with a dark override", () => {
      // Given / When
      render(<PhaseBadge phase="Draft" />);
      const badge = screen.getByText("Draft");

      // Then: light background is visible in light mode, dark variant in dark mode
      expect(badge.className).toMatch(/\bbg-gray-100\/50\b/);
      expect(badge.className).toMatch(/\bdark:bg-gray-800\/50\b/);
    });

    it("uses a light-mode text colour base with a dark override", () => {
      // Given / When
      render(<PhaseBadge phase="Draft" />);
      const badge = screen.getByText("Draft");

      // Then
      expect(badge.className).toMatch(/\btext-gray-600\b/);
      expect(badge.className).toMatch(/\bdark:text-gray-400\b/);
    });
  });

  describe("Completed phase", () => {
    it("uses a light-mode background base with a dark override", () => {
      // Given / When
      render(<PhaseBadge phase="Completed" />);
      const badge = screen.getByText("Completed");

      // Then
      expect(badge.className).toMatch(/\bbg-gray-200\/50\b/);
      expect(badge.className).toMatch(/\bdark:bg-gray-700\/50\b/);
    });

    it("uses a light-mode text colour base with a dark override", () => {
      // Given / When
      render(<PhaseBadge phase="Completed" />);
      const badge = screen.getByText("Completed");

      // Then
      expect(badge.className).toMatch(/\btext-gray-800\b/);
      expect(badge.className).toMatch(/\bdark:text-gray-300\b/);
    });
  });

  describe("coloured phases remain readable in both modes", () => {
    it.each([
      ["Planned", "bg-blue-900/50"],
      ["Running", "bg-green-900/50"],
      ["Failed", "bg-red-900/50"],
      ["Awaiting Approval", "bg-yellow-900/50"],
      ["Awaiting Input", "bg-amber-900/50"],
      ["Suspended", "bg-orange-900/50"],
    ] as const)("%s keeps its dark background variant", (phase, expectedDarkBg) => {
      // Given / When
      render(<PhaseBadge phase={phase} />);
      const badge = screen.getByText(phase);

      // Then: coloured backgrounds rely on opacity and keep a dark variant
      expect(badge.className).toMatch(new RegExp(`\\b${expectedDarkBg.replace("/", "\\/")}\\b`));
    });
  });
});