membership input validation improved & tests

This commit is contained in:
$(pass /github/name)
2024-09-20 08:28:23 +02:00
parent 361fa1316a
commit 62624cd0f8
2 changed files with 43 additions and 5 deletions

View File

@@ -3,6 +3,7 @@ package controllers
import ( import (
"GoMembership/internal/models" "GoMembership/internal/models"
"GoMembership/internal/services" "GoMembership/internal/services"
"strings"
"net/http" "net/http"
// "strconv" // "strconv"
@@ -31,7 +32,11 @@ func (mc *MembershipController) RegisterSubscription(c *gin.Context) {
id, err := mc.Service.RegisterSubscription(&regData.Model) id, err := mc.Service.RegisterSubscription(&regData.Model)
if err != nil { if err != nil {
logger.Error.Printf("Couldn't register Membershipmodel: %v", err) logger.Error.Printf("Couldn't register Membershipmodel: %v", err)
c.JSON(int(id), "Couldn't register Membershipmodel") if strings.Contains(err.Error(), "UNIQUE constraint failed") {
c.JSON(http.StatusConflict, "Duplicate subscription name")
return
}
c.JSON(http.StatusNotAcceptable, "Couldn't register Membershipmodel")
return return
} }
logger.Info.Printf("registering subscription: %+v", regData) logger.Info.Printf("registering subscription: %+v", regData)

View File

@@ -6,7 +6,9 @@ import (
"net/http/httptest" "net/http/httptest"
"testing" "testing"
"GoMembership/internal/config"
"GoMembership/internal/models" "GoMembership/internal/models"
"GoMembership/pkg/logger"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
@@ -23,6 +25,9 @@ func testMembershipController(t *testing.T) {
tests := getSubscriptionData() tests := getSubscriptionData()
for _, tt := range tests { for _, tt := range tests {
logger.Error.Print("==============================================================")
logger.Error.Printf("MembershipController : %v", tt.Name)
logger.Error.Print("==============================================================")
t.Run(tt.Name, func(t *testing.T) { t.Run(tt.Name, func(t *testing.T) {
if err := runSingleTest(&tt); err != nil { if err := runSingleTest(&tt); err != nil {
t.Errorf("Test failed: %v", err.Error()) t.Errorf("Test failed: %v", err.Error())
@@ -63,8 +68,9 @@ func validateSubscription(assert bool, wantDBData map[string]interface{}) error
func getBaseSubscription() MembershipData { func getBaseSubscription() MembershipData {
return MembershipData{ return MembershipData{
APIKey: config.Auth.APIKEY,
Model: models.SubscriptionModel{ Model: models.SubscriptionModel{
Name: "Just a Subscription", Name: "Premium",
Details: "A subscription detail", Details: "A subscription detail",
MonthlyFee: 12.0, MonthlyFee: 12.0,
HourlyRate: 14.0, HourlyRate: 14.0,
@@ -79,7 +85,7 @@ func customizeSubscription(customize func(MembershipData) MembershipData) Member
func getSubscriptionData() []RegisterSubscriptionTest { func getSubscriptionData() []RegisterSubscriptionTest {
return []RegisterSubscriptionTest{ return []RegisterSubscriptionTest{
{ {
Name: "No Details should fail", Name: "Missing details should fail",
WantResponse: http.StatusNotAcceptable, WantResponse: http.StatusNotAcceptable,
WantDBData: map[string]interface{}{"name": "Just a Subscription"}, WantDBData: map[string]interface{}{"name": "Just a Subscription"},
Assert: false, Assert: false,
@@ -90,7 +96,7 @@ func getSubscriptionData() []RegisterSubscriptionTest {
})), })),
}, },
{ {
Name: "No Model Name should fail", Name: "Missing model name should fail",
WantResponse: http.StatusNotAcceptable, WantResponse: http.StatusNotAcceptable,
WantDBData: map[string]interface{}{"name": ""}, WantDBData: map[string]interface{}{"name": ""},
Assert: false, Assert: false,
@@ -100,10 +106,30 @@ func getSubscriptionData() []RegisterSubscriptionTest {
return subscription return subscription
})), })),
}, },
{
Name: "Negative monthly fee should fail",
WantResponse: http.StatusNotAcceptable,
WantDBData: map[string]interface{}{"name": "Premium"},
Assert: false,
Input: GenerateInputJSON(customizeSubscription(func(sub MembershipData) MembershipData {
sub.Model.MonthlyFee = -10.0
return sub
})),
},
{
Name: "Negative hourly rate should fail",
WantResponse: http.StatusNotAcceptable,
WantDBData: map[string]interface{}{"name": "Premium"},
Assert: false,
Input: GenerateInputJSON(customizeSubscription(func(sub MembershipData) MembershipData {
sub.Model.HourlyRate = -1.0
return sub
})),
},
{ {
Name: "correct entry should pass", Name: "correct entry should pass",
WantResponse: http.StatusCreated, WantResponse: http.StatusCreated,
WantDBData: map[string]interface{}{"name": "Just a Subscription"}, WantDBData: map[string]interface{}{"name": "Premium"},
Assert: true, Assert: true,
Input: GenerateInputJSON( Input: GenerateInputJSON(
customizeSubscription(func(subscription MembershipData) MembershipData { customizeSubscription(func(subscription MembershipData) MembershipData {
@@ -113,5 +139,12 @@ func getSubscriptionData() []RegisterSubscriptionTest {
return subscription return subscription
})), })),
}, },
{
Name: "Duplicate subscription name should fail",
WantResponse: http.StatusConflict,
WantDBData: map[string]interface{}{"name": "Premium"},
Assert: true, // The original subscription should still exist
Input: GenerateInputJSON(getBaseSubscription()),
},
} }
} }