Skip to content

Commit 2df2e81

Browse files
committed
refactor: use url.Values to correctly parse path params
1 parent 47e5dc7 commit 2df2e81

5 files changed

+66
-28
lines changed

client_test.go

-7
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,13 @@ package paperswithcode_go
22

33
import (
44
"fmt"
5-
"github.com/codingpot/paperswithcode-go/v2/internal/testutils"
65
"net/http"
76
"net/http/httptest"
87
"testing"
98

109
"github.com/stretchr/testify/assert"
1110
)
1211

13-
var apiToken string
14-
15-
func init() {
16-
apiToken = testutils.MustExtractAPITokenFromEnv()
17-
}
18-
1912
func TestWithAPIToken(t *testing.T) {
2013
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
2114
w.WriteHeader(http.StatusOK)

method_list.go

+12-5
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,31 @@
11
package paperswithcode_go
22

33
import (
4-
"fmt"
54
"github.com/codingpot/paperswithcode-go/v2/models"
5+
"net/url"
6+
"strconv"
67
)
78

9+
// MethodListParams is an argument object to MethodList.
810
type MethodListParams struct {
911
// Page (default: 1)
1012
Page int
1113
// ItemsPerPage (default: 50)
1214
ItemsPerPage int
1315
}
1416

15-
func (m MethodListParams) String() string {
16-
return fmt.Sprintf("page=%d&items_per_page=%d", m.Page, m.ItemsPerPage)
17+
// Build used to expand `MethodListParams` to URL path params.
18+
func (m MethodListParams) Build() string {
19+
return url.Values{
20+
"page": []string{strconv.Itoa(m.Page)},
21+
"items_per_page": []string{strconv.Itoa(m.ItemsPerPage)},
22+
}.Encode()
1723
}
1824

25+
// MethodList fetches a list of "methods" that can be used in research papers.
1926
func (c *Client) MethodList(params MethodListParams) (*models.MethodList, error) {
20-
url := c.baseURL + "/methods?" + params.String()
27+
u := c.baseURL + "/methods?" + params.Build()
2128
var listResult models.MethodList
22-
err := c.sendGetRequest(url, &listResult)
29+
err := c.sendGetRequest(u, &listResult)
2330
return &listResult, err
2431
}

method_list_test.go

+38
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,41 @@ func TestClient_MethodList(t *testing.T) {
6666
func toPtr(s string) *string {
6767
return &s
6868
}
69+
70+
func TestMethodListParams_Build(t *testing.T) {
71+
type fields struct {
72+
Page int
73+
ItemsPerPage int
74+
}
75+
tests := []struct {
76+
name string
77+
fields fields
78+
want string
79+
}{
80+
{
81+
name: "default values are parsed as URL params",
82+
fields: fields{
83+
Page: 0,
84+
ItemsPerPage: 0,
85+
},
86+
want: "items_per_page=0&page=0",
87+
},
88+
{
89+
name: "some values are parsed as URL params",
90+
fields: fields{
91+
Page: 1,
92+
ItemsPerPage: 1234,
93+
},
94+
want: "items_per_page=1234&page=1",
95+
},
96+
}
97+
for _, tt := range tests {
98+
t.Run(tt.name, func(t *testing.T) {
99+
m := MethodListParams{
100+
Page: tt.fields.Page,
101+
ItemsPerPage: tt.fields.ItemsPerPage,
102+
}
103+
assert.Equal(t, tt.want, m.Build())
104+
})
105+
}
106+
}

paper_list.go

+12-12
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package paperswithcode_go
22

33
import (
4-
"fmt"
5-
"strings"
6-
74
"github.com/codingpot/paperswithcode-go/v2/models"
5+
"net/url"
6+
"strconv"
87
)
98

109
// PaperList returns multiple papers.
@@ -30,20 +29,21 @@ type PaperListParams struct {
3029
}
3130

3231
func (p PaperListParams) Build() string {
33-
var b strings.Builder
34-
b.WriteString(fmt.Sprintf("page=%d&items_per_page=%d", p.Page, p.ItemsPerPage))
32+
b := url.Values{}
33+
b.Set("page", strconv.Itoa(p.Page))
34+
b.Set("items_per_page", strconv.Itoa(p.ItemsPerPage))
3535

36-
addParamsIfValid(&b, "q", p.Q)
37-
addParamsIfValid(&b, "arxiv_id", p.ArxivID)
38-
addParamsIfValid(&b, "title", p.Title)
39-
addParamsIfValid(&b, "abstract", p.Abstract)
36+
addParamsIfValid(b, "q", p.Q)
37+
addParamsIfValid(b, "arxiv_id", p.ArxivID)
38+
addParamsIfValid(b, "title", p.Title)
39+
addParamsIfValid(b, "abstract", p.Abstract)
4040

41-
return b.String()
41+
return b.Encode()
4242
}
4343

44-
func addParamsIfValid(b *strings.Builder, key string, value string) {
44+
func addParamsIfValid(b url.Values, key string, value string) {
4545
if value != "" {
46-
b.WriteString(fmt.Sprintf("&%s=%s", key, value))
46+
b.Set(key, value)
4747
}
4848
}
4949

paper_list_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
)
88

99
func TestClient_PaperList(t *testing.T) {
10-
client := NewClient(WithAPIToken(apiToken))
10+
client := NewClient()
1111
_, err := client.PaperList(PaperListParamsDefault())
1212
assert.NoError(t, err)
1313
}
@@ -33,20 +33,20 @@ func TestPaperListParams_Build(t *testing.T) {
3333
Page: 1,
3434
ItemsPerPage: 50,
3535
},
36-
want: "page=1&items_per_page=50&q=wow",
36+
want: "items_per_page=50&page=1&q=wow",
3737
},
3838
{
3939
name: "Q is not given, it shouldn't add Q param",
4040
fields: fields{
4141
Page: 1,
4242
ItemsPerPage: 50,
4343
},
44-
want: "page=1&items_per_page=50",
44+
want: "items_per_page=50&page=1",
4545
},
4646
{
4747
name: "Default Param is valid",
4848
fields: fields(PaperListParamsDefault()),
49-
want: "page=1&items_per_page=50",
49+
want: "items_per_page=50&page=1",
5050
},
5151
}
5252
for _, tt := range tests {

0 commit comments

Comments
 (0)