170 lines
4.9 KiB
Go
170 lines
4.9 KiB
Go
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)
|
|
})
|
|
}
|