Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 109 additions & 0 deletions src/test/java/entity/RoomTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
package entity;

import org.junit.jupiter.api.Test;

import java.time.LocalDateTime;

import static org.junit.jupiter.api.Assertions.*;

class RoomTest {

// ---------- 1. Successful constructor ----------
@Test
void constructor_setsFieldsCorrectly() {
final String id = "room-1";
final String name = "My Room";
final String description = "A nice place";
final String ownerId = "owner-1";
final String inviteCode = "123456";

final Room room = new Room(id, name, description, ownerId, inviteCode);

assertEquals(id, room.getId());
assertEquals(name, room.getName());
assertEquals(description, room.getDescription());
assertEquals(ownerId, room.getOwnerId());
assertEquals(inviteCode, room.getInviteCode());

assertNotNull(room.getCreatedAt());
assertNotNull(room.getUpdatedAt());
assertTrue(room.getCreatedAt().isBefore(LocalDateTime.now().plusSeconds(1)));
}

@Test
void constructor_allowsNullDescription() {
final String id = "room-2";
final String name = "Another Room";
final String ownerId = "owner-2";
final String inviteCode = "654321";

final Room room = new Room(id, name, null, ownerId, inviteCode);

assertNull(room.getDescription());
assertEquals(name, room.getName());
assertEquals(ownerId, room.getOwnerId());
}

// ---------- 2. Validation errors (branch tests) ----------

@Test
void constructor_throwsForNullId() {
assertThrows(IllegalArgumentException.class,
() -> new Room(null, "name", "desc", "owner", "123"));
}

@Test
void constructor_throwsForEmptyId() {
assertThrows(IllegalArgumentException.class,
() -> new Room(" ", "name", "desc", "owner", "123"));
}

@Test
void constructor_throwsForNullName() {
assertThrows(IllegalArgumentException.class,
() -> new Room("rid", null, "desc", "owner", "123"));
}

@Test
void constructor_throwsForEmptyName() {
assertThrows(IllegalArgumentException.class,
() -> new Room("rid", " ", "desc", "owner", "123"));
}

@Test
void constructor_throwsForNullOwnerId() {
assertThrows(IllegalArgumentException.class,
() -> new Room("rid", "name", "desc", null, "123"));
}

@Test
void constructor_throwsForEmptyOwnerId() {
assertThrows(IllegalArgumentException.class,
() -> new Room("rid", "name", "desc", " ", "123"));
}

@Test
void constructor_throwsForNullInviteCode() {
assertThrows(IllegalArgumentException.class,
() -> new Room("rid", "name", "desc", "owner", null));
}

@Test
void constructor_throwsForEmptyInviteCode() {
assertThrows(IllegalArgumentException.class,
() -> new Room("rid", "name", "desc", "owner", " "));
}

// ---------- 3. Mutators (setters) ----------
@Test
void setters_updateNameAndDescription() {
final Room room = new Room("room-3", "Initial", "first desc", "owner-3", "000111");

room.setName("Updated Name");
room.setDescription("Updated description");

assertEquals("Updated Name", room.getName());
assertEquals("Updated description", room.getDescription());
}
}

164 changes: 164 additions & 0 deletions src/test/java/use_case/room/create/CreateRoomInteractorTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
package use_case.room.create;

import entity.Room;
import entity.User;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import use_case.exception.CreateRoomFailedException;
import use_case.logged_in.UserService;
import use_case.session.SessionDataAccessInterface;
import use_case.room.RoomDataAccessInterface;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;

@ExtendWith(MockitoExtension.class)
class CreateRoomInteractorTest {

@Mock
private RoomDataAccessInterface roomDataAccess;

@Mock
private SessionDataAccessInterface sessionDataAccess;

@Mock
private CreateRoomOutputBoundary createRoomPresenter;

@Mock
private UserService userService;

// ---------- 1. Success path ----------
@Test
void execute_success_savesRoomAndPresentsSuccess() {
// Arrange
final String roomName = "My Room";
final String description = "A place";
final CreateRoomInputData input = new CreateRoomInputData(roomName, description);

final User user = mock(User.class);
when(userService.getUser()).thenReturn(user);
when(user.getId()).thenReturn("user-1");

// Ensure uniqueness: getRoomByInviteCode returns null for any candidate
when(roomDataAccess.getRoomByInviteCode(anyString())).thenReturn(null);

CreateRoomInteractor interactor = new CreateRoomInteractor(
roomDataAccess, sessionDataAccess, createRoomPresenter, userService
);

// Act
interactor.execute(input);

// Assert: room saved and user added
ArgumentCaptor<Room> roomCaptor = ArgumentCaptor.forClass(Room.class);
verify(roomDataAccess, times(1)).saveRoom(roomCaptor.capture());
Room saved = roomCaptor.getValue();
assertEquals(roomName, saved.getName());
assertEquals(description, saved.getDescription());
assertEquals("user-1", saved.getOwnerId());
assertNotNull(saved.getInviteCode());

verify(roomDataAccess, times(1)).addUserToRoom(saved.getId(), "user-1");

// Assert presenter called with success
ArgumentCaptor<CreateRoomOutputData> outCaptor = ArgumentCaptor.forClass(CreateRoomOutputData.class);
verify(createRoomPresenter, times(1)).presentSuccess(outCaptor.capture());
CreateRoomOutputData out = outCaptor.getValue();
assertEquals(roomName, out.getRoomName());
assertEquals(description, out.getRoomDescription());
assertEquals(saved.getInviteCode(), out.getInviteCode());

verify(createRoomPresenter, never()).presentFailure(anyString());
}

// ---------- 2. user null ----------
@Test
void execute_userNull_presentsNotLoggedIn() {
when(userService.getUser()).thenReturn(null);

CreateRoomInteractor interactor = new CreateRoomInteractor(
roomDataAccess, sessionDataAccess, createRoomPresenter, userService
);

interactor.execute(new CreateRoomInputData("n", "d"));

verify(createRoomPresenter, times(1)).presentFailure("User not logged in");
verify(roomDataAccess, never()).saveRoom(any());
}

// ---------- 3. user already in a room ----------
@Test
void execute_userAlreadyInRoom_presentsAlreadyInRoom() {
final User user = mock(User.class);
when(userService.getUser()).thenReturn(user);
when(user.getId()).thenReturn("user-2");

when(roomDataAccess.getUserRoomId("user-2")).thenReturn("existing-room");

CreateRoomInteractor interactor = new CreateRoomInteractor(
roomDataAccess, sessionDataAccess, createRoomPresenter, userService
);

interactor.execute(new CreateRoomInputData("rname", "desc"));

verify(createRoomPresenter, times(1)).presentFailure("You are already in a room. Leave your current room first.");
verify(roomDataAccess, never()).saveRoom(any());
}

// ---------- 4. empty room name ----------
@Test
void execute_emptyName_presentsValidation() {
final User user = mock(User.class);
when(userService.getUser()).thenReturn(user);
when(user.getId()).thenReturn("user-3");

CreateRoomInteractor interactor = new CreateRoomInteractor(
roomDataAccess, sessionDataAccess, createRoomPresenter, userService
);

interactor.execute(new CreateRoomInputData(" ", "desc"));

verify(createRoomPresenter, times(1)).presentFailure("Room name cannot be empty");
verify(roomDataAccess, never()).saveRoom(any());
}

// ---------- 5. empty owner id ----------
@Test
void execute_emptyOwnerId_presentsValidation() {
final User user = mock(User.class);
when(userService.getUser()).thenReturn(user);
when(user.getId()).thenReturn(" ");

CreateRoomInteractor interactor = new CreateRoomInteractor(
roomDataAccess, sessionDataAccess, createRoomPresenter, userService
);

interactor.execute(new CreateRoomInputData("name", "desc"));

verify(createRoomPresenter, times(1)).presentFailure("Owner ID cannot be empty");
verify(roomDataAccess, never()).saveRoom(any());
}

// ---------- 6. DAO failure path ----------
@Test
void execute_daoThrows_presentsFailure() {
final User user = mock(User.class);
when(userService.getUser()).thenReturn(user);
when(user.getId()).thenReturn("user-4");

when(roomDataAccess.getRoomByInviteCode(anyString())).thenReturn(null);
doThrow(new CreateRoomFailedException("db down")).when(roomDataAccess).saveRoom(any());

CreateRoomInteractor interactor = new CreateRoomInteractor(
roomDataAccess, sessionDataAccess, createRoomPresenter, userService
);

interactor.execute(new CreateRoomInputData("name", "desc"));

verify(createRoomPresenter, times(1)).presentFailure("Failed to create room: db down");
verify(roomDataAccess, never()).addUserToRoom(anyString(), anyString());
}
}
Loading
Loading