package service_test import ( "context" "encoding/base64" "testing" "time" "gitea.dwysokinski.me/twhelp/sessions/internal/domain" "gitea.dwysokinski.me/twhelp/sessions/internal/service" "gitea.dwysokinski.me/twhelp/sessions/internal/service/internal/mock" "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestSession_CreateOrUpdate(t *testing.T) { t.Parallel() t.Run("OK", func(t *testing.T) { t.Parallel() params, err := domain.NewCreateSessionParams( "pl151", base64.StdEncoding.EncodeToString([]byte(uuid.NewString())), 111, ) require.NoError(t, err) repo := &mock.FakeSessionRepository{} repo.CreateOrUpdateCalls(func(ctx context.Context, params domain.CreateSessionParams) (domain.Session, error) { return domain.Session{ ID: 1111, UserID: params.UserID(), ServerKey: params.ServerKey(), SID: params.SID(), CreatedAt: time.Now(), UpdatedAt: time.Now(), }, nil }) userSvc := &mock.FakeUserGetter{} userSvc.GetReturns(domain.User{ ID: params.UserID(), }, nil) sess, err := service.NewSession(repo, userSvc).CreateOrUpdate(context.Background(), params) assert.NoError(t, err) assert.Greater(t, sess.ID, int64(0)) assert.Equal(t, params.UserID(), sess.UserID) assert.Equal(t, params.SID(), sess.SID) assert.Equal(t, params.ServerKey(), sess.ServerKey) assert.WithinDuration(t, time.Now(), sess.CreatedAt, 10*time.Millisecond) assert.WithinDuration(t, time.Now(), sess.UpdatedAt, 10*time.Millisecond) }) t.Run("ERR: user doesnt exist", func(t *testing.T) { t.Parallel() params, err := domain.NewCreateSessionParams( "pl151", base64.StdEncoding.EncodeToString([]byte(uuid.NewString())), 111, ) require.NoError(t, err) userSvc := &mock.FakeUserGetter{} userSvc.GetReturns(domain.User{}, domain.UserNotFoundError{ID: params.UserID()}) sess, err := service.NewSession(nil, userSvc).CreateOrUpdate(context.Background(), params) assert.ErrorIs(t, err, domain.UserDoesNotExistError{ID: params.UserID()}) assert.Zero(t, sess) }) }