Files
dobotai-platform/internal/questiontable/schema_test.go
2026-08-13 13:14:06 +08:00

78 lines
2.7 KiB
Go

package questiontable
import (
"context"
"net/http"
"net/http/httptest"
"strings"
"testing"
)
func TestReadFieldsUsesOperatorAndMapsQuestionSchema(t *testing.T) {
mux := http.NewServeMux()
mux.HandleFunc("/token", func(w http.ResponseWriter, _ *http.Request) {
_, _ = w.Write([]byte(`{"accessToken":"token","expireIn":7200}`))
})
mux.HandleFunc("/v1.0/notable/bases/base/sheets/sheet/fields", func(w http.ResponseWriter, r *http.Request) {
if r.URL.Query().Get("operatorId") != "union" {
t.Fatalf("operator=%q", r.URL.Query().Get("operatorId"))
}
_, _ = w.Write([]byte(`{"value":[
{"id":"q","name":"中文问题","type":"text"},{"id":"time","name":"提问时间","type":"date"},
{"id":"asker","name":"提问人","type":"user"},{"id":"orig","name":"原始问题","type":"text"},
{"id":"answer","name":"AI答案","type":"text"},{"id":"trigger","name":"流程触发人员信息","type":"text"},
{"id":"lang","name":"语言","type":"text"},{"id":"dept","name":"部门","type":"text"},{"id":"region","name":"区域","type":"text"}]}`))
})
server := httptest.NewServer(mux)
defer server.Close()
client, err := NewClient(Config{ClientID: "id", Secret: "secret", BaseID: "base", SheetID: "sheet", OperatorID: "union", TokenURL: server.URL + "/token", BaseURL: server.URL}, server.Client())
if err != nil {
t.Fatal(err)
}
fields, err := client.ReadFields(context.Background())
if err != nil {
t.Fatal(err)
}
mapping, err := MapRequiredFields(fields, QuestionSchema())
if err != nil {
t.Fatal(err)
}
if mapping["answer"] != "answer" || len(mapping) != 9 {
t.Fatalf("mapping=%v", mapping)
}
}
func TestMapRequiredFieldsRejectsMissingDuplicateAndWrongType(t *testing.T) {
required := []RequiredField{{Logical: "question", Name: "问题", Type: "text"}}
cases := []struct {
name string
fields []Field
code string
}{
{"missing", nil, "missing_field"},
{"duplicate", []Field{{ID: "1", Name: "问题", Type: "text"}, {ID: "2", Name: "问题", Type: "text"}}, "duplicate_field"},
{"wrong type", []Field{{ID: "1", Name: "问题", Type: "user"}}, "field_type_mismatch"},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
_, err := MapRequiredFields(tc.fields, required)
if err == nil || !strings.Contains(err.Error(), tc.code) {
t.Fatalf("err=%v", err)
}
})
}
}
func TestFAQSchemaUsesFourCurrentInsertFields(t *testing.T) {
required := FAQSchema()
if len(required) != 4 {
t.Fatalf("len=%d", len(required))
}
want := map[string]string{"standard_question": "text", "original_question": "text", "language": "text", "asker": "user"}
for _, field := range required {
if want[field.Logical] != field.Type {
t.Fatalf("field=%+v", field)
}
}
}