Files
doktainer-upstream/tests/backend/container-capabilities.test.ts
T

118 lines
4.3 KiB
TypeScript

import assert from "node:assert/strict";
import { describe, it } from "node:test";
import { buildContainerCapabilities } from "../../src/server/services/container-capabilities.service";
describe("container capabilities", () => {
it("keeps an imported manual container readable without inventing deployment actions", () => {
const capabilities = buildContainerCapabilities({
sourceType: "MANUAL",
deployMode: null,
hasDeploymentSource: false,
hasGitSource: false,
hasAppInstall: false,
hasDeploymentHistory: false,
redeployAvailable: false,
rollbackAvailable: false,
});
assert.equal(capabilities.managed, false);
assert.equal(capabilities.managementLabel, "Docker import");
assert.equal(capabilities.editConfiguration.available, true);
assert.equal(capabilities.redeploy.available, false);
assert.equal(capabilities.rebuild.available, false);
assert.equal(capabilities.rollback.available, false);
});
it("enables supported actions for a tracked Git single-container deployment", () => {
const capabilities = buildContainerCapabilities({
sourceType: "GIT_PROVIDER",
deployMode: "DOCKERFILE",
hasDeploymentSource: true,
hasGitSource: true,
hasAppInstall: false,
hasDeploymentHistory: true,
redeployAvailable: true,
rollbackAvailable: true,
});
assert.equal(capabilities.managed, true);
assert.equal(capabilities.managementLabel, "Doktainer managed");
assert.equal(capabilities.redeploy.available, true);
assert.equal(capabilities.rebuild.available, true);
assert.equal(capabilities.rebuild.mode, "ORCHESTRATED_SINGLE_CONTAINER");
assert.equal(capabilities.rollback.available, true);
});
it("labels Compose rebuild honestly and blocks per-container configuration editing", () => {
const capabilities = buildContainerCapabilities({
sourceType: "GIT_CLONE",
deployMode: "COMPOSE",
hasDeploymentSource: true,
hasGitSource: true,
hasAppInstall: false,
hasDeploymentHistory: true,
redeployAvailable: false,
rollbackAvailable: false,
});
assert.equal(capabilities.editConfiguration.available, false);
assert.match(capabilities.editConfiguration.reason ?? "", /Compose project/);
assert.equal(capabilities.rebuild.available, true);
assert.equal(capabilities.rebuild.mode, "COMPOSE_RECREATE");
assert.match(capabilities.rebuild.reason ?? "", /not a safe/);
});
it("does not expose rebuild when source metadata is incomplete", () => {
const capabilities = buildContainerCapabilities({
sourceType: "GIT_CLONE",
deployMode: "DOCKERFILE",
hasDeploymentSource: true,
hasGitSource: false,
hasAppInstall: false,
hasDeploymentHistory: false,
redeployAvailable: false,
rollbackAvailable: false,
});
assert.equal(capabilities.rebuild.available, false);
assert.equal(capabilities.rebuild.mode, null);
assert.match(capabilities.rebuild.reason ?? "", /missing or incomplete/);
});
it("supports App Installer rebuild without pretending that redeploy is available", () => {
const capabilities = buildContainerCapabilities({
sourceType: "APP_INSTALLER",
deployMode: null,
hasDeploymentSource: false,
hasGitSource: false,
hasAppInstall: true,
hasDeploymentHistory: true,
redeployAvailable: false,
rollbackAvailable: false,
});
assert.equal(capabilities.managed, true);
assert.equal(capabilities.rebuild.available, true);
assert.equal(capabilities.rebuild.mode, "ORCHESTRATED_SINGLE_CONTAINER");
assert.equal(capabilities.redeploy.available, false);
});
it("keeps redeploy and rollback eligibility independent", () => {
const capabilities = buildContainerCapabilities({
sourceType: "MANUAL",
deployMode: null,
hasDeploymentSource: false,
hasGitSource: false,
hasAppInstall: false,
hasDeploymentHistory: true,
redeployAvailable: true,
rollbackAvailable: false,
});
assert.equal(capabilities.managementLabel, "Doktainer managed");
assert.equal(capabilities.redeploy.available, true);
assert.equal(capabilities.rollback.available, false);
assert.equal(capabilities.rebuild.available, false);
});
});