Merge pull request #26 from irlndts/APIErrors

This commit is contained in:
Artem Piskun 2018-03-24 16:19:05 +03:00 committed by GitHub
commit 31a2e3b959
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 75 additions and 34 deletions

View File

@ -2,7 +2,6 @@ package discogs
import ( import (
"encoding/json" "encoding/json"
"fmt"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"net/url" "net/url"
@ -33,7 +32,7 @@ func NewClient(o *Options) (*Client, error) {
header = &http.Header{} header = &http.Header{}
if o == nil || o.UserAgent == "" { if o == nil || o.UserAgent == "" {
return nil, fmt.Errorf("failed to set user-agent") return nil, ErrUserAgentInvalid
} }
header.Add("User-Agent", o.UserAgent) header.Add("User-Agent", o.UserAgent)
@ -68,7 +67,7 @@ func currency(c string) (string, error) {
case "": case "":
return "USD", nil return "USD", nil
default: default:
return "", fmt.Errorf("invalid currency abbreviation") return "", ErrCurrencyNotSupported
} }
} }

View File

@ -29,3 +29,64 @@ func initDiscogsClient(t *testing.T, options *Options) *Client {
return client return client
} }
func TestNewClient(t *testing.T) {
tests := map[string]struct {
options *Options
err error
}{
"normal": {&Options{
UserAgent: testUserAgent,
Currency: "USD",
Token: "some token",
}, nil},
"incorrect user-agent": {&Options{
UserAgent: "",
Currency: "USD",
}, ErrUserAgentInvalid},
"incorrect currency": {&Options{
UserAgent: testUserAgent,
Currency: "RUR",
}, ErrCurrencyNotSupported},
}
for name, tt := range tests {
t.Run(name, func(t *testing.T) {
if _, err := NewClient(tt.options); err != tt.err {
t.Errorf("err got=%s; want=%s", err, tt.err)
}
})
}
}
func TestCurrency(t *testing.T) {
tests := []struct {
currency string
want string
err error
}{
{currency: "", want: "USD", err: nil},
{currency: "USD", want: "USD", err: nil},
{currency: "GBP", want: "GBP", err: nil},
{currency: "EUR", want: "EUR", err: nil},
{currency: "CAD", want: "CAD", err: nil},
{currency: "AUD", want: "AUD", err: nil},
{currency: "JPY", want: "JPY", err: nil},
{currency: "CHF", want: "CHF", err: nil},
{currency: "MXN", want: "MXN", err: nil},
{currency: "BRL", want: "BRL", err: nil},
{currency: "NZD", want: "NZD", err: nil},
{currency: "SEK", want: "SEK", err: nil},
{currency: "ZAR", want: "ZAR", err: nil},
{currency: "RUR", want: "", err: ErrCurrencyNotSupported},
}
for i, tt := range tests {
cur, err := currency(tt.currency)
if err != tt.err {
t.Errorf("#%d err got=%s; want=%s", i, err, tt.err)
}
if cur != tt.want {
t.Errorf("#%d currency got=%s; want=%s", i, cur, tt.want)
}
}
}

View File

@ -2,39 +2,20 @@ package discogs
import ( import (
"fmt" "fmt"
"strings"
) )
// APIError represents a Discogs API Error response // Error represents a Discogs API error
type APIError struct { type Error struct {
Message string `json:"message"` Message string
} }
// Error ... func (e *Error) Error() string {
func (e APIError) Error() string { return fmt.Sprintf("%s", strings.ToLower(e.Message))
if e.Message != "" {
return fmt.Sprintf("discogs: %v", e.Message)
}
return ""
} }
// Empty returns true if empty. Otherwise, at least 1 error message/code is // APIErrors
// present and false is returned. var (
func (e APIError) Empty() bool { ErrCurrencyNotSupported = &Error{"currency does not supported"}
if e.Message == "" { ErrUserAgentInvalid = &Error{"invalid user-agent"}
return true )
}
return false
}
// relevantError returns any non-nil http-related error (creating the request,
// getting the response, decoding) if any. If the decoded apiError is non-zero
// the apiError is returned. Otherwise, no errors occurred, returns nil.
func relevantError(httpError error, apiError APIError) error {
if httpError != nil {
return httpError
}
if apiError.Empty() {
return nil
}
return apiError
}

View File

@ -9,7 +9,7 @@ import (
func main() { func main() {
d, err := discogs.NewClient(&discogs.Options{ d, err := discogs.NewClient(&discogs.Options{
UserAgent: "TestDiscogsClient/0.0.1 +http://example.com", UserAgent: "TestDiscogsClient/0.0.1 +http://example.com",
Currency: "EUR", Currency: "AAA",
Token: "", Token: "",
}) })
if err != nil { if err != nil {