Ctrl K
ComunidadGuías…

scripts/prepareClientSettings.test.js

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
const assert = require("node:assert/strict");
const { mkdtempSync, readFileSync, rmSync, writeFileSync, mkdirSync } = require("node:fs");
const os = require("node:os");
const path = require("node:path");
const test = require("node:test");

const prepareClientSettings = require("./prepareClientSettings");
const template = readFileSync(path.join(__dirname, "../client/src/config/settings.template.js"), "utf8");
const oldHosts = `export const API_HOST = import.meta.env.PROD
  ? import.meta.env.VITE_APP_API_HOST
  : (import.meta.env.VITE_APP_API_HOST_DEV || "http://localhost:4019");

export const SITE_HOST = import.meta.env.PROD
  ? import.meta.env.VITE_APP_CLIENT_HOST
  : (import.meta.env.VITE_APP_CLIENT_HOST_DEV || "http://localhost:4018");
`;
const newHosts = `export const API_HOST = import.meta.env.VITE_APP_API_HOST || "http://localhost:4019";

export const SITE_HOST = import.meta.env.VITE_APP_CLIENT_HOST || "http://localhost:4018";
`;

function fixture(t, settings) {
  const directory = mkdtempSync(path.join(os.tmpdir(), "chartbrew-settings-"));
  t.after(() => rmSync(directory, { recursive: true, force: true }));
  writeFileSync(path.join(directory, "settings.template.js"), template);
  if (settings !== undefined) writeFileSync(path.join(directory, "settings.js"), settings);
  return directory;
}

test("creates missing settings from the current template", (t) => {
  const directory = fixture(t);
  prepareClientSettings(directory);
  assert.equal(readFileSync(path.join(directory, "settings.js"), "utf8"), template);
});

for (const newline of ["\n", "\r\n"]) {
  test(`updates old hosts and preserves custom settings with ${JSON.stringify(newline)} line endings`, (t) => {
    const custom = '// Keep this installation setting.\nexport const CUSTOM_HOST = "https://example.com";\n';
    const directory = fixture(t, (oldHosts + custom).replaceAll("\n", newline));
    prepareClientSettings(directory);
    const expected = (newHosts + custom).replaceAll("\n", newline);
    assert.equal(readFileSync(path.join(directory, "settings.js"), "utf8"), expected);
    prepareClientSettings(directory);
    assert.equal(readFileSync(path.join(directory, "settings.js"), "utf8"), expected);
  });
}

test("preserves custom host definitions and warns about remaining old variables", (t) => {
  const custom = oldHosts.replace("localhost:4019", "localhost:3210");
  const directory = fixture(t, custom);
  const warning = t.mock.method(console, "warn", () => {});
  prepareClientSettings(directory);
  const result = readFileSync(path.join(directory, "settings.js"), "utf8");
  assert.equal(result, custom.slice(0, custom.indexOf("export const SITE_HOST"))
    + newHosts.slice(newHosts.indexOf("export const SITE_HOST")));
  assert.equal(warning.mock.calls.length, 1);
  assert.match(warning.mock.calls[0].arguments[0], /Update these definitions manually/);
});

test("leaves current and fully custom settings unchanged", (t) => {
  const settings = template.replace('"http://localhost:4019"', '"https://api.example.com"')
    + '\nexport const CUSTOM_SETTING = true;\n';
  const directory = fixture(t, settings);
  const warning = t.mock.method(console, "warn", () => {});
  prepareClientSettings(directory);
  assert.equal(readFileSync(path.join(directory, "settings.js"), "utf8"), settings);
  assert.equal(warning.mock.calls.length, 0);
});

test("reports read errors instead of replacing existing settings", (t) => {
  const directory = fixture(t);
  mkdirSync(path.join(directory, "settings.js"));
  assert.throws(() => prepareClientSettings(directory), { code: "EISDIR" });
});