diff --git a/incognia.go b/incognia.go index 20db323..706d3a8 100644 --- a/incognia.go +++ b/incognia.go @@ -78,6 +78,8 @@ type Login struct { type FeedbackIdentifiers struct { InstallationID string + SessionToken string + RequestToken string LoginID string PaymentID string SignupID string @@ -241,10 +243,20 @@ func (c *Client) RegisterFeedback(feedbackEvent FeedbackType, occurredAt *time.T } }() - return c.registerFeedback(feedbackEvent, occurredAt, feedbackIdentifiers) + return c.registerFeedback(feedbackEvent, occurredAt, nil, feedbackIdentifiers) } -func (c *Client) registerFeedback(feedbackEvent FeedbackType, occurredAt *time.Time, feedbackIdentifiers *FeedbackIdentifiers) (err error) { +func (c *Client) RegisterFeedbackWithExpiration(feedbackEvent FeedbackType, occurredAt *time.Time, expiresAt *time.Time, feedbackIdentifiers *FeedbackIdentifiers) (err error) { + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("%v", r) + } + }() + + return c.registerFeedback(feedbackEvent, occurredAt, expiresAt, feedbackIdentifiers) +} + +func (c *Client) registerFeedback(feedbackEvent FeedbackType, occurredAt *time.Time, expiresAt *time.Time, feedbackIdentifiers *FeedbackIdentifiers) (err error) { if !isValidFeedbackType(feedbackEvent) { return ErrInvalidFeedbackType } @@ -252,9 +264,12 @@ func (c *Client) registerFeedback(feedbackEvent FeedbackType, occurredAt *time.T requestBody := postFeedbackRequestBody{ Event: feedbackEvent, OccurredAt: occurredAt, + ExpiresAt: expiresAt, } if feedbackIdentifiers != nil { requestBody.InstallationID = feedbackIdentifiers.InstallationID + requestBody.SessionToken = feedbackIdentifiers.SessionToken + requestBody.RequestToken = feedbackIdentifiers.RequestToken requestBody.LoginID = feedbackIdentifiers.LoginID requestBody.PaymentID = feedbackIdentifiers.PaymentID requestBody.SignupID = feedbackIdentifiers.SignupID diff --git a/incognia_test.go b/incognia_test.go index 1ca7d11..bad8ac0 100644 --- a/incognia_test.go +++ b/incognia_test.go @@ -22,6 +22,7 @@ const ( var ( now = time.Now() + nowMinusSeconds = now.Add(-1 * time.Second) installationId = "installation-id" sessionToken = "session-token" shouldEval bool = true @@ -111,6 +112,21 @@ var ( Event: SignupAccepted, OccurredAt: &now, InstallationID: "some-installation-id", + SessionToken: "some-session-token", + RequestToken: "some-request-token", + LoginID: "some-login-id", + PaymentID: "some-payment-id", + SignupID: "some-signup-id", + AccountID: "some-account-id", + ExternalID: "some-external-id", + } + postFeedbackRequestWithExpirationBodyFixture = &postFeedbackRequestBody{ + Event: SignupAccepted, + OccurredAt: &now, + ExpiresAt: &nowMinusSeconds, + InstallationID: "some-installation-id", + SessionToken: "some-session-token", + RequestToken: "some-request-token", LoginID: "some-login-id", PaymentID: "some-payment-id", SignupID: "some-signup-id", @@ -122,6 +138,8 @@ var ( } feedbackIdentifiersFixture = &FeedbackIdentifiers{ InstallationID: "some-installation-id", + SessionToken: "some-session-token", + RequestToken: "some-request-token", LoginID: "some-login-id", PaymentID: "some-payment-id", SignupID: "some-signup-id", @@ -681,6 +699,63 @@ func (suite *IncogniaTestSuite) TestErrorsRegisterFeedback() { } } +func (suite *IncogniaTestSuite) TestSuccessRegisterFeedbackWithExpiration() { + feedbackServer := suite.mockFeedbackEndpoint(token, postFeedbackRequestWithExpirationBodyFixture) + defer feedbackServer.Close() + + err := suite.client.RegisterFeedbackWithExpiration(postFeedbackRequestWithExpirationBodyFixture.Event, postFeedbackRequestWithExpirationBodyFixture.OccurredAt, postFeedbackRequestWithExpirationBodyFixture.ExpiresAt, feedbackIdentifiersFixture) + suite.NoError(err) +} + +func (suite *IncogniaTestSuite) TestSuccessRegisterFeedbackWithExpirationNilOptional() { + feedbackServer := suite.mockFeedbackEndpoint(token, postFeedbackRequestBodyRequiredFieldsFixture) + defer feedbackServer.Close() + + err := suite.client.RegisterFeedbackWithExpiration(postFeedbackRequestBodyRequiredFieldsFixture.Event, nil, nil, nil) + suite.NoError(err) +} + +func (suite *IncogniaTestSuite) TestSuccessRegisterFeedbackWithExpirationAfterTokenExpiration() { + feedbackServer := suite.mockFeedbackEndpoint(token, postFeedbackRequestWithExpirationBodyFixture) + defer feedbackServer.Close() + + err := suite.client.RegisterFeedbackWithExpiration(postFeedbackRequestWithExpirationBodyFixture.Event, postFeedbackRequestWithExpirationBodyFixture.OccurredAt, postFeedbackRequestWithExpirationBodyFixture.ExpiresAt, feedbackIdentifiersFixture) + suite.NoError(err) + + token, _ := suite.client.tokenProvider.GetToken() + token.(*accessToken).ExpiresIn = 0 + + err = suite.client.RegisterFeedbackWithExpiration(postFeedbackRequestWithExpirationBodyFixture.Event, postFeedbackRequestWithExpirationBodyFixture.OccurredAt, postFeedbackRequestWithExpirationBodyFixture.ExpiresAt, feedbackIdentifiersFixture) + suite.NoError(err) +} + +func (suite *IncogniaTestSuite) TestForbiddenRegisterFeedbackWithExpiration() { + feedbackServer := suite.mockFeedbackEndpoint("some-other-token", postFeedbackRequestWithExpirationBodyFixture) + defer feedbackServer.Close() + + err := suite.client.RegisterFeedbackWithExpiration(postFeedbackRequestWithExpirationBodyFixture.Event, postFeedbackRequestWithExpirationBodyFixture.OccurredAt, postFeedbackRequestWithExpirationBodyFixture.ExpiresAt, feedbackIdentifiersFixture) + suite.EqualError(err, "403 Forbidden") +} + +func (suite *IncogniaTestSuite) TestErrorRegisterFeedbackWithExpirationInvalidFeedbackType() { + feedbackServer := suite.mockFeedbackEndpoint(token, postFeedbackRequestWithExpirationBodyFixture) + defer feedbackServer.Close() + + err := suite.client.RegisterFeedbackWithExpiration("invalid-type", postFeedbackRequestWithExpirationBodyFixture.OccurredAt, postFeedbackRequestWithExpirationBodyFixture.ExpiresAt, feedbackIdentifiersFixture) + suite.EqualError(err, ErrInvalidFeedbackType.Error()) +} + +func (suite *IncogniaTestSuite) TestErrorsRegisterFeedbackWithExpiration() { + errors := []int{http.StatusBadRequest, http.StatusInternalServerError} + for _, status := range errors { + statusServer := mockStatusServer(status) + suite.client.endpoints.Feedback = statusServer.URL + + err := suite.client.RegisterFeedbackWithExpiration(postFeedbackRequestWithExpirationBodyFixture.Event, postFeedbackRequestWithExpirationBodyFixture.OccurredAt, postFeedbackRequestWithExpirationBodyFixture.ExpiresAt, feedbackIdentifiersFixture) + suite.Contains(err.Error(), strconv.Itoa(status)) + } +} + func (suite *IncogniaTestSuite) TestSuccessRegisterPayment() { transactionServer := suite.mockPostTransactionsEndpoint(token, postPaymentRequestBodyFixture, transactionAssessmentFixture, emptyQueryString) defer transactionServer.Close() diff --git a/request_types.go b/request_types.go index cff92fc..16fee52 100644 --- a/request_types.go +++ b/request_types.go @@ -60,7 +60,10 @@ const ( type postFeedbackRequestBody struct { Event FeedbackType `json:"event"` OccurredAt *time.Time `json:"occurred_at,omitempty"` + ExpiresAt *time.Time `json:"expires_at,omitempty"` InstallationID string `json:"installation_id,omitempty"` + SessionToken string `json:"session_token,omitempty"` + RequestToken string `json:"request_token,omitempty"` LoginID string `json:"login_id,omitempty"` PaymentID string `json:"payment_id,omitempty"` SignupID string `json:"signup_id,omitempty"`