Skip to content

Commit

Permalink
Update SlackClient interface and implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
walnuts1018 committed Jan 18, 2024
1 parent 7e3db87 commit 55faddd
Show file tree
Hide file tree
Showing 7 changed files with 156 additions and 12 deletions.
2 changes: 1 addition & 1 deletion domain/slack.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package domain

type SlackClient interface {
SetUserCustomStatus(emoji string) error
SetUserCustomStatus(emoji string, text string) error
}
7 changes: 4 additions & 3 deletions infra/slack/slack.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,24 @@ import (

"github.com/slack-go/slack"
"github.com/walnuts1018/wakatime-to-slack-profile/config"
"github.com/walnuts1018/wakatime-to-slack-profile/domain"
)

type client struct {
slackClient *slack.Client
}

func NewClient() *client {
func NewClient() domain.SlackClient {
return &client{
slackClient: slack.New(config.Config.SlackAccessToken),
}
}

func (c *client) SetUserCustomStatus(emoji string) error {
func (c *client) SetUserCustomStatus(emoji string, text string) error {
if !(strings.HasPrefix(emoji, ":") && strings.HasSuffix(emoji, ":")) {
emoji = ":" + emoji + ":"
}
err := c.slackClient.SetUserCustomStatus("", emoji, 0)
err := c.slackClient.SetUserCustomStatus(text, emoji, 0)
if err != nil {
return fmt.Errorf("error setting status: %w", err)
}
Expand Down
2 changes: 1 addition & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func main() {

slackClient := slack.NewClient()

usecase := usecase.NewUsecase(wakatimeClient, psqClient, slackClient)
usecase := usecase.NewUsecase(wakatimeClient, psqClient, slackClient, map[string]string{})
err = usecase.SetToken(ctx)
if err != nil {
slog.Warn("failed to set token", "error", err)
Expand Down
40 changes: 40 additions & 0 deletions mock/slack/slack.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package mockSlack

import (
"fmt"
"strings"
)

type client struct {
emojis []string
emoji string
text string
}

func NewClient() *client {
return &client{}
}

func (c *client) SetEmojis(emojis []string) {
emojis = append(emojis, "namakemono", "question")
c.emojis = emojis
}

func (c *client) SetUserCustomStatus(emoji string, text string) error {
for _, e := range c.emojis {
if e == emoji {
if !(strings.HasPrefix(emoji, ":") && strings.HasSuffix(emoji, ":")) {
emoji = ":" + emoji + ":"
}

c.emoji = emoji
c.text = text
return nil
}
}
return fmt.Errorf("no such emoji: %v", emoji)
}

func (c *client) GetStatus() (string, string) {
return c.emoji, c.text
}
10 changes: 5 additions & 5 deletions usecase/emoji.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (

func (u *Usecase) SetUserCustomStatus(language string) error {
if language == "" {
err := u.slackClient.SetUserCustomStatus("namakemono")
err := u.slackClient.SetUserCustomStatus("namakemono", "")
if err == nil {
slog.Info("set user custom status", "emoji", "🦥", "language", language)
return nil
Expand All @@ -17,25 +17,25 @@ func (u *Usecase) SetUserCustomStatus(language string) error {

override, ok := u.emojiOverides[language]
if ok {
err := u.slackClient.SetUserCustomStatus(override)
err := u.slackClient.SetUserCustomStatus(override, language)
if err == nil {
slog.Info("set user custom status", "emoji", override, "language", language)
return nil
}
}

err := u.slackClient.SetUserCustomStatus(language)
err := u.slackClient.SetUserCustomStatus(language, language)
if err == nil {
slog.Info("set user custom status", "emoji", language)
return nil
}
err = u.slackClient.SetUserCustomStatus(strings.ToLower(language))
err = u.slackClient.SetUserCustomStatus(strings.ToLower(language), language)
if err == nil {
slog.Info("set user custom status", "emoji", language)
return nil
}

err = u.slackClient.SetUserCustomStatus("question")
err = u.slackClient.SetUserCustomStatus("question", language)
if err == nil {
slog.Info("set user custom status", "emoji", "❓", "language", language)
return nil
Expand Down
97 changes: 97 additions & 0 deletions usecase/emoji_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package usecase

import (
"testing"

mockSlack "github.com/walnuts1018/wakatime-to-slack-profile/mock/slack"
)

func TestUsecase_SetUserCustomStatus(t *testing.T) {
c := mockSlack.NewClient()
c.SetEmojis([]string{
"gopher",
"python",
"TypeScript",
})

u := NewUsecase(nil, nil, c, map[string]string{
"Go": "gopher",
})

type args struct {
language string
}
tests := []struct {
name string
u *Usecase
args args
wantEmoji string
wantText string
wantErr bool
}{
{
name: "normal",
u: u,
args: args{
language: "TypeScript",
},
wantEmoji: ":TypeScript:",
wantText: "TypeScript",
wantErr: false,
},
{
name: "override",
u: u,
args: args{
language: "Go",
},
wantEmoji: ":gopher:",
wantText: "Go",
wantErr: false,
},
{
name: "lowercase",
u: u,
args: args{
language: "Python",
},
wantEmoji: ":python:",
wantText: "Python",
wantErr: false,
},
{
name: "not found",
u: u,
args: args{
language: "Rust",
},
wantEmoji: ":question:",
wantText: "Rust",
wantErr: false,
},
{
name: "empty",
u: u,
args: args{
language: "",
},
wantEmoji: ":namakemono:",
wantText: "",
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if err := tt.u.SetUserCustomStatus(tt.args.language); (err != nil) != tt.wantErr {
t.Errorf("Usecase.SetUserCustomStatus() error = %v, wantErr %v", err, tt.wantErr)
}
gotEmoji, gotText := c.GetStatus()
if gotEmoji != tt.wantEmoji {
t.Errorf("Usecase.SetUserCustomStatus() gotEmoji = %v, want %v", gotEmoji, tt.wantEmoji)
}
if gotText != tt.wantText {
t.Errorf("Usecase.SetUserCustomStatus() gotText = %v, want %v", gotText, tt.wantText)
}
})
}
}
10 changes: 8 additions & 2 deletions usecase/usecase.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,20 @@ type Usecase struct {
lastLanguage *string
}

func NewUsecase(wakatimeClient domain.WakatimeClient, tokenStore domain.TokenStore, slackClient domain.SlackClient) *Usecase {
var emojis map[string]string
func NewUsecase(wakatimeClient domain.WakatimeClient, tokenStore domain.TokenStore, slackClient domain.SlackClient, emojiOverides map[string]string) *Usecase {
emojis := map[string]string{}

b, err := os.ReadFile("emoji.json")
if err != nil {
slog.Warn("emoji.json is not found")
} else {
json.Unmarshal(b, &emojis)
}

for k, v := range emojiOverides {
emojis[k] = v
}

return &Usecase{
wakatimeClient: wakatimeClient,
tokenStore: tokenStore,
Expand Down

0 comments on commit 55faddd

Please sign in to comment.