Files
lucia-frontend/tests/stores/cytoscapeStore.test.js
2026-03-08 12:11:57 +08:00

92 lines
2.6 KiB
JavaScript

// The Lucia project.
// Copyright 2026-2026 DSP, inc. All rights reserved.
// Authors:
// imacat.yang@dsp.im (imacat), 2026/03/05
import { describe, it, expect, beforeEach, vi } from "vitest";
import { setActivePinia, createPinia } from "pinia";
import { useCytoscapeStore } from "@/stores/cytoscapeStore";
import { SAVE_KEY_NAME } from "@/constants/constants.js";
// Mock localStorage since jsdom's localStorage is limited
const localStorageMock = (() => {
let store = {};
return {
getItem: vi.fn((key) => store[key] || null),
setItem: vi.fn((key, value) => {
store[key] = value;
}),
removeItem: vi.fn((key) => {
delete store[key];
}),
clear: vi.fn(() => {
store = {};
}),
};
})();
Object.defineProperty(globalThis, "localStorage", {
value: localStorageMock,
});
describe("cytoscapeStore", () => {
let store;
beforeEach(() => {
setActivePinia(createPinia());
store = useCytoscapeStore();
localStorageMock.clear();
vi.clearAllMocks();
});
it("has correct default state", () => {
expect(store.nodePositions).toEqual({});
expect(store.currentGraphId).toBe("");
});
it("setCurrentGraphId initializes graph structure", () => {
store.setCurrentGraphId("graph1");
expect(store.currentGraphId).toBe("graph1");
expect(store.nodePositions["graph1"]).toEqual({
TB: [],
LR: [],
});
});
it("saveNodePosition adds node and saves to localStorage", () => {
store.setCurrentGraphId("graph1");
store.saveNodePosition("node1", { x: 10, y: 20 }, "TB");
expect(store.nodePositions["graph1"]["TB"]).toEqual([
{ id: "node1", position: { x: 10, y: 20 } },
]);
expect(localStorageMock.setItem).toHaveBeenCalledWith(
SAVE_KEY_NAME,
expect.any(String),
);
});
it("saveNodePosition updates existing node position", () => {
store.setCurrentGraphId("graph1");
store.saveNodePosition("node1", { x: 10, y: 20 }, "TB");
store.saveNodePosition("node1", { x: 30, y: 40 }, "TB");
expect(store.nodePositions["graph1"]["TB"]).toHaveLength(1);
expect(store.nodePositions["graph1"]["TB"][0].position).toEqual({
x: 30,
y: 40,
});
});
it("loadPositionsFromStorage restores from localStorage", () => {
const data = {
graph1: {
TB: [{ id: "n1", position: { x: 5, y: 10 } }],
},
};
localStorageMock.getItem.mockReturnValue(JSON.stringify(data));
store.setCurrentGraphId("graph1");
store.loadPositionsFromStorage("TB");
expect(store.nodePositions["graph1"]["TB"]).toEqual([
{ id: "n1", position: { x: 5, y: 10 } },
]);
});
});