test: assert repository metric timestamps come back as dates

This commit is contained in:
Zack
2026-09-16 12:20:47 +01:00
parent 4d0e45e48f
commit 10bb0f9645
4 changed files with 135 additions and 0 deletions
@@ -132,4 +132,32 @@ describe('RepositoryController (e2e)', () => {
describe('DELETE /repository/:id', () => {
it.todo('deletes a repository');
});
describe('repository queries', () => {
it('returns metric timestamps as Date instances', async () => {
const owner = await testUtils.createUser({ name: 'owner' });
const repository = await testUtils.createRepository(owner.id);
await testUtils.setRepositoryMetrics(repository.id);
const repositories = testUtils.getRepositoryRepository();
const row = await repositories.get(repository.id);
expect(row.metrics.lastStarted).toBeInstanceOf(Date);
expect(row.metrics.lastBackup).toBeInstanceOf(Date);
expect(row.metrics.lastSuccessfulBackup).toBeInstanceOf(Date);
expect(typeof row.metrics.sizeBytes).toBe('number');
});
it('returns metric timestamps as Date instances when listing', async () => {
const owner = await testUtils.createUser({ name: 'owner' });
const repository = await testUtils.createRepository(owner.id);
await testUtils.setRepositoryMetrics(repository.id);
const page = await testUtils.getRepositoryRepository().list({ limit: 10 });
expect(page.items).toHaveLength(1);
expect(page.items[0].id).toBe(repository.id);
expect(page.items[0].metrics.lastBackup).toBeInstanceOf(Date);
});
});
});
@@ -1,5 +1,6 @@
import { Kysely } from 'kysely';
import { randomUUID } from 'node:crypto';
import { RepositoryRepository } from 'src/repositories/repository.repository';
import { DB } from 'src/schema';
import { getKyselyConfig } from 'src/utils/database';
@@ -108,6 +109,31 @@ export const testUtils = {
.executeTakeFirstOrThrow();
},
setRepositoryMetrics: (
repositoryId: string,
{
sizeBytes = 4096,
lastStarted = new Date(),
lastBackup = new Date(),
lastSuccessfulBackup = new Date(),
lastBackupDuration = 1234,
}: Partial<{
sizeBytes: number;
lastStarted: Date;
lastBackup: Date;
lastSuccessfulBackup: Date;
lastBackupDuration: number;
}> = {},
) => {
return getDb()
.insertInto('repositoryMetrics')
.values({ id: repositoryId, sizeBytes, lastStarted, lastBackup, lastSuccessfulBackup, lastBackupDuration })
.returningAll()
.executeTakeFirstOrThrow();
},
getRepositoryRepository: () => new RepositoryRepository(getDb()),
getUser: (id: string) => {
return getDb().selectFrom('users').selectAll().where('id', '=', id).executeTakeFirst();
},
@@ -369,4 +369,42 @@ describe('RepositoryController (e2e)', () => {
await expect(testUtils.getRepository(worm.id)).resolves.toEqual(expect.objectContaining({ worm: true }));
});
});
describe('repository queries', () => {
it('returns metric timestamps as Date instances', async () => {
await testUtils.setRepositoryMetrics(repository.id);
await testUtils.setRepositoryMeter(repository.id);
const repositories = testUtils.getRepositoryRepository();
const row = await repositories.get(repository.id);
expect(row.metrics.lastBackup).toBeInstanceOf(Date);
expect(row.metrics.lastSuccessfulBackup).toBeInstanceOf(Date);
expect(typeof row.metrics.sizeBytes).toBe('number');
expect(row.meter.lastUpdated).toBeInstanceOf(Date);
expect(typeof row.meter.sizeBytes).toBe('number');
expect(typeof row.meter.objectCount).toBe('number');
});
it('returns metric timestamps as Date instances for a user listing', async () => {
await testUtils.setRepositoryMetrics(repository.id);
await testUtils.setRepositoryMeter(repository.id);
const [row] = await testUtils.getRepositoryRepository().getByUser(user.id);
expect(row.metrics.lastBackup).toBeInstanceOf(Date);
expect(row.meter.lastUpdated).toBeInstanceOf(Date);
});
it('returns metric timestamps as Date instances for an active ticket', async () => {
await testUtils.setRepositoryMetrics(repository.id);
await testUtils.setRepositoryMeter(repository.id);
const ticket = await testUtils.createActiveTicket(user.id, repository.id, TicketAction.DeleteRepository);
const active = await testUtils.getTicketRepository().getActive(ticket.id, ticket.token);
expect(active?.metrics.lastBackup).toBeInstanceOf(Date);
expect(active?.meter.lastUpdated).toBeInstanceOf(Date);
});
});
});
+43
View File
@@ -4,6 +4,7 @@ import { ConnectionRepository } from 'src/repositories/connection.repository';
import { CryptoRepository } from 'src/repositories/crypto.repository';
import { RepositoryRepository } from 'src/repositories/repository.repository';
import { SessionRepository } from 'src/repositories/session.repository';
import { TicketRepository } from 'src/repositories/ticket.repository';
import { UserRepository } from 'src/repositories/user.repository';
import { DB } from 'src/schema';
import { getKyselyConfig } from 'src/utils/database';
@@ -160,6 +161,48 @@ export const testUtils = {
return getDb().selectFrom('repositories').selectAll().where('id', '=', id).executeTakeFirst();
},
setRepositoryMetrics: (
repositoryId: string,
{
sizeBytes = 4096,
lastStarted = new Date(),
lastBackup = new Date(),
lastSuccessfulBackup = new Date(),
lastBackupDuration = 1234,
}: Partial<{
sizeBytes: number;
lastStarted: Date;
lastBackup: Date;
lastSuccessfulBackup: Date;
lastBackupDuration: number;
}> = {},
) => {
return getDb()
.insertInto('repositoryMetrics')
.values({ id: repositoryId, sizeBytes, lastStarted, lastBackup, lastSuccessfulBackup, lastBackupDuration })
.returningAll()
.executeTakeFirstOrThrow();
},
setRepositoryMeter: (
repositoryId: string,
{
sizeBytes = 8192,
objectCount = 12,
storageClusterCode = 'local-dev',
}: Partial<{ sizeBytes: number; objectCount: number; storageClusterCode: string }> = {},
) => {
return getDb()
.insertInto('repositoryMeter')
.values({ repositoryId, sizeBytes, objectCount, storageClusterCode })
.returningAll()
.executeTakeFirstOrThrow();
},
getRepositoryRepository: () => new RepositoryRepository(getDb()),
getTicketRepository: () => new TicketRepository(getDb()),
createRepository: async (userId: string, name = 'My Repository', worm = false) => {
const db = getDb();
const repositoryRepository = new RepositoryRepository(db);