100% test coverage

master
Tudor Stanciu 2023-02-12 03:27:22 +02:00
parent 385dd3325b
commit dbed1a4ce9
7 changed files with 119 additions and 27 deletions

21
.vscode/launch.json vendored
View File

@ -1,14 +1,11 @@
{ {
"name": "Jest file", "configurations": [
"type": "node", {
"request": "launch", "name": "Attach",
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/jest", "port": 9229,
"args": ["${fileBasenameNoExtension}", "--runInBand", "--watch", "--coverage=false", "--no-cache"], "request": "attach",
"cwd": "${workspaceRoot}", "skipFiles": ["<node_internals>/**"],
"console": "integratedTerminal", "type": "node"
"internalConsoleOptions": "neverOpen", }
"sourceMaps": true, ]
"windows": {
"program": "${workspaceFolder}/node_modules/jest/bin/jest"
}
} }

14
package-lock.json generated
View File

@ -9,7 +9,7 @@
"version": "1.0.0", "version": "1.0.0",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@flare/tuitio-client": "^1.0.3" "@flare/tuitio-client": "^1.0.4"
}, },
"devDependencies": { "devDependencies": {
"@testing-library/react": "^12.1.5", "@testing-library/react": "^12.1.5",
@ -707,9 +707,9 @@
"integrity": "sha512-VgXQHoQEVZ/71B6YQHQP8/Yd/w1smGD+kCCiNvJKZ1xMD3nkN9mjoHxIqbOJMZ2q5PZlV6gXYT7eVol8Wm+D0A==" "integrity": "sha512-VgXQHoQEVZ/71B6YQHQP8/Yd/w1smGD+kCCiNvJKZ1xMD3nkN9mjoHxIqbOJMZ2q5PZlV6gXYT7eVol8Wm+D0A=="
}, },
"node_modules/@flare/tuitio-client": { "node_modules/@flare/tuitio-client": {
"version": "1.0.3", "version": "1.0.4",
"resolved": "https://lab.code-rove.com/public-node-registry/@flare/tuitio-client/-/tuitio-client-1.0.3.tgz", "resolved": "https://lab.code-rove.com/public-node-registry/@flare/tuitio-client/-/tuitio-client-1.0.4.tgz",
"integrity": "sha512-XlNje3e985ruGtJaKUZLY6kRsgcPG0UhoYZfWjDnAsaoC15rbHc+RF3iBOO42Z7eMPDm00UYu54NiqOagu9geg==", "integrity": "sha512-NTG0eB0EztcUEl3xEiGo7FY8YQP7/TxNIko65U3Mhs7Zm5+IVXlr7HcLbEr89mqaVtJmRRt1i8u/z/y0lCChwg==",
"dependencies": { "dependencies": {
"@flare/js-utils": "^1.0.3", "@flare/js-utils": "^1.0.3",
"axios": "^1.3.2" "axios": "^1.3.2"
@ -7392,9 +7392,9 @@
"integrity": "sha512-VgXQHoQEVZ/71B6YQHQP8/Yd/w1smGD+kCCiNvJKZ1xMD3nkN9mjoHxIqbOJMZ2q5PZlV6gXYT7eVol8Wm+D0A==" "integrity": "sha512-VgXQHoQEVZ/71B6YQHQP8/Yd/w1smGD+kCCiNvJKZ1xMD3nkN9mjoHxIqbOJMZ2q5PZlV6gXYT7eVol8Wm+D0A=="
}, },
"@flare/tuitio-client": { "@flare/tuitio-client": {
"version": "1.0.3", "version": "1.0.4",
"resolved": "https://lab.code-rove.com/public-node-registry/@flare/tuitio-client/-/tuitio-client-1.0.3.tgz", "resolved": "https://lab.code-rove.com/public-node-registry/@flare/tuitio-client/-/tuitio-client-1.0.4.tgz",
"integrity": "sha512-XlNje3e985ruGtJaKUZLY6kRsgcPG0UhoYZfWjDnAsaoC15rbHc+RF3iBOO42Z7eMPDm00UYu54NiqOagu9geg==", "integrity": "sha512-NTG0eB0EztcUEl3xEiGo7FY8YQP7/TxNIko65U3Mhs7Zm5+IVXlr7HcLbEr89mqaVtJmRRt1i8u/z/y0lCChwg==",
"requires": { "requires": {
"@flare/js-utils": "^1.0.3", "@flare/js-utils": "^1.0.3",
"axios": "^1.3.2" "axios": "^1.3.2"

View File

@ -48,7 +48,7 @@
"README.md" "README.md"
], ],
"dependencies": { "dependencies": {
"@flare/tuitio-client": "^1.0.3" "@flare/tuitio-client": "^1.0.4"
}, },
"peerDependencies": { "peerDependencies": {
"react": "^16.14.0" "react": "^16.14.0"

View File

@ -17,8 +17,8 @@ const useTuitioClient = (options: TuitioClientHookOptions) => {
const login = async (userName: string, password: string) => { const login = async (userName: string, password: string) => {
try { try {
const connector = new TuitioClient(state.configuration.tuitioUrl); const client = new TuitioClient(state.configuration.tuitioUrl);
const response = await connector.authenticate(userName, password); const response = await client.authenticate(userName, password);
if (response.token) { if (response.token) {
dispatchActions.onLoginSuccess(response.token, userName); dispatchActions.onLoginSuccess(response.token, userName);
onLoginSuccess && onLoginSuccess(response, userName); onLoginSuccess && onLoginSuccess(response, userName);

View File

@ -1,7 +1,7 @@
import type { TuitioToken } from "@flare/tuitio-client"; import type { TuitioToken } from "@flare/tuitio-client";
export type TuitioConfiguration = { tuitioUrl: string | null }; export type TuitioConfiguration = { tuitioUrl: string | null };
export type TuitioReactState = { userName: string; token: TuitioToken; configuration: TuitioConfiguration }; export type TuitioReactState = { userName: string; token: TuitioToken | null; configuration: TuitioConfiguration };
export type TuitioDispatchActions = { export type TuitioDispatchActions = {
onLoginSuccess: (token: TuitioToken, userName: string) => void; onLoginSuccess: (token: TuitioToken, userName: string) => void;
onLogout: () => void; onLogout: () => void;

View File

@ -0,0 +1,75 @@
import React from "react";
import { renderHook } from "@testing-library/react-hooks";
import { TuitioContext } from "../../src/contexts";
import { useTuitioToken } from "../../src/hooks";
describe("useTuitioToken: positive flow", () => {
const testState = {
userName: "test-user",
token: {
raw: "mocked-token",
validFrom: new Date(),
validUntil: new Date()
},
configuration: {
tuitioUrl: null
}
};
testState.token.validFrom.setHours(testState.token.validFrom.getHours() - 1);
testState.token.validUntil.setHours(testState.token.validUntil.getHours() + 1);
const wrapper = ({ children }: { children?: React.ReactNode }) => (
<TuitioContext.Provider value={testState}>{children}</TuitioContext.Provider>
);
it("should return the correct token object", () => {
const { result } = renderHook(() => useTuitioToken(), { wrapper });
expect(result.current.token).toEqual({
raw: "mocked-token",
validFrom: expect.any(Date),
validUntil: expect.any(Date)
});
});
it("should return false value for valid", () => {
const { result } = renderHook(() => useTuitioToken(), { wrapper });
expect(result.current.valid).toBe(true);
});
it("validate should return true value", () => {
const { result } = renderHook(() => useTuitioToken(), { wrapper });
const valid = result.current.validate();
expect(valid).toBe(true);
});
});
describe("useTuitioToken: negative flow", () => {
const testState = {
userName: "test-user",
token: null,
configuration: {
tuitioUrl: null
}
};
const wrapper = ({ children }: { children?: React.ReactNode }) => (
<TuitioContext.Provider value={testState}>{children}</TuitioContext.Provider>
);
it("should return null for token", () => {
const { result } = renderHook(() => useTuitioToken(), { wrapper });
expect(result.current.token).toBeNull();
});
it("should return false value for valid", () => {
const { result } = renderHook(() => useTuitioToken(), { wrapper });
expect(result.current.valid).toBe(false);
});
it("validate should return false value", () => {
const { result } = renderHook(() => useTuitioToken(), { wrapper });
const valid = result.current.validate();
expect(valid).toBe(false);
});
});

View File

@ -3,14 +3,14 @@ import { renderHook } from "@testing-library/react-hooks";
import { TuitioContext } from "../../src/contexts"; import { TuitioContext } from "../../src/contexts";
import { useTuitioUser } from "../../src/hooks"; import { useTuitioUser } from "../../src/hooks";
describe("useTuitioUser", () => { describe("useTuitioUser: positive flow", () => {
it("should return the userName and lastLoginDate from the TuitioContext", () => { it("should return the userName and lastLoginDate from the TuitioContext", () => {
const testState = { const testState = {
userName: "test-user", userName: "test-user",
token: { token: {
raw: "mocked-token", raw: "mocked-token",
validFrom: new Date(2022, 1, 1), validFrom: new Date(2023, 1, 1),
validUntil: new Date(2022, 12, 31) validUntil: new Date(2023, 12, 31)
}, },
configuration: { configuration: {
tuitioUrl: null tuitioUrl: null
@ -23,6 +23,26 @@ describe("useTuitioUser", () => {
const { result } = renderHook(() => useTuitioUser(), { wrapper }); const { result } = renderHook(() => useTuitioUser(), { wrapper });
expect(result.current.userName).toEqual("test-user"); expect(result.current.userName).toEqual("test-user");
expect(result.current.lastLoginDate).toEqual(new Date(2022, 1, 1)); expect(result.current.lastLoginDate).toEqual(new Date(2023, 1, 1));
});
});
describe("useTuitioUser: negative flow", () => {
it("should return the userName and lastLoginDate from the TuitioContext", () => {
const testState = {
userName: "test-user",
token: null,
configuration: {
tuitioUrl: null
}
};
const wrapper = ({ children }: { children?: React.ReactNode }) => (
<TuitioContext.Provider value={testState}>{children}</TuitioContext.Provider>
);
const { result } = renderHook(() => useTuitioUser(), { wrapper });
expect(result.current.userName).toEqual("test-user");
expect(result.current.lastLoginDate).toBe(undefined);
}); });
}); });