package sourcing import ( "context" "net/http" "net/http/httptest" "testing" ) const pdlSample = `{"status":200,"total":2,"data":[ {"id":"abc","full_name":"Jane Cleared","job_title":"Information System Security Officer","job_title_role":"engineering", "location_name":"honolulu, hawaii, united states","skills":["rmf","ato","cybersecurity"],"inferred_years_experience":9, "emails":[{"address":"jane@example.com","type":"work"}],"phone_numbers":["+18085551234"]}, {"id":"","full_name":"No Id"} ]}` func TestPDLSearchMapsAndDropsContactByDefault(t *testing.T) { var gotKey string srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { gotKey = r.Header.Get("X-Api-Key") _, _ = w.Write([]byte(pdlSample)) })) defer srv.Close() p := NewPDL("secret", srv.URL, false) // includeContact = false out, err := p.Search(context.Background(), SearchQuery{ESQuery: GalapagosSearch(), Size: 10}) if err != nil { t.Fatalf("search: %v", err) } if gotKey != "secret" { t.Fatalf("X-Api-Key must be sent, got %q", gotKey) } if len(out) != 1 { // the empty-id record is dropped t.Fatalf("want 1 valid person, got %d", len(out)) } sp := out[0] if sp.ExternalID != "abc" || sp.FullName != "Jane Cleared" || sp.Years != 9 { t.Fatalf("identity mapped wrong: %+v", sp) } if len(sp.Emails) != 0 || len(sp.Phones) != 0 { t.Fatalf("contact fields must be excluded by default, got %v %v", sp.Emails, sp.Phones) } if len(sp.Skills) != 3 { t.Fatalf("skills mapped wrong: %v", sp.Skills) } } func TestPDLSearchIncludesContactWhenAsked(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { _, _ = w.Write([]byte(pdlSample)) })) defer srv.Close() p := NewPDL("k", srv.URL, true) // includeContact = true out, _ := p.Search(context.Background(), SearchQuery{ESQuery: GalapagosSearch(), Size: 1}) if len(out) != 1 || len(out[0].Emails) != 1 || out[0].Emails[0] != "jane@example.com" { t.Fatalf("contact fields must be included when asked: %+v", out) } } func TestPDLSearch429(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusTooManyRequests) })) defer srv.Close() p := NewPDL("k", srv.URL, false) if _, err := p.Search(context.Background(), SearchQuery{ESQuery: map[string]any{}, Size: 1}); err != ErrThrottled { t.Fatalf("429 must map to ErrThrottled, got %v", err) } } func TestGalapagosSearchShape(t *testing.T) { q := GalapagosSearch() b, ok := q["bool"].(map[string]any) if !ok { t.Fatal("query must have a bool root") } if _, ok := b["must"]; !ok { t.Fatal("query must have a must clause") } }