diff --git a/client/src/components/atoms/VersionNumbers/index.test.tsx b/client/src/components/atoms/VersionNumbers/index.test.tsx index 330b3f9..94ec2c7 100644 --- a/client/src/components/atoms/VersionNumbers/index.test.tsx +++ b/client/src/components/atoms/VersionNumbers/index.test.tsx @@ -1,29 +1,124 @@ import React from 'react' import { render, waitForElement } from '@testing-library/react' import mockAxios from 'jest-mock-axios' -import VersionNumbers from '.' +import { StateMock } from '@react-mock/state' +import { version as versionSquid } from '@oceanprotocol/squid/package.json' +import VersionNumbers, { commonsVersion } from '.' afterEach(() => { mockAxios.reset() }) +const stateMock = { + commons: { software: 'Commons', version: commonsVersion }, + squidJs: { + software: 'Squid-js', + version: versionSquid + }, + aquarius: { + isLoading: false, + software: 'Aquarius', + version: '' + }, + brizo: { + isLoading: false, + software: 'Brizo', + version: '', + contracts: {}, + network: '', + 'keeper-version': '0.0.0', + 'keeper-url': '' + }, + keeperContracts: { + isLoading: false, + software: 'Keeper Contracts', + version: '', + contracts: {}, + network: '' + }, + faucet: { + isLoading: false, + software: 'Faucet', + version: '' + } +} + +const stateMockIncomplete = { + commons: { software: 'Commons', version: commonsVersion }, + squidJs: { + software: 'Squid-js', + version: versionSquid + }, + aquarius: { + isLoading: false, + software: 'Aquarius', + version: undefined + }, + brizo: { + isLoading: false, + software: 'Brizo', + version: undefined, + contracts: undefined, + network: undefined, + 'keeper-version': undefined, + 'keeper-url': undefined + }, + keeperContracts: { + isLoading: false, + software: 'Keeper Contracts', + version: undefined, + contracts: undefined, + network: undefined + }, + faucet: { + isLoading: false, + software: 'Faucet', + version: undefined + } +} + const mockResponse = { data: { software: 'Brizo', version: '6.6.6', contracts: { Hello: 'Hello', Another: 'Hello' }, - network: 'hello' + network: 'hello', + 'keeper-url': 'https://squid.com', + 'keeper-version': '6.6.6' } } +const mockResponseFaulty = { + status: 404, + statusText: 'Not Found', + data: {} +} + describe('VersionNumbers', () => { it('renders without crashing', () => { - const { container } = render() + const { container } = render( + + + + ) mockAxios.mockResponse(mockResponse) expect(mockAxios.get).toHaveBeenCalled() expect(container.firstChild).toBeInTheDocument() }) + it('renders without proper component response', () => { + const { container } = render( + + + + ) + mockAxios.mockResponse(mockResponseFaulty) + expect(mockAxios.get).toHaveBeenCalled() + expect(container.querySelector('table')).toHaveTextContent( + 'Could not get version' + ) + }) + it('minimal component versions in link title, prefixed with `v`', async () => { const { getByTitle } = render() mockAxios.mockResponse(mockResponse) diff --git a/client/src/components/atoms/VersionNumbers/index.tsx b/client/src/components/atoms/VersionNumbers/index.tsx index e39e0bf..e7edbfc 100644 --- a/client/src/components/atoms/VersionNumbers/index.tsx +++ b/client/src/components/atoms/VersionNumbers/index.tsx @@ -18,8 +18,9 @@ import { } from '../../../config' import VersionTable from './VersionTable' +import { isJsonString } from './utils' -const commonsVersion = +export const commonsVersion = process.env.NODE_ENV === 'production' ? version : `${version}-dev` interface VersionNumbersProps { @@ -120,7 +121,8 @@ export default class VersionNumbers extends PureComponent< aquariusHost, aquariusPort ) - aquarius.version !== undefined && + aquarius && + aquarius.version !== undefined && this.setState({ aquarius: { isLoading: false, ...aquarius } }) } @@ -133,7 +135,8 @@ export default class VersionNumbers extends PureComponent< brizo['keeper-url'] && new URL(brizo['keeper-url']).hostname.split('.')[0] - brizo.version !== undefined && + brizo && + brizo.version !== undefined && this.setState({ brizo: { isLoading: false, @@ -153,22 +156,14 @@ export default class VersionNumbers extends PureComponent< const faucet = await this.getData(faucetScheme, faucetHost, faucetPort) // backwards compatibility - function IsJsonString(str: string) { - try { - JSON.parse(str) - } catch (e) { - return false - } - return true - } - - IsJsonString(faucet) === false && + isJsonString(faucet) === false && this.setState({ faucet: { ...this.state.faucet, isLoading: false } }) // the new thing - faucet.version !== undefined && + faucet && + faucet.version !== undefined && this.setState({ faucet: { isLoading: false, ...faucet } }) } @@ -179,10 +174,8 @@ export default class VersionNumbers extends PureComponent< cancelToken: this.signal.token }) - if (response.status !== 200) { - Logger.error(response.statusText) - return - } + // fail silently + if (response.status !== 200) return return response.data } catch (error) { diff --git a/client/src/components/atoms/VersionNumbers/utils.test.ts b/client/src/components/atoms/VersionNumbers/utils.test.ts new file mode 100644 index 0000000..0fa7677 --- /dev/null +++ b/client/src/components/atoms/VersionNumbers/utils.test.ts @@ -0,0 +1,11 @@ +import { isJsonString } from './utils' + +describe('isJsonString', () => { + it('detects json correctly', () => { + const testJson = isJsonString('{ "hello": "squid" }') + expect(testJson).toBeTruthy() + + const testNonJson = isJsonString('') + expect(testNonJson).toBeFalsy() + }) +}) diff --git a/client/src/components/atoms/VersionNumbers/utils.ts b/client/src/components/atoms/VersionNumbers/utils.ts new file mode 100644 index 0000000..0b12378 --- /dev/null +++ b/client/src/components/atoms/VersionNumbers/utils.ts @@ -0,0 +1,8 @@ +export function isJsonString(str: string) { + try { + JSON.parse(str) + } catch (e) { + return false + } + return true +}