2026-07-07 10:14:40 +08:00
|
|
|
package osi
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"encoding/json"
|
|
|
|
|
"net/http"
|
|
|
|
|
"net/http/httptest"
|
|
|
|
|
"testing"
|
|
|
|
|
"time"
|
2026-07-07 23:11:17 +08:00
|
|
|
|
|
|
|
|
"chis_osi/contract"
|
2026-07-07 10:14:40 +08:00
|
|
|
)
|
|
|
|
|
|
2026-07-07 23:11:17 +08:00
|
|
|
func TestCreateHealthRecordCallsJKDA00001WithUploadInfo(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":{"phrId":"PHR001","createUnit":"123456789"}}`))
|
|
|
|
|
}))
|
|
|
|
|
defer server.Close()
|
|
|
|
|
|
|
|
|
|
client := newTestJKDAClient(t, server.URL)
|
|
|
|
|
resultData, result, err := client.CreateHealthRecord(context.Background(), contract.HealthRecordCreate{
|
|
|
|
|
BaseInfo: contract.HealthRecordBaseInfo{IDCard: "440000********1234", PersonName: "测试人员"},
|
|
|
|
|
HealthRecord: contract.HealthRecordCreateInfo{
|
|
|
|
|
CheckID: "CHK2026070700000001",
|
|
|
|
|
IDCard: "440000********1234",
|
|
|
|
|
PersonName: "测试人员",
|
|
|
|
|
RegionCode: "441625000000",
|
|
|
|
|
ManaDoctorID: "doc-001",
|
|
|
|
|
ManaUnitID: "123456789",
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("CreateHealthRecord: %v", err)
|
|
|
|
|
}
|
|
|
|
|
if !result.Success || result.Code != "01" {
|
|
|
|
|
t.Fatalf("result = %#v", result)
|
|
|
|
|
}
|
|
|
|
|
if seenPath != "/osi/api/jkda/create" {
|
|
|
|
|
t.Fatalf("path = %q", seenPath)
|
|
|
|
|
}
|
|
|
|
|
if seenPayload["serviceId"] != ServiceIDJKDACreate {
|
|
|
|
|
t.Fatalf("serviceId = %v", seenPayload["serviceId"])
|
|
|
|
|
}
|
|
|
|
|
uploadInfo := seenPayload["uploadinfo"].(map[string]any)
|
|
|
|
|
healthRecord := uploadInfo["healthRecord"].(map[string]any)
|
|
|
|
|
if healthRecord["checkId"] != "CHK2026070700000001" || healthRecord["manaUnitId"] != "123456789" {
|
|
|
|
|
t.Fatalf("healthRecord = %#v", healthRecord)
|
|
|
|
|
}
|
|
|
|
|
if resultData.PhrID != "PHR001" || resultData.CreateUnit != "123456789" {
|
|
|
|
|
t.Fatalf("resultData = %#v", resultData)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestUpdateHealthRecordCallsJKDA00003(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":{"phrId":"PHR001"}}`))
|
|
|
|
|
}))
|
|
|
|
|
defer server.Close()
|
|
|
|
|
|
|
|
|
|
client := newTestJKDAClient(t, server.URL)
|
|
|
|
|
_, _, err := client.UpdateHealthRecord(context.Background(), contract.HealthRecordCreate{
|
|
|
|
|
BaseInfo: contract.HealthRecordBaseInfo{IDCard: "440000********1234"},
|
|
|
|
|
HealthRecord: contract.HealthRecordCreateInfo{CheckID: "CHK2026070700000001", PhrID: "PHR001"},
|
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("UpdateHealthRecord: %v", err)
|
|
|
|
|
}
|
|
|
|
|
if seenPath != "/osi/api/jkda/update" {
|
|
|
|
|
t.Fatalf("path = %q", seenPath)
|
|
|
|
|
}
|
|
|
|
|
if seenPayload["serviceId"] != ServiceIDJKDAUpdate {
|
|
|
|
|
t.Fatalf("serviceId = %v", seenPayload["serviceId"])
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-07-07 10:14:40 +08:00
|
|
|
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)
|
|
|
|
|
}
|
2026-07-09 20:38:27 +08:00
|
|
|
_, _ = w.Write([]byte(`{"code":"01","message":"操作成功","data":{"personSign":"LAO","idCard":"440000********1234","phrId":"PHR001"}}`))
|
2026-07-07 10:14:40 +08:00
|
|
|
}))
|
|
|
|
|
defer server.Close()
|
|
|
|
|
|
|
|
|
|
client := newTestJKDAClient(t, server.URL)
|
2026-07-09 20:38:27 +08:00
|
|
|
personSign, result, err := client.FindRqbj(context.Background(), FindRqbjQuery{IDCard: "440000********1234"})
|
2026-07-07 10:14:40 +08:00
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("FindRqbj: %v", err)
|
|
|
|
|
}
|
|
|
|
|
if !result.Success || result.Code != "01" {
|
|
|
|
|
t.Fatalf("result = %#v", result)
|
|
|
|
|
}
|
2026-07-09 20:38:27 +08:00
|
|
|
if seenPath != "/osi/api/auto/jkda/findrqbj" {
|
2026-07-07 10:14:40 +08:00
|
|
|
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)
|
2026-07-09 20:38:27 +08:00
|
|
|
if baseInfo["idCard"] != "440000********1234" {
|
2026-07-07 10:14:40 +08:00
|
|
|
t.Fatalf("baseInfo = %#v", baseInfo)
|
|
|
|
|
}
|
2026-07-09 20:38:27 +08:00
|
|
|
if personSign.PersonSign != "LAO" || personSign.IDCard != "440000********1234" || personSign.PHRID != "PHR001" {
|
2026-07-07 10:14:40 +08:00
|
|
|
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"
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
}
|