All files / pages/CourseOverTime CourseOverTimeBuildingsIndexPage.js

100% Statements 22/22
100% Branches 2/2
100% Functions 8/8
100% Lines 20/20

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91                  14x   13x   13x             13x                 13x 4x     13x             13x               13x   2x         13x 13x   13x 9x 5x   4x       4x 4x     13x                         2x              
import { useState, useEffect } from "react";
 
import BasicLayout from "main/layouts/BasicLayout/BasicLayout";
import CourseOverTimeBuildingsSearchForm from "main/components/BasicCourseSearch/CourseOverTimeBuildingsSearchForm";
import { useBackendMutation } from "main/utils/useBackend";
import SectionsTable from "main/components/Sections/SectionsTable";
 
export default function CourseOverTimeBuildingsIndexPage() {
  // Stryker disable next-line all : Can't test state because hook is internal
  const [courseJSON, setCourseJSON] = useState([]);
  // Stryker disable next-line all : Can't test state because hook is internal
  const [availableClassrooms, setAvailableClassrooms] = useState([]);
  // Stryker disable all : Can't test state because hook is internal
  const [latestQuery, setLatestQuery] = useState({
    startQuarter: "",
    endQuarter: "",
    buildingCode: "",
  });
  // Stryker restore all : Can't test state because hook is internal
 
  const objectToAxiosParams = (query) => ({
    url: "/api/public/courseovertime/buildingsearch",
    params: {
      startQtr: query.startQuarter,
      endQtr: query.endQuarter,
      buildingCode: query.buildingCode,
    },
  });
 
  const onSuccess = (buildings) => {
    setCourseJSON(buildings);
  };
 
  const mutation = useBackendMutation(
    objectToAxiosParams,
    { onSuccess },
    // Stryker disable next-line all : hard to set up test for caching
    [],
  );
 
  const objectToAxiosParamsClassrooms = (query) => ({
    url: "/api/public/courseovertime/classrooms",
    params: {
      startQtr: query.startQuarter,
      endQtr: query.endQuarter,
      buildingCode: query.buildingCode,
    },
  });
  const classroomMutation = useBackendMutation(
    objectToAxiosParamsClassrooms,
    { onSuccess: (rooms) => setAvailableClassrooms(rooms) },
    // Stryker disable next-line all : hard to set up test for caching
    [],
  );
 
  const { startQuarter, endQuarter, buildingCode } = latestQuery;
  const fetchClassrooms = classroomMutation.mutate;
 
  useEffect(() => {
    if (!buildingCode) {
      return;
    }
    fetchClassrooms({ startQuarter, endQuarter, buildingCode });
  }, [startQuarter, endQuarter, buildingCode, fetchClassrooms]);
 
  async function fetchCourseOverTimeJSON(_event, query) {
    mutation.mutate(query);
    setLatestQuery(query);
  }
 
  return (
    <BasicLayout>
      <div className="pt-2">
        <h5>Welcome to the UCSB Course History Search!</h5>
        <CourseOverTimeBuildingsSearchForm
          fetchJSON={fetchCourseOverTimeJSON}
        />
        {/* TEST‐ONLY: expose classrooms for mutation tests, will be refactored once dropdown is implemented*/}
        <div data-testid="debug-classrooms">
          {JSON.stringify(availableClassrooms)}
        </div>
        <SectionsTable
          sections={courseJSON.sort((a, b) =>
            b.courseInfo.quarter.localeCompare(a.courseInfo.quarter),
          )}
        />
      </div>
    </BasicLayout>
  );
}