package remote import ( "errors" "net/http" "net/http/httptest" "testing" ) func mockClient(code int, body string) (*Client, *httptest.Server) { s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(code) w.Write([]byte(body)) })) return &Client{ config: &Config{ remote: s.URL, password: "", args: []string{}, }, http: &http.Client{}, }, s } func TestClientLists(t *testing.T) { c, srv := mockClient(200, `{"list":[{"id":"1", "name":"name"}]}`) defer srv.Close() if l, err := c.Lists(); err != nil { t.Fatalf("cannot lists(): %v", err) } else if l[0] != (List{ID: "1", Name: "name"}) { t.Fatalf("cannot parse lists(): %v", l[0]) } } func TestClientTasks(t *testing.T) { c, srv := mockClient(200, `{"list":[{"id":"1", "title":"title", "compl": 1}]}`) defer srv.Close() if l, err := c.Tasks(List{}); err != nil { t.Fatalf("cannot tasks(): %v", err) } else if l[0] != (Task{ID: "1", Title: "title", Complete: 1}) { t.Fatalf("cannot parse tasks(): %v", l[0]) } } func TestClientNewTask(t *testing.T) { cases := []struct { status int err error }{ { status: http.StatusOK, err: nil, }, { status: http.StatusNotFound, err: errors.New("non 200 status on new task: 404"), }, } for i, c := range cases { cli, srv := mockClient(c.status, `{}`) defer srv.Close() err := cli.NewTask(List{ID: "1"}, Task{Title: "a"}, "a,tag") if (err != nil && c.err == nil) || (err == nil && c.err != nil) { t.Errorf("[%d] new task unexpected error: got %v, want %v", i, err, c.err) } } } func TestClientCloseTask(t *testing.T) { cases := []struct { status int err error }{ { status: http.StatusOK, err: nil, }, { status: http.StatusNotFound, err: errors.New("non 200 status on close task: 404"), }, } for i, c := range cases { cli, srv := mockClient(c.status, `{}`) defer srv.Close() err := cli.CloseTask(Task{ID: "1"}) if (err != nil && c.err == nil) || (err == nil && c.err != nil) { t.Errorf("[%d] new task unexpected error: got %v, want %v", i, err, c.err) } } } func TestClientOpenTask(t *testing.T) { cases := []struct { status int err error }{ { status: http.StatusOK, err: nil, }, { status: http.StatusNotFound, err: errors.New("non 200 status on open task: 404"), }, } for i, c := range cases { cli, srv := mockClient(c.status, `{}`) defer srv.Close() err := cli.OpenTask(Task{ID: "1"}) if (err != nil && c.err == nil) || (err == nil && c.err != nil) { t.Errorf("[%d] new task unexpected error: got %v, want %v", i, err, c.err) } } }