mirror of
https://github.com/n8n-io/n8n.git
synced 2025-03-05 20:50:17 -08:00
fix(core): Handle zero execution statistics on metrics collection during license renewal (#8463)
This commit is contained in:
parent
2fba0e8d58
commit
db48bdd6d1
|
@ -61,7 +61,7 @@ export class UsageMetricsRepository extends Repository<UsageMetrics> {
|
||||||
`)) as Row[];
|
`)) as Row[];
|
||||||
|
|
||||||
const toNumber = (value: string | number) =>
|
const toNumber = (value: string | number) =>
|
||||||
typeof value === 'number' ? value : parseInt(value, 10);
|
(typeof value === 'number' ? value : parseInt(value, 10)) || 0;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
enabledUsers: toNumber(enabledUsers),
|
enabledUsers: toNumber(enabledUsers),
|
||||||
|
|
|
@ -2,27 +2,24 @@ import { UsageMetricsRepository } from '@/databases/repositories/usageMetrics.re
|
||||||
import { createAdmin, createMember, createOwner, createUser } from './shared/db/users';
|
import { createAdmin, createMember, createOwner, createUser } from './shared/db/users';
|
||||||
import * as testDb from './shared/testDb';
|
import * as testDb from './shared/testDb';
|
||||||
import Container from 'typedi';
|
import Container from 'typedi';
|
||||||
import { CredentialsRepository } from '@/databases/repositories/credentials.repository';
|
|
||||||
import { createManyWorkflows } from './shared/db/workflows';
|
import { createManyWorkflows } from './shared/db/workflows';
|
||||||
import { createManyCredentials } from './shared/db/credentials';
|
import { createManyCredentials } from './shared/db/credentials';
|
||||||
import { WorkflowStatisticsRepository } from '@/databases/repositories/workflowStatistics.repository';
|
import { WorkflowStatisticsRepository } from '@/databases/repositories/workflowStatistics.repository';
|
||||||
import { StatisticsNames } from '@/databases/entities/WorkflowStatistics';
|
import { StatisticsNames } from '@/databases/entities/WorkflowStatistics';
|
||||||
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
|
|
||||||
|
|
||||||
describe('UsageMetricsRepository', () => {
|
describe('UsageMetricsRepository', () => {
|
||||||
let usageMetricsRepository: UsageMetricsRepository;
|
let usageMetricsRepository: UsageMetricsRepository;
|
||||||
let credentialsRepository: CredentialsRepository;
|
|
||||||
let workflowStatisticsRepository: WorkflowStatisticsRepository;
|
let workflowStatisticsRepository: WorkflowStatisticsRepository;
|
||||||
let workflowRepository: WorkflowRepository;
|
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
await testDb.init();
|
await testDb.init();
|
||||||
|
|
||||||
usageMetricsRepository = Container.get(UsageMetricsRepository);
|
usageMetricsRepository = Container.get(UsageMetricsRepository);
|
||||||
credentialsRepository = Container.get(CredentialsRepository);
|
|
||||||
workflowStatisticsRepository = Container.get(WorkflowStatisticsRepository);
|
|
||||||
workflowRepository = Container.get(WorkflowRepository);
|
|
||||||
|
|
||||||
|
workflowStatisticsRepository = Container.get(WorkflowStatisticsRepository);
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
await testDb.truncate(['User', 'Credentials', 'Workflow', 'Execution', 'WorkflowStatistics']);
|
await testDb.truncate(['User', 'Credentials', 'Workflow', 'Execution', 'WorkflowStatistics']);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -74,5 +71,20 @@ describe('UsageMetricsRepository', () => {
|
||||||
manualExecutions: 2,
|
manualExecutions: 2,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('should handle zero execution statistics correctly', async () => {
|
||||||
|
await Promise.all([createOwner(), createManyWorkflows(3, { active: true })]);
|
||||||
|
|
||||||
|
const metrics = await usageMetricsRepository.getLicenseRenewalMetrics();
|
||||||
|
|
||||||
|
expect(metrics).toStrictEqual({
|
||||||
|
enabledUsers: 1,
|
||||||
|
totalCredentials: 0,
|
||||||
|
totalWorkflows: 3,
|
||||||
|
activeWorkflows: 3,
|
||||||
|
productionExecutions: 0, // not NaN
|
||||||
|
manualExecutions: 0, // not NaN
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue