Add direct

Closes #102
pull/105/head
Yasuhiro Matsumoto 2019-06-22 01:44:24 +09:00 committed by mattn
parent 3268207afe
commit 559ed99cdf
5 changed files with 125 additions and 3 deletions

View File

@ -20,3 +20,49 @@ func cmdTimeline(c *cli.Context) error {
} }
return nil return nil
} }
func cmdTimelineHome(c *cli.Context) error {
return cmdTimeline(c)
}
func cmdTimelinePublic(c *cli.Context) error {
client := c.App.Metadata["client"].(*mastodon.Client)
config := c.App.Metadata["config"].(*mastodon.Config)
timeline, err := client.GetTimelinePublic(context.Background(), false, nil)
if err != nil {
return err
}
s := newScreen(config)
for i := len(timeline) - 1; i >= 0; i-- {
s.displayStatus(c.App.Writer, timeline[i])
}
return nil
}
func cmdTimelineLocal(c *cli.Context) error {
client := c.App.Metadata["client"].(*mastodon.Client)
config := c.App.Metadata["config"].(*mastodon.Config)
timeline, err := client.GetTimelinePublic(context.Background(), true, nil)
if err != nil {
return err
}
s := newScreen(config)
for i := len(timeline) - 1; i >= 0; i-- {
s.displayStatus(c.App.Writer, timeline[i])
}
return nil
}
func cmdTimelineDirect(c *cli.Context) error {
client := c.App.Metadata["client"].(*mastodon.Client)
config := c.App.Metadata["config"].(*mastodon.Config)
timeline, err := client.GetTimelineDirect(context.Background(), nil)
if err != nil {
return err
}
s := newScreen(config)
for i := len(timeline) - 1; i >= 0; i-- {
s.displayStatus(c.App.Writer, timeline[i])
}
return nil
}

View File

@ -14,7 +14,13 @@ func TestCmdTimeline(t *testing.T) {
func(w http.ResponseWriter, r *http.Request) { func(w http.ResponseWriter, r *http.Request) {
switch r.URL.Path { switch r.URL.Path {
case "/api/v1/timelines/home": case "/api/v1/timelines/home":
fmt.Fprintln(w, `[{"content": "zzz"}]`) fmt.Fprintln(w, `[{"content": "home"}]`)
return
case "/api/v1/timelines/public":
fmt.Fprintln(w, `[{"content": "public"}]`)
return
case "/api/v1/timelines/direct":
fmt.Fprintln(w, `[{"content": "direct"}]`)
return return
} }
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound) http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
@ -22,9 +28,25 @@ func TestCmdTimeline(t *testing.T) {
}, },
func(app *cli.App) { func(app *cli.App) {
app.Run([]string{"mstdn", "timeline"}) app.Run([]string{"mstdn", "timeline"})
app.Run([]string{"mstdn", "timeline-home"})
app.Run([]string{"mstdn", "timeline-public"})
app.Run([]string{"mstdn", "timeline-local"})
app.Run([]string{"mstdn", "timeline-direct"})
}, },
) )
if !strings.Contains(out, "zzz") { want := strings.Join([]string{
t.Fatalf("%q should be contained in output of command: %v", "zzz", out) "@example.com",
"home",
"@example.com",
"home",
"@example.com",
"public",
"@example.com",
"public",
"@example.com",
"direct",
}, "\n") + "\n"
if !strings.Contains(out, want) {
t.Fatalf("%q should be contained in output of command: %v", want, out)
} }
} }

View File

@ -235,6 +235,26 @@ func makeApp() *cli.App {
Usage: "show timeline", Usage: "show timeline",
Action: cmdTimeline, Action: cmdTimeline,
}, },
{
Name: "timeline-home",
Usage: "show timeline home",
Action: cmdTimelineHome,
},
{
Name: "timeline-local",
Usage: "show timeline local",
Action: cmdTimelineLocal,
},
{
Name: "timeline-public",
Usage: "show timeline public",
Action: cmdTimelinePublic,
},
{
Name: "timeline-direct",
Usage: "show timeline direct",
Action: cmdTimelineDirect,
},
{ {
Name: "notification", Name: "notification",
Usage: "show notification", Usage: "show notification",

View File

@ -295,3 +295,15 @@ func (c *Client) UploadMediaFromReader(ctx context.Context, reader io.Reader) (*
} }
return &attachment, nil return &attachment, nil
} }
// GetTimelineDirect return statuses from direct timeline.
func (c *Client) GetTimelineDirect(ctx context.Context, pg *Pagination) ([]*Status, error) {
params := url.Values{}
var statuses []*Status
err := c.doAPI(ctx, http.MethodGet, "/api/v1/timelines/direct", params, &statuses, pg)
if err != nil {
return nil, err
}
return statuses, nil
}

View File

@ -370,6 +370,28 @@ func TestGetTimelinePublic(t *testing.T) {
} }
} }
func TestGetTimelineDirect(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, `[{"content": "direct"}, {"content": "status"}]`)
}))
defer ts.Close()
client := NewClient(&Config{Server: ts.URL})
tl, err := client.GetTimelineDirect(context.Background(), nil)
if err != nil {
t.Fatalf("should not be fail: %v", err)
}
if len(tl) != 2 {
t.Fatalf("result should be two: %d", len(tl))
}
if tl[0].Content != "direct" {
t.Fatalf("want %q but %q", "foo", tl[0].Content)
}
if tl[1].Content != "status" {
t.Fatalf("want %q but %q", "bar", tl[1].Content)
}
}
func TestGetTimelineHashtag(t *testing.T) { func TestGetTimelineHashtag(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/api/v1/timelines/tag/zzz" { if r.URL.Path != "/api/v1/timelines/tag/zzz" {