diff --git a/internal/controllers/membershipController.go b/internal/controllers/membershipController.go index e68a095..30d72ad 100644 --- a/internal/controllers/membershipController.go +++ b/internal/controllers/membershipController.go @@ -3,6 +3,7 @@ package controllers import ( "GoMembership/internal/models" "GoMembership/internal/services" + "strings" "net/http" // "strconv" @@ -31,7 +32,11 @@ func (mc *MembershipController) RegisterSubscription(c *gin.Context) { id, err := mc.Service.RegisterSubscription(®Data.Model) if err != nil { 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 } logger.Info.Printf("registering subscription: %+v", regData) diff --git a/internal/controllers/membershipController_test.go b/internal/controllers/membershipController_test.go index c9aa82b..be1c318 100644 --- a/internal/controllers/membershipController_test.go +++ b/internal/controllers/membershipController_test.go @@ -6,7 +6,9 @@ import ( "net/http/httptest" "testing" + "GoMembership/internal/config" "GoMembership/internal/models" + "GoMembership/pkg/logger" "github.com/gin-gonic/gin" ) @@ -23,6 +25,9 @@ func testMembershipController(t *testing.T) { tests := getSubscriptionData() 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) { if err := runSingleTest(&tt); err != nil { t.Errorf("Test failed: %v", err.Error()) @@ -63,8 +68,9 @@ func validateSubscription(assert bool, wantDBData map[string]interface{}) error func getBaseSubscription() MembershipData { return MembershipData{ + APIKey: config.Auth.APIKEY, Model: models.SubscriptionModel{ - Name: "Just a Subscription", + Name: "Premium", Details: "A subscription detail", MonthlyFee: 12.0, HourlyRate: 14.0, @@ -79,7 +85,7 @@ func customizeSubscription(customize func(MembershipData) MembershipData) Member func getSubscriptionData() []RegisterSubscriptionTest { return []RegisterSubscriptionTest{ { - Name: "No Details should fail", + Name: "Missing details should fail", WantResponse: http.StatusNotAcceptable, WantDBData: map[string]interface{}{"name": "Just a Subscription"}, Assert: false, @@ -90,7 +96,7 @@ func getSubscriptionData() []RegisterSubscriptionTest { })), }, { - Name: "No Model Name should fail", + Name: "Missing model name should fail", WantResponse: http.StatusNotAcceptable, WantDBData: map[string]interface{}{"name": ""}, Assert: false, @@ -100,10 +106,30 @@ func getSubscriptionData() []RegisterSubscriptionTest { 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", WantResponse: http.StatusCreated, - WantDBData: map[string]interface{}{"name": "Just a Subscription"}, + WantDBData: map[string]interface{}{"name": "Premium"}, Assert: true, Input: GenerateInputJSON( customizeSubscription(func(subscription MembershipData) MembershipData { @@ -113,5 +139,12 @@ func getSubscriptionData() []RegisterSubscriptionTest { 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()), + }, } }