Tests[CompatRegisterPro]

This commit is contained in:
Mike Schwörer 2023-01-17 22:03:27 +01:00
parent 7fcd324299
commit 23c7729fcf
Signed by: Mikescher
GPG Key ID: D3C7172E0A70F8CF
5 changed files with 65 additions and 8 deletions

View File

@ -102,7 +102,7 @@ func (h APIHandler) CreateUser(g *gin.Context) ginresp.HTTPResponse {
if b.ProToken != nil { if b.ProToken != nil {
err := h.database.ClearProTokens(ctx, *b.ProToken) err := h.database.ClearProTokens(ctx, *b.ProToken)
if err != nil { if err != nil {
return ginresp.APIError(g, 500, apierr.DATABASE_ERROR, "Failed to clear existing fcm tokens", err) return ginresp.APIError(g, 500, apierr.DATABASE_ERROR, "Failed to clear existing pro tokens", err)
} }
} }

View File

@ -194,12 +194,16 @@ func (h CompatHandler) Register(g *gin.Context) ginresp.HTTPResponse {
return ginresp.CompatAPIError(0, "Missing parameter [[pro_token]]") return ginresp.CompatAPIError(0, "Missing parameter [[pro_token]]")
} }
if data.ProToken != nil {
data.ProToken = langext.Ptr("ANDROID|v1|" + *data.ProToken)
}
if *data.Pro != "true" { if *data.Pro != "true" {
data.ProToken = nil data.ProToken = nil
} }
if data.ProToken != nil { if data.ProToken != nil {
ptok, err := h.app.VerifyProToken(ctx, "ANDROID|v2|"+*data.ProToken) ptok, err := h.app.VerifyProToken(ctx, *data.ProToken)
if err != nil { if err != nil {
return ginresp.CompatAPIError(0, "Failed to query purchase status") return ginresp.CompatAPIError(0, "Failed to query purchase status")
} }
@ -221,7 +225,7 @@ func (h CompatHandler) Register(g *gin.Context) ginresp.HTTPResponse {
if data.ProToken != nil { if data.ProToken != nil {
err := h.database.ClearProTokens(ctx, *data.ProToken) err := h.database.ClearProTokens(ctx, *data.ProToken)
if err != nil { if err != nil {
return ginresp.CompatAPIError(0, "Failed to clear existing fcm tokens") return ginresp.CompatAPIError(0, "Failed to clear existing pro tokens")
} }
} }
@ -230,7 +234,7 @@ func (h CompatHandler) Register(g *gin.Context) ginresp.HTTPResponse {
return ginresp.CompatAPIError(0, "Failed to create user in db") return ginresp.CompatAPIError(0, "Failed to create user in db")
} }
_, err = h.database.CreateClient(ctx, user.UserID, models.ClientTypeAndroid, "ANDROID|v1|"+*data.FCMToken, "compat", "compat") _, err = h.database.CreateClient(ctx, user.UserID, models.ClientTypeAndroid, *data.FCMToken, "compat", "compat")
if err != nil { if err != nil {
return ginresp.CompatAPIError(0, "Failed to create client in db") return ginresp.CompatAPIError(0, "Failed to create client in db")
} }
@ -599,7 +603,7 @@ func (h CompatHandler) Update(g *gin.Context) ginresp.HTTPResponse {
} }
_, err = h.database.CreateClient(ctx, user.UserID, models.ClientTypeAndroid, "ANDROID|v1|"+*data.FCMToken, "compat", "compat") _, err = h.database.CreateClient(ctx, user.UserID, models.ClientTypeAndroid, *data.FCMToken, "compat", "compat")
if err != nil { if err != nil {
return ginresp.CompatAPIError(0, "Failed to delete client") return ginresp.CompatAPIError(0, "Failed to delete client")
} }
@ -811,7 +815,7 @@ func (h CompatHandler) Upgrade(g *gin.Context) ginresp.HTTPResponse {
} }
if data.ProToken != nil { if data.ProToken != nil {
ptok, err := h.app.VerifyProToken(ctx, "ANDROID|v2|"+*data.ProToken) ptok, err := h.app.VerifyProToken(ctx, "ANDROID|v1|"+*data.ProToken)
if err != nil { if err != nil {
return ginresp.CompatAPIError(0, "Failed to query purchase status") return ginresp.CompatAPIError(0, "Failed to query purchase status")
} }
@ -820,7 +824,7 @@ func (h CompatHandler) Upgrade(g *gin.Context) ginresp.HTTPResponse {
return ginresp.CompatAPIError(0, "Purchase token could not be verified") return ginresp.CompatAPIError(0, "Purchase token could not be verified")
} }
err = h.database.UpdateUserProToken(ctx, user.UserID, data.ProToken) err = h.database.UpdateUserProToken(ctx, user.UserID, langext.Ptr("ANDROID|v1|"+*data.ProToken))
if err != nil { if err != nil {
return ginresp.CompatAPIError(0, "Failed to update user") return ginresp.CompatAPIError(0, "Failed to update user")
} }

View File

@ -8,6 +8,7 @@ import (
"blackforestbytes.com/simplecloudnotifier/models" "blackforestbytes.com/simplecloudnotifier/models"
"blackforestbytes.com/simplecloudnotifier/push" "blackforestbytes.com/simplecloudnotifier/push"
"context" "context"
"errors"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding" "github.com/gin-gonic/gin/binding"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
@ -166,14 +167,21 @@ func (app *Application) QuotaMax(ispro bool) int {
} }
func (app *Application) VerifyProToken(ctx *AppContext, token string) (bool, error) { func (app *Application) VerifyProToken(ctx *AppContext, token string) (bool, error) {
if strings.HasPrefix(token, "ANDROID|v1|") { if strings.HasPrefix(token, "ANDROID|v1|") {
subToken := token[len("ANDROID|v2|"):] subToken := token[len("ANDROID|v1|"):]
return app.VerifyAndroidProToken(ctx, subToken) return app.VerifyAndroidProToken(ctx, subToken)
} }
if strings.HasPrefix(token, "ANDROID|v2|") { if strings.HasPrefix(token, "ANDROID|v2|") {
subToken := token[len("ANDROID|v2|"):] subToken := token[len("ANDROID|v2|"):]
return app.VerifyAndroidProToken(ctx, subToken) return app.VerifyAndroidProToken(ctx, subToken)
} }
if strings.HasPrefix(token, "IOS|v1|") {
return false, errors.New("invalid token-version: ios-v1")
}
if strings.HasPrefix(token, "IOS|v2|") { if strings.HasPrefix(token, "IOS|v2|") {
subToken := token[len("IOS|v2|"):] subToken := token[len("IOS|v2|"):]
return app.VerifyIOSProToken(ctx, subToken) return app.VerifyIOSProToken(ctx, subToken)

View File

@ -308,6 +308,25 @@ func TestCompatRegister(t *testing.T) {
r0 := tt.RequestGet[gin.H](t, baseUrl, fmt.Sprintf("/api/register.php?fcm_token=%s&pro=%s&pro_token=%s", "DUMMY_FCM", "0", "")) r0 := tt.RequestGet[gin.H](t, baseUrl, fmt.Sprintf("/api/register.php?fcm_token=%s&pro=%s&pro_token=%s", "DUMMY_FCM", "0", ""))
tt.AssertEqual(t, "success", true, r0["success"]) tt.AssertEqual(t, "success", true, r0["success"])
tt.AssertEqual(t, "message", "New user registered", r0["message"])
tt.AssertEqual(t, "quota", 0, r0["quota"])
tt.AssertEqual(t, "quota_max", 50, r0["quota_max"])
tt.AssertEqual(t, "is_pro", 0, r0["is_pro"])
}
func TestCompatRegisterPro(t *testing.T) {
_, baseUrl, stop := tt.StartSimpleWebserver(t)
defer stop()
r0 := tt.RequestGet[gin.H](t, baseUrl, fmt.Sprintf("/api/register.php?fcm_token=%s&pro=%s&pro_token=%s", "DUMMY_FCM", "true", url.QueryEscape("PURCHASED:000")))
tt.AssertEqual(t, "success", true, r0["success"])
tt.AssertEqual(t, "message", "New user registered", r0["message"])
tt.AssertEqual(t, "quota", 0, r0["quota"])
tt.AssertEqual(t, "quota_max", 1000, r0["quota_max"])
tt.AssertEqual(t, "is_pro", 1, r0["is_pro"])
r1 := tt.RequestGet[gin.H](t, baseUrl, fmt.Sprintf("/api/register.php?fcm_token=%s&pro=%s&pro_token=%s", "DUMMY_FCM", "true", url.QueryEscape("INVALID")))
tt.AssertEqual(t, "success", false, r1["success"])
} }
func TestCompatInfo(t *testing.T) { func TestCompatInfo(t *testing.T) {

View File

@ -259,4 +259,30 @@ func TestCreateProUser(t *testing.T) {
tt.AssertEqual(t, "is_pro", true, r3["is_pro"]) tt.AssertEqual(t, "is_pro", true, r3["is_pro"])
} }
{
tt.RequestPostShouldFail(t, baseUrl, "/api/users", gin.H{
"agent_model": "DUMMY_PHONE",
"agent_version": "4X",
"client_type": "ANDROID",
"fcm_token": "DUMMY_FCM",
"pro_token": "ANDROID|v2|INVALID",
}, 400, apierr.INVALID_PRO_TOKEN)
tt.RequestPostShouldFail(t, baseUrl, "/api/users", gin.H{
"agent_model": "DUMMY_PHONE",
"agent_version": "4X",
"client_type": "ANDROID",
"fcm_token": "DUMMY_FCM",
"pro_token": "_",
}, 400, apierr.INVALID_PRO_TOKEN)
tt.RequestPostShouldFail(t, baseUrl, "/api/users", gin.H{
"agent_model": "DUMMY_PHONE",
"agent_version": "4X",
"client_type": "ANDROID",
"fcm_token": "DUMMY_FCM",
"pro_token": "ANDROID|v99|xxx",
}, 400, apierr.INVALID_PRO_TOKEN)
}
} }