From e4f7c4a04c6599a868d726bd1d4365743119128d Mon Sep 17 00:00:00 2001 From: Mazyar Date: Mon, 13 Jul 2026 13:44:31 +0330 Subject: [PATCH] Add unit tests for backfilling notice location from buyer - Introduced `mapper_test.go` to validate the functionality of backfilling notice location details from the buyer organization. - Implemented two test cases: one to ensure the location fields are correctly populated from the buyer when they are empty, and another to verify that existing values are not overwritten. - Enhanced the `mapper.go` file by adding the `backfillNoticeLocationFromBuyer` function to facilitate this logic. This update improves the reliability of notice data handling within the tender management system by ensuring accurate location information is maintained. --- ted/mapper.go | 22 ++++++++++++++++ ted/mapper_test.go | 64 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 ted/mapper_test.go diff --git a/ted/mapper.go b/ted/mapper.go index 33d926a..11b35da 100644 --- a/ted/mapper.go +++ b/ted/mapper.go @@ -226,6 +226,7 @@ func (s *TEDScraper) mapPriorInformationNoticeToTender(pin *PriorInformationNoti t.BuyerOrganization = s.mapOrganization(buyerOrg, "buyer") } } + backfillNoticeLocationFromBuyer(t) reviewID := pin.GetReviewOrganizationID() if reviewID != "" { @@ -407,6 +408,7 @@ func (s *TEDScraper) mapToTender(cn *ContractNotice, sourceFileURL, sourceFileNa t.BuyerOrganization = s.mapOrganization(buyerOrg, "buyer") } } + backfillNoticeLocationFromBuyer(t) // Set review organization reviewID := cn.GetReviewOrganizationID() @@ -570,6 +572,7 @@ func (s *TEDScraper) mapContractAwardNoticeToTender(can *ContractAwardNotice, so t.BuyerOrganization = s.mapOrganization(buyerOrg, "buyer") } } + backfillNoticeLocationFromBuyer(t) // Set all organizations if orgs := can.GetOrganizations(); orgs != nil { @@ -667,6 +670,25 @@ func (s *TEDScraper) mapOrganization(tedOrg *Organization, role string) *notice. return org } +func backfillNoticeLocationFromBuyer(t *notice.Notice) { + if t == nil || t.BuyerOrganization == nil { + return + } + buyer := t.BuyerOrganization.Address + if strings.TrimSpace(t.CountryCode) == "" && strings.TrimSpace(buyer.CountryCode) != "" { + t.CountryCode = strings.TrimSpace(buyer.CountryCode) + } + if strings.TrimSpace(t.CityName) == "" && strings.TrimSpace(buyer.CityName) != "" { + t.CityName = strings.TrimSpace(buyer.CityName) + } + if strings.TrimSpace(t.PostalCode) == "" && strings.TrimSpace(buyer.PostalZone) != "" { + t.PostalCode = strings.TrimSpace(buyer.PostalZone) + } + if strings.TrimSpace(t.RegionCode) == "" && strings.TrimSpace(buyer.CountrySubentityCode) != "" { + t.RegionCode = strings.TrimSpace(buyer.CountrySubentityCode) + } +} + func backfillNoticeEstimatedValueFromLots(t *notice.Notice) { if t == nil || t.EstimatedValue > 0 { return diff --git a/ted/mapper_test.go b/ted/mapper_test.go new file mode 100644 index 0000000..162eca0 --- /dev/null +++ b/ted/mapper_test.go @@ -0,0 +1,64 @@ +package ted + +import ( + "testing" + "tm/internal/notice" +) + +func TestBackfillNoticeLocationFromBuyer(t *testing.T) { + n := ¬ice.Notice{ + BuyerOrganization: ¬ice.Organization{ + Address: notice.Address{ + CountryCode: "POL", + CityName: "Warsaw", + PostalZone: "00-001", + CountrySubentityCode: "PL14", + }, + }, + } + backfillNoticeLocationFromBuyer(n) + + if n.CountryCode != "POL" { + t.Fatalf("expected country POL, got %q", n.CountryCode) + } + if n.CityName != "Warsaw" { + t.Fatalf("expected city Warsaw, got %q", n.CityName) + } + if n.PostalCode != "00-001" { + t.Fatalf("expected postal 00-001, got %q", n.PostalCode) + } + if n.RegionCode != "PL14" { + t.Fatalf("expected region PL14, got %q", n.RegionCode) + } +} + +func TestBackfillNoticeLocationFromBuyerDoesNotOverwrite(t *testing.T) { + n := ¬ice.Notice{ + CountryCode: "DEU", + CityName: "Berlin", + PostalCode: "10115", + RegionCode: "DE300", + BuyerOrganization: ¬ice.Organization{ + Address: notice.Address{ + CountryCode: "POL", + CityName: "Warsaw", + PostalZone: "00-001", + CountrySubentityCode: "PL14", + }, + }, + } + backfillNoticeLocationFromBuyer(n) + + if n.CountryCode != "DEU" { + t.Fatalf("expected country DEU, got %q", n.CountryCode) + } + if n.CityName != "Berlin" { + t.Fatalf("expected city Berlin, got %q", n.CityName) + } + if n.PostalCode != "10115" { + t.Fatalf("expected postal 10115, got %q", n.PostalCode) + } + if n.RegionCode != "DE300" { + t.Fatalf("expected region DE300, got %q", n.RegionCode) + } +}