Files
hanko/backend/handler/email_test.go
2023-04-11 16:41:12 +02:00

183 lines
4.9 KiB
Go

package handler
import (
"encoding/json"
"fmt"
"github.com/gofrs/uuid"
"github.com/labstack/echo/v4"
"github.com/lestrrat-go/jwx/v2/jwt"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/teamhanko/hanko/backend/config"
"github.com/teamhanko/hanko/backend/dto"
"github.com/teamhanko/hanko/backend/persistence/models"
"github.com/teamhanko/hanko/backend/test"
"net/http"
"net/http/httptest"
"testing"
)
func TestNewEmailHandler(t *testing.T) {
emailHandler, err := NewEmailHandler(&config.Config{}, test.NewPersister(nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil), sessionManager{}, test.NewAuditLogger())
assert.NoError(t, err)
assert.NotEmpty(t, emailHandler)
}
func TestEmailHandler_List(t *testing.T) {
var emails []*dto.EmailResponse
uId1, _ := uuid.NewV4()
uId2, _ := uuid.NewV4()
tests := []struct {
name string
userId uuid.UUID
data []models.Email
expectedCount int
}{
{
name: "should return all user assigned email addresses",
userId: uId1,
data: []models.Email{
{
UserID: &uId1,
Address: "john.doe+1@example.com",
},
{
UserID: &uId1,
Address: "john.doe+2@example.com",
},
{
UserID: &uId2,
Address: "john.doe+3@example.com",
},
},
expectedCount: 2,
},
{
name: "should return an empty list when the user has no email addresses assigned",
userId: uId2,
data: []models.Email{
{
UserID: &uId1,
Address: "john.doe+1@example.com",
},
{
UserID: &uId1,
Address: "john.doe+2@example.com",
},
},
expectedCount: 0,
},
}
for _, currentTest := range tests {
t.Run(currentTest.name, func(t *testing.T) {
e := echo.New()
e.Validator = dto.NewCustomValidator()
req := httptest.NewRequest(http.MethodGet, "/emails", nil)
req.Header.Set("Content-Type", "application/json")
rec := httptest.NewRecorder()
c := e.NewContext(req, rec)
token := jwt.New()
err := token.Set(jwt.SubjectKey, currentTest.userId.String())
require.NoError(t, err)
c.Set("session", token)
p := test.NewPersister(nil, nil, nil, nil, nil, nil, nil, currentTest.data, nil, nil, nil)
handler, err := NewEmailHandler(&config.Config{}, p, sessionManager{}, test.NewAuditLogger())
assert.NoError(t, err)
if assert.NoError(t, handler.List(c)) {
assert.Equal(t, http.StatusOK, rec.Code)
assert.NoError(t, json.Unmarshal(rec.Body.Bytes(), &emails))
assert.Equal(t, currentTest.expectedCount, len(emails))
}
})
}
}
func TestEmailHandler_SetPrimaryEmail(t *testing.T) {
uId, _ := uuid.NewV4()
emailId1, _ := uuid.NewV4()
emailId2, _ := uuid.NewV4()
testData := []models.User{
{
ID: uId,
Emails: []models.Email{
{
ID: emailId1,
Address: "john.doe@example.com",
PrimaryEmail: nil,
},
{
ID: emailId2,
Address: "john.doe@example.com",
PrimaryEmail: &models.PrimaryEmail{},
},
},
},
}
e := echo.New()
e.Validator = dto.NewCustomValidator()
req := httptest.NewRequest(http.MethodPost, fmt.Sprintf("/emails/%s/set_primary", emailId1.String()), nil)
req.Header.Set("Content-Type", "application/json")
rec := httptest.NewRecorder()
c := e.NewContext(req, rec)
c.SetPath("/emails/:id/set_primary")
c.SetParamNames("id")
c.SetParamValues(emailId1.String())
token := jwt.New()
err := token.Set(jwt.SubjectKey, uId.String())
require.NoError(t, err)
c.Set("session", token)
p := test.NewPersister(testData, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil)
handler, err := NewEmailHandler(&config.Config{}, p, sessionManager{}, test.NewAuditLogger())
assert.NoError(t, err)
assert.NoError(t, handler.SetPrimaryEmail(c))
assert.Equal(t, http.StatusNoContent, rec.Code)
}
func TestEmailHandler_Delete(t *testing.T) {
uId, _ := uuid.NewV4()
emailId1, _ := uuid.NewV4()
emailId2, _ := uuid.NewV4()
testData := []models.User{
{
ID: uId,
Emails: []models.Email{
{
ID: emailId1,
Address: "john.doe@example.com",
PrimaryEmail: nil,
},
{
ID: emailId2,
Address: "john.doe@example.com",
PrimaryEmail: &models.PrimaryEmail{},
},
},
},
}
e := echo.New()
e.Validator = dto.NewCustomValidator()
req := httptest.NewRequest(http.MethodDelete, "/", nil)
req.Header.Set("Content-Type", "application/json")
rec := httptest.NewRecorder()
c := e.NewContext(req, rec)
c.SetPath("/emails/:id")
c.SetParamNames("id")
c.SetParamValues(emailId1.String())
token := jwt.New()
err := token.Set(jwt.SubjectKey, uId.String())
require.NoError(t, err)
c.Set("session", token)
p := test.NewPersister(testData, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil)
handler, err := NewEmailHandler(&config.Config{}, p, sessionManager{}, test.NewAuditLogger())
assert.NoError(t, err)
assert.NoError(t, handler.Delete(c))
assert.Equal(t, http.StatusNoContent, rec.Code)
}