From 70ce099913c875a2969217d855d9775c8c43ceef Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sat, 6 Mar 2021 09:38:48 +0100 Subject: [PATCH 1/3] Added stricter types for SemVer versions --- src/servers/data/index.ts | 4 +++- src/utils/helpers/version.ts | 16 ++++++++++---- test/common/MenuLayout.test.tsx | 11 +++++----- test/common/ShlinkVersions.test.tsx | 10 ++++----- .../servers/helpers/ForServerVersion.test.tsx | 21 ++++++++++--------- test/short-urls/ShortUrlsTable.test.tsx | 9 ++++---- test/short-urls/helpers/QrCodeModal.test.tsx | 21 ++++++++++--------- 7 files changed, 53 insertions(+), 39 deletions(-) diff --git a/src/servers/data/index.ts b/src/servers/data/index.ts index 32c8a75a..9d590288 100644 --- a/src/servers/data/index.ts +++ b/src/servers/data/index.ts @@ -1,3 +1,5 @@ +import { SemVer } from '../../utils/helpers/version'; + export interface ServerData { name: string; url: string; @@ -9,7 +11,7 @@ export interface ServerWithId extends ServerData { } export interface ReachableServer extends ServerWithId { - version: string; + version: SemVer; printableVersion: string; } diff --git a/src/utils/helpers/version.ts b/src/utils/helpers/version.ts index a44a0251..e3695eb1 100644 --- a/src/utils/helpers/version.ts +++ b/src/utils/helpers/version.ts @@ -2,12 +2,20 @@ import { compare } from 'compare-versions'; import { identity, memoizeWith } from 'ramda'; import { Empty, hasValue } from '../utils'; +type SemVerPatternFragment = `${bigint | '*'}`; + +export type SemVerPattern = SemVerPatternFragment +| `${SemVerPatternFragment}.${SemVerPatternFragment}` +| `${SemVerPatternFragment}.${SemVerPatternFragment}.${SemVerPatternFragment}`; + export interface Versions { - maxVersion?: string; - minVersion?: string; + maxVersion?: SemVerPattern; + minVersion?: SemVerPattern; } -export const versionMatch = (versionToMatch: string | Empty, { maxVersion, minVersion }: Versions): boolean => { +export type SemVer = `${bigint}.${bigint}.${bigint}`; + +export const versionMatch = (versionToMatch: SemVer | Empty, { maxVersion, minVersion }: Versions): boolean => { if (!hasValue(versionToMatch)) { return false; } @@ -18,7 +26,7 @@ export const versionMatch = (versionToMatch: string | Empty, { maxVersion, minVe return matchesMaxVersion && matchesMinVersion; }; -const versionIsValidSemVer = memoizeWith(identity, (version: string) => { +const versionIsValidSemVer = memoizeWith(identity, (version: string): version is SemVerPattern => { try { return compare(version, version, '='); } catch (e) { diff --git a/test/common/MenuLayout.test.tsx b/test/common/MenuLayout.test.tsx index 85cbc109..1e7219b5 100644 --- a/test/common/MenuLayout.test.tsx +++ b/test/common/MenuLayout.test.tsx @@ -6,6 +6,7 @@ import { Mock } from 'ts-mockery'; import createMenuLayout from '../../src/common/MenuLayout'; import { NonReachableServer, NotFoundServer, ReachableServer, SelectedServer } from '../../src/servers/data'; import NoMenuLayout from '../../src/common/NoMenuLayout'; +import { SemVer } from '../../src/utils/helpers/version'; describe('', () => { const ServerError = jest.fn(); @@ -48,11 +49,11 @@ describe('', () => { }); it.each([ - [ '2.1.0', 6 ], - [ '2.2.0', 7 ], - [ '2.5.0', 7 ], - [ '2.6.0', 8 ], - [ '2.7.0', 8 ], + [ '2.1.0' as SemVer, 6 ], + [ '2.2.0' as SemVer, 7 ], + [ '2.5.0' as SemVer, 7 ], + [ '2.6.0' as SemVer, 8 ], + [ '2.7.0' as SemVer, 8 ], ])('has expected amount of routes based on selected server\'s version', (version, expectedAmountOfRoutes) => { const selectedServer = Mock.of({ version }); const wrapper = createWrapper(selectedServer).dive(); diff --git a/test/common/ShlinkVersions.test.tsx b/test/common/ShlinkVersions.test.tsx index 0a97010f..03af9357 100644 --- a/test/common/ShlinkVersions.test.tsx +++ b/test/common/ShlinkVersions.test.tsx @@ -14,11 +14,11 @@ describe('', () => { afterEach(() => wrapper?.unmount()); it.each([ - [ '1.2.3', Mock.of({ version: '', printableVersion: 'foo' }), 'v1.2.3', 'foo' ], - [ 'foo', Mock.of({ version: '', printableVersion: '1.2.3' }), 'latest', '1.2.3' ], - [ 'latest', Mock.of({ version: '', printableVersion: 'latest' }), 'latest', 'latest' ], - [ '5.5.0', Mock.of({ version: '', printableVersion: '0.2.8' }), 'v5.5.0', '0.2.8' ], - [ 'not-semver', Mock.of({ version: '', printableVersion: 'something' }), 'latest', 'something' ], + [ '1.2.3', Mock.of({ version: '1.0.0', printableVersion: 'foo' }), 'v1.2.3', 'foo' ], + [ 'foo', Mock.of({ version: '1.0.0', printableVersion: '1.2.3' }), 'latest', '1.2.3' ], + [ 'latest', Mock.of({ version: '1.0.0', printableVersion: 'latest' }), 'latest', 'latest' ], + [ '5.5.0', Mock.of({ version: '1.0.0', printableVersion: '0.2.8' }), 'v5.5.0', '0.2.8' ], + [ 'not-semver', Mock.of({ version: '1.0.0', printableVersion: 'some' }), 'latest', 'some' ], ])( 'displays expected versions when selected server is reachable', (clientVersion, selectedServer, expectedClientVersion, expectedServerVersion) => { diff --git a/test/servers/helpers/ForServerVersion.test.tsx b/test/servers/helpers/ForServerVersion.test.tsx index 4aabf23f..2167b3d6 100644 --- a/test/servers/helpers/ForServerVersion.test.tsx +++ b/test/servers/helpers/ForServerVersion.test.tsx @@ -2,11 +2,12 @@ import { mount, ReactWrapper } from 'enzyme'; import { Mock } from 'ts-mockery'; import ForServerVersion from '../../../src/servers/helpers/ForServerVersion'; import { ReachableServer, SelectedServer } from '../../../src/servers/data'; +import { SemVer, SemVerPattern } from '../../../src/utils/helpers/version'; describe('', () => { let wrapped: ReactWrapper; - const renderComponent = (selectedServer: SelectedServer, minVersion?: string, maxVersion?: string) => { + const renderComponent = (selectedServer: SelectedServer, minVersion?: SemVerPattern, maxVersion?: SemVerPattern) => { wrapped = mount( Hello @@ -19,15 +20,15 @@ describe('', () => { afterEach(() => wrapped?.unmount()); it('does not render children when current server is empty', () => { - const wrapped = renderComponent(null, '1'); + const wrapped = renderComponent(null, '1.*.*'); expect(wrapped.html()).toBeNull(); }); it.each([ - [ '2.0.0', undefined, '1.8.3' ], - [ undefined, '1.8.0', '1.8.3' ], - [ '1.7.0', '1.8.0', '1.8.3' ], + [ '2.0.0' as SemVer, undefined, '1.8.3' as SemVer ], + [ undefined, '1.8.0' as SemVer, '1.8.3' as SemVer ], + [ '1.7.0' as SemVer, '1.8.0' as SemVer, '1.8.3' as SemVer ], ])('does not render children when current version does not match requirements', (min, max, version) => { const wrapped = renderComponent(Mock.of({ version, printableVersion: version }), min, max); @@ -35,11 +36,11 @@ describe('', () => { }); it.each([ - [ '2.0.0', undefined, '2.8.3' ], - [ '2.0.0', undefined, '2.0.0' ], - [ undefined, '1.8.0', '1.8.0' ], - [ undefined, '1.8.0', '1.7.1' ], - [ '1.7.0', '1.8.0', '1.7.3' ], + [ '2.0.0' as SemVer, undefined, '2.8.3' as SemVer ], + [ '2.0.0' as SemVer, undefined, '2.0.0' as SemVer ], + [ undefined, '1.8.0' as SemVer, '1.8.0' as SemVer ], + [ undefined, '1.8.0' as SemVer, '1.7.1' as SemVer ], + [ '1.7.0' as SemVer, '1.8.0' as SemVer, '1.7.3' as SemVer ], ])('renders children when current version matches requirements', (min, max, version) => { const wrapped = renderComponent(Mock.of({ version, printableVersion: version }), min, max); diff --git a/test/short-urls/ShortUrlsTable.test.tsx b/test/short-urls/ShortUrlsTable.test.tsx index 74a736b3..7164e40e 100644 --- a/test/short-urls/ShortUrlsTable.test.tsx +++ b/test/short-urls/ShortUrlsTable.test.tsx @@ -5,6 +5,7 @@ import { ShortUrlsTable as shortUrlsTableCreator } from '../../src/short-urls/Sh import { OrderableFields, SORTABLE_FIELDS } from '../../src/short-urls/reducers/shortUrlsListParams'; import { ShortUrlsList } from '../../src/short-urls/reducers/shortUrlsList'; import { ReachableServer, SelectedServer } from '../../src/servers/data'; +import { SemVer } from '../../src/utils/helpers/version'; describe('', () => { let wrapper: ShallowWrapper; @@ -61,10 +62,10 @@ describe('', () => { }); it.each([ - [ '2.6.0' ], - [ '2.6.1' ], - [ '2.7.0' ], - [ '3.0.0' ], + [ '2.6.0' as SemVer ], + [ '2.6.1' as SemVer ], + [ '2.7.0' as SemVer ], + [ '3.0.0' as SemVer ], ])('should render composed column when server supports title', (version) => { const wrapper = createWrapper(Mock.of({ version })); const composedColumn = wrapper.find('table').find('th').at(2); diff --git a/test/short-urls/helpers/QrCodeModal.test.tsx b/test/short-urls/helpers/QrCodeModal.test.tsx index d84b5572..b57b8fcc 100644 --- a/test/short-urls/helpers/QrCodeModal.test.tsx +++ b/test/short-urls/helpers/QrCodeModal.test.tsx @@ -7,11 +7,12 @@ import { ShortUrl } from '../../../src/short-urls/data'; import { ReachableServer } from '../../../src/servers/data'; import { CopyToClipboardIcon } from '../../../src/utils/CopyToClipboardIcon'; import { DropdownBtn } from '../../../src/utils/DropdownBtn'; +import { SemVer } from '../../../src/utils/helpers/version'; describe('', () => { let wrapper: ShallowWrapper; const shortUrl = 'https://doma.in/abc123'; - const createWrapper = (version = '2.6.0') => { + const createWrapper = (version: SemVer = '2.6.0') => { const selectedServer = Mock.of({ version }); wrapper = shallow( @@ -37,12 +38,12 @@ describe('', () => { }); it.each([ - [ '2.3.0', 0, '/qr-code/300' ], - [ '2.4.0', 0, '/qr-code/300?format=png' ], - [ '2.4.0', 10, '/qr-code/300?format=png' ], - [ '2.5.0', 0, '/qr-code?size=300&format=png' ], - [ '2.6.0', 0, '/qr-code?size=300&format=png' ], - [ '2.6.0', 10, '/qr-code?size=300&format=png&margin=10' ], + [ '2.3.0' as SemVer, 0, '/qr-code/300' ], + [ '2.4.0' as SemVer, 0, '/qr-code/300?format=png' ], + [ '2.4.0' as SemVer, 10, '/qr-code/300?format=png' ], + [ '2.5.0' as SemVer, 0, '/qr-code?size=300&format=png' ], + [ '2.6.0' as SemVer, 0, '/qr-code?size=300&format=png' ], + [ '2.6.0' as SemVer, 10, '/qr-code?size=300&format=png&margin=10' ], ])('displays an image with the QR code of the URL', (version, margin, expectedUrl) => { const wrapper = createWrapper(version); const formControls = wrapper.find('.form-control-range'); @@ -84,9 +85,9 @@ describe('', () => { }); it.each([ - [ '2.3.0', 0, 'col-12' ], - [ '2.4.0', 1, 'col-md-6' ], - [ '2.6.0', 1, 'col-md-4' ], + [ '2.3.0' as SemVer, 0, 'col-12' ], + [ '2.4.0' as SemVer, 1, 'col-md-6' ], + [ '2.6.0' as SemVer, 1, 'col-md-4' ], ])('shows expected components based on server version', (version, expectedAmountOfDropdowns, expectedRangeClass) => { const wrapper = createWrapper(version); const dropdown = wrapper.find(DropdownBtn); From 5224e7b4ef6bcd316989e3413c2cdcc9e8812eec Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sat, 6 Mar 2021 09:58:29 +0100 Subject: [PATCH 2/3] Created new feature checkers --- src/common/MenuLayout.tsx | 6 ++--- src/short-urls/CreateShortUrl.tsx | 10 ++++----- src/short-urls/ShortUrlsTable.tsx | 4 ++-- src/short-urls/helpers/QrCodeModal.tsx | 12 +++++----- src/short-urls/reducers/shortUrlTags.ts | 10 +++------ src/utils/helpers/features.ts | 18 ++++++++++++++- src/utils/helpers/version.ts | 8 +++---- test/utils/helpers/version.test.ts | 30 +++++++++++++------------ 8 files changed, 56 insertions(+), 42 deletions(-) diff --git a/src/common/MenuLayout.tsx b/src/common/MenuLayout.tsx index 57bd1189..3743424a 100644 --- a/src/common/MenuLayout.tsx +++ b/src/common/MenuLayout.tsx @@ -5,7 +5,7 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import classNames from 'classnames'; import { withSelectedServer } from '../servers/helpers/withSelectedServer'; import { useSwipeable, useToggle } from '../utils/helpers/hooks'; -import { versionMatch } from '../utils/helpers/version'; +import { supportsOrphanVisits, supportsTagVisits } from '../utils/helpers/features'; import { isReachableServer } from '../servers/data'; import NotFound from './NotFound'; import { AsideMenuProps } from './AsideMenu'; @@ -30,8 +30,8 @@ const MenuLayout = ( return ; } - const addTagsVisitsRoute = versionMatch(selectedServer.version, { minVersion: '2.2.0' }); - const addOrphanVisitsRoute = versionMatch(selectedServer.version, { minVersion: '2.6.0' }); + const addTagsVisitsRoute = supportsTagVisits(selectedServer); + const addOrphanVisitsRoute = supportsOrphanVisits(selectedServer); const burgerClasses = classNames('menu-layout__burger-icon', { 'menu-layout__burger-icon--active': sidebarVisible }); const swipeableProps = useSwipeable(showSidebar, hideSidebar); diff --git a/src/short-urls/CreateShortUrl.tsx b/src/short-urls/CreateShortUrl.tsx index 7bf2fe1f..bf48e394 100644 --- a/src/short-urls/CreateShortUrl.tsx +++ b/src/short-urls/CreateShortUrl.tsx @@ -5,9 +5,10 @@ import { InputType } from 'reactstrap/lib/Input'; import * as m from 'moment'; import DateInput, { DateInputProps } from '../utils/DateInput'; import Checkbox from '../utils/Checkbox'; -import { versionMatch, Versions } from '../utils/helpers/version'; +import { Versions } from '../utils/helpers/version'; +import { supportsListingDomains, supportsSettingShortCodeLength } from '../utils/helpers/features'; import { handleEventPreventingDefault, hasValue } from '../utils/utils'; -import { isReachableServer, SelectedServer } from '../servers/data'; +import { SelectedServer } from '../servers/data'; import { formatIsoDate } from '../utils/helpers/date'; import { TagsSelectorProps } from '../tags/helpers/TagsSelector'; import { DomainSelectorProps } from '../domains/DomainSelector'; @@ -117,9 +118,8 @@ const CreateShortUrl = ( ); - const currentServerVersion = isReachableServer(selectedServer) ? selectedServer.version : ''; - const showDomainSelector = versionMatch(currentServerVersion, { minVersion: '2.4.0' }); - const disableShortCodeLength = !versionMatch(currentServerVersion, { minVersion: '2.1.0' }); + const showDomainSelector = supportsListingDomains(selectedServer); + const disableShortCodeLength = !supportsSettingShortCodeLength(selectedServer); return (
diff --git a/src/short-urls/ShortUrlsTable.tsx b/src/short-urls/ShortUrlsTable.tsx index 9bc0c9d6..f1f6c05c 100644 --- a/src/short-urls/ShortUrlsTable.tsx +++ b/src/short-urls/ShortUrlsTable.tsx @@ -2,7 +2,7 @@ import { FC, ReactNode } from 'react'; import { isEmpty } from 'ramda'; import classNames from 'classnames'; import { SelectedServer } from '../servers/data'; -import { titleIsSupported } from '../utils/helpers/features'; +import { supportsShortUrlTitle } from '../utils/helpers/features'; import { ShortUrlsList as ShortUrlsListState } from './reducers/shortUrlsList'; import { ShortUrlsRowProps } from './helpers/ShortUrlsRow'; import { OrderableFields } from './reducers/shortUrlsListParams'; @@ -29,7 +29,7 @@ export const ShortUrlsTable = (ShortUrlsRow: FC) => ({ const actionableFieldClasses = classNames({ 'short-urls-table__header-cell--with-action': !!orderByColumn }); const orderableColumnsClasses = classNames('short-urls-table__header-cell', actionableFieldClasses); const tableClasses = classNames('table table-hover', className); - const supportsTitle = titleIsSupported(selectedServer); + const supportsTitle = supportsShortUrlTitle(selectedServer); const renderShortUrls = () => { if (error) { diff --git a/src/short-urls/helpers/QrCodeModal.tsx b/src/short-urls/helpers/QrCodeModal.tsx index 4bde939e..b4bd0abb 100644 --- a/src/short-urls/helpers/QrCodeModal.tsx +++ b/src/short-urls/helpers/QrCodeModal.tsx @@ -3,15 +3,15 @@ import { Modal, DropdownItem, FormGroup, ModalBody, ModalHeader, Row } from 'rea import { ExternalLink } from 'react-external-link'; import classNames from 'classnames'; import { ShortUrlModalProps } from '../data'; -import { ReachableServer } from '../../servers/data'; -import { versionMatch } from '../../utils/helpers/version'; +import { SelectedServer } from '../../servers/data'; import { DropdownBtn } from '../../utils/DropdownBtn'; import { CopyToClipboardIcon } from '../../utils/CopyToClipboardIcon'; import { buildQrCodeUrl, QrCodeCapabilities, QrCodeFormat } from '../../utils/helpers/qrCodes'; +import { supportsQrCodeSizeInQuery, supportsQrCodeSvgFormat, supportsQrCodeMargin } from '../../utils/helpers/features'; import './QrCodeModal.scss'; interface QrCodeModalConnectProps extends ShortUrlModalProps { - selectedServer: ReachableServer; + selectedServer: SelectedServer; } const QrCodeModal = ({ shortUrl: { shortUrl }, toggle, isOpen, selectedServer }: QrCodeModalConnectProps) => { @@ -19,9 +19,9 @@ const QrCodeModal = ({ shortUrl: { shortUrl }, toggle, isOpen, selectedServer }: const [ margin, setMargin ] = useState(0); const [ format, setFormat ] = useState('png'); const capabilities: QrCodeCapabilities = useMemo(() => ({ - useSizeInPath: !versionMatch(selectedServer.version, { minVersion: '2.5.0' }), - svgIsSupported: versionMatch(selectedServer.version, { minVersion: '2.4.0' }), - marginIsSupported: versionMatch(selectedServer.version, { minVersion: '2.6.0' }), + useSizeInPath: !supportsQrCodeSizeInQuery(selectedServer), + svgIsSupported: supportsQrCodeSvgFormat(selectedServer), + marginIsSupported: supportsQrCodeMargin(selectedServer), }), [ selectedServer ]); const qrCodeUrl = useMemo( () => buildQrCodeUrl(shortUrl, { size, format, margin }, capabilities), diff --git a/src/short-urls/reducers/shortUrlTags.ts b/src/short-urls/reducers/shortUrlTags.ts index 0efc999f..cf0bfd8c 100644 --- a/src/short-urls/reducers/shortUrlTags.ts +++ b/src/short-urls/reducers/shortUrlTags.ts @@ -7,8 +7,7 @@ import { ShortUrlIdentifier } from '../data'; import { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder'; import { ProblemDetailsError } from '../../api/types'; import { parseApiError } from '../../api/utils'; -import { isReachableServer } from '../../servers/data'; -import { versionMatch } from '../../utils/helpers/version'; +import { supportsTagsInPatch } from '../../utils/helpers/features'; /* eslint-disable padding-line-between-statements */ export const EDIT_SHORT_URL_TAGS_START = 'shlink/shortUrlTags/EDIT_SHORT_URL_TAGS_START'; @@ -54,15 +53,12 @@ export const editShortUrlTags = (buildShlinkApiClient: ShlinkApiClientBuilder) = ) => async (dispatch: Dispatch, getState: GetState) => { dispatch({ type: EDIT_SHORT_URL_TAGS_START }); const { selectedServer } = getState(); - const supportsTagsInPatch = isReachableServer(selectedServer) && versionMatch( - selectedServer.version, - { minVersion: '2.6.0' }, - ); + const tagsInPatch = supportsTagsInPatch(selectedServer); const { updateShortUrlTags, updateShortUrlMeta } = buildShlinkApiClient(getState); try { const normalizedTags = await ( - supportsTagsInPatch + tagsInPatch ? updateShortUrlMeta(shortCode, domain, { tags }).then(prop('tags')) : updateShortUrlTags(shortCode, domain, tags) ); diff --git a/src/utils/helpers/features.ts b/src/utils/helpers/features.ts index 7a382477..44279433 100644 --- a/src/utils/helpers/features.ts +++ b/src/utils/helpers/features.ts @@ -4,4 +4,20 @@ import { versionMatch, Versions } from './version'; const serverMatchesVersions = (versions: Versions) => (selectedServer: SelectedServer): boolean => isReachableServer(selectedServer) && versionMatch(selectedServer.version, versions); -export const titleIsSupported = serverMatchesVersions({ minVersion: '2.6.0' }); +export const supportsSettingShortCodeLength = serverMatchesVersions({ minVersion: '2.1.0' }); + +export const supportsTagVisits = serverMatchesVersions({ minVersion: '2.2.0' }); + +export const supportsListingDomains = serverMatchesVersions({ minVersion: '2.4.0' }); + +export const supportsQrCodeSvgFormat = supportsListingDomains; + +export const supportsQrCodeSizeInQuery = serverMatchesVersions({ minVersion: '2.5.0' }); + +export const supportsShortUrlTitle = serverMatchesVersions({ minVersion: '2.6.0' }); + +export const supportsOrphanVisits = supportsShortUrlTitle; + +export const supportsQrCodeMargin = supportsShortUrlTitle; + +export const supportsTagsInPatch = supportsShortUrlTitle; diff --git a/src/utils/helpers/version.ts b/src/utils/helpers/version.ts index e3695eb1..41cf9ade 100644 --- a/src/utils/helpers/version.ts +++ b/src/utils/helpers/version.ts @@ -13,7 +13,7 @@ export interface Versions { minVersion?: SemVerPattern; } -export type SemVer = `${bigint}.${bigint}.${bigint}`; +export type SemVer = `${bigint}.${bigint}.${bigint}` | 'latest'; export const versionMatch = (versionToMatch: SemVer | Empty, { maxVersion, minVersion }: Versions): boolean => { if (!hasValue(versionToMatch)) { @@ -26,7 +26,7 @@ export const versionMatch = (versionToMatch: SemVer | Empty, { maxVersion, minVe return matchesMaxVersion && matchesMinVersion; }; -const versionIsValidSemVer = memoizeWith(identity, (version: string): version is SemVerPattern => { +const versionIsValidSemVer = memoizeWith(identity, (version: string): version is SemVer => { try { return compare(version, version, '='); } catch (e) { @@ -36,5 +36,5 @@ const versionIsValidSemVer = memoizeWith(identity, (version: string): version is export const versionToPrintable = (version: string) => !versionIsValidSemVer(version) ? version : `v${version}`; -export const versionToSemVer = (defaultValue = 'latest') => - (version: string) => versionIsValidSemVer(version) ? version : defaultValue; +export const versionToSemVer = (defaultValue: SemVer = 'latest') => + (version: string): SemVer => versionIsValidSemVer(version) ? version : defaultValue; diff --git a/test/utils/helpers/version.test.ts b/test/utils/helpers/version.test.ts index adcfdee9..8e817c2f 100644 --- a/test/utils/helpers/version.test.ts +++ b/test/utils/helpers/version.test.ts @@ -1,21 +1,23 @@ -import { versionMatch } from '../../../src/utils/helpers/version'; +import { Mock } from 'ts-mockery'; +import { SemVer, versionMatch, Versions } from '../../../src/utils/helpers/version'; +import { Empty } from '../../../src/utils/utils'; describe('version', () => { describe('versionMatch', () => { it.each([ - [ undefined, {}, false ], - [ null, {}, false ], - [ '', {}, false ], - [[], {}, false ], - [ '2.8.3', {}, true ], - [ '2.8.3', { minVersion: '2.0.0' }, true ], - [ '2.0.0', { minVersion: '2.0.0' }, true ], - [ '1.8.0', { maxVersion: '1.8.0' }, true ], - [ '1.7.1', { maxVersion: '1.8.0' }, true ], - [ '1.7.3', { minVersion: '1.7.0', maxVersion: '1.8.0' }, true ], - [ '1.8.3', { minVersion: '2.0.0' }, false ], - [ '1.8.3', { maxVersion: '1.8.0' }, false ], - [ '1.8.3', { minVersion: '1.7.0', maxVersion: '1.8.0' }, false ], + [ undefined, Mock.all(), false ], + [ null, Mock.all(), false ], + [ '' as Empty, Mock.all(), false ], + [[], Mock.all(), false ], + [ '2.8.3' as SemVer, Mock.all(), true ], + [ '2.8.3' as SemVer, Mock.of({ minVersion: '2.0.0' }), true ], + [ '2.0.0' as SemVer, Mock.of({ minVersion: '2.0.0' }), true ], + [ '1.8.0' as SemVer, Mock.of({ maxVersion: '1.8.0' }), true ], + [ '1.7.1' as SemVer, Mock.of({ maxVersion: '1.8.0' }), true ], + [ '1.7.3' as SemVer, Mock.of({ minVersion: '1.7.0', maxVersion: '1.8.0' }), true ], + [ '1.8.3' as SemVer, Mock.of({ minVersion: '2.0.0' }), false ], + [ '1.8.3' as SemVer, Mock.of({ maxVersion: '1.8.0' }), false ], + [ '1.8.3' as SemVer, Mock.of({ minVersion: '1.7.0', maxVersion: '1.8.0' }), false ], ])('properly matches versions based on what is provided', (version, versionConstraints, expected) => { expect(versionMatch(version, versionConstraints)).toEqual(expected); }); From bd7923000786eab02115181694a3ec935680aa65 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sat, 6 Mar 2021 10:16:13 +0100 Subject: [PATCH 3/3] Fixed version definition --- test/servers/helpers/ForServerVersion.test.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/servers/helpers/ForServerVersion.test.tsx b/test/servers/helpers/ForServerVersion.test.tsx index 2167b3d6..59031be7 100644 --- a/test/servers/helpers/ForServerVersion.test.tsx +++ b/test/servers/helpers/ForServerVersion.test.tsx @@ -26,9 +26,9 @@ describe('', () => { }); it.each([ - [ '2.0.0' as SemVer, undefined, '1.8.3' as SemVer ], - [ undefined, '1.8.0' as SemVer, '1.8.3' as SemVer ], - [ '1.7.0' as SemVer, '1.8.0' as SemVer, '1.8.3' as SemVer ], + [ '2.0.0' as SemVerPattern, undefined, '1.8.3' as SemVer ], + [ undefined, '1.8.0' as SemVerPattern, '1.8.3' as SemVer ], + [ '1.7.0' as SemVerPattern, '1.8.0' as SemVerPattern, '1.8.3' as SemVer ], ])('does not render children when current version does not match requirements', (min, max, version) => { const wrapped = renderComponent(Mock.of({ version, printableVersion: version }), min, max); @@ -36,11 +36,11 @@ describe('', () => { }); it.each([ - [ '2.0.0' as SemVer, undefined, '2.8.3' as SemVer ], - [ '2.0.0' as SemVer, undefined, '2.0.0' as SemVer ], - [ undefined, '1.8.0' as SemVer, '1.8.0' as SemVer ], - [ undefined, '1.8.0' as SemVer, '1.7.1' as SemVer ], - [ '1.7.0' as SemVer, '1.8.0' as SemVer, '1.7.3' as SemVer ], + [ '2.0.0' as SemVerPattern, undefined, '2.8.3' as SemVer ], + [ '2.0.0' as SemVerPattern, undefined, '2.0.0' as SemVer ], + [ undefined, '1.8.0' as SemVerPattern, '1.8.0' as SemVer ], + [ undefined, '1.8.0' as SemVerPattern, '1.7.1' as SemVer ], + [ '1.7.0' as SemVerPattern, '1.8.0' as SemVerPattern, '1.7.3' as SemVer ], ])('renders children when current version matches requirements', (min, max, version) => { const wrapped = renderComponent(Mock.of({ version, printableVersion: version }), min, max);