# README
discordgo-mock
discordgo-mock
is a helper library to assist with writing unit tests for
projects that use discordgo. The
library provides a custom http.RoundTripper
to be injected into an
*http.Client.Transport
before being injected into discordgo.Session
.
The custom http.RoundTripper
maps the Discord REST API methods and paths to
appropriate handler functions and returns expected data based upon what is in
the provided discordgo.State
cache. Discord API calls that involve creating
new, updating, or deleting resources will also update the internal
discordgo.State
cache to maintain state changes.
Example Usage
package mocksession_test
import (
"net/http"
"testing"
"github.com/bwmarrin/discordgo"
"github.com/ewohltman/discordgo-mock/mockchannel"
"github.com/ewohltman/discordgo-mock/mockconstants"
"github.com/ewohltman/discordgo-mock/mockguild"
"github.com/ewohltman/discordgo-mock/mockmember"
"github.com/ewohltman/discordgo-mock/mockrest"
"github.com/ewohltman/discordgo-mock/mockrole"
"github.com/ewohltman/discordgo-mock/mocksession"
"github.com/ewohltman/discordgo-mock/mockstate"
"github.com/ewohltman/discordgo-mock/mockuser"
)
func TestNew(t *testing.T) {
state, err := newState()
if err != nil {
t.Fatal(err)
}
session, err := mocksession.New(
mocksession.WithState(state),
mocksession.WithClient(&http.Client{
Transport: mockrest.NewTransport(state),
}),
)
if err != nil {
t.Fatal(err)
}
guildBefore, err := session.Guild(mockconstants.TestGuild)
if err != nil {
t.Fatal(err)
}
t.Logf("Name: %s", guildBefore.Name)
t.Logf("Channels: %d", len(guildBefore.Channels))
t.Logf("Members: %d", guildBefore.MemberCount)
t.Logf("Roles before change: %d", len(guildBefore.Roles))
_, err = session.GuildRoleCreate(guildBefore.ID)
if err != nil {
t.Fatal(err)
}
guildAfter, err := session.Guild(mockconstants.TestGuild)
if err != nil {
t.Fatal(err)
}
t.Logf("Roles after change: %d", len(guildAfter.Roles))
}
func newState() (*discordgo.State, error) {
role := mockrole.New(
mockrole.WithID(mockconstants.TestRole),
mockrole.WithName(mockconstants.TestRole),
mockrole.WithPermissions(discordgo.PermissionViewChannel),
)
botUser := mockuser.New(
mockuser.WithID(mockconstants.TestUser+"Bot"),
mockuser.WithUsername(mockconstants.TestUser+"Bot"),
mockuser.WithBotFlag(true),
)
botMember := mockmember.New(
mockmember.WithUser(botUser),
mockmember.WithGuildID(mockconstants.TestGuild),
mockmember.WithRoles(role),
)
userMember := mockmember.New(
mockmember.WithUser(mockuser.New(
mockuser.WithID(mockconstants.TestUser),
mockuser.WithUsername(mockconstants.TestUser),
)),
mockmember.WithGuildID(mockconstants.TestGuild),
mockmember.WithRoles(role),
)
channel := mockchannel.New(
mockchannel.WithID(mockconstants.TestChannel),
mockchannel.WithGuildID(mockconstants.TestGuild),
mockchannel.WithName(mockconstants.TestChannel),
mockchannel.WithType(discordgo.ChannelTypeGuildVoice),
)
privateChannel := mockchannel.New(
mockchannel.WithID(mockconstants.TestPrivateChannel),
mockchannel.WithGuildID(mockconstants.TestGuild),
mockchannel.WithName(mockconstants.TestPrivateChannel),
mockchannel.WithType(discordgo.ChannelTypeGuildVoice),
mockchannel.WithPermissionOverwrites(&discordgo.PermissionOverwrite{
ID: botMember.User.ID,
Type: discordgo.PermissionOverwriteTypeMember,
Deny: discordgo.PermissionViewChannel,
}),
)
return mockstate.New(
mockstate.WithUser(botUser),
mockstate.WithGuilds(
mockguild.New(
mockguild.WithID(mockconstants.TestGuild),
mockguild.WithName(mockconstants.TestGuild),
mockguild.WithRoles(role),
mockguild.WithChannels(channel, privateChannel),
mockguild.WithMembers(botMember, userMember),
),
),
)
}
Output:
=== RUN TestNew
mocksession_test.go:40: Name: testGuild
mocksession_test.go:41: Channels: 2
mocksession_test.go:42: Members: 2
mocksession_test.go:44: Roles before change: 1
mocksession_test.go:56: Roles after change: 2
--- PASS: TestNew (0.00s)
PASS
# Packages
Package mockchannel provides functionality for creating a mock *discordgo.Channel.
Package mockconstants provides common constant definitions.
Package mockguild provides functionality for creating a mock *discordgo.Guild.
Package mockmember provides functionality for creating a mock *discordgo.Member.
Package mockrest provides functionality for creating an http.RoundTripper that can be used with an *http.Client in a *discordgo.Session to handle Discord REST API endpoints and maintain state with a given *discordgo.State.
Package mockrole provides functionality for creating a mock *discordgo.Role.
Package mocksession provides functionality for creating a mock *discordgo.Session.
Package mockstate provides functionality for creating a mock *discordgo.State.
Package mockuser provides functionality for creating a mock *discordgo.User.