add tests
This commit is contained in:
598
tests/unit/controller/membership_controller_test.go.disabled
Normal file
598
tests/unit/controller/membership_controller_test.go.disabled
Normal file
@@ -0,0 +1,598 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"acc-server-manager/local/controller"
|
||||
"acc-server-manager/local/model"
|
||||
"acc-server-manager/local/service"
|
||||
"acc-server-manager/local/utl/common"
|
||||
"acc-server-manager/tests"
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"io"
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
func TestMembershipController_Login_Success(t *testing.T) {
|
||||
// Setup
|
||||
helper := tests.NewTestHelper(t)
|
||||
defer helper.Cleanup()
|
||||
|
||||
// Create mock service
|
||||
mockMembershipService := &MockMembershipService{
|
||||
loginResponse: "mock-jwt-token-12345",
|
||||
}
|
||||
|
||||
// Create Fiber app with controller
|
||||
app := fiber.New()
|
||||
routeGroups := &common.RouteGroups{
|
||||
Auth: app.Group("/auth"),
|
||||
Membership: app.Group("/membership"),
|
||||
}
|
||||
mockAuth := &MockAuthMiddleware{}
|
||||
controller.NewMembershipController(mockMembershipService, mockAuth, routeGroups)
|
||||
|
||||
// Prepare request body
|
||||
loginData := map[string]string{
|
||||
"username": "testuser",
|
||||
"password": "password123",
|
||||
}
|
||||
bodyBytes, err := json.Marshal(loginData)
|
||||
tests.AssertNoError(t, err)
|
||||
|
||||
// Create test request
|
||||
req := httptest.NewRequest("POST", "/auth/login", bytes.NewReader(bodyBytes))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
|
||||
// Execute request
|
||||
resp, err := app.Test(req)
|
||||
tests.AssertNoError(t, err)
|
||||
tests.AssertEqual(t, 200, resp.StatusCode)
|
||||
|
||||
// Parse response
|
||||
var response map[string]string
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
tests.AssertNoError(t, err)
|
||||
err = json.Unmarshal(body, &response)
|
||||
tests.AssertNoError(t, err)
|
||||
|
||||
// Verify response
|
||||
tests.AssertEqual(t, "mock-jwt-token-12345", response["token"])
|
||||
tests.AssertEqual(t, true, mockMembershipService.loginCalled)
|
||||
}
|
||||
|
||||
func TestMembershipController_Login_InvalidCredentials(t *testing.T) {
|
||||
// Setup
|
||||
helper := tests.NewTestHelper(t)
|
||||
defer helper.Cleanup()
|
||||
|
||||
// Create mock service with login failure
|
||||
mockMembershipService := &MockMembershipService{
|
||||
shouldFailLogin: true,
|
||||
}
|
||||
|
||||
// Create Fiber app with controller
|
||||
app := fiber.New()
|
||||
routeGroups := &common.RouteGroups{
|
||||
Auth: app.Group("/auth"),
|
||||
Membership: app.Group("/membership"),
|
||||
}
|
||||
mockAuth := &MockAuthMiddleware{}
|
||||
controller.NewMembershipController(mockMembershipService, mockAuth, routeGroups)
|
||||
|
||||
// Prepare request body
|
||||
loginData := map[string]string{
|
||||
"username": "baduser",
|
||||
"password": "wrongpassword",
|
||||
}
|
||||
bodyBytes, err := json.Marshal(loginData)
|
||||
tests.AssertNoError(t, err)
|
||||
|
||||
// Create test request
|
||||
req := httptest.NewRequest("POST", "/auth/login", bytes.NewReader(bodyBytes))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
|
||||
// Execute request
|
||||
resp, err := app.Test(req)
|
||||
tests.AssertNoError(t, err)
|
||||
tests.AssertEqual(t, 401, resp.StatusCode)
|
||||
|
||||
// Verify service was called
|
||||
tests.AssertEqual(t, true, mockMembershipService.loginCalled)
|
||||
}
|
||||
|
||||
func TestMembershipController_Login_InvalidJSON(t *testing.T) {
|
||||
// Setup
|
||||
helper := tests.NewTestHelper(t)
|
||||
defer helper.Cleanup()
|
||||
|
||||
// Create mock service
|
||||
mockMembershipService := &MockMembershipService{}
|
||||
|
||||
// Create Fiber app with controller
|
||||
app := fiber.New()
|
||||
routeGroups := &common.RouteGroups{
|
||||
Auth: app.Group("/auth"),
|
||||
Membership: app.Group("/membership"),
|
||||
}
|
||||
mockAuth := &MockAuthMiddleware{}
|
||||
controller.NewMembershipController(mockMembershipService, mockAuth, routeGroups)
|
||||
|
||||
// Create test request with invalid JSON
|
||||
req := httptest.NewRequest("POST", "/auth/login", bytes.NewReader([]byte("invalid json")))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
|
||||
// Execute request
|
||||
resp, err := app.Test(req)
|
||||
tests.AssertNoError(t, err)
|
||||
tests.AssertEqual(t, 400, resp.StatusCode)
|
||||
|
||||
// Verify service was not called
|
||||
tests.AssertEqual(t, false, mockMembershipService.loginCalled)
|
||||
}
|
||||
|
||||
func TestMembershipController_CreateUser_Success(t *testing.T) {
|
||||
// Setup
|
||||
helper := tests.NewTestHelper(t)
|
||||
defer helper.Cleanup()
|
||||
|
||||
// Create expected user response
|
||||
expectedUser := &model.User{
|
||||
ID: uuid.New(),
|
||||
Username: "newuser",
|
||||
RoleID: uuid.New(),
|
||||
}
|
||||
|
||||
// Create mock service
|
||||
mockMembershipService := &MockMembershipService{
|
||||
createUserResponse: expectedUser,
|
||||
}
|
||||
|
||||
// Create Fiber app with controller
|
||||
app := fiber.New()
|
||||
routeGroups := &common.RouteGroups{
|
||||
Auth: app.Group("/auth"),
|
||||
Membership: app.Group("/membership"),
|
||||
}
|
||||
mockAuth := &MockAuthMiddleware{authenticated: true}
|
||||
controller.NewMembershipController(mockMembershipService, mockAuth, routeGroups)
|
||||
|
||||
// Prepare request body
|
||||
createUserData := map[string]string{
|
||||
"username": "newuser",
|
||||
"password": "password123",
|
||||
"role": "User",
|
||||
}
|
||||
bodyBytes, err := json.Marshal(createUserData)
|
||||
tests.AssertNoError(t, err)
|
||||
|
||||
// Create test request
|
||||
req := httptest.NewRequest("POST", "/membership/", bytes.NewReader(bodyBytes))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
|
||||
// Execute request
|
||||
resp, err := app.Test(req)
|
||||
tests.AssertNoError(t, err)
|
||||
tests.AssertEqual(t, 200, resp.StatusCode)
|
||||
|
||||
// Parse response
|
||||
var response model.User
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
tests.AssertNoError(t, err)
|
||||
err = json.Unmarshal(body, &response)
|
||||
tests.AssertNoError(t, err)
|
||||
|
||||
// Verify response
|
||||
tests.AssertEqual(t, expectedUser.ID, response.ID)
|
||||
tests.AssertEqual(t, expectedUser.Username, response.Username)
|
||||
tests.AssertEqual(t, true, mockMembershipService.createUserCalled)
|
||||
}
|
||||
|
||||
func TestMembershipController_CreateUser_Unauthorized(t *testing.T) {
|
||||
// Setup
|
||||
helper := tests.NewTestHelper(t)
|
||||
defer helper.Cleanup()
|
||||
|
||||
// Create mock service
|
||||
mockMembershipService := &MockMembershipService{}
|
||||
|
||||
// Create Fiber app with controller
|
||||
app := fiber.New()
|
||||
routeGroups := &common.RouteGroups{
|
||||
Auth: app.Group("/auth"),
|
||||
Membership: app.Group("/membership"),
|
||||
}
|
||||
mockAuth := &MockAuthMiddleware{authenticated: false}
|
||||
controller.NewMembershipController(mockMembershipService, mockAuth, routeGroups)
|
||||
|
||||
// Prepare request body
|
||||
createUserData := map[string]string{
|
||||
"username": "newuser",
|
||||
"password": "password123",
|
||||
"role": "User",
|
||||
}
|
||||
bodyBytes, err := json.Marshal(createUserData)
|
||||
tests.AssertNoError(t, err)
|
||||
|
||||
// Create test request
|
||||
req := httptest.NewRequest("POST", "/membership/", bytes.NewReader(bodyBytes))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
|
||||
// Execute request
|
||||
resp, err := app.Test(req)
|
||||
tests.AssertNoError(t, err)
|
||||
tests.AssertEqual(t, 401, resp.StatusCode)
|
||||
|
||||
// Verify service was not called
|
||||
tests.AssertEqual(t, false, mockMembershipService.createUserCalled)
|
||||
}
|
||||
|
||||
func TestMembershipController_CreateUser_Forbidden(t *testing.T) {
|
||||
// Setup
|
||||
helper := tests.NewTestHelper(t)
|
||||
defer helper.Cleanup()
|
||||
|
||||
// Create mock service
|
||||
mockMembershipService := &MockMembershipService{}
|
||||
|
||||
// Create Fiber app with controller
|
||||
app := fiber.New()
|
||||
routeGroups := &common.RouteGroups{
|
||||
Auth: app.Group("/auth"),
|
||||
Membership: app.Group("/membership"),
|
||||
}
|
||||
mockAuth := &MockAuthMiddleware{
|
||||
authenticated: true,
|
||||
hasPermission: false, // User doesn't have MembershipCreate permission
|
||||
}
|
||||
controller.NewMembershipController(mockMembershipService, mockAuth, routeGroups)
|
||||
|
||||
// Prepare request body
|
||||
createUserData := map[string]string{
|
||||
"username": "newuser",
|
||||
"password": "password123",
|
||||
"role": "User",
|
||||
}
|
||||
bodyBytes, err := json.Marshal(createUserData)
|
||||
tests.AssertNoError(t, err)
|
||||
|
||||
// Create test request
|
||||
req := httptest.NewRequest("POST", "/membership/", bytes.NewReader(bodyBytes))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
|
||||
// Execute request
|
||||
resp, err := app.Test(req)
|
||||
tests.AssertNoError(t, err)
|
||||
tests.AssertEqual(t, 403, resp.StatusCode)
|
||||
|
||||
// Verify service was not called
|
||||
tests.AssertEqual(t, false, mockMembershipService.createUserCalled)
|
||||
}
|
||||
|
||||
func TestMembershipController_ListUsers_Success(t *testing.T) {
|
||||
// Setup
|
||||
helper := tests.NewTestHelper(t)
|
||||
defer helper.Cleanup()
|
||||
|
||||
// Create expected users response
|
||||
expectedUsers := []*model.User{
|
||||
{
|
||||
ID: uuid.New(),
|
||||
Username: "user1",
|
||||
RoleID: uuid.New(),
|
||||
},
|
||||
{
|
||||
ID: uuid.New(),
|
||||
Username: "user2",
|
||||
RoleID: uuid.New(),
|
||||
},
|
||||
}
|
||||
|
||||
// Create mock service
|
||||
mockMembershipService := &MockMembershipService{
|
||||
listUsersResponse: expectedUsers,
|
||||
}
|
||||
|
||||
// Create Fiber app with controller
|
||||
app := fiber.New()
|
||||
routeGroups := &common.RouteGroups{
|
||||
Auth: app.Group("/auth"),
|
||||
Membership: app.Group("/membership"),
|
||||
}
|
||||
mockAuth := &MockAuthMiddleware{
|
||||
authenticated: true,
|
||||
hasPermission: true,
|
||||
}
|
||||
controller.NewMembershipController(mockMembershipService, mockAuth, routeGroups)
|
||||
|
||||
// Create test request
|
||||
req := httptest.NewRequest("GET", "/membership/", nil)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
|
||||
// Execute request
|
||||
resp, err := app.Test(req)
|
||||
tests.AssertNoError(t, err)
|
||||
tests.AssertEqual(t, 200, resp.StatusCode)
|
||||
|
||||
// Parse response
|
||||
var response []*model.User
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
tests.AssertNoError(t, err)
|
||||
err = json.Unmarshal(body, &response)
|
||||
tests.AssertNoError(t, err)
|
||||
|
||||
// Verify response
|
||||
tests.AssertEqual(t, 2, len(response))
|
||||
tests.AssertEqual(t, expectedUsers[0].Username, response[0].Username)
|
||||
tests.AssertEqual(t, expectedUsers[1].Username, response[1].Username)
|
||||
tests.AssertEqual(t, true, mockMembershipService.listUsersCalled)
|
||||
}
|
||||
|
||||
func TestMembershipController_GetUser_Success(t *testing.T) {
|
||||
// Setup
|
||||
helper := tests.NewTestHelper(t)
|
||||
defer helper.Cleanup()
|
||||
|
||||
// Create expected user response
|
||||
userID := uuid.New()
|
||||
expectedUser := &model.User{
|
||||
ID: userID,
|
||||
Username: "testuser",
|
||||
RoleID: uuid.New(),
|
||||
}
|
||||
|
||||
// Create mock service
|
||||
mockMembershipService := &MockMembershipService{
|
||||
getUserResponse: expectedUser,
|
||||
}
|
||||
|
||||
// Create Fiber app with controller
|
||||
app := fiber.New()
|
||||
routeGroups := &common.RouteGroups{
|
||||
Auth: app.Group("/auth"),
|
||||
Membership: app.Group("/membership"),
|
||||
}
|
||||
mockAuth := &MockAuthMiddleware{
|
||||
authenticated: true,
|
||||
hasPermission: true,
|
||||
}
|
||||
controller.NewMembershipController(mockMembershipService, mockAuth, routeGroups)
|
||||
|
||||
// Create test request
|
||||
req := httptest.NewRequest("GET", "/membership/"+userID.String(), nil)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
|
||||
// Execute request
|
||||
resp, err := app.Test(req)
|
||||
tests.AssertNoError(t, err)
|
||||
tests.AssertEqual(t, 200, resp.StatusCode)
|
||||
|
||||
// Parse response
|
||||
var response model.User
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
tests.AssertNoError(t, err)
|
||||
err = json.Unmarshal(body, &response)
|
||||
tests.AssertNoError(t, err)
|
||||
|
||||
// Verify response
|
||||
tests.AssertEqual(t, expectedUser.ID, response.ID)
|
||||
tests.AssertEqual(t, expectedUser.Username, response.Username)
|
||||
tests.AssertEqual(t, true, mockMembershipService.getUserCalled)
|
||||
}
|
||||
|
||||
func TestMembershipController_GetUser_InvalidUUID(t *testing.T) {
|
||||
// Setup
|
||||
helper := tests.NewTestHelper(t)
|
||||
defer helper.Cleanup()
|
||||
|
||||
// Create mock service
|
||||
mockMembershipService := &MockMembershipService{}
|
||||
|
||||
// Create Fiber app with controller
|
||||
app := fiber.New()
|
||||
routeGroups := &common.RouteGroups{
|
||||
Auth: app.Group("/auth"),
|
||||
Membership: app.Group("/membership"),
|
||||
}
|
||||
mockAuth := &MockAuthMiddleware{
|
||||
authenticated: true,
|
||||
hasPermission: true,
|
||||
}
|
||||
controller.NewMembershipController(mockMembershipService, mockAuth, routeGroups)
|
||||
|
||||
// Create test request with invalid UUID
|
||||
req := httptest.NewRequest("GET", "/membership/invalid-uuid", nil)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
|
||||
// Execute request
|
||||
resp, err := app.Test(req)
|
||||
tests.AssertNoError(t, err)
|
||||
tests.AssertEqual(t, 400, resp.StatusCode)
|
||||
|
||||
// Verify service was not called
|
||||
tests.AssertEqual(t, false, mockMembershipService.getUserCalled)
|
||||
}
|
||||
|
||||
func TestMembershipController_DeleteUser_Success(t *testing.T) {
|
||||
// Setup
|
||||
helper := tests.NewTestHelper(t)
|
||||
defer helper.Cleanup()
|
||||
|
||||
// Create mock service
|
||||
mockMembershipService := &MockMembershipService{}
|
||||
|
||||
// Create Fiber app with controller
|
||||
app := fiber.New()
|
||||
routeGroups := &common.RouteGroups{
|
||||
Auth: app.Group("/auth"),
|
||||
Membership: app.Group("/membership"),
|
||||
}
|
||||
mockAuth := &MockAuthMiddleware{
|
||||
authenticated: true,
|
||||
hasPermission: true,
|
||||
}
|
||||
controller.NewMembershipController(mockMembershipService, mockAuth, routeGroups)
|
||||
|
||||
// Create test request
|
||||
userID := uuid.New().String()
|
||||
req := httptest.NewRequest("DELETE", "/membership/"+userID, nil)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
|
||||
// Execute request
|
||||
resp, err := app.Test(req)
|
||||
tests.AssertNoError(t, err)
|
||||
tests.AssertEqual(t, 200, resp.StatusCode)
|
||||
|
||||
// Verify service was called
|
||||
tests.AssertEqual(t, true, mockMembershipService.deleteUserCalled)
|
||||
}
|
||||
|
||||
func TestMembershipController_GetMe_Success(t *testing.T) {
|
||||
// Setup
|
||||
helper := tests.NewTestHelper(t)
|
||||
defer helper.Cleanup()
|
||||
|
||||
// Create expected user response
|
||||
expectedUser := &model.User{
|
||||
ID: uuid.New(),
|
||||
Username: "currentuser",
|
||||
RoleID: uuid.New(),
|
||||
}
|
||||
|
||||
// Create mock service
|
||||
mockMembershipService := &MockMembershipService{
|
||||
getUserWithPermissionsResponse: expectedUser,
|
||||
}
|
||||
|
||||
// Create Fiber app with controller
|
||||
app := fiber.New()
|
||||
routeGroups := &common.RouteGroups{
|
||||
Auth: app.Group("/auth"),
|
||||
Membership: app.Group("/membership"),
|
||||
}
|
||||
mockAuth := &MockAuthMiddleware{authenticated: true}
|
||||
controller.NewMembershipController(mockMembershipService, mockAuth, routeGroups)
|
||||
|
||||
// Create test request
|
||||
req := httptest.NewRequest("GET", "/auth/me", nil)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
|
||||
// Execute request
|
||||
resp, err := app.Test(req)
|
||||
tests.AssertNoError(t, err)
|
||||
tests.AssertEqual(t, 200, resp.StatusCode)
|
||||
|
||||
// Parse response
|
||||
var response model.User
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
tests.AssertNoError(t, err)
|
||||
err = json.Unmarshal(body, &response)
|
||||
tests.AssertNoError(t, err)
|
||||
|
||||
// Verify response
|
||||
tests.AssertEqual(t, expectedUser.ID, response.ID)
|
||||
tests.AssertEqual(t, expectedUser.Username, response.Username)
|
||||
}
|
||||
|
||||
// MockMembershipService implements the MembershipService interface for testing
|
||||
type MockMembershipService struct {
|
||||
loginResponse string
|
||||
createUserResponse *model.User
|
||||
listUsersResponse []*model.User
|
||||
getUserResponse *model.User
|
||||
getUserWithPermissionsResponse *model.User
|
||||
getRolesResponse []*model.Role
|
||||
shouldFailLogin bool
|
||||
shouldFailCreateUser bool
|
||||
shouldFailListUsers bool
|
||||
shouldFailGetUser bool
|
||||
shouldFailGetUserWithPermissions bool
|
||||
shouldFailDeleteUser bool
|
||||
shouldFailUpdateUser bool
|
||||
shouldFailGetRoles bool
|
||||
loginCalled bool
|
||||
createUserCalled bool
|
||||
listUsersCalled bool
|
||||
getUserCalled bool
|
||||
getUserWithPermissionsCalled bool
|
||||
deleteUserCalled bool
|
||||
updateUserCalled bool
|
||||
getRolesCalled bool
|
||||
}
|
||||
|
||||
func (m *MockMembershipService) Login(ctx context.Context, username, password string) (string, error) {
|
||||
m.loginCalled = true
|
||||
if m.shouldFailLogin {
|
||||
return "", tests.ErrorForTesting("invalid credentials")
|
||||
}
|
||||
return m.loginResponse, nil
|
||||
}
|
||||
|
||||
func (m *MockMembershipService) CreateUser(ctx context.Context, username, password, roleName string) (*model.User, error) {
|
||||
m.createUserCalled = true
|
||||
if m.shouldFailCreateUser {
|
||||
return nil, tests.ErrorForTesting("failed to create user")
|
||||
}
|
||||
return m.createUserResponse, nil
|
||||
}
|
||||
|
||||
func (m *MockMembershipService) ListUsers(ctx context.Context) ([]*model.User, error) {
|
||||
m.listUsersCalled = true
|
||||
if m.shouldFailListUsers {
|
||||
return nil, tests.ErrorForTesting("failed to list users")
|
||||
}
|
||||
return m.listUsersResponse, nil
|
||||
}
|
||||
|
||||
func (m *MockMembershipService) GetUser(ctx context.Context, userID uuid.UUID) (*model.User, error) {
|
||||
m.getUserCalled = true
|
||||
if m.shouldFailGetUser {
|
||||
return nil, tests.ErrorForTesting("user not found")
|
||||
}
|
||||
return m.getUserResponse, nil
|
||||
}
|
||||
|
||||
func (m *MockMembershipService) GetUserWithPermissions(ctx context.Context, userID string) (*model.User, error) {
|
||||
m.getUserWithPermissionsCalled = true
|
||||
if m.shouldFailGetUserWithPermissions {
|
||||
return nil, tests.ErrorForTesting("user not found")
|
||||
}
|
||||
return m.getUserWithPermissionsResponse, nil
|
||||
}
|
||||
|
||||
func (m *MockMembershipService) DeleteUser(ctx context.Context, userID uuid.UUID) error {
|
||||
m.deleteUserCalled = true
|
||||
if m.shouldFailDeleteUser {
|
||||
return tests.ErrorForTesting("failed to delete user")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *MockMembershipService) UpdateUser(ctx context.Context, userID uuid.UUID, updates map[string]interface{}) (*model.User, error) {
|
||||
m.updateUserCalled = true
|
||||
if m.shouldFailUpdateUser {
|
||||
return nil, tests.ErrorForTesting("failed to update user")
|
||||
}
|
||||
return m.getUserResponse, nil
|
||||
}
|
||||
|
||||
func (m *MockMembershipService) GetRoles(ctx context.Context) ([]*model.Role, error) {
|
||||
m.getRolesCalled = true
|
||||
if m.shouldFailGetRoles {
|
||||
return nil, tests.ErrorForTesting("failed to get roles")
|
||||
}
|
||||
return m.getRolesResponse, nil
|
||||
}
|
||||
|
||||
func (m *MockMembershipService) SetCacheInvalidator(invalidator service.CacheInvalidator) {
|
||||
// Mock implementation
|
||||
}
|
||||
|
||||
func (m *MockMembershipService) SetupInitialData(ctx context.Context) error {
|
||||
// Mock implementation - no-op for testing
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user