From 41c511471d55314f49fa7d1465ba43e39be7949b Mon Sep 17 00:00:00 2001 From: FromSi Date: Tue, 5 Nov 2024 19:19:30 +0500 Subject: [PATCH] update: repository --- api/swagger.yaml | 4 +-- internal/http/requests/devices.go | 2 +- internal/http/requests/login.go | 2 +- internal/http/requests/logout.go | 3 +- internal/http/requests/logout_all.go | 2 +- internal/http/requests/logout_device.go | 2 +- .../http/requests/password_reset_with_old.go | 2 +- .../requests/password_reset_with_token.go | 2 +- internal/http/requests/refresh.go | 2 +- internal/http/requests/register.go | 2 +- internal/http/requests/send_reset_token.go | 2 +- internal/http/responses/success_devices.go | 4 +-- .../http/responses/success_devices_test.go | 2 +- internal/http/routes/devices.go | 22 ++++++++++----- internal/http/routes/logout.go | 26 ++++++++++++----- internal/http/routes/logout_all.go | 26 ++++++++++++----- internal/http/routes/logout_device.go | 28 +++++++++++++------ internal/http/routes/register.go | 8 ------ .../repositories/mock_device_repository.go | 14 ++++++++++ .../mock_mutable_device_repository.go | 14 ++++++++++ internal/repositories/device.go | 1 + internal/repositories/gorm_device.go | 5 ++++ internal/repositories/gorm_device_test.go | 27 ++++++++++++++++++ 23 files changed, 149 insertions(+), 53 deletions(-) diff --git a/api/swagger.yaml b/api/swagger.yaml index 2352bc4..f2ec8e7 100644 --- a/api/swagger.yaml +++ b/api/swagger.yaml @@ -330,7 +330,7 @@ paths: required: - uuid - userUUID - - agent + - userAgent - ip - expiredAt - createdAt @@ -344,7 +344,7 @@ paths: type: string format: uuid example: '09d0ce56-33ab-4fce-90bb-d2b4d6d844ba' - agent: + userAgent: type: string format: text example: 'Mozilla/5.0 (X11; Linux x86_64; rv:121.0)' diff --git a/internal/http/requests/devices.go b/internal/http/requests/devices.go index 2cf07f8..162d5eb 100644 --- a/internal/http/requests/devices.go +++ b/internal/http/requests/devices.go @@ -28,7 +28,7 @@ type DevicesRequestBody struct{} func NewDevicesRequestBody(context *gin.Context) (*DevicesRequestBody, *responses.ErrorBadRequestResponse) { var requestBody DevicesRequestBody - if err := context.ShouldBindJSON(&requestBody); err != nil { + if err := context.ShouldBindJSON(&requestBody); err != nil && err.Error() != "EOF" { return nil, responses.NewErrorBadRequestResponseByError(err) } diff --git a/internal/http/requests/login.go b/internal/http/requests/login.go index 79a9df8..e202a6f 100644 --- a/internal/http/requests/login.go +++ b/internal/http/requests/login.go @@ -41,7 +41,7 @@ type LoginRequestBody struct { func NewLoginRequestBody(context *gin.Context) (*LoginRequestBody, *responses.ErrorBadRequestResponse) { var requestBody LoginRequestBody - if err := context.ShouldBindJSON(&requestBody); err != nil { + if err := context.ShouldBindJSON(&requestBody); err != nil && err.Error() != "EOF" { return nil, responses.NewErrorBadRequestResponseByError(err) } diff --git a/internal/http/requests/logout.go b/internal/http/requests/logout.go index 169037f..c0c29c4 100644 --- a/internal/http/requests/logout.go +++ b/internal/http/requests/logout.go @@ -28,7 +28,8 @@ type LogoutRequestBody struct{} func NewLogoutRequestBody(context *gin.Context) (*LogoutRequestBody, *responses.ErrorBadRequestResponse) { var requestBody LogoutRequestBody - if err := context.ShouldBindJSON(&requestBody); err != nil { + if err := context.ShouldBindJSON(&requestBody); err != nil && err.Error() != "EOF" { + println(err.Error()) return nil, responses.NewErrorBadRequestResponseByError(err) } diff --git a/internal/http/requests/logout_all.go b/internal/http/requests/logout_all.go index c863053..518ef51 100644 --- a/internal/http/requests/logout_all.go +++ b/internal/http/requests/logout_all.go @@ -28,7 +28,7 @@ type LogoutAllRequestBody struct{} func NewLogoutAllRequestBody(context *gin.Context) (*LogoutAllRequestBody, *responses.ErrorBadRequestResponse) { var requestBody LogoutAllRequestBody - if err := context.ShouldBindJSON(&requestBody); err != nil { + if err := context.ShouldBindJSON(&requestBody); err != nil && err.Error() != "EOF" { return nil, responses.NewErrorBadRequestResponseByError(err) } diff --git a/internal/http/requests/logout_device.go b/internal/http/requests/logout_device.go index e1ae8a7..02daa3b 100644 --- a/internal/http/requests/logout_device.go +++ b/internal/http/requests/logout_device.go @@ -30,7 +30,7 @@ type LogoutDeviceRequestBody struct { func NewLogoutDeviceRequestBody(context *gin.Context) (*LogoutDeviceRequestBody, *responses.ErrorBadRequestResponse) { var requestBody LogoutDeviceRequestBody - if err := context.ShouldBindJSON(&requestBody); err != nil { + if err := context.ShouldBindJSON(&requestBody); err != nil && err.Error() != "EOF" { return nil, responses.NewErrorBadRequestResponseByError(err) } diff --git a/internal/http/requests/password_reset_with_old.go b/internal/http/requests/password_reset_with_old.go index f9647c6..40995f8 100644 --- a/internal/http/requests/password_reset_with_old.go +++ b/internal/http/requests/password_reset_with_old.go @@ -31,7 +31,7 @@ type PasswordResetWithOldRequestBody struct { func NewPasswordResetWithOldRequestBody(context *gin.Context) (*PasswordResetWithOldRequestBody, *responses.ErrorBadRequestResponse) { var requestBody PasswordResetWithOldRequestBody - if err := context.ShouldBindJSON(&requestBody); err != nil { + if err := context.ShouldBindJSON(&requestBody); err != nil && err.Error() != "EOF" { return nil, responses.NewErrorBadRequestResponseByError(err) } diff --git a/internal/http/requests/password_reset_with_token.go b/internal/http/requests/password_reset_with_token.go index 067ea23..405415d 100644 --- a/internal/http/requests/password_reset_with_token.go +++ b/internal/http/requests/password_reset_with_token.go @@ -31,7 +31,7 @@ type PasswordResetWithTokenRequestBody struct { func NewPasswordResetWithTokenRequestBody(context *gin.Context) (*PasswordResetWithTokenRequestBody, *responses.ErrorBadRequestResponse) { var requestBody PasswordResetWithTokenRequestBody - if err := context.ShouldBindJSON(&requestBody); err != nil { + if err := context.ShouldBindJSON(&requestBody); err != nil && err.Error() != "EOF" { return nil, responses.NewErrorBadRequestResponseByError(err) } diff --git a/internal/http/requests/refresh.go b/internal/http/requests/refresh.go index a3d3ed2..9d17954 100644 --- a/internal/http/requests/refresh.go +++ b/internal/http/requests/refresh.go @@ -30,7 +30,7 @@ type RefreshRequestBody struct { func NewRefreshRequestBody(context *gin.Context) (*RefreshRequestBody, *responses.ErrorBadRequestResponse) { var requestBody RefreshRequestBody - if err := context.ShouldBindJSON(&requestBody); err != nil { + if err := context.ShouldBindJSON(&requestBody); err != nil && err.Error() != "EOF" { return nil, responses.NewErrorBadRequestResponseByError(err) } diff --git a/internal/http/requests/register.go b/internal/http/requests/register.go index ae31c22..f2c9a0a 100644 --- a/internal/http/requests/register.go +++ b/internal/http/requests/register.go @@ -41,7 +41,7 @@ type RegisterRequestBody struct { func NewRegisterRequestBody(context *gin.Context) (*RegisterRequestBody, *responses.ErrorBadRequestResponse) { var requestBody RegisterRequestBody - if err := context.ShouldBindJSON(&requestBody); err != nil { + if err := context.ShouldBindJSON(&requestBody); err != nil && err.Error() != "EOF" { return nil, responses.NewErrorBadRequestResponseByError(err) } diff --git a/internal/http/requests/send_reset_token.go b/internal/http/requests/send_reset_token.go index c83d012..3a8a8cb 100644 --- a/internal/http/requests/send_reset_token.go +++ b/internal/http/requests/send_reset_token.go @@ -30,7 +30,7 @@ type SendResetTokenRequestBody struct { func NewSendResetTokenRequestBody(context *gin.Context) (*SendResetTokenRequestBody, *responses.ErrorBadRequestResponse) { var requestBody SendResetTokenRequestBody - if err := context.ShouldBindJSON(&requestBody); err != nil { + if err := context.ShouldBindJSON(&requestBody); err != nil && err.Error() != "EOF" { return nil, responses.NewErrorBadRequestResponseByError(err) } diff --git a/internal/http/responses/success_devices.go b/internal/http/responses/success_devices.go index d92142c..32921b6 100644 --- a/internal/http/responses/success_devices.go +++ b/internal/http/responses/success_devices.go @@ -9,7 +9,7 @@ type SuccessDevicesResponse struct { type SuccessDevicesResponseData struct { UUID string `json:"uuid"` UserUUID string `json:"userUUID"` - Agent string `json:"agent"` + UserAgent string `json:"userAgent"` Ip string `json:"ip"` ExpiredAt int `json:"expiredAt"` CreatedAt int `json:"createdAt"` @@ -23,7 +23,7 @@ func NewSuccessDevicesResponse(devices []repositories.Device) *SuccessDevicesRes data[i] = SuccessDevicesResponseData{ UUID: device.GetUUID(), UserUUID: device.GetUserUUID(), - Agent: device.GetUserAgent(), + UserAgent: device.GetUserAgent(), Ip: device.GetIp(), ExpiredAt: device.GetExpiredAt(), CreatedAt: device.GetCreatedAt(), diff --git a/internal/http/responses/success_devices_test.go b/internal/http/responses/success_devices_test.go index 85e3d15..08163ac 100644 --- a/internal/http/responses/success_devices_test.go +++ b/internal/http/responses/success_devices_test.go @@ -31,7 +31,7 @@ func Test_NewSuccessDevicesResponse(t *testing.T) { assert.Nil(t, err) - expected := `{"data":[{"uuid":"1","userUUID":"2","agent":"3","ip":"4","expiredAt":6,"createdAt":7,"updatedAt":8}]}` + expected := `{"data":[{"uuid":"1","userUUID":"2","userAgent":"3","ip":"4","expiredAt":6,"createdAt":7,"updatedAt":8}]}` assert.Equal(t, string(responseToJson), expected) } diff --git a/internal/http/routes/devices.go b/internal/http/routes/devices.go index 92a8961..f3fc7ad 100644 --- a/internal/http/routes/devices.go +++ b/internal/http/routes/devices.go @@ -1,20 +1,26 @@ package routes import ( - "fmt" "github.com/fromsi/jwt-oauth-sso/internal/configs" "github.com/fromsi/jwt-oauth-sso/internal/http/requests" + "github.com/fromsi/jwt-oauth-sso/internal/http/responses" + "github.com/fromsi/jwt-oauth-sso/internal/repositories" "github.com/gin-gonic/gin" "net/http" ) type DevicesRoute struct { - config configs.TokenConfig + config configs.TokenConfig + deviceRepository repositories.DeviceRepository } -func NewDevicesRoute(config configs.TokenConfig) *DevicesRoute { +func NewDevicesRoute( + config configs.TokenConfig, + deviceRepository repositories.DeviceRepository, +) *DevicesRoute { return &DevicesRoute{ - config: config, + config: config, + deviceRepository: deviceRepository, } } @@ -27,7 +33,7 @@ func (receiver DevicesRoute) Pattern() string { } func (receiver DevicesRoute) Handle(context *gin.Context) { - _, err := requests.NewBearerAuthRequestHeader(context, receiver.config) + headers, err := requests.NewBearerAuthRequestHeader(context, receiver.config) if err != nil { context.Status(http.StatusUnauthorized) @@ -43,7 +49,9 @@ func (receiver DevicesRoute) Handle(context *gin.Context) { return } - fmt.Println(map[string]any{}) + devices := receiver.deviceRepository.GetDevicesByUserUUID(headers.AccessToken.Subject) - context.JSON(http.StatusOK, map[string]string{"message": "Hello"}) + response := responses.NewSuccessDevicesResponse(devices) + + context.JSON(http.StatusOK, response) } diff --git a/internal/http/routes/logout.go b/internal/http/routes/logout.go index 5e9ef4e..2b78a5d 100644 --- a/internal/http/routes/logout.go +++ b/internal/http/routes/logout.go @@ -1,20 +1,26 @@ package routes import ( - "fmt" "github.com/fromsi/jwt-oauth-sso/internal/configs" "github.com/fromsi/jwt-oauth-sso/internal/http/requests" + "github.com/fromsi/jwt-oauth-sso/internal/http/responses" + "github.com/fromsi/jwt-oauth-sso/internal/repositories" "github.com/gin-gonic/gin" "net/http" ) type LogoutRoute struct { - config configs.TokenConfig + config configs.TokenConfig + deviceRepository repositories.DeviceRepository } -func NewLogoutRoute(config configs.TokenConfig) *LogoutRoute { +func NewLogoutRoute( + config configs.TokenConfig, + deviceRepository repositories.DeviceRepository, +) *LogoutRoute { return &LogoutRoute{ - config: config, + config: config, + deviceRepository: deviceRepository, } } @@ -27,7 +33,7 @@ func (receiver LogoutRoute) Pattern() string { } func (receiver LogoutRoute) Handle(context *gin.Context) { - _, err := requests.NewBearerAuthRequestHeader(context, receiver.config) + headers, err := requests.NewBearerAuthRequestHeader(context, receiver.config) if err != nil { context.Status(http.StatusUnauthorized) @@ -43,7 +49,13 @@ func (receiver LogoutRoute) Handle(context *gin.Context) { return } - fmt.Println(map[string]any{}) + err = receiver.deviceRepository.DeleteDeviceByUUID(headers.AccessToken.DeviceUUID) - context.Status(http.StatusContinue) + if err != nil { + context.JSON(http.StatusInternalServerError, responses.NewErrorInternalServerResponse(err)) + + return + } + + context.Status(http.StatusAccepted) } diff --git a/internal/http/routes/logout_all.go b/internal/http/routes/logout_all.go index 7c69a0b..6249e6e 100644 --- a/internal/http/routes/logout_all.go +++ b/internal/http/routes/logout_all.go @@ -1,20 +1,26 @@ package routes import ( - "fmt" "github.com/fromsi/jwt-oauth-sso/internal/configs" "github.com/fromsi/jwt-oauth-sso/internal/http/requests" + "github.com/fromsi/jwt-oauth-sso/internal/http/responses" + "github.com/fromsi/jwt-oauth-sso/internal/repositories" "github.com/gin-gonic/gin" "net/http" ) type LogoutAllRoute struct { - config configs.TokenConfig + config configs.TokenConfig + deviceRepository repositories.DeviceRepository } -func NewLogoutAllRoute(config configs.TokenConfig) *LogoutAllRoute { +func NewLogoutAllRoute( + config configs.TokenConfig, + deviceRepository repositories.DeviceRepository, +) *LogoutAllRoute { return &LogoutAllRoute{ - config: config, + config: config, + deviceRepository: deviceRepository, } } @@ -27,7 +33,7 @@ func (receiver LogoutAllRoute) Pattern() string { } func (receiver LogoutAllRoute) Handle(context *gin.Context) { - _, err := requests.NewBearerAuthRequestHeader(context, receiver.config) + headers, err := requests.NewBearerAuthRequestHeader(context, receiver.config) if err != nil { context.Status(http.StatusUnauthorized) @@ -43,7 +49,13 @@ func (receiver LogoutAllRoute) Handle(context *gin.Context) { return } - fmt.Println(map[string]any{}) + err = receiver.deviceRepository.DeleteAllDevicesByUserUUID(headers.AccessToken.Subject) - context.Status(http.StatusContinue) + if err != nil { + context.JSON(http.StatusInternalServerError, responses.NewErrorInternalServerResponse(err)) + + return + } + + context.Status(http.StatusAccepted) } diff --git a/internal/http/routes/logout_device.go b/internal/http/routes/logout_device.go index cd41bca..12af507 100644 --- a/internal/http/routes/logout_device.go +++ b/internal/http/routes/logout_device.go @@ -1,20 +1,26 @@ package routes import ( - "fmt" "github.com/fromsi/jwt-oauth-sso/internal/configs" "github.com/fromsi/jwt-oauth-sso/internal/http/requests" + "github.com/fromsi/jwt-oauth-sso/internal/http/responses" + "github.com/fromsi/jwt-oauth-sso/internal/repositories" "github.com/gin-gonic/gin" "net/http" ) type LogoutDeviceRoute struct { - config configs.TokenConfig + config configs.TokenConfig + deviceRepository repositories.DeviceRepository } -func NewLogoutDeviceRoute(config configs.TokenConfig) *LogoutDeviceRoute { +func NewLogoutDeviceRoute( + config configs.TokenConfig, + deviceRepository repositories.DeviceRepository, +) *LogoutDeviceRoute { return &LogoutDeviceRoute{ - config: config, + config: config, + deviceRepository: deviceRepository, } } @@ -27,7 +33,7 @@ func (receiver LogoutDeviceRoute) Pattern() string { } func (receiver LogoutDeviceRoute) Handle(context *gin.Context) { - _, err := requests.NewBearerAuthRequestHeader(context, receiver.config) + headers, err := requests.NewBearerAuthRequestHeader(context, receiver.config) if err != nil { context.Status(http.StatusUnauthorized) @@ -43,9 +49,13 @@ func (receiver LogoutDeviceRoute) Handle(context *gin.Context) { return } - fmt.Println(map[string]any{ - "device_uuid": request.Body.DeviceUUID, - }) + err = receiver.deviceRepository.DeleteDeviceByUUIDAndUserUUID(request.Body.DeviceUUID, headers.AccessToken.Subject) - context.Status(http.StatusContinue) + if err != nil { + context.JSON(http.StatusInternalServerError, responses.NewErrorInternalServerResponse(err)) + + return + } + + context.Status(http.StatusAccepted) } diff --git a/internal/http/routes/register.go b/internal/http/routes/register.go index 78588d2..b163af4 100644 --- a/internal/http/routes/register.go +++ b/internal/http/routes/register.go @@ -83,14 +83,6 @@ func (receiver RegisterRoute) Handle(context *gin.Context) { return } - err = receiver.deviceRepository.CreateDevice(device) - - if err != nil { - context.JSON(http.StatusInternalServerError, responses.NewErrorInternalServerResponse(err)) - - return - } - response, err := responses.NewSuccessRegisterResponse(receiver.config, device) if err != nil { diff --git a/internal/mocks/repositories/mock_device_repository.go b/internal/mocks/repositories/mock_device_repository.go index daa022f..25d3a21 100644 --- a/internal/mocks/repositories/mock_device_repository.go +++ b/internal/mocks/repositories/mock_device_repository.go @@ -82,6 +82,20 @@ func (mr *MockDeviceRepositoryMockRecorder) DeleteDeviceByUUID(arg0 any) *gomock return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteDeviceByUUID", reflect.TypeOf((*MockDeviceRepository)(nil).DeleteDeviceByUUID), arg0) } +// DeleteDeviceByUUIDAndUserUUID mocks base method. +func (m *MockDeviceRepository) DeleteDeviceByUUIDAndUserUUID(arg0, arg1 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteDeviceByUUIDAndUserUUID", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeleteDeviceByUUIDAndUserUUID indicates an expected call of DeleteDeviceByUUIDAndUserUUID. +func (mr *MockDeviceRepositoryMockRecorder) DeleteDeviceByUUIDAndUserUUID(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteDeviceByUUIDAndUserUUID", reflect.TypeOf((*MockDeviceRepository)(nil).DeleteDeviceByUUIDAndUserUUID), arg0, arg1) +} + // GetDeviceByRefreshToken mocks base method. func (m *MockDeviceRepository) GetDeviceByRefreshToken(arg0 string) repositories.Device { m.ctrl.T.Helper() diff --git a/internal/mocks/repositories/mock_mutable_device_repository.go b/internal/mocks/repositories/mock_mutable_device_repository.go index fb3f460..02c95e0 100644 --- a/internal/mocks/repositories/mock_mutable_device_repository.go +++ b/internal/mocks/repositories/mock_mutable_device_repository.go @@ -82,6 +82,20 @@ func (mr *MockMutableDeviceRepositoryMockRecorder) DeleteDeviceByUUID(arg0 any) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteDeviceByUUID", reflect.TypeOf((*MockMutableDeviceRepository)(nil).DeleteDeviceByUUID), arg0) } +// DeleteDeviceByUUIDAndUserUUID mocks base method. +func (m *MockMutableDeviceRepository) DeleteDeviceByUUIDAndUserUUID(arg0, arg1 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteDeviceByUUIDAndUserUUID", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeleteDeviceByUUIDAndUserUUID indicates an expected call of DeleteDeviceByUUIDAndUserUUID. +func (mr *MockMutableDeviceRepositoryMockRecorder) DeleteDeviceByUUIDAndUserUUID(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteDeviceByUUIDAndUserUUID", reflect.TypeOf((*MockMutableDeviceRepository)(nil).DeleteDeviceByUUIDAndUserUUID), arg0, arg1) +} + // UpdateDevice mocks base method. func (m *MockMutableDeviceRepository) UpdateDevice(arg0 repositories.Device) error { m.ctrl.T.Helper() diff --git a/internal/repositories/device.go b/internal/repositories/device.go index 1140fb6..4effb12 100644 --- a/internal/repositories/device.go +++ b/internal/repositories/device.go @@ -17,6 +17,7 @@ type MutableDeviceRepository interface { CreateDevice(Device) error UpdateDevice(Device) error DeleteDeviceByUUID(string) error + DeleteDeviceByUUIDAndUserUUID(string, string) error DeleteAllDevicesByUserUUID(string) error } diff --git a/internal/repositories/gorm_device.go b/internal/repositories/gorm_device.go index 0721699..88b6b2c 100644 --- a/internal/repositories/gorm_device.go +++ b/internal/repositories/gorm_device.go @@ -197,6 +197,11 @@ func (receiver *GormDeviceRepository) DeleteDeviceByUUID(uuid string) error { return receiver.db.Delete(&GormDevice{}, &GormDevice{UUID: uuid}).Error } +func (receiver *GormDeviceRepository) DeleteDeviceByUUIDAndUserUUID(uuid string, userUUID string) error { + println(uuid, userUUID) + return receiver.db.Delete(&GormDevice{}, &GormDevice{UUID: uuid, UserUUID: userUUID}).Error +} + func (receiver *GormDeviceRepository) DeleteAllDevicesByUserUUID(userUUID string) error { return receiver.db.Delete(&GormDevice{}, &GormDevice{UserUUID: userUUID}).Error } diff --git a/internal/repositories/gorm_device_test.go b/internal/repositories/gorm_device_test.go index e404f96..74ee6e1 100644 --- a/internal/repositories/gorm_device_test.go +++ b/internal/repositories/gorm_device_test.go @@ -384,6 +384,33 @@ func TestGormDeviceRepository_CreateDevice_And_DeleteDeviceByUUID(t *testing.T) assert.Equal(t, len(gormDevices), 0) } +func TestGormDeviceRepository_CreateDevice_And_DeleteDeviceByUUIDAndUserUUID(t *testing.T) { + db, _ := gorm.Open(sqlite.Open("file::memory:"), &gorm.Config{Logger: logger.Default.LogMode(logger.Silent)}) + + gormDeviceRepository, _ := NewGormDeviceRepository(db) + + gormDevice := NewGormDevice() + + gormDevice.SetUUID("1") + gormDevice.SetUserUUID("2") + + err := gormDeviceRepository.CreateDevice(gormDevice) + + assert.Nil(t, err) + + gormDevices := gormDeviceRepository.GetDevicesByUserUUID(gormDevice.GetUserUUID()) + + assert.Equal(t, len(gormDevices), 1) + + err = gormDeviceRepository.DeleteDeviceByUUIDAndUserUUID(gormDevice.GetUUID(), gormDevice.GetUserUUID()) + + assert.Nil(t, err) + + gormDevices = gormDeviceRepository.GetDevicesByUserUUID(gormDevice.GetUserUUID()) + + assert.Equal(t, len(gormDevices), 0) +} + func TestGormDeviceRepository_CreateDevice_And_DeleteAllDevicesByUserUUID(t *testing.T) { db, _ := gorm.Open(sqlite.Open("file::memory:"), &gorm.Config{Logger: logger.Default.LogMode(logger.Silent)})