package mapping import ( "os" "testing" "chis_osi/source" ) func TestMapHealthRecordTaskBuildsCompleteCHISRequest(t *testing.T) { task := loadPHISHealthRecordTask(t) req, errs := MapHealthRecordTask(task, validPHISMapContext()) if len(errs) != 0 { t.Fatalf("errors = %#v", errs) } hr := req.HealthRecord if hr.IDCard != task.Record.IDCard || hr.PersonName != task.Record.PersonName || hr.WorkPlace != task.Record.WorkPlace { t.Fatalf("direct fields = %#v", hr) } if hr.Contact != task.Record.Contact || hr.ContactPhone != task.Record.ContactPhone || hr.RegisteredPermanent != "1" || hr.CardType != "01" { t.Fatalf("contact/identity fields = %#v", hr) } if hr.AddressNumber != task.Record.AddressNumber || hr.Address != task.Record.Address || hr.HomePlace != task.Record.HomePlace || hr.HomePlaceNumber != task.Record.HomePlaceNumber { t.Fatalf("address fields = %#v", hr) } if hr.CreateDate != task.Record.CreateDate { t.Fatalf("createDate = %q, want %q", hr.CreateDate, task.Record.CreateDate) } if req.ManageInfo.OperateUser != task.Record.ManaDoctorID { t.Fatalf("operateUser = %q", req.ManageInfo.OperateUser) } if req.PastHistory == nil || req.PastHistory.YWGMS != "0101" || req.PastHistory.BLS != "1201" || req.PastHistory.CJQK != "1101" { t.Fatalf("pastHistory = %#v", req.PastHistory) } if len(req.PastDiseases) != 1 || req.PastDiseases[0].Code != "0201" { t.Fatalf("past diseases = %#v", req.PastDiseases) } if len(req.PastSurgeries) != 1 || req.PastSurgeries[0].Code != "0301" || len(req.PastTraumas) != 1 || req.PastTraumas[0].Code != "0601" || len(req.PastTransfusions) != 1 || req.PastTransfusions[0].Code != "0401" { t.Fatalf("past event arrays = %#v %#v %#v", req.PastSurgeries, req.PastTraumas, req.PastTransfusions) } if req.FamilyMiddle == nil || req.FamilyMiddle.CookAirTool != "2" || req.FamilyMiddle.FuelType != "3" || req.FamilyMiddle.WaterSourceCode != "1" || req.FamilyMiddle.Washroom != "1" || req.FamilyMiddle.LivestockColumn != "0" { t.Fatalf("familyMiddle = %#v", req.FamilyMiddle) } firstCheckID := hr.CheckID task.Record.UpdatedAt = "2026-07-16 11:22:33" second, errs := MapHealthRecordTask(task, validPHISMapContext()) if len(errs) != 0 { t.Fatalf("second errors = %#v", errs) } if firstCheckID == "" || firstCheckID != second.HealthRecord.CheckID { t.Fatalf("checkId changed across source updates: %q != %q", firstCheckID, second.HealthRecord.CheckID) } } func TestMapHealthRecordTaskNormalizesEnvironmentFlag(t *testing.T) { task := loadPHISHealthRecordTask(t) task.Record.IsFillSHHJ = " Y " req, errs := MapHealthRecordTask(task, validPHISMapContext()) if len(errs) != 0 { t.Fatalf("errors = %#v", errs) } if req.HealthRecord.IsFillSHHJ != "y" || req.FamilyMiddle == nil { t.Fatalf("environment flag = %q familyMiddle=%#v", req.HealthRecord.IsFillSHHJ, req.FamilyMiddle) } } func TestMapHealthRecordTaskOmitsEmptyPastHistory(t *testing.T) { task := loadPHISHealthRecordTask(t) task.Record.DrugAllergy = "" task.Record.ExposureHistory = "" task.Record.FamilyFather = "" task.Record.FamilyMother = "" task.Record.FamilySiblings = "" task.Record.FamilyChildren = "" task.Record.GeneticDisease = "" task.Record.Disability = "" req, _ := MapHealthRecordTask(task, validPHISMapContext()) if req.PastHistory != nil { t.Fatalf("pastHistory = %#v, want nil", req.PastHistory) } } func TestMapHealthRecordTaskOmitsEnvironmentWhenNotFilled(t *testing.T) { task := loadPHISHealthRecordTask(t) task.Record.IsFillSHHJ = "n" task.Record.CookAirTool = "" task.Record.FuelType = "" task.Record.WaterSourceCode = "" task.Record.Washroom = "" task.Record.LivestockColumn = "" req, errs := MapHealthRecordTask(task, validPHISMapContext()) if len(errs) != 0 { t.Fatalf("errors = %#v", errs) } if req.FamilyMiddle != nil || req.HealthRecord.IsFillSHHJ != "n" { t.Fatalf("request environment = %#v healthRecord=%#v", req.FamilyMiddle, req.HealthRecord) } } func TestMapHealthRecordTaskRejectsInvalidDateLengthAndHistoryCode(t *testing.T) { task := loadPHISHealthRecordTask(t) task.Record.IDCard = "short" task.Record.RegionCode = "441625" task.Record.Birthday = "19800102" task.Record.PersonName = "这是一个超过五十个字符限制的测试姓名这是一个超过五十个字符限制的测试姓名这是一个超过五十个字符限制的测试姓名" task.Record.DrugAllergy = "9999" task.Record.CookAirTool = "1,2" _, errs := MapHealthRecordTask(task, validPHISMapContext()) assertValidationField(t, errs, "idCard", "length 18") assertValidationField(t, errs, "regionCode", "length 12") assertValidationField(t, errs, "birthday", "invalid date, want yyyy-MM-dd") assertValidationField(t, errs, "personName", "max length 50") assertValidationField(t, errs, "ywgms", "unknown code") assertValidationField(t, errs, "cookAirTool", "must contain exactly one code") } func TestMapHealthRecordTaskRequiresKnownDoctorAndUnit(t *testing.T) { task := loadPHISHealthRecordTask(t) ctx := validPHISMapContext() ctx.MasterData = rejectingMasterDataLookup{} _, errs := MapHealthRecordTask(task, ctx) assertValidationField(t, errs, "manaDoctorId", "not found in CHIS doctor dictionary") assertValidationField(t, errs, "manaUnitId", "not found in CHIS organization dictionary") } func validPHISMapContext() MapContext { return MapContext{Dicts: DefaultDictSnapshot(), MasterData: fakeMasterDataLookup{}} } type rejectingMasterDataLookup struct{ fakeMasterDataLookup } func (rejectingMasterDataLookup) DoctorIDExists(string) bool { return false } func (rejectingMasterDataLookup) ManaUnitIDExists(string) bool { return false } func loadPHISHealthRecordTask(t *testing.T) source.HealthRecordTask { t.Helper() raw, err := os.ReadFile("../source/testdata/health_record.json") if err != nil { t.Fatalf("ReadFile: %v", err) } task, err := source.DecodeHealthRecordTask(raw) if err != nil { t.Fatalf("DecodeHealthRecordTask: %v", err) } return task }