45 lines
2.0 KiB
Go
45 lines
2.0 KiB
Go
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)
|
|
}
|
|
}
|