|
|
|
import { describe, it, expect, beforeEach, vi } from "vitest";
|
|
|
|
import { mount } from "@vue/test-utils";
|
|
|
|
import MonitorList from "../../src/components/MonitorList.vue";
|
|
|
|
|
|
|
|
// Mock child components
|
|
|
|
vi.mock("../../src/components/MonitorListItem.vue", {
|
|
|
|
default: {
|
|
|
|
name: "MonitorListItem",
|
|
|
|
template: "<div class=\"monitor-list-item\"></div>"
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
vi.mock("../../src/components/Confirm.vue", {
|
|
|
|
default: {
|
|
|
|
name: "Confirm",
|
|
|
|
template: "<div class=\"confirm-dialog\"></div>"
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
vi.mock("../../src/components/MonitorListFilter.vue", {
|
|
|
|
default: {
|
|
|
|
name: "MonitorListFilter",
|
|
|
|
template: "<div class=\"monitor-list-filter\"></div>"
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
describe("MonitorList.vue", () => {
|
|
|
|
let wrapper;
|
|
|
|
const mockMonitors = {
|
|
|
|
1: {
|
|
|
|
id: 1,
|
|
|
|
name: "Test Monitor 1",
|
|
|
|
type: "http",
|
|
|
|
status: "up",
|
|
|
|
active: true,
|
|
|
|
interval: 60,
|
|
|
|
parent: null
|
|
|
|
},
|
|
|
|
2: {
|
|
|
|
id: 2,
|
|
|
|
name: "Test Monitor 2",
|
|
|
|
type: "ping",
|
|
|
|
status: "down",
|
|
|
|
active: false,
|
|
|
|
interval: 60,
|
|
|
|
parent: null
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const mockRouter = {
|
|
|
|
push: vi.fn()
|
|
|
|
};
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
wrapper = mount(MonitorList, {
|
|
|
|
props: {
|
|
|
|
scrollbar: true
|
|
|
|
},
|
|
|
|
global: {
|
|
|
|
mocks: {
|
|
|
|
$t: (key) => key, // Mock translation function
|
|
|
|
$router: mockRouter,
|
|
|
|
$root: {
|
|
|
|
monitorList: mockMonitors
|
|
|
|
}
|
|
|
|
},
|
|
|
|
provide: {
|
|
|
|
socket: {
|
|
|
|
emit: vi.fn()
|
|
|
|
}
|
|
|
|
},
|
|
|
|
stubs: {
|
|
|
|
MonitorListItem: {
|
|
|
|
name: "MonitorListItem",
|
|
|
|
template: "<div class='monitor-list-item' :class='{ active: active }' @click='$emit(\"click\")'><slot></slot></div>",
|
|
|
|
props: [ "active" ]
|
|
|
|
},
|
|
|
|
Confirm: true,
|
|
|
|
MonitorListFilter: true,
|
|
|
|
"font-awesome-icon": true,
|
|
|
|
"router-link": true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it("renders monitor list items", () => {
|
|
|
|
const items = wrapper.findAll("[data-testid='monitor-list'] .monitor-list-item");
|
|
|
|
expect(items.length).toBe(2);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("emits select-monitor event when monitor is clicked", async () => {
|
|
|
|
const items = wrapper.findAll("[data-testid='monitor-list'] .monitor-list-item");
|
|
|
|
await items[0].trigger("click");
|
|
|
|
expect(wrapper.emitted("select-monitor")).toBeTruthy();
|
|
|
|
expect(wrapper.emitted("select-monitor")[0]).toEqual([ 1 ]);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("applies active class to selected monitor", async () => {
|
|
|
|
await wrapper.setData({ selectedMonitorId: 1 });
|
|
|
|
const items = wrapper.findAll("[data-testid='monitor-list'] .monitor-list-item");
|
|
|
|
expect(items[0].classes()).toContain("active");
|
|
|
|
expect(items[1].classes()).not.toContain("active");
|
|
|
|
});
|
|
|
|
|
|
|
|
it("filters monitors based on search text", async () => {
|
|
|
|
await wrapper.setData({ searchText: "Test Monitor 1" });
|
|
|
|
const items = wrapper.findAll("[data-testid='monitor-list'] .monitor-list-item");
|
|
|
|
expect(items.length).toBe(1);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("sorts monitors by status", async () => {
|
|
|
|
await wrapper.setData({ sortBy: "status" });
|
|
|
|
const items = wrapper.findAll("[data-testid='monitor-list'] .monitor-list-item");
|
|
|
|
expect(items.length).toBe(2);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("toggles selection mode", async () => {
|
|
|
|
await wrapper.setData({ selectionMode: true });
|
|
|
|
const items = wrapper.findAll("[data-testid='monitor-list'] .monitor-list-item");
|
|
|
|
expect(items.length).toBe(2);
|
|
|
|
expect(wrapper.vm.selectionMode).toBe(true);
|
|
|
|
});
|
|
|
|
});
|