Skip to content
Snippets Groups Projects
Unverified Commit 4a9f5d93 authored by Sergei Zharinov's avatar Sergei Zharinov Committed by GitHub
Browse files

test(endoflife): Mock time (#22575)

parent bc7793c6
No related branches found
No related tags found
No related merge requests found
import { DateTime, Settings } from 'luxon';
import { getPkgReleases } from '..'; import { getPkgReleases } from '..';
import { Fixtures } from '../../../../test/fixtures'; import { Fixtures } from '../../../../test/fixtures';
import * as httpMock from '../../../../test/http-mock'; import * as httpMock from '../../../../test/http-mock';
...@@ -12,6 +13,11 @@ const packageName = 'amazon-eks'; ...@@ -12,6 +13,11 @@ const packageName = 'amazon-eks';
const eksMockPath = `/${packageName}.json`; const eksMockPath = `/${packageName}.json`;
describe('modules/datasource/endoflife-date/index', () => { describe('modules/datasource/endoflife-date/index', () => {
beforeAll(() => {
const now = DateTime.fromISO('2023-06-03');
Settings.now = () => now.valueOf();
});
describe('getReleases', () => { describe('getReleases', () => {
it('processes real data', async () => { it('processes real data', async () => {
httpMock httpMock
......
...@@ -5,7 +5,7 @@ import { joinUrlParts } from '../../../util/url'; ...@@ -5,7 +5,7 @@ import { joinUrlParts } from '../../../util/url';
import { Datasource } from '../datasource'; import { Datasource } from '../datasource';
import type { GetReleasesConfig, ReleaseResult } from '../types'; import type { GetReleasesConfig, ReleaseResult } from '../types';
import { datasource, registryUrl } from './common'; import { datasource, registryUrl } from './common';
import { EndoflifeHttpResponseScheme } from './schema'; import { EndoflifeDateVersions } from './schema';
export class EndoflifeDatePackagesource extends Datasource { export class EndoflifeDatePackagesource extends Datasource {
static readonly id = datasource; static readonly id = datasource;
...@@ -41,10 +41,7 @@ export class EndoflifeDatePackagesource extends Datasource { ...@@ -41,10 +41,7 @@ export class EndoflifeDatePackagesource extends Datasource {
const url = joinUrlParts(registryUrl, `${packageName}.json`); const url = joinUrlParts(registryUrl, `${packageName}.json`);
try { try {
const response = await this.http.getJson( const response = await this.http.getJson(url, EndoflifeDateVersions);
url,
EndoflifeHttpResponseScheme
);
result.releases.push(...response.body); result.releases.push(...response.body);
......
import { DateTime } from 'luxon'; import { DateTime } from 'luxon';
import { z } from 'zod'; import { z } from 'zod';
import { UtcDate } from '../../../util/schema-utils';
import type { Release } from '../types'; import type { Release } from '../types';
const EndoflifeDateVersionScheme = z const ExpireableField = z.union([
UtcDate.transform((x) => {
const now = DateTime.now().toUTC();
return x <= now;
}),
z.boolean(),
]);
export const EndoflifeDateVersions = z
.object({ .object({
cycle: z.string(), cycle: z.string(),
latest: z.optional(z.string()), latest: z.optional(z.string()),
releaseDate: z.optional(z.string()), releaseDate: z.optional(z.string()),
eol: z.optional(z.union([z.string(), z.boolean()])), eol: z.optional(ExpireableField),
discontinued: z.optional(z.union([z.string(), z.boolean()])), discontinued: z.optional(ExpireableField),
}) })
.transform(({ cycle, latest, releaseDate, eol, discontinued }): Release => { .transform(
let isDeprecated = false; ({
cycle,
// If "eol" date or "discontinued" date has passed or any of the values is explicitly true, set to deprecated latest,
// "support" is not checked because support periods sometimes end before the EOL. releaseDate: releaseTimestamp,
if ( eol,
eol === true || discontinued,
discontinued === true || }): Release => {
(typeof eol === 'string' && const version = latest ?? cycle;
DateTime.fromISO(eol, { zone: 'utc' }) <= DateTime.now().toUTC()) || const isDeprecated = eol === true || discontinued === true;
(typeof discontinued === 'string' && return { version, releaseTimestamp, isDeprecated };
DateTime.fromISO(discontinued, { zone: 'utc' }) <=
DateTime.now().toUTC())
) {
isDeprecated = true;
}
let version = cycle;
if (latest !== undefined) {
version = latest;
} }
)
return { .array();
version,
releaseTimestamp: releaseDate,
isDeprecated,
};
});
export const EndoflifeHttpResponseScheme = z.array(EndoflifeDateVersionScheme);
import { z } from 'zod'; import { z } from 'zod';
import { Json, Json5, LooseArray, LooseRecord } from './schema-utils'; import { Json, Json5, LooseArray, LooseRecord, UtcDate } from './schema-utils';
describe('util/schema-utils', () => { describe('util/schema-utils', () => {
describe('LooseArray', () => { describe('LooseArray', () => {
...@@ -258,4 +258,16 @@ describe('util/schema-utils', () => { ...@@ -258,4 +258,16 @@ describe('util/schema-utils', () => {
}); });
}); });
}); });
describe('UtcDate', () => {
it('parses date', () => {
expect(UtcDate.parse('2020-04-04').toString()).toBe(
'2020-04-04T00:00:00.000Z'
);
});
it('rejects invalid date', () => {
expect(() => UtcDate.parse('foobar')).toThrow();
});
});
}); });
import JSON5 from 'json5'; import JSON5 from 'json5';
import { DateTime } from 'luxon';
import type { JsonValue } from 'type-fest'; import type { JsonValue } from 'type-fest';
import { z } from 'zod'; import { z } from 'zod';
...@@ -211,3 +212,14 @@ export const Json5 = z.string().transform((str, ctx): JsonValue => { ...@@ -211,3 +212,14 @@ export const Json5 = z.string().transform((str, ctx): JsonValue => {
return z.NEVER; return z.NEVER;
} }
}); });
export const UtcDate = z
.string({ description: 'ISO 8601 string' })
.transform((str, ctx): DateTime => {
const date = DateTime.fromISO(str, { zone: 'utc' });
if (!date.isValid) {
ctx.addIssue({ code: 'custom', message: 'Invalid date' });
return z.NEVER;
}
return date;
});
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment