Files
renovate/lib/modules/versioning/hex/index.spec.ts
Florian Arens a79cddc4b9 fix(versioning/hex): handle Elixir == pin prefix in isSingleVersion (#41565)
* fix(versioning/hex): handle Elixir == pin prefix in isSingleVersion

Hex versioning inherited npm's isSingleVersion which only strips a single
= prefix. Elixir uses == for pinning, so "== 1.7.16" was not recognized
as a pinned version, causing duplicate pin PRs on every update.

Add isSingleVersion override that handles the double == prefix and add
getPinnedValue to emit the correct == prefix when pinning.

* fix: use non-null assertion instead of optional chaining in test
2026-03-01 14:42:39 +00:00

112 lines
5.0 KiB
TypeScript

import { api as hexScheme } from './index.ts';
describe('modules/versioning/hex/index', () => {
it.each`
version | range | expected
${'4.2.0'} | ${'~> 4.0'} | ${true}
${'2.1.0'} | ${'~> 2.0.0'} | ${false}
${'2.0.0'} | ${'>= 2.0.0 and < 2.1.0'} | ${true}
${'2.1.0'} | ${'== 2.0.0 or < 2.1.0'} | ${false}
${'1.9.4'} | ${'== 1.9.4'} | ${true}
${'1.9.5'} | ${'== 1.9.4'} | ${false}
`(
'matches("$version", "$range") === $expected',
({ version, range, expected }) => {
expect(hexScheme.matches(version, range)).toBe(expected);
},
);
it.each`
versions | range | expected
${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']} | ${'~> 4.0'} | ${'4.2.0'}
${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']} | ${'~> 4.0.0'} | ${'4.0.0'}
`(
'getSatisfyingVersion($versions, "$range") === $expected',
({ versions, range, expected }) => {
expect(hexScheme.getSatisfyingVersion(versions, range)).toBe(expected);
},
);
it.each`
input | expected
${'>= 1.0.0 and <= 2.0.0'} | ${true}
${'>= 1.0.0 or <= 2.0.0'} | ${true}
${'!= 1.0.0'} | ${true}
${'== 1.0.0'} | ${true}
`('isValid("$input") === $expected', ({ input, expected }) => {
const res = !!hexScheme.isValid(input);
expect(res).toBe(expected);
});
it.each`
version | expected
${'1.2.3'} | ${true}
${'== 1.2.3'} | ${true}
${'~> 1.2'} | ${false}
${'~> 1.2.0'} | ${false}
${'>= 1.0.0'} | ${false}
`('isSingleVersion("$version") === $expected', ({ version, expected }) => {
expect(hexScheme.isSingleVersion(version)).toBe(expected);
});
it('getPinnedValue returns == prefixed version', () => {
expect(hexScheme.getPinnedValue!('1.2.3')).toBe('== 1.2.3');
});
it.each`
version | range | expected
${'0.1.0'} | ${'>= 1.0.0 and <= 2.0.0'} | ${true}
${'1.9.0'} | ${'>= 1.0.0 and <= 2.0.0'} | ${false}
${'0.9.0'} | ${'>= 1.0.0 or >= 2.0.0'} | ${true}
${'1.9.0'} | ${'>= 1.0.0 or >= 2.0.0'} | ${false}
`(
'isLessThanRange($version, $range) === $expected',
({ version, range, expected }) => {
expect(hexScheme.isLessThanRange?.(version, range)).toBe(expected);
},
);
it.each`
versions | range | expected
${['0.4.0', '0.5.0', '4.2.0', '5.0.0']} | ${'~> 4.0'} | ${'4.2.0'}
${['0.4.0', '0.5.0', '4.2.0', '5.0.0']} | ${'~> 4.0.0'} | ${null}
`(
'minSatisfyingVersion($versions, "$range") === $expected',
({ versions, range, expected }) => {
expect(hexScheme.minSatisfyingVersion(versions, range)).toBe(expected);
},
);
it.each`
currentValue | rangeStrategy | currentVersion | newVersion | expected
${'== 3.6.1'} | ${'bump'} | ${'3.6.1'} | ${'3.6.2'} | ${'== 3.6.2'}
${'== 3.6.1'} | ${'replace'} | ${'3.6.1'} | ${'3.6.2'} | ${'== 3.6.2'}
${'~> 1.2'} | ${'replace'} | ${'1.2.3'} | ${'2.0.7'} | ${'~> 2.0'}
${'~> 1.2'} | ${'bump'} | ${'1.2.3'} | ${'2.0.7'} | ${'~> 2.0'}
${'~> 1.2'} | ${'bump'} | ${'1.2.3'} | ${'1.3.1'} | ${'~> 1.3'}
${'~> 1.1'} | ${'update-lockfile'} | ${'1.2.0'} | ${'1.3.0'} | ${'~> 1.1'}
${'~> 1.1'} | ${'update-lockfile'} | ${'1.2.0'} | ${'2.0.0'} | ${'~> 2.0'}
${'~> 1.2.0'} | ${'replace'} | ${'1.2.3'} | ${'2.0.7'} | ${'~> 2.0.0'}
${'~> 1.2.0'} | ${'bump'} | ${'1.2.3'} | ${'2.0.7'} | ${'~> 2.0.7'}
${'~> 0.2 and <= 0.2.6'} | ${'widen'} | ${'0.2.6'} | ${'0.2.8'} | ${'~> 0.2 and <= 0.2.8'}
${'>= 1.0.0 and <= 2.0.0'} | ${'widen'} | ${'1.2.3'} | ${'2.0.7'} | ${'>= 1.0.0 and <= 2.0.7'}
${'>= 1.0.0 and <= 2.0.0'} | ${'replace'} | ${'1.2.3'} | ${'2.0.7'} | ${'<= 2.0.7'}
${'>= 1.0.0 or <= 2.0.0'} | ${'widen'} | ${'1.2.3'} | ${'2.0.7'} | ${'>= 1.0.0 or <= 2.0.0'}
${'>= 1.0.0 or <= 2.0.0'} | ${'replace'} | ${'1.2.3'} | ${'2.0.7'} | ${'<= 2.0.7'}
${'~> 0.4'} | ${'replace'} | ${'0.4.2'} | ${'0.6.0'} | ${'~> 0.6'}
${'~> 1.0'} | ${'widen'} | ${'1.0.0'} | ${'2.0.0'} | ${'~> 1.0 or ~> 2.0'}
${'~> 1.0.0'} | ${'widen'} | ${'1.0.0'} | ${'2.0.0'} | ${'~> 1.0.0 or ~> 2.0.0'}
`(
'getNewValue("$currentValue", "$rangeStrategy", "$currentVersion", "$newVersion") === "$expected"',
({ currentValue, rangeStrategy, currentVersion, newVersion, expected }) => {
const res = hexScheme.getNewValue({
currentValue,
rangeStrategy,
currentVersion,
newVersion,
});
expect(res).toEqual(expected);
},
);
});