mirror of
https://github.com/Quad4-Software/MeshChatX.git
synced 2026-08-18 09:49:09 -04:00
75 lines
2.8 KiB
JavaScript
75 lines
2.8 KiB
JavaScript
// SPDX-License-Identifier: 0BSD
|
|
|
|
import { mount } from "@vue/test-utils";
|
|
import { describe, expect, it } from "vitest";
|
|
import SettingsNav from "../../meshchatx/src/frontend/components/settings/SettingsNav.vue";
|
|
import { SETTINGS_TABS } from "../../meshchatx/src/frontend/js/settings/settingsTabs.js";
|
|
|
|
describe("SettingsNav", () => {
|
|
function mountNav(activeTab = "general") {
|
|
return mount(SettingsNav, {
|
|
props: { activeTab },
|
|
global: {
|
|
mocks: {
|
|
$t: (key) => key,
|
|
},
|
|
},
|
|
});
|
|
}
|
|
|
|
it("renders every settings tab", () => {
|
|
const wrapper = mountNav();
|
|
const tabs = wrapper.findAll(".settings-nav__tab");
|
|
expect(tabs).toHaveLength(SETTINGS_TABS.length);
|
|
for (const tab of SETTINGS_TABS) {
|
|
expect(wrapper.text()).toContain(tab.labelKey);
|
|
}
|
|
});
|
|
|
|
it("marks the active tab with aria-current", () => {
|
|
const wrapper = mountNav("privacy");
|
|
const active = wrapper.find('[aria-current="page"]');
|
|
expect(active.exists()).toBe(true);
|
|
expect(active.text()).toContain("settings.tabs.privacy");
|
|
});
|
|
|
|
it("emits select when a tab is clicked", async () => {
|
|
const wrapper = mountNav("general");
|
|
const buttons = wrapper.findAll(".settings-nav__tab");
|
|
const networkButton = buttons.find((btn) => btn.text().includes("settings.tabs.network"));
|
|
expect(networkButton).toBeDefined();
|
|
await networkButton.trigger("click");
|
|
expect(wrapper.emitted("select")).toEqual([["network"]]);
|
|
});
|
|
|
|
it("exposes an accessible navigation landmark", () => {
|
|
const wrapper = mountNav();
|
|
const nav = wrapper.find("nav.settings-nav");
|
|
expect(nav.attributes("aria-label")).toBe("settings.nav_label");
|
|
});
|
|
|
|
it("shows match counts during search and disables empty tabs", async () => {
|
|
const wrapper = mount(SettingsNav, {
|
|
props: {
|
|
activeTab: "",
|
|
matchCounts: { general: 2, messages: 0, network: 1 },
|
|
},
|
|
global: {
|
|
mocks: {
|
|
$t: (key) => key,
|
|
},
|
|
},
|
|
});
|
|
const buttons = wrapper.findAll(".settings-nav__tab");
|
|
const general = buttons.find((btn) => btn.text().includes("settings.tabs.general"));
|
|
const messages = buttons.find((btn) => btn.text().includes("settings.tabs.messages"));
|
|
expect(general).toBeDefined();
|
|
expect(messages).toBeDefined();
|
|
expect(general.text()).toContain("2");
|
|
expect(messages.attributes("disabled")).toBeDefined();
|
|
await general.trigger("click");
|
|
expect(wrapper.emitted("select")).toEqual([["general"]]);
|
|
await messages.trigger("click");
|
|
expect(wrapper.emitted("select")).toEqual([["general"]]);
|
|
});
|
|
});
|