mirror of
https://github.com/shlinkio/shlink-web-client.git
synced 2026-03-03 14:21:49 +00:00
Introduce shoehorn as a possible replacement for ts-mockery
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import { render, screen } from '@testing-library/react';
|
||||
import { Mock } from 'ts-mockery';
|
||||
import { fromPartial } from '@total-typescript/shoehorn';
|
||||
import type { ShlinkApiErrorProps } from '../../src/api/ShlinkApiError';
|
||||
import { ShlinkApiError } from '../../src/api/ShlinkApiError';
|
||||
import type { InvalidArgumentError, ProblemDetailsError } from '../../src/api/types/errors';
|
||||
@@ -10,8 +10,8 @@ describe('<ShlinkApiError />', () => {
|
||||
|
||||
it.each([
|
||||
[undefined, 'the fallback', 'the fallback'],
|
||||
[Mock.all<ProblemDetailsError>(), 'the fallback', 'the fallback'],
|
||||
[Mock.of<ProblemDetailsError>({ detail: 'the detail' }), 'the fallback', 'the detail'],
|
||||
[fromPartial<ProblemDetailsError>({}), 'the fallback', 'the fallback'],
|
||||
[fromPartial<ProblemDetailsError>({ detail: 'the detail' }), 'the fallback', 'the detail'],
|
||||
])('renders proper message', (errorData, fallbackMessage, expectedMessage) => {
|
||||
const { container } = setUp({ errorData, fallbackMessage });
|
||||
|
||||
@@ -21,9 +21,9 @@ describe('<ShlinkApiError />', () => {
|
||||
|
||||
it.each([
|
||||
[undefined, 0],
|
||||
[Mock.all<ProblemDetailsError>(), 0],
|
||||
[Mock.of<InvalidArgumentError>({ type: ErrorTypeV2.INVALID_ARGUMENT, invalidElements: [] }), 1],
|
||||
[Mock.of<InvalidArgumentError>({ type: ErrorTypeV3.INVALID_ARGUMENT, invalidElements: [] }), 1],
|
||||
[fromPartial<ProblemDetailsError>({}), 0],
|
||||
[fromPartial<InvalidArgumentError>({ type: ErrorTypeV2.INVALID_ARGUMENT, invalidElements: [] }), 1],
|
||||
[fromPartial<InvalidArgumentError>({ type: ErrorTypeV3.INVALID_ARGUMENT, invalidElements: [] }), 1],
|
||||
])('renders list of invalid elements when provided error is an InvalidError', (errorData, expectedElementsCount) => {
|
||||
setUp({ errorData });
|
||||
expect(screen.queryAllByText(/^Invalid elements/)).toHaveLength(expectedElementsCount);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Mock } from 'ts-mockery';
|
||||
import { fromPartial } from '@total-typescript/shoehorn';
|
||||
import { ShlinkApiClient } from '../../../src/api/services/ShlinkApiClient';
|
||||
import type { ShlinkDomain, ShlinkVisits, ShlinkVisitsOverview } from '../../../src/api/types';
|
||||
import { ErrorTypeV2, ErrorTypeV3 } from '../../../src/api/types/errors';
|
||||
@@ -9,7 +9,7 @@ import type { OptionalString } from '../../../src/utils/utils';
|
||||
describe('ShlinkApiClient', () => {
|
||||
const fetchJson = jest.fn().mockResolvedValue({});
|
||||
const fetchEmpty = jest.fn().mockResolvedValue(undefined);
|
||||
const httpClient = Mock.of<HttpClient>({ fetchJson, fetchEmpty });
|
||||
const httpClient = fromPartial<HttpClient>({ fetchJson, fetchEmpty });
|
||||
const buildApiClient = () => new ShlinkApiClient(httpClient, '', '');
|
||||
const shortCodesWithDomainCombinations: [string, OptionalString][] = [
|
||||
['abc123', null],
|
||||
@@ -177,7 +177,7 @@ describe('ShlinkApiClient', () => {
|
||||
maxVisits: 50,
|
||||
validSince: '2025-01-01T10:00:00+01:00',
|
||||
};
|
||||
const expectedResp = Mock.of<ShortUrl>();
|
||||
const expectedResp = fromPartial<ShortUrl>({});
|
||||
fetchJson.mockResolvedValue(expectedResp);
|
||||
const { updateShortUrl } = buildApiClient();
|
||||
const expectedQuery = domain ? `?domain=${domain}` : '';
|
||||
@@ -311,7 +311,7 @@ describe('ShlinkApiClient', () => {
|
||||
|
||||
describe('listDomains', () => {
|
||||
it('returns domains', async () => {
|
||||
const expectedData = { data: [Mock.all<ShlinkDomain>(), Mock.all<ShlinkDomain>()] };
|
||||
const expectedData = { data: [fromPartial<ShlinkDomain>({}), fromPartial<ShlinkDomain>({})] };
|
||||
fetchJson.mockResolvedValue({ domains: expectedData });
|
||||
const { listDomains } = buildApiClient();
|
||||
|
||||
@@ -324,7 +324,7 @@ describe('ShlinkApiClient', () => {
|
||||
|
||||
describe('getVisitsOverview', () => {
|
||||
it('returns visits overview', async () => {
|
||||
const expectedData = Mock.all<ShlinkVisitsOverview>();
|
||||
const expectedData = fromPartial<ShlinkVisitsOverview>({});
|
||||
fetchJson.mockResolvedValue({ visits: expectedData });
|
||||
const { getVisitsOverview } = buildApiClient();
|
||||
|
||||
@@ -337,7 +337,7 @@ describe('ShlinkApiClient', () => {
|
||||
|
||||
describe('getOrphanVisits', () => {
|
||||
it('returns orphan visits', async () => {
|
||||
fetchJson.mockResolvedValue({ visits: Mock.of<ShlinkVisits>({ data: [] }) });
|
||||
fetchJson.mockResolvedValue({ visits: fromPartial<ShlinkVisits>({ data: [] }) });
|
||||
const { getOrphanVisits } = buildApiClient();
|
||||
|
||||
const result = await getOrphanVisits();
|
||||
@@ -349,7 +349,7 @@ describe('ShlinkApiClient', () => {
|
||||
|
||||
describe('getNonOrphanVisits', () => {
|
||||
it('returns non-orphan visits', async () => {
|
||||
fetchJson.mockResolvedValue({ visits: Mock.of<ShlinkVisits>({ data: [] }) });
|
||||
fetchJson.mockResolvedValue({ visits: fromPartial<ShlinkVisits>({ data: [] }) });
|
||||
const { getNonOrphanVisits } = buildApiClient();
|
||||
|
||||
const result = await getNonOrphanVisits();
|
||||
|
||||
@@ -1,15 +1,13 @@
|
||||
import { Mock } from 'ts-mockery';
|
||||
import { fromPartial } from '@total-typescript/shoehorn';
|
||||
import { buildShlinkApiClient } from '../../../src/api/services/ShlinkApiClientBuilder';
|
||||
import type { HttpClient } from '../../../src/common/services/HttpClient';
|
||||
import type { ShlinkState } from '../../../src/container/types';
|
||||
import type { ReachableServer, SelectedServer } from '../../../src/servers/data';
|
||||
|
||||
describe('ShlinkApiClientBuilder', () => {
|
||||
const server = (data: Partial<ReachableServer>) => Mock.of<ReachableServer>(data);
|
||||
const server = fromPartial<ReachableServer>;
|
||||
|
||||
const createBuilder = () => {
|
||||
const builder = buildShlinkApiClient(Mock.of<HttpClient>());
|
||||
return (selectedServer: SelectedServer) => builder(() => Mock.of<ShlinkState>({ selectedServer }));
|
||||
const builder = buildShlinkApiClient(fromPartial({}));
|
||||
return (selectedServer: SelectedServer) => builder(() => fromPartial({ selectedServer }));
|
||||
};
|
||||
|
||||
it('creates new instances when provided params are different', async () => {
|
||||
@@ -42,7 +40,7 @@ describe('ShlinkApiClientBuilder', () => {
|
||||
it('does not fetch from state when provided param is already selected server', () => {
|
||||
const url = 'url';
|
||||
const apiKey = 'apiKey';
|
||||
const apiClient = buildShlinkApiClient(Mock.of<HttpClient>())(server({ url, apiKey }));
|
||||
const apiClient = buildShlinkApiClient(fromPartial({}))(server({ url, apiKey }));
|
||||
|
||||
expect(apiClient['baseUrl']).toEqual(url); // eslint-disable-line @typescript-eslint/dot-notation
|
||||
expect(apiClient['apiKey']).toEqual(apiKey); // eslint-disable-line @typescript-eslint/dot-notation
|
||||
|
||||
Reference in New Issue
Block a user