Files
jellytau/src/lib/services/deviceId.test.ts
T
dtourolle e3797f32ca
Traceability Validation / Check Requirement Traces (push) Failing after 1m18s
🏗️ Build and Test JellyTau / Build APK and Run Tests (push) Has been cancelled
many changes
2026-02-14 00:09:47 +01:00

93 lines
2.7 KiB
TypeScript

/**
* Device ID service tests
*
* Tests the service layer that integrates with the Rust backend.
* The Rust backend handles UUID generation and database storage.
*
* TRACES: UR-009 | DR-011
*/
import { describe, it, expect, vi, beforeEach } from "vitest";
import { getDeviceId, getDeviceIdSync, clearCache } from "./deviceId";
// Mock Tauri invoke
vi.mock("@tauri-apps/api/core", () => ({
invoke: vi.fn(),
}));
import { invoke } from "@tauri-apps/api/core";
describe("Device ID Service", () => {
beforeEach(() => {
clearCache();
vi.clearAllMocks();
});
it("should retrieve device ID from backend", async () => {
const mockDeviceId = "550e8400-e29b-41d4-a716-446655440000";
(invoke as any).mockResolvedValue(mockDeviceId);
const deviceId = await getDeviceId();
expect(deviceId).toBe(mockDeviceId);
expect(invoke).toHaveBeenCalledWith("device_get_id");
expect(invoke).toHaveBeenCalledTimes(1);
});
it("should cache device ID in memory after first call", async () => {
const mockDeviceId = "550e8400-e29b-41d4-a716-446655440000";
(invoke as any).mockResolvedValue(mockDeviceId);
const id1 = await getDeviceId();
const id2 = await getDeviceId();
expect(id1).toBe(id2);
// Should only invoke backend once due to caching
expect(invoke).toHaveBeenCalledTimes(1);
});
it("should return cached device ID synchronously after initialization", async () => {
const mockDeviceId = "550e8400-e29b-41d4-a716-446655440000";
(invoke as any).mockResolvedValue(mockDeviceId);
await getDeviceId();
const cachedId = getDeviceIdSync();
expect(cachedId).toBe(mockDeviceId);
});
it("should return empty string from sync if not yet initialized", () => {
const syncId = getDeviceIdSync();
expect(syncId).toBe("");
});
it("should throw error when backend fails", async () => {
(invoke as any).mockRejectedValue(new Error("Backend error"));
await expect(getDeviceId()).rejects.toThrow("Failed to initialize device ID");
});
it("should clear cache on logout", async () => {
const mockDeviceId = "550e8400-e29b-41d4-a716-446655440000";
(invoke as any).mockResolvedValue(mockDeviceId);
await getDeviceId();
expect(getDeviceIdSync()).toBe(mockDeviceId);
clearCache();
expect(getDeviceIdSync()).toBe("");
});
it("should call backend again after cache is cleared", async () => {
const mockDeviceId = "550e8400-e29b-41d4-a716-446655440000";
(invoke as any).mockResolvedValue(mockDeviceId);
await getDeviceId();
clearCache();
await getDeviceId();
// Should call backend twice (once per getDeviceId call)
expect(invoke).toHaveBeenCalledTimes(2);
});
});