Newer
Older
smart-home-server / webclient / src / components / layout / __tests__ / AppShell.spec.js
import { describe, it, expect } from "vitest";
import { mount } from "@vue/test-utils";
import { createPinia } from "pinia";
import { createRouter, createWebHashHistory } from "vue-router";
import AppShell from "../AppShell.vue";
import { useAuthStore } from "../../../stores/auth.js";

function createTestRouter() {
  return createRouter({
    history: createWebHashHistory(),
    routes: [{ path: "/", name: "home", component: { template: "<div>Home</div>" } }],
  });
}

describe("AppShell", () => {
  function mountShell(options = {}) {
    const pinia = createPinia();
    const authStore = useAuthStore(pinia);
    authStore.$patch({
      user: { id: 1, display_name: "Test" },
      permissions: [
        "areas.view", "areas.manage",
        "devices.view", "devices.scan", "devices.setup", "devices.control", "devices.edit", "devices.delete",
        "scripts.view", "scripts.run", "scripts.edit",
        "firmware.view", "firmware.upload",
      ],
    });
    const router = createTestRouter();
    return mount(AppShell, {
      global: {
        plugins: [pinia, router],
      },
      slots: { default: options.slot || "Content" },
    });
  }

  it("renders brand name", () => {
    const wrapper = mountShell({ slot: "Content" });
    expect(wrapper.text()).toContain("SHSERV WEB CLIENT");
  });

  it("renders slot content", () => {
    const wrapper = mountShell({ slot: "<p>Page Content</p>" });
    expect(wrapper.text()).toContain("Page Content");
  });

  it("renders navigation items with icons", () => {
    const wrapper = mountShell();
    expect(wrapper.text()).toContain("Favorites");
    expect(wrapper.text()).toContain("Areas");
    expect(wrapper.text()).toContain("Devices");
    expect(wrapper.text()).toContain("Scanning");
    expect(wrapper.text()).toContain("Actions");
    expect(wrapper.text()).toContain("Regular");
    expect(wrapper.text()).toContain("Scopes");
  });
});