From 55fadddee96a0fca2343f716e84c4d7d8e0e17cc Mon Sep 17 00:00:00 2001 From: walnuts1018 Date: Thu, 18 Jan 2024 21:50:54 +0900 Subject: [PATCH] Update SlackClient interface and implementation --- domain/slack.go | 2 +- infra/slack/slack.go | 7 ++-- main.go | 2 +- mock/slack/slack.go | 40 ++++++++++++++++++ usecase/emoji.go | 10 ++--- usecase/emoji_test.go | 97 +++++++++++++++++++++++++++++++++++++++++++ usecase/usecase.go | 10 ++++- 7 files changed, 156 insertions(+), 12 deletions(-) create mode 100644 mock/slack/slack.go create mode 100644 usecase/emoji_test.go diff --git a/domain/slack.go b/domain/slack.go index 65fc71a..94cbce7 100644 --- a/domain/slack.go +++ b/domain/slack.go @@ -1,5 +1,5 @@ package domain type SlackClient interface { - SetUserCustomStatus(emoji string) error + SetUserCustomStatus(emoji string, text string) error } diff --git a/infra/slack/slack.go b/infra/slack/slack.go index f8d090d..804eab4 100644 --- a/infra/slack/slack.go +++ b/infra/slack/slack.go @@ -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) } diff --git a/main.go b/main.go index 91ae843..add1805 100644 --- a/main.go +++ b/main.go @@ -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) diff --git a/mock/slack/slack.go b/mock/slack/slack.go new file mode 100644 index 0000000..eebb451 --- /dev/null +++ b/mock/slack/slack.go @@ -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 +} diff --git a/usecase/emoji.go b/usecase/emoji.go index 2ca4a10..6d5e78d 100644 --- a/usecase/emoji.go +++ b/usecase/emoji.go @@ -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 @@ -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 diff --git a/usecase/emoji_test.go b/usecase/emoji_test.go new file mode 100644 index 0000000..3becb31 --- /dev/null +++ b/usecase/emoji_test.go @@ -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) + } + }) + } +} diff --git a/usecase/usecase.go b/usecase/usecase.go index 8c9c147..9ffa404 100644 --- a/usecase/usecase.go +++ b/usecase/usecase.go @@ -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,