Finish MultiService + all tests for it
Signed-off-by: Vartan Benohanian <vartanbeno@gmail.com>
This commit is contained in:
parent
ce1f3dceba
commit
f8d5a31b52
5 changed files with 512 additions and 19 deletions
157
multi.go
157
multi.go
|
@ -24,15 +24,16 @@ type multiRoot struct {
|
||||||
// Users can create multis for custom navigation, instead of browsing
|
// Users can create multis for custom navigation, instead of browsing
|
||||||
// one subreddit or all subreddits at a time.
|
// one subreddit or all subreddits at a time.
|
||||||
type Multi struct {
|
type Multi struct {
|
||||||
Name string `json:"name,omitempty"`
|
Name string `json:"name,omitempty"`
|
||||||
DisplayName string `json:"display_name,omitempty"`
|
DisplayName string `json:"display_name,omitempty"`
|
||||||
|
// Format: user/{username}/m/{multiname}
|
||||||
Path string `json:"path,omitempty"`
|
Path string `json:"path,omitempty"`
|
||||||
Description string `json:"description_md,omitempty"`
|
Description string `json:"description_md,omitempty"`
|
||||||
Subreddits SubredditNames `json:"subreddits"`
|
Subreddits SubredditNames `json:"subreddits"`
|
||||||
CopedFrom *string `json:"copied_from"`
|
CopiedFrom *string `json:"copied_from"`
|
||||||
|
|
||||||
Owner string `json:"owner,omitempty"`
|
Owner string `json:"owner,omitempty"`
|
||||||
OwnerID string `json:"ownerID,omitempty"`
|
OwnerID string `json:"owner_id,omitempty"`
|
||||||
Created *Timestamp `json:"created_utc,omitempty"`
|
Created *Timestamp `json:"created_utc,omitempty"`
|
||||||
|
|
||||||
NumberOfSubscribers int `json:"num_subscribers"`
|
NumberOfSubscribers int `json:"num_subscribers"`
|
||||||
|
@ -66,10 +67,23 @@ func (n *SubredditNames) UnmarshalJSON(data []byte) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MarshalJSON implements the json.Marshaler interface.
|
||||||
|
func (n *SubredditNames) MarshalJSON() ([]byte, error) {
|
||||||
|
var subreddits []map[string]string
|
||||||
|
|
||||||
|
for _, sr := range *n {
|
||||||
|
subreddits = append(subreddits, map[string]string{
|
||||||
|
"name": sr,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return json.Marshal(subreddits)
|
||||||
|
}
|
||||||
|
|
||||||
// MultiCopyRequest represents a request to copy a multireddit.
|
// MultiCopyRequest represents a request to copy a multireddit.
|
||||||
type MultiCopyRequest struct {
|
type MultiCopyRequest struct {
|
||||||
From string
|
FromPath string
|
||||||
To string
|
ToPath string
|
||||||
// Raw markdown text.
|
// Raw markdown text.
|
||||||
Description string
|
Description string
|
||||||
// No longer than 50 characters.
|
// No longer than 50 characters.
|
||||||
|
@ -79,29 +93,38 @@ type MultiCopyRequest struct {
|
||||||
// Form parameterizes the fields and returns the form.
|
// Form parameterizes the fields and returns the form.
|
||||||
func (r *MultiCopyRequest) Form() url.Values {
|
func (r *MultiCopyRequest) Form() url.Values {
|
||||||
form := url.Values{}
|
form := url.Values{}
|
||||||
form.Set("from", r.From)
|
form.Set("from", r.FromPath)
|
||||||
form.Set("to", r.To)
|
form.Set("to", r.ToPath)
|
||||||
form.Set("description_md", r.Description)
|
form.Set("description_md", r.Description)
|
||||||
form.Set("display_name", r.DisplayName)
|
form.Set("display_name", r.DisplayName)
|
||||||
return form
|
return form
|
||||||
}
|
}
|
||||||
|
|
||||||
// MultiCreateRequest represents a request to create a multireddit.
|
// MultiCreateOrUpdateRequest represents a request to create/update a multireddit.
|
||||||
type MultiCreateRequest struct {
|
type MultiCreateOrUpdateRequest struct {
|
||||||
Description string `json:"description_md,omitempty"`
|
// For updates, this is the display name, i.e. the header of the multi.
|
||||||
DisplayName string `json:"display_name,omitempty"`
|
// Not part of the path necessarily.
|
||||||
Subreddits []string `json:"subreddits"`
|
Name string `json:"display_name,omitempty"`
|
||||||
Visibility string `json:"visibility,omitempty"`
|
Description string `json:"description_md,omitempty"`
|
||||||
|
Subreddits SubredditNames `json:"subreddits,omitempty"`
|
||||||
|
// One of: private, public, hidden
|
||||||
|
Visibility string `json:"visibility,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Form parameterizes the fields and returns the form.
|
// Form parameterizes the fields and returns the form.
|
||||||
func (r *MultiCreateRequest) Form() url.Values {
|
func (r *MultiCreateOrUpdateRequest) Form() url.Values {
|
||||||
byteValue, _ := json.Marshal(r)
|
byteValue, _ := json.Marshal(r)
|
||||||
form := url.Values{}
|
form := url.Values{}
|
||||||
form.Set("model", string(byteValue))
|
form.Set("model", string(byteValue))
|
||||||
return form
|
return form
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type rootMultiDescription struct {
|
||||||
|
Data struct {
|
||||||
|
Body string `json:"body_md"`
|
||||||
|
} `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
// Get gets information about the multireddit from its url path.
|
// Get gets information about the multireddit from its url path.
|
||||||
func (s *MultiService) Get(ctx context.Context, multiPath string) (*Multi, *Response, error) {
|
func (s *MultiService) Get(ctx context.Context, multiPath string) (*Multi, *Response, error) {
|
||||||
path := fmt.Sprintf("api/multi/%s", multiPath)
|
path := fmt.Sprintf("api/multi/%s", multiPath)
|
||||||
|
@ -144,6 +167,7 @@ func (s *MultiService) Mine(ctx context.Context) ([]Multi, *Response, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Of returns the user's public multireddits.
|
// Of returns the user's public multireddits.
|
||||||
|
// Or, if the user is you, all of your multireddits.
|
||||||
func (s *MultiService) Of(ctx context.Context, username string) ([]Multi, *Response, error) {
|
func (s *MultiService) Of(ctx context.Context, username string) ([]Multi, *Response, error) {
|
||||||
path := fmt.Sprintf("api/multi/user/%s", username)
|
path := fmt.Sprintf("api/multi/user/%s", username)
|
||||||
|
|
||||||
|
@ -172,7 +196,7 @@ func (s *MultiService) Copy(ctx context.Context, copyRequest *MultiCopyRequest)
|
||||||
return nil, nil, errors.New("copyRequest cannot be nil")
|
return nil, nil, errors.New("copyRequest cannot be nil")
|
||||||
}
|
}
|
||||||
|
|
||||||
path := fmt.Sprintf("api/multi/copy")
|
path := "api/multi/copy"
|
||||||
|
|
||||||
req, err := s.client.NewPostForm(path, copyRequest.Form())
|
req, err := s.client.NewPostForm(path, copyRequest.Form())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -189,14 +213,14 @@ func (s *MultiService) Copy(ctx context.Context, copyRequest *MultiCopyRequest)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create creates a multireddit.
|
// Create creates a multireddit.
|
||||||
func (s *MultiService) Create(ctx context.Context, createRequest *MultiCreateRequest) (*Multi, *Response, error) {
|
func (s *MultiService) Create(ctx context.Context, createRequest *MultiCreateOrUpdateRequest) (*Multi, *Response, error) {
|
||||||
if createRequest == nil {
|
if createRequest == nil {
|
||||||
return nil, nil, errors.New("createRequest cannot be nil")
|
return nil, nil, errors.New("createRequest cannot be nil")
|
||||||
}
|
}
|
||||||
|
|
||||||
path := fmt.Sprintf("api/multi/copy")
|
path := "api/multi"
|
||||||
|
|
||||||
req, err := s.client.NewRequest(http.MethodPost, path, createRequest)
|
req, err := s.client.NewPostForm(path, createRequest.Form())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
@ -210,6 +234,31 @@ func (s *MultiService) Create(ctx context.Context, createRequest *MultiCreateReq
|
||||||
return root.Data, resp, nil
|
return root.Data, resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update updates a multireddit.
|
||||||
|
// If the multireddit does not exist, it will be created.
|
||||||
|
func (s *MultiService) Update(ctx context.Context, multiPath string, updateRequest *MultiCreateOrUpdateRequest) (*Multi, *Response, error) {
|
||||||
|
if updateRequest == nil {
|
||||||
|
return nil, nil, errors.New("updateRequest cannot be nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
path := fmt.Sprintf("api/multi/%s", multiPath)
|
||||||
|
|
||||||
|
req, err := s.client.NewPostForm(path, updateRequest.Form())
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
// todo: fix this
|
||||||
|
req.Method = http.MethodPut
|
||||||
|
|
||||||
|
root := new(multiRoot)
|
||||||
|
resp, err := s.client.Do(ctx, req, root)
|
||||||
|
if err != nil {
|
||||||
|
return nil, resp, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return root.Data, resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
// Delete deletes a multireddit.
|
// Delete deletes a multireddit.
|
||||||
func (s *MultiService) Delete(ctx context.Context, multiPath string) (*Response, error) {
|
func (s *MultiService) Delete(ctx context.Context, multiPath string) (*Response, error) {
|
||||||
path := fmt.Sprintf("api/multi/%s", multiPath)
|
path := fmt.Sprintf("api/multi/%s", multiPath)
|
||||||
|
@ -221,3 +270,73 @@ func (s *MultiService) Delete(ctx context.Context, multiPath string) (*Response,
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
return s.client.Do(ctx, req, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetDescription gets a multireddit's description.
|
||||||
|
func (s *MultiService) GetDescription(ctx context.Context, multiPath string) (string, *Response, error) {
|
||||||
|
path := fmt.Sprintf("api/multi/%s/description", multiPath)
|
||||||
|
|
||||||
|
req, err := s.client.NewRequest(http.MethodGet, path, nil)
|
||||||
|
if err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
root := new(rootMultiDescription)
|
||||||
|
resp, err := s.client.Do(ctx, req, root)
|
||||||
|
if err != nil {
|
||||||
|
return "", resp, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return root.Data.Body, resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateDescription updates a multireddit's description.
|
||||||
|
func (s *MultiService) UpdateDescription(ctx context.Context, multiPath string, description string) (string, *Response, error) {
|
||||||
|
path := fmt.Sprintf("api/multi/%s/description", multiPath)
|
||||||
|
|
||||||
|
form := url.Values{}
|
||||||
|
form.Set("model", fmt.Sprintf(`{"body_md":"%s"}`, description))
|
||||||
|
|
||||||
|
req, err := s.client.NewPostForm(path, form)
|
||||||
|
if err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
// todo: fix this
|
||||||
|
req.Method = http.MethodPut
|
||||||
|
|
||||||
|
root := new(rootMultiDescription)
|
||||||
|
resp, err := s.client.Do(ctx, req, root)
|
||||||
|
if err != nil {
|
||||||
|
return "", resp, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return root.Data.Body, resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddSubreddit adds a subreddit to a multireddit.
|
||||||
|
func (s *MultiService) AddSubreddit(ctx context.Context, multiPath string, subreddit string) (*Response, error) {
|
||||||
|
path := fmt.Sprintf("api/multi/%s/r/%s", multiPath, subreddit)
|
||||||
|
|
||||||
|
form := url.Values{}
|
||||||
|
form.Set("model", fmt.Sprintf(`{"name":"%s"}`, subreddit))
|
||||||
|
|
||||||
|
req, err := s.client.NewPostForm(path, form)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
// todo: fix this
|
||||||
|
req.Method = http.MethodPut
|
||||||
|
|
||||||
|
return s.client.Do(ctx, req, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteSubreddit removes a subreddit from a multireddit.
|
||||||
|
func (s *MultiService) DeleteSubreddit(ctx context.Context, multiPath string, subreddit string) (*Response, error) {
|
||||||
|
path := fmt.Sprintf("api/multi/%s/r/%s", multiPath, subreddit)
|
||||||
|
|
||||||
|
req, err := s.client.NewRequest(http.MethodDelete, path, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return s.client.Do(ctx, req, nil)
|
||||||
|
}
|
||||||
|
|
272
multi_test.go
Normal file
272
multi_test.go
Normal file
|
@ -0,0 +1,272 @@
|
||||||
|
package geddit
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
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) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
|
||||||
|
blob := readFileContents(t, "testdata/multi/multi.json")
|
||||||
|
|
||||||
|
mux.HandleFunc("/api/multi/user/testuser/m/testmulti", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
assert.Equal(t, http.MethodGet, r.Method)
|
||||||
|
fmt.Fprint(w, blob)
|
||||||
|
})
|
||||||
|
|
||||||
|
multi, _, err := client.Multi.Get(ctx, "user/testuser/m/testmulti")
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, expectedMulti, multi)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMultiService_Mine(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
|
||||||
|
blob := readFileContents(t, "testdata/multi/multis.json")
|
||||||
|
|
||||||
|
mux.HandleFunc("/api/multi/mine", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
assert.Equal(t, http.MethodGet, r.Method)
|
||||||
|
fmt.Fprint(w, blob)
|
||||||
|
})
|
||||||
|
|
||||||
|
multis, _, err := client.Multi.Mine(ctx)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, []Multi{*expectedMulti, *expectedMulti2}, multis)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMultiService_Of(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
|
||||||
|
blob := readFileContents(t, "testdata/multi/multis.json")
|
||||||
|
|
||||||
|
mux.HandleFunc("/api/multi/user/test", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
assert.Equal(t, http.MethodGet, r.Method)
|
||||||
|
fmt.Fprint(w, blob)
|
||||||
|
})
|
||||||
|
|
||||||
|
multis, _, err := client.Multi.Of(ctx, "test")
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, []Multi{*expectedMulti, *expectedMulti2}, multis)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMultiService_Copy(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
|
||||||
|
blob := readFileContents(t, "testdata/multi/multi.json")
|
||||||
|
|
||||||
|
mux.HandleFunc("/api/multi/copy", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
assert.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()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, form, r.Form)
|
||||||
|
|
||||||
|
fmt.Fprint(w, blob)
|
||||||
|
})
|
||||||
|
|
||||||
|
multi, _, err := client.Multi.Copy(ctx, &MultiCopyRequest{
|
||||||
|
FromPath: "user/testuser/m/testmulti",
|
||||||
|
ToPath: "user/testuser2/m/testmulti2",
|
||||||
|
Description: "this is a multireddit",
|
||||||
|
DisplayName: "hello",
|
||||||
|
})
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, expectedMulti, multi)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMultiService_Create(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
|
||||||
|
blob := readFileContents(t, "testdata/multi/multi.json")
|
||||||
|
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) {
|
||||||
|
assert.Equal(t, http.MethodPost, r.Method)
|
||||||
|
|
||||||
|
err := r.ParseForm()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
model := r.Form.Get("model")
|
||||||
|
|
||||||
|
expectedCreateRequest := new(MultiCreateOrUpdateRequest)
|
||||||
|
err = json.Unmarshal([]byte(model), expectedCreateRequest)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, expectedCreateRequest, createRequest)
|
||||||
|
|
||||||
|
fmt.Fprint(w, blob)
|
||||||
|
})
|
||||||
|
|
||||||
|
multi, _, err := client.Multi.Create(ctx, createRequest)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, expectedMulti, multi)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMultiService_Update(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
|
||||||
|
blob := readFileContents(t, "testdata/multi/multi.json")
|
||||||
|
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) {
|
||||||
|
assert.Equal(t, http.MethodPut, r.Method)
|
||||||
|
|
||||||
|
err := r.ParseForm()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
model := r.Form.Get("model")
|
||||||
|
|
||||||
|
expectedCreateRequest := new(MultiCreateOrUpdateRequest)
|
||||||
|
err = json.Unmarshal([]byte(model), expectedCreateRequest)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, expectedCreateRequest, updateRequest)
|
||||||
|
|
||||||
|
fmt.Fprint(w, blob)
|
||||||
|
})
|
||||||
|
|
||||||
|
multi, _, err := client.Multi.Update(ctx, "user/testuser/m/testmulti", updateRequest)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, expectedMulti, multi)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMultiService_Delete(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
|
||||||
|
mux.HandleFunc("/api/multi/user/testuser/m/testmulti", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
assert.Equal(t, http.MethodDelete, r.Method)
|
||||||
|
})
|
||||||
|
|
||||||
|
_, err := client.Multi.Delete(ctx, "user/testuser/m/testmulti")
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMultiService_GetDescription(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
|
||||||
|
blob := readFileContents(t, "testdata/multi/description.json")
|
||||||
|
|
||||||
|
mux.HandleFunc("/api/multi/user/testuser/m/testmulti/description", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
assert.Equal(t, http.MethodGet, r.Method)
|
||||||
|
fmt.Fprint(w, blob)
|
||||||
|
})
|
||||||
|
|
||||||
|
description, _, err := client.Multi.GetDescription(ctx, "user/testuser/m/testmulti")
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, "hello world", description)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMultiService_UpdateDescription(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
|
||||||
|
blob := readFileContents(t, "testdata/multi/description.json")
|
||||||
|
|
||||||
|
mux.HandleFunc("/api/multi/user/testuser/m/testmulti/description", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
assert.Equal(t, http.MethodPut, r.Method)
|
||||||
|
|
||||||
|
form := url.Values{}
|
||||||
|
form.Set("model", `{"body_md":"hello world"}`)
|
||||||
|
|
||||||
|
err := r.ParseForm()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, form, r.Form)
|
||||||
|
|
||||||
|
fmt.Fprint(w, blob)
|
||||||
|
})
|
||||||
|
|
||||||
|
description, _, err := client.Multi.UpdateDescription(ctx, "user/testuser/m/testmulti", "hello world")
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, "hello world", description)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMultiService_AddSubreddit(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
|
||||||
|
mux.HandleFunc("/api/multi/user/testuser/m/testmulti/r/golang", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
assert.Equal(t, http.MethodPut, r.Method)
|
||||||
|
|
||||||
|
form := url.Values{}
|
||||||
|
form.Set("model", `{"name":"golang"}`)
|
||||||
|
|
||||||
|
err := r.ParseForm()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, form, r.Form)
|
||||||
|
})
|
||||||
|
|
||||||
|
_, err := client.Multi.AddSubreddit(ctx, "user/testuser/m/testmulti", "golang")
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMultiService_DeleteSubreddit(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
|
||||||
|
mux.HandleFunc("/api/multi/user/testuser/m/testmulti/r/golang", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
assert.Equal(t, http.MethodDelete, r.Method)
|
||||||
|
})
|
||||||
|
|
||||||
|
_, err := client.Multi.DeleteSubreddit(ctx, "user/testuser/m/testmulti", "golang")
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}
|
7
testdata/multi/description.json
vendored
Normal file
7
testdata/multi/description.json
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"kind": "LabeledMultiDescription",
|
||||||
|
"data": {
|
||||||
|
"body_html": "<!-- SC_OFF --><div class=\"md\"><p>hello world</p>\n</div><!-- SC_ON -->",
|
||||||
|
"body_md": "hello world"
|
||||||
|
}
|
||||||
|
}
|
31
testdata/multi/multi.json
vendored
Normal file
31
testdata/multi/multi.json
vendored
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
{
|
||||||
|
"kind": "LabeledMulti",
|
||||||
|
"data": {
|
||||||
|
"can_edit": true,
|
||||||
|
"display_name": "test",
|
||||||
|
"name": "test",
|
||||||
|
"description_html": "",
|
||||||
|
"num_subscribers": 0,
|
||||||
|
"copied_from": null,
|
||||||
|
"icon_url": "https://www.redditstatic.com/custom_feeds/custom_feed_default_3.png",
|
||||||
|
"subreddits": [
|
||||||
|
{
|
||||||
|
"name": "nba"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "golang"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"created_utc": 1594443312.0,
|
||||||
|
"visibility": "private",
|
||||||
|
"created": 1594472112.0,
|
||||||
|
"over_18": false,
|
||||||
|
"path": "/user/v_95/m/test/",
|
||||||
|
"owner": "v_95",
|
||||||
|
"key_color": null,
|
||||||
|
"is_subscriber": false,
|
||||||
|
"owner_id": "t2_164ab8",
|
||||||
|
"description_md": "",
|
||||||
|
"is_favorited": false
|
||||||
|
}
|
||||||
|
}
|
64
testdata/multi/multis.json
vendored
Normal file
64
testdata/multi/multis.json
vendored
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"kind": "LabeledMulti",
|
||||||
|
"data": {
|
||||||
|
"can_edit": true,
|
||||||
|
"display_name": "test",
|
||||||
|
"name": "test",
|
||||||
|
"description_html": "",
|
||||||
|
"num_subscribers": 0,
|
||||||
|
"copied_from": null,
|
||||||
|
"icon_url": "https://www.redditstatic.com/custom_feeds/custom_feed_default_3.png",
|
||||||
|
"subreddits": [
|
||||||
|
{
|
||||||
|
"name": "nba"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "golang"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"created_utc": 1594443312.0,
|
||||||
|
"visibility": "private",
|
||||||
|
"created": 1594472112.0,
|
||||||
|
"over_18": false,
|
||||||
|
"path": "/user/v_95/m/test/",
|
||||||
|
"owner": "v_95",
|
||||||
|
"key_color": null,
|
||||||
|
"is_subscriber": false,
|
||||||
|
"owner_id": "t2_164ab8",
|
||||||
|
"description_md": "",
|
||||||
|
"is_favorited": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"kind": "LabeledMulti",
|
||||||
|
"data": {
|
||||||
|
"can_edit": true,
|
||||||
|
"display_name": "test2",
|
||||||
|
"name": "test2",
|
||||||
|
"description_html": "",
|
||||||
|
"num_subscribers": 0,
|
||||||
|
"copied_from": null,
|
||||||
|
"icon_url": "https://www.redditstatic.com/custom_feeds/custom_feed_default_5.png",
|
||||||
|
"subreddits": [
|
||||||
|
{
|
||||||
|
"name": "redditdev"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "test"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"created_utc": 1594443423.0,
|
||||||
|
"visibility": "private",
|
||||||
|
"created": 1594472223.0,
|
||||||
|
"over_18": false,
|
||||||
|
"path": "/user/v_95/m/test2/",
|
||||||
|
"owner": "v_95",
|
||||||
|
"key_color": null,
|
||||||
|
"is_subscriber": false,
|
||||||
|
"owner_id": "t2_164ab8",
|
||||||
|
"description_md": "",
|
||||||
|
"is_favorited": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
Loading…
Reference in a new issue