Files
renovate/lib/modules/datasource/artifactory/index.spec.ts
Sebastian Poxhofer 05e1271376 test: use expect().resolves instead of awaiting inside expect (#45672)
Enables the vitest/prefer-expect-resolves oxlint rule and applies its
autofix across the spec suite.
2026-09-04 10:40:46 +00:00

213 lines
6.3 KiB
TypeScript

import { Fixtures } from '~test/fixtures.ts';
import * as httpMock from '~test/http-mock.ts';
import { EXTERNAL_HOST_ERROR } from '../../../constants/error-messages.ts';
import { logger } from '../../../logger/index.ts';
import { joinUrlParts } from '../../../util/url.ts';
import { getPkgReleases } from '../index.ts';
import { ArtifactoryDatasource } from './index.ts';
const datasource = ArtifactoryDatasource.id;
const testRegistryUrl = 'https://jfrog.company.com/artifactory';
const testLookupName = 'project';
const testConfig = {
registryUrls: [testRegistryUrl],
packageName: testLookupName,
};
const fixtureReleasesAsFolders = Fixtures.get('releases-as-folders.html');
const fixtureReleasesAsFiles = Fixtures.get('releases-as-files.html');
function getPath(folder: string): string {
return `/${folder}`;
}
describe('modules/datasource/artifactory/index', () => {
describe('getReleases', () => {
it('parses real data (folders): with slash at the end', async () => {
httpMock
.scope(testRegistryUrl)
.get(getPath(testLookupName))
.reply(200, fixtureReleasesAsFolders);
const res = await getPkgReleases({
...testConfig,
datasource,
packageName: testLookupName,
});
expect(res).toEqual({
registryUrl: 'https://jfrog.company.com/artifactory',
releases: [
{
releaseTimestamp: '2021-07-21T20:08:00.000Z',
version: '1.0.0',
},
{
releaseTimestamp: '2021-08-23T20:03:00.000Z',
version: '1.0.1',
},
{
releaseTimestamp: '2021-07-21T20:09:00.000Z',
version: '1.0.2',
},
{
releaseTimestamp: '2021-02-06T09:54:00.000Z',
version: '1.0.3',
},
],
});
});
it('parses real data (files): without slash at the end', async () => {
httpMock
.scope(testRegistryUrl)
.get(getPath(testLookupName))
.reply(200, fixtureReleasesAsFiles);
const res = await getPkgReleases({
...testConfig,
datasource,
packageName: testLookupName,
});
expect(res).toEqual({
registryUrl: 'https://jfrog.company.com/artifactory',
releases: [
{
releaseTimestamp: '2021-07-21T20:08:00.000Z',
version: '1.0.0',
},
{
releaseTimestamp: '2021-08-23T20:03:00.000Z',
version: '1.0.1',
},
{
releaseTimestamp: '2021-07-21T20:09:00.000Z',
version: '1.0.2',
},
{
releaseTimestamp: '2021-02-06T09:54:00.000Z',
version: '1.0.3',
},
],
});
});
it('parses real data (merge strategy with 2 registries)', async () => {
const secondRegistryUrl: string = joinUrlParts(
testRegistryUrl,
'production',
);
httpMock
.scope(testRegistryUrl)
.get(getPath(testLookupName))
.reply(200, fixtureReleasesAsFiles);
httpMock
.scope(secondRegistryUrl)
.get(getPath(testLookupName))
.reply(200, '<html>\n<h1>Header</h1>\n<a>1.3.0</a>\n<hmtl/>');
const res = await getPkgReleases({
registryUrls: [testRegistryUrl, secondRegistryUrl],
datasource,
packageName: testLookupName,
});
expect(res).toEqual({
releases: [
{
registryUrl: 'https://jfrog.company.com/artifactory',
releaseTimestamp: '2021-07-21T20:08:00.000Z',
version: '1.0.0',
},
{
registryUrl: 'https://jfrog.company.com/artifactory',
releaseTimestamp: '2021-08-23T20:03:00.000Z',
version: '1.0.1',
},
{
registryUrl: 'https://jfrog.company.com/artifactory',
releaseTimestamp: '2021-07-21T20:09:00.000Z',
version: '1.0.2',
},
{
registryUrl: 'https://jfrog.company.com/artifactory',
releaseTimestamp: '2021-02-06T09:54:00.000Z',
version: '1.0.3',
},
{
registryUrl: 'https://jfrog.company.com/artifactory/production',
version: '1.3.0',
},
],
});
});
it('returns null without registryUrl + warning', async () => {
const res = await getPkgReleases({
datasource,
packageName: testLookupName,
});
expect(logger.warn).toHaveBeenCalledTimes(1);
expect(logger.warn).toHaveBeenCalledWith(
{ packageName: 'project' },
'artifactory datasource requires custom registryUrl. Skipping datasource',
);
expect(res).toBeNull();
});
it('returns null for empty 200 OK', async () => {
httpMock
.scope(testRegistryUrl)
.get(getPath(testLookupName))
.reply(200, '<html>\n<h1>Header wo. nodes</h1>\n<hmtl/>');
await expect(
getPkgReleases({
...testConfig,
datasource,
packageName: testLookupName,
}),
).resolves.toBeNull();
});
it('404 returns null', async () => {
httpMock.scope(testRegistryUrl).get(getPath(testLookupName)).reply(404);
await expect(
getPkgReleases({
...testConfig,
datasource,
packageName: testLookupName,
}),
).resolves.toBeNull();
expect(logger.warn).toHaveBeenCalledTimes(1);
expect(logger.warn).toHaveBeenCalledWith(
{
packageName: 'project',
registryUrl: 'https://jfrog.company.com/artifactory',
},
'artifactory: `Not Found` error',
);
});
it('throws for error diff than 404', async () => {
httpMock.scope(testRegistryUrl).get(getPath(testLookupName)).reply(502);
await expect(
getPkgReleases({
...testConfig,
datasource,
packageName: testLookupName,
}),
).rejects.toThrow(EXTERNAL_HOST_ERROR);
});
it('throws no Http error', async () => {
httpMock
.scope(testRegistryUrl)
.get(getPath(testLookupName))
.replyWithError('unknown error');
const res = await getPkgReleases({
...testConfig,
datasource,
packageName: testLookupName,
});
expect(res).toBeNull();
});
});
});