@@ -242,6 +242,14 @@ func TestGetLeaderboardEntries(tt *testing.T) {
242242 },
243243 assert : func (t * testing.T , resp * models.GetLeaderboardEntries , err error ) {
244244 require .NotNil (t , resp )
245+ require .Equal (t , 1 , resp .Count )
246+ require .Equal (t , 2 , resp .Total )
247+ require .Len (t , resp .Results , 1 )
248+ require .Equal (t , "ramenoid" , resp .Results [0 ].User )
249+ require .Equal (t , dateSubmitted , resp .Results [0 ].DateSubmitted .Time )
250+ require .Equal (t , 1908730 , resp .Results [0 ].Score )
251+ require .Equal (t , "1,908,730" , resp .Results [0 ].FormattedScore )
252+ require .Equal (t , 1 , resp .Results [0 ].Rank )
245253 require .NoError (t , err )
246254 },
247255 },
@@ -270,3 +278,149 @@ func TestGetLeaderboardEntries(tt *testing.T) {
270278 })
271279 }
272280}
281+
282+ func TestGetUserGameLeaderboards (tt * testing.T ) {
283+ count := 10
284+ offset := 10
285+ dateUpdated , err := time .Parse (models .RFC3339NumColonTZFormat , "2024-10-05T18:30:59+00:00" )
286+ require .NoError (tt , err )
287+ tests := []struct {
288+ name string
289+ params models.GetUserGameLeaderboardsParameters
290+ modifyURL func (url string ) string
291+ responseCode int
292+ responseMessage models.GetUserGameLeaderboards
293+ responseError models.ErrorResponse
294+ response func (messageBytes []byte , errorBytes []byte ) []byte
295+ assert func (t * testing.T , resp * models.GetUserGameLeaderboards , err error )
296+ }{
297+ {
298+ name : "fail to call endpoint" ,
299+ params : models.GetUserGameLeaderboardsParameters {
300+ GameID : 515 ,
301+ Username : "test" ,
302+ Count : & count ,
303+ Offset : & offset ,
304+ },
305+ modifyURL : func (url string ) string {
306+ return ""
307+ },
308+ responseCode : http .StatusOK ,
309+ response : func (messageBytes []byte , errorBytes []byte ) []byte {
310+ return messageBytes
311+ },
312+ assert : func (t * testing.T , resp * models.GetUserGameLeaderboards , err error ) {
313+ require .Nil (t , resp )
314+ require .EqualError (t , err , "calling endpoint: Get \" /API/API_GetUserGameLeaderboards.php?c=10&i=515&o=10&u=test&y=some_secret\" : unsupported protocol scheme \" \" " )
315+ },
316+ },
317+ {
318+ name : "error response" ,
319+ params : models.GetUserGameLeaderboardsParameters {
320+ GameID : 515 ,
321+ Username : "test" ,
322+ Count : & count ,
323+ Offset : & offset ,
324+ },
325+ modifyURL : func (url string ) string {
326+ return url
327+ },
328+ responseCode : http .StatusUnauthorized ,
329+ responseError : models.ErrorResponse {
330+ Message : "test" ,
331+ Errors : []models.ErrorDetail {
332+ {
333+ Status : http .StatusUnauthorized ,
334+ Code : "unauthorized" ,
335+ Title : "Not Authorized" ,
336+ },
337+ },
338+ },
339+ response : func (messageBytes []byte , errorBytes []byte ) []byte {
340+ return errorBytes
341+ },
342+ assert : func (t * testing.T , resp * models.GetUserGameLeaderboards , err error ) {
343+ require .Nil (t , resp )
344+ require .EqualError (t , err , "parsing response object: error code 401 returned: {\" message\" :\" test\" ,\" errors\" :[{\" status\" :401,\" code\" :\" unauthorized\" ,\" title\" :\" Not Authorized\" }]}" )
345+ },
346+ },
347+ {
348+ name : "success" ,
349+ params : models.GetUserGameLeaderboardsParameters {
350+ GameID : 515 ,
351+ Username : "test" ,
352+ Count : & count ,
353+ Offset : & offset ,
354+ },
355+ modifyURL : func (url string ) string {
356+ return url
357+ },
358+ responseCode : http .StatusOK ,
359+ responseMessage : models.GetUserGameLeaderboards {
360+ Count : 1 ,
361+ Total : 2 ,
362+ Results : []models.GetUserGameLeaderboardsResult {
363+ {
364+ ID : 114798 ,
365+ RankAsc : true ,
366+ Title : "Speedrun Monster Max" ,
367+ Description : "Complete the game from start to finish as fast as possible without using passwords" ,
368+ Format : "TIME" ,
369+ UserEntry : models.GetUserGameLeaderboardsUserEntry {
370+ User : "ramenoid" ,
371+ DateUpdated : models.RFC3339NumColonTZ {
372+ Time : dateUpdated ,
373+ },
374+ Score : 1908730 ,
375+ FormattedScore : "1,908,730" ,
376+ Rank : 1 ,
377+ },
378+ },
379+ },
380+ },
381+ response : func (messageBytes []byte , errorBytes []byte ) []byte {
382+ return messageBytes
383+ },
384+ assert : func (t * testing.T , resp * models.GetUserGameLeaderboards , err error ) {
385+ require .NotNil (t , resp )
386+ require .Equal (t , 1 , resp .Count )
387+ require .Equal (t , 2 , resp .Total )
388+ require .Len (t , resp .Results , 1 )
389+ require .Equal (t , 114798 , resp .Results [0 ].ID )
390+ require .True (t , resp .Results [0 ].RankAsc )
391+ require .Equal (t , "Speedrun Monster Max" , resp .Results [0 ].Title )
392+ require .Equal (t , "Complete the game from start to finish as fast as possible without using passwords" , resp .Results [0 ].Description )
393+ require .Equal (t , "TIME" , resp .Results [0 ].Format )
394+ require .Equal (t , "ramenoid" , resp .Results [0 ].UserEntry .User )
395+ require .Equal (t , 1908730 , resp .Results [0 ].UserEntry .Score )
396+ require .Equal (t , "1,908,730" , resp .Results [0 ].UserEntry .FormattedScore )
397+ require .Equal (t , 1 , resp .Results [0 ].UserEntry .Rank )
398+ require .Equal (t , dateUpdated , resp .Results [0 ].UserEntry .DateUpdated .Time )
399+ require .NoError (t , err )
400+ },
401+ },
402+ }
403+ for _ , test := range tests {
404+ tt .Run (test .name , func (t * testing.T ) {
405+ server := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
406+ expectedPath := "/API/API_GetUserGameLeaderboards.php"
407+ if r .URL .Path != expectedPath {
408+ t .Errorf ("Expected to request '%s', got: %s" , expectedPath , r .URL .Path )
409+ }
410+ w .WriteHeader (test .responseCode )
411+ messageBytes , err := json .Marshal (test .responseMessage )
412+ require .NoError (t , err )
413+ errBytes , err := json .Marshal (test .responseError )
414+ require .NoError (t , err )
415+ resp := test .response (messageBytes , errBytes )
416+ num , err := w .Write (resp )
417+ require .NoError (t , err )
418+ require .Equal (t , num , len (resp ))
419+ }))
420+ defer server .Close ()
421+ client := retroachievements .New (test .modifyURL (server .URL ), "go-retroachievements/v0.0.0" , "some_secret" )
422+ resp , err := client .GetUserGameLeaderboards (test .params )
423+ test .assert (t , resp , err )
424+ })
425+ }
426+ }
0 commit comments