118 lines
3.8 KiB
Go
118 lines
3.8 KiB
Go
package mapping
|
|
|
|
import "testing"
|
|
|
|
func TestMapHealthRecordMapsDirectFieldsDictsAndCheckID(t *testing.T) {
|
|
src := validPHISHealthRecord()
|
|
got, errs := MapHealthRecord(src, MapContext{Dicts: DefaultDictSnapshot()})
|
|
if len(errs) != 0 {
|
|
t.Fatalf("errors = %#v", errs)
|
|
}
|
|
if got.IDCard != src.IDCard || got.PersonName != src.PersonName || got.Birthday != src.Birthday || got.MobileNumber != src.MobileNumber {
|
|
t.Fatalf("direct fields not mapped: %#v", got)
|
|
}
|
|
if got.SexCode != "1" || got.NationCode != "01" || got.EducationCode != "31" || got.WorkCode != "Y" {
|
|
t.Fatalf("dict fields not mapped: %#v", got)
|
|
}
|
|
if got.MaritalStatusCode != "20" || got.BloodTypeCode != "4" || got.RhBloodCode != "1" || got.InsuranceCode != "01" {
|
|
t.Fatalf("dict fields not mapped: %#v", got)
|
|
}
|
|
if got.RegionCode != src.RegionCode || got.ManaDoctorID != src.ManaDoctorID || got.ManaUnitID != src.ManaUnitID {
|
|
t.Fatalf("management fields not mapped: %#v", got)
|
|
}
|
|
if got.CheckID == "" || len(got.CheckID) != 20 {
|
|
t.Fatalf("checkId = %q", got.CheckID)
|
|
}
|
|
}
|
|
|
|
func TestMapHealthRecordReportsRequiredFieldErrors(t *testing.T) {
|
|
src := validPHISHealthRecord()
|
|
src.IDCard = ""
|
|
src.PersonName = ""
|
|
src.ManaUnitID = ""
|
|
|
|
_, errs := MapHealthRecord(src, MapContext{Dicts: DefaultDictSnapshot()})
|
|
if len(errs) != 3 {
|
|
t.Fatalf("errors = %#v", errs)
|
|
}
|
|
assertValidationField(t, errs, "idCard", "required")
|
|
assertValidationField(t, errs, "personName", "required")
|
|
assertValidationField(t, errs, "manaUnitId", "required")
|
|
}
|
|
|
|
func TestMapHealthRecordReportsDictValidationErrors(t *testing.T) {
|
|
src := validPHISHealthRecord()
|
|
src.SexCode = "bad"
|
|
|
|
_, errs := MapHealthRecord(src, MapContext{Dicts: DefaultDictSnapshot()})
|
|
if len(errs) != 1 {
|
|
t.Fatalf("errors = %#v", errs)
|
|
}
|
|
if errs[0].Field != "sexCode" || errs[0].Code != "bad" || errs[0].Direction != DirectionPHISToOSI {
|
|
t.Fatalf("error = %#v", errs[0])
|
|
}
|
|
}
|
|
|
|
func TestMapHealthRecordUsesInjectedDictSnapshot(t *testing.T) {
|
|
src := validPHISHealthRecord()
|
|
src.SexCode = "M"
|
|
dicts := DefaultDictSnapshot()
|
|
dicts.Sex = Dict{Name: "sex", Field: "sexCode", Entries: []Entry{{PHIS: "M", OSI: "1", Name: "男"}}}
|
|
|
|
got, errs := MapHealthRecord(src, MapContext{Dicts: dicts})
|
|
if len(errs) != 0 {
|
|
t.Fatalf("errors = %#v", errs)
|
|
}
|
|
if got.SexCode != "1" {
|
|
t.Fatalf("SexCode = %q", got.SexCode)
|
|
}
|
|
}
|
|
|
|
func TestGenerateCheckIDIsDeterministicAndVersionSensitive(t *testing.T) {
|
|
first := GenerateCheckID("PHIS", "JKDA", "record-001", "20260707010101")
|
|
second := GenerateCheckID("PHIS", "JKDA", "record-001", "20260707010101")
|
|
third := GenerateCheckID("PHIS", "JKDA", "record-001", "20260708010101")
|
|
if first != second {
|
|
t.Fatalf("checkId not deterministic: %q != %q", first, second)
|
|
}
|
|
if len(first) != 20 {
|
|
t.Fatalf("checkId length = %d, want 20", len(first))
|
|
}
|
|
if first == third {
|
|
t.Fatalf("version change did not affect checkId: %q", first)
|
|
}
|
|
}
|
|
|
|
func validPHISHealthRecord() PHISHealthRecord {
|
|
return PHISHealthRecord{
|
|
SourceSystem: "PHIS",
|
|
SourceRecordID: "record-001",
|
|
UpdatedAt: "20260707010101",
|
|
IDCard: "440000********1234",
|
|
PersonName: "测试人员",
|
|
SexCode: "1",
|
|
Birthday: "1970-01-01",
|
|
MobileNumber: "13900000000",
|
|
RegionCode: "441625000000",
|
|
ManaDoctorID: "D001",
|
|
ManaUnitID: "123456789",
|
|
NationCode: "01",
|
|
EducationCode: "31",
|
|
WorkCode: "Y",
|
|
MaritalStatusCode: "20",
|
|
BloodTypeCode: "4",
|
|
RhBloodCode: "1",
|
|
InsuranceCode: "01",
|
|
}
|
|
}
|
|
|
|
func assertValidationField(t *testing.T, errs []ValidationError, field string, reason string) {
|
|
t.Helper()
|
|
for _, err := range errs {
|
|
if err.Field == field && err.Reason == reason {
|
|
return
|
|
}
|
|
}
|
|
t.Fatalf("missing validation error field=%s reason=%s in %#v", field, reason, errs)
|
|
}
|