fix: TypeScript compilation errors in test-automator generated tests

Fixed 29 TypeScript compilation errors in test files:

**breaking-change-detector.test.ts** (22 errors):
- Added missing `nodeType`, `fromVersion`, `toVersion` to BreakingChange objects
- All 22 BreakingChange object instantiations now comply with interface

**node-migration-service.test.ts** (3 errors):
- Added type assertions for dynamic property assignment in tests
- Lines 310, 396, 519: `(node as any).property = value`

**workflow-versioning-service.test.ts** (5 errors):
- Fixed N8nApiClient constructor: takes config object, not separate params
- Fixed updateWorkflow mock: returns Workflow object, not undefined

All tests now compile successfully with `npm run typecheck`.

Conceived by Romuald Członkowski - www.aiadvisors.pl/en

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
czlonkowski
2025-10-24 12:16:20 +02:00
parent aaa6be6d74
commit bc156fce2a
3 changed files with 74 additions and 8 deletions

View File

@@ -39,6 +39,9 @@ describe('BreakingChangeDetector', () => {
describe('analyzeVersionUpgrade', () => {
it('should combine registry and dynamic changes', async () => {
const registryChange: BreakingChangesRegistry.BreakingChange = {
nodeType: 'nodes-base.httpRequest',
fromVersion: '1.0',
toVersion: '2.0',
propertyName: 'registryProp',
changeType: 'removed',
isBreaking: true,
@@ -66,6 +69,9 @@ describe('BreakingChangeDetector', () => {
it('should detect breaking changes', async () => {
const breakingChange: BreakingChangesRegistry.BreakingChange = {
nodeType: 'nodes-base.httpRequest',
fromVersion: '1.0',
toVersion: '2.0',
propertyName: 'criticalProp',
changeType: 'removed',
isBreaking: true,
@@ -86,6 +92,9 @@ describe('BreakingChangeDetector', () => {
it('should calculate auto-migratable and manual counts', async () => {
const changes: BreakingChangesRegistry.BreakingChange[] = [
{
nodeType: 'nodes-base.httpRequest',
fromVersion: '1.0',
toVersion: '2.0',
propertyName: 'autoProp',
changeType: 'added',
isBreaking: false,
@@ -95,6 +104,9 @@ describe('BreakingChangeDetector', () => {
migrationStrategy: { type: 'add_property', defaultValue: null }
},
{
nodeType: 'nodes-base.httpRequest',
fromVersion: '1.0',
toVersion: '2.0',
propertyName: 'manualProp',
changeType: 'requirement_changed',
isBreaking: true,
@@ -116,6 +128,9 @@ describe('BreakingChangeDetector', () => {
it('should determine overall severity', async () => {
const highSeverityChange: BreakingChangesRegistry.BreakingChange = {
nodeType: 'nodes-base.httpRequest',
fromVersion: '1.0',
toVersion: '2.0',
propertyName: 'criticalProp',
changeType: 'removed',
isBreaking: true,
@@ -136,6 +151,9 @@ describe('BreakingChangeDetector', () => {
it('should generate recommendations', async () => {
const changes: BreakingChangesRegistry.BreakingChange[] = [
{
nodeType: 'nodes-base.httpRequest',
fromVersion: '1.0',
toVersion: '2.0',
propertyName: 'prop1',
changeType: 'removed',
isBreaking: true,
@@ -145,6 +163,9 @@ describe('BreakingChangeDetector', () => {
migrationStrategy: { type: 'remove_property' }
},
{
nodeType: 'nodes-base.httpRequest',
fromVersion: '1.0',
toVersion: '2.0',
propertyName: 'prop2',
changeType: 'requirement_changed',
isBreaking: true,
@@ -306,6 +327,9 @@ describe('BreakingChangeDetector', () => {
describe('change merging and deduplication', () => {
it('should prioritize registry changes over dynamic', async () => {
const registryChange: BreakingChangesRegistry.BreakingChange = {
nodeType: 'nodes-base.httpRequest',
fromVersion: '1.0',
toVersion: '2.0',
propertyName: 'sharedProp',
changeType: 'removed',
isBreaking: true,
@@ -334,6 +358,9 @@ describe('BreakingChangeDetector', () => {
it('should sort changes by severity', async () => {
const changes: BreakingChangesRegistry.BreakingChange[] = [
{
nodeType: 'nodes-base.httpRequest',
fromVersion: '1.0',
toVersion: '2.0',
propertyName: 'lowProp',
changeType: 'added',
isBreaking: false,
@@ -343,6 +370,9 @@ describe('BreakingChangeDetector', () => {
migrationStrategy: { type: 'add_property', defaultValue: null }
},
{
nodeType: 'nodes-base.httpRequest',
fromVersion: '1.0',
toVersion: '2.0',
propertyName: 'highProp',
changeType: 'removed',
isBreaking: true,
@@ -352,6 +382,9 @@ describe('BreakingChangeDetector', () => {
migrationStrategy: undefined
},
{
nodeType: 'nodes-base.httpRequest',
fromVersion: '1.0',
toVersion: '2.0',
propertyName: 'medProp',
changeType: 'renamed',
isBreaking: true,
@@ -375,6 +408,9 @@ describe('BreakingChangeDetector', () => {
describe('hasBreakingChanges', () => {
it('should return true when breaking changes exist', () => {
const breakingChange: BreakingChangesRegistry.BreakingChange = {
nodeType: 'nodes-base.httpRequest',
fromVersion: '1.0',
toVersion: '2.0',
propertyName: 'prop',
changeType: 'removed',
isBreaking: true,
@@ -404,6 +440,9 @@ describe('BreakingChangeDetector', () => {
it('should return list of changed property names', () => {
const changes: BreakingChangesRegistry.BreakingChange[] = [
{
nodeType: 'nodes-base.httpRequest',
fromVersion: '1.0',
toVersion: '2.0',
propertyName: 'prop1',
changeType: 'added',
isBreaking: false,
@@ -413,6 +452,9 @@ describe('BreakingChangeDetector', () => {
migrationStrategy: undefined
},
{
nodeType: 'nodes-base.httpRequest',
fromVersion: '1.0',
toVersion: '2.0',
propertyName: 'prop2',
changeType: 'removed',
isBreaking: true,
@@ -443,6 +485,9 @@ describe('BreakingChangeDetector', () => {
it('should recommend safe upgrade when no breaking changes', async () => {
const changes: BreakingChangesRegistry.BreakingChange[] = [
{
nodeType: 'nodes-base.httpRequest',
fromVersion: '1.0',
toVersion: '2.0',
propertyName: 'prop',
changeType: 'added',
isBreaking: false,
@@ -465,6 +510,9 @@ describe('BreakingChangeDetector', () => {
it('should warn about breaking changes', async () => {
const changes: BreakingChangesRegistry.BreakingChange[] = [
{
nodeType: 'nodes-base.httpRequest',
fromVersion: '1.0',
toVersion: '2.0',
propertyName: 'prop',
changeType: 'removed',
isBreaking: true,
@@ -486,6 +534,9 @@ describe('BreakingChangeDetector', () => {
it('should list manual changes required', async () => {
const changes: BreakingChangesRegistry.BreakingChange[] = [
{
nodeType: 'nodes-base.httpRequest',
fromVersion: '1.0',
toVersion: '2.0',
propertyName: 'manualProp',
changeType: 'requirement_changed',
isBreaking: true,
@@ -538,6 +589,9 @@ describe('BreakingChangeDetector', () => {
it('should return HIGH when any change is HIGH severity', async () => {
const changes: BreakingChangesRegistry.BreakingChange[] = [
{
nodeType: 'nodes-base.httpRequest',
fromVersion: '1.0',
toVersion: '2.0',
propertyName: 'lowProp',
changeType: 'added',
isBreaking: false,
@@ -547,6 +601,9 @@ describe('BreakingChangeDetector', () => {
migrationStrategy: undefined
},
{
nodeType: 'nodes-base.httpRequest',
fromVersion: '1.0',
toVersion: '2.0',
propertyName: 'highProp',
changeType: 'removed',
isBreaking: true,
@@ -568,6 +625,9 @@ describe('BreakingChangeDetector', () => {
it('should return MEDIUM when no HIGH but has MEDIUM', async () => {
const changes: BreakingChangesRegistry.BreakingChange[] = [
{
nodeType: 'nodes-base.httpRequest',
fromVersion: '1.0',
toVersion: '2.0',
propertyName: 'lowProp',
changeType: 'added',
isBreaking: false,
@@ -577,6 +637,9 @@ describe('BreakingChangeDetector', () => {
migrationStrategy: undefined
},
{
nodeType: 'nodes-base.httpRequest',
fromVersion: '1.0',
toVersion: '2.0',
propertyName: 'medProp',
changeType: 'renamed',
isBreaking: true,
@@ -598,6 +661,9 @@ describe('BreakingChangeDetector', () => {
it('should return LOW when all changes are LOW severity', async () => {
const changes: BreakingChangesRegistry.BreakingChange[] = [
{
nodeType: 'nodes-base.httpRequest',
fromVersion: '1.0',
toVersion: '2.0',
propertyName: 'prop',
changeType: 'added',
isBreaking: false,

View File

@@ -307,7 +307,7 @@ describe('NodeMigrationService', () => {
describe('removeProperty migration', () => {
it('should remove deprecated property', async () => {
const node = createMockNode('node-1', 'nodes-base.httpRequest', 1, {});
node.oldField = 'value';
(node as any).oldField = 'value';
const mockAnalysis: VersionUpgradeAnalysis = {
nodeType: 'nodes-base.httpRequest',
@@ -393,7 +393,7 @@ describe('NodeMigrationService', () => {
describe('renameProperty migration', () => {
it('should rename property', async () => {
const node = createMockNode('node-1', 'nodes-base.httpRequest', 1, {});
node.oldName = 'value';
(node as any).oldName = 'value';
const mockAnalysis: VersionUpgradeAnalysis = {
nodeType: 'nodes-base.httpRequest',
@@ -516,7 +516,7 @@ describe('NodeMigrationService', () => {
it('should not overwrite existing value', async () => {
const node = createMockNode('node-1', 'nodes-base.httpRequest', 1, {});
node.field = 'existing';
(node as any).field = 'existing';
const mockAnalysis: VersionUpgradeAnalysis = {
nodeType: 'nodes-base.httpRequest',

View File

@@ -38,7 +38,7 @@ describe('WorkflowVersioningService', () => {
beforeEach(() => {
vi.clearAllMocks();
mockRepository = new NodeRepository({} as any);
mockApiClient = new N8nApiClient('http://test', 'test-key');
mockApiClient = new N8nApiClient({ baseUrl: 'http://test', apiKey: 'test-key' });
service = new WorkflowVersioningService(mockRepository, mockApiClient);
});
@@ -221,7 +221,7 @@ describe('WorkflowVersioningService', () => {
vi.spyOn(mockRepository, 'createWorkflowVersion').mockReturnValue(4);
vi.spyOn(mockRepository, 'pruneWorkflowVersions').mockReturnValue(0);
vi.spyOn(mockApiClient, 'getWorkflow').mockResolvedValue(createMockWorkflow('workflow-1', 'Current'));
vi.spyOn(mockApiClient, 'updateWorkflow').mockResolvedValue(undefined);
vi.spyOn(mockApiClient, 'updateWorkflow').mockResolvedValue(createMockWorkflow('workflow-1', 'Restored'));
const result = await service.restoreVersion('workflow-1', undefined, false);
@@ -266,7 +266,7 @@ describe('WorkflowVersioningService', () => {
vi.spyOn(mockRepository, 'createWorkflowVersion').mockReturnValue(2);
vi.spyOn(mockRepository, 'pruneWorkflowVersions').mockReturnValue(0);
vi.spyOn(mockApiClient, 'getWorkflow').mockResolvedValue(createMockWorkflow('workflow-1', 'Current'));
vi.spyOn(mockApiClient, 'updateWorkflow').mockResolvedValue(undefined);
vi.spyOn(mockApiClient, 'updateWorkflow').mockResolvedValue(createMockWorkflow('workflow-1', 'Restored'));
const mockValidator = vi.fn();
vi.spyOn(WorkflowValidator.prototype, 'validateWorkflow').mockImplementation(mockValidator);
@@ -285,7 +285,7 @@ describe('WorkflowVersioningService', () => {
vi.spyOn(mockRepository, 'createWorkflowVersion').mockReturnValue(3);
vi.spyOn(mockRepository, 'pruneWorkflowVersions').mockReturnValue(0);
vi.spyOn(mockApiClient, 'getWorkflow').mockResolvedValue(currentWorkflow);
vi.spyOn(mockApiClient, 'updateWorkflow').mockResolvedValue(undefined);
vi.spyOn(mockApiClient, 'updateWorkflow').mockResolvedValue(createMockWorkflow('workflow-1', 'Restored'));
const result = await service.restoreVersion('workflow-1', 1, false);
@@ -322,7 +322,7 @@ describe('WorkflowVersioningService', () => {
vi.spyOn(mockRepository, 'createWorkflowVersion').mockReturnValue(3);
vi.spyOn(mockRepository, 'pruneWorkflowVersions').mockReturnValue(0);
vi.spyOn(mockApiClient, 'getWorkflow').mockResolvedValue(createMockWorkflow('workflow-1', 'Current'));
vi.spyOn(mockApiClient, 'updateWorkflow').mockResolvedValue(undefined);
vi.spyOn(mockApiClient, 'updateWorkflow').mockResolvedValue(createMockWorkflow('workflow-1', 'Restored'));
const result = await service.restoreVersion('workflow-1', 1, false);