This repository has no description
Something went wrong. Try again.
3.8 kB · 104 lines
TypeScript
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105// SPDX-License-Identifier: AGPL-3.0-or-later
import {afterEach, describe, expect, it, vi} from 'vitest';import {setCassandraQueryExecutorForTesting} from '../database/CassandraQueryExecution';import type {PreparedQuery} from '../database/CassandraTypes';import {InMemoryCassandraQueryExecutor} from '../test/InMemoryCassandraQueryExecutor';import {MockKVProvider} from '../test/mocks/MockKVProvider';import { INSTANCE_CONFIG_REFRESH_CHANNEL, InstanceConfigRepository, type InstanceRegistrationConfig,} from './InstanceConfigRepository';
class CountingInMemoryCassandraQueryExecutor extends InMemoryCassandraQueryExecutor { instanceConfigSelects = 0;
override async executeQuery<T = Record<string, unknown>>(query: PreparedQuery): Promise<Array<T>> { if (query.kvMeta?.action === 'select' && query.kvMeta.table.name === 'instance_configuration') { this.instanceConfigSelects++; } return super.executeQuery<T>(query); }}
describe('InstanceConfigRepository', () => { const repositories: Array<InstanceConfigRepository> = [];
afterEach(() => { for (const repository of repositories) { repository.shutdown(); } repositories.length = 0; });
function createRepository(kvProvider: MockKVProvider): InstanceConfigRepository { const repository = new InstanceConfigRepository(kvProvider); repositories.push(repository); return repository; }
it('serves repeated config reads from the hydrated in-memory cache', async () => { const executor = new CountingInMemoryCassandraQueryExecutor(); setCassandraQueryExecutorForTesting(executor); const kvProvider = new MockKVProvider(); const repository = createRepository(kvProvider);
await repository.setRegistrationConfig({mode: 'closed'}); executor.instanceConfigSelects = 0;
expect(await repository.getRegistrationConfig()).toEqual({ mode: 'closed', admin_registration_urls_enabled: true, } satisfies InstanceRegistrationConfig); expect(await repository.getRegistrationConfig()).toEqual({ mode: 'closed', admin_registration_urls_enabled: true, } satisfies InstanceRegistrationConfig); expect(executor.instanceConfigSelects).toBe(0); expect(kvProvider.getSubscription().subscribedChannels).toContain(INSTANCE_CONFIG_REFRESH_CHANNEL); });
it('refreshes a hydrated cache after another repository publishes a config update', async () => { const executor = new CountingInMemoryCassandraQueryExecutor(); setCassandraQueryExecutorForTesting(executor); const kvProvider = new MockKVProvider(); const reader = createRepository(kvProvider); const writer = createRepository(kvProvider);
expect(await reader.getRegistrationConfig()).toEqual({ mode: 'open', admin_registration_urls_enabled: true, } satisfies InstanceRegistrationConfig);
await writer.setRegistrationConfig({mode: 'approval'});
await vi.waitFor(async () => { expect(await reader.getRegistrationConfig()).toEqual({ mode: 'approval', admin_registration_urls_enabled: true, } satisfies InstanceRegistrationConfig); }); });
it('uses the registration URL id as the admin-visible registration code', async () => { const executor = new CountingInMemoryCassandraQueryExecutor(); setCassandraQueryExecutorForTesting(executor); const kvProvider = new MockKVProvider(); const repository = createRepository(kvProvider);
const created = await repository.createRegistrationUrl({ label: 'Support invite', createdByUserId: '1500000000000000000', expiresAt: null, maxUses: null, approvalRequired: false, });
expect(created.code).toBe(created.registrationUrl.id); expect(created.registrationUrl).not.toHaveProperty('code_hash'); await expect(repository.resolveRegistrationUrlCode(created.registrationUrl.id)).resolves.toMatchObject({ id: created.registrationUrl.id, }); });});