Files
chis_osi/osi/jkda_test.go
T

146 lines
4.6 KiB
Go

package osi
import (
"context"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
"time"
)
func TestFindHealthRecordCallsJKDA00002WithBaseInfo(t *testing.T) {
var seenPath string
var seenPayload map[string]any
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
seenPath = r.URL.Path
if err := json.NewDecoder(r.Body).Decode(&seenPayload); err != nil {
t.Fatalf("decode request: %v", err)
}
_, _ = w.Write([]byte(`{"code":"01","message":"操作成功","data":[{"healthRecord":{"phrId":"PHR001","idCard":"440000********1234","adressNumber":"101号"}}]}`))
}))
defer server.Close()
client := newTestJKDAClient(t, server.URL)
records, result, err := client.FindHealthRecord(context.Background(), FindHealthRecordQuery{IDCard: "440000********1234"})
if err != nil {
t.Fatalf("FindHealthRecord: %v", err)
}
if !result.Success || result.Code != "01" {
t.Fatalf("result = %#v", result)
}
if seenPath != "/osi/api/auto/jkda/find" {
t.Fatalf("path = %q", seenPath)
}
if seenPayload["serviceId"] != ServiceIDJKDAFind {
t.Fatalf("serviceId = %v", seenPayload["serviceId"])
}
baseInfo := seenPayload["uploadinfo"].(map[string]any)["baseInfo"].(map[string]any)
if baseInfo["idCard"] != "440000********1234" {
t.Fatalf("baseInfo = %#v", baseInfo)
}
if len(records) != 1 || records[0].HealthRecord.PhrID != "PHR001" || records[0].HealthRecord.AdressNumber != "101号" {
t.Fatalf("records = %#v", records)
}
}
func TestFindHealthRecordSupportsEMPIAndPHRIDQueries(t *testing.T) {
tests := []struct {
name string
q FindHealthRecordQuery
key string
want string
}{
{name: "empi", q: FindHealthRecordQuery{EMPIID: "empi-001"}, key: "empiId", want: "empi-001"},
{name: "phrid", q: FindHealthRecordQuery{PHRID: "phr-001"}, key: "phrid", want: "phr-001"},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
var seenPayload map[string]any
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if err := json.NewDecoder(r.Body).Decode(&seenPayload); err != nil {
t.Fatalf("decode request: %v", err)
}
_, _ = w.Write([]byte(`{"code":"01","message":"操作成功","data":[]}`))
}))
defer server.Close()
client := newTestJKDAClient(t, server.URL)
if _, _, err := client.FindHealthRecord(context.Background(), tt.q); err != nil {
t.Fatalf("FindHealthRecord: %v", err)
}
baseInfo := seenPayload["uploadinfo"].(map[string]any)["baseInfo"].(map[string]any)
if baseInfo[tt.key] != tt.want {
t.Fatalf("baseInfo = %#v", baseInfo)
}
})
}
}
func TestFindHealthRecordRejectsEmptyOrAmbiguousQuery(t *testing.T) {
client := NewClient(ClientConfig{})
for _, q := range []FindHealthRecordQuery{
{},
{IDCard: "440000********1234", PHRID: "phr-001"},
} {
if _, _, err := client.FindHealthRecord(context.Background(), q); err == nil {
t.Fatalf("FindHealthRecord accepted query %#v", q)
}
}
}
func TestFindRqbjCallsJKDA00005AndDecodesPersonSign(t *testing.T) {
var seenPath string
var seenPayload map[string]any
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
seenPath = r.URL.Path
if err := json.NewDecoder(r.Body).Decode(&seenPayload); err != nil {
t.Fatalf("decode request: %v", err)
}
_, _ = w.Write([]byte(`{"code":"01","message":"操作成功","data":{"personSign":"PU,LAO"}}`))
}))
defer server.Close()
client := newTestJKDAClient(t, server.URL)
personSign, result, err := client.FindRqbj(context.Background(), FindRqbjQuery{PHRID: "phr-001"})
if err != nil {
t.Fatalf("FindRqbj: %v", err)
}
if !result.Success || result.Code != "01" {
t.Fatalf("result = %#v", result)
}
if seenPath != "/osi/api/jkda/findrqbj" {
t.Fatalf("path = %q", seenPath)
}
if seenPayload["serviceId"] != ServiceIDJKDAFindRqbj {
t.Fatalf("serviceId = %v", seenPayload["serviceId"])
}
baseInfo := seenPayload["uploadinfo"].(map[string]any)["baseInfo"].(map[string]any)
if baseInfo["phrid"] != "phr-001" {
t.Fatalf("baseInfo = %#v", baseInfo)
}
if personSign.PersonSign != "PU,LAO" {
t.Fatalf("personSign = %#v", personSign)
}
}
func newTestJKDAClient(t *testing.T, baseURL string) *Client {
t.Helper()
transport, err := NewTransport(TransportConfig{Timeout: time.Second})
if err != nil {
t.Fatalf("NewTransport: %v", err)
}
return NewClient(ClientConfig{
BaseURL: baseURL,
OrgCode: "12441625456962881G",
UserName: "dyytgw",
Ask: "secret-key",
OperateUser: "712041",
OperateUnit: "12441625456962881G",
Transport: transport,
NowMillis: func() string {
return "1700000000123"
},
})
}