mirror of
https://github.com/renovatebot/renovate.git
synced 2026-11-01 02:00:10 +00:00
196101a6bb
* chore(deps): update dependency oxlint-tsgolint to v0.25.0 | datasource | package | from | to | | ---------- | --------------- | ------ | ------ | | npm | oxlint-tsgolint | 0.23.0 | 0.25.0 | * chore: fix new no-unnecessary-type-assertion findings Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Sebastian Poxhofer <sebastian.poxhofer@stedi.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
363 lines
12 KiB
TypeScript
363 lines
12 KiB
TypeScript
import { api as elm } from './index.ts';
|
|
|
|
describe('modules/versioning/elm/index', () => {
|
|
describe('isVersion', () => {
|
|
it.each`
|
|
input | expected
|
|
${'1.0.0'} | ${true}
|
|
${'0.19.1'} | ${true}
|
|
${'2.0.0'} | ${true}
|
|
${'1.2.3'} | ${true}
|
|
${'invalid'} | ${false}
|
|
${'1.0'} | ${false}
|
|
${'1'} | ${false}
|
|
${''} | ${false}
|
|
${null} | ${false}
|
|
${undefined} | ${false}
|
|
`('isVersion("$input") === $expected', ({ input, expected }) => {
|
|
expect(elm.isVersion(input)).toBe(expected);
|
|
});
|
|
});
|
|
|
|
describe('isValid', () => {
|
|
it.each`
|
|
input | expected
|
|
${'1.0.0'} | ${true}
|
|
${'1.0.0 <= v < 2.0.0'} | ${true}
|
|
${'0.19.0 <= v < 0.20.0'} | ${true}
|
|
${'1.0.0 <= v < 1.0.1'} | ${true}
|
|
${'invalid'} | ${false}
|
|
${'1.0.0 <= v'} | ${false}
|
|
${'<= v < 2.0.0'} | ${false}
|
|
${'1.0.0 < v < 2.0.0'} | ${false}
|
|
${'1.0.0 <= v <= 2.0.0'} | ${false}
|
|
${'>=1.0.0 <2.0.0'} | ${false}
|
|
${''} | ${false}
|
|
${'2.0.0 <= v < 1.0.0'} | ${false}
|
|
`('isValid("$input") === $expected', ({ input, expected }) => {
|
|
expect(elm.isValid(input)).toBe(expected);
|
|
});
|
|
});
|
|
|
|
describe('isSingleVersion', () => {
|
|
it.each`
|
|
input | expected
|
|
${'1.0.0'} | ${true}
|
|
${'0.19.1'} | ${true}
|
|
${'1.0.0 <= v < 2.0.0'} | ${false}
|
|
${'invalid'} | ${false}
|
|
`('isSingleVersion("$input") === $expected', ({ input, expected }) => {
|
|
expect(elm.isSingleVersion(input)).toBe(expected);
|
|
});
|
|
});
|
|
|
|
describe('isStable', () => {
|
|
it.each`
|
|
input | expected
|
|
${'1.0.0'} | ${true}
|
|
${'2.3.4'} | ${true}
|
|
${'1.0.0-alpha'} | ${false}
|
|
${'1.0.0-beta.1'} | ${false}
|
|
`('isStable("$input") === $expected', ({ input, expected }) => {
|
|
expect(elm.isStable(input)).toBe(expected);
|
|
});
|
|
|
|
it('returns false for invalid version', () => {
|
|
expect(elm.isStable('invalid')).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('isCompatible', () => {
|
|
it.each`
|
|
input | expected
|
|
${'1.0.0'} | ${true}
|
|
${'invalid'} | ${false}
|
|
`('isCompatible("$input") === $expected', ({ input, expected }) => {
|
|
expect(elm.isCompatible(input)).toBe(expected);
|
|
});
|
|
});
|
|
|
|
describe('getMajor/getMinor/getPatch', () => {
|
|
it('extracts version components', () => {
|
|
expect(elm.getMajor('1.2.3')).toBe(1);
|
|
expect(elm.getMinor('1.2.3')).toBe(2);
|
|
expect(elm.getPatch('1.2.3')).toBe(3);
|
|
});
|
|
});
|
|
|
|
describe('equals', () => {
|
|
it.each`
|
|
a | b | expected
|
|
${'1.0.0'} | ${'1.0.0'} | ${true}
|
|
${'1.0.0'} | ${'1.0.1'} | ${false}
|
|
${'2.0.0'} | ${'1.0.0'} | ${false}
|
|
`('equals("$a", "$b") === $expected', ({ a, b, expected }) => {
|
|
expect(elm.equals(a, b)).toBe(expected);
|
|
});
|
|
});
|
|
|
|
describe('isGreaterThan', () => {
|
|
it.each`
|
|
a | b | expected
|
|
${'2.0.0'} | ${'1.0.0'} | ${true}
|
|
${'1.0.1'} | ${'1.0.0'} | ${true}
|
|
${'1.0.0'} | ${'1.0.0'} | ${false}
|
|
${'1.0.0'} | ${'2.0.0'} | ${false}
|
|
`('isGreaterThan("$a", "$b") === $expected', ({ a, b, expected }) => {
|
|
expect(elm.isGreaterThan(a, b)).toBe(expected);
|
|
});
|
|
});
|
|
|
|
describe('sortVersions', () => {
|
|
it('sorts versions correctly', () => {
|
|
expect(elm.sortVersions('1.0.0', '2.0.0')).toBeLessThan(0);
|
|
expect(elm.sortVersions('2.0.0', '1.0.0')).toBeGreaterThan(0);
|
|
expect(elm.sortVersions('1.0.0', '1.0.0')).toBe(0);
|
|
});
|
|
});
|
|
|
|
describe('matches', () => {
|
|
it.each`
|
|
version | range | expected
|
|
${'1.0.0'} | ${'1.0.0'} | ${true}
|
|
${'1.0.1'} | ${'1.0.0'} | ${false}
|
|
${'1.0.0'} | ${'1.0.0 <= v < 2.0.0'} | ${true}
|
|
${'1.5.0'} | ${'1.0.0 <= v < 2.0.0'} | ${true}
|
|
${'1.9.9'} | ${'1.0.0 <= v < 2.0.0'} | ${true}
|
|
${'2.0.0'} | ${'1.0.0 <= v < 2.0.0'} | ${false}
|
|
${'0.9.0'} | ${'1.0.0 <= v < 2.0.0'} | ${false}
|
|
${'0.19.0'} | ${'0.19.0 <= v < 0.20.0'} | ${true}
|
|
${'0.19.1'} | ${'0.19.0 <= v < 0.20.0'} | ${true}
|
|
${'0.20.0'} | ${'0.19.0 <= v < 0.20.0'} | ${false}
|
|
`(
|
|
'matches("$version", "$range") === $expected',
|
|
({ version, range, expected }) => {
|
|
expect(elm.matches(version, range)).toBe(expected);
|
|
},
|
|
);
|
|
|
|
it('returns false for invalid version', () => {
|
|
expect(elm.matches('invalid', '1.0.0 <= v < 2.0.0')).toBe(false);
|
|
});
|
|
|
|
it('returns false for invalid range', () => {
|
|
expect(elm.matches('1.0.0', 'invalid')).toBe(false);
|
|
});
|
|
|
|
it('returns false for malformed range where lower > upper', () => {
|
|
expect(elm.matches('1.5.0', '2.0.0 <= v < 1.0.0')).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('isLessThanRange', () => {
|
|
it.each`
|
|
version | range | expected
|
|
${'0.9.0'} | ${'1.0.0 <= v < 2.0.0'} | ${true}
|
|
${'0.5.0'} | ${'1.0.0 <= v < 2.0.0'} | ${true}
|
|
${'1.0.0'} | ${'1.0.0 <= v < 2.0.0'} | ${false}
|
|
${'1.5.0'} | ${'1.0.0 <= v < 2.0.0'} | ${false}
|
|
${'2.0.0'} | ${'1.0.0 <= v < 2.0.0'} | ${false}
|
|
${'0.9.0'} | ${'1.0.0'} | ${true}
|
|
${'1.0.0'} | ${'1.0.0'} | ${false}
|
|
${'1.1.0'} | ${'1.0.0'} | ${false}
|
|
`(
|
|
'isLessThanRange("$version", "$range") === $expected',
|
|
({ version, range, expected }) => {
|
|
expect(elm.isLessThanRange?.(version, range)).toBe(expected);
|
|
},
|
|
);
|
|
|
|
it('returns false for invalid version', () => {
|
|
expect(elm.isLessThanRange?.('invalid', '1.0.0 <= v < 2.0.0')).toBe(
|
|
false,
|
|
);
|
|
});
|
|
|
|
it('returns false for invalid range', () => {
|
|
expect(elm.isLessThanRange?.('1.0.0', 'invalid')).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('getSatisfyingVersion', () => {
|
|
it.each`
|
|
versions | range | expected
|
|
${['1.0.0', '1.5.0', '2.0.0']} | ${'1.0.0 <= v < 2.0.0'} | ${'1.5.0'}
|
|
${['1.0.0', '1.0.1', '1.0.2']} | ${'1.0.0 <= v < 2.0.0'} | ${'1.0.2'}
|
|
${['0.5.0', '0.9.0']} | ${'1.0.0 <= v < 2.0.0'} | ${null}
|
|
${['2.0.0', '3.0.0']} | ${'1.0.0 <= v < 2.0.0'} | ${null}
|
|
${['1.0.0']} | ${'1.0.0'} | ${'1.0.0'}
|
|
${['1.0.1']} | ${'1.0.0'} | ${null}
|
|
`(
|
|
'getSatisfyingVersion($versions, "$range") === $expected',
|
|
({ versions, range, expected }) => {
|
|
expect(elm.getSatisfyingVersion(versions, range)).toBe(expected);
|
|
},
|
|
);
|
|
});
|
|
|
|
describe('minSatisfyingVersion', () => {
|
|
it.each`
|
|
versions | range | expected
|
|
${['1.0.0', '1.5.0', '2.0.0']} | ${'1.0.0 <= v < 2.0.0'} | ${'1.0.0'}
|
|
${['1.5.0', '1.6.0', '1.7.0']} | ${'1.0.0 <= v < 2.0.0'} | ${'1.5.0'}
|
|
${['0.5.0', '0.9.0']} | ${'1.0.0 <= v < 2.0.0'} | ${null}
|
|
${['2.0.0', '3.0.0']} | ${'1.0.0 <= v < 2.0.0'} | ${null}
|
|
`(
|
|
'minSatisfyingVersion($versions, "$range") === $expected',
|
|
({ versions, range, expected }) => {
|
|
expect(elm.minSatisfyingVersion(versions, range)).toBe(expected);
|
|
},
|
|
);
|
|
});
|
|
|
|
describe('getNewValue', () => {
|
|
describe('exact versions', () => {
|
|
it('replaces exact version with new version', () => {
|
|
expect(
|
|
elm.getNewValue({
|
|
currentValue: '1.0.0',
|
|
rangeStrategy: 'replace',
|
|
newVersion: '1.0.5',
|
|
}),
|
|
).toBe('1.0.5');
|
|
});
|
|
|
|
it('handles bump strategy for exact version', () => {
|
|
expect(
|
|
elm.getNewValue({
|
|
currentValue: '1.0.0',
|
|
rangeStrategy: 'bump',
|
|
newVersion: '2.0.0',
|
|
}),
|
|
).toBe('2.0.0');
|
|
});
|
|
});
|
|
|
|
describe('range constraints', () => {
|
|
it.each`
|
|
currentValue | rangeStrategy | newVersion | expected
|
|
${'1.0.0 <= v < 2.0.0'} | ${'bump'} | ${'1.0.5'} | ${'1.0.5 <= v < 2.0.0'}
|
|
${'1.0.0 <= v < 2.0.0'} | ${'bump'} | ${'2.0.0'} | ${'2.0.0 <= v < 3.0.0'}
|
|
${'1.0.0 <= v < 2.0.0'} | ${'widen'} | ${'1.5.0'} | ${'1.0.0 <= v < 2.0.0'}
|
|
${'1.0.0 <= v < 2.0.0'} | ${'widen'} | ${'2.0.0'} | ${'1.0.0 <= v < 3.0.0'}
|
|
${'1.0.0 <= v < 2.0.0'} | ${'widen'} | ${'2.5.0'} | ${'1.0.0 <= v < 3.0.0'}
|
|
${'1.0.0 <= v < 2.0.0'} | ${'replace'} | ${'1.5.0'} | ${'1.5.0 <= v < 2.0.0'}
|
|
${'1.0.0 <= v < 2.0.0'} | ${'replace'} | ${'2.0.0'} | ${'2.0.0 <= v < 3.0.0'}
|
|
${'0.19.0 <= v < 0.20.0'} | ${'bump'} | ${'0.19.1'} | ${'0.19.1 <= v < 0.20.0'}
|
|
${'0.19.0 <= v < 0.20.0'} | ${'replace'} | ${'0.20.0'} | ${'0.20.0 <= v < 1.0.0'}
|
|
${'1.0.0 <= v < 2.0.0'} | ${'update-lockfile'} | ${'1.5.0'} | ${'1.0.0 <= v < 2.0.0'}
|
|
${'1.0.0 <= v < 2.0.0'} | ${'update-lockfile'} | ${'2.0.0'} | ${'2.0.0 <= v < 3.0.0'}
|
|
${'1.0.0 <= v < 2.0.0'} | ${'pin'} | ${'1.5.0'} | ${'1.5.0'}
|
|
`(
|
|
'getNewValue("$currentValue", "$rangeStrategy", "$newVersion") === "$expected"',
|
|
({ currentValue, rangeStrategy, newVersion, expected }) => {
|
|
expect(
|
|
elm.getNewValue({
|
|
currentValue,
|
|
rangeStrategy,
|
|
currentVersion: '1.0.0',
|
|
newVersion,
|
|
}),
|
|
).toBe(expected);
|
|
},
|
|
);
|
|
});
|
|
|
|
it('returns null for invalid new version', () => {
|
|
expect(
|
|
elm.getNewValue({
|
|
currentValue: '1.0.0 <= v < 2.0.0',
|
|
rangeStrategy: 'bump',
|
|
newVersion: 'invalid',
|
|
}),
|
|
).toBeNull();
|
|
});
|
|
|
|
it('returns null for invalid current value', () => {
|
|
expect(
|
|
elm.getNewValue({
|
|
currentValue: 'invalid',
|
|
rangeStrategy: 'bump',
|
|
newVersion: '1.5.0',
|
|
}),
|
|
).toBeNull();
|
|
});
|
|
|
|
it('returns null for unknown range strategy', () => {
|
|
expect(
|
|
elm.getNewValue({
|
|
currentValue: '1.0.0 <= v < 2.0.0',
|
|
rangeStrategy: 'auto',
|
|
newVersion: '1.5.0',
|
|
}),
|
|
).toBeNull();
|
|
});
|
|
|
|
it('handles widen when newVersion equals upper bound exactly', () => {
|
|
expect(
|
|
elm.getNewValue({
|
|
currentValue: '1.0.0 <= v < 2.0.0',
|
|
rangeStrategy: 'widen',
|
|
newVersion: '2.0.0',
|
|
}),
|
|
).toBe('1.0.0 <= v < 3.0.0');
|
|
});
|
|
|
|
describe('elm-version range scenarios', () => {
|
|
it('widens elm-version range for new compiler release', () => {
|
|
// Simulates updating elm-version in package elm.json when new Elm compiler is released
|
|
expect(
|
|
elm.getNewValue({
|
|
currentValue: '0.19.0 <= v < 0.20.0',
|
|
rangeStrategy: 'widen',
|
|
newVersion: '0.20.0',
|
|
}),
|
|
).toBe('0.19.0 <= v < 1.0.0');
|
|
});
|
|
|
|
it('keeps elm-version range unchanged when version is already satisfied', () => {
|
|
expect(
|
|
elm.getNewValue({
|
|
currentValue: '0.19.0 <= v < 0.20.0',
|
|
rangeStrategy: 'update-lockfile',
|
|
newVersion: '0.19.1',
|
|
}),
|
|
).toBe('0.19.0 <= v < 0.20.0');
|
|
});
|
|
|
|
it('replaces elm-version range when explicitly requested', () => {
|
|
expect(
|
|
elm.getNewValue({
|
|
currentValue: '0.19.0 <= v < 0.20.0',
|
|
rangeStrategy: 'replace',
|
|
newVersion: '0.19.1',
|
|
}),
|
|
).toBe('0.19.1 <= v < 1.0.0');
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('getSatisfyingVersion with elm-version ranges', () => {
|
|
it('finds highest satisfying version for elm-version range', () => {
|
|
// Simulates GitHub tags datasource returning compiler versions
|
|
const compilerVersions = [
|
|
'0.18.0',
|
|
'0.19.0',
|
|
'0.19.1',
|
|
'0.20.0',
|
|
'0.21.0',
|
|
];
|
|
expect(
|
|
elm.getSatisfyingVersion(compilerVersions, '0.19.0 <= v < 0.20.0'),
|
|
).toBe('0.19.1');
|
|
});
|
|
|
|
it('returns null when no compiler version satisfies range', () => {
|
|
const compilerVersions = ['0.18.0', '0.20.0'];
|
|
expect(
|
|
elm.getSatisfyingVersion(compilerVersions, '0.19.0 <= v < 0.20.0'),
|
|
).toBeNull();
|
|
});
|
|
});
|
|
});
|