All files / components/Settings CanvasApiForm.jsx

100% Statements 67/67
100% Branches 9/9
100% Functions 1/1
100% Lines 67/67

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 881x 1x 1x 1x   69x 69x 69x 69x 69x 69x 69x 69x 69x 69x 69x 69x   69x 69x 69x 69x 69x 69x 69x     69x   69x 69x 69x 8x 8x   8x 3x 3x 3x 5x 5x 5x   69x 69x 69x 69x 69x 69x 69x 69x 1x 68x   69x 69x     69x 69x 69x 69x 69x 69x 69x 69x 1x 68x   69x 69x     69x 69x 69x       69x 69x       69x   1x  
import { Button, Form } from "react-bootstrap";
import { useForm } from "react-hook-form";
import { useBackend } from "main/utils/useBackend";
import React from "react";
 
function CanvasApiForm({
  submitAction,
  buttonLabel = "Connect Canvas",
  courseId,
}) {
  const {
    register,
    formState: { errors },
    handleSubmit,
    reset,
    setError,
  } = useForm();
 
  const { data: canvasInfo } = useBackend(
    // Stryker disable next-line all : don't test internal caching of React Query
    [`/api/courses/getCanvasInfo?courseId=${courseId}`],
    // Stryker disable next-line StringLiteral : The default value for an empty ("") method is GET. Therefore, there is no way to kill a mutation that transforms "GET" to ""
    { method: "GET", url: `/api/courses/getCanvasInfo?courseId=${courseId}` },
    // Stryker disable next-line all : don't test default value of empty list
    [],
  );
 
  const testIdPrefix = "CanvasApiForm";
 
  return (
    <Form
      onSubmit={handleSubmit((data) => {
        const token = data.canvasApiToken.trim();
        const courseIdVal = data.canvasCourseId.trim();
 
        if (!token && !courseIdVal) {
          setError("root", { message: "Please fill in at least one field." });
          return;
        }
        submitAction({ canvasApiToken: token, canvasCourseId: courseIdVal });
        reset();
      })}
    >
      <Form.Group className="mb-3">
        <Form.Label htmlFor="canvasApiToken">Canvas API Token</Form.Label>
        <Form.Control
          data-testid={testIdPrefix + "-canvasApiToken"}
          id="canvasApiToken"
          type="text"
          placeholder={
            canvasInfo.canvasApiToken
              ? `Current Token: ${canvasInfo.canvasApiToken}`
              : "Token not set yet."
          }
          isInvalid={Boolean(errors.canvasApiToken)}
          {...register("canvasApiToken")}
        />
      </Form.Group>
      <Form.Group className="mb-3">
        <Form.Label htmlFor="canvasCourseId">Canvas Course ID</Form.Label>
        <Form.Control
          data-testid={testIdPrefix + "-canvasCourseId"}
          id="canvasCourseId"
          type="text"
          placeholder={
            canvasInfo.canvasCourseId
              ? `Current Course ID: ${canvasInfo.canvasCourseId}`
              : "Course ID not set yet."
          }
          isInvalid={Boolean(errors.canvasCourseId)}
          {...register("canvasCourseId")}
        />
      </Form.Group>
      {errors.root && (
        <Form.Text className="text-danger d-block mb-2">
          {errors.root.message}
        </Form.Text>
      )}
 
      <Button type="submit" data-testid={testIdPrefix + "-submit"}>
        {buttonLabel}
      </Button>
    </Form>
  );
}
 
export default CanvasApiForm;