process.env.JWT_SECRET = process.env.JWT_SECRET || 'test-secret' process.env.SECRET_ENC_KEY = process.env.SECRET_ENC_KEY || 'unit-test-enc-key' process.env.DB_HOST = '127.0.0.1' process.env.DB_PORT = '59999' const { test, after } = require('node:test') const assert = require('node:assert/strict') const registry = require('../src/auth/providers/registry') const authProvidersModel = require('../src/model/authProviders/authProviders.model') const db = require('../src/utils/db') after(() => db.close()) test('validateConfig: built-in needs client_id + secret', () => { assert.equal(registry.validateConfig({ kind: 'google', client_id: 'x', client_secret_enc: 'e' }).valid, true) assert.deepEqual(registry.validateConfig({ kind: 'google', client_id: 'x' }).missing, ['client_secret']) assert.deepEqual(registry.validateConfig({ kind: 'google' }).missing, ['client_id', 'client_secret']) }) test('validateConfig: custom OIDC also needs the endpoint URLs', () => { const complete = { kind: 'oidc', client_id: 'x', client_secret_enc: 'e', authorize_url: 'a', token_url: 't', userinfo_url: 'u', } assert.equal(registry.validateConfig(complete).valid, true) const noUrls = { kind: 'oidc', client_id: 'x', client_secret_enc: 'e' } assert.deepEqual(registry.validateConfig(noUrls).missing, ['authorize_url', 'token_url', 'userinfo_url']) }) test('listConfigured always includes both built-ins with health', async () => { authProvidersModel.list = async () => [] // no rows yet const out = await registry.listConfigured() const ids = out.map((p) => p.id) assert.deepEqual(ids, ['google', 'discord']) assert.equal(out[0].builtin, true) assert.equal(out[0].enabled, 0) assert.equal(out[0].health.valid, false) // unconfigured }) test('listEnabledValid returns only enabled+valid, shaped and sorted by priority', async () => { authProvidersModel.list = async () => [ { id: 'discord', kind: 'discord', name: 'Discord', enabled: 1, client_id: 'd', client_secret_enc: 'e', priority: 2 }, { id: 'google', kind: 'google', name: 'Google', enabled: 1, client_id: 'g', client_secret_enc: 'e', priority: 1 }, { id: 'brokenidp', kind: 'oidc', name: 'Broken', enabled: 1, client_id: 'x', client_secret_enc: 'e', priority: 0 }, // missing URLs → hidden { id: 'authentik', kind: 'oidc', name: 'Authentik', enabled: 0, client_id: 'x', client_secret_enc: 'e', authorize_url: 'a', token_url: 't', userinfo_url: 'u', priority: 3 }, // disabled → hidden ] const out = await registry.listEnabledValid() assert.deepEqual(out.map((p) => p.id), ['google', 'discord']) // sorted by priority, broken/disabled excluded assert.deepEqual(out[0], { id: 'google', name: 'Google', icon: 'google', loginUrl: '/api/v1/auth/sso/google/start', priority: 1, }) })