145 lines
5.7 KiB
JavaScript
Raw Normal View History

2026-04-11 00:02:26 -03:00
import { shallowMount } from "../../../frontend/node_modules/@vue/test-utils/dist/vue-test-utils.esm-bundler.mjs";
import { describe, expect, it } from "../../../frontend/node_modules/vitest/dist/index.js";
import HomeView from "../../../frontend/src/views/HomeView.vue";
describe("HomeView", () => {
it("adds fallback icons and builds diagrams for the overview page", () => {
const wrapper = shallowMount(HomeView, {
global: {
stubs: {
MetricRow: true,
ServiceGrid: true,
MermaidCard: true,
},
},
props: {
serviceData: {
services: [
{ name: "Nextcloud", summary: "Storage", link: "https://cloud.example.dev" },
{ name: "Jellyfin", summary: "Media", link: "https://stream.example.dev" },
{ name: "Matrix (Synapse)", summary: "Chat", link: "https://chat.example.dev" },
{ name: "Element", summary: "Rooms", link: "https://rooms.example.dev" },
{ name: "LiveKit", summary: "Calls", link: "https://calls.example.dev" },
{ name: "Coturn", summary: "TURN", link: "https://turn.example.dev" },
{ name: "Mailu", summary: "Mail", link: "https://mail.example.dev" },
{ name: "Vaultwarden", summary: "Passwords", link: "https://vault.example.dev" },
{ name: "Vault", summary: "Secrets", link: "https://secret.example.dev" },
{ name: "Gitea", summary: "Git", link: "https://scm.example.dev" },
{ name: "Jenkins", summary: "CI", link: "https://ci.example.dev" },
{ name: "Harbor", summary: "Registry", link: "https://registry.example.dev" },
{ name: "Flux", summary: "GitOps", link: "https://cd.example.dev" },
{ name: "Monero", summary: "Node", link: "https://monero.example.dev" },
{ name: "SUI Validator", summary: "Crypto", link: "https://sui.example.dev" },
{ name: "Keycloak", summary: "SSO", link: "https://sso.example.dev" },
{ name: "AI Translation", summary: "Translate", link: "https://translate.example.dev" },
{ name: "Grafana", summary: "Metrics", link: "https://metrics.example.dev" },
{ name: "Pegasus", summary: "Uploads", link: "https://pegasus.example.dev" },
{ name: "AI Chat", summary: "Chat", link: "https://chat.example.dev" },
{ name: "AI Vision", summary: "Vision", link: "https://vision.example.dev" },
{ name: "AI Speech", summary: "Speech", link: "https://speech.example.dev" },
{ name: "Mystery", summary: "Default", link: "https://default.example.dev" },
],
},
},
});
const icons = wrapper.vm.displayServices.map((service) => service.icon);
expect(icons).toContain("☁️");
expect(icons).toContain("🎞️");
expect(icons).toContain("🗨️");
expect(icons).toContain("🧩");
expect(icons).toContain("🎥");
expect(icons).toContain("📞");
expect(icons).toContain("📮");
expect(icons).toContain("🔒");
expect(icons).toContain("🔑");
expect(icons).toContain("📚");
expect(icons).toContain("🧰");
expect(icons).toContain("📦");
expect(icons).toContain("🔄");
expect(icons).toContain("⛏️");
expect(icons).toContain("💠");
expect(icons).toContain("🛡️");
expect(icons).toContain("🌐");
expect(icons).toContain("📈");
expect(icons).toContain("🚀");
expect(icons).toContain("💬");
expect(icons).toContain("🖼️");
expect(icons).toContain("🎙️");
expect(icons).toContain("🛰️");
expect(wrapper.vm.hardwareDiagram).toContain("Titan Lab");
expect(wrapper.vm.networkDiagram).toContain("oauth2-proxy");
expect(wrapper.vm.pipelineDiagram).toContain("flux[cd.bstein.dev]");
});
it("renders loading, error, and healthy status states", () => {
const wrapper = shallowMount(HomeView, {
global: {
stubs: {
MetricRow: true,
ServiceGrid: true,
MermaidCard: true,
},
},
props: {
labStatus: { connected: true, atlas: { up: true }, oceanus: { up: true } },
serviceData: undefined,
loading: true,
error: "",
},
});
expect(wrapper.vm.atlasPillClass).toBe("pill-ok");
expect(wrapper.vm.oceanusPillClass).toBe("pill-ok");
expect(wrapper.get(".status").text()).toBe("Loading...");
expect(wrapper.vm.displayServices.length).toBeGreaterThan(0);
});
it("shows the error state when lab data fetches fail", () => {
const wrapper = shallowMount(HomeView, {
global: {
stubs: {
MetricRow: true,
ServiceGrid: true,
MermaidCard: true,
},
},
props: {
labStatus: { connected: false, atlas: { up: false }, oceanus: { up: false } },
serviceData: { services: [] },
loading: false,
error: "unable to load status",
},
});
expect(wrapper.vm.atlasPillClass).toBe("pill-bad");
expect(wrapper.vm.oceanusPillClass).toBe("pill-bad");
expect(wrapper.get(".status").text()).toBe("unable to load status");
});
it("shows live data unavailable and respects custom metric items", () => {
const wrapper = shallowMount(HomeView, {
global: {
stubs: {
MetricRow: true,
ServiceGrid: true,
MermaidCard: true,
},
},
props: {
labStatus: { connected: false, atlas: { up: false }, oceanus: { up: false } },
serviceData: { services: [] },
metricsData: {
items: [{ label: "Custom", value: "1", note: "" }],
},
loading: false,
error: "",
},
});
expect(wrapper.get(".status").text()).toBe("Live data unavailable");
expect(wrapper.vm.metricItems[0].note).toBe("");
});
});