Feat v0.5.3 chat polish + integration testing
Some checks failed
CI/CD / detect-changes (pull_request) Successful in 21s
CI/CD / build-and-deploy (pull_request) Has been cancelled
CI/CD / test-frontend (pull_request) Has been cancelled
CI/CD / test-sqlite (pull_request) Has been cancelled
CI/CD / test-go-pg (pull_request) Has been cancelled
Some checks failed
CI/CD / detect-changes (pull_request) Successful in 21s
CI/CD / build-and-deploy (pull_request) Has been cancelled
CI/CD / test-frontend (pull_request) Has been cancelled
CI/CD / test-sqlite (pull_request) Has been cancelled
CI/CD / test-go-pg (pull_request) Has been cancelled
Conversation search (db.query search_like, chat-core /search endpoint, sidebar search UI), message pagination polish (scroll preservation, loading spinner), workflow-chat integration package, and multi-user E2E test infrastructure. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
120
server/handlers/workflow_hooks_test.go
Normal file
120
server/handlers/workflow_hooks_test.go
Normal file
@@ -0,0 +1,120 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"testing"
|
||||
|
||||
"go.starlark.net/starlark"
|
||||
)
|
||||
|
||||
// ── parseOnAdvanceResult ────────────────────
|
||||
|
||||
func TestParseOnAdvanceResult_None(t *testing.T) {
|
||||
result := parseOnAdvanceResult(starlark.None)
|
||||
if result != nil {
|
||||
t.Errorf("expected nil for None, got %+v", result)
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseOnAdvanceResult_Nil(t *testing.T) {
|
||||
result := parseOnAdvanceResult(nil)
|
||||
if result != nil {
|
||||
t.Errorf("expected nil for nil, got %+v", result)
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseOnAdvanceResult_Error(t *testing.T) {
|
||||
d := starlark.NewDict(1)
|
||||
_ = d.SetKey(starlark.String("error"), starlark.String("hook rejected"))
|
||||
result := parseOnAdvanceResult(d)
|
||||
if result == nil {
|
||||
t.Fatal("expected non-nil result")
|
||||
}
|
||||
if result.Error != "hook rejected" {
|
||||
t.Errorf("expected error='hook rejected', got %q", result.Error)
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseOnAdvanceResult_EnrichedStageData(t *testing.T) {
|
||||
inner := starlark.NewDict(2)
|
||||
_ = inner.SetKey(starlark.String("title"), starlark.String("Bug Triage"))
|
||||
_ = inner.SetKey(starlark.String("conversation_id"), starlark.String("conv-123"))
|
||||
|
||||
d := starlark.NewDict(1)
|
||||
_ = d.SetKey(starlark.String("stage_data"), inner)
|
||||
|
||||
result := parseOnAdvanceResult(d)
|
||||
if result == nil {
|
||||
t.Fatal("expected non-nil result")
|
||||
}
|
||||
if result.Error != "" {
|
||||
t.Errorf("unexpected error: %q", result.Error)
|
||||
}
|
||||
if result.EnrichedData == nil {
|
||||
t.Fatal("expected enriched data")
|
||||
}
|
||||
|
||||
var data map[string]any
|
||||
if err := json.Unmarshal(result.EnrichedData, &data); err != nil {
|
||||
t.Fatalf("unmarshal enriched data: %v", err)
|
||||
}
|
||||
|
||||
if data["title"] != "Bug Triage" {
|
||||
t.Errorf("expected title='Bug Triage', got %v", data["title"])
|
||||
}
|
||||
if data["conversation_id"] != "conv-123" {
|
||||
t.Errorf("expected conversation_id='conv-123', got %v", data["conversation_id"])
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseOnAdvanceResult_NonDict(t *testing.T) {
|
||||
result := parseOnAdvanceResult(starlark.String("unexpected"))
|
||||
if result != nil {
|
||||
t.Errorf("expected nil for non-dict, got %+v", result)
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseOnAdvanceResult_EmptyDict(t *testing.T) {
|
||||
d := starlark.NewDict(0)
|
||||
result := parseOnAdvanceResult(d)
|
||||
if result != nil {
|
||||
t.Errorf("expected nil for empty dict, got %+v", result)
|
||||
}
|
||||
}
|
||||
|
||||
// ── starlarkDictToMap ───────────────────────
|
||||
|
||||
func TestStarlarkDictToMap_NestedStructure(t *testing.T) {
|
||||
inner := starlark.NewDict(1)
|
||||
_ = inner.SetKey(starlark.String("key"), starlark.String("value"))
|
||||
|
||||
members := starlark.NewList([]starlark.Value{
|
||||
starlark.String("alice"),
|
||||
starlark.String("bob"),
|
||||
})
|
||||
|
||||
outer := starlark.NewDict(3)
|
||||
_ = outer.SetKey(starlark.String("title"), starlark.String("Test"))
|
||||
_ = outer.SetKey(starlark.String("nested"), inner)
|
||||
_ = outer.SetKey(starlark.String("members"), members)
|
||||
|
||||
m := starlarkDictToMap(outer)
|
||||
|
||||
if m["title"] != "Test" {
|
||||
t.Errorf("expected title='Test', got %v", m["title"])
|
||||
}
|
||||
nested, ok := m["nested"].(map[string]any)
|
||||
if !ok {
|
||||
t.Fatalf("expected nested to be map, got %T", m["nested"])
|
||||
}
|
||||
if nested["key"] != "value" {
|
||||
t.Errorf("expected nested.key='value', got %v", nested["key"])
|
||||
}
|
||||
membersList, ok := m["members"].([]any)
|
||||
if !ok {
|
||||
t.Fatalf("expected members to be []any, got %T", m["members"])
|
||||
}
|
||||
if len(membersList) != 2 {
|
||||
t.Errorf("expected 2 members, got %d", len(membersList))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user