Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions cmd/json_contract_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -541,11 +541,11 @@ func assertGoldenJSONEqual(t *testing.T, command string, fixture json.RawMessage
func assertGoldenSuccessOutputStatuses(t *testing.T, command string, fixture json.RawMessage) {
t.Helper()

var output jsonOperationOutput
if err := json.Unmarshal(fixture, &output); err != nil {
var got jsonOperationOutput
if err := json.Unmarshal(fixture, &got); err != nil {
t.Fatalf("decode golden output for %q: %v", command, err)
}
for i, result := range output.Results {
for i, result := range got.Results {
if result.Status == "" {
t.Errorf("golden output for %q result %d has empty status", command, i)
}
Expand Down
17 changes: 13 additions & 4 deletions cmd/output.go
Original file line number Diff line number Diff line change
Expand Up @@ -470,17 +470,26 @@ func dropboxAPIErrorSummaryValue(err error) (string, bool) {
}

field := value.FieldByName("APIError")
if field.IsValid() && field.CanInterface() {
if apiErr, ok := field.Interface().(dropbox.APIError); ok {
return apiErr.Error(), true
}
if summary, ok := dropboxAPIErrorFieldSummary(field); ok {
return summary, true
}
if strings.HasSuffix(typ.Name(), "APIError") {
return err.Error(), true
}
return "", false
}

func dropboxAPIErrorFieldSummary(field reflect.Value) (string, bool) {
if !field.IsValid() || field.Type() != reflect.TypeOf(dropbox.APIError{}) {
return "", false
}
summary := field.FieldByName("ErrorSummary")
if !summary.IsValid() || summary.Kind() != reflect.String {
return "", false
}
return summary.String(), true
}

func dropboxAPISummaryFromMessage(message string) (string, bool) {
lower := strings.ToLower(message)
if strings.Contains(lower, "error in call to api function") {
Expand Down
6 changes: 0 additions & 6 deletions cmd/put_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1414,12 +1414,6 @@ func TestPutRecursiveIfExistsSkipContinuesPastExistingFiles(t *testing.T) {
}
}

func TestSingleShotUploadSizeCutoff(t *testing.T) {
if singleShotUploadSizeCutoff != 32*1024*1024 {
t.Errorf("singleShotUploadSizeCutoff = %d, want %d", singleShotUploadSizeCutoff, 32*1024*1024)
}
}

func TestUploadChunked_RetriesSessionStart(t *testing.T) {
stubRetrySleep(t)
startCalls := 0
Expand Down
3 changes: 2 additions & 1 deletion cmd/share_create_link_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ package cmd

import (
"bytes"
"errors"
"fmt"
"io"
"path"
Expand Down Expand Up @@ -753,7 +754,7 @@ func TestSharedLinkCreateReturnsNonAlreadyExistsError(t *testing.T) {
stubSharedLinkClient(t, mock)

err := shareLinkCreate(&cobra.Command{}, []string{"/docs"})
if err != wantErr {
if !errors.Is(err, wantErr) {
t.Fatalf("error = %v, want original error", err)
}
}
Expand Down
6 changes: 3 additions & 3 deletions cmd/share_link_download.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,14 +152,14 @@ func parseShareLinkDownloadOptions(cmd *cobra.Command) (shareLinkDownloadOptions
if pathArg == "" {
return opts, invalidArgumentsErrorWithDetails("`--path` requires a non-empty path", flagErrorDetails("path"))
}
path, err := validatePath(pathArg)
dropboxPath, err := validatePath(pathArg)
if err != nil {
return opts, err
}
if path == "" {
if dropboxPath == "" {
return opts, invalidArgumentsErrorWithDetails("cannot download shared-link root with `--path`", pathErrorDetails("/"))
}
opts.path = path
opts.path = dropboxPath
}

if opts.path != "" && opts.recursive {
Expand Down
3 changes: 2 additions & 1 deletion cmd/share_link_download_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ package cmd

import (
"bytes"
"errors"
"fmt"
"io"
"os"
Expand Down Expand Up @@ -777,7 +778,7 @@ func TestShareLinkDownloadReturnsAPIErrors(t *testing.T) {
})

err := shareLinkDownload(newShareLinkDownloadTestCommand(nil, nil), []string{"https://example.com/link", "-"})
if err != wantErr {
if !errors.Is(err, wantErr) {
t.Fatalf("error = %v, want original API error", err)
}
}
Expand Down
3 changes: 2 additions & 1 deletion cmd/share_link_info_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package cmd

import (
"bytes"
"errors"
"fmt"
"strings"
"testing"
Expand Down Expand Up @@ -213,7 +214,7 @@ func TestShareLinkInfoReturnsAPIError(t *testing.T) {
})

err := shareLinkInfo(&cobra.Command{}, []string{"https://www.dropbox.com/s/abc123"})
if err != wantErr {
if !errors.Is(err, wantErr) {
t.Fatalf("error = %v, want API error", err)
}
}
Expand Down
20 changes: 18 additions & 2 deletions cmd/share_link_raw.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"encoding/json"
"fmt"
"io"
"reflect"
"time"

"github.com/dropbox/dropbox-sdk-go-unofficial/v6/dropbox"
Expand Down Expand Up @@ -108,7 +109,7 @@ func executeSharingRawRequest(cfg dropbox.Config, req dropbox.Request, parseErro
func parseCreateSharedLinkWithSettingsError(err error) error {
var appErr sharing.CreateSharedLinkWithSettingsAPIError
parsed := auth.ParseError(err, &appErr)
if parsed == &appErr {
if samePointer(parsed, &appErr) {
return appErr
}
return parsed
Expand All @@ -117,12 +118,27 @@ func parseCreateSharedLinkWithSettingsError(err error) error {
func parseModifySharedLinkSettingsError(err error) error {
var appErr sharing.ModifySharedLinkSettingsAPIError
parsed := auth.ParseError(err, &appErr)
if parsed == &appErr {
if samePointer(parsed, &appErr) {
return appErr
}
return parsed
}

func samePointer(value, target any) bool {
valueRef := reflect.ValueOf(value)
targetRef := reflect.ValueOf(target)
if !valueRef.IsValid() || !targetRef.IsValid() {
return false
}
if valueRef.Kind() != reflect.Ptr || targetRef.Kind() != reflect.Ptr {
return false
}
if valueRef.Type() != targetRef.Type() {
return false
}
return valueRef.Pointer() == targetRef.Pointer()
}

func parseSharedLinkMetadata(resp []byte) (sharing.IsSharedLinkMetadata, error) {
var tagged struct {
Tag string `json:".tag"`
Expand Down
20 changes: 9 additions & 11 deletions cmd/share_link_raw_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"encoding/json"
"io"
"net/http"
"reflect"
"strings"
"testing"

Expand Down Expand Up @@ -183,12 +184,7 @@ func TestRawCreateSharedLinkErrorParserReturnsValueError(t *testing.T) {
Content: `{ "error_summary": "shared_link_already_exists/", "error": { ".tag": "shared_link_already_exists" } }`,
})

if _, ok := err.(sharing.CreateSharedLinkWithSettingsAPIError); !ok {
t.Fatalf("error type = %T, want value CreateSharedLinkWithSettingsAPIError", err)
}
if _, ok := err.(*sharing.CreateSharedLinkWithSettingsAPIError); ok {
t.Fatalf("error type = %T, want non-pointer CreateSharedLinkWithSettingsAPIError", err)
}
requireExactErrorType(t, err, sharing.CreateSharedLinkWithSettingsAPIError{})
}

func TestRawModifySharedLinkErrorParserReturnsValueError(t *testing.T) {
Expand All @@ -197,10 +193,12 @@ func TestRawModifySharedLinkErrorParserReturnsValueError(t *testing.T) {
Content: `{ "error_summary": "settings_error/", "error": { ".tag": "settings_error" } }`,
})

if _, ok := err.(sharing.ModifySharedLinkSettingsAPIError); !ok {
t.Fatalf("error type = %T, want value ModifySharedLinkSettingsAPIError", err)
}
if _, ok := err.(*sharing.ModifySharedLinkSettingsAPIError); ok {
t.Fatalf("error type = %T, want non-pointer ModifySharedLinkSettingsAPIError", err)
requireExactErrorType(t, err, sharing.ModifySharedLinkSettingsAPIError{})
}

func requireExactErrorType(t *testing.T, err error, want any) {
t.Helper()
if got, want := reflect.TypeOf(err), reflect.TypeOf(want); got != want {
t.Fatalf("error type = %v, want exact type %v", got, want)
}
}
6 changes: 3 additions & 3 deletions cmd/share_link_revoke.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,15 +103,15 @@ func parseShareLinkRevokeOptions(cmd *cobra.Command, args []string) (shareLinkRe
return opts, invalidArgumentsErrorWithDetails("`--path` requires a non-empty path", flagErrorDetails("path"))
}

path, err := validatePath(pathArg)
dropboxPath, err := validatePath(pathArg)
if err != nil {
return opts, err
}
if path == "" {
if dropboxPath == "" {
return opts, invalidArgumentsErrorWithDetails("cannot revoke shared links for Dropbox root", pathErrorDetails("/"))
}

opts.path = path
opts.path = dropboxPath
return opts, nil
}

Expand Down
7 changes: 5 additions & 2 deletions cmd/share_link_revoke_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ func TestShareLinkRevokeReturnsAPIError(t *testing.T) {
})

err := shareLinkRevoke(&cobra.Command{}, []string{"https://www.dropbox.com/s/abc123"})
if err != wantErr {
if !errors.Is(err, wantErr) {
t.Fatalf("error = %v, want API error", err)
}
}
Expand Down Expand Up @@ -319,7 +319,7 @@ func TestShareLinkRevokePathReturnsListError(t *testing.T) {
}

err := shareLinkRevoke(cmd, nil)
if err != wantErr {
if !errors.Is(err, wantErr) {
t.Fatalf("error = %v, want list error", err)
}
}
Expand All @@ -343,6 +343,9 @@ func TestShareLinkRevokePathReturnsRevokeError(t *testing.T) {
}

err := shareLinkRevoke(cmd, nil)
if err == nil {
t.Fatal("expected wrapped revoke error")
}
if !errors.Is(err, wantErr) {
t.Fatalf("error = %v, want wrapped revoke error", err)
}
Expand Down
3 changes: 2 additions & 1 deletion cmd/share_link_update_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ package cmd

import (
"bytes"
"errors"
"fmt"
"os"
"strings"
Expand Down Expand Up @@ -619,7 +620,7 @@ func TestShareLinkUpdateReturnsAPIErrors(t *testing.T) {
}

err := shareLinkUpdate(cmd, []string{"https://example.com/link"})
if err != wantErr {
if !errors.Is(err, wantErr) {
t.Fatalf("error = %v, want original API error", err)
}
}
Expand Down
Loading