chore: establish local platform baseline

This commit is contained in:
Codex Local
2026-08-26 06:41:54 +08:00
commit 29bdf4900f
575 changed files with 95644 additions and 0 deletions
@@ -0,0 +1,80 @@
package httpapi
import (
"context"
"net/http"
"net/http/httptest"
"os"
"testing"
"data-terminal-cloud/internal/audit"
"data-terminal-cloud/internal/identity"
"data-terminal-cloud/internal/pagination"
"data-terminal-cloud/internal/saas"
"github.com/jackc/pgx/v5/pgxpool"
)
func TestSaaSReadHandlersWithAuthenticatedSeedData(t *testing.T) {
databaseURL := os.Getenv("TEST_DATABASE_URL")
if databaseURL == "" {
t.Skip("TEST_DATABASE_URL is not set")
}
pool, err := pgxpool.New(context.Background(), databaseURL)
if err != nil {
t.Fatal(err)
}
defer pool.Close()
cursorCodec, err := pagination.NewCodec([]byte("http-saas-read-cursor-signing-key-32-bytes"))
if err != nil {
t.Fatal(err)
}
service := saas.NewService(pool, audit.NewRepository(), nil, cursorCodec)
principal := identity.Principal{Issuer: "http://localhost:58180/realms/voice-local", Subject: "00000000-0000-0000-0000-000000000101"}
tests := []struct {
name string
handler http.Handler
pathValue string
header string
}{
{"households", ListHouseholdsHandler(service), "", "10000000-0000-0000-0000-000000000010"},
{"household", GetHouseholdHandler(service), "10000000-0000-0000-0000-000000000211", ""},
{"household members", ListHouseholdMembersHandler(service), "10000000-0000-0000-0000-000000000211", ""},
{"member invitations", ListMemberInvitationsHandler(service), "10000000-0000-0000-0000-000000000211", ""},
{"subjects", ListSubjectsHandler(service), "10000000-0000-0000-0000-000000000211", ""},
{"subject", GetSubjectHandler(service), "10000000-0000-0000-0000-000000000411", ""},
{"conversation readiness", GetConversationReadinessHandler(service), "10000000-0000-0000-0000-000000000411", ""},
{"consents", ListConsentsHandler(service), "10000000-0000-0000-0000-000000000411", ""},
{"facts", ListSubjectFactsHandler(service), "10000000-0000-0000-0000-000000000411", ""},
{"conversations", ListSubjectConversationsHandler(service), "10000000-0000-0000-0000-000000000411", ""},
{"stories", ListSubjectStoriesHandler(service), "10000000-0000-0000-0000-000000000411", ""},
{"memories", ListSubjectMemoriesHandler(service), "10000000-0000-0000-0000-000000000411", ""},
{"privacy requests", ListPrivacyRequestsHandler(service), "10000000-0000-0000-0000-000000000411", ""},
{"exports", ListExportTasksHandler(service), "10000000-0000-0000-0000-000000000411", ""},
{"devices", ListManagedDevicesHandler(service), "", ""},
{"device", GetManagedDeviceHandler(service), "10000000-0000-0000-0000-000000000511", ""},
{"device commands", ListDeviceCommandsHandler(service), "10000000-0000-0000-0000-000000000511", ""},
{"presence", GetDevicePresenceHandler(service), "10000000-0000-0000-0000-000000000511", ""},
{"twin", GetDeviceTwinHandler(service), "10000000-0000-0000-0000-000000000511", ""},
}
for _, item := range tests {
t.Run(item.name, func(t *testing.T) {
request := httptest.NewRequest(http.MethodGet, "/api/test", nil)
request = request.WithContext(identity.WithPrincipal(request.Context(), principal))
if item.pathValue != "" {
request.SetPathValue("id", item.pathValue)
}
if item.header != "" {
request.Header.Set("X-Tenant-Id", item.header)
}
recorder := httptest.NewRecorder()
item.handler.ServeHTTP(recorder, request)
if recorder.Code != http.StatusOK {
t.Fatalf("status=%d body=%s", recorder.Code, recorder.Body.String())
}
if contentType := recorder.Header().Get("Content-Type"); contentType != "application/json; charset=utf-8" {
t.Fatalf("content type=%q", contentType)
}
})
}
}