func TestNewInvitationResponse(t *testing.T) { testInvitedUser := &accounts.User{ OauthUser: new(oauth.User), } testInvitedByUser := &accounts.User{ OauthUser: new(oauth.User), } testInvitation := &accounts.Invitation{ InvitedUser: testInvitedUser, InvitedByUser: testInvitedByUser, } // Create invitation response response, err := accounts.NewInvitationResponse(testInvitation) // Error should be nil assert.Nil(t, err) // Test self link selfLink, err := response.GetLink("self") if assert.Nil(t, err) { assert.Equal(t, fmt.Sprintf("/v1/invitations/%d", testInvitation.ID), selfLink.Href) } }
func (suite *AccountsTestSuite) TestConfirmInvitation() { var ( testOauthUser *oauth.User testUser *accounts.User testInvitation *accounts.Invitation err error ) // Insert a test user testOauthUser, err = suite.service.GetOauthService().CreateUser( roles.User, "harold@finch", "", // blank password ) assert.NoError(suite.T(), err, "Failed to insert a test oauth user") testUser, err = accounts.NewUser( suite.accounts[0], testOauthUser, "", //facebook ID false, // confirmed &accounts.UserRequest{ FirstName: "Harold", LastName: "Finch", }, ) assert.NoError(suite.T(), err, "Failed to create a new user object") err = suite.db.Create(testUser).Error assert.NoError(suite.T(), err, "Failed to insert a test user") testUser.Account = suite.accounts[0] testUser.OauthUser = testOauthUser // Insert a test invitation testInvitation, err = accounts.NewInvitation( testUser, suite.users[0], suite.cnf.AppSpecific.InvitationLifetime, ) assert.NoError(suite.T(), err, "Failed to create a new invitation object") err = suite.db.Create(testInvitation).Error assert.NoError(suite.T(), err, "Failed to insert a test invitation") testInvitation.InvitedUser = testUser testInvitation.InvitedByUser = suite.users[0] // Prepare a request payload, err := json.Marshal(&accounts.ConfirmInvitationRequest{ PasswordRequest: accounts.PasswordRequest{Password: "******"}, }) assert.NoError(suite.T(), err, "JSON marshalling failed") r, err := http.NewRequest( "POST", fmt.Sprintf("http://1.2.3.4/v1/invitations/%s", testInvitation.Reference), bytes.NewBuffer(payload), ) assert.NoError(suite.T(), err, "Request setup should not get an error") r.Header.Set( "Authorization", fmt.Sprintf( "Basic %s", b64.StdEncoding.EncodeToString([]byte("test_client_1:test_secret")), ), ) // Check the routing match := new(mux.RouteMatch) suite.router.Match(r, match) if assert.NotNil(suite.T(), match.Route) { assert.Equal(suite.T(), "confirm_invitation", match.Route.GetName()) } // Count before var countBefore int suite.db.Model(new(accounts.Invitation)).Count(&countBefore) // And serve the request w := httptest.NewRecorder() suite.router.ServeHTTP(w, r) // Count after var countAfter int suite.db.Model(new(accounts.Invitation)).Count(&countAfter) assert.Equal(suite.T(), countBefore-1, countAfter) // Fetch the updated user user := new(accounts.User) notFound := accounts.UserPreload(suite.db).First(user, testUser.ID).RecordNotFound() assert.False(suite.T(), notFound) // Invitation should have been soft deleted assert.True(suite.T(), suite.db.First(new(accounts.Invitation), testInvitation.ID).RecordNotFound()) // And correct data was saved assert.Nil(suite.T(), pass.VerifyPassword(user.OauthUser.Password.String, "test_password")) // Check the response expected, err := accounts.NewInvitationResponse(testInvitation) assert.NoError(suite.T(), err, "Failed to create expected response object") testutil.TestResponseObject(suite.T(), w, expected, 200) }
func (suite *AccountsTestSuite) TestInviteUser() { // Prepare a request payload, err := json.Marshal(&accounts.InvitationRequest{ Email: "john@reese", }) assert.NoError(suite.T(), err, "JSON marshalling failed") r, err := http.NewRequest( "POST", "http://1.2.3.4/v1/invitations", bytes.NewBuffer(payload), ) assert.NoError(suite.T(), err, "Request setup should not get an error") r.Header.Set("Authorization", "Bearer test_user_token") suite.service.WaitForNotifications(1) // Mock invitation email suite.mockInvitationEmail() // Check the routing match := new(mux.RouteMatch) suite.router.Match(r, match) if assert.NotNil(suite.T(), match.Route) { assert.Equal(suite.T(), "invite_user", match.Route.GetName()) } // Count before var ( countBefore int invitationsCountBefore int ) suite.db.Model(new(accounts.User)).Count(&countBefore) suite.db.Model(new(accounts.Invitation)).Count(&invitationsCountBefore) // And serve the request w := httptest.NewRecorder() suite.router.ServeHTTP(w, r) // Count after var ( countAfter int invitationsCountAfter int ) suite.db.Model(new(accounts.User)).Count(&countAfter) suite.db.Model(new(accounts.Invitation)).Count(&invitationsCountAfter) assert.Equal(suite.T(), countBefore+1, countAfter) assert.Equal(suite.T(), invitationsCountBefore+1, invitationsCountAfter) // Fetch the created invitation invitation := new(accounts.Invitation) assert.False(suite.T(), accounts.InvitationPreload(suite.db). Last(invitation).RecordNotFound()) // And correct data was saved assert.Equal(suite.T(), invitation.InvitedUser.ID, invitation.InvitedUser.OauthUser.MetaUserID) assert.Equal(suite.T(), "john@reese", invitation.InvitedUser.OauthUser.Username) assert.False(suite.T(), invitation.InvitedUser.OauthUser.Password.Valid) assert.Equal(suite.T(), roles.User, invitation.InvitedUser.OauthUser.RoleID.String) assert.Equal(suite.T(), "test@user", invitation.InvitedByUser.OauthUser.Username) // Check the response expected, err := accounts.NewInvitationResponse(invitation) assert.NoError(suite.T(), err, "Failed to create expected response object") testutil.TestResponseObject(suite.T(), w, expected, 201) // block until email goroutine has finished assert.True(suite.T(), <-suite.service.GetNotifications(), "The email goroutine should have run") // Check that the mock object expectations were met suite.assertMockExpectations() }