Files
sofa/lib/config.test.ts
T
jake 4cf326fa00 Add comprehensive test suite with CI workflow
- 211 tests across 15 files covering services (tracking, discovery,
  metadata, backup, credits, webhooks, settings, update-check, colors,
  person), utilities (config, cron, providers, title-theme), and TMDB
  image URL helpers
- `lib/test-preload.ts` + `bunfig.toml` wire up a global in-memory
  SQLite DB with migrations for all DB-backed tests
- `lib/test-utils.ts` provides `clearAllTables()` and seed helpers
  (insertUser, insertTitle, insertTvShow, insertMovieWatch, etc.)
- Export `getBackupSource`, `isKnownBackup`, `isValidBackupFilename`,
  `buildBackupCron`, `performUpdateCheck` internals for direct testing
- GitHub Actions workflow runs `bun test --coverage` on push/PR to main
2026-03-06 13:42:58 -05:00

179 lines
5.2 KiB
TypeScript

import { afterEach, describe, expect, test } from "bun:test";
import {
getOidcProviderName,
isOidcAutoRegisterEnabled,
isOidcConfigured,
isPasswordLoginDisabled,
isTmdbConfigured,
} from "./config";
describe("isTmdbConfigured", () => {
const orig = process.env.TMDB_API_READ_ACCESS_TOKEN;
afterEach(() => {
if (orig !== undefined) {
process.env.TMDB_API_READ_ACCESS_TOKEN = orig;
} else {
delete process.env.TMDB_API_READ_ACCESS_TOKEN;
}
});
test("returns true when token is set", () => {
process.env.TMDB_API_READ_ACCESS_TOKEN = "some-token";
expect(isTmdbConfigured()).toBe(true);
});
test("returns false when token is unset", () => {
delete process.env.TMDB_API_READ_ACCESS_TOKEN;
expect(isTmdbConfigured()).toBe(false);
});
test("returns false when token is empty string", () => {
process.env.TMDB_API_READ_ACCESS_TOKEN = "";
expect(isTmdbConfigured()).toBe(false);
});
});
describe("isOidcConfigured", () => {
const origId = process.env.OIDC_CLIENT_ID;
const origSecret = process.env.OIDC_CLIENT_SECRET;
const origIssuer = process.env.OIDC_ISSUER_URL;
afterEach(() => {
for (const [key, val] of [
["OIDC_CLIENT_ID", origId],
["OIDC_CLIENT_SECRET", origSecret],
["OIDC_ISSUER_URL", origIssuer],
] as const) {
if (val !== undefined) {
process.env[key] = val;
} else {
delete process.env[key];
}
}
});
test("returns true when all three vars are set", () => {
process.env.OIDC_CLIENT_ID = "id";
process.env.OIDC_CLIENT_SECRET = "secret";
process.env.OIDC_ISSUER_URL = "https://issuer.example.com";
expect(isOidcConfigured()).toBe(true);
});
test("returns false when client ID is missing", () => {
delete process.env.OIDC_CLIENT_ID;
process.env.OIDC_CLIENT_SECRET = "secret";
process.env.OIDC_ISSUER_URL = "https://issuer.example.com";
expect(isOidcConfigured()).toBe(false);
});
test("returns false when client secret is missing", () => {
process.env.OIDC_CLIENT_ID = "id";
delete process.env.OIDC_CLIENT_SECRET;
process.env.OIDC_ISSUER_URL = "https://issuer.example.com";
expect(isOidcConfigured()).toBe(false);
});
test("returns false when issuer URL is missing", () => {
process.env.OIDC_CLIENT_ID = "id";
process.env.OIDC_CLIENT_SECRET = "secret";
delete process.env.OIDC_ISSUER_URL;
expect(isOidcConfigured()).toBe(false);
});
});
describe("getOidcProviderName", () => {
const orig = process.env.OIDC_PROVIDER_NAME;
afterEach(() => {
if (orig !== undefined) {
process.env.OIDC_PROVIDER_NAME = orig;
} else {
delete process.env.OIDC_PROVIDER_NAME;
}
});
test("returns custom name when set", () => {
process.env.OIDC_PROVIDER_NAME = "Okta";
expect(getOidcProviderName()).toBe("Okta");
});
test("returns 'SSO' as default", () => {
delete process.env.OIDC_PROVIDER_NAME;
expect(getOidcProviderName()).toBe("SSO");
});
});
describe("isOidcAutoRegisterEnabled", () => {
const orig = process.env.OIDC_AUTO_REGISTER;
afterEach(() => {
if (orig !== undefined) {
process.env.OIDC_AUTO_REGISTER = orig;
} else {
delete process.env.OIDC_AUTO_REGISTER;
}
});
test("returns true by default", () => {
delete process.env.OIDC_AUTO_REGISTER;
expect(isOidcAutoRegisterEnabled()).toBe(true);
});
test("returns false when explicitly set to 'false'", () => {
process.env.OIDC_AUTO_REGISTER = "false";
expect(isOidcAutoRegisterEnabled()).toBe(false);
});
test("returns true for any other value", () => {
process.env.OIDC_AUTO_REGISTER = "true";
expect(isOidcAutoRegisterEnabled()).toBe(true);
});
});
describe("isPasswordLoginDisabled", () => {
const origDisable = process.env.DISABLE_PASSWORD_LOGIN;
const origId = process.env.OIDC_CLIENT_ID;
const origSecret = process.env.OIDC_CLIENT_SECRET;
const origIssuer = process.env.OIDC_ISSUER_URL;
afterEach(() => {
for (const [key, val] of [
["DISABLE_PASSWORD_LOGIN", origDisable],
["OIDC_CLIENT_ID", origId],
["OIDC_CLIENT_SECRET", origSecret],
["OIDC_ISSUER_URL", origIssuer],
] as const) {
if (val !== undefined) {
process.env[key] = val;
} else {
delete process.env[key];
}
}
});
test("returns true when flag is 'true' and OIDC is configured", () => {
process.env.DISABLE_PASSWORD_LOGIN = "true";
process.env.OIDC_CLIENT_ID = "id";
process.env.OIDC_CLIENT_SECRET = "secret";
process.env.OIDC_ISSUER_URL = "https://issuer.example.com";
expect(isPasswordLoginDisabled()).toBe(true);
});
test("returns false when flag is 'true' but OIDC is not configured", () => {
process.env.DISABLE_PASSWORD_LOGIN = "true";
delete process.env.OIDC_CLIENT_ID;
delete process.env.OIDC_CLIENT_SECRET;
delete process.env.OIDC_ISSUER_URL;
expect(isPasswordLoginDisabled()).toBe(false);
});
test("returns false when flag is not set", () => {
delete process.env.DISABLE_PASSWORD_LOGIN;
process.env.OIDC_CLIENT_ID = "id";
process.env.OIDC_CLIENT_SECRET = "secret";
process.env.OIDC_ISSUER_URL = "https://issuer.example.com";
expect(isPasswordLoginDisabled()).toBe(false);
});
});