import assert from "node:assert/strict";
import { test } from "node:test";

import { validateReleaseCandidateRecord } from "../../scripts/lib/release-candidate.mjs";

function fixture() {
  return {
    app_version: "0.0.0",
    browsers: [
      {
        brand: "Google Chrome",
        executable_sha256: "A".repeat(64),
        file_name: "chrome.exe",
        full_version: "150.0.7871.187",
        major: 150,
        source: "installed_executable",
      },
      {
        brand: "Microsoft Edge",
        executable_sha256: "B".repeat(64),
        file_name: "msedge.exe",
        full_version: "151.0.4129.59",
        major: 151,
        source: "installed_executable",
      },
    ],
    build_commit: "c".repeat(40),
    candidate_package: {
      file_name: "Dada-P0A-0.0.0-win-x64.zip",
      fixed_port: 43121,
      release_status: "candidate_unvalidated",
      sha256: "D".repeat(64),
      size_bytes: 123,
    },
    final_release: false,
    fixed_port: 43121,
    recorded_at: "2026-08-04T05:00:00.000Z",
    schema_version: "1.0",
    status: "candidate_unvalidated",
    windows: { arch: "x64", build: "26200.8875", display_version: "25H2" },
  };
}

test("accepts a sanitized candidate record with two installed browser versions", () => {
  assert.equal(validateReleaseCandidateRecord(fixture()).status, "candidate_unvalidated");
});

test("rejects a candidate that claims to be the final release", () => {
  assert.throws(
    () => validateReleaseCandidateRecord({ ...fixture(), final_release: true, status: "passed" }),
    /final_release|status/,
  );
});

test("rejects browser paths and mismatched major versions", () => {
  const record = fixture();
  record.browsers[0] = { ...record.browsers[0], executable_path: "C:\\Users\\person\\chrome.exe", major: 149 };
  assert.throws(() => validateReleaseCandidateRecord(record), /major|path/);
});
