From ba7a0d9d5b3bd1c7c3928769d7007fbbaa12369c Mon Sep 17 00:00:00 2001 From: BrandonRomano Date: Fri, 16 Dec 2016 11:14:52 -0500 Subject: [PATCH] Implement + Test [GET] /v1/me/followers/ --- client_test.go | 50 ++++++++++++++++++++++++++ controllers/me_followers_controller.go | 40 +++++++++++++++++++-- 2 files changed, 88 insertions(+), 2 deletions(-) diff --git a/client_test.go b/client_test.go index b77f257..de71de9 100644 --- a/client_test.go +++ b/client_test.go @@ -822,3 +822,53 @@ func (suite *ClientTestSuite) TestTimeoutMeBoardsSuggestedFetch() { ) assert.NotEqual(suite.T(), nil, err) } + +// ======================================== +// ========== Me.Followers.Fetch ========== +// ======================================== + +// TestSuccessfulMeFollowersFetch tests that we can fetch +// followers of the authorized user. +func (suite *ClientTestSuite) TestSuccessfulMeFollowersFetch() { + // Test simple fetch + users, page, err := suite.client.Me.Followers.Fetch( + &controllers.MeFollowersFetchOptionals{}, + ) + assert.Equal(suite.T(), nil, err) + assert.Equal(suite.T(), len(*users), 25) + + // Load second page + users, page, err = suite.client.Me.Followers.Fetch( + &controllers.MeFollowersFetchOptionals{ + Cursor: page.Cursor, + }, + ) + assert.Equal(suite.T(), nil, err) + assert.True(suite.T(), len(*users) > 0) +} + +// TestTimeoutMeFollowersFetch tests that an error is appropriately thrown +// when a network timeout occurs +func (suite *ClientTestSuite) TestTimeoutMeFollowersFetch() { + _, _, err := suite.timeoutClient.Me.Followers.Fetch( + &controllers.MeFollowersFetchOptionals{}, + ) + assert.NotEqual(suite.T(), nil, err) +} + +// TestUnauthorizedMeFollowersFetch tests that a 401 is thrown +// when an unauthorized user tries to call a /me endpoint +func (suite *ClientTestSuite) TestUnauthorizedMeFollowersFetch() { + _, _, err := suite.unauthorizedClient.Me.Followers.Fetch( + &controllers.MeFollowersFetchOptionals{}, + ) + + // Check error type + if pinterestError, ok := err.(*models.PinterestError); ok { + // Should be a 401 + assert.Equal(suite.T(), http.StatusUnauthorized, pinterestError.StatusCode) + } else { + // Make this error out, should always be a PinterestError + assert.Equal(suite.T(), true, false) + } +} diff --git a/controllers/me_followers_controller.go b/controllers/me_followers_controller.go index 7329218..84f7a35 100644 --- a/controllers/me_followers_controller.go +++ b/controllers/me_followers_controller.go @@ -2,6 +2,7 @@ package controllers import ( "github.com/BrandonRomano/wrecker" + "github.com/carrot/go-pinterest/models" ) // MeFollowersController is the controller that is responsible for all @@ -17,6 +18,41 @@ func newMeFollowersController(wc *wrecker.Wrecker) *MeFollowersController { } } -func (*MeFollowersController) Fetch() { - // TODO +// MeFollowersFetchOptionals is a struct that represents the optional +// parameters for the Fetch method +type MeFollowersFetchOptionals struct { + Cursor string +} + +// Fetch loads the users that follow the logged in user +// Endpoint: [GET] /v1/me/boards/followers/ +func (mfc *MeFollowersController) Fetch(optionals *MeFollowersFetchOptionals) (*[]models.User, *models.Page, error) { + // Build request + response := new(models.Response) + response.Data = &[]models.User{} + request := mfc.wreckerClient.Get("/me/followers/"). + URLParam("fields", "first_name,id,last_name,url,account_type,bio,counts,created_at,image,username"). + Into(response) + if optionals.Cursor != "" { + request.URLParam("cursor", optionals.Cursor) + } + + // Execute request + resp, err := request.Execute() + + // Error from Wrecker + if err != nil { + return nil, nil, err + } + + // Status code + if !(resp.StatusCode >= 200 && resp.StatusCode < 300) { + return nil, nil, &models.PinterestError{ + StatusCode: resp.StatusCode, + Message: response.Message, + } + } + + // OK + return response.Data.(*[]models.User), &response.Page, nil }