snoobert/reddit/multi_test.go
Vartan Benohanian def7e3bdb7 Chage NewRequest methods, add multi description kind to thing
Since Reddit's API accepts form data as the body for most of its
endpoints, it made sense to me to make the default NewRequest method
set the request body as form data (if provided of course). The
NewJSONRequest method can accept a JSON body.

Signed-off-by: Vartan Benohanian <vartanbeno@gmail.com>
2020-09-09 23:02:06 -04:00

292 lines
7.8 KiB
Go

package reddit
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"testing"
"time"
"github.com/stretchr/testify/require"
)
var expectedMulti = &Multi{
Name: "test",
DisplayName: "test",
Path: "/user/v_95/m/test/",
Subreddits: []string{"nba", "golang"},
CopiedFrom: nil,
Owner: "v_95",
OwnerID: "t2_164ab8",
Created: &Timestamp{time.Date(2020, 7, 11, 4, 55, 12, 0, time.UTC)},
NumberOfSubscribers: 0,
Visibility: "private",
CanEdit: true,
}
var expectedMulti2 = &Multi{
Name: "test2",
DisplayName: "test2",
Path: "/user/v_95/m/test2/",
Subreddits: []string{"redditdev", "test"},
CopiedFrom: nil,
Owner: "v_95",
OwnerID: "t2_164ab8",
Created: &Timestamp{time.Date(2020, 7, 11, 4, 57, 3, 0, time.UTC)},
NumberOfSubscribers: 0,
Visibility: "private",
CanEdit: true,
}
func TestMultiService_Get(t *testing.T) {
client, mux, teardown := setup()
defer teardown()
blob, err := readFileContents("../testdata/multi/multi.json")
require.NoError(t, err)
mux.HandleFunc("/api/multi/user/testuser/m/testmulti", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodGet, r.Method)
fmt.Fprint(w, blob)
})
multi, _, err := client.Multi.Get(ctx, "user/testuser/m/testmulti")
require.NoError(t, err)
require.Equal(t, expectedMulti, multi)
}
func TestMultiService_Mine(t *testing.T) {
client, mux, teardown := setup()
defer teardown()
blob, err := readFileContents("../testdata/multi/multis.json")
require.NoError(t, err)
mux.HandleFunc("/api/multi/mine", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodGet, r.Method)
fmt.Fprint(w, blob)
})
multis, _, err := client.Multi.Mine(ctx)
require.NoError(t, err)
require.Equal(t, []*Multi{expectedMulti, expectedMulti2}, multis)
}
func TestMultiService_Of(t *testing.T) {
client, mux, teardown := setup()
defer teardown()
blob, err := readFileContents("../testdata/multi/multis.json")
require.NoError(t, err)
mux.HandleFunc("/api/multi/user/test", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodGet, r.Method)
fmt.Fprint(w, blob)
})
multis, _, err := client.Multi.Of(ctx, "test")
require.NoError(t, err)
require.Equal(t, []*Multi{expectedMulti, expectedMulti2}, multis)
}
func TestMultiService_Copy(t *testing.T) {
client, mux, teardown := setup()
defer teardown()
blob, err := readFileContents("../testdata/multi/multi.json")
require.NoError(t, err)
mux.HandleFunc("/api/multi/copy", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodPost, r.Method)
form := url.Values{}
form.Set("from", "user/testuser/m/testmulti")
form.Set("to", "user/testuser2/m/testmulti2")
form.Set("description_md", "this is a multireddit")
form.Set("display_name", "hello")
err := r.ParseForm()
require.NoError(t, err)
require.Equal(t, form, r.Form)
fmt.Fprint(w, blob)
})
_, _, err = client.Multi.Copy(ctx, nil)
require.EqualError(t, err, "copyRequest: cannot be nil")
multi, _, err := client.Multi.Copy(ctx, &MultiCopyRequest{
FromPath: "user/testuser/m/testmulti",
ToPath: "user/testuser2/m/testmulti2",
Description: "this is a multireddit",
DisplayName: "hello",
})
require.NoError(t, err)
require.Equal(t, expectedMulti, multi)
}
func TestMultiService_Create(t *testing.T) {
client, mux, teardown := setup()
defer teardown()
blob, err := readFileContents("../testdata/multi/multi.json")
require.NoError(t, err)
createRequest := &MultiCreateOrUpdateRequest{
Name: "testmulti",
Description: "this is a multireddit",
Subreddits: []string{"golang"},
Visibility: "public",
}
mux.HandleFunc("/api/multi", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodPost, r.Method)
err := r.ParseForm()
require.NoError(t, err)
model := r.Form.Get("model")
expectedCreateRequest := new(MultiCreateOrUpdateRequest)
err = json.Unmarshal([]byte(model), expectedCreateRequest)
require.NoError(t, err)
require.Equal(t, expectedCreateRequest, createRequest)
fmt.Fprint(w, blob)
})
_, _, err = client.Multi.Create(ctx, nil)
require.EqualError(t, err, "createRequest: cannot be nil")
multi, _, err := client.Multi.Create(ctx, createRequest)
require.NoError(t, err)
require.Equal(t, expectedMulti, multi)
}
func TestMultiService_Update(t *testing.T) {
client, mux, teardown := setup()
defer teardown()
blob, err := readFileContents("../testdata/multi/multi.json")
require.NoError(t, err)
updateRequest := &MultiCreateOrUpdateRequest{
Name: "testmulti",
Description: "this is a multireddit",
Visibility: "public",
}
mux.HandleFunc("/api/multi/user/testuser/m/testmulti", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodPut, r.Method)
err := r.ParseForm()
require.NoError(t, err)
model := r.Form.Get("model")
expectedCreateRequest := new(MultiCreateOrUpdateRequest)
err = json.Unmarshal([]byte(model), expectedCreateRequest)
require.NoError(t, err)
require.Equal(t, expectedCreateRequest, updateRequest)
fmt.Fprint(w, blob)
})
_, _, err = client.Multi.Update(ctx, "user/testuser/m/testmulti", nil)
require.EqualError(t, err, "updateRequest: cannot be nil")
multi, _, err := client.Multi.Update(ctx, "user/testuser/m/testmulti", updateRequest)
require.NoError(t, err)
require.Equal(t, expectedMulti, multi)
}
func TestMultiService_Delete(t *testing.T) {
client, mux, teardown := setup()
defer teardown()
mux.HandleFunc("/api/multi/user/testuser/m/testmulti", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodDelete, r.Method)
})
_, err := client.Multi.Delete(ctx, "user/testuser/m/testmulti")
require.NoError(t, err)
}
func TestMultiService_Description(t *testing.T) {
client, mux, teardown := setup()
defer teardown()
blob, err := readFileContents("../testdata/multi/description.json")
require.NoError(t, err)
mux.HandleFunc("/api/multi/user/testuser/m/testmulti/description", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodGet, r.Method)
fmt.Fprint(w, blob)
})
description, _, err := client.Multi.Description(ctx, "user/testuser/m/testmulti")
require.NoError(t, err)
require.Equal(t, "hello world", description)
}
func TestMultiService_UpdateDescription(t *testing.T) {
client, mux, teardown := setup()
defer teardown()
blob, err := readFileContents("../testdata/multi/description.json")
require.NoError(t, err)
mux.HandleFunc("/api/multi/user/testuser/m/testmulti/description", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodPut, r.Method)
form := url.Values{}
form.Set("model", `{"body_md":"hello world"}`)
err := r.ParseForm()
require.NoError(t, err)
require.Equal(t, form, r.Form)
fmt.Fprint(w, blob)
})
description, _, err := client.Multi.UpdateDescription(ctx, "user/testuser/m/testmulti", "hello world")
require.NoError(t, err)
require.Equal(t, "hello world", description)
}
func TestMultiService_AddSubreddit(t *testing.T) {
client, mux, teardown := setup()
defer teardown()
mux.HandleFunc("/api/multi/user/testuser/m/testmulti/r/golang", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodPut, r.Method)
form := url.Values{}
form.Set("model", `{"name":"golang"}`)
err := r.ParseForm()
require.NoError(t, err)
require.Equal(t, form, r.Form)
})
_, err := client.Multi.AddSubreddit(ctx, "user/testuser/m/testmulti", "golang")
require.NoError(t, err)
}
func TestMultiService_DeleteSubreddit(t *testing.T) {
client, mux, teardown := setup()
defer teardown()
mux.HandleFunc("/api/multi/user/testuser/m/testmulti/r/golang", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodDelete, r.Method)
})
_, err := client.Multi.DeleteSubreddit(ctx, "user/testuser/m/testmulti", "golang")
require.NoError(t, err)
}