mirror of
https://github.com/n8n-io/n8n.git
synced 2025-03-05 20:50:17 -08:00
wip: add pagination
This commit is contained in:
parent
70e069910a
commit
3f6cd794a8
|
@ -1,8 +1,10 @@
|
||||||
|
import type { FindManyOptions } from '@n8n/typeorm';
|
||||||
import { DataSource, Repository } from '@n8n/typeorm';
|
import { DataSource, Repository } from '@n8n/typeorm';
|
||||||
import { Service } from 'typedi';
|
import { Service } from 'typedi';
|
||||||
|
|
||||||
import type { AggregatedTestRunMetrics } from '@/databases/entities/test-run.ee';
|
import type { AggregatedTestRunMetrics } from '@/databases/entities/test-run.ee';
|
||||||
import { TestRun } from '@/databases/entities/test-run.ee';
|
import { TestRun } from '@/databases/entities/test-run.ee';
|
||||||
|
import type { ListQuery } from '@/requests';
|
||||||
|
|
||||||
@Service()
|
@Service()
|
||||||
export class TestRunRepository extends Repository<TestRun> {
|
export class TestRunRepository extends Repository<TestRun> {
|
||||||
|
@ -26,4 +28,18 @@ export class TestRunRepository extends Repository<TestRun> {
|
||||||
public async markAsCompleted(id: string, metrics: AggregatedTestRunMetrics) {
|
public async markAsCompleted(id: string, metrics: AggregatedTestRunMetrics) {
|
||||||
return await this.update(id, { status: 'completed', completedAt: new Date(), metrics });
|
return await this.update(id, { status: 'completed', completedAt: new Date(), metrics });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async getMany(testDefinitionId: string, options: ListQuery.Options) {
|
||||||
|
const findManyOptions: FindManyOptions<TestRun> = {
|
||||||
|
where: { testDefinition: { id: testDefinitionId } },
|
||||||
|
order: { createdAt: 'DESC' },
|
||||||
|
};
|
||||||
|
|
||||||
|
if (options?.take) {
|
||||||
|
findManyOptions.skip = options.skip;
|
||||||
|
findManyOptions.take = options.take;
|
||||||
|
}
|
||||||
|
|
||||||
|
return await this.find(findManyOptions);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,7 +112,7 @@ export class TestMetricsController {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Delete('/:testDefinitionId/metrics/:id')
|
@Delete('/:testDefinitionId/metrics/:id')
|
||||||
async delete(req: TestMetricsRequest.GetOne) {
|
async delete(req: TestMetricsRequest.Delete) {
|
||||||
const { id: metricId, testDefinitionId } = req.params;
|
const { id: metricId, testDefinitionId } = req.params;
|
||||||
|
|
||||||
await this.getTestDefinition(req);
|
await this.getTestDefinition(req);
|
||||||
|
|
|
@ -5,6 +5,7 @@ import { TestRunsRequest } from '@/evaluation/test-definitions.types.ee';
|
||||||
import { getSharedWorkflowIds } from '@/public-api/v1/handlers/workflows/workflows.service';
|
import { getSharedWorkflowIds } from '@/public-api/v1/handlers/workflows/workflows.service';
|
||||||
|
|
||||||
import { TestDefinitionService } from './test-definition.service.ee';
|
import { TestDefinitionService } from './test-definition.service.ee';
|
||||||
|
import { listQueryMiddleware } from '@/middlewares';
|
||||||
|
|
||||||
@RestController('/evaluation/test-definitions')
|
@RestController('/evaluation/test-definitions')
|
||||||
export class TestRunsController {
|
export class TestRunsController {
|
||||||
|
@ -32,15 +33,13 @@ export class TestRunsController {
|
||||||
return testDefinition;
|
return testDefinition;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Get('/:testDefinitionId/runs')
|
@Get('/:testDefinitionId/runs', { middlewares: listQueryMiddleware })
|
||||||
async getMany(req: TestRunsRequest.GetMany) {
|
async getMany(req: TestRunsRequest.GetMany) {
|
||||||
const { testDefinitionId } = req.params;
|
const { testDefinitionId } = req.params;
|
||||||
|
|
||||||
await this.getTestDefinition(req);
|
await this.getTestDefinition(req);
|
||||||
|
|
||||||
return await this.testRunRepository.find({
|
return await this.testRunRepository.getMany(testDefinitionId, req.listQueryOptions);
|
||||||
where: { testDefinition: { id: testDefinitionId } },
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Get('/:testDefinitionId/runs/:id')
|
@Get('/:testDefinitionId/runs/:id')
|
||||||
|
@ -59,7 +58,7 @@ export class TestRunsController {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Delete('/:testDefinitionId/runs/:id')
|
@Delete('/:testDefinitionId/runs/:id')
|
||||||
async delete(req: TestRunsRequest.GetOne) {
|
async delete(req: TestRunsRequest.Delete) {
|
||||||
const { id: testRunId, testDefinitionId } = req.params;
|
const { id: testRunId, testDefinitionId } = req.params;
|
||||||
|
|
||||||
await this.getTestDefinition(req);
|
await this.getTestDefinition(req);
|
||||||
|
|
|
@ -84,6 +84,46 @@ describe('GET /evaluation/test-definitions/:testDefinitionId/runs', () => {
|
||||||
}),
|
}),
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('should retrieve list of runs for a test definition with pagination', async () => {
|
||||||
|
const testRunRepository = Container.get(TestRunRepository);
|
||||||
|
const testRun1 = await testRunRepository.createTestRun(testDefinition.id);
|
||||||
|
// Mark as running just to make a slight delay between the runs
|
||||||
|
await testRunRepository.markAsRunning(testRun1.id);
|
||||||
|
const testRun2 = await testRunRepository.createTestRun(testDefinition.id);
|
||||||
|
|
||||||
|
// Fetch the first page
|
||||||
|
const resp = await authOwnerAgent.get(
|
||||||
|
`/evaluation/test-definitions/${testDefinition.id}/runs?take=1`,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(resp.statusCode).toBe(200);
|
||||||
|
expect(resp.body.data).toEqual([
|
||||||
|
expect.objectContaining({
|
||||||
|
id: testRun2.id,
|
||||||
|
status: 'new',
|
||||||
|
testDefinitionId: testDefinition.id,
|
||||||
|
runAt: null,
|
||||||
|
completedAt: null,
|
||||||
|
}),
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Fetch the second page
|
||||||
|
const resp2 = await authOwnerAgent.get(
|
||||||
|
`/evaluation/test-definitions/${testDefinition.id}/runs?take=1&skip=1`,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(resp2.statusCode).toBe(200);
|
||||||
|
expect(resp2.body.data).toEqual([
|
||||||
|
expect.objectContaining({
|
||||||
|
id: testRun1.id,
|
||||||
|
status: 'running',
|
||||||
|
testDefinitionId: testDefinition.id,
|
||||||
|
runAt: expect.any(String),
|
||||||
|
completedAt: null,
|
||||||
|
}),
|
||||||
|
]);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('GET /evaluation/test-definitions/:testDefinitionId/runs/:id', () => {
|
describe('GET /evaluation/test-definitions/:testDefinitionId/runs/:id', () => {
|
||||||
|
|
Loading…
Reference in a new issue