diff --git a/.golangci.yml b/.golangci.yml index 276f169..8f0c9ef 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -22,3 +22,4 @@ issues: - exhaustivestruct - cyclop - gochecknoglobals + - dupl diff --git a/kenall.go b/kenall.go index c2de435..b3c1004 100644 --- a/kenall.go +++ b/kenall.go @@ -144,7 +144,7 @@ func (cli *Client) GetAddress(ctx context.Context, postalCode string) (*GetAddre return nil, ErrInvalidArgument } - const path = "/postalcode/" + const path = "/postalCode/" req, err := http.NewRequestWithContext(ctx, http.MethodGet, cli.Endpoint+path+postalCode, nil) if err != nil { diff --git a/kenall_test.go b/kenall_test.go index 7938067..0702dba 100644 --- a/kenall_test.go +++ b/kenall_test.go @@ -80,23 +80,23 @@ func TestClient_GetAddress(t *testing.T) { endpoint string token string ctx context.Context - postalcode string + postalCode string checkAsError bool wantError error wantJISX0402 string }{ - "Normal case": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), postalcode: "1008105", checkAsError: false, wantError: nil, wantJISX0402: "13101"}, - "Invalid postalcode": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), postalcode: "alphabet", checkAsError: false, wantError: kenall.ErrInvalidArgument, wantJISX0402: ""}, - "Not found": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), postalcode: "0000000", checkAsError: false, wantError: kenall.ErrNotFound, wantJISX0402: ""}, - "Unauthorized": {endpoint: srv.URL, token: "bad_token", ctx: context.Background(), postalcode: "0000000", checkAsError: false, wantError: kenall.ErrUnauthorized, wantJISX0402: ""}, - "Payment Required": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), postalcode: "4020000", checkAsError: false, wantError: kenall.ErrPaymentRequired, wantJISX0402: ""}, - "Forbidden": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), postalcode: "4030000", checkAsError: false, wantError: kenall.ErrForbidden, wantJISX0402: ""}, - "Internal server error": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), postalcode: "5000000", checkAsError: false, wantError: kenall.ErrInternalServerError, wantJISX0402: ""}, - "Bad gateway": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), postalcode: "5020000", checkAsError: false, wantError: kenall.ErrBadGateway, wantJISX0402: ""}, - "Unknown status code": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), postalcode: "5030000", checkAsError: true, wantError: fmt.Errorf(""), wantJISX0402: ""}, - "Wrong endpoint": {endpoint: "", token: "opencollector", ctx: context.Background(), postalcode: "0000000", checkAsError: true, wantError: &url.Error{}, wantJISX0402: ""}, - "Wrong response": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), postalcode: "0000001", checkAsError: true, wantError: &json.MarshalerError{}, wantJISX0402: ""}, - "Nil context": {endpoint: srv.URL, token: "opencollector", ctx: nil, postalcode: "0000000", checkAsError: true, wantError: errors.New("net/http: nil Context"), wantJISX0402: ""}, + "Normal case": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), postalCode: "1008105", checkAsError: false, wantError: nil, wantJISX0402: "13101"}, + "Invalid postal code": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), postalCode: "alphabet", checkAsError: false, wantError: kenall.ErrInvalidArgument, wantJISX0402: ""}, + "Not found": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), postalCode: "0000000", checkAsError: false, wantError: kenall.ErrNotFound, wantJISX0402: ""}, + "Unauthorized": {endpoint: srv.URL, token: "bad_token", ctx: context.Background(), postalCode: "0000000", checkAsError: false, wantError: kenall.ErrUnauthorized, wantJISX0402: ""}, + "Payment Required": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), postalCode: "4020000", checkAsError: false, wantError: kenall.ErrPaymentRequired, wantJISX0402: ""}, + "Forbidden": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), postalCode: "4030000", checkAsError: false, wantError: kenall.ErrForbidden, wantJISX0402: ""}, + "Internal server error": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), postalCode: "5000000", checkAsError: false, wantError: kenall.ErrInternalServerError, wantJISX0402: ""}, + "Bad gateway": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), postalCode: "5020000", checkAsError: false, wantError: kenall.ErrBadGateway, wantJISX0402: ""}, + "Unknown status code": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), postalCode: "5030000", checkAsError: true, wantError: fmt.Errorf(""), wantJISX0402: ""}, + "Wrong endpoint": {endpoint: "", token: "opencollector", ctx: context.Background(), postalCode: "0000000", checkAsError: true, wantError: &url.Error{}, wantJISX0402: ""}, + "Wrong response": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), postalCode: "0000001", checkAsError: true, wantError: &json.MarshalerError{}, wantJISX0402: ""}, + "Nil context": {endpoint: srv.URL, token: "opencollector", ctx: nil, postalCode: "0000000", checkAsError: true, wantError: errors.New("net/http: nil Context"), wantJISX0402: ""}, } for name, c := range cases { @@ -110,7 +110,7 @@ func TestClient_GetAddress(t *testing.T) { t.Error(err) } - res, err := cli.GetAddress(c.ctx, c.postalcode) + res, err := cli.GetAddress(c.ctx, c.postalCode) if c.checkAsError && !errors.As(err, &c.wantError) { t.Errorf("give: %v, want: %v", err, c.wantError) } else if !errors.Is(err, c.wantError) { @@ -123,6 +123,61 @@ func TestClient_GetAddress(t *testing.T) { } } +func TestClient_GetCity(t *testing.T) { + t.Parallel() + + srv := runTestingServer(t) + t.Cleanup(func() { + srv.Close() + }) + + cases := map[string]struct { + endpoint string + token string + ctx context.Context + prefectureCode string + checkAsError bool + wantError error + wantJISX0402 string + }{ + "Normal case": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), prefectureCode: "13", checkAsError: false, wantError: nil, wantJISX0402: "13101"}, + "Invalid prefecture code": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), prefectureCode: "alphabet", checkAsError: false, wantError: kenall.ErrInvalidArgument, wantJISX0402: ""}, + "Not found": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), prefectureCode: "48", checkAsError: false, wantError: kenall.ErrNotFound, wantJISX0402: ""}, + "Unauthorized": {endpoint: srv.URL, token: "bad_token", ctx: context.Background(), prefectureCode: "00", checkAsError: false, wantError: kenall.ErrUnauthorized, wantJISX0402: ""}, + "Payment Required": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), prefectureCode: "90", checkAsError: false, wantError: kenall.ErrPaymentRequired, wantJISX0402: ""}, + "Forbidden": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), prefectureCode: "91", checkAsError: false, wantError: kenall.ErrForbidden, wantJISX0402: ""}, + "Internal server error": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), prefectureCode: "92", checkAsError: false, wantError: kenall.ErrInternalServerError, wantJISX0402: ""}, + "Bad gateway": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), prefectureCode: "93", checkAsError: false, wantError: kenall.ErrBadGateway, wantJISX0402: ""}, + "Unknown status code": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), prefectureCode: "94", checkAsError: true, wantError: fmt.Errorf(""), wantJISX0402: ""}, + "Wrong endpoint": {endpoint: "", token: "opencollector", ctx: context.Background(), prefectureCode: "00", checkAsError: true, wantError: &url.Error{}, wantJISX0402: ""}, + "Wrong response": {endpoint: srv.URL, token: "opencollector", ctx: context.Background(), prefectureCode: "95", checkAsError: true, wantError: &json.MarshalerError{}, wantJISX0402: ""}, + "Nil context": {endpoint: srv.URL, token: "opencollector", ctx: nil, prefectureCode: "00", checkAsError: true, wantError: errors.New("net/http: nil Context"), wantJISX0402: ""}, + } + + for name, c := range cases { + c := c + + t.Run(name, func(t *testing.T) { + t.Parallel() + + cli, err := kenall.NewClient(c.token, kenall.WithEndpoint(c.endpoint)) + if err != nil { + t.Error(err) + } + + res, err := cli.GetCity(c.ctx, c.prefectureCode) + if c.checkAsError && !errors.As(err, &c.wantError) { + t.Errorf("give: %v, want: %v", err, c.wantError) + } else if !errors.Is(err, c.wantError) { + t.Errorf("give: %v, want: %v", err, c.wantError) + } + if res != nil && res.Cities[0].JISX0402 != c.wantJISX0402 { + t.Errorf("give: %v, want: %v", res.Cities[0].JISX0402, c.wantJISX0402) + } + }) + } +} + func TestVersion_UnmarshalJSON(t *testing.T) { t.Parallel() @@ -221,7 +276,7 @@ func runTestingServer(t *testing.T) *httptest.Server { } switch path := r.URL.Path; { - case strings.HasPrefix(path, "/postalcode/"): + case strings.HasPrefix(path, "/postalCode/"): handlePostalAPI(t, w, path) case strings.HasPrefix(path, "/cities/"): handleCityAPI(t, w, path) @@ -235,21 +290,21 @@ func handlePostalAPI(t *testing.T, w http.ResponseWriter, path string) { t.Helper() switch path { - case "/postalcode/1008105": + case "/postalCode/1008105": if _, err := w.Write(addressResponse); err != nil { w.WriteHeader(http.StatusInternalServerError) } - case "/postalcode/4030000": - w.WriteHeader(http.StatusForbidden) - case "/postalcode/4020000": + case "/postalCode/4020000": w.WriteHeader(http.StatusPaymentRequired) - case "/postalcode/5000000": + case "/postalCode/4030000": + w.WriteHeader(http.StatusForbidden) + case "/postalCode/5000000": w.WriteHeader(http.StatusInternalServerError) - case "/postalcode/5020000": + case "/postalCode/5020000": w.WriteHeader(http.StatusBadGateway) - case "/postalcode/5030000": + case "/postalCode/5030000": w.WriteHeader(http.StatusServiceUnavailable) - case "/postalcode/0000001": + case "/postalCode/0000001": if _, err := w.Write([]byte("wrong")); err != nil { w.WriteHeader(http.StatusInternalServerError) } @@ -267,9 +322,9 @@ func handleCityAPI(t *testing.T, w http.ResponseWriter, path string) { w.WriteHeader(http.StatusInternalServerError) } case "/cities/90": - w.WriteHeader(http.StatusForbidden) - case "/cities/91": w.WriteHeader(http.StatusPaymentRequired) + case "/cities/91": + w.WriteHeader(http.StatusForbidden) case "/cities/92": w.WriteHeader(http.StatusInternalServerError) case "/cities/93":