CEC-4882: add send sms bulk action (#416)

* CEC-4882: add send sms bulk action

* npm audit fix

* upgrade to version specified by react-scripts

* override transitive package

* hoist ejs override

* add dep

* force blackduck scan
This commit is contained in:
Tristan Timblin
2023-08-17 14:09:56 -07:00
committed by GitHub
parent f4d021b658
commit 9ab36d5a1b
10 changed files with 2333 additions and 3171 deletions

View File

@@ -2,7 +2,7 @@ jest.mock("../../Contexts/UserContext");
jest.mock("../../Contexts/StatusContext");
jest.mock("../../../services/fleetsAPI");
import React, { useEffect, useState } from "react";
import React, { useState } from "react";
import {
render,
act,

View File

@@ -0,0 +1,77 @@
import { forwardRef, useImperativeHandle, useState } from "react";
import {
TextField,
FormControlLabel,
Checkbox,
} from "@material-ui/core";
import { useStatusContext } from "../../Contexts/StatusContext";
import { useUserContext } from "../../Contexts/UserContext";
import TaskRunner from "../../../utils/taskRunner";
import vehiclesAPI from "../../../services/vehiclesAPI";
import smsAPI from "../../../services/smsAPI";
import { SMS } from "../../Contexts/SMSContext";
export default forwardRef(({
vins,
vinCSV,
}, ref) => {
const [shouldAwait, setShouldAwait] = useState(false);
const [smsMessage, setSmsMessage] = useState("");
const { setMessage } = useStatusContext();
const { token: { idToken: { jwtToken: token } } } = useUserContext();
useImperativeHandle(ref, () => ({
async submit() {
return new Promise((resolve) => {
const taskRunner = new TaskRunner(5, vins.length);
vins.forEach((vin) => {
taskRunner.push(async () => {
const { iccid } = await vehiclesAPI.getVehicle(vin, token);
if (!iccid) {
throw new Error(`Missing ICC ID for ${vin}`);
}
const sms = new SMS(smsMessage, iccid, shouldAwait);
const result = await smsAPI.send(sms, token);
if (result.error) {
throw new Error(result.message);
}
return vin
})
.then((vin) => setMessage(`Sent message to ${vin}`))
.catch((error) => setMessage(`Failed to send SMS: ${error}`));
});
taskRunner.onComplete()
.then((responses) => {
setMessage(`Sent ${vins.length} SMS messages`);
resolve(responses);
});
});
},
}));
return (
<div>
<p>
You are about to send SMS to the following vins: {vinCSV}.
</p>
<TextField
fullWidth
label="Message"
variant="filled"
onChange={(event) => setSmsMessage(event.target.value)}
/>
<FormControlLabel
label="Await"
control={<Checkbox
checked={shouldAwait}
onChange={() => setShouldAwait(shouldAwait => !shouldAwait)}
/>}
/>
</div>
);
});

View File

@@ -0,0 +1,67 @@
jest.mock("../../Contexts/UserContext");
jest.mock("../../Contexts/StatusContext");
jest.mock("../../../services/vehiclesAPI");
jest.mock("../../../services/smsAPI");
import React, { useState } from "react";
import {
render,
act,
} from "@testing-library/react";
import { UserProvider, setToken } from "../../Contexts/UserContext";
import { StatusProvider } from "../../Contexts/StatusContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import SendSMS from "./SendSMS";
import vehiclesAPI from "../../../services/vehiclesAPI";
import smsAPI from "../../../services/smsAPI";
jest.mock('react', () => ({
...jest.requireActual('react'),
useState: jest.fn(),
}));
jest.mock('@material-ui/core/FormControlLabel', () => {
const React = require('react');
return () => <div data-testid="mock-form-control-label" />;
});
jest.mock('@material-ui/core/TextField', () => {
const React = require('react');
return () => <div data-testid="mock-text-field" />;
});
jest.mock('@material-ui/core/Checkbox', () => {
const React = require('react');
return () => <div data-testid="mock-checkbox" />;
});
describe("BulkActions/SendSMS", () => {
beforeAll(() => {
setToken(TEST_AUTH_OBJECT_FISKER);
});
it("makes request to send multiple SMS messages", async () => {
useState
.mockReturnValueOnce([true, jest.fn()])
.mockReturnValueOnce(["body", jest.fn()]);
const vehiclesAPIMock = jest.spyOn(vehiclesAPI, "getVehicle");
const smsAPIMock = jest.spyOn(smsAPI, "send");
const ref = React.createRef();
render(
<StatusProvider>
<UserProvider>
<SendSMS
ref={ref}
vins={["3C4PDCBG0ET127145"]}
vinCSV=""
/>
</UserProvider>
</StatusProvider>
);
await act(async () => ref.current.submit());
expect(vehiclesAPIMock).toHaveBeenCalledTimes(1);
expect(smsAPIMock).toHaveBeenCalledTimes(1);
});
});