Files
renovate/lib/modules/manager/smithy/extract.spec.ts
Sebastian Poxhofer 87088344a2 feat(managers): add support for the Smithy framework (#44737)
* feat: add support for smithy framework

* docs: remove comment and exclude from schema validation

* docs: use relativ link
2026-07-22 07:50:04 +00:00

278 lines
7.4 KiB
TypeScript

import { codeBlock } from 'common-tags';
import { extractPackageFile } from './index.ts';
const packageFile = 'smithy-build.json';
describe('modules/manager/smithy/extract', () => {
describe('extractPackageFile()', () => {
it('returns null for empty content', () => {
expect(extractPackageFile('', packageFile)).toBeNull();
});
it('returns null for malformed JSON', () => {
expect(extractPackageFile('malformed json}}}', packageFile)).toBeNull();
});
it('returns null when maven is not an object', () => {
const content = codeBlock`
{
"version": "1.0",
"maven": "invalid"
}
`;
expect(extractPackageFile(content, packageFile)).toBeNull();
});
it('returns null when dependencies is not an array', () => {
const content = codeBlock`
{
"version": "1.0",
"maven": {
"dependencies": "software.amazon.smithy:smithy-aws-traits:1.37.0"
}
}
`;
expect(extractPackageFile(content, packageFile)).toBeNull();
});
it('returns null when there is no maven section', () => {
const content = codeBlock`
{
"version": "1.0",
"sources": ["model"]
}
`;
expect(extractPackageFile(content, packageFile)).toBeNull();
});
it('returns null when only repositories are defined', () => {
const content = codeBlock`
{
"version": "1.0",
"maven": {
"repositories": [{ "url": "https://repo.example.com/maven" }]
}
}
`;
expect(extractPackageFile(content, packageFile)).toBeNull();
});
it('returns null for an empty dependencies array', () => {
const content = codeBlock`
{
"version": "1.0",
"maven": {
"dependencies": []
}
}
`;
expect(extractPackageFile(content, packageFile)).toBeNull();
});
it('extracts dependencies from a file with comments', () => {
const content = codeBlock`
{
"version": "1.0",
"maven": {
// dependencies used for code generation
"dependencies": [
"software.amazon.smithy:smithy-aws-traits:1.37.0"
]
}
}
`;
expect(extractPackageFile(content, packageFile)).toEqual({
deps: [
{
depName: 'software.amazon.smithy:smithy-aws-traits',
currentValue: '1.37.0',
datasource: 'maven',
},
],
});
});
it('extracts multiple dependencies including version ranges', () => {
const content = codeBlock`
{
"version": "1.0",
"maven": {
"dependencies": [
"software.amazon.smithy:smithy-aws-traits:1.37.0",
"software.amazon.smithy:smithy-model:[1.0,2.0)"
]
}
}
`;
expect(extractPackageFile(content, packageFile)).toEqual({
deps: [
{
depName: 'software.amazon.smithy:smithy-aws-traits',
currentValue: '1.37.0',
datasource: 'maven',
},
{
depName: 'software.amazon.smithy:smithy-model',
currentValue: '[1.0,2.0)',
datasource: 'maven',
},
],
});
});
it('skips dependencies with variables or invalid coordinates', () => {
const content = codeBlock`
{
"version": "1.0",
"maven": {
"dependencies": [
"software.amazon.smithy:smithy-aws-traits:\${SMITHY_VERSION}",
"\${GROUP_ID}:smithy-model:1.0.0",
"software.amazon.smithy:smithy-cli",
"software.amazon.smithy:smithy-build:",
"single",
"group:artifact:1.0.0:classifier",
":artifact:1.0.0",
"group::1.0.0"
]
}
}
`;
expect(extractPackageFile(content, packageFile)).toEqual({
deps: [
{
depName: 'software.amazon.smithy:smithy-aws-traits',
datasource: 'maven',
skipReason: 'contains-variable',
},
{
depName: '${GROUP_ID}:smithy-model:1.0.0',
skipReason: 'contains-variable',
},
{
depName: 'software.amazon.smithy:smithy-cli',
datasource: 'maven',
skipReason: 'unspecified-version',
},
{
depName: 'software.amazon.smithy:smithy-build',
datasource: 'maven',
skipReason: 'unspecified-version',
},
{
depName: 'single',
skipReason: 'invalid-dependency-specification',
},
{
depName: 'group:artifact:1.0.0:classifier',
skipReason: 'invalid-dependency-specification',
},
{
depName: ':artifact:1.0.0',
skipReason: 'invalid-dependency-specification',
},
{
depName: 'group::1.0.0',
skipReason: 'invalid-dependency-specification',
},
],
});
});
it('drops non-string dependency entries', () => {
const content = codeBlock`
{
"version": "1.0",
"maven": {
"dependencies": [
42,
{},
"software.amazon.smithy:smithy-aws-traits:1.37.0"
]
}
}
`;
expect(extractPackageFile(content, packageFile)).toEqual({
deps: [
{
depName: 'software.amazon.smithy:smithy-aws-traits',
currentValue: '1.37.0',
datasource: 'maven',
},
],
});
});
it('extracts registry urls from repositories', () => {
const content = codeBlock`
{
"version": "1.0",
"maven": {
"dependencies": [
"software.amazon.smithy:smithy-aws-traits:1.37.0"
],
"repositories": [
{ "url": "https://repo.example.com/maven" },
{
"url": "https://other.example.com/maven",
"httpCredentials": "user:\${PASSWORD}"
},
{ "id": "no-url" },
{ "url": "https://\${PRIVATE_HOST}/maven" }
]
}
}
`;
expect(extractPackageFile(content, packageFile)).toEqual({
deps: [
{
depName: 'software.amazon.smithy:smithy-aws-traits',
currentValue: '1.37.0',
datasource: 'maven',
},
],
registryUrls: [
'https://repo.example.com/maven',
'https://other.example.com/maven',
],
});
});
it('omits registry urls when all repository urls contain variables', () => {
const content = codeBlock`
{
"version": "1.0",
"maven": {
"dependencies": [
"software.amazon.smithy:smithy-aws-traits:1.37.0"
],
"repositories": [
{ "url": "https://\${PRIVATE_HOST}/maven" }
]
}
}
`;
expect(extractPackageFile(content, packageFile)).toEqual({
deps: [
{
depName: 'software.amazon.smithy:smithy-aws-traits',
currentValue: '1.37.0',
datasource: 'maven',
},
],
});
});
});
});