89 lines
3.8 KiB
TypeScript
89 lines
3.8 KiB
TypeScript
// @vitest-environment happy-dom
|
|
import { describe, expect, it } from "vitest";
|
|
import { mount } from "@vue/test-utils";
|
|
import PublicationToolbar from "./PublicationToolbar.vue";
|
|
|
|
const defaultProps = {
|
|
mode: "all" as const,
|
|
selectedScholarFilter: "",
|
|
searchQuery: "",
|
|
favoriteOnly: false,
|
|
actionBusy: false,
|
|
loading: false,
|
|
scholars: [],
|
|
startRunDisabled: false,
|
|
startRunDisabledReason: null,
|
|
startRunButtonLabel: "Check now",
|
|
};
|
|
|
|
describe("PublicationToolbar", () => {
|
|
it("renders mode, scholar filter, and search inputs", () => {
|
|
const wrapper = mount(PublicationToolbar, { props: defaultProps });
|
|
expect(wrapper.text()).toContain("Status");
|
|
expect(wrapper.text()).toContain("Scholar");
|
|
expect(wrapper.text()).toContain("Search");
|
|
});
|
|
|
|
it("renders the start run button with provided label", () => {
|
|
const wrapper = mount(PublicationToolbar, { props: defaultProps });
|
|
expect(wrapper.text()).toContain("Check now");
|
|
});
|
|
|
|
it("disables start run button when startRunDisabled is true", () => {
|
|
const wrapper = mount(PublicationToolbar, {
|
|
props: { ...defaultProps, startRunDisabled: true, startRunDisabledReason: "Cooldown active" },
|
|
});
|
|
const buttons = wrapper.findAll("button");
|
|
const runButton = buttons.find((b) => b.text().includes("Check now"));
|
|
expect(runButton?.attributes("disabled")).toBeDefined();
|
|
});
|
|
|
|
it("emits start-run when start button is clicked", async () => {
|
|
const wrapper = mount(PublicationToolbar, { props: defaultProps });
|
|
const buttons = wrapper.findAll("button");
|
|
const runButton = buttons.find((b) => b.text().includes("Check now"));
|
|
await runButton?.trigger("click");
|
|
expect(wrapper.emitted("start-run")).toHaveLength(1);
|
|
});
|
|
|
|
it("emits favorite-only-changed when star filter is clicked", async () => {
|
|
const wrapper = mount(PublicationToolbar, { props: defaultProps });
|
|
await wrapper.find(".favorite-filter-button").trigger("click");
|
|
expect(wrapper.emitted("favorite-only-changed")).toHaveLength(1);
|
|
});
|
|
|
|
it("shows active star filter style when favoriteOnly is true", () => {
|
|
const wrapper = mount(PublicationToolbar, { props: { ...defaultProps, favoriteOnly: true } });
|
|
expect(wrapper.find(".favorite-filter-on").exists()).toBe(true);
|
|
});
|
|
|
|
it("shows inactive star filter style when favoriteOnly is false", () => {
|
|
const wrapper = mount(PublicationToolbar, { props: defaultProps });
|
|
expect(wrapper.find(".favorite-filter-off").exists()).toBe(true);
|
|
});
|
|
|
|
it("renders scholar options from props", () => {
|
|
const scholars = [
|
|
{ id: 1, scholar_id: "abc123", display_name: "Alice", profile_image_url: null, profile_image_source: "none" as const, is_enabled: true, baseline_completed: true, last_run_dt: null, last_run_status: null },
|
|
{ id: 2, scholar_id: "def456", display_name: "", profile_image_url: null, profile_image_source: "none" as const, is_enabled: true, baseline_completed: true, last_run_dt: null, last_run_status: null },
|
|
];
|
|
const wrapper = mount(PublicationToolbar, { props: { ...defaultProps, scholars } });
|
|
expect(wrapper.text()).toContain("Alice");
|
|
expect(wrapper.text()).toContain("def456");
|
|
});
|
|
|
|
it("shows clear button only when search query is non-empty", () => {
|
|
const empty = mount(PublicationToolbar, { props: defaultProps });
|
|
expect(empty.text()).not.toContain("Clear");
|
|
|
|
const withQuery = mount(PublicationToolbar, { props: { ...defaultProps, searchQuery: "test" } });
|
|
expect(withQuery.text()).toContain("Clear");
|
|
});
|
|
|
|
it("emits reset-search when clear button is clicked", async () => {
|
|
const wrapper = mount(PublicationToolbar, { props: { ...defaultProps, searchQuery: "test" } });
|
|
const clearButton = wrapper.findAll("button").find((b) => b.text().includes("Clear"));
|
|
await clearButton?.trigger("click");
|
|
expect(wrapper.emitted("reset-search")).toHaveLength(1);
|
|
});
|
|
});
|