package osi import ( "context" "encoding/json" "net/http" "net/http/httptest" "testing" "time" "chis_osi/contract" ) 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"]) } } 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" }, }) }