165 lines
5.3 KiB
JavaScript
165 lines
5.3 KiB
JavaScript
import { mount } from "@vue/test-utils";
|
|
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
import ConfirmDialog from "../../meshchatx/src/frontend/components/ConfirmDialog.vue";
|
|
import GlobalEmitter from "../../meshchatx/src/frontend/js/GlobalEmitter";
|
|
|
|
describe("ConfirmDialog.vue", () => {
|
|
beforeEach(() => {
|
|
GlobalEmitter.off("confirm");
|
|
});
|
|
|
|
afterEach(() => {
|
|
GlobalEmitter.off("confirm");
|
|
});
|
|
|
|
const mountConfirmDialog = () => {
|
|
return mount(ConfirmDialog, {
|
|
global: {
|
|
stubs: {
|
|
MaterialDesignIcon: { template: '<div class="mdi"></div>' },
|
|
},
|
|
},
|
|
});
|
|
};
|
|
|
|
it("renders nothing when no confirmation is pending", () => {
|
|
const wrapper = mountConfirmDialog();
|
|
expect(wrapper.find(".fixed").exists()).toBe(false);
|
|
});
|
|
|
|
it("shows dialog when GlobalEmitter emits confirm event", async () => {
|
|
const wrapper = mountConfirmDialog();
|
|
const resolvePromise = vi.fn();
|
|
|
|
GlobalEmitter.emit("confirm", {
|
|
message: "Are you sure?",
|
|
resolve: resolvePromise,
|
|
});
|
|
|
|
await wrapper.vm.$nextTick();
|
|
|
|
expect(wrapper.find(".fixed").exists()).toBe(true);
|
|
expect(wrapper.text()).toContain("Are you sure?");
|
|
expect(wrapper.text()).toContain("Confirm");
|
|
expect(wrapper.text()).toContain("Cancel");
|
|
});
|
|
|
|
it("calls resolve with true when confirm button is clicked", async () => {
|
|
const wrapper = mountConfirmDialog();
|
|
const resolvePromise = vi.fn();
|
|
|
|
GlobalEmitter.emit("confirm", {
|
|
message: "Delete this item?",
|
|
resolve: resolvePromise,
|
|
});
|
|
|
|
await wrapper.vm.$nextTick();
|
|
|
|
const buttons = wrapper.findAll("button");
|
|
const confirmButton = buttons.find((btn) => btn.text().includes("Confirm"));
|
|
await confirmButton.trigger("click");
|
|
await wrapper.vm.$nextTick();
|
|
|
|
expect(resolvePromise).toHaveBeenCalledWith(true);
|
|
expect(wrapper.find(".fixed").exists()).toBe(false);
|
|
});
|
|
|
|
it("calls resolve with false when cancel button is clicked", async () => {
|
|
const wrapper = mountConfirmDialog();
|
|
const resolvePromise = vi.fn();
|
|
|
|
GlobalEmitter.emit("confirm", {
|
|
message: "Delete this item?",
|
|
resolve: resolvePromise,
|
|
});
|
|
|
|
await wrapper.vm.$nextTick();
|
|
|
|
const buttons = wrapper.findAll("button");
|
|
const cancelButton = buttons.find((btn) => btn.text().includes("Cancel"));
|
|
await cancelButton.trigger("click");
|
|
await wrapper.vm.$nextTick();
|
|
|
|
expect(resolvePromise).toHaveBeenCalledWith(false);
|
|
expect(wrapper.find(".fixed").exists()).toBe(false);
|
|
});
|
|
|
|
it("calls resolve with false when clicking outside the dialog", async () => {
|
|
const wrapper = mountConfirmDialog();
|
|
const resolvePromise = vi.fn();
|
|
|
|
GlobalEmitter.emit("confirm", {
|
|
message: "Delete this item?",
|
|
resolve: resolvePromise,
|
|
});
|
|
|
|
await wrapper.vm.$nextTick();
|
|
|
|
const backdrop = wrapper.find(".backdrop-blur-sm");
|
|
|
|
if (backdrop.exists()) {
|
|
await backdrop.trigger("click");
|
|
await wrapper.vm.$nextTick();
|
|
expect(resolvePromise).toHaveBeenCalledWith(false);
|
|
expect(wrapper.find(".fixed").exists()).toBe(false);
|
|
} else {
|
|
wrapper.vm.cancel();
|
|
await wrapper.vm.$nextTick();
|
|
expect(resolvePromise).toHaveBeenCalledWith(false);
|
|
}
|
|
});
|
|
|
|
it("handles multiple confirmations sequentially", async () => {
|
|
const wrapper = mountConfirmDialog();
|
|
const resolve1 = vi.fn();
|
|
const resolve2 = vi.fn();
|
|
|
|
GlobalEmitter.emit("confirm", {
|
|
message: "First confirmation",
|
|
resolve: resolve1,
|
|
});
|
|
|
|
await wrapper.vm.$nextTick();
|
|
expect(wrapper.text()).toContain("First confirmation");
|
|
|
|
const buttons1 = wrapper.findAll("button");
|
|
const cancelButton1 = buttons1.find((btn) => btn.text().includes("Cancel"));
|
|
await cancelButton1.trigger("click");
|
|
await wrapper.vm.$nextTick();
|
|
|
|
expect(resolve1).toHaveBeenCalledWith(false);
|
|
|
|
GlobalEmitter.emit("confirm", {
|
|
message: "Second confirmation",
|
|
resolve: resolve2,
|
|
});
|
|
|
|
await wrapper.vm.$nextTick();
|
|
expect(wrapper.text()).toContain("Second confirmation");
|
|
|
|
const buttons2 = wrapper.findAll("button");
|
|
const confirmButton2 = buttons2.find((btn) => btn.text().includes("Confirm"));
|
|
await confirmButton2.trigger("click");
|
|
await wrapper.vm.$nextTick();
|
|
|
|
expect(resolve2).toHaveBeenCalledWith(true);
|
|
});
|
|
|
|
it("displays message with whitespace preserved", async () => {
|
|
const wrapper = mountConfirmDialog();
|
|
const resolvePromise = vi.fn();
|
|
|
|
const message = "Line 1\nLine 2\nLine 3";
|
|
GlobalEmitter.emit("confirm", {
|
|
message: message,
|
|
resolve: resolvePromise,
|
|
});
|
|
|
|
await wrapper.vm.$nextTick();
|
|
|
|
const messageElement = wrapper.find(".whitespace-pre-wrap");
|
|
expect(messageElement.exists()).toBe(true);
|
|
expect(messageElement.text()).toContain("Line 1");
|
|
});
|
|
});
|