profile_test.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. package handlers
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "net/http"
  6. "net/http/httptest"
  7. "testing"
  8. "git.linuxforward.com/byom/byom-core/common"
  9. "git.linuxforward.com/byom/byom-core/errors"
  10. "git.linuxforward.com/byom/byom-core/middleware"
  11. testhelpers "git.linuxforward.com/byom/byom-core/testing"
  12. "github.com/gin-gonic/gin"
  13. "github.com/google/uuid"
  14. "github.com/stretchr/testify/assert"
  15. "github.com/stretchr/testify/require"
  16. )
  17. func TestProfileHandler_Create(t *testing.T) {
  18. // Setup test database and handler
  19. store := testhelpers.TestDB(t)
  20. handler := NewProfileHandler(store)
  21. // Setup gin test router with error handler
  22. gin.SetMode(gin.TestMode)
  23. router := gin.New()
  24. router.Use(middleware.ErrorHandler())
  25. router.POST("/api/v1/core/profiles", handler.Create)
  26. tests := []struct {
  27. name string
  28. request *common.ProfileCreateRequest
  29. expectedCode int
  30. expectedError string
  31. }{
  32. {
  33. name: "valid_request",
  34. request: &common.ProfileCreateRequest{
  35. Name: "Test Profile",
  36. WorkspaceID: uuid.New(),
  37. },
  38. expectedCode: http.StatusCreated,
  39. },
  40. {
  41. name: "missing_name",
  42. request: &common.ProfileCreateRequest{
  43. WorkspaceID: uuid.New(),
  44. },
  45. expectedCode: http.StatusBadRequest,
  46. expectedError: "Invalid request format",
  47. },
  48. {
  49. name: "missing_workspace_ID",
  50. request: &common.ProfileCreateRequest{
  51. Name: "Test Profile",
  52. },
  53. expectedCode: http.StatusBadRequest,
  54. expectedError: "Invalid request format",
  55. },
  56. }
  57. for _, tt := range tests {
  58. t.Run(tt.name, func(t *testing.T) {
  59. body, err := json.Marshal(tt.request)
  60. require.NoError(t, err)
  61. w := httptest.NewRecorder()
  62. req := httptest.NewRequest(http.MethodPost, "/api/v1/core/profiles", bytes.NewReader(body))
  63. req.Header.Set("Content-Type", "application/json")
  64. router.ServeHTTP(w, req)
  65. assert.Equal(t, tt.expectedCode, w.Code)
  66. if tt.expectedError != "" {
  67. var resp gin.H
  68. err := json.NewDecoder(w.Body).Decode(&resp)
  69. require.NoError(t, err)
  70. assert.Equal(t, tt.expectedError, resp["error"])
  71. }
  72. })
  73. }
  74. }
  75. func TestProfileHandler_Get(t *testing.T) {
  76. // Setup test database and handler
  77. store := testhelpers.TestDB(t)
  78. handler := NewProfileHandler(store)
  79. // Create a test profile
  80. testProfile := &common.Profile{
  81. ID: uuid.New(),
  82. Name: "Test Profile",
  83. WorkspaceID: uuid.New(),
  84. }
  85. ctx, cancel := testhelpers.TestContext()
  86. defer cancel()
  87. err := store.CreateProfile(ctx, testProfile)
  88. require.NoError(t, err)
  89. // Setup gin test router with error handler
  90. gin.SetMode(gin.TestMode)
  91. router := gin.New()
  92. router.Use(middleware.ErrorHandler())
  93. router.GET("/api/v1/core/profiles/:id", handler.Get)
  94. tests := []struct {
  95. name string
  96. profileID string
  97. expectedCode int
  98. expectedError *errors.AppError
  99. }{
  100. {
  101. name: "existing_profile",
  102. profileID: testProfile.ID.String(),
  103. expectedCode: http.StatusOK,
  104. },
  105. {
  106. name: "non-existent_profile",
  107. profileID: uuid.New().String(),
  108. expectedCode: http.StatusNotFound,
  109. expectedError: &errors.AppError{
  110. Type: errors.ErrorTypeNotFound,
  111. Message: "Profile not found",
  112. },
  113. },
  114. {
  115. name: "invalid_UUID",
  116. profileID: "invalid-uuid",
  117. expectedCode: http.StatusBadRequest,
  118. expectedError: &errors.AppError{
  119. Type: errors.ErrorTypeValidation,
  120. Message: "Profile ID is required",
  121. Field: "id",
  122. },
  123. },
  124. }
  125. for _, tt := range tests {
  126. t.Run(tt.name, func(t *testing.T) {
  127. w := httptest.NewRecorder()
  128. req := httptest.NewRequest(http.MethodGet, "/api/v1/core/profiles/"+tt.profileID, nil)
  129. router.ServeHTTP(w, req)
  130. assert.Equal(t, tt.expectedCode, w.Code)
  131. if tt.expectedError != nil {
  132. var resp errors.AppError
  133. err := json.NewDecoder(w.Body).Decode(&resp)
  134. require.NoError(t, err)
  135. assert.Equal(t, tt.expectedError.Type, resp.Type)
  136. assert.Equal(t, tt.expectedError.Message, resp.Message)
  137. if tt.expectedError.Field != "" {
  138. assert.Equal(t, tt.expectedError.Field, resp.Field)
  139. }
  140. } else {
  141. var resp common.ProfileResponse
  142. err := json.NewDecoder(w.Body).Decode(&resp)
  143. require.NoError(t, err)
  144. assert.Equal(t, testProfile.ID, resp.Profile.ID)
  145. assert.Equal(t, testProfile.Name, resp.Profile.Name)
  146. assert.Equal(t, testProfile.WorkspaceID, resp.Profile.WorkspaceID)
  147. }
  148. })
  149. }
  150. }