Rename FetchProcessSave and wrap all func in process

master
Bel LaPointe 2018-10-08 15:34:12 -06:00
parent 1884fda442
commit 27479df8c7
2 changed files with 10 additions and 68 deletions

View File

@ -5,27 +5,19 @@ import (
"net/http" "net/http"
) )
type Savable interface {
Namespace() string
Key() string
Value() []byte
}
type Fetch struct { type Fetch struct {
process func([]byte) ([]Savable, error) process func(string, []byte) error
save func(string, string, []byte) error
client *http.Client client *http.Client
} }
func New(process func([]byte) ([]Savable, error), save func(string, string, []byte) error) (*Fetch, error) { func New(process func(string, []byte) error) (*Fetch, error) {
return &Fetch{ return &Fetch{
save: save,
process: process, process: process,
client: &http.Client{}, client: &http.Client{},
}, nil }, nil
} }
func (fetcher *Fetch) FetchProcessSave(url string) error { func (fetcher *Fetch) FetchProcess(url string) error {
req, err := http.NewRequest("GET", url, nil) req, err := http.NewRequest("GET", url, nil)
if err != nil { if err != nil {
return err return err
@ -39,15 +31,8 @@ func (fetcher *Fetch) FetchProcessSave(url string) error {
if err != nil { if err != nil {
return err return err
} }
items, err := fetcher.process(b) if err := fetcher.process(url, b); err != nil {
if err != nil {
return err return err
} }
for i := range items {
err := fetcher.save(items[i].Namespace(), items[i].Key(), items[i].Value())
if err != nil {
return err
}
}
return nil return nil
} }

View File

@ -7,75 +7,32 @@ import (
"testing" "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) { func Test_Fetch(t *testing.T) {
s := mockRemote() s := mockRemote()
defer s.Close() defer s.Close()
cases := []struct { cases := []struct {
process func([]byte) ([]Savable, error) process func(string, []byte) error
save func(string, string, []byte) error
err error err error
}{ }{
{ {
process: func([]byte) ([]Savable, error) { process: func(string, []byte) error {
return []Savable{&mockSavable{
ns: "hello",
k: "world",
v: []byte("!"),
}}, nil
},
save: func(string, string, []byte) error {
return nil return nil
}, },
err: nil, err: nil,
}, },
{ {
process: func([]byte) ([]Savable, error) { process: func(string, []byte) error {
return []Savable{&mockSavable{ return errors.New("that one")
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"), 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 { for _, c := range cases {
f, err := New(c.process, c.save) f, err := New(c.process)
if err != nil && err != c.err { if err != nil && err != c.err {
t.Errorf("cannot create new fetcher: %v", err) t.Errorf("cannot create new fetcher: %v", err)
} else if err == nil { } else if err == nil {
if err := f.FetchProcessSave(s.URL); err != nil && err.Error() != c.err.Error() { if err := f.FetchProcess(s.URL); err != nil && err.Error() != c.err.Error() {
t.Errorf("unexpected error: %v, expected %v", err, c.err) t.Errorf("unexpected error: %v, expected %v", err, c.err)
} }
} }