diff --git a/CHANGELOG.md b/CHANGELOG.md index c1e09e6c..7ac45fb2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### Changed * [#408](https://github.com/shlinkio/shlink-web-client/issues/408) Updated to Chart.js 3.5 * [#486](https://github.com/shlinkio/shlink-web-client/issues/486) Refactored components used to render visits charts, making them easier to maintain and understand. +* [#409](https://github.com/shlinkio/shlink-web-client/issues/409) Increased required code coverage and added hard threshold check. ### Deprecated * *Nothing* diff --git a/jest.config.js b/jest.config.js index d1896e6f..3745d53d 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,13 +1,20 @@ module.exports = { coverageDirectory: '/coverage', collectCoverageFrom: [ - 'src/**/*.{js,ts,tsx}', - '!src/registerServiceWorker.js', - '!src/index.ts', + 'src/**/*.{ts,tsx}', + '!src/*.{ts,tsx}', '!src/reducers/index.ts', '!src/**/provideServices.ts', '!src/container/*.ts', ], + coverageThreshold: { + global: { + statements: 85, + branches: 75, + functions: 80, + lines: 85, + }, + }, resolver: 'jest-pnp-resolver', setupFiles: [ 'react-app-polyfill/jsdom', diff --git a/package.json b/package.json index 900cc2c5..dbfd828f 100644 --- a/package.json +++ b/package.json @@ -16,8 +16,9 @@ "serve:build": "serve ./build", "build": "node scripts/build.js", "test": "node scripts/test.js --env=jsdom --colors --verbose", - "test:ci": "npm run test -- --coverage --coverageReporters=text --coverageReporters=text-summary --coverageReporters=clover", - "test:pretty": "npm run test -- --coverage --coverageReporters=text --coverageReporters=text-summary --coverageReporters=html", + "test:coverage": "npm run test -- --coverage --coverageReporters=text --coverageReporters=text-summary", + "test:ci": "npm run test:coverage -- --coverageReporters=clover", + "test:pretty": "npm run test:coverage -- --coverageReporters=html", "mutate": "./node_modules/.bin/stryker run --concurrency 4" }, "dependencies": { diff --git a/src/api/services/ShlinkApiClient.ts b/src/api/services/ShlinkApiClient.ts index 2087b6b6..315be26b 100644 --- a/src/api/services/ShlinkApiClient.ts +++ b/src/api/services/ShlinkApiClient.ts @@ -1,4 +1,3 @@ -import qs from 'qs'; import { isEmpty, isNil, reject } from 'ramda'; import { AxiosInstance, AxiosResponse, Method } from 'axios'; import { ShortUrlsListParams } from '../../short-urls/reducers/shortUrlsListParams'; @@ -19,6 +18,7 @@ import { ShlinkEditDomainRedirects, ShlinkDomainRedirects, } from '../types'; +import { stringifyQuery } from '../../utils/helpers/query'; const buildShlinkBaseUrl = (url: string, apiVersion: number) => url ? `${url}/rest/v${apiVersion}` : ''; const rejectNilProps = reject(isNil); @@ -123,7 +123,7 @@ export default class ShlinkApiClient { headers: { 'X-Api-Key': this.apiKey }, params: rejectNilProps(query), data: body, - paramsSerializer: (params) => qs.stringify(params, { arrayFormat: 'brackets' }), + paramsSerializer: stringifyQuery, }); } catch (e) { const { response } = e; diff --git a/src/App.scss b/src/app/App.scss similarity index 93% rename from src/App.scss rename to src/app/App.scss index a6566e27..538c0179 100644 --- a/src/App.scss +++ b/src/app/App.scss @@ -1,4 +1,4 @@ -@import './utils/base'; +@import '../utils/base'; .app-container { height: 100%; diff --git a/src/App.tsx b/src/app/App.tsx similarity index 83% rename from src/App.tsx rename to src/app/App.tsx index d8ac9b2a..d8b91056 100644 --- a/src/App.tsx +++ b/src/app/App.tsx @@ -1,11 +1,11 @@ import { useEffect, FC } from 'react'; import { Route, Switch } from 'react-router-dom'; -import NotFound from './common/NotFound'; -import { ServersMap } from './servers/data'; -import { Settings } from './settings/reducers/settings'; -import { changeThemeInMarkup } from './utils/theme'; -import { AppUpdateBanner } from './common/AppUpdateBanner'; -import { forceUpdate } from './utils/helpers/sw'; +import NotFound from '../common/NotFound'; +import { ServersMap } from '../servers/data'; +import { Settings } from '../settings/reducers/settings'; +import { changeThemeInMarkup } from '../utils/theme'; +import { AppUpdateBanner } from '../common/AppUpdateBanner'; +import { forceUpdate } from '../utils/helpers/sw'; import './App.scss'; interface AppProps { diff --git a/src/app/services/provideServices.ts b/src/app/services/provideServices.ts index 1564b874..4dff9f31 100644 --- a/src/app/services/provideServices.ts +++ b/src/app/services/provideServices.ts @@ -1,6 +1,6 @@ import Bottle from 'bottlejs'; import { appUpdateAvailable, resetAppUpdate } from '../reducers/appUpdates'; -import App from '../../App'; +import App from '../App'; import { ConnectDecorator } from '../../container/types'; const provideServices = (bottle: Bottle, connect: ConnectDecorator) => { diff --git a/src/common/MainHeader.tsx b/src/common/MainHeader.tsx index 4c213a7b..245a0499 100644 --- a/src/common/MainHeader.tsx +++ b/src/common/MainHeader.tsx @@ -31,7 +31,7 @@ const MainHeader = (ServersDropdown: FC) => ({ location }: RouteComponentProps)