package push_test import ( "database/sql" "net/http" "testing" "allaboutapps.dev/aw/go-starter/internal/api" "allaboutapps.dev/aw/go-starter/internal/api/httperrors" "allaboutapps.dev/aw/go-starter/internal/models" "allaboutapps.dev/aw/go-starter/internal/test" "allaboutapps.dev/aw/go-starter/internal/test/fixtures" "github.com/aarondl/sqlboiler/v4/boil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestPutUpdatePushTokenSuccess(t *testing.T) { test.WithTestServer(t, func(s *api.Server) { ctx := t.Context() fix := fixtures.Fixtures() //nolint:gosec testToken := "869f6deb-73e6-4691-9d40-2a2a794006cf" testProvider := models.ProviderTypeFCM payload := test.GenericPayload{ "newToken": testToken, "provider": testProvider, } res := test.PerformRequest(t, s, "PUT", "/api/v1/push/token", payload, test.HeadersWithAuth(t, fix.User1AccessToken1.Token)) assert.Equal(t, http.StatusOK, res.Result().StatusCode) newToken, err := models.PushTokens(models.PushTokenWhere.Token.EQ(testToken)).One(ctx, s.DB) require.NoError(t, err) assert.NotEmpty(t, newToken.ID) assert.Equal(t, testToken, newToken.Token) assert.Equal(t, testProvider, newToken.Provider) assert.Equal(t, fix.User1.ID, newToken.UserID) }) } func TestPutUpdatePushTokenSuccessWithOldToken(t *testing.T) { test.WithTestServer(t, func(s *api.Server) { ctx := t.Context() fix := fixtures.Fixtures() //nolint:gosec oldToken := "6803ccb4-c91d-47b2-960e-291afa5e29cd" oldPushToken := models.PushToken{ Token: oldToken, Provider: models.ProviderTypeFCM, UserID: fix.User1.ID, } err := oldPushToken.Insert(ctx, s.DB, boil.Infer()) require.NoError(t, err) //nolint:gosec testToken := "af55b6cf-1fb0-4bb7-960c-25268a5ce7c3" testProvider := models.ProviderTypeFCM payload := test.GenericPayload{ "newToken": testToken, "provider": testProvider, "oldToken": oldToken, } res := test.PerformRequest(t, s, "PUT", "/api/v1/push/token", payload, test.HeadersWithAuth(t, fix.User1AccessToken1.Token)) assert.Equal(t, http.StatusOK, res.Result().StatusCode) newToken, err := models.PushTokens(models.PushTokenWhere.Token.EQ(testToken)).One(ctx, s.DB) require.NoError(t, err) assert.NotEmpty(t, newToken.ID) assert.Equal(t, testToken, newToken.Token) assert.Equal(t, testProvider, newToken.Provider) assert.Equal(t, fix.User1.ID, newToken.UserID) err = oldPushToken.Reload(ctx, s.DB) require.ErrorIs(t, err, sql.ErrNoRows) }) } func TestPutUpdatePushTokenWithDuplicateToken(t *testing.T) { test.WithTestServer(t, func(s *api.Server) { ctx := t.Context() fix := fixtures.Fixtures() //nolint:gosec oldToken := "6803ccb4-c91d-47b2-960e-291afa5e29cd" oldPushToken := models.PushToken{ Token: oldToken, Provider: models.ProviderTypeFCM, UserID: fix.User1.ID, } err := oldPushToken.Insert(ctx, s.DB, boil.Infer()) require.NoError(t, err) testProvider := models.ProviderTypeFCM payload := test.GenericPayload{ "newToken": oldToken, "provider": testProvider, "oldToken": oldToken, } oldCnt, err := fix.User1.PushTokens().Count(ctx, s.DB) require.NoError(t, err) res := test.PerformRequest(t, s, "PUT", "/api/v1/push/token", payload, test.HeadersWithAuth(t, fix.User1AccessToken1.Token)) test.RequireHTTPError(t, res, httperrors.ErrConflictPushToken) err = oldPushToken.Reload(ctx, s.DB) require.NoError(t, err) cnt, err := fix.User1.PushTokens().Count(ctx, s.DB) require.NoError(t, err) assert.Equal(t, oldCnt, cnt) }) } func TestPutUpdatePushTokenWithOldTokenNotfound(t *testing.T) { test.WithTestServer(t, func(s *api.Server) { ctx := t.Context() fix := fixtures.Fixtures() //nolint:gosec oldToken := "cc08624a-b40d-4b8e-bbfe-f62aabb47592" oldPushToken := models.PushToken{ Token: oldToken, Provider: models.ProviderTypeFCM, UserID: fix.User1.ID, } err := oldPushToken.Insert(ctx, s.DB, boil.Infer()) require.NoError(t, err) oldCnt, err := fix.User1.PushTokens().Count(ctx, s.DB) require.NoError(t, err) //nolint:gosec testToken := "8e4ad85f-cbb6-4ef3-a455-d9d8bd8917b3" testProvider := models.ProviderTypeFCM payload := test.GenericPayload{ "newToken": testToken, "provider": testProvider, "oldToken": "3199aa21-eb41-47dd-9287-338e9e88a5ae", } res := test.PerformRequest(t, s, "PUT", "/api/v1/push/token", payload, test.HeadersWithAuth(t, fix.User1AccessToken1.Token)) test.RequireHTTPError(t, res, httperrors.ErrNotFoundOldPushToken) newToken, err := models.PushTokens(models.PushTokenWhere.Token.EQ(testToken)).One(ctx, s.DB) require.NoError(t, err) assert.NotEmpty(t, newToken.ID) assert.Equal(t, testToken, newToken.Token) assert.Equal(t, testProvider, newToken.Provider) assert.Equal(t, fix.User1.ID, newToken.UserID) err = oldPushToken.Reload(ctx, s.DB) require.NoError(t, err) cnt, err := fix.User1.PushTokens().Count(ctx, s.DB) require.NoError(t, err) assert.Equal(t, oldCnt+1, cnt) }) }