Skip to content

Instantly share code, notes, and snippets.

@RicardoLinck
Last active November 1, 2020 11:54
Show Gist options
  • Save RicardoLinck/15c7fe7d989c52bf6a1f0f63de3b976b to your computer and use it in GitHub Desktop.
Save RicardoLinck/15c7fe7d989c52bf6a1f0f63de3b976b to your computer and use it in GitHub Desktop.
func TestConfiguration_FetchData(t *testing.T) {
errFromFetcher := errors.New("mock error")
type fields struct {
baseURL string
apiVersion int
fetcherFunc func(string) (io.ReadCloser, error)
}
tests := []struct {
name string
fields fields
want Person
wantCallsToFetcher int
wantErr error
}{
{
name: "errors when invalid api version",
fields: fields{
baseURL: "",
apiVersion: 3,
fetcherFunc: func(string) (io.ReadCloser, error) {
return nil, nil
},
},
want: Person{},
wantCallsToFetcher: 0,
wantErr: ErrInvalidAPIVersion,
},
{
name: "errors when fetcher returns error",
fields: fields{
baseURL: "",
apiVersion: 1,
fetcherFunc: func(string) (io.ReadCloser, error) {
return ioutil.NopCloser(bytes.NewBufferString("")), errFromFetcher
},
},
want: Person{},
wantCallsToFetcher: 1,
wantErr: errFromFetcher,
},
{
name: "decodes and maps from v1 response",
fields: fields{
baseURL: "",
apiVersion: 1,
fetcherFunc: func(string) (io.ReadCloser, error) {
return ioutil.NopCloser(bytes.NewBufferString(`
{"user_name":"test_user",
"dob":"1999-05-23T18:25:43.511Z",
"fav_sports":[{"name":"football","order":2},{"name":"hockey", "order":1}]}
`)), nil
},
},
want: Person{
Name: "test_user",
Age: 21,
Sports: []string{"hockey", "football"},
},
wantCallsToFetcher: 1,
wantErr: nil,
},
{
name: "decodes and maps from v2 response",
fields: fields{
baseURL: "",
apiVersion: 2,
fetcherFunc: func(string) (io.ReadCloser, error) {
return ioutil.NopCloser(bytes.NewBufferString(`
{"name":"test_user",
"age":21,
"sports":["football","hockey"]}
`)), nil
},
},
want: Person{
Name: "test_user",
Age: 21,
Sports: []string{"football", "hockey"},
},
wantCallsToFetcher: 1,
wantErr: nil,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
mf := &mockFetcher{tt.fields.fetcherFunc, 0}
c := Configuration{
baseURL: tt.fields.baseURL,
apiVersion: tt.fields.apiVersion,
fetcher: mf,
}
got, err := c.FetchData()
if tt.wantErr != nil {
assert.Error(t, tt.wantErr, err)
} else {
assert.Nil(t, err)
}
assert.Equal(t, tt.want, got)
assert.Equal(t, tt.wantCallsToFetcher, mf.calls)
})
}
}
type mockFetcher struct {
fetchFunc func(url string) (io.ReadCloser, error)
calls int
}
func (m *mockFetcher) fetch(url string) (io.ReadCloser, error) {
m.calls++
return m.fetchFunc(url)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment