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  }