openreader/tests/unit/signup-policy.spec.ts
Richard R 522540452c feat(auth): add runtime toggle for user sign-ups and enforce signup policy
Introduce `enableUserSignups` runtime setting to allow administrators to control
whether new accounts can be created. Update environment variable and documentation
references to support this feature. UI elements for account creation are now
conditionally rendered based on this flag. Signup attempts are blocked server-side
when disabled, including email, OAuth, and anonymous upgrades.

Add `assertUserSignupAllowed` utility for consistent enforcement and corresponding
unit tests to verify policy behavior.
2026-05-14 12:47:05 -06:00

33 lines
1.4 KiB
TypeScript

import { expect, test } from '@playwright/test';
import { RUNTIME_CONFIG_SCHEMA } from '../../src/lib/server/admin/settings';
import { assertUserSignupAllowed } from '../../src/lib/server/auth/signup-policy';
test.describe('enableUserSignups runtime config', () => {
test('defaults to enabled', () => {
expect(RUNTIME_CONFIG_SCHEMA.enableUserSignups.default).toBe(true);
});
test('parses first-boot env seed values', () => {
expect(RUNTIME_CONFIG_SCHEMA.enableUserSignups.parseEnv('true')).toBe(true);
expect(RUNTIME_CONFIG_SCHEMA.enableUserSignups.parseEnv('false')).toBe(false);
expect(RUNTIME_CONFIG_SCHEMA.enableUserSignups.parseEnv('1')).toBe(true);
expect(RUNTIME_CONFIG_SCHEMA.enableUserSignups.parseEnv('0')).toBe(false);
});
});
test.describe('signup policy enforcement', () => {
test('allows new non-anonymous users when signups are enabled', () => {
expect(() => assertUserSignupAllowed({ enableUserSignups: true, isAnonymous: false })).not.toThrow();
});
test('blocks new non-anonymous users when signups are disabled', () => {
expect(() => assertUserSignupAllowed({ enableUserSignups: false, isAnonymous: false })).toThrow(
/sign-ups are disabled/i,
);
});
test('does not block anonymous-session user creation when signups are disabled', () => {
expect(() => assertUserSignupAllowed({ enableUserSignups: false, isAnonymous: true })).not.toThrow();
});
});