diff --git a/src/components/Cars/Status/TRexLogsTab.test.jsx b/src/components/Cars/Status/TRexLogsTab.test.jsx new file mode 100644 index 0000000..aea08a9 --- /dev/null +++ b/src/components/Cars/Status/TRexLogsTab.test.jsx @@ -0,0 +1,46 @@ +jest.mock("../../Contexts/VehicleContext"); +jest.mock("../../Contexts/StatusContext"); +jest.mock("../../Contexts/UserContext"); +jest.mock("@material-ui/core/utils/unstable_useId", () => + jest.fn().mockReturnValue("mui-test-id") +); + +import { BrowserRouter } from "react-router-dom"; +import { VehicleProvider } from "../../Contexts/VehicleContext"; +import { render, waitFor } from "@testing-library/react"; +import { StatusProvider } from "../../Contexts/StatusContext"; +import { setToken, UserProvider } from "../../Contexts/UserContext"; +import MainForm from "./TRexLogsTab"; +import addSnapshotSerializer from "../../../utils/snapshot"; +import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing"; +import React from "react"; + +const renderTRexLogsTab = async () => { + const { container } = render( + + + + + + + + + + ); + await waitFor(() => { + /* render */ + }); + return container; +}; + +describe("TRexLogsTab", () => { + beforeAll(() => { + addSnapshotSerializer(expect); + }); + + it("Render", async () => { + setToken(TEST_AUTH_OBJECT_FISKER); + const container = await renderTRexLogsTab(); + expect(container).toMatchSnapshot(); + }); +}); diff --git a/src/components/Cars/Status/__snapshots__/TRexLogsTab.test.jsx.snap b/src/components/Cars/Status/__snapshots__/TRexLogsTab.test.jsx.snap new file mode 100644 index 0000000..e6d37b2 --- /dev/null +++ b/src/components/Cars/Status/__snapshots__/TRexLogsTab.test.jsx.snap @@ -0,0 +1,583 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`TRexLogsTab Render 1`] = ` +
+
+
+
+
+
+
+ T.Rex Logs +
+
+ + + + + + + + + +
+
+ + Log levels + +
+ + + + + + +
+
+
+
+ +
+ +
+ +
+
+ +
+
+
+ +
+ +
+ +
+
+
+
+ No logs for 2024-07-18 + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ Level + + T.Rex Timestamp + + Cloud Timestamp + + Line Number + + Filename + + Message +
+
+
+
+
+
+
+
+`; diff --git a/src/components/Contexts/__mocks__/ManifestsContext.jsx b/src/components/Contexts/__mocks__/ManifestsContext.jsx index 5c02afc..a7ef446 100644 --- a/src/components/Contexts/__mocks__/ManifestsContext.jsx +++ b/src/components/Contexts/__mocks__/ManifestsContext.jsx @@ -54,6 +54,7 @@ let manifest = { updated: "2022-01-14T00:47:08.996451Z", active: true, sums: "2023.03.00.00.E", + notify_sap: false, }; let manifests = [ { @@ -64,6 +65,7 @@ let manifests = [ updated: "2021-07-12T18:22:13.736755Z", active: true, sums: "2023.03.00.00.E", + notify_sap: false, }, ]; let totalManifests = 1; diff --git a/src/components/Controls/TRexLogs/index.jsx b/src/components/Controls/TRexLogs/index.jsx index 9d0bf8a..09052e7 100644 --- a/src/components/Controls/TRexLogs/index.jsx +++ b/src/components/Controls/TRexLogs/index.jsx @@ -26,6 +26,8 @@ import { TableHead } from "@mui/material"; import { logger } from "../../../services/monitoring"; import { LocalDateTimeString } from "../../../utils/dates"; import { useStatusContext } from "../../Contexts/StatusContext"; +import { useLocalStorage } from "../../useLocalStorage"; +import SearchField from "../../Controls/SearchField"; const tableColumns = [ { @@ -132,11 +134,12 @@ const TRexLogsTable = ({ vin, token, classes }) => { const local_date = new Date() const [selectedDate, setSelectedDate] = useState(new Date(local_date.getUTCFullYear(), local_date.getUTCMonth(), local_date.getUTCDate())); const [total, setTotal] = useState(0); + const [search, setSearch] = useLocalStorage("TREX_LOGS_SEARCH", ""); const { setMessage } = useStatusContext(); let controller = new AbortController() const readBlob = async (offset, count) => { - return await api.getTRexLogs(vin, fromatDateForRequest(selectedDate), offset, count, "UP", token, controller) + return await api.getTRexLogs(vin, search, fromatDateForRequest(selectedDate), offset, count, "UP", token, controller) } const getDesiredSize = () => { return pageSize * pageIndex + pageSize @@ -218,7 +221,7 @@ const TRexLogsTable = ({ vin, token, classes }) => { })(); return () => controller?.abort() // eslint-disable-next-line react-hooks/exhaustive-deps - }, [vin, token, pageIndex, pageSize, selectedDate, currectLogLevels]); + }, [vin, token, search, pageIndex, pageSize, selectedDate, currectLogLevels]); const handleChangePageSize = (event) => { setPageSize(parseInt(event.target.value, 10)); @@ -242,63 +245,75 @@ const TRexLogsTable = ({ vin, token, classes }) => { [event.target.defaultValue]: event.target.checked, }); }; + + const handleSearch = (query) => { + setSearch(query); + }; + return (
- - - - Log levels - - {logLevelCheckBoxes.map((box) => ( - } - label={box.label} - labelPlacement="bottom" - onChange={handleNewFilter} - /> - ))} - - - + + + + + Log levels + + {logLevelCheckBoxes.map((box) => ( + } + label={box.label} + labelPlacement="bottom" + onChange={handleNewFilter} + /> + ))} + + + - - - - - + + + + + - - { - blobSize === 0 ? `No logs for ${fromatDateForRequest(selectedDate)}` : - `Read ${getReadPercentage().toFixed(2)}% of logs` - } - { - - } -

- -
+ + + -
+ + { + blobSize === 0 ? `No logs for ${fromatDateForRequest(selectedDate)}` : + `Read ${getReadPercentage().toFixed(2)}% of logs` + } + { + + } +

+ +
+ +
+
{ return signals; }, - getTRexLogs: async (vin, date, offset, count, direction, token) => { + getTRexLogs: async (vin, search, date, offset, count, direction, token) => { return trexLogs; }, getVersionLog: async (vin) => ({ diff --git a/src/services/vehiclesAPI.js b/src/services/vehiclesAPI.js index e8f6455..8915aee 100644 --- a/src/services/vehiclesAPI.js +++ b/src/services/vehiclesAPI.js @@ -224,8 +224,8 @@ const vehiclesAPI = { .catch(errorHandler); }, - getTRexLogs: async (vin, date, offset, count, direction, token, controller) => - fetch(`${API_ENDPOINT}/vehicle/${vin}/trex-logs?date=${date}&offset=${offset}&count=${count}&direction=${direction}`, { + getTRexLogs: async (vin, search, date, offset, count, direction, token, controller) => + fetch(`${API_ENDPOINT}/vehicle/${vin}/trex-logs?date=${date}&offset=${offset}&count=${count}&direction=${direction}&search=${search}`, { method: "GET", headers: Object.assign( { "Content-Type": "application/json" },