diff --git a/mastodon_test.go b/mastodon_test.go index ef70981..9a8f3e3 100644 --- a/mastodon_test.go +++ b/mastodon_test.go @@ -2,6 +2,7 @@ package mastodon import ( "context" + "encoding/json" "fmt" "io" "net/http" @@ -204,6 +205,116 @@ func TestPostStatusWithCancel(t *testing.T) { t.Fatalf("want %q but %q", want, err.Error()) } } +func TestPostStatusParams(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.URL.Path != "/api/v1/statuses" { + http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound) + return + } + r.ParseForm() + if r.FormValue("media_ids[]") != "" && r.FormValue("poll[options][]") != "" { + http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest) + } + s := Status{ + ID: ID("1"), + Content: fmt.Sprintf("

%s

", r.FormValue("status")), + } + if r.FormValue("in_reply_to_id") != "" { + s.InReplyToID = ID(r.FormValue("in_reply_to_id")) + } + if r.FormValue("visibility") != "" { + s.Visibility = (r.FormValue("visibility")) + } + if r.FormValue("sensitive") == "true" { + s.Sensitive = true + s.SpoilerText = fmt.Sprintf("

%s

", r.FormValue("spoiler_text")) + } + if r.FormValue("media_ids[]") != "" { + for _, id := range r.Form["media_ids[]"] { + s.MediaAttachments = append(s.MediaAttachments, + Attachment{ID: ID(id)}) + } + } + if r.FormValue("poll[options][]") != "" { + p := Poll{} + for _, opt := range r.Form["poll[options][]"] { + p.Options = append(p.Options, PollOption{ + Title: opt, + VotesCount: 0, + }) + } + if r.FormValue("poll[multiple]") == "true" { + p.Multiple = true + } + s.Poll = &p + } + json.NewEncoder(w).Encode(s) + })) + defer ts.Close() + client := NewClient(&Config{ + Server: ts.URL, + ClientID: "foo", + ClientSecret: "bar", + AccessToken: "zoo", + }) + s, err := client.PostStatus(context.Background(), &Toot{ + Status: "foobar", + InReplyToID: ID("2"), + Visibility: "unlisted", + Sensitive: true, + SpoilerText: "bar", + MediaIDs: []ID{"1", "2"}, + Poll: &TootPoll{ + Options: []string{"A", "B"}, + }, + }) + if err != nil { + t.Fatalf("should not be fail: %v", err) + } + if len(s.MediaAttachments) > 0 && s.Poll != nil { + t.Fatal("should not fail, can't have both Media and Poll") + } + if s.Content != "

foobar

" { + t.Fatalf("want %q but %q", "

foobar

", s.Content) + } + if s.InReplyToID != "2" { + t.Fatalf("want %q but %q", "2", s.InReplyToID) + } + if s.Visibility != "unlisted" { + t.Fatalf("want %q but %q", "unlisted", s.Visibility) + } + if s.Sensitive != true { + t.Fatalf("want %t but %t", true, s.Sensitive) + } + if s.SpoilerText != "

bar

" { + t.Fatalf("want %q but %q", "

bar

", s.SpoilerText) + } + s, err = client.PostStatus(context.Background(), &Toot{ + Status: "foobar", + Poll: &TootPoll{ + Multiple: true, + Options: []string{"A", "B"}, + }, + }) + if err != nil { + t.Fatalf("should not be fail: %v", err) + } + if s.Poll == nil { + t.Fatalf("poll should not be %v", s.Poll) + } + if len(s.Poll.Options) != 2 { + t.Fatalf("want %q but %q", 2, len(s.Poll.Options)) + } + if s.Poll.Options[0].Title != "A" { + t.Fatalf("want %q but %q", "A", s.Poll.Options[0].Title) + } + if s.Poll.Options[1].Title != "B" { + t.Fatalf("want %q but %q", "B", s.Poll.Options[1].Title) + } + if s.Poll.Multiple != true { + t.Fatalf("want %t but %t", true, s.Poll.Multiple) + } +} func TestGetTimelineHome(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {