ICTU/quality-time

View on GitHub
components/frontend/src/subject/SubjectTitle.test.js

Summary

Maintainability
C
1 day
Test Coverage
import { act, fireEvent, render, screen } from "@testing-library/react"
import userEvent from "@testing-library/user-event"
import history from "history/browser"

import { createTestableSettings } from "../__fixtures__/fixtures"
import * as fetch_server_api from "../api/fetch_server_api"
import { DataModel } from "../context/DataModel"
import { EDIT_REPORT_PERMISSION, Permissions } from "../context/Permissions"
import { SubjectTitle } from "./SubjectTitle"

beforeEach(() => {
    history.push("?expanded=subject_uuid:0")
})

const dataModel = {
    subjects: {
        subject_type: { name: "Default subject type" },
        subject_type2: { name: "Other subject type" },
    },
    metrics: {
        metric_type: { tags: [] },
    },
}
const report = {
    report_uuid: "report_uuid",
    subjects: {
        subject_uuid: {
            type: "subject_type",
            name: "Subject title",
            metrics: { metric_uuid: { type: "metric_type", tags: [] } },
        },
    },
}

async function renderSubjectTitle(subject_type = "subject_type") {
    const settings = createTestableSettings()
    await act(async () => {
        render(
            <Permissions.Provider value={[EDIT_REPORT_PERMISSION]}>
                <DataModel.Provider value={dataModel}>
                    <SubjectTitle
                        report={report}
                        settings={settings}
                        subject={{ type: subject_type }}
                        subject_uuid="subject_uuid"
                    />
                </DataModel.Provider>
            </Permissions.Provider>,
        )
    })
}

it("changes the subject type", async () => {
    fetch_server_api.fetch_server_api = jest.fn().mockResolvedValue({ ok: true })
    await renderSubjectTitle()
    await userEvent.click(screen.getAllByText(/Default subject type/)[1])
    await userEvent.click(screen.getByText(/Other subject type/))
    expect(fetch_server_api.fetch_server_api).toHaveBeenLastCalledWith("post", "subject/subject_uuid/attribute/type", {
        type: "subject_type2",
    })
})

it("deals with unknown subject types", async () => {
    fetch_server_api.fetch_server_api = jest.fn().mockResolvedValue({ ok: true })
    await renderSubjectTitle("unknown_subject_type")
    expect(screen.getAllByText("Unknown subject type").length).toBe(2)
})

it("changes the subject title", async () => {
    fetch_server_api.fetch_server_api = jest.fn().mockResolvedValue({ ok: true })
    await renderSubjectTitle()
    await userEvent.type(screen.getByLabelText(/Subject title/), "{Delete}New title{Enter}")
    expect(fetch_server_api.fetch_server_api).toHaveBeenLastCalledWith("post", "subject/subject_uuid/attribute/name", {
        name: "New title",
    })
})

it("changes the subject subtitle", async () => {
    fetch_server_api.fetch_server_api = jest.fn().mockResolvedValue({ ok: true })
    await renderSubjectTitle()
    await userEvent.type(screen.getByLabelText(/Subject subtitle/), "{Delete}New subtitle{Enter}")
    expect(fetch_server_api.fetch_server_api).toHaveBeenLastCalledWith(
        "post",
        "subject/subject_uuid/attribute/subtitle",
        { subtitle: "New subtitle" },
    )
})

it("changes the subject comment", async () => {
    fetch_server_api.fetch_server_api = jest.fn().mockResolvedValue({ ok: true })
    await renderSubjectTitle()
    await userEvent.type(screen.getByLabelText(/Comment/), "{Delete}New comment{Shift>}{Enter}")
    expect(fetch_server_api.fetch_server_api).toHaveBeenLastCalledWith(
        "post",
        "subject/subject_uuid/attribute/comment",
        { comment: "New comment" },
    )
})

it("loads the changelog", async () => {
    await renderSubjectTitle()
    await act(async () => {
        fireEvent.click(screen.getByText(/Changelog/))
    })
    expect(fetch_server_api.fetch_server_api).toHaveBeenCalledWith("get", "changelog/subject/subject_uuid/5")
})

it("shows the share tab", async () => {
    await renderSubjectTitle()
    await act(async () => {
        fireEvent.click(screen.getByText(/Share/))
    })
    expect(screen.getAllByText(/Subject permanent link/).length).toBe(1)
})

it("moves the subject", async () => {
    fetch_server_api.fetch_server_api = jest.fn().mockResolvedValue({ ok: true })
    await renderSubjectTitle()
    await act(async () => {
        fireEvent.click(screen.getByLabelText(/Move subject to the next position/))
    })
    expect(fetch_server_api.fetch_server_api).toHaveBeenLastCalledWith(
        "post",
        "subject/subject_uuid/attribute/position",
        { position: "next" },
    )
})

it("deletes the subject", async () => {
    fetch_server_api.fetch_server_api = jest.fn().mockResolvedValue({ ok: true })
    await renderSubjectTitle()
    await act(async () => {
        fireEvent.click(screen.getByText(/Delete subject/))
    })
    expect(fetch_server_api.fetch_server_api).toHaveBeenLastCalledWith("delete", "subject/subject_uuid", {})
})