Skip to content

Commit

Permalink
feat: Only return api keys when creating a new user, tests for it and…
Browse files Browse the repository at this point in the history
… Create method returns a new user (to prepare for api keys generation)
  • Loading branch information
Knoblauchpilze committed Mar 31, 2024
1 parent 9f1ee78 commit 28f4ed1
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 18 deletions.
9 changes: 5 additions & 4 deletions cmd/users/internal/users.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,12 @@ func createUser(c echo.Context, repo repositories.UserRepository) error {
}

user := communication.FromUserDtoRequest(userDtoRequest)
err = repo.Create(c.Request().Context(), user)
created, err := repo.Create(c.Request().Context(), user)
if err != nil {
return c.JSON(http.StatusInternalServerError, err)
}

out := communication.ToUserDtoResponse(user)
out := communication.ToUserDtoResponse(created, true)
return c.JSON(http.StatusCreated, out)
}

Expand All @@ -74,7 +74,8 @@ func getUser(c echo.Context, repo repositories.UserRepository) error {
return c.JSON(http.StatusInternalServerError, err)
}

out := communication.ToUserDtoResponse(user)
out := communication.ToUserDtoResponse(user, false)

return c.JSON(http.StatusOK, out)
}

Expand Down Expand Up @@ -121,7 +122,7 @@ func updateUser(c echo.Context, repo repositories.UserRepository) error {
return c.JSON(http.StatusInternalServerError, err)
}

out := communication.ToUserDtoResponse(user)
out := communication.ToUserDtoResponse(user, false)
return c.JSON(http.StatusOK, out)
}

Expand Down
21 changes: 15 additions & 6 deletions cmd/users/internal/users_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ type mockDbConnection struct {
}

var defaultUuid = uuid.MustParse("08ce96a3-3430-48a8-a3b2-b1c987a207ca")
var defaultApiKey = uuid.MustParse("cc1742fa-77b4-4f5f-ac92-058c2e47a5d6")
var defaultUserRequest = communication.UserDtoRequest{
Email: "[email protected]",
Password: "password",
Expand All @@ -59,7 +60,7 @@ var defaultUser = persistence.User{
Id: defaultUuid,
Email: "[email protected]",
Password: "password",
ApiKeys: []uuid.UUID{},
ApiKeys: []uuid.UUID{defaultApiKey},
CreatedAt: time.Date(2009, 11, 17, 20, 34, 58, 651387237, time.UTC),
UpdatedAt: time.Date(2009, 11, 17, 20, 34, 59, 651387237, time.UTC),
}
Expand Down Expand Up @@ -128,9 +129,17 @@ func TestCreateUser_WhenRepositorySucceeds_ReturnsExpectedUser(t *testing.T) {

_, err := uuid.Parse(actual.Id.String())
assert.Nil(err)
assert.Equal(defaultUserRequest.Email, actual.Email)
assert.Equal(defaultUserRequest.Password, actual.Password)
assert.True(actual.CreatedAt.Before(time.Now()))

expected := communication.UserDtoResponse{
Id: defaultUuid,
Email: "[email protected]",
Password: "password",

ApiKeys: []uuid.UUID{defaultApiKey},

CreatedAt: time.Date(2009, 11, 17, 20, 34, 58, 651387237, time.UTC),
}
assert.Equal(expected, actual)
}

func TestCreateUser_WhenRepositorySucceeds_SavesExpectedUser(t *testing.T) {
Expand Down Expand Up @@ -697,10 +706,10 @@ func (m *mockContext) NoContent(status int) error {
return nil
}

func (m *mockUserRepository) Create(ctx context.Context, user persistence.User) error {
func (m *mockUserRepository) Create(ctx context.Context, user persistence.User) (persistence.User, error) {
m.createCalled++
m.createdUser = user
return m.err
return m.user, m.err
}

func (m *mockUserRepository) Get(ctx context.Context, id uuid.UUID) (persistence.User, error) {
Expand Down
4 changes: 2 additions & 2 deletions pkg/communication/user_dto.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ type UserDtoResponse struct {
CreatedAt time.Time
}

func ToUserDtoResponse(user persistence.User) UserDtoResponse {
func ToUserDtoResponse(user persistence.User, copyApiKeys bool) UserDtoResponse {
apiKeys := make([]uuid.UUID, 0)
if user.ApiKeys != nil {
if copyApiKeys && user.ApiKeys != nil {
apiKeys = user.ApiKeys
}

Expand Down
22 changes: 20 additions & 2 deletions pkg/communication/user_dto_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func TestToUserDtoResponse(t *testing.T) {
CreatedAt: someTime,
}

actual := ToUserDtoResponse(u)
actual := ToUserDtoResponse(u, true)

assert.Equal(defaultUuid, actual.Id)
assert.Equal("email", actual.Email)
Expand All @@ -48,7 +48,25 @@ func TestToUserDtoResponse_WhenApiKeysIsNull_OutptusAnEmptySlice(t *testing.T) {
CreatedAt: someTime,
}

actual := ToUserDtoResponse(u)
actual := ToUserDtoResponse(u, true)

assert.Equal([]uuid.UUID{}, actual.ApiKeys)
}

func TestToUserDtoResponse_WhenApiKeysIsValidButRequestedToNotPersisteThem_OutptusAnEmptySlice(t *testing.T) {
assert := assert.New(t)

u := persistence.User{
Id: defaultUuid,
Email: "email",
Password: "password",

ApiKeys: []uuid.UUID{defaultApiKey},

CreatedAt: someTime,
}

actual := ToUserDtoResponse(u, false)

assert.Equal([]uuid.UUID{}, actual.ApiKeys)
}
Expand Down
6 changes: 3 additions & 3 deletions pkg/repositories/user_repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (
)

type UserRepository interface {
Create(ctx context.Context, user persistence.User) error
Create(ctx context.Context, user persistence.User) (persistence.User, error)
Get(ctx context.Context, id uuid.UUID) (persistence.User, error)
List(ctx context.Context) ([]uuid.UUID, error)
Update(ctx context.Context, user persistence.User) (persistence.User, error)
Expand All @@ -29,9 +29,9 @@ func NewUserRepository(conn db.Connection) UserRepository {

const createUserSqlTemplate = "INSERT INTO api_user (id, email, password, created_at) VALUES($1, $2, $3, $4)"

func (r *userRepositoryImpl) Create(ctx context.Context, user persistence.User) error {
func (r *userRepositoryImpl) Create(ctx context.Context, user persistence.User) (persistence.User, error) {
_, err := r.conn.Exec(ctx, createUserSqlTemplate, user.Id, user.Email, user.Password, user.CreatedAt)
return err
return user, err
}

const getUserSqlTemplate = "SELECT id, email, password, created_at, updated_at, version FROM api_user WHERE id = $1"
Expand Down
14 changes: 13 additions & 1 deletion pkg/repositories/user_repository_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,11 +89,23 @@ func TestUserRepository_Create_PropagatesQueryFailure(t *testing.T) {
}
repo := NewUserRepository(mc)

err := repo.Create(context.Background(), defaultUser)
_, err := repo.Create(context.Background(), defaultUser)

assert.Equal(errDefault, err)
}

func TestUserRepository_Create_ReturnsInputUser(t *testing.T) {
assert := assert.New(t)

mc := &mockConnection{}
repo := NewUserRepository(mc)

actual, err := repo.Create(context.Background(), defaultUser)

assert.Nil(err)
assert.Equal(defaultUser, actual)
}

func TestUserRepository_Get_UsesConnectionToQuery(t *testing.T) {
assert := assert.New(t)

Expand Down

0 comments on commit 28f4ed1

Please sign in to comment.