145 lines
5.7 KiB
JavaScript
145 lines
5.7 KiB
JavaScript
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("");
|
|
});
|
|
});
|