add some tests

This commit is contained in:
2021-06-26 15:34:04 -04:00
parent f35a56507a
commit 32b4caf163
4 changed files with 168 additions and 13 deletions

View File

@@ -5,6 +5,7 @@ import (
"fmt"
"io"
"net/http"
"net/url"
)
var (
@@ -17,13 +18,6 @@ type Client struct {
apipath string
}
// NewClient returns a new Client struct using http.DefaultClient and default api path.
func NewClient() (*Client, error) {
return &Client{
apipath: defaultAPI,
}, nil
}
// SetHTTPClient updates the httpClient on the client with a manually-configured one.
// If unset, the client will fall back to using http.DefaultClient.
func (c *Client) SetHTTPClient(h http.Client) {
@@ -38,24 +32,38 @@ func (c *Client) SetAPIPath(p string) {
// GetByISBN fetches details for a book based on its ISBN10 or ISBN13.
func (c *Client) GetByISBN(k string) (*BookDetails, error) {
if k == "" {
return nil, fmt.Errorf("ISBN cannot be empty")
} else if len(k) != 10 && len(k) != 13 {
return nil, fmt.Errorf("ISBN must be either 10 or 13 digits")
}
key := "ISBN:" + k
return c.fetch(key)
}
// GetByOCLC fetches details for a book based on its WorldCat OCLC number.
func (c *Client) GetByOCLC(k string) (*BookDetails, error) {
if k == "" {
return nil, fmt.Errorf("OCLC cannot be empty")
}
key := "OCLC:" + k
return c.fetch(key)
}
// GetByLCCN fetches details for a book based on its Library of Congress Control Number.
func (c *Client) GetByLCCN(k string) (*BookDetails, error) {
if k == "" {
return nil, fmt.Errorf("LCCN cannot be empty")
}
key := "LCCN:" + k
return c.fetch(key)
}
// GetByOLID fetches details for a book based on its OpenLibrary ID number.
func (c *Client) GetByOLID(k string) (*BookDetails, error) {
if k == "" {
return nil, fmt.Errorf("OLID cannot be empty")
}
key := "OLID:" + k
return c.fetch(key)
}
@@ -68,12 +76,21 @@ func (c *Client) GetByRawKey(k string) (*BookDetails, error) {
}
func (c *Client) fetch(key string) (*BookDetails, error) {
path := c.apipath
if path == "" {
path = defaultAPI
h := c.apipath
if h == "" {
h = defaultAPI
}
u, err := url.Parse(h)
if err != nil {
return nil, err
}
u.RawQuery = url.Values{
"bibkeys": []string{key},
"jscmd": []string{"data"},
"format": []string{"json"},
}.Encode()
resp, err := c.httpClient.Get(path + "?bibkeys=%s&jscmd=data&format=json")
resp, err := c.httpClient.Get(u.String())
if err != nil {
return nil, err
}