BareGit
const test = require("node:test");
const assert = require("node:assert/strict");
const logic = require("../static/card_form_logic.js");

test("remote images require absolute HTTP or HTTPS URLs", function()
{
    assert.equal(logic.validRemoteImageUrl("https://example.test/card.png"),
                 true);
    assert.equal(logic.validRemoteImageUrl("http://example.test/card.png"),
                 true);
    assert.equal(logic.validRemoteImageUrl("javascript:alert(1)"), false);
    assert.equal(logic.validRemoteImageUrl("/card.png"), false);
});

test("thumbnail decisions use actions and resulting finish", function()
{
    assert.equal(logic.foilThumbnailRequired({
        mode: "edit",
        front_action: "keep",
        foil_action: "keep",
        has_current_foil: true,
        has_replacement_foil: false,
    }), false);
    assert.equal(logic.foilThumbnailRequired({
        mode: "edit",
        front_action: "replace",
        foil_action: "keep",
        has_current_foil: true,
        has_replacement_foil: false,
    }), true);
    assert.equal(logic.foilThumbnailRequired({
        mode: "edit",
        front_action: "keep",
        foil_action: "remove",
        has_current_foil: true,
        has_replacement_foil: false,
    }), false);
});

test("source input state follows mode and replacements", function()
{
    assert.deepEqual(logic.sourceInputState({
        mode: "create",
        source_mode: "files",
        front_action: "replace",
        foil_action: "replace",
    }), {
        front_file_enabled: true,
        foil_file_enabled: true,
        front_url_enabled: false,
        foil_url_enabled: false,
        front_required: true,
        foil_required: false,
    });
    assert.deepEqual(logic.sourceInputState({
        mode: "edit",
        source_mode: "urls",
        front_action: "keep",
        foil_action: "replace",
    }), {
        front_file_enabled: false,
        foil_file_enabled: false,
        front_url_enabled: false,
        foil_url_enabled: true,
        front_required: false,
        foil_required: true,
    });
});

test("game selection enables only matching controls and series", function()
{
    assert.equal(logic.gameControlEnabled("gh", "gh"), true);
    assert.equal(logic.gameControlEnabled("gh", "other"), false);
    assert.equal(logic.gameControlEnabled("", "gh"), false);
    assert.equal(logic.seriesChoiceEnabled("gh", "gh"), true);
    assert.equal(logic.seriesChoiceEnabled("gh", "other"), false);
    assert.equal(logic.seriesChoiceEnabled("", ""), false);
});