Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
127 changes: 127 additions & 0 deletions shared/src/spectral/functions/architecture/ids-are-unique.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
import { idsAreUnique } from './ids-are-unique';

describe('idsAreUnique', () => {
it('should return an empty array when there is no input', () => {
const input = null;
const context = {
document: {
data: {
}
}
};

const result = idsAreUnique(input, null, context);
expect(result).toEqual([]);
});

it('should return an empty array when there are no duplicate IDs', () => {
const input = {};
const context = {
document: {
data: {
nodes: [
{
'unique-id': 'node1',
'interfaces': [{'unique-id': 'intf1'}]
},
{
'unique-id': 'node2'
}
],
relationships: [
{'unique-id': 'rel1'},
{'unique-id': 'rel2'}
]
}
}
};

const result = idsAreUnique(input, null, context);
expect(result).toEqual([]);
});

it('should return messages for duplicate IDs within nodes', () => {
const input = {};
const context = {
document: {
data: {
nodes: [
{'unique-id': 'node1'},
{'unique-id': 'node1'}
]
}
}
};

const result = idsAreUnique(input, null, context);
expect(result.length).toBeGreaterThan(0);
expect(result[0].message).toContain('Duplicate unique-id detected. ID: node1, path: /nodes/1/unique-id');
});

it('should return messages for duplicate IDs within relationships', () => {
const input = {};
const context = {
document: {
data: {
relationships: [
{'unique-id': 'rel1'},
{'unique-id': 'rel1'}
]
}
}
};

const result = idsAreUnique(input, null, context);
expect(result.length).toBeGreaterThan(0);
expect(result[0].message).toContain('Duplicate unique-id detected. ID: rel1, path: /relationships/1/unique-id');
});


it('should return messages for duplicate IDs within interfaces', () => {
const input = {};
const context = {
document: {
data: {
nodes: [
{
'unique-id': 'node1',
'interfaces': [{'unique-id': 'intf1'}]
},
{
'unique-id': 'node2',
'interfaces': [{'unique-id': 'intf1'}]
}
]
}
}
};

const result = idsAreUnique(input, null, context);
expect(result.length).toBeGreaterThan(0);
expect(result[0].message).toContain('Duplicate unique-id detected. ID: intf1, path: /nodes/1/interfaces/0/unique-id');
});



it('should return messages for duplicate IDs across unique-ids', () => {
const input = {};
const context = {
document: {
data: {
nodes: [
{'unique-id': 'node1'},
{'unique-id': 'node2'}
],
relationships: [
{'unique-id': 'node1'},
{'unique-id': 'rel2'}
]
}
}
};

const result = idsAreUnique(input, null, context);
expect(result.length).toBeGreaterThan(0);
expect(result[0].message).toContain('Duplicate unique-id detected. ID: node1, path: /relationships/0/unique-id');
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,4 @@ export function idsAreUnique(input, _, context) {
detectDuplicates(interfaceIdMatches, seenIds, messages);

return messages;
};
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
import { interfaceIdExistsOnNode } from './interface-id-exists-on-node';

describe('interfaceIdExistsOnNode', () => {
it('should return an empty array when there is no input', () => {
const input = null;
const context = {
document: {
data: {}
}
};

const result = interfaceIdExistsOnNode(input, null, context);
expect(result).toEqual([]);
});

it('should return an empty array when input has no interfaces', () => {
const input = {};
const context = {
document: {
data: {}
}
};

const result = interfaceIdExistsOnNode(input, null, context);
expect(result).toEqual([]);
});

it('should return a message when input is a connect relationship missing a node', () => {
const input = { interfaces: ['intf1'] };
const context = {
document: {
data: {}
},
path: ['/relationships/0/connects/destination']
};

const result = interfaceIdExistsOnNode(input, null, context);
expect(result.length).toBe(1);
expect(result[0].message).toBe('Invalid connects relationship - no node defined.');
expect(result[0].path).toEqual(['/relationships/0/connects/destination']);
});

it('should return an empty array when the node and interface exists', () => {
const input = { node: 'node1', interfaces: ['intf1'] };
const context = {
document: {
data: {
nodes: [
{
'unique-id': 'node1',
'interfaces': [
{'unique-id': 'intf1'} // will match this interface
]
}
]
}
}
};

const result = interfaceIdExistsOnNode(input, null, context);
expect(result).toEqual([]);
});

it('should return a message when the target node has no interfaces', () => {
const input = { node: 'node1', interfaces: ['intf2'] };
const context = {
document: {
data: {
nodes: [{'unique-id': 'node1'}]
}
},
path: ['/relationships/0/connects/destination']
};

const result = interfaceIdExistsOnNode(input, null, context);
expect(result.length).toBe(1);
expect(result[0].message).toBe(`Node with unique-id ${input.node} has no interfaces defined, expected interfaces [${input.interfaces}].`);
});

it('should return a message when the interface does not exist', () => {
const input = { node: 'node1', interfaces: ['intf2'] };
const context = {
document: {
data: {
nodes: [
{
'unique-id': 'node1',
'interfaces': [
{'unique-id': 'intf1'}
]
}
]
}
},
path: ['/relationships/0/connects/destination']
};

const result = interfaceIdExistsOnNode(input, null, context);
expect(result.length).toBe(1);
expect(result[0].message).toBe(`Referenced interface with ID '${input.interfaces[0]}' was not defined on the node with ID '${input.node}'.`);
expect(result[0].path).toEqual(['/relationships/0/connects/destination']);
});

it('should return a message when one interface does not exist', () => {
const input = { node: 'node1', interfaces: ['intf1', 'intf2'] };
const context = {
document: {
data: {
nodes: [
{
'unique-id': 'node1',
'interfaces': [
{'unique-id': 'intf1'}
]
}
]
}
},
path: ['/relationships/0/connects/destination']
};

const result = interfaceIdExistsOnNode(input, null, context);
expect(result.length).toBe(1);
expect(result[0].message).toBe(`Referenced interface with ID '${input.interfaces[1]}' was not defined on the node with ID '${input.node}'.`);
expect(result[0].path).toEqual(['/relationships/0/connects/destination']);
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import { interfaceIdExists } from './interface-id-exists';

describe('interfaceIdExists', () => {
it('should return an empty array when there is no input', () => {
const input = null;
const context = {
document: {
data: {}
}
};

const result = interfaceIdExists(input, null, context);
expect(result).toEqual([]);
});

it('should return an empty array when the ID exists', () => {
const input = 'intf1';
const context = {
document: {
data: {
nodes: [
{
'unique-id': 'node1',
interfaces: [
{'unique-id': 'intf1'}
]
}
]
}
}
};

const result = interfaceIdExists(input, null, context);
expect(result).toEqual([]);
});

it('should return a message when the ID does not exist', () => {
const input = 'intf2';
const context = {
document: {
data: {
nodes: [
{
'unique-id': 'node1',
interfaces: [
{'unique-id': 'intf1'}
]
}
]
}
},
path: ['/relationships/0/connects/destination/interface']
};

const result = interfaceIdExists(input, null, context);
expect(result.length).toBe(1);
expect(result[0].message).toBe(`'${input}' does not refer to the unique-id of an existing interface.`);
expect(result[0].path).toEqual(['/relationships/0/connects/destination/interface']);
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import { nodeIdExists } from './node-id-exists';

describe('nodeIdExists', () => {
it('should return an empty array when there is no input', () => {
const input = null;
const context = {
document: {
data: {}
}
};

const result = nodeIdExists(input, null, context);
expect(result).toEqual([]);
});

it('should return an empty array when the ID exists', () => {
const input = 'node1';
const context = {
document: {
data: {
nodes: [
{'unique-id': 'node1'}
]
}
}
};

const result = nodeIdExists(input, null, context);
expect(result).toEqual([]);
});

it('should return a message when the ID does not exist', () => {
const input = 'node2';
const context = {
document: {
data: {
nodes: [
{'unique-id': 'node1'}
]
}
},
path: ['/relationships/0/connects/destination']
};

const result = nodeIdExists(input, null, context);
expect(result.length).toBe(1);
expect(result[0].message).toBe(`'${input}' does not refer to the unique-id of an existing node.`);
expect(result[0].path).toEqual(['/relationships/0/connects/destination']);
});
});
Loading
Loading