CEC-5308: remove dead code (#475)
This commit is contained in:
10927
package-lock.json
generated
10927
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -18,7 +18,6 @@
|
|||||||
"@testing-library/jest-dom": "^5.16.4",
|
"@testing-library/jest-dom": "^5.16.4",
|
||||||
"@testing-library/react": "^12.1.4",
|
"@testing-library/react": "^12.1.4",
|
||||||
"@testing-library/user-event": "^13.5.0",
|
"@testing-library/user-event": "^13.5.0",
|
||||||
"axios": "^0.26.1",
|
|
||||||
"buffer": "^6.0.3",
|
"buffer": "^6.0.3",
|
||||||
"clsx": "^1.1.1",
|
"clsx": "^1.1.1",
|
||||||
"date-fns": "^2.29.2",
|
"date-fns": "^2.29.2",
|
||||||
@@ -36,7 +35,7 @@
|
|||||||
"react-leaflet-cluster": "^1.0.3",
|
"react-leaflet-cluster": "^1.0.3",
|
||||||
"react-router-dom": "^5.3.0",
|
"react-router-dom": "^5.3.0",
|
||||||
"react-router-hash-link": "^2.4.3",
|
"react-router-hash-link": "^2.4.3",
|
||||||
"react-scripts": "^5.1.0-next.14",
|
"react-scripts": "^5.0.1",
|
||||||
"semver-compare": "^1.0.0",
|
"semver-compare": "^1.0.0",
|
||||||
"usehooks-ts": "^2.7.1",
|
"usehooks-ts": "^2.7.1",
|
||||||
"web-vitals": "^2.1.4",
|
"web-vitals": "^2.1.4",
|
||||||
@@ -79,6 +78,7 @@
|
|||||||
"node": "^16.13.0"
|
"node": "^16.13.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
|
||||||
"eslint": "^8.32.0",
|
"eslint": "^8.32.0",
|
||||||
"eslint-plugin-react": "^7.32.1",
|
"eslint-plugin-react": "^7.32.1",
|
||||||
"react-test-renderer": "^17.0.2"
|
"react-test-renderer": "^17.0.2"
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
jest.mock("../Contexts/CarUpdatesContext");
|
jest.mock("../Contexts/CarUpdatesContext");
|
||||||
jest.mock("../Contexts/FileUploadContext");
|
|
||||||
jest.mock("../Contexts/VehicleContext");
|
jest.mock("../Contexts/VehicleContext");
|
||||||
jest.mock("../Contexts/ManifestsContext");
|
jest.mock("../Contexts/ManifestsContext");
|
||||||
jest.mock("../Contexts/UserContext");
|
jest.mock("../Contexts/UserContext");
|
||||||
|
|||||||
@@ -1,108 +0,0 @@
|
|||||||
import React, { useContext, useState } from "react";
|
|
||||||
import { uploadFile, getCancelToken } from "../../services/uploadFile";
|
|
||||||
|
|
||||||
const FileUploadContext = React.createContext();
|
|
||||||
|
|
||||||
export const FileUploadProvider = ({ children }) => {
|
|
||||||
const [uploading, setUploading] = useState(false);
|
|
||||||
const [progress, setProgress] = useState(0);
|
|
||||||
const [status, setStatus] = useState(null);
|
|
||||||
const [cancelUpload, setCancelUpload] = useState(null);
|
|
||||||
const [files, setFiles] = useState(null);
|
|
||||||
|
|
||||||
const done = () => {
|
|
||||||
setCancelUpload(null);
|
|
||||||
setUploading(false);
|
|
||||||
setProgress(0);
|
|
||||||
};
|
|
||||||
|
|
||||||
const cancel = async () => {
|
|
||||||
if (cancelUpload && progress < 100) {
|
|
||||||
cancelUpload.cancel();
|
|
||||||
setStatus("Upload canceled");
|
|
||||||
}
|
|
||||||
done();
|
|
||||||
};
|
|
||||||
|
|
||||||
const validateUpload = (formData, accessToken, uploadFiles) => {
|
|
||||||
if (!formData) {
|
|
||||||
throw new Error("Missing package update data");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!formData.packagename || formData.packagename.length === 0) {
|
|
||||||
throw new Error("Package name required");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!formData.version || formData.version.length === 0) {
|
|
||||||
throw new Error("Package update version required");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!uploadFiles || uploadFiles.length === 0) {
|
|
||||||
throw new Error("File required");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!accessToken || accessToken.length === 0) {
|
|
||||||
throw new Error("Access token required");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!formData.description || formData.description.length === 0) {
|
|
||||||
throw new Error("Package update description required");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!formData.releasenotes || formData.releasenotes.length === 0) {
|
|
||||||
throw new Error("Package update release notes link required");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const upload = async (formData, accessToken, uploadFiles) => {
|
|
||||||
validateUpload(formData, accessToken, uploadFiles);
|
|
||||||
|
|
||||||
try {
|
|
||||||
const file = uploadFiles[0];
|
|
||||||
const filename = file.name;
|
|
||||||
|
|
||||||
setUploading(true);
|
|
||||||
setProgress(0);
|
|
||||||
setStatus(`Uploading ${filename}`);
|
|
||||||
setCancelUpload(getCancelToken());
|
|
||||||
|
|
||||||
const data = await uploadFile(
|
|
||||||
file,
|
|
||||||
formData,
|
|
||||||
accessToken,
|
|
||||||
setProgress,
|
|
||||||
cancelUpload
|
|
||||||
);
|
|
||||||
if (data.message) {
|
|
||||||
throw new Error(`${data.error}. ${data.message}`);
|
|
||||||
}
|
|
||||||
setStatus(`Uploaded ${filename}`);
|
|
||||||
setCancelUpload(null);
|
|
||||||
setProgress(100);
|
|
||||||
|
|
||||||
return data;
|
|
||||||
} catch (e) {
|
|
||||||
setUploading(true);
|
|
||||||
setStatus(`Error occured: ${e.message}`);
|
|
||||||
setProgress(-1);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<FileUploadContext.Provider
|
|
||||||
value={{
|
|
||||||
uploading,
|
|
||||||
progress,
|
|
||||||
status,
|
|
||||||
files,
|
|
||||||
upload,
|
|
||||||
cancel,
|
|
||||||
setFiles,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{children}
|
|
||||||
</FileUploadContext.Provider>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useFileUploadContext = () => useContext(FileUploadContext);
|
|
||||||
@@ -1,155 +0,0 @@
|
|||||||
jest.mock("../../services/uploadFile");
|
|
||||||
|
|
||||||
import {
|
|
||||||
render,
|
|
||||||
cleanup,
|
|
||||||
screen,
|
|
||||||
fireEvent,
|
|
||||||
waitFor,
|
|
||||||
} from "@testing-library/react";
|
|
||||||
import { useState } from "react";
|
|
||||||
|
|
||||||
import { setUploadFileDelay } from "../../services/uploadFile";
|
|
||||||
import {
|
|
||||||
FileUploadProvider,
|
|
||||||
useFileUploadContext,
|
|
||||||
} from "../Contexts/FileUploadContext";
|
|
||||||
import { StatusProvider, useStatusContext } from "../Contexts/StatusContext";
|
|
||||||
|
|
||||||
const checkState = (uploading, progress, status, linkURL, message) => {
|
|
||||||
expect(screen.getByTestId("uploading").innerHTML).toEqual(uploading);
|
|
||||||
expect(screen.getByTestId("progress").innerHTML).toEqual(progress);
|
|
||||||
expect(screen.getByTestId("status").innerHTML).toEqual(status);
|
|
||||||
expect(screen.getByTestId("linkURL").innerHTML).toEqual(linkURL);
|
|
||||||
expect(screen.getByTestId("message").innerHTML).toEqual(message);
|
|
||||||
};
|
|
||||||
|
|
||||||
describe("FileUploadContext", () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
const TestComp = () => {
|
|
||||||
const {
|
|
||||||
progress,
|
|
||||||
uploading,
|
|
||||||
status,
|
|
||||||
upload,
|
|
||||||
cancel,
|
|
||||||
} = useFileUploadContext();
|
|
||||||
const { message, setMessage } = useStatusContext();
|
|
||||||
const [link, setLink] = useState(null);
|
|
||||||
const TEST_FILE = [{ name: "test.jpg", size: 0 }];
|
|
||||||
const TEST_ACCESSTOKEN = "ACCESSTOKEN";
|
|
||||||
const TEST_FORMDATA = {
|
|
||||||
packagename: "TEST",
|
|
||||||
version: "VERSION",
|
|
||||||
vehicles: ["VIN"],
|
|
||||||
description: "TEST DESC",
|
|
||||||
releasenotes: "http://releasenotes.com",
|
|
||||||
};
|
|
||||||
const exec = async (form, token, file) => {
|
|
||||||
try {
|
|
||||||
const data = await upload(form, token, file);
|
|
||||||
if (data.link) {
|
|
||||||
setLink(data.link);
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
setMessage(e.message);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<div data-testid="uploading">{uploading.toString()}</div>
|
|
||||||
<div data-testid="progress">{progress.toString()}</div>
|
|
||||||
<div data-testid="status">{status}</div>
|
|
||||||
<div data-testid="message">{message}</div>
|
|
||||||
<div data-testid="linkURL">{link}</div>
|
|
||||||
<button
|
|
||||||
data-testid="uploadNoFile"
|
|
||||||
onClick={() => {
|
|
||||||
exec(TEST_FORMDATA, TEST_ACCESSTOKEN, null);
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
<button
|
|
||||||
data-testid="uploadNoToken"
|
|
||||||
onClick={() => {
|
|
||||||
exec(TEST_FORMDATA, null, TEST_FILE);
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
<button
|
|
||||||
data-testid="uploadNoFormData"
|
|
||||||
onClick={() => {
|
|
||||||
exec({}, TEST_ACCESSTOKEN, TEST_FILE);
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
<button
|
|
||||||
data-testid="upload"
|
|
||||||
onClick={() => exec(TEST_FORMDATA, TEST_ACCESSTOKEN, TEST_FILE)}
|
|
||||||
/>
|
|
||||||
<button data-testid="cancel" onClick={() => cancel()} />
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
render(
|
|
||||||
<StatusProvider>
|
|
||||||
<FileUploadProvider>
|
|
||||||
<TestComp />
|
|
||||||
</FileUploadProvider>
|
|
||||||
</StatusProvider>
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Initial state", async () => {
|
|
||||||
checkState("false", "0", "", "", "");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Upload no file", async () => {
|
|
||||||
fireEvent.click(screen.getByTestId("uploadNoFile"));
|
|
||||||
await waitFor(() =>
|
|
||||||
expect(screen.getByTestId("message").innerHTML).not.toBe("")
|
|
||||||
);
|
|
||||||
checkState("false", "0", "", "", "File required");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Upload no access token", async () => {
|
|
||||||
fireEvent.click(screen.getByTestId("uploadNoToken"));
|
|
||||||
await waitFor(() =>
|
|
||||||
expect(screen.getByTestId("message").innerHTML).not.toBe("")
|
|
||||||
);
|
|
||||||
checkState("false", "0", "", "", "Access token required");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Upload no form data", async () => {
|
|
||||||
fireEvent.click(screen.getByTestId("uploadNoFormData"));
|
|
||||||
await waitFor(() =>
|
|
||||||
expect(screen.getByTestId("message").innerHTML).not.toBe("")
|
|
||||||
);
|
|
||||||
checkState("false", "0", "", "", "Package name required");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Upload file", async () => {
|
|
||||||
fireEvent.click(screen.getByTestId("upload"));
|
|
||||||
await waitFor(() =>
|
|
||||||
expect(screen.getByTestId("progress").innerHTML).toEqual("100")
|
|
||||||
);
|
|
||||||
checkState("true", "100", "Uploaded test.jpg", "CLOUDFRONT_URL", "");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Cancel upload", async () => {
|
|
||||||
setUploadFileDelay(true);
|
|
||||||
fireEvent.click(screen.getByTestId("upload"));
|
|
||||||
await waitFor(() =>
|
|
||||||
expect(screen.getByTestId("progress").innerHTML).toEqual("50")
|
|
||||||
);
|
|
||||||
checkState("true", "50", "Uploading test.jpg", "", "");
|
|
||||||
|
|
||||||
fireEvent.click(screen.getByTestId("cancel"));
|
|
||||||
await waitFor(() =>
|
|
||||||
expect(screen.getByTestId("progress").innerHTML).toEqual("0")
|
|
||||||
);
|
|
||||||
checkState("false", "0", "Upload canceled", "", "");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
import React from "react";
|
|
||||||
|
|
||||||
let uploading = false;
|
|
||||||
let progress = 0;
|
|
||||||
let status = null;
|
|
||||||
let files = null;
|
|
||||||
|
|
||||||
export const FileUploadProvider = ({ children }) => {
|
|
||||||
return <div data-testid="mocked-fileuploadprovider">{children}</div>;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useFileUploadContext = () => ({
|
|
||||||
uploading,
|
|
||||||
progress,
|
|
||||||
status,
|
|
||||||
files,
|
|
||||||
upload: jest.fn(),
|
|
||||||
cancel: jest.fn(),
|
|
||||||
setFiles: jest.fn((value) => {
|
|
||||||
files = value;
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
import React, { useRef, useState } from "react";
|
|
||||||
import clsx from "clsx";
|
|
||||||
|
|
||||||
import useStyles from "../../useStyles";
|
|
||||||
import { useStatusContext } from "../../Contexts/StatusContext";
|
|
||||||
|
|
||||||
const FileDragArea = ({
|
|
||||||
onFileSelect,
|
|
||||||
onDragEnter,
|
|
||||||
onDragOver,
|
|
||||||
onDragLeave,
|
|
||||||
children,
|
|
||||||
}) => {
|
|
||||||
const { setMessage } = useStatusContext();
|
|
||||||
const [over, setOver] = useState(false);
|
|
||||||
const classes = useStyles();
|
|
||||||
const inputFile = useRef();
|
|
||||||
|
|
||||||
const dragEnterHandler = (e) => {
|
|
||||||
setOver(true);
|
|
||||||
if (onDragEnter) onDragEnter(e);
|
|
||||||
};
|
|
||||||
|
|
||||||
const dragOverHandler = (e) => {
|
|
||||||
setOver(true);
|
|
||||||
if (onDragEnter) onDragOver(e);
|
|
||||||
};
|
|
||||||
|
|
||||||
const dragLeaveHandler = (e) => {
|
|
||||||
setOver(false);
|
|
||||||
if (onDragLeave) onDragLeave(e);
|
|
||||||
};
|
|
||||||
|
|
||||||
const dropHandler = (e) => {
|
|
||||||
try {
|
|
||||||
const { files } = e.dataTransfer;
|
|
||||||
if (onFileSelect) onFileSelect(files);
|
|
||||||
setOver(false);
|
|
||||||
} catch (err) {
|
|
||||||
setMessage(err);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const selectHandler = (e) => {
|
|
||||||
try {
|
|
||||||
const { files } = e.target;
|
|
||||||
if (onFileSelect) onFileSelect(files);
|
|
||||||
} catch (err) {
|
|
||||||
setMessage(err);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const onClick = (e) => {
|
|
||||||
try {
|
|
||||||
inputFile.current.click();
|
|
||||||
} catch (err) {
|
|
||||||
setMessage(err);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<div
|
|
||||||
onDragEnter={dragEnterHandler}
|
|
||||||
onDragOver={dragOverHandler}
|
|
||||||
onDragLeave={dragLeaveHandler}
|
|
||||||
onDrop={dropHandler}
|
|
||||||
onClick={onClick}
|
|
||||||
className={clsx(
|
|
||||||
classes.fileDropArea,
|
|
||||||
classes.clickable,
|
|
||||||
over ? classes.overHighlight : null
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
{children}
|
|
||||||
</div>
|
|
||||||
<input
|
|
||||||
type="file"
|
|
||||||
onChange={selectHandler}
|
|
||||||
ref={inputFile}
|
|
||||||
className={classes.hidden}
|
|
||||||
/>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default FileDragArea;
|
|
||||||
@@ -288,12 +288,6 @@ const useStyles = makeStyles((theme) => ({
|
|||||||
progressError: { color: "red" },
|
progressError: { color: "red" },
|
||||||
hidden: { display: "none" },
|
hidden: { display: "none" },
|
||||||
clickable: { cursor: "pointer" },
|
clickable: { cursor: "pointer" },
|
||||||
fileDropArea: {
|
|
||||||
width: "100%",
|
|
||||||
height: "100%",
|
|
||||||
textAlign: "center",
|
|
||||||
color: "Black",
|
|
||||||
},
|
|
||||||
overHighlight: { background: "green" },
|
overHighlight: { background: "green" },
|
||||||
pseudoLink: {
|
pseudoLink: {
|
||||||
cursor: "pointer",
|
cursor: "pointer",
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
import delay from "../../utils/delay";
|
|
||||||
|
|
||||||
let uploadFileResponse = { link: "CLOUDFRONT_URL" };
|
|
||||||
let uploadFileDelay = false;
|
|
||||||
let issuedCancelToken = null;
|
|
||||||
|
|
||||||
export const getCancelToken = () => {
|
|
||||||
issuedCancelToken = {
|
|
||||||
cancel: jest.fn()
|
|
||||||
}
|
|
||||||
return issuedCancelToken;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const uploadFile = async (file, data, token, onProgress, cancelToken) => {
|
|
||||||
if (!uploadFileDelay) return uploadFileResponse;
|
|
||||||
onProgress(50);
|
|
||||||
await delay(10000);
|
|
||||||
return {};
|
|
||||||
};
|
|
||||||
|
|
||||||
export const setUploadFileResponse = (value) => {
|
|
||||||
uploadFileResponse = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const setUploadFileDelay = (value) => {
|
|
||||||
uploadFileDelay = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const getIssuedCancelToken = () => issuedCancelToken;
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
import axios from "axios";
|
|
||||||
|
|
||||||
const UPLOAD_ENDPOINT = process.env.REACT_APP_OTA_SERVICE_URL;
|
|
||||||
const fileField = "file";
|
|
||||||
|
|
||||||
export const getCancelToken = () => {
|
|
||||||
const token = axios.CancelToken;
|
|
||||||
return token.source();
|
|
||||||
};
|
|
||||||
|
|
||||||
export const uploadFile = (data, token, onProgress, cancelToken) => {
|
|
||||||
const form = new FormData();
|
|
||||||
let options = {
|
|
||||||
method: "POST",
|
|
||||||
headers: {
|
|
||||||
"Content-Type": "multipart/form-data",
|
|
||||||
Authorization: `Bearer ${token}`,
|
|
||||||
},
|
|
||||||
cancelToken,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (onProgress) {
|
|
||||||
options = {
|
|
||||||
...options,
|
|
||||||
onUploadProgress: (event) => {
|
|
||||||
onProgress(event.loaded / event.total);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let key in data) {
|
|
||||||
if (key !== fileField) form.append(key, data[key]);
|
|
||||||
}
|
|
||||||
|
|
||||||
form.append(fileField, data[fileField]);
|
|
||||||
|
|
||||||
return axios
|
|
||||||
.post(`${UPLOAD_ENDPOINT}/manifestfile`, form, options)
|
|
||||||
.then((response) => response.data)
|
|
||||||
.catch((error) => {
|
|
||||||
if (typeof error.response.data === "string") {
|
|
||||||
return {
|
|
||||||
error: error.response.statusText,
|
|
||||||
message: error.response.data,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return error.response.data;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
Reference in New Issue
Block a user