Merge pull request #26 from irlndts/APIErrors
This commit is contained in:
commit
31a2e3b959
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
41
errors.go
41
errors.go
@ -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
|
|
||||||
}
|
|
||||||
|
@ -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 {
|
||||||
|
Reference in New Issue
Block a user