yaba-release-cli
Version:
Yaba is a simple CLI tool that helps you manage releases of your Github projects.
204 lines (177 loc) • 6.25 kB
JavaScript
import test from "node:test";
import assert from "node:assert/strict";
import {
buildDefaultConfigTemplate,
resolveReleaseContext
} from "../bin/services/runtime-config-service.js";
test("buildDefaultConfigTemplate includes nullable release target", () => {
const template = buildDefaultConfigTemplate();
assert.equal(template.release.target, null);
assert.equal(template.release.tagPattern, "prod_global_{yyyyMMdd}.{HHmm}");
assert.equal(template.release.tagStrategy, "pattern");
assert.equal(template.release.tagOnConflict, "increment");
assert.equal(template.release.tagMaxAttempts, 20);
assert.equal(template.release.allowEmpty, false);
assert.equal(template.release.failOnEmpty, false);
assert.equal(template.release.maxCommits, null);
assert.deepEqual(template.notifications.providers, ["slack"]);
});
test("buildDefaultConfigTemplate sets noStatusChecks to false", () => {
const template = buildDefaultConfigTemplate();
assert.equal(template.release.noStatusChecks, false);
});
test("resolveReleaseContext applies target precedence from options over config", () => {
const runtimeConfig = buildDefaultConfigTemplate();
runtimeConfig.release.target = "main";
const resolved = resolveReleaseContext(
{
target: "abc123",
releaseName: undefined,
tag: undefined,
draft: undefined,
publish: undefined,
interactive: undefined,
body: undefined
},
runtimeConfig
);
assert.equal(resolved.target, "abc123");
});
test("resolveReleaseContext normalizes notification providers from config", () => {
const runtimeConfig = buildDefaultConfigTemplate();
runtimeConfig.notifications.providers = ["Slack", "slack", " "];
const resolved = resolveReleaseContext(
{
target: undefined,
releaseName: undefined,
tag: undefined,
draft: undefined,
publish: undefined,
interactive: undefined,
body: undefined
},
runtimeConfig
);
assert.deepEqual(resolved.notificationProviders, ["slack"]);
});
test("resolveReleaseContext applies release safety options from flags", () => {
const runtimeConfig = buildDefaultConfigTemplate();
runtimeConfig.release.allowEmpty = false;
runtimeConfig.release.failOnEmpty = false;
runtimeConfig.release.maxCommits = 40;
const resolved = resolveReleaseContext(
{
target: undefined,
releaseName: undefined,
tag: undefined,
draft: undefined,
publish: undefined,
interactive: undefined,
body: undefined,
allowEmpty: true,
failOnEmpty: false,
maxCommits: 25
},
runtimeConfig
);
assert.equal(resolved.allowEmpty, true);
assert.equal(resolved.failOnEmpty, false);
assert.equal(resolved.maxCommits, 25);
});
test("resolveReleaseContext marks invalid maxCommits as NaN", () => {
const runtimeConfig = buildDefaultConfigTemplate();
runtimeConfig.release.maxCommits = "bad";
const resolved = resolveReleaseContext(
{
target: undefined,
releaseName: undefined,
tag: undefined,
draft: undefined,
publish: undefined,
interactive: undefined,
body: undefined,
allowEmpty: undefined,
failOnEmpty: undefined,
maxCommits: undefined
},
runtimeConfig
);
assert.equal(Number.isNaN(resolved.maxCommits), true);
});
test("resolveReleaseContext defaults noStatusChecks to false", () => {
const runtimeConfig = buildDefaultConfigTemplate();
const resolved = resolveReleaseContext(
{
target: undefined,
releaseName: undefined,
tag: undefined,
draft: undefined,
publish: undefined,
interactive: undefined,
body: undefined,
noStatusChecks: undefined
},
runtimeConfig
);
assert.equal(resolved.noStatusChecks, false);
});
test("resolveReleaseContext reads noStatusChecks from config", () => {
const runtimeConfig = buildDefaultConfigTemplate();
runtimeConfig.release.noStatusChecks = true;
const resolved = resolveReleaseContext(
{
target: undefined,
releaseName: undefined,
tag: undefined,
draft: undefined,
publish: undefined,
interactive: undefined,
body: undefined,
noStatusChecks: undefined
},
runtimeConfig
);
assert.equal(resolved.noStatusChecks, true);
});
test("resolveReleaseContext flag takes precedence over config for noStatusChecks", () => {
const runtimeConfig = buildDefaultConfigTemplate();
runtimeConfig.release.noStatusChecks = false;
const resolved = resolveReleaseContext(
{
target: undefined,
releaseName: undefined,
tag: undefined,
draft: undefined,
publish: undefined,
interactive: undefined,
body: undefined,
noStatusChecks: true
},
runtimeConfig
);
assert.equal(resolved.noStatusChecks, true);
});
test("resolveReleaseContext applies tag strategy policy values", () => {
const runtimeConfig = buildDefaultConfigTemplate();
runtimeConfig.release.tagStrategy = "pattern";
runtimeConfig.release.tagOnConflict = "increment";
runtimeConfig.release.tagMaxAttempts = 15;
const resolved = resolveReleaseContext(
{
tagStrategy: "semver",
tagOnConflict: "fail",
tagMaxAttempts: 5,
target: undefined,
releaseName: undefined,
tag: undefined,
draft: undefined,
publish: undefined,
interactive: undefined,
body: undefined
},
runtimeConfig
);
assert.equal(resolved.tagStrategy, "semver");
assert.equal(resolved.tagOnConflict, "fail");
assert.equal(resolved.tagMaxAttempts, 5);
});