package fetch import ( "errors" "net/http" "net/http/httptest" "testing" ) type mockSavable struct { ns string k string v []byte } func (ms *mockSavable) Namespace() string { return ms.ns } func (ms *mockSavable) Key() string { return ms.k } func (ms *mockSavable) Value() []byte { return ms.v } func Test_Fetch(t *testing.T) { s := mockRemote() defer s.Close() cases := []struct { process func([]byte) ([]Savable, error) save func(string, string, []byte) error err error }{ { process: func([]byte) ([]Savable, error) { return []Savable{&mockSavable{ ns: "hello", k: "world", v: []byte("!"), }}, nil }, save: func(string, string, []byte) error { return nil }, err: nil, }, { process: func([]byte) ([]Savable, error) { return []Savable{&mockSavable{ ns: "hello", k: "world", v: []byte("!"), }}, nil }, save: func(string, string, []byte) error { return errors.New("this one") }, err: errors.New("this one"), }, { process: func([]byte) ([]Savable, error) { return []Savable{}, errors.New("that one") }, save: func(string, string, []byte) error { return nil }, err: errors.New("that one"), }, { process: func([]byte) ([]Savable, error) { return []Savable{}, nil }, save: func(string, string, []byte) error { return nil }, err: nil, }, } for _, c := range cases { f, err := New(c.process, c.save) if err != nil && err != c.err { t.Errorf("cannot create new fetcher: %v", err) } else if err == nil { if err := f.FetchProcessSave(s.URL); err != nil && err.Error() != c.err.Error() { t.Errorf("unexpected error: %v, expected %v", err, c.err) } } } } func mockRemote() *httptest.Server { return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { })) }