import { describe, it, expect, beforeEach, afterEach } from 'vitest' import { getDb, setDbPathForTest } from '../../server/utils/db.js' import { hashPassword } from '../../server/utils/password.js' import { validateCotAuth } from '../../server/utils/cotAuth.js' describe('cotAuth', () => { beforeEach(async () => { setDbPathForTest(':memory:') const { run } = await getDb() const now = new Date().toISOString() await run( 'INSERT INTO users (id, identifier, password_hash, role, created_at, auth_provider, oidc_issuer, oidc_sub) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', ['local-1', 'localuser', hashPassword('webpass'), 'member', now, 'local', null, null], ) await run( 'INSERT INTO users (id, identifier, password_hash, role, created_at, auth_provider, oidc_issuer, oidc_sub, cot_password_hash) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)', ['oidc-1', 'oidcuser', null, 'member', now, 'oidc', 'https://idp', 'sub-1', hashPassword('atakpass')], ) await run( 'INSERT INTO users (id, identifier, password_hash, role, created_at, auth_provider, oidc_issuer, oidc_sub, cot_password_hash) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)', ['oidc-2', 'nopass', null, 'member', now, 'oidc', 'https://idp', 'sub-2', null], ) }) afterEach(() => { setDbPathForTest(null) }) it('validates local user with correct password', async () => { const ok = await validateCotAuth('localuser', 'webpass') expect(ok).toBe(true) }) it('rejects local user with wrong password', async () => { const ok = await validateCotAuth('localuser', 'wrong') expect(ok).toBe(false) }) it('validates OIDC user with correct ATAK password', async () => { const ok = await validateCotAuth('oidcuser', 'atakpass') expect(ok).toBe(true) }) it('rejects OIDC user with wrong ATAK password', async () => { const ok = await validateCotAuth('oidcuser', 'wrong') expect(ok).toBe(false) }) it('rejects OIDC user who has not set ATAK password', async () => { const ok = await validateCotAuth('nopass', 'any') expect(ok).toBe(false) }) it('rejects unknown identifier', async () => { const ok = await validateCotAuth('nobody', 'x') expect(ok).toBe(false) }) it('rejects empty identifier', async () => { const ok = await validateCotAuth('', 'x') expect(ok).toBe(false) }) })