membership input validation improved & tests
This commit is contained in:
@@ -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(®Data.Model)
|
id, err := mc.Service.RegisterSubscription(®Data.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)
|
||||||
|
|||||||
@@ -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()),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user