github.com/m-lab/locate@v0.17.6/clientgeo/user_test.go (about) 1 package clientgeo 2 3 import ( 4 "context" 5 "net/http" 6 "net/http/httptest" 7 "net/url" 8 "reflect" 9 "testing" 10 ) 11 12 func TestUserLocator_Locate(t *testing.T) { 13 tests := []struct { 14 name string 15 vals url.Values 16 want *Location 17 wantErr bool 18 }{ 19 { 20 name: "success-user-latlon", 21 want: &Location{ 22 Latitude: "12", 23 Longitude: "34", 24 Headers: http.Header{ 25 hLocateClientlatlon: []string{"12,34"}, 26 hLocateClientlatlonMethod: []string{"user-latlon"}, 27 }, 28 }, 29 vals: url.Values{ 30 "lat": []string{"12"}, 31 "lon": []string{"34"}, 32 }, 33 }, 34 { 35 name: "success-user-region", 36 want: &Location{ 37 Latitude: "43.19880000", 38 Longitude: "-75.3242000", 39 Headers: http.Header{ 40 hLocateClientlatlon: []string{"43.19880000,-75.3242000"}, 41 hLocateClientlatlonMethod: []string{"user-region"}, 42 }, 43 }, 44 vals: url.Values{ 45 "region": []string{"US-NY"}, 46 }, 47 }, 48 { 49 name: "success-user-country", 50 want: &Location{ 51 Latitude: "37.09024", 52 Longitude: "-95.712891", 53 Headers: http.Header{ 54 hLocateClientlatlon: []string{"37.09024,-95.712891"}, 55 hLocateClientlatlonMethod: []string{"user-country"}, 56 }, 57 }, 58 vals: url.Values{ 59 "country": []string{"US"}, 60 }, 61 }, 62 { 63 name: "error-unusable-latitude-parameters", 64 vals: url.Values{ 65 "lat": []string{"xyz.000"}, 66 "lon": []string{"34"}, 67 }, 68 wantErr: true, 69 }, 70 { 71 name: "error-unusable-longitude-parameters", 72 vals: url.Values{ 73 "lat": []string{"12"}, 74 "lon": []string{"xyz.000"}, 75 }, 76 wantErr: true, 77 }, 78 { 79 name: "error-unusable-nan", 80 vals: url.Values{ 81 "lat": []string{"NaN"}, 82 "lon": []string{"NaN"}, 83 }, 84 wantErr: true, 85 }, 86 { 87 name: "error-unusable-inf", 88 vals: url.Values{ 89 "lat": []string{"Inf"}, 90 "lon": []string{"Inf"}, 91 }, 92 wantErr: true, 93 }, 94 { 95 name: "error-unusable-lat-too-big", 96 vals: url.Values{ 97 "lat": []string{"91"}, 98 "lon": []string{"0"}, 99 }, 100 wantErr: true, 101 }, 102 { 103 name: "error-unusable-lon-too-big", 104 vals: url.Values{ 105 "lat": []string{"0"}, 106 "lon": []string{"181"}, 107 }, 108 wantErr: true, 109 }, 110 { 111 name: "error-no-parameters", 112 wantErr: true, 113 }, 114 } 115 for _, tt := range tests { 116 t.Run(tt.name, func(t *testing.T) { 117 u := NewUserLocator() 118 req := httptest.NewRequest(http.MethodGet, "/v2/nearest", nil) 119 req.URL.RawQuery = tt.vals.Encode() 120 got, err := u.Locate(req) 121 if (err != nil) != tt.wantErr { 122 t.Errorf("UserLocator.Locate() error = %v, wantErr %v", err, tt.wantErr) 123 return 124 } 125 if !reflect.DeepEqual(got, tt.want) { 126 t.Errorf("UserLocator.Locate() = %v, want %v", got, tt.want) 127 } 128 u.Reload(context.Background()) 129 }) 130 } 131 }