snoobert/reddit/account_test.go
Vartan Benohanian ffcc906c07 Add Listing/KarmaList to thing struct, tweak anonymous structs
Signed-off-by: Vartan Benohanian <vartanbeno@gmail.com>
2020-09-01 22:35:28 -04:00

325 lines
10 KiB
Go

package reddit
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"testing"
"time"
"github.com/stretchr/testify/require"
)
var expectedInfo = &User{
ID: "164ab8",
Name: "v_95",
Created: &Timestamp{time.Date(2017, 3, 12, 4, 56, 47, 0, time.UTC)},
PostKarma: 488,
CommentKarma: 22223,
HasVerifiedEmail: true,
NSFW: true,
}
var expectedKarma = []*SubredditKarma{
{Subreddit: "nba", PostKarma: 144, CommentKarma: 21999},
{Subreddit: "redditdev", PostKarma: 19, CommentKarma: 4},
{Subreddit: "test", PostKarma: 1, CommentKarma: 0},
{Subreddit: "golang", PostKarma: 1, CommentKarma: 0},
}
var expectedSettings = &Settings{
AcceptPrivateMessages: String("everyone"),
ActivityRelevantAds: Bool(false),
AllowClickTracking: Bool(false),
Beta: Bool(false),
ShowRecentlyViewedPosts: Bool(true),
CollapseReadMessages: Bool(false),
Compress: Bool(false),
CredditAutorenew: nil,
DefaultCommentSort: String("top"),
ShowDomainDetails: Bool(false),
SendEmailDigests: Bool(false),
SendMessagesAsEmails: Bool(false),
UnsubscribeFromAllEmails: Bool(true),
DisableCustomThemes: Bool(false),
Location: String("GLOBAL"),
HideAds: Bool(false),
HideFromSearchEngines: Bool(false),
HideUpvotedPosts: Bool(false),
HideDownvotedPosts: Bool(false),
HighlightControversialComments: Bool(true),
HighlightNewComments: Bool(true),
IgnoreSuggestedSorts: Bool(true),
UseNewReddit: nil,
UsesNewReddit: Bool(false),
LabelNSFW: Bool(true),
Language: String("en-ca"),
ShowOldSearchPage: Bool(false),
EnableNotifications: Bool(true),
MarkMessagesAsRead: Bool(true),
ShowThumbnails: String("subreddit"),
AutoExpandMedia: String("off"),
MinimumCommentScore: nil,
MinimumPostScore: nil,
EnableMentionNotifications: Bool(true),
OpenLinksInNewWindow: Bool(true),
DarkMode: Bool(true),
DisableProfanity: Bool(false),
NumberOfComments: Int(200),
NumberOfPosts: Int(25),
ShowSpotlightBox: nil,
SubredditTheme: nil,
ShowNSFW: Bool(true),
EnablePrivateRSSFeeds: Bool(true),
ProfileOptOut: Bool(false),
PublicizeVotes: Bool(false),
AllowResearch: Bool(false),
IncludeNSFWSearchResults: Bool(true),
ReceiveCrosspostMessages: Bool(false),
ReceiveWelcomeMessages: Bool(true),
ShowUserFlair: Bool(true),
ShowPostFlair: Bool(true),
ShowGoldExpiration: Bool(false),
ShowLocationBasedRecommendations: Bool(false),
ShowPromote: nil,
ShowCustomSubredditThemes: Bool(true),
ShowTrendingSubreddits: Bool(true),
ShowTwitter: Bool(false),
StoreVisits: Bool(false),
ThemeSelector: nil,
AllowThirdPartyDataAdPersonalization: Bool(false),
AllowThirdPartySiteDataAdPersonalization: Bool(false),
AllowThirdPartySiteDataContentPersonalization: Bool(false),
EnableThreadedMessages: Bool(true),
EnableThreadedModmail: Bool(false),
TopKarmaSubreddits: Bool(false),
UseGlobalDefaults: Bool(false),
EnableVideoAutoplay: Bool(true),
}
var expectedRelationships = []Relationship{
{
ID: "r9_1r4879",
User: "test1",
UserID: "t2_test1",
Created: &Timestamp{time.Date(2020, 6, 28, 16, 43, 55, 0, time.UTC)},
},
{
ID: "r9_1re930",
User: "test2",
UserID: "t2_test2",
Created: &Timestamp{time.Date(2020, 6, 28, 16, 44, 2, 0, time.UTC)},
},
}
var expectedRelationships2 = []Relationship{
{
ID: "r9_1re60i",
User: "test3",
UserID: "t2_test3",
Created: &Timestamp{time.Date(2020, 3, 6, 2, 27, 0, 0, time.UTC)},
},
}
func TestAccountService_Info(t *testing.T) {
client, mux, teardown := setup()
defer teardown()
blob, err := readFileContents("../testdata/account/info.json")
require.NoError(t, err)
mux.HandleFunc("/api/v1/me", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodGet, r.Method)
fmt.Fprint(w, blob)
})
info, _, err := client.Account.Info(ctx)
require.NoError(t, err)
require.Equal(t, expectedInfo, info)
}
func TestAccountService_Karma(t *testing.T) {
client, mux, teardown := setup()
defer teardown()
blob, err := readFileContents("../testdata/account/karma.json")
require.NoError(t, err)
mux.HandleFunc("/api/v1/me/karma", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodGet, r.Method)
fmt.Fprint(w, blob)
})
karma, _, err := client.Account.Karma(ctx)
require.NoError(t, err)
require.Equal(t, expectedKarma, karma)
}
func TestAccountService_Settings(t *testing.T) {
client, mux, teardown := setup()
defer teardown()
blob, err := readFileContents("../testdata/account/settings.json")
require.NoError(t, err)
mux.HandleFunc("/api/v1/me/prefs", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodGet, r.Method)
fmt.Fprint(w, blob)
})
settings, _, err := client.Account.Settings(ctx)
require.NoError(t, err)
require.Equal(t, expectedSettings, settings)
}
func TestAccountService_UpdateSettings(t *testing.T) {
client, mux, teardown := setup()
defer teardown()
blob, err := readFileContents("../testdata/account/settings.json")
require.NoError(t, err)
expectedSettingsBody := &Settings{NumberOfPosts: Int(10), MinimumCommentScore: Int(5), Compress: Bool(true)}
mux.HandleFunc("/api/v1/me/prefs", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodPatch, r.Method)
settingsBody := new(Settings)
err := json.NewDecoder(r.Body).Decode(settingsBody)
require.NoError(t, err)
require.Equal(t, expectedSettingsBody, settingsBody)
fmt.Fprint(w, blob)
})
settings, _, err := client.Account.UpdateSettings(ctx, expectedSettingsBody)
require.NoError(t, err)
require.Equal(t, expectedSettings, settings)
}
func TestAccountService_Trophies(t *testing.T) {
client, mux, teardown := setup()
defer teardown()
blob, err := readFileContents("../testdata/account/trophies.json")
require.NoError(t, err)
mux.HandleFunc("/api/v1/me/trophies", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodGet, r.Method)
fmt.Fprint(w, blob)
})
trophies, _, err := client.Account.Trophies(ctx)
require.NoError(t, err)
require.Equal(t, expectedTrophies, trophies)
}
func TestAccountService_Friends(t *testing.T) {
client, mux, teardown := setup()
defer teardown()
blob, err := readFileContents("../testdata/account/friends.json")
require.NoError(t, err)
mux.HandleFunc("/prefs/friends", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodGet, r.Method)
fmt.Fprint(w, blob)
})
relationships, _, err := client.Account.Friends(ctx)
require.NoError(t, err)
require.Equal(t, expectedRelationships, relationships)
}
func TestAccountService_Blocked(t *testing.T) {
client, mux, teardown := setup()
defer teardown()
blob, err := readFileContents("../testdata/account/blocked.json")
require.NoError(t, err)
mux.HandleFunc("/prefs/blocked", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodGet, r.Method)
fmt.Fprint(w, blob)
})
relationships, _, err := client.Account.Blocked(ctx)
require.NoError(t, err)
require.Equal(t, expectedRelationships, relationships)
}
func TestAccountService_Messaging(t *testing.T) {
client, mux, teardown := setup()
defer teardown()
blob, err := readFileContents("../testdata/account/messaging.json")
require.NoError(t, err)
mux.HandleFunc("/prefs/messaging", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodGet, r.Method)
fmt.Fprint(w, blob)
})
blocked, trusted, _, err := client.Account.Messaging(ctx)
require.NoError(t, err)
require.Equal(t, expectedRelationships, blocked)
require.Equal(t, expectedRelationships2, trusted)
}
func TestAccountService_Trusted(t *testing.T) {
client, mux, teardown := setup()
defer teardown()
blob, err := readFileContents("../testdata/account/trusted.json")
require.NoError(t, err)
mux.HandleFunc("/prefs/trusted", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodGet, r.Method)
fmt.Fprint(w, blob)
})
relationships, _, err := client.Account.Trusted(ctx)
require.NoError(t, err)
require.Equal(t, expectedRelationships, relationships)
}
func TestAccountService_AddTrusted(t *testing.T) {
client, mux, teardown := setup()
defer teardown()
mux.HandleFunc("/api/add_whitelisted", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodPost, r.Method)
form := url.Values{}
form.Set("api_type", "json")
form.Set("name", "test123")
err := r.ParseForm()
require.NoError(t, err)
require.Equal(t, form, r.Form)
})
_, err := client.Account.AddTrusted(ctx, "test123")
require.NoError(t, err)
}
func TestAccountService_RemoveTrusted(t *testing.T) {
client, mux, teardown := setup()
defer teardown()
mux.HandleFunc("/api/remove_whitelisted", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodPost, r.Method)
form := url.Values{}
form.Set("name", "test123")
err := r.ParseForm()
require.NoError(t, err)
require.Equal(t, form, r.Form)
})
_, err := client.Account.RemoveTrusted(ctx, "test123")
require.NoError(t, err)
}