From 71a8b23b278809eced5beb0112efef71cec43f89 Mon Sep 17 00:00:00 2001 From: Christian Schwenger Date: Tue, 29 Nov 2022 17:38:15 -0800 Subject: [PATCH 1/5] Frontend support for new job which only takes quarter as its paramater --- .../Jobs/UpdateCoursesByQuarterJobForm.js | 57 +++++++++++++++++ .../components/Jobs/UpdateCoursesJobForm.js | 2 +- frontend/src/main/pages/AdminJobsPage.js | 20 ++++++ .../UpdateCoursesByQuarterJobForm.test.js | 61 +++++++++++++++++++ .../src/tests/pages/AdminJobsPage.test.js | 2 +- 5 files changed, 140 insertions(+), 2 deletions(-) create mode 100644 frontend/src/main/components/Jobs/UpdateCoursesByQuarterJobForm.js create mode 100644 frontend/src/tests/components/Jobs/UpdateCoursesByQuarterJobForm.test.js diff --git a/frontend/src/main/components/Jobs/UpdateCoursesByQuarterJobForm.js b/frontend/src/main/components/Jobs/UpdateCoursesByQuarterJobForm.js new file mode 100644 index 00000000..88e06de7 --- /dev/null +++ b/frontend/src/main/components/Jobs/UpdateCoursesByQuarterJobForm.js @@ -0,0 +1,57 @@ +import { useState } from "react"; +import { Form, Button, Container, Row, Col } from "react-bootstrap"; + +import { quarterRange } from "main/utils/quarterUtilities"; + +import { useSystemInfo } from "main/utils/systemInfo"; +import SingleQuarterDropdown from "../Quarters/SingleQuarterDropdown"; + +const UpdateCoursesByQuarterJobForm = ({ callback }) => { + + const { data: systemInfo } = useSystemInfo(); + + // Stryker disable OptionalChaining + const startQtr = systemInfo?.startQtrYYYYQ || "20211"; + const endQtr = systemInfo?.endQtrYYYYQ || "20214"; + // Stryker enable OptionalChaining + + const quarters = quarterRange(startQtr, endQtr); + + // Stryker disable all : not sure how to test/mock local storage + const localQuarter = localStorage.getItem("BasicSearch.Quarter"); + + const [quarter, setQuarter] = useState(localQuarter || quarters[0].yyyyq); + + const handleSubmit = (event) => { + event.preventDefault(); + console.log("UpdateCoursesJobForm: quarter", quarter); + callback({quarter}); + }; + + // Stryker disable all : Stryker is testing by changing the padding to 0. But this is simply a visual optimization as it makes it look better + return ( +
+ + + + + + + + + + + + +
+ ); +}; + +export default UpdateCoursesByQuarterJobForm; diff --git a/frontend/src/main/components/Jobs/UpdateCoursesJobForm.js b/frontend/src/main/components/Jobs/UpdateCoursesJobForm.js index 7905915f..66412b59 100644 --- a/frontend/src/main/components/Jobs/UpdateCoursesJobForm.js +++ b/frontend/src/main/components/Jobs/UpdateCoursesJobForm.js @@ -65,7 +65,7 @@ const UpdateCoursesJobForm = ({ callback }) => { - diff --git a/frontend/src/main/pages/AdminJobsPage.js b/frontend/src/main/pages/AdminJobsPage.js index 5369b58c..c6303dda 100644 --- a/frontend/src/main/pages/AdminJobsPage.js +++ b/frontend/src/main/pages/AdminJobsPage.js @@ -8,6 +8,7 @@ import JobComingSoon from "main/components/Jobs/JobComingSoon"; import { useBackendMutation } from "main/utils/useBackend"; import UpdateCoursesJobForm from "main/components/Jobs/UpdateCoursesJobForm"; +import UpdateCoursesByQuarterJobForm from "main/components/Jobs/UpdateCoursesByQuarterJobForm"; const AdminJobsPage = () => { @@ -40,12 +41,22 @@ const AdminJobsPage = () => { method: "POST" }); + const objectToAxiosParamsUpdateCoursesByQuarterJob = (data) => ({ + url: `/api/jobs/launch/updateQuarterCourses?quarterYYYYQ=${data.quarter}`, + method: "POST" + }); + // Stryker disable all const updateCoursesJobMutation = useBackendMutation( objectToAxiosParamsUpdateCoursesJob, {}, ["/api/jobs/all"] ); + const updateCoursesByQuarterJobMutation = useBackendMutation( + objectToAxiosParamsUpdateCoursesByQuarterJob, + {}, + ["/api/jobs/all"] + ); // Stryker enable all const submitUpdateCoursesJob = async (data) => { @@ -53,6 +64,11 @@ const AdminJobsPage = () => { updateCoursesJobMutation.mutate(data); } + const submitUpdateCoursesByQuarterJob = async (data) => { + console.log("submitCoursesByQuarterJob, data=", data); + updateCoursesByQuarterJobMutation.mutate(data); + } + // Stryker disable all const { data: jobs, error: _error, status: _status } = useBackend( @@ -75,6 +91,10 @@ const AdminJobsPage = () => { name: "Update Courses Database", form: }, + { + name: "Update Courses Database by quarter", + form: + }, { name: "Update Grade Info", form: diff --git a/frontend/src/tests/components/Jobs/UpdateCoursesByQuarterJobForm.test.js b/frontend/src/tests/components/Jobs/UpdateCoursesByQuarterJobForm.test.js new file mode 100644 index 00000000..48a58493 --- /dev/null +++ b/frontend/src/tests/components/Jobs/UpdateCoursesByQuarterJobForm.test.js @@ -0,0 +1,61 @@ +import { render, screen } from "@testing-library/react"; +import { BrowserRouter as Router } from "react-router-dom"; +import UpdateCoursesByQuarterJobForm from "main/components/Jobs/UpdateCoursesByQuarterJobForm"; +import { QueryClient, QueryClientProvider } from "react-query"; + +import axios from "axios"; +import AxiosMockAdapter from "axios-mock-adapter"; + + +const mockedNavigate = jest.fn(); + +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useNavigate: () => mockedNavigate +})); + +const queryClient = new QueryClient(); + +describe("UpdateCoursesByQuarterJobForm tests", () => { + + const axiosMock = new AxiosMockAdapter(axios); + + it("renders correctly", async () => { + render( + + + + + + ); + + expect(screen.getByText(/Update Courses/)).toBeInTheDocument(); + }); + + test("renders without crashing when fallback values are used", async () => { + + axiosMock + .onGet("/api/systemInfo") + .reply(200, { + "springH2ConsoleEnabled": false, + "showSwaggerUILink": false, + "startQtrYYYYQ": null, // use fallback value + "endQtrYYYYQ": null // use fallback value + }); + + render( + + + + + + ); + + // Make sure the first and last options + expect(await screen.findByTestId(/BasicSearch.Quarter-option-0/)).toHaveValue("20211") + expect(await screen.findByTestId(/BasicSearch.Quarter-option-3/)).toHaveValue("20214") + + }); + + +}); diff --git a/frontend/src/tests/pages/AdminJobsPage.test.js b/frontend/src/tests/pages/AdminJobsPage.test.js index 0882e6ac..4ea9e49a 100644 --- a/frontend/src/tests/pages/AdminJobsPage.test.js +++ b/frontend/src/tests/pages/AdminJobsPage.test.js @@ -99,7 +99,7 @@ describe("AdminJobsPage tests", () => { expect(await screen.findByTestId("TestJobForm-fail")).toBeInTheDocument(); - const submitButton = screen.getByText("Update Courses"); + const submitButton = screen.getByTestId("updateCourses"); const expectedKey = "BasicSearch.Subject-option-ANTH"; await waitFor(() => expect(screen.getByTestId(expectedKey).toBeInTheDocument)); From 62776dea730959f7b292eb49b7285240e2ec42d9 Mon Sep 17 00:00:00 2001 From: Christian Schwenger Date: Tue, 29 Nov 2022 17:55:36 -0800 Subject: [PATCH 2/5] Fix testing coverage --- .../Jobs/UpdateCoursesByQuarterJobForm.js | 2 +- .../src/tests/pages/AdminJobsPage.test.js | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/frontend/src/main/components/Jobs/UpdateCoursesByQuarterJobForm.js b/frontend/src/main/components/Jobs/UpdateCoursesByQuarterJobForm.js index 88e06de7..4c46f13d 100644 --- a/frontend/src/main/components/Jobs/UpdateCoursesByQuarterJobForm.js +++ b/frontend/src/main/components/Jobs/UpdateCoursesByQuarterJobForm.js @@ -44,7 +44,7 @@ const UpdateCoursesByQuarterJobForm = ({ callback }) => { - diff --git a/frontend/src/tests/pages/AdminJobsPage.test.js b/frontend/src/tests/pages/AdminJobsPage.test.js index 4ea9e49a..d73307ef 100644 --- a/frontend/src/tests/pages/AdminJobsPage.test.js +++ b/frontend/src/tests/pages/AdminJobsPage.test.js @@ -120,4 +120,38 @@ describe("AdminJobsPage tests", () => { }); + test("user can submit the update course data by quarter job", async () => { + render( + + + + + + ); + + expect(await screen.findByText("Update Courses Database by quarter")).toBeInTheDocument(); + + const updateCoursesButton = screen.getByText("Update Courses Database by quarter"); + expect(updateCoursesButton).toBeInTheDocument(); + updateCoursesButton.click(); + + expect(await screen.findByTestId("TestJobForm-fail")).toBeInTheDocument(); + + const submitButton = screen.getByTestId("updateCoursesByQuarter"); + + const expectedKey = "BasicSearch.Subject-option-ANTH"; + await waitFor(() => expect(screen.getByTestId(expectedKey).toBeInTheDocument)); + + const selectQuarter = screen.getByLabelText("Quarter"); + userEvent.selectOptions(selectQuarter, "20211"); + expect(submitButton).toBeInTheDocument(); + + submitButton.click(); + + await waitFor(() => expect(axiosMock.history.post.length).toBe(1)); + + expect(axiosMock.history.post[0].url).toBe("/api/jobs/launch/updateQuarterCourses?quarterYYYYQ=20211"); + }); + + }); From a6437eee4998f9454027e60e358c42f91e7da49b Mon Sep 17 00:00:00 2001 From: Christian Schwenger Date: Tue, 29 Nov 2022 18:16:19 -0800 Subject: [PATCH 3/5] Add story book --- frontend/package-lock.json | 26 ++++++++++------ .../UpdateCoursesByQuarterJobForm.stories.js | 31 +++++++++++++++++++ 2 files changed, 47 insertions(+), 10 deletions(-) create mode 100644 frontend/src/stories/components/Jobs/UpdateCoursesByQuarterJobForm.stories.js diff --git a/frontend/package-lock.json b/frontend/package-lock.json index ee6d407d..ccbb45b8 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -14098,13 +14098,19 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001314", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001314.tgz", - "integrity": "sha512-0zaSO+TnCHtHJIbpLroX7nsD+vYuOVjl3uzFbJO1wMVbuveJA0RK2WcQA9ZUIOiO0/ArMiMgHJLxfEZhQiC0kw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "version": "1.0.30001434", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", + "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] }, "node_modules/capture-exit": { "version": "2.0.0", @@ -45645,9 +45651,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001314", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001314.tgz", - "integrity": "sha512-0zaSO+TnCHtHJIbpLroX7nsD+vYuOVjl3uzFbJO1wMVbuveJA0RK2WcQA9ZUIOiO0/ArMiMgHJLxfEZhQiC0kw==" + "version": "1.0.30001434", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", + "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==" }, "capture-exit": { "version": "2.0.0", diff --git a/frontend/src/stories/components/Jobs/UpdateCoursesByQuarterJobForm.stories.js b/frontend/src/stories/components/Jobs/UpdateCoursesByQuarterJobForm.stories.js new file mode 100644 index 00000000..ff85d765 --- /dev/null +++ b/frontend/src/stories/components/Jobs/UpdateCoursesByQuarterJobForm.stories.js @@ -0,0 +1,31 @@ +import React from "react"; + +import UpdateCoursesByQuarterJobForm from "main/components/Jobs/UpdateCoursesByQuarterJobForm"; +import { systemInfoFixtures } from "fixtures/systemInfoFixtures"; + +export default { + title: "components/Jobs/UpdateCoursesByQuarterJobForm", + component: UpdateCoursesByQuarterJobForm, + parameters: { + mockData: [ + { + url: '/api/systemInfo', + method: 'GET', + status: 200, + response: systemInfoFixtures.showingBoth + }, + ], + }, +}; + +const Template = (args) => { + return ; +}; + +export const Default = Template.bind({}); + +Default.args = { + callback: (data) => { + console.log("Submit was clicked, data=", data); + } +}; From fd68ff78b2228d8479a2b83cfa77a9867a1369c2 Mon Sep 17 00:00:00 2001 From: isaac Date: Wed, 30 Nov 2022 00:50:56 -0800 Subject: [PATCH 4/5] revert changes to package-lock.json --- frontend/package-lock.json | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index ccbb45b8..ee6d407d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -14098,19 +14098,13 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001434", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", - "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] + "version": "1.0.30001314", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001314.tgz", + "integrity": "sha512-0zaSO+TnCHtHJIbpLroX7nsD+vYuOVjl3uzFbJO1wMVbuveJA0RK2WcQA9ZUIOiO0/ArMiMgHJLxfEZhQiC0kw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } }, "node_modules/capture-exit": { "version": "2.0.0", @@ -45651,9 +45645,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001434", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", - "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==" + "version": "1.0.30001314", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001314.tgz", + "integrity": "sha512-0zaSO+TnCHtHJIbpLroX7nsD+vYuOVjl3uzFbJO1wMVbuveJA0RK2WcQA9ZUIOiO0/ArMiMgHJLxfEZhQiC0kw==" }, "capture-exit": { "version": "2.0.0", From 3aa56d7dd2aec43bc790a73f3826d1212693d256 Mon Sep 17 00:00:00 2001 From: Phillip Conrad Date: Sun, 4 Dec 2022 15:46:15 -0800 Subject: [PATCH 5/5] pc - make stryker exclusions as small as possible --- .../components/Jobs/UpdateCoursesByQuarterJobForm.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/frontend/src/main/components/Jobs/UpdateCoursesByQuarterJobForm.js b/frontend/src/main/components/Jobs/UpdateCoursesByQuarterJobForm.js index 4c46f13d..747a286e 100644 --- a/frontend/src/main/components/Jobs/UpdateCoursesByQuarterJobForm.js +++ b/frontend/src/main/components/Jobs/UpdateCoursesByQuarterJobForm.js @@ -19,6 +19,7 @@ const UpdateCoursesByQuarterJobForm = ({ callback }) => { // Stryker disable all : not sure how to test/mock local storage const localQuarter = localStorage.getItem("BasicSearch.Quarter"); + // Stryker enable all const [quarter, setQuarter] = useState(localQuarter || quarters[0].yyyyq); @@ -28,7 +29,13 @@ const UpdateCoursesByQuarterJobForm = ({ callback }) => { callback({quarter}); }; + + + // Stryker disable all : Stryker is testing by changing the padding to 0. But this is simply a visual optimization as it makes it look better + const padding = { paddingTop: 10, paddingBottom: 10 } + // Stryker enable all + return (
@@ -42,7 +49,7 @@ const UpdateCoursesByQuarterJobForm = ({ callback }) => { /> - +