Migrate from Gin to Echo framework and add comprehensive integration tests
Major changes: - Migrate all handlers from Gin to Echo framework - Add new apperrors, echohelpers, and validator packages - Update middleware for Echo compatibility - Add ArchivedHandler to task categorization chain (archived tasks go to cancelled_tasks column) - Add 6 new integration tests: - RecurringTaskLifecycle: NextDueDate advancement for weekly/monthly tasks - MultiUserSharing: Complex sharing with user removal - TaskStateTransitions: All state transitions and kanban column changes - DateBoundaryEdgeCases: Threshold boundary testing - CascadeOperations: Residence deletion cascade effects - MultiUserOperations: Shared residence collaboration - Add single-purpose repository functions for kanban columns (GetOverdueTasks, GetDueSoonTasks, etc.) - Fix RemoveUser route param mismatch (userId -> user_id) - Fix determineExpectedColumn helper to correctly prioritize in_progress over overdue 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -6,7 +6,7 @@ import (
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/labstack/echo/v4"
|
||||
"github.com/shopspring/decimal"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
@@ -19,22 +19,22 @@ import (
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func setupResidenceHandler(t *testing.T) (*ResidenceHandler, *gin.Engine, *gorm.DB) {
|
||||
func setupResidenceHandler(t *testing.T) (*ResidenceHandler, *echo.Echo, *gorm.DB) {
|
||||
db := testutil.SetupTestDB(t)
|
||||
residenceRepo := repositories.NewResidenceRepository(db)
|
||||
userRepo := repositories.NewUserRepository(db)
|
||||
cfg := &config.Config{}
|
||||
residenceService := services.NewResidenceService(residenceRepo, userRepo, cfg)
|
||||
handler := NewResidenceHandler(residenceService, nil, nil)
|
||||
router := testutil.SetupTestRouter()
|
||||
return handler, router, db
|
||||
e := testutil.SetupTestRouter()
|
||||
return handler, e, db
|
||||
}
|
||||
|
||||
func TestResidenceHandler_CreateResidence(t *testing.T) {
|
||||
handler, router, db := setupResidenceHandler(t)
|
||||
handler, e, db := setupResidenceHandler(t)
|
||||
user := testutil.CreateTestUser(t, db, "owner", "owner@test.com", "password")
|
||||
|
||||
authGroup := router.Group("/api/residences")
|
||||
authGroup := e.Group("/api/residences")
|
||||
authGroup.Use(testutil.MockAuthMiddleware(user))
|
||||
authGroup.POST("/", handler.CreateResidence)
|
||||
|
||||
@@ -47,7 +47,7 @@ func TestResidenceHandler_CreateResidence(t *testing.T) {
|
||||
PostalCode: "78701",
|
||||
}
|
||||
|
||||
w := testutil.MakeRequest(router, "POST", "/api/residences/", req, "test-token")
|
||||
w := testutil.MakeRequest(e, "POST", "/api/residences/", req, "test-token")
|
||||
|
||||
testutil.AssertStatusCode(t, w, http.StatusCreated)
|
||||
|
||||
@@ -88,7 +88,7 @@ func TestResidenceHandler_CreateResidence(t *testing.T) {
|
||||
IsPrimary: &isPrimary,
|
||||
}
|
||||
|
||||
w := testutil.MakeRequest(router, "POST", "/api/residences/", req, "test-token")
|
||||
w := testutil.MakeRequest(e, "POST", "/api/residences/", req, "test-token")
|
||||
|
||||
testutil.AssertStatusCode(t, w, http.StatusCreated)
|
||||
|
||||
@@ -114,28 +114,28 @@ func TestResidenceHandler_CreateResidence(t *testing.T) {
|
||||
// Missing name - this is required
|
||||
}
|
||||
|
||||
w := testutil.MakeRequest(router, "POST", "/api/residences/", req, "test-token")
|
||||
w := testutil.MakeRequest(e, "POST", "/api/residences/", req, "test-token")
|
||||
|
||||
testutil.AssertStatusCode(t, w, http.StatusBadRequest)
|
||||
})
|
||||
}
|
||||
|
||||
func TestResidenceHandler_GetResidence(t *testing.T) {
|
||||
handler, router, db := setupResidenceHandler(t)
|
||||
handler, e, db := setupResidenceHandler(t)
|
||||
user := testutil.CreateTestUser(t, db, "owner", "owner@test.com", "password")
|
||||
otherUser := testutil.CreateTestUser(t, db, "other", "other@test.com", "password")
|
||||
residence := testutil.CreateTestResidence(t, db, user.ID, "Test House")
|
||||
|
||||
authGroup := router.Group("/api/residences")
|
||||
authGroup := e.Group("/api/residences")
|
||||
authGroup.Use(testutil.MockAuthMiddleware(user))
|
||||
authGroup.GET("/:id/", handler.GetResidence)
|
||||
|
||||
otherAuthGroup := router.Group("/api/other-residences")
|
||||
otherAuthGroup := e.Group("/api/other-residences")
|
||||
otherAuthGroup.Use(testutil.MockAuthMiddleware(otherUser))
|
||||
otherAuthGroup.GET("/:id/", handler.GetResidence)
|
||||
|
||||
t.Run("get own residence", func(t *testing.T) {
|
||||
w := testutil.MakeRequest(router, "GET", fmt.Sprintf("/api/residences/%d/", residence.ID), nil, "test-token")
|
||||
w := testutil.MakeRequest(e, "GET", fmt.Sprintf("/api/residences/%d/", residence.ID), nil, "test-token")
|
||||
|
||||
testutil.AssertStatusCode(t, w, http.StatusOK)
|
||||
|
||||
@@ -148,37 +148,37 @@ func TestResidenceHandler_GetResidence(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("get residence with invalid ID", func(t *testing.T) {
|
||||
w := testutil.MakeRequest(router, "GET", "/api/residences/invalid/", nil, "test-token")
|
||||
w := testutil.MakeRequest(e, "GET", "/api/residences/invalid/", nil, "test-token")
|
||||
|
||||
testutil.AssertStatusCode(t, w, http.StatusBadRequest)
|
||||
})
|
||||
|
||||
t.Run("get non-existent residence", func(t *testing.T) {
|
||||
w := testutil.MakeRequest(router, "GET", "/api/residences/9999/", nil, "test-token")
|
||||
w := testutil.MakeRequest(e, "GET", "/api/residences/9999/", nil, "test-token")
|
||||
|
||||
// Returns 403 (access denied) rather than 404 to not reveal whether an ID exists
|
||||
testutil.AssertStatusCode(t, w, http.StatusForbidden)
|
||||
})
|
||||
|
||||
t.Run("access denied for other user", func(t *testing.T) {
|
||||
w := testutil.MakeRequest(router, "GET", fmt.Sprintf("/api/other-residences/%d/", residence.ID), nil, "test-token")
|
||||
w := testutil.MakeRequest(e, "GET", fmt.Sprintf("/api/other-residences/%d/", residence.ID), nil, "test-token")
|
||||
|
||||
testutil.AssertStatusCode(t, w, http.StatusForbidden)
|
||||
})
|
||||
}
|
||||
|
||||
func TestResidenceHandler_ListResidences(t *testing.T) {
|
||||
handler, router, db := setupResidenceHandler(t)
|
||||
handler, e, db := setupResidenceHandler(t)
|
||||
user := testutil.CreateTestUser(t, db, "owner", "owner@test.com", "password")
|
||||
testutil.CreateTestResidence(t, db, user.ID, "House 1")
|
||||
testutil.CreateTestResidence(t, db, user.ID, "House 2")
|
||||
|
||||
authGroup := router.Group("/api/residences")
|
||||
authGroup := e.Group("/api/residences")
|
||||
authGroup.Use(testutil.MockAuthMiddleware(user))
|
||||
authGroup.GET("/", handler.ListResidences)
|
||||
|
||||
t.Run("list residences", func(t *testing.T) {
|
||||
w := testutil.MakeRequest(router, "GET", "/api/residences/", nil, "test-token")
|
||||
w := testutil.MakeRequest(e, "GET", "/api/residences/", nil, "test-token")
|
||||
|
||||
testutil.AssertStatusCode(t, w, http.StatusOK)
|
||||
|
||||
@@ -191,7 +191,7 @@ func TestResidenceHandler_ListResidences(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestResidenceHandler_UpdateResidence(t *testing.T) {
|
||||
handler, router, db := setupResidenceHandler(t)
|
||||
handler, e, db := setupResidenceHandler(t)
|
||||
user := testutil.CreateTestUser(t, db, "owner", "owner@test.com", "password")
|
||||
sharedUser := testutil.CreateTestUser(t, db, "shared", "shared@test.com", "password")
|
||||
residence := testutil.CreateTestResidence(t, db, user.ID, "Original Name")
|
||||
@@ -200,11 +200,11 @@ func TestResidenceHandler_UpdateResidence(t *testing.T) {
|
||||
residenceRepo := repositories.NewResidenceRepository(db)
|
||||
residenceRepo.AddUser(residence.ID, sharedUser.ID)
|
||||
|
||||
authGroup := router.Group("/api/residences")
|
||||
authGroup := e.Group("/api/residences")
|
||||
authGroup.Use(testutil.MockAuthMiddleware(user))
|
||||
authGroup.PUT("/:id/", handler.UpdateResidence)
|
||||
|
||||
sharedGroup := router.Group("/api/shared-residences")
|
||||
sharedGroup := e.Group("/api/shared-residences")
|
||||
sharedGroup.Use(testutil.MockAuthMiddleware(sharedUser))
|
||||
sharedGroup.PUT("/:id/", handler.UpdateResidence)
|
||||
|
||||
@@ -216,7 +216,7 @@ func TestResidenceHandler_UpdateResidence(t *testing.T) {
|
||||
City: &newCity,
|
||||
}
|
||||
|
||||
w := testutil.MakeRequest(router, "PUT", fmt.Sprintf("/api/residences/%d/", residence.ID), req, "test-token")
|
||||
w := testutil.MakeRequest(e, "PUT", fmt.Sprintf("/api/residences/%d/", residence.ID), req, "test-token")
|
||||
|
||||
testutil.AssertStatusCode(t, w, http.StatusOK)
|
||||
|
||||
@@ -239,14 +239,14 @@ func TestResidenceHandler_UpdateResidence(t *testing.T) {
|
||||
Name: &newName,
|
||||
}
|
||||
|
||||
w := testutil.MakeRequest(router, "PUT", fmt.Sprintf("/api/shared-residences/%d/", residence.ID), req, "test-token")
|
||||
w := testutil.MakeRequest(e, "PUT", fmt.Sprintf("/api/shared-residences/%d/", residence.ID), req, "test-token")
|
||||
|
||||
testutil.AssertStatusCode(t, w, http.StatusForbidden)
|
||||
})
|
||||
}
|
||||
|
||||
func TestResidenceHandler_DeleteResidence(t *testing.T) {
|
||||
handler, router, db := setupResidenceHandler(t)
|
||||
handler, e, db := setupResidenceHandler(t)
|
||||
user := testutil.CreateTestUser(t, db, "owner", "owner@test.com", "password")
|
||||
sharedUser := testutil.CreateTestUser(t, db, "shared", "shared@test.com", "password")
|
||||
residence := testutil.CreateTestResidence(t, db, user.ID, "To Delete")
|
||||
@@ -254,22 +254,22 @@ func TestResidenceHandler_DeleteResidence(t *testing.T) {
|
||||
residenceRepo := repositories.NewResidenceRepository(db)
|
||||
residenceRepo.AddUser(residence.ID, sharedUser.ID)
|
||||
|
||||
authGroup := router.Group("/api/residences")
|
||||
authGroup := e.Group("/api/residences")
|
||||
authGroup.Use(testutil.MockAuthMiddleware(user))
|
||||
authGroup.DELETE("/:id/", handler.DeleteResidence)
|
||||
|
||||
sharedGroup := router.Group("/api/shared-residences")
|
||||
sharedGroup := e.Group("/api/shared-residences")
|
||||
sharedGroup.Use(testutil.MockAuthMiddleware(sharedUser))
|
||||
sharedGroup.DELETE("/:id/", handler.DeleteResidence)
|
||||
|
||||
t.Run("shared user cannot delete", func(t *testing.T) {
|
||||
w := testutil.MakeRequest(router, "DELETE", fmt.Sprintf("/api/shared-residences/%d/", residence.ID), nil, "test-token")
|
||||
w := testutil.MakeRequest(e, "DELETE", fmt.Sprintf("/api/shared-residences/%d/", residence.ID), nil, "test-token")
|
||||
|
||||
testutil.AssertStatusCode(t, w, http.StatusForbidden)
|
||||
})
|
||||
|
||||
t.Run("owner can delete", func(t *testing.T) {
|
||||
w := testutil.MakeRequest(router, "DELETE", fmt.Sprintf("/api/residences/%d/", residence.ID), nil, "test-token")
|
||||
w := testutil.MakeRequest(e, "DELETE", fmt.Sprintf("/api/residences/%d/", residence.ID), nil, "test-token")
|
||||
|
||||
testutil.AssertStatusCode(t, w, http.StatusOK)
|
||||
|
||||
@@ -285,11 +285,11 @@ func TestResidenceHandler_DeleteResidence(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestResidenceHandler_GenerateShareCode(t *testing.T) {
|
||||
handler, router, db := setupResidenceHandler(t)
|
||||
handler, e, db := setupResidenceHandler(t)
|
||||
user := testutil.CreateTestUser(t, db, "owner", "owner@test.com", "password")
|
||||
residence := testutil.CreateTestResidence(t, db, user.ID, "Share Test")
|
||||
|
||||
authGroup := router.Group("/api/residences")
|
||||
authGroup := e.Group("/api/residences")
|
||||
authGroup.Use(testutil.MockAuthMiddleware(user))
|
||||
authGroup.POST("/:id/generate-share-code/", handler.GenerateShareCode)
|
||||
|
||||
@@ -298,7 +298,7 @@ func TestResidenceHandler_GenerateShareCode(t *testing.T) {
|
||||
ExpiresInHours: 24,
|
||||
}
|
||||
|
||||
w := testutil.MakeRequest(router, "POST", fmt.Sprintf("/api/residences/%d/generate-share-code/", residence.ID), req, "test-token")
|
||||
w := testutil.MakeRequest(e, "POST", fmt.Sprintf("/api/residences/%d/generate-share-code/", residence.ID), req, "test-token")
|
||||
|
||||
testutil.AssertStatusCode(t, w, http.StatusOK)
|
||||
|
||||
@@ -314,7 +314,7 @@ func TestResidenceHandler_GenerateShareCode(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestResidenceHandler_JoinWithCode(t *testing.T) {
|
||||
handler, router, db := setupResidenceHandler(t)
|
||||
handler, e, db := setupResidenceHandler(t)
|
||||
owner := testutil.CreateTestUser(t, db, "owner", "owner@test.com", "password")
|
||||
newUser := testutil.CreateTestUser(t, db, "newuser", "new@test.com", "password")
|
||||
residence := testutil.CreateTestResidence(t, db, owner.ID, "Join Test")
|
||||
@@ -326,11 +326,11 @@ func TestResidenceHandler_JoinWithCode(t *testing.T) {
|
||||
residenceService := services.NewResidenceService(residenceRepo, userRepo, cfg)
|
||||
shareResp, _ := residenceService.GenerateShareCode(residence.ID, owner.ID, 24)
|
||||
|
||||
authGroup := router.Group("/api/residences")
|
||||
authGroup := e.Group("/api/residences")
|
||||
authGroup.Use(testutil.MockAuthMiddleware(newUser))
|
||||
authGroup.POST("/join-with-code/", handler.JoinWithCode)
|
||||
|
||||
ownerGroup := router.Group("/api/owner-residences")
|
||||
ownerGroup := e.Group("/api/owner-residences")
|
||||
ownerGroup.Use(testutil.MockAuthMiddleware(owner))
|
||||
ownerGroup.POST("/join-with-code/", handler.JoinWithCode)
|
||||
|
||||
@@ -339,7 +339,7 @@ func TestResidenceHandler_JoinWithCode(t *testing.T) {
|
||||
Code: shareResp.ShareCode.Code,
|
||||
}
|
||||
|
||||
w := testutil.MakeRequest(router, "POST", "/api/residences/join-with-code/", req, "test-token")
|
||||
w := testutil.MakeRequest(e, "POST", "/api/residences/join-with-code/", req, "test-token")
|
||||
|
||||
testutil.AssertStatusCode(t, w, http.StatusOK)
|
||||
|
||||
@@ -363,7 +363,7 @@ func TestResidenceHandler_JoinWithCode(t *testing.T) {
|
||||
Code: shareResp2.ShareCode.Code,
|
||||
}
|
||||
|
||||
w := testutil.MakeRequest(router, "POST", "/api/owner-residences/join-with-code/", req, "test-token")
|
||||
w := testutil.MakeRequest(e, "POST", "/api/owner-residences/join-with-code/", req, "test-token")
|
||||
|
||||
testutil.AssertStatusCode(t, w, http.StatusConflict)
|
||||
})
|
||||
@@ -373,14 +373,14 @@ func TestResidenceHandler_JoinWithCode(t *testing.T) {
|
||||
Code: "ABCDEF", // Valid length (6) but non-existent code
|
||||
}
|
||||
|
||||
w := testutil.MakeRequest(router, "POST", "/api/residences/join-with-code/", req, "test-token")
|
||||
w := testutil.MakeRequest(e, "POST", "/api/residences/join-with-code/", req, "test-token")
|
||||
|
||||
testutil.AssertStatusCode(t, w, http.StatusNotFound)
|
||||
})
|
||||
}
|
||||
|
||||
func TestResidenceHandler_GetResidenceUsers(t *testing.T) {
|
||||
handler, router, db := setupResidenceHandler(t)
|
||||
handler, e, db := setupResidenceHandler(t)
|
||||
owner := testutil.CreateTestUser(t, db, "owner", "owner@test.com", "password")
|
||||
sharedUser := testutil.CreateTestUser(t, db, "shared", "shared@test.com", "password")
|
||||
residence := testutil.CreateTestResidence(t, db, owner.ID, "Users Test")
|
||||
@@ -388,12 +388,12 @@ func TestResidenceHandler_GetResidenceUsers(t *testing.T) {
|
||||
residenceRepo := repositories.NewResidenceRepository(db)
|
||||
residenceRepo.AddUser(residence.ID, sharedUser.ID)
|
||||
|
||||
authGroup := router.Group("/api/residences")
|
||||
authGroup := e.Group("/api/residences")
|
||||
authGroup.Use(testutil.MockAuthMiddleware(owner))
|
||||
authGroup.GET("/:id/users/", handler.GetResidenceUsers)
|
||||
|
||||
t.Run("get residence users", func(t *testing.T) {
|
||||
w := testutil.MakeRequest(router, "GET", fmt.Sprintf("/api/residences/%d/users/", residence.ID), nil, "test-token")
|
||||
w := testutil.MakeRequest(e, "GET", fmt.Sprintf("/api/residences/%d/users/", residence.ID), nil, "test-token")
|
||||
|
||||
testutil.AssertStatusCode(t, w, http.StatusOK)
|
||||
|
||||
@@ -406,7 +406,7 @@ func TestResidenceHandler_GetResidenceUsers(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestResidenceHandler_RemoveUser(t *testing.T) {
|
||||
handler, router, db := setupResidenceHandler(t)
|
||||
handler, e, db := setupResidenceHandler(t)
|
||||
owner := testutil.CreateTestUser(t, db, "owner", "owner@test.com", "password")
|
||||
sharedUser := testutil.CreateTestUser(t, db, "shared", "shared@test.com", "password")
|
||||
residence := testutil.CreateTestResidence(t, db, owner.ID, "Remove Test")
|
||||
@@ -414,12 +414,12 @@ func TestResidenceHandler_RemoveUser(t *testing.T) {
|
||||
residenceRepo := repositories.NewResidenceRepository(db)
|
||||
residenceRepo.AddUser(residence.ID, sharedUser.ID)
|
||||
|
||||
authGroup := router.Group("/api/residences")
|
||||
authGroup := e.Group("/api/residences")
|
||||
authGroup.Use(testutil.MockAuthMiddleware(owner))
|
||||
authGroup.DELETE("/:id/users/:user_id/", handler.RemoveResidenceUser)
|
||||
|
||||
t.Run("remove shared user", func(t *testing.T) {
|
||||
w := testutil.MakeRequest(router, "DELETE", fmt.Sprintf("/api/residences/%d/users/%d/", residence.ID, sharedUser.ID), nil, "test-token")
|
||||
w := testutil.MakeRequest(e, "DELETE", fmt.Sprintf("/api/residences/%d/users/%d/", residence.ID, sharedUser.ID), nil, "test-token")
|
||||
|
||||
testutil.AssertStatusCode(t, w, http.StatusOK)
|
||||
|
||||
@@ -428,23 +428,23 @@ func TestResidenceHandler_RemoveUser(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("cannot remove owner", func(t *testing.T) {
|
||||
w := testutil.MakeRequest(router, "DELETE", fmt.Sprintf("/api/residences/%d/users/%d/", residence.ID, owner.ID), nil, "test-token")
|
||||
w := testutil.MakeRequest(e, "DELETE", fmt.Sprintf("/api/residences/%d/users/%d/", residence.ID, owner.ID), nil, "test-token")
|
||||
|
||||
testutil.AssertStatusCode(t, w, http.StatusBadRequest)
|
||||
})
|
||||
}
|
||||
|
||||
func TestResidenceHandler_GetResidenceTypes(t *testing.T) {
|
||||
handler, router, db := setupResidenceHandler(t)
|
||||
handler, e, db := setupResidenceHandler(t)
|
||||
testutil.SeedLookupData(t, db)
|
||||
user := testutil.CreateTestUser(t, db, "user", "user@test.com", "password")
|
||||
|
||||
authGroup := router.Group("/api/residences")
|
||||
authGroup := e.Group("/api/residences")
|
||||
authGroup.Use(testutil.MockAuthMiddleware(user))
|
||||
authGroup.GET("/types/", handler.GetResidenceTypes)
|
||||
|
||||
t.Run("get residence types", func(t *testing.T) {
|
||||
w := testutil.MakeRequest(router, "GET", "/api/residences/types/", nil, "test-token")
|
||||
w := testutil.MakeRequest(e, "GET", "/api/residences/types/", nil, "test-token")
|
||||
|
||||
testutil.AssertStatusCode(t, w, http.StatusOK)
|
||||
|
||||
@@ -457,10 +457,10 @@ func TestResidenceHandler_GetResidenceTypes(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestResidenceHandler_JSONResponses(t *testing.T) {
|
||||
handler, router, db := setupResidenceHandler(t)
|
||||
handler, e, db := setupResidenceHandler(t)
|
||||
user := testutil.CreateTestUser(t, db, "owner", "owner@test.com", "password")
|
||||
|
||||
authGroup := router.Group("/api/residences")
|
||||
authGroup := e.Group("/api/residences")
|
||||
authGroup.Use(testutil.MockAuthMiddleware(user))
|
||||
authGroup.POST("/", handler.CreateResidence)
|
||||
authGroup.GET("/", handler.ListResidences)
|
||||
@@ -474,7 +474,7 @@ func TestResidenceHandler_JSONResponses(t *testing.T) {
|
||||
PostalCode: "78701",
|
||||
}
|
||||
|
||||
w := testutil.MakeRequest(router, "POST", "/api/residences/", req, "test-token")
|
||||
w := testutil.MakeRequest(e, "POST", "/api/residences/", req, "test-token")
|
||||
|
||||
testutil.AssertStatusCode(t, w, http.StatusCreated)
|
||||
|
||||
@@ -513,7 +513,7 @@ func TestResidenceHandler_JSONResponses(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("list response returns array", func(t *testing.T) {
|
||||
w := testutil.MakeRequest(router, "GET", "/api/residences/", nil, "test-token")
|
||||
w := testutil.MakeRequest(e, "GET", "/api/residences/", nil, "test-token")
|
||||
|
||||
testutil.AssertStatusCode(t, w, http.StatusOK)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user