package server import "testing" func TestAssistantPlanRequiresExplicitDesktopAndExecutesWithRecheck(t *testing.T) { f := newFixtureWorker(t, false) admin := f.login("admin") code, out := f.request("POST", "/assistant/plan", admin, map[string]any{"text": "给王工分配一台桌面"}, "") expect(t, 200, code, out) if out["status"] != "blocked" { t.Fatalf("unexpected plan status: %#v", out) } plan := out["plan"].(map[string]any) if plan["kind"] != "blocked" || plan["reason"] != "没有唯一匹配到桌面" { t.Fatalf("assistant selected a desktop without confirmation: %#v", plan) } code, out = f.request("POST", "/assistant/plan", admin, map[string]any{"text": "给王工分配国产办公桌面"}, "") expect(t, 200, code, out) if out["status"] != "planned" || out["plan"].(map[string]any)["kind"] != "action" { t.Fatalf("unexpected executable plan: %#v", out) } runID := out["runId"].(string) code, out = f.request("POST", "/assistant/execute", admin, map[string]any{"runId": runID}, "assistant-test-1") expect(t, 200, code, out) var exists bool if err := f.db.Get(&exists, `SELECT EXISTS(SELECT 1 FROM bindings b JOIN users u ON u.id=b.user_id JOIN desktops d ON d.id=b.desktop_id WHERE u.display_name='王工' AND d.name='国产办公桌面')`); err != nil || !exists { t.Fatalf("assistant did not create binding: %v", err) } code, out = f.request("POST", "/assistant/execute", admin, map[string]any{"runId": runID}, "assistant-test-2") if code != 200 || out["idempotent"] != true { t.Fatalf("assistant execution was not idempotent: %d %#v", code, out) } } func TestAssistantPlanBlocksAmbiguousUser(t *testing.T) { f := newFixtureWorker(t, false) admin := f.login("admin") code, out := f.request("POST", "/assistant/plan", admin, map[string]any{"text": "请分配研发办公桌面"}, "") expect(t, 200, code, out) plan := out["plan"].(map[string]any) if plan["kind"] != "blocked" || plan["reason"] != "没有唯一匹配到员工" { t.Fatalf("missing employee was not blocked: %#v", plan) } }