From 13479809a33d7b28e12457cfc19c321b8540bf39 Mon Sep 17 00:00:00 2001 From: catatsuy Date: Sun, 14 Apr 2024 16:25:00 +0900 Subject: [PATCH] Return upload URL and file ID in GetUploadURLExternalURL --- internal/slack/client.go | 24 ++++++++++++------------ internal/slack/client_test.go | 27 ++++++++++++++++++--------- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/internal/slack/client.go b/internal/slack/client.go index f8e571e..d2efe8e 100644 --- a/internal/slack/client.go +++ b/internal/slack/client.go @@ -144,21 +144,21 @@ func NewClientForPostFile(logger *log.Logger) (*Client, error) { return nil, nil } -func (c *Client) GetUploadURLExternalURL(ctx context.Context, token string, param *GetUploadURLExternalResParam) error { +func (c *Client) GetUploadURLExternalURL(ctx context.Context, token string, param *GetUploadURLExternalResParam) (uploadURL string, fileID string, err error) { if len(token) == 0 { - return fmt.Errorf("provide Slack token") + return "", "", fmt.Errorf("provide Slack token") } if param == nil { - return fmt.Errorf("provide filename and length") + return "", "", fmt.Errorf("provide filename and length") } if param.Filename == "" { - return fmt.Errorf("provide filename") + return "", "", fmt.Errorf("provide filename") } if param.Length == 0 { - return fmt.Errorf("provide length") + return "", "", fmt.Errorf("provide length") } v := url.Values{} @@ -171,7 +171,7 @@ func (c *Client) GetUploadURLExternalURL(ctx context.Context, token string, para req, err := http.NewRequest(http.MethodPost, filesGetUploadURLExternalURL, strings.NewReader(v.Encode())) if err != nil { - return err + return "", "", err } req = req.WithContext(ctx) @@ -181,28 +181,28 @@ func (c *Client) GetUploadURLExternalURL(ctx context.Context, token string, para res, err := c.HTTPClient.Do(req) if err != nil { - return err + return "", "", err } defer res.Body.Close() b, err := io.ReadAll(res.Body) if err != nil { - return fmt.Errorf("failed to read res.Body: %w", err) + return "", "", fmt.Errorf("failed to read res.Body: %w", err) } if res.StatusCode != http.StatusOK { - return fmt.Errorf("failed to read res.Body and the status code: %d; body: %s", res.StatusCode, b) + return "", "", fmt.Errorf("failed to read res.Body and the status code: %d; body: %s", res.StatusCode, b) } apiRes := GetUploadURLExternalRes{} err = json.Unmarshal(b, &apiRes) if err != nil { - return fmt.Errorf("response returned from slack is not json: body: %s: %w", b, err) + return "", "", fmt.Errorf("response returned from slack is not json: body: %s: %w", b, err) } if !apiRes.OK { - return fmt.Errorf("response has failed; body: %s", b) + return "", "", fmt.Errorf("response has failed; body: %s", b) } - return nil + return apiRes.UploadURL, apiRes.FileID, nil } diff --git a/internal/slack/client_test.go b/internal/slack/client_test.go index 9512a96..2a0e69d 100644 --- a/internal/slack/client_test.go +++ b/internal/slack/client_test.go @@ -188,11 +188,20 @@ func TestPostFile_Success(t *testing.T) { t.Fatal(err) } - err = c.GetUploadURLExternalURL(context.Background(), slackToken, param) - + uploadURL, fileID, err := c.GetUploadURLExternalURL(context.Background(), slackToken, param) if err != nil { t.Fatal(err) } + + expectedUploadURL := "https://files.slack.com/upload/v1/ABC123456" + if uploadURL != expectedUploadURL { + t.Fatalf("expected %q to equal %q", uploadURL, expectedUploadURL) + } + + expectedFileID := "F123ABC456" + if fileID != expectedFileID { + t.Fatalf("expected %q to equal %q", fileID, expectedFileID) + } } func TestPostFile_FailCallFunc(t *testing.T) { @@ -218,7 +227,7 @@ func TestPostFile_FailCallFunc(t *testing.T) { t.Fatal(err) } - err = c.GetUploadURLExternalURL(context.Background(), "", param) + _, _, err = c.GetUploadURLExternalURL(context.Background(), "", param) expectedErrorPart := "provide Slack token" if err == nil { t.Fatal("expected error, but nothing was returned") @@ -226,7 +235,7 @@ func TestPostFile_FailCallFunc(t *testing.T) { t.Fatalf("expected %q to contain %q", err.Error(), expectedErrorPart) } - err = c.GetUploadURLExternalURL(context.Background(), slackToken, nil) + _, _, err = c.GetUploadURLExternalURL(context.Background(), slackToken, nil) expectedErrorPart = "provide filename and length" if err == nil { t.Fatal("expected error, but nothing was returned") @@ -234,7 +243,7 @@ func TestPostFile_FailCallFunc(t *testing.T) { t.Fatalf("expected %q to contain %q", err.Error(), expectedErrorPart) } - err = c.GetUploadURLExternalURL(context.Background(), slackToken, &GetUploadURLExternalResParam{}) + _, _, err = c.GetUploadURLExternalURL(context.Background(), slackToken, &GetUploadURLExternalResParam{}) expectedErrorPart = "provide filename" if err == nil { t.Fatal("expected error, but nothing was returned") @@ -242,7 +251,7 @@ func TestPostFile_FailCallFunc(t *testing.T) { t.Fatalf("expected %q to contain %q", err.Error(), expectedErrorPart) } - err = c.GetUploadURLExternalURL(context.Background(), slackToken, &GetUploadURLExternalResParam{Filename: "test.txt"}) + _, _, err = c.GetUploadURLExternalURL(context.Background(), slackToken, &GetUploadURLExternalResParam{Filename: "test.txt"}) expectedErrorPart = "provide length" if err == nil { t.Fatal("expected error, but nothing was returned") @@ -313,7 +322,7 @@ func TestPostFile_FailAPINotOK(t *testing.T) { t.Fatal(err) } - err = c.GetUploadURLExternalURL(context.Background(), slackToken, param) + _, _, err = c.GetUploadURLExternalURL(context.Background(), slackToken, param) if err == nil { t.Fatal("expected error, but nothing was returned") @@ -391,7 +400,7 @@ func TestPostFile_FailAPIStatusOK(t *testing.T) { t.Fatal(err) } - err = c.GetUploadURLExternalURL(context.Background(), slackToken, param) + _, _, err = c.GetUploadURLExternalURL(context.Background(), slackToken, param) if err == nil { t.Fatal("expected error, but nothing was returned") @@ -464,7 +473,7 @@ func TestPostFile_FailBrokenJSON(t *testing.T) { t.Fatal(err) } - err = c.GetUploadURLExternalURL(context.Background(), slackToken, param) + _, _, err = c.GetUploadURLExternalURL(context.Background(), slackToken, param) if err == nil { t.Fatal("expected error, but nothing was returned")