2025-12-03 19:29:37 +00:00
|
|
|
package services
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"testing"
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"github.com/google/uuid"
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
2025-12-06 16:21:59 +00:00
|
|
|
"github.com/stretchr/testify/require"
|
2025-12-03 19:29:37 +00:00
|
|
|
"go.uber.org/zap"
|
2025-12-06 16:21:59 +00:00
|
|
|
"gorm.io/driver/sqlite"
|
2025-12-03 19:29:37 +00:00
|
|
|
"gorm.io/gorm"
|
|
|
|
|
"veza-backend-api/internal/models"
|
|
|
|
|
"veza-backend-api/internal/repositories"
|
|
|
|
|
)
|
|
|
|
|
|
2025-12-06 16:21:59 +00:00
|
|
|
func setupTestRoomService(t *testing.T) (*RoomService, *gorm.DB) {
|
|
|
|
|
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
|
|
|
|
|
require.NoError(t, err)
|
2025-12-03 19:29:37 +00:00
|
|
|
|
2025-12-06 16:21:59 +00:00
|
|
|
// Enable foreign keys
|
|
|
|
|
db.Exec("PRAGMA foreign_keys = ON")
|
2025-12-03 19:29:37 +00:00
|
|
|
|
2025-12-06 16:21:59 +00:00
|
|
|
err = db.AutoMigrate(&models.User{}, &models.Room{}, &models.RoomMember{}, &models.ChatMessage{})
|
|
|
|
|
require.NoError(t, err)
|
2025-12-03 19:29:37 +00:00
|
|
|
|
2025-12-06 16:21:59 +00:00
|
|
|
logger := zap.NewNop()
|
|
|
|
|
roomRepo := repositories.NewRoomRepository(db)
|
|
|
|
|
messageRepo := repositories.NewChatMessageRepository(db)
|
|
|
|
|
service := NewRoomService(roomRepo, messageRepo, logger)
|
2025-12-03 19:29:37 +00:00
|
|
|
|
2025-12-06 16:21:59 +00:00
|
|
|
return service, db
|
2025-12-03 19:29:37 +00:00
|
|
|
}
|
|
|
|
|
|
2025-12-06 16:21:59 +00:00
|
|
|
func createTestUserForRoom(t *testing.T, db *gorm.DB, username string) *models.User {
|
|
|
|
|
user := &models.User{
|
|
|
|
|
ID: uuid.New(),
|
|
|
|
|
Username: username,
|
|
|
|
|
Email: username + "@example.com",
|
|
|
|
|
PasswordHash: "hash",
|
|
|
|
|
IsActive: true,
|
2025-12-03 19:29:37 +00:00
|
|
|
}
|
2025-12-06 16:21:59 +00:00
|
|
|
err := db.Create(user).Error
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
return user
|
2025-12-03 19:29:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestRoomService_CreateRoom(t *testing.T) {
|
2025-12-06 16:21:59 +00:00
|
|
|
service, db := setupTestRoomService(t)
|
|
|
|
|
user := createTestUserForRoom(t, db, "user1")
|
2025-12-03 19:29:37 +00:00
|
|
|
|
|
|
|
|
req := CreateRoomRequest{
|
|
|
|
|
Name: "Test Room",
|
|
|
|
|
Type: "public",
|
|
|
|
|
IsPrivate: false,
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-06 16:21:59 +00:00
|
|
|
room, err := service.CreateRoom(context.Background(), user.ID, req)
|
2025-12-03 19:29:37 +00:00
|
|
|
assert.NoError(t, err)
|
|
|
|
|
assert.NotNil(t, room)
|
|
|
|
|
assert.Equal(t, req.Name, room.Name)
|
2025-12-06 16:21:59 +00:00
|
|
|
assert.Contains(t, room.Participants, user.ID)
|
2025-12-03 19:29:37 +00:00
|
|
|
|
2025-12-06 16:21:59 +00:00
|
|
|
// Verify room created in DB
|
|
|
|
|
var createdRoom models.Room
|
|
|
|
|
err = db.First(&createdRoom, "id = ?", room.ID).Error
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
assert.Equal(t, room.ID, createdRoom.ID)
|
2025-12-03 19:29:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestRoomService_GetUserRooms(t *testing.T) {
|
2025-12-06 16:21:59 +00:00
|
|
|
service, db := setupTestRoomService(t)
|
|
|
|
|
user1 := createTestUserForRoom(t, db, "user1")
|
|
|
|
|
user2 := createTestUserForRoom(t, db, "user2")
|
2025-12-03 19:29:37 +00:00
|
|
|
|
|
|
|
|
roomReq1 := CreateRoomRequest{Name: "Room 1", Type: "public", IsPrivate: false}
|
|
|
|
|
roomReq2 := CreateRoomRequest{Name: "Room 2", Type: "private", IsPrivate: true}
|
|
|
|
|
|
2025-12-06 16:21:59 +00:00
|
|
|
room1, err := service.CreateRoom(context.Background(), user1.ID, roomReq1)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
room2, err := service.CreateRoom(context.Background(), user2.ID, roomReq2)
|
|
|
|
|
require.NoError(t, err)
|
2025-12-03 19:29:37 +00:00
|
|
|
|
|
|
|
|
// User 1 joins room 2
|
2025-12-06 16:21:59 +00:00
|
|
|
err = service.AddMember(context.Background(), room2.ID, user1.ID)
|
2025-12-03 19:29:37 +00:00
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
2025-12-06 16:21:59 +00:00
|
|
|
rooms, err := service.GetUserRooms(context.Background(), user1.ID)
|
2025-12-03 19:29:37 +00:00
|
|
|
assert.NoError(t, err)
|
|
|
|
|
assert.Len(t, rooms, 2) // Should contain Room 1 and Room 2
|
|
|
|
|
|
|
|
|
|
// Check content
|
|
|
|
|
var foundRoom1, foundRoom2 bool
|
|
|
|
|
for _, r := range rooms {
|
|
|
|
|
if r.ID == room1.ID {
|
|
|
|
|
foundRoom1 = true
|
|
|
|
|
}
|
|
|
|
|
if r.ID == room2.ID {
|
|
|
|
|
foundRoom2 = true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
assert.True(t, foundRoom1)
|
|
|
|
|
assert.True(t, foundRoom2)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestRoomService_GetRoomHistory(t *testing.T) {
|
2025-12-06 16:21:59 +00:00
|
|
|
service, db := setupTestRoomService(t)
|
|
|
|
|
user := createTestUserForRoom(t, db, "user1")
|
2025-12-03 19:29:37 +00:00
|
|
|
|
2025-12-06 16:21:59 +00:00
|
|
|
// Create a room
|
2025-12-03 19:29:37 +00:00
|
|
|
roomReq := CreateRoomRequest{Name: "History Room", Type: "public", IsPrivate: false}
|
2025-12-06 16:21:59 +00:00
|
|
|
room, err := service.CreateRoom(context.Background(), user.ID, roomReq)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
// Add messages to DB
|
|
|
|
|
msgs := []models.ChatMessage{
|
|
|
|
|
{ID: uuid.New(), ConversationID: room.ID, SenderID: user.ID, Content: "Hello 1", CreatedAt: time.Now().Add(-2 * time.Minute)},
|
|
|
|
|
{ID: uuid.New(), ConversationID: room.ID, SenderID: user.ID, Content: "Hello 2", CreatedAt: time.Now().Add(-1 * time.Minute)},
|
|
|
|
|
{ID: uuid.New(), ConversationID: room.ID, SenderID: user.ID, Content: "Hello 3", CreatedAt: time.Now()},
|
|
|
|
|
}
|
|
|
|
|
for _, msg := range msgs {
|
|
|
|
|
db.Create(&msg)
|
2025-12-03 19:29:37 +00:00
|
|
|
}
|
|
|
|
|
|
2025-12-06 16:21:59 +00:00
|
|
|
history, err := service.GetRoomHistory(context.Background(), room.ID, 10, 0)
|
2025-12-03 19:29:37 +00:00
|
|
|
assert.NoError(t, err)
|
|
|
|
|
assert.Len(t, history, 3)
|
2025-12-06 16:21:59 +00:00
|
|
|
assert.Equal(t, "Hello 3", history[0].Content) // ordered by created_at DESC
|
2025-12-03 19:29:37 +00:00
|
|
|
|
2025-12-06 16:21:59 +00:00
|
|
|
history, err = service.GetRoomHistory(context.Background(), room.ID, 1, 1) // limit 1, offset 1
|
2025-12-03 19:29:37 +00:00
|
|
|
assert.NoError(t, err)
|
|
|
|
|
assert.Len(t, history, 1)
|
|
|
|
|
assert.Equal(t, "Hello 2", history[0].Content)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestRoomService_GetRoom_Success(t *testing.T) {
|
2025-12-06 16:21:59 +00:00
|
|
|
service, db := setupTestRoomService(t)
|
|
|
|
|
user := createTestUserForRoom(t, db, "user1")
|
2025-12-03 19:29:37 +00:00
|
|
|
|
|
|
|
|
req := CreateRoomRequest{Name: "Single Room", Type: "public", IsPrivate: false}
|
2025-12-06 16:21:59 +00:00
|
|
|
createdRoom, err := service.CreateRoom(context.Background(), user.ID, req)
|
|
|
|
|
require.NoError(t, err)
|
2025-12-03 19:29:37 +00:00
|
|
|
|
|
|
|
|
retrievedRoom, err := service.GetRoom(context.Background(), createdRoom.ID)
|
|
|
|
|
assert.NoError(t, err)
|
2025-12-08 18:57:54 +00:00
|
|
|
require.NotNil(t, retrievedRoom)
|
2025-12-03 19:29:37 +00:00
|
|
|
assert.Equal(t, createdRoom.ID, retrievedRoom.ID)
|
|
|
|
|
assert.Equal(t, "Single Room", retrievedRoom.Name)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestRoomService_GetRoom_NotFound(t *testing.T) {
|
2025-12-06 16:21:59 +00:00
|
|
|
service, _ := setupTestRoomService(t)
|
2025-12-03 19:29:37 +00:00
|
|
|
|
|
|
|
|
_, err := service.GetRoom(context.Background(), uuid.New())
|
|
|
|
|
assert.Error(t, err)
|
2025-12-06 16:21:59 +00:00
|
|
|
// GORM RecordNotFound might be wrapped or returned as error
|
|
|
|
|
// Implementation returns fmt.Errorf("failed to get room: %w", err)
|
|
|
|
|
// So we assume it errors out.
|
2025-12-03 19:29:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestRoomService_AddMember_Success(t *testing.T) {
|
2025-12-06 16:21:59 +00:00
|
|
|
service, db := setupTestRoomService(t)
|
|
|
|
|
user1 := createTestUserForRoom(t, db, "user1")
|
|
|
|
|
user2 := createTestUserForRoom(t, db, "user2")
|
2025-12-03 19:29:37 +00:00
|
|
|
|
|
|
|
|
roomReq := CreateRoomRequest{Name: "Member Room", Type: "public", IsPrivate: false}
|
2025-12-06 16:21:59 +00:00
|
|
|
room, err := service.CreateRoom(context.Background(), user1.ID, roomReq)
|
|
|
|
|
require.NoError(t, err)
|
2025-12-03 19:29:37 +00:00
|
|
|
|
2025-12-06 16:21:59 +00:00
|
|
|
err = service.AddMember(context.Background(), room.ID, user2.ID)
|
2025-12-03 19:29:37 +00:00
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
2025-12-06 16:21:59 +00:00
|
|
|
// Verify members in DB
|
|
|
|
|
var members []models.RoomMember
|
|
|
|
|
db.Where("room_id = ?", room.ID).Find(&members)
|
|
|
|
|
assert.Len(t, members, 2) // Owner + New Member
|
|
|
|
|
|
|
|
|
|
var foundUser2 bool
|
|
|
|
|
for _, m := range members {
|
|
|
|
|
if m.UserID == user2.ID {
|
|
|
|
|
foundUser2 = true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
assert.True(t, foundUser2)
|
2025-12-03 19:29:37 +00:00
|
|
|
}
|