fix: ticketing identity lookup after BSON round trip + WeKan live test
- live testing against a real WeKan v9.36 found that the driver decodes nested extra.ticketingIdentities as bson.D, so identity lookups silently returned empty and consultants were skipped; handle bson.D/bson.M/map - integration regression test pinning the BSON round trip - opt-in live test (go test -tags=wekanlive) verifying TestConnection, FetchUpdated (assignee + member fallback), key listing, since-filter and unknown-identity rejection against a real instance Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
//go:build wekanlive
|
||||
|
||||
// Live verification of the WeKan connector against a real instance:
|
||||
//
|
||||
// WEKAN_URL=http://127.0.0.1:8546 WEKAN_BOARD=<boardId> \
|
||||
// WEKAN_USER=… WEKAN_PASS=… WEKAN_IDENTITY=<wekan username> \
|
||||
// go test -tags=wekanlive -count=1 ./internal/sync/ -run TestWekanLive -v
|
||||
package sync
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"bountyboard/internal/domain"
|
||||
)
|
||||
|
||||
func TestWekanLive(t *testing.T) {
|
||||
url, board := os.Getenv("WEKAN_URL"), os.Getenv("WEKAN_BOARD")
|
||||
user, pass := os.Getenv("WEKAN_USER"), os.Getenv("WEKAN_PASS")
|
||||
identity := os.Getenv("WEKAN_IDENTITY")
|
||||
if url == "" || board == "" || user == "" || pass == "" || identity == "" {
|
||||
t.Skip("set WEKAN_URL, WEKAN_BOARD, WEKAN_USER, WEKAN_PASS, WEKAN_IDENTITY")
|
||||
}
|
||||
conn, err := NewConnector(domain.TicketingWekan, url, board,
|
||||
Credentials{"username": user, "password": pass})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
ctx := context.Background()
|
||||
|
||||
if err := conn.TestConnection(ctx); err != nil {
|
||||
t.Fatalf("TestConnection: %v", err)
|
||||
}
|
||||
t.Log("✓ test connection")
|
||||
|
||||
tickets, err := conn.FetchUpdated(ctx, identity, time.Unix(0, 0))
|
||||
if err != nil {
|
||||
t.Fatalf("FetchUpdated: %v", err)
|
||||
}
|
||||
if len(tickets) == 0 {
|
||||
t.Fatal("expected at least one assigned card")
|
||||
}
|
||||
for _, tk := range tickets {
|
||||
if tk.Key == "" || tk.Title == "" || tk.URL == "" {
|
||||
t.Errorf("incomplete ticket: %+v", tk)
|
||||
}
|
||||
t.Logf("✓ ticket %s %q url=%s list=%v", tk.Key, tk.Title, tk.URL, tk.Raw["list"])
|
||||
}
|
||||
|
||||
keys, err := conn.ListAssignedKeys(ctx, identity)
|
||||
if err != nil {
|
||||
t.Fatalf("ListAssignedKeys: %v", err)
|
||||
}
|
||||
if len(keys) != len(tickets) {
|
||||
t.Fatalf("keys (%d) and tickets (%d) disagree", len(keys), len(tickets))
|
||||
}
|
||||
t.Logf("✓ %d assigned keys", len(keys))
|
||||
|
||||
// recent watermark filters everything out
|
||||
future, err := conn.FetchUpdated(ctx, identity, time.Now().Add(time.Hour))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(future) != 0 {
|
||||
t.Fatalf("future since-watermark returned %d tickets", len(future))
|
||||
}
|
||||
t.Log("✓ since-filter")
|
||||
|
||||
// unknown identity errors
|
||||
if _, err := conn.FetchUpdated(ctx, "definitely-not-a-member", time.Unix(0, 0)); err == nil {
|
||||
t.Fatal("unknown identity must error")
|
||||
}
|
||||
t.Log("✓ unknown identity rejected")
|
||||
}
|
||||
Reference in New Issue
Block a user