From 9cf84fc42618cfd64b54caf05e4c98e772d193a0 Mon Sep 17 00:00:00 2001 From: John Wu <76966357+jwu-fisker@users.noreply.github.com> Date: Thu, 9 Feb 2023 11:51:23 -0800 Subject: [PATCH 1/5] CEC-3672 Update manifest version on deploy (#277) * CEC-3672 Add versions to CarUpdatesContext Stub out getSoftwareVersions and updateManifestVersion * CEC-3672 update version on deploy * Validate version before updating --- .../App/__snapshots__/App.test.js.snap | 73 ++++++++++++++++++- src/components/Contexts/CarUpdatesContext.jsx | 44 +++++++++++ .../Controls/DropDownList/index.jsx | 25 +++++++ src/components/Manifest/Deploy/index.jsx | 33 ++++++--- .../Update/__snapshots__/index.test.jsx.snap | 16 ++-- src/components/Manifest/Update/index.jsx | 63 +++------------- src/services/__mocks__/updatesAPI.js | 10 +++ src/services/updatesAPI.js | 27 ++++++- src/utils/softwareVersions.js | 5 ++ src/utils/softwareVersions.test.js | 19 +++++ 10 files changed, 240 insertions(+), 75 deletions(-) create mode 100644 src/components/Controls/DropDownList/index.jsx create mode 100644 src/utils/softwareVersions.js create mode 100644 src/utils/softwareVersions.test.js diff --git a/src/components/App/__snapshots__/App.test.js.snap b/src/components/App/__snapshots__/App.test.js.snap index ee254b4..ad6c059 100644 --- a/src/components/App/__snapshots__/App.test.js.snap +++ b/src/components/App/__snapshots__/App.test.js.snap @@ -3229,6 +3229,22 @@ exports[`App Route /package-deploy authenticated 1`] = `
+
+ +
@@ -3359,10 +3375,52 @@ exports[`App Route /package-deploy authenticated 1`] = `
+
+ +
+ + {data && data.map((item, index) => ( + + ))} + + + ); +} \ No newline at end of file diff --git a/src/components/Manifest/Deploy/index.jsx b/src/components/Manifest/Deploy/index.jsx index 729a3dd..5e8b4e4 100644 --- a/src/components/Manifest/Deploy/index.jsx +++ b/src/components/Manifest/Deploy/index.jsx @@ -1,18 +1,19 @@ import { Button, FormControlLabel, Grid, Switch, Typography } from "@material-ui/core"; -import clsx from "clsx"; +import SendIcon from "@material-ui/icons/Send"; import React, { useEffect, useState } from "react"; import { Redirect, useParams } from "react-router"; import { logger } from "../../../services/monitoring"; import { LocalDateTimeString } from "../../../utils/dates"; import { Permissions } from "../../../utils/roles"; -import { CarUpdatesProvider, useCarUpdatesContext } from "../../Contexts/CarUpdatesContext"; +import { CarUpdatesProvider, SELECT_VERSION, useCarUpdatesContext } from "../../Contexts/CarUpdatesContext"; import { FleetProvider } from "../../Contexts/FleetContext"; import { ManifestsProvider, useManifestsContext } from "../../Contexts/ManifestsContext"; import { useStatusContext } from "../../Contexts/StatusContext"; import { useUserContext } from "../../Contexts/UserContext"; import { VehicleProvider } from "../../Contexts/VehicleContext"; import CarSelectionTable from "../../Controls/CarSelectionTable"; +import { DropDownList } from "../../Controls/DropDownList"; import FleetSelectionTable from "../../Controls/FleetSelectionTable"; import { RoleWrap } from "../../Controls/RoleWrap"; import SearchField from "../../Controls/SearchField"; @@ -25,7 +26,7 @@ const MainForm = () => { const [updateType, setUpdateType] = useState(CAR_UPDATE); const {manifest_id} = useParams(); const {getManifests, manifests, busy} = useManifestsContext(); - const {deployCarUpdates, deployFleetUpdates} = useCarUpdatesContext(); + const {deployCarUpdates, deployFleetUpdates, getSoftwareVersions, versions, updateManifestVersion} = useCarUpdatesContext(); const { groups, providers, @@ -39,6 +40,7 @@ const MainForm = () => { const [createDate, setCreateDate] = useState(""); const [selected, setSelected] = useState([]); const [search, setSearch] = useState(""); + const [softwareVersion, setSoftwareVersion] = useState(SELECT_VERSION); const [redirect, setRedirect] = useState(""); const classes = useStyles(); @@ -77,6 +79,8 @@ const MainForm = () => { const data = { manifest_id: parseInt(manifest_id), } + await updateManifestVersion(manifest_id, softwareVersion, token); + if (updateType === CAR_UPDATE) { data.vins = selected; await deployCarUpdates(data, token); @@ -96,13 +100,18 @@ const MainForm = () => { const getData = async () => { try { - getManifests({id: parseInt(manifest_id)}, token); + await getManifests({id: parseInt(manifest_id)}, token); + await getSoftwareVersions(token); } catch (e) { setMessage(e.message); logger.warn(e.stack); } }; + const changeVersion = (e) => { + setSoftwareVersion(e.target.value); + } + useEffect(() => { getData(); // eslint-disable-next-line react-hooks/exhaustive-deps @@ -162,16 +171,22 @@ const MainForm = () => { - + + diff --git a/src/components/Manifest/Update/__snapshots__/index.test.jsx.snap b/src/components/Manifest/Update/__snapshots__/index.test.jsx.snap index 4f75dc2..fa51235 100644 --- a/src/components/Manifest/Update/__snapshots__/index.test.jsx.snap +++ b/src/components/Manifest/Update/__snapshots__/index.test.jsx.snap @@ -113,12 +113,11 @@ exports[`Manifest Details Component Render 1`] = `
@@ -128,8 +127,6 @@ exports[`Manifest Details Component Render 1`] = ` { fullWidth onChange={changeName} /> - - - Type - - - - - - Type - - - + +
- -
@@ -5270,6 +5254,29 @@ exports[`App Route /packages authenticated 1`] = ` + + + SUMS + + + 1.0 + @@ -5451,7 +5461,7 @@ exports[`App Route /packages authenticated 1`] = ` >
{ return result; }; - const getSoftwareVersions = async (token) => { + const getSUMSVersions = async (token) => { let result; try { setBusy(true); - result = await api.getSoftwareVersions(token); + result = await api.getSUMSVersions(token); if (result.error) throw new Error(`Get software versions error. ${result.message}`); @@ -261,7 +261,7 @@ export const CarUpdatesProvider = ({ children }) => { return result; }; - const updateManifestVersion = async (id, version, token) => { + const updateSUMSVersion = async (id, version, token) => { let result; try { @@ -269,7 +269,7 @@ export const CarUpdatesProvider = ({ children }) => { if (!validateSoftwareVersion(version)) throw new Error(`invalid version ${version}`); - result = await api.updateManifestVersion(id, version, token); + result = await api.updateSUMSVersion(id, version, token); if (result.error) throw new Error(`Update manifest version error. ${result.message}`); } finally { @@ -291,11 +291,11 @@ export const CarUpdatesProvider = ({ children }) => { deployFleetUpdates, getCarUpdates, getLog, - getSoftwareVersions, + getSUMSVersions, getVINUpdates, startMonitor, stopMonitor, - updateManifestVersion, + updateSUMSVersion, }} > {children} diff --git a/src/components/Contexts/__mocks__/CarUpdatesContext.jsx b/src/components/Contexts/__mocks__/CarUpdatesContext.jsx index 1e32093..ca78516 100644 --- a/src/components/Contexts/__mocks__/CarUpdatesContext.jsx +++ b/src/components/Contexts/__mocks__/CarUpdatesContext.jsx @@ -60,6 +60,10 @@ let carUpdateLog = { total: 3, }; +let sumsVersions = { + "data": ["2023.02.01.0.0.A", "2023.02.01.0.0.B"] +} + export const CarUpdatesProvider = ({ children }) => { return
{children}
; }; @@ -77,4 +81,6 @@ export const useCarUpdatesContext = () => ({ startMonitor: jest.fn(), stopMonitor: jest.fn(), approveUpdate: jest.fn(), -}); + getSUMSVersions: jest.fn(() => sumsVersions), + updateSUMSVersion: jest.fn(), +}); \ No newline at end of file diff --git a/src/components/Manifest/Deploy/index.jsx b/src/components/Manifest/Deploy/index.jsx index 5e8b4e4..8a84d56 100644 --- a/src/components/Manifest/Deploy/index.jsx +++ b/src/components/Manifest/Deploy/index.jsx @@ -26,7 +26,7 @@ const MainForm = () => { const [updateType, setUpdateType] = useState(CAR_UPDATE); const {manifest_id} = useParams(); const {getManifests, manifests, busy} = useManifestsContext(); - const {deployCarUpdates, deployFleetUpdates, getSoftwareVersions, versions, updateManifestVersion} = useCarUpdatesContext(); + const {deployCarUpdates, deployFleetUpdates, getSUMSVersions, versions, updateSUMSVersion} = useCarUpdatesContext(); const { groups, providers, @@ -37,6 +37,7 @@ const MainForm = () => { const {setMessage, setTitle, setSitePath} = useStatusContext(); const [manifestName, setManifestName] = useState(""); const [version, setVersion] = useState(""); + const [sumsVersion, setSUMSersion] = useState(""); const [createDate, setCreateDate] = useState(""); const [selected, setSelected] = useState([]); const [search, setSearch] = useState(""); @@ -79,7 +80,9 @@ const MainForm = () => { const data = { manifest_id: parseInt(manifest_id), } - await updateManifestVersion(manifest_id, softwareVersion, token); + if (sumsVersion.length === 0) { + await updateSUMSVersion(manifest_id, softwareVersion, token); + } if (updateType === CAR_UPDATE) { data.vins = selected; @@ -101,7 +104,7 @@ const MainForm = () => { const getData = async () => { try { await getManifests({id: parseInt(manifest_id)}, token); - await getSoftwareVersions(token); + await getSUMSVersions(token); } catch (e) { setMessage(e.message); logger.warn(e.stack); @@ -138,6 +141,7 @@ const MainForm = () => { setManifestName(data.name); setVersion(data.version); + setSUMSersion(data.sums || ""); setCreateDate(LocalDateTimeString(data.created)); }, [manifests]); @@ -172,17 +176,19 @@ const MainForm = () => { - + {sumsVersion.length === 0 && + + }