Skip to content

Commit 350475d

Browse files
authored
Merge pull request #11 from joshraphael/issue-10
issue-10 -- Add connect API
2 parents aaa1d81 + fd8b869 commit 350475d

25 files changed

+575
-186
lines changed

achievement.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ func (c *Client) GetAchievementUnlocks(params models.GetAchievementUnlocksParame
1414
raHttp.Method(http.MethodGet),
1515
raHttp.UserAgent(c.UserAgent),
1616
raHttp.Path("/API/API_GetAchievementUnlocks.php"),
17-
raHttp.APIToken(c.Secret),
17+
raHttp.Y(c.APISecret),
1818
raHttp.A(params.AchievementID),
1919
}
2020
if params.Count != nil {

achievement_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,11 @@ func TestGetAchievementUnlocks(tt *testing.T) {
178178
require.Equal(t, num, len(resp))
179179
}))
180180
defer server.Close()
181-
client := retroachievements.New(test.modifyURL(server.URL), "go-retroachievements/v0.0.0", "some_secret")
181+
client := retroachievements.New(retroachievements.ClientConfig{
182+
Host: test.modifyURL(server.URL),
183+
UserAgent: "go-retroachievements/v0.0.0",
184+
APISecret: "some_secret",
185+
})
182186
resp, err := client.GetAchievementUnlocks(test.params)
183187
test.assert(t, resp, err)
184188
})

client.go

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,25 @@ const (
1515
RetroAchievementHost = "https://retroachievements.org"
1616
)
1717

18+
type ClientConfig struct {
19+
Host string
20+
UserAgent string
21+
APISecret string
22+
ConnectConfig *ClientConnectConfig
23+
}
24+
25+
type ClientConnectConfig struct {
26+
ConnectSecret string
27+
ConnectUsername string
28+
}
29+
1830
type Client struct {
19-
UserAgent string
20-
Host string
21-
Secret string
22-
HttpClient *http.Client
31+
UserAgent string
32+
Host string
33+
APISecret string
34+
ConnectSecret string
35+
ConnectUsername string
36+
HttpClient *http.Client
2337
}
2438

2539
type ClientDetail interface {
@@ -62,19 +76,27 @@ var version = sync.OnceValue(func() string {
6276

6377
// NewClient makes a new client using the default retroachievement host
6478
func NewClient(secret string) *Client {
65-
return New(RetroAchievementHost, version(), secret)
79+
return New(ClientConfig{
80+
Host: RetroAchievementHost,
81+
UserAgent: version(),
82+
APISecret: secret,
83+
})
6684
}
6785

6886
// New creates a new client for a given hostname
69-
func New(host string, userAgent string, secret string, details ...ClientDetail) *Client {
87+
func New(config ClientConfig, details ...ClientDetail) *Client {
7088
client := &Client{
71-
UserAgent: userAgent,
72-
Host: host,
73-
Secret: secret,
89+
UserAgent: config.UserAgent,
90+
Host: config.Host,
91+
APISecret: config.APISecret,
7492
HttpClient: &http.Client{
7593
Transport: http.DefaultTransport,
7694
},
7795
}
96+
if config.ConnectConfig != nil && len(config.ConnectConfig.ConnectSecret) > 0 && len(config.ConnectConfig.ConnectUsername) > 0 {
97+
client.ConnectSecret = config.ConnectConfig.ConnectSecret
98+
client.ConnectUsername = config.ConnectConfig.ConnectUsername
99+
}
78100
for _, detail := range details {
79101
detail.detail(client)
80102
}

client_test.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,20 @@ import (
1111

1212
func TestNew(t *testing.T) {
1313
actual := retroachievements.New(
14-
retroachievements.RetroAchievementHost,
15-
"newUserAgent",
16-
"some_secret",
14+
retroachievements.ClientConfig{
15+
Host: retroachievements.RetroAchievementHost,
16+
UserAgent: "newUserAgent",
17+
APISecret: "some_secret",
18+
},
1719
retroachievements.HttpClient(&http.Client{
1820
Transport: http.DefaultTransport,
1921
Timeout: 5 * time.Minute,
2022
}),
2123
)
2224

2325
expected := &retroachievements.Client{
24-
Host: retroachievements.RetroAchievementHost,
25-
Secret: "some_secret",
26+
Host: retroachievements.RetroAchievementHost,
27+
APISecret: "some_secret",
2628
HttpClient: &http.Client{
2729
Transport: http.DefaultTransport,
2830
Timeout: 5 * time.Minute,
@@ -37,8 +39,8 @@ func TestNewClient(t *testing.T) {
3739
actual := retroachievements.NewClient("some_secret")
3840

3941
expected := &retroachievements.Client{
40-
Host: retroachievements.RetroAchievementHost,
41-
Secret: "some_secret",
42+
Host: retroachievements.RetroAchievementHost,
43+
APISecret: "some_secret",
4244
HttpClient: &http.Client{
4345
Transport: http.DefaultTransport,
4446
},

comment.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ func (c *Client) GetComments(params models.GetCommentsParameters) (*models.GetCo
1515
raHttp.Method(http.MethodGet),
1616
raHttp.UserAgent(c.UserAgent),
1717
raHttp.Path("/API/API_GetComments.php"),
18-
raHttp.APIToken(c.Secret),
19-
raHttp.T(params.Type.GetCommentsType()),
18+
raHttp.Y(c.APISecret),
19+
raHttp.T(strconv.Itoa(params.Type.GetCommentsType())),
2020
}
2121
switch params.Type.(type) {
2222
case models.GetCommentsGame:

comment_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,11 @@ func TestGetComments(tt *testing.T) {
212212
require.Equal(t, num, len(resp))
213213
}))
214214
defer server.Close()
215-
client := retroachievements.New(test.modifyURL(server.URL), "go-retroachievements/v0.0.0", "some_secret")
215+
client := retroachievements.New(retroachievements.ClientConfig{
216+
Host: test.modifyURL(server.URL),
217+
UserAgent: "go-retroachievements/v0.0.0",
218+
APISecret: "some_secret",
219+
})
216220
resp, err := client.GetComments(test.params)
217221
test.assert(t, resp, err)
218222
})

connect.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package retroachievements
2+
3+
import (
4+
"fmt"
5+
"net/http"
6+
7+
raHttp "github.com/joshraphael/go-retroachievements/http"
8+
"github.com/joshraphael/go-retroachievements/models"
9+
)
10+
11+
// GetCodeNotes gets the list of code notes for a given game.
12+
func (c *Client) GetCodeNotes(params models.GetCodeNotesParameters) (*models.GetCodeNotes, error) {
13+
r, err := c.do(
14+
raHttp.Method(http.MethodGet),
15+
raHttp.UserAgent(c.UserAgent),
16+
raHttp.Path("/dorequest.php"),
17+
raHttp.G(params.GameID),
18+
raHttp.R("codenotes2"),
19+
raHttp.T(c.ConnectSecret),
20+
raHttp.U(c.ConnectUsername),
21+
)
22+
if err != nil {
23+
return nil, fmt.Errorf("calling endpoint: %w", err)
24+
}
25+
resp, err := raHttp.ResponseObject[models.GetCodeNotes](r)
26+
if err != nil {
27+
return nil, fmt.Errorf("parsing response object: %w", err)
28+
}
29+
return resp, nil
30+
}

connect_test.go

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
package retroachievements_test
2+
3+
import (
4+
"encoding/json"
5+
"net/http"
6+
"net/http/httptest"
7+
"testing"
8+
9+
"github.com/joshraphael/go-retroachievements"
10+
"github.com/joshraphael/go-retroachievements/models"
11+
"github.com/stretchr/testify/require"
12+
)
13+
14+
func TestGetCodeNotes(tt *testing.T) {
15+
tests := []struct {
16+
name string
17+
params models.GetCodeNotesParameters
18+
modifyURL func(url string) string
19+
responseCode int
20+
responseMessage models.GetCodeNotes
21+
responseError models.ErrorResponse
22+
response func(messageBytes []byte, errorBytes []byte) []byte
23+
assert func(t *testing.T, resp *models.GetCodeNotes, err error)
24+
}{
25+
{
26+
name: "fail to call endpoint",
27+
params: models.GetCodeNotesParameters{
28+
GameID: 13214,
29+
},
30+
modifyURL: func(url string) string {
31+
return ""
32+
},
33+
responseCode: http.StatusOK,
34+
response: func(messageBytes []byte, errorBytes []byte) []byte {
35+
return messageBytes
36+
},
37+
assert: func(t *testing.T, resp *models.GetCodeNotes, err error) {
38+
require.Nil(t, resp)
39+
require.EqualError(t, err, "calling endpoint: Get \"/dorequest.php?g=13214&r=codenotes2&t=some_other_secret&u=jamiras\": unsupported protocol scheme \"\"")
40+
},
41+
},
42+
{
43+
name: "error response",
44+
params: models.GetCodeNotesParameters{
45+
GameID: 13214,
46+
},
47+
modifyURL: func(url string) string {
48+
return url
49+
},
50+
responseCode: http.StatusUnauthorized,
51+
responseError: models.ErrorResponse{
52+
Message: "test",
53+
Errors: []models.ErrorDetail{
54+
{
55+
Status: http.StatusUnauthorized,
56+
Code: "unauthorized",
57+
Title: "Not Authorized",
58+
},
59+
},
60+
},
61+
response: func(messageBytes []byte, errorBytes []byte) []byte {
62+
return errorBytes
63+
},
64+
assert: func(t *testing.T, resp *models.GetCodeNotes, err error) {
65+
require.Nil(t, resp)
66+
require.EqualError(t, err, "parsing response object: error code 401 returned: {\"message\":\"test\",\"errors\":[{\"status\":401,\"code\":\"unauthorized\",\"title\":\"Not Authorized\"}]}")
67+
},
68+
},
69+
{
70+
name: "success",
71+
params: models.GetCodeNotesParameters{
72+
GameID: 13214,
73+
},
74+
modifyURL: func(url string) string {
75+
return url
76+
},
77+
responseCode: http.StatusOK,
78+
responseMessage: models.GetCodeNotes{
79+
Success: true,
80+
CodeNotes: []models.GetCodeNotesCodeNote{
81+
{
82+
User: "jamiras",
83+
Address: "0x00000",
84+
Note: "test note 1",
85+
},
86+
{
87+
User: "jamiras",
88+
Address: "0x00001",
89+
Note: "test note 2",
90+
},
91+
},
92+
},
93+
response: func(messageBytes []byte, errorBytes []byte) []byte {
94+
return messageBytes
95+
},
96+
assert: func(t *testing.T, resp *models.GetCodeNotes, err error) {
97+
require.NotNil(t, resp)
98+
require.True(t, resp.Success)
99+
require.Len(t, resp.CodeNotes, 2)
100+
require.Equal(t, "jamiras", resp.CodeNotes[0].User)
101+
require.Equal(t, "0x00000", resp.CodeNotes[0].Address)
102+
require.Equal(t, "test note 1", resp.CodeNotes[0].Note)
103+
require.Equal(t, "jamiras", resp.CodeNotes[1].User)
104+
require.Equal(t, "0x00001", resp.CodeNotes[1].Address)
105+
require.Equal(t, "test note 2", resp.CodeNotes[1].Note)
106+
require.NoError(t, err)
107+
},
108+
},
109+
}
110+
for _, test := range tests {
111+
tt.Run(test.name, func(t *testing.T) {
112+
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
113+
expectedPath := "/dorequest.php"
114+
if r.URL.Path != expectedPath {
115+
t.Errorf("Expected to request '%s', got: %s", expectedPath, r.URL.Path)
116+
}
117+
w.WriteHeader(test.responseCode)
118+
messageBytes, err := json.Marshal(test.responseMessage)
119+
require.NoError(t, err)
120+
errBytes, err := json.Marshal(test.responseError)
121+
require.NoError(t, err)
122+
resp := test.response(messageBytes, errBytes)
123+
num, err := w.Write(resp)
124+
require.NoError(t, err)
125+
require.Equal(t, num, len(resp))
126+
}))
127+
defer server.Close()
128+
client := retroachievements.New(retroachievements.ClientConfig{
129+
Host: test.modifyURL(server.URL),
130+
UserAgent: "go-retroachievements/v0.0.0",
131+
APISecret: "some_secret",
132+
ConnectConfig: &retroachievements.ClientConnectConfig{
133+
ConnectSecret: "some_other_secret",
134+
ConnectUsername: "jamiras",
135+
},
136+
})
137+
resp, err := client.GetCodeNotes(test.params)
138+
test.assert(t, resp, err)
139+
})
140+
}
141+
}

event.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ func (c *Client) GetAchievementOfTheWeek(params models.GetAchievementOfTheWeekPa
1414
raHttp.Method(http.MethodGet),
1515
raHttp.UserAgent(c.UserAgent),
1616
raHttp.Path("/API/API_GetAchievementOfTheWeek.php"),
17-
raHttp.APIToken(c.Secret),
17+
raHttp.Y(c.APISecret),
1818
)
1919
if err != nil {
2020
return nil, fmt.Errorf("calling endpoint: %w", err)

event_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,11 @@ func TestGetAchievementOfTheWeek(tt *testing.T) {
164164
require.Equal(t, num, len(resp))
165165
}))
166166
defer server.Close()
167-
client := retroachievements.New(test.modifyURL(server.URL), "go-retroachievements/v0.0.0", "some_secret")
167+
client := retroachievements.New(retroachievements.ClientConfig{
168+
Host: test.modifyURL(server.URL),
169+
UserAgent: "go-retroachievements/v0.0.0",
170+
APISecret: "some_secret",
171+
})
168172
resp, err := client.GetAchievementOfTheWeek(test.params)
169173
test.assert(t, resp, err)
170174
})

0 commit comments

Comments
 (0)