diff options
Diffstat (limited to 'handlers')
-rw-r--r-- | handlers/goal_handler_test.go | 261 |
1 files changed, 261 insertions, 0 deletions
diff --git a/handlers/goal_handler_test.go b/handlers/goal_handler_test.go new file mode 100644 index 0000000..0641dca --- /dev/null +++ b/handlers/goal_handler_test.go @@ -0,0 +1,261 @@ +package handlers + +import ( + "bytes" + "encoding/json" + "errors" + "finance/backend/internal/database" + "net/http" + "net/http/httptest" + "testing" + + "github.com/gin-gonic/gin" + "github.com/stretchr/testify/assert" + "gorm.io/gorm" +) + +// setupTest sets up the test environment +func setupTest() (*gin.Context, *httptest.ResponseRecorder) { + gin.SetMode(gin.TestMode) + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + c.Set("userID", uint(1)) + return c, w +} + +// Test basic functionality of GetGoals +func TestGetGoals(t *testing.T) { + // Save and restore the original DB + originalDB := database.DB + defer func() { + database.DB = originalDB + }() + + // Replace with a DB that returns success + mockDB := &gorm.DB{ + Error: nil, + } + database.DB = mockDB + + c, w := setupTest() + req := httptest.NewRequest("GET", "/goals", nil) + c.Request = req + + handler := NewGoalHandler() + handler.GetGoals(c) + + assert.Equal(t, http.StatusOK, w.Code) +} + +// Test basic functionality of GetGoal +func TestGetGoal(t *testing.T) { + // Save and restore the original DB + originalDB := database.DB + defer func() { + database.DB = originalDB + }() + + // Replace with a DB that returns success + mockDB := &gorm.DB{ + Error: nil, + } + database.DB = mockDB + + c, w := setupTest() + c.Params = []gin.Param{{Key: "id", Value: "1"}} + req := httptest.NewRequest("GET", "/goals/1", nil) + c.Request = req + + handler := NewGoalHandler() + handler.GetGoal(c) + + assert.Equal(t, http.StatusOK, w.Code) +} + +// Test basic functionality of CreateGoal +func TestCreateGoal(t *testing.T) { + // Save and restore the original DB + originalDB := database.DB + defer func() { + database.DB = originalDB + }() + + // Replace with a DB that returns success + mockDB := &gorm.DB{ + Error: nil, + } + database.DB = mockDB + + c, w := setupTest() + + input := CreateGoalInput{ + Name: "Test Goal", + TargetAmount: 1000, + CurrentAmount: 500, + TargetDate: "2023-12-31", + Status: "Active", + } + + inputJSON, _ := json.Marshal(input) + req := httptest.NewRequest("POST", "/goals", bytes.NewBuffer(inputJSON)) + req.Header.Set("Content-Type", "application/json") + c.Request = req + + handler := NewGoalHandler() + handler.CreateGoal(c) + + assert.Equal(t, http.StatusCreated, w.Code) +} + +// Test basic functionality of UpdateGoal +func TestUpdateGoal(t *testing.T) { + // Save and restore the original DB + originalDB := database.DB + defer func() { + database.DB = originalDB + }() + + // Replace with a DB that returns success + mockDB := &gorm.DB{ + Error: nil, + } + database.DB = mockDB + + c, w := setupTest() + c.Params = []gin.Param{{Key: "id", Value: "1"}} + + input := UpdateGoalInput{ + Name: "Updated Goal", + TargetAmount: 2000, + CurrentAmount: 1000, + Status: "Active", + } + + inputJSON, _ := json.Marshal(input) + req := httptest.NewRequest("PUT", "/goals/1", bytes.NewBuffer(inputJSON)) + req.Header.Set("Content-Type", "application/json") + c.Request = req + + handler := NewGoalHandler() + handler.UpdateGoal(c) + + assert.Equal(t, http.StatusOK, w.Code) +} + +// Test basic functionality of UpdateGoalProgress +func TestUpdateGoalProgress(t *testing.T) { + // Save and restore the original DB + originalDB := database.DB + defer func() { + database.DB = originalDB + }() + + // Replace with a DB that returns success + mockDB := &gorm.DB{ + Error: nil, + } + database.DB = mockDB + + c, w := setupTest() + c.Params = []gin.Param{{Key: "id", Value: "1"}} + + input := UpdateGoalProgressInput{ + CurrentAmount: 750, + } + + inputJSON, _ := json.Marshal(input) + req := httptest.NewRequest("PATCH", "/goals/1/progress", bytes.NewBuffer(inputJSON)) + req.Header.Set("Content-Type", "application/json") + c.Request = req + + handler := NewGoalHandler() + handler.UpdateGoalProgress(c) + + assert.Equal(t, http.StatusOK, w.Code) +} + +// Test basic functionality of DeleteGoal +func TestDeleteGoal(t *testing.T) { + // Save and restore the original DB + originalDB := database.DB + defer func() { + database.DB = originalDB + }() + + // Replace with a DB that returns success + mockDB := &gorm.DB{ + Error: nil, + } + database.DB = mockDB + + c, w := setupTest() + c.Params = []gin.Param{{Key: "id", Value: "1"}} + req := httptest.NewRequest("DELETE", "/goals/1", nil) + c.Request = req + + handler := NewGoalHandler() + handler.DeleteGoal(c) + + assert.Equal(t, http.StatusOK, w.Code) +} + +// Test error cases for each handler +func TestErrorCases(t *testing.T) { + // Save and restore the original DB + originalDB := database.DB + defer func() { + database.DB = originalDB + }() + + // Replace with a DB that returns an error + mockDB := &gorm.DB{ + Error: errors.New("database error"), + } + database.DB = mockDB + + // Test GetGoals with database error + t.Run("GetGoals_DBError", func(t *testing.T) { + c, w := setupTest() + req := httptest.NewRequest("GET", "/goals", nil) + c.Request = req + + handler := NewGoalHandler() + handler.GetGoals(c) + + assert.Equal(t, http.StatusInternalServerError, w.Code) + }) + + // Test GetGoal with database error + t.Run("GetGoal_DBError", func(t *testing.T) { + c, w := setupTest() + c.Params = []gin.Param{{Key: "id", Value: "1"}} + req := httptest.NewRequest("GET", "/goals/1", nil) + c.Request = req + + handler := NewGoalHandler() + handler.GetGoal(c) + + assert.Equal(t, http.StatusNotFound, w.Code) + }) + + // Test CreateGoal with database error + t.Run("CreateGoal_DBError", func(t *testing.T) { + c, w := setupTest() + + input := CreateGoalInput{ + Name: "Test Goal", + TargetAmount: 1000, + CurrentAmount: 500, + } + + inputJSON, _ := json.Marshal(input) + req := httptest.NewRequest("POST", "/goals", bytes.NewBuffer(inputJSON)) + req.Header.Set("Content-Type", "application/json") + c.Request = req + + handler := NewGoalHandler() + handler.CreateGoal(c) + + assert.Equal(t, http.StatusInternalServerError, w.Code) + }) +} |