test: add unit tests for book services
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
package ru.cathub.telegabot.service.impl;
|
||||
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.mockito.InjectMocks;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
import ru.cathub.telegabot.model.Book;
|
||||
import ru.cathub.telegabot.model.BookCreationCache;
|
||||
import ru.cathub.telegabot.model.BotUser;
|
||||
import ru.cathub.telegabot.repository.BookRepository;
|
||||
import ru.cathub.telegabot.service.BookCacheService;
|
||||
import ru.cathub.telegabot.service.TelegramClientService;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.Mockito.*;
|
||||
import static ru.cathub.telegabot.utils.Constants.*;
|
||||
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
class BookCreationServiceImplTest {
|
||||
|
||||
@Mock private BookCacheService bookCacheService;
|
||||
@Mock private TelegramClientService telegramClientService;
|
||||
@Mock private BookRepository bookRepository;
|
||||
@Mock private BookCommonService bookCommonService;
|
||||
|
||||
@InjectMocks private BookCreationServiceImpl bookCreationService;
|
||||
|
||||
private BotUser testUser;
|
||||
private BookCreationCache testCache;
|
||||
|
||||
@BeforeEach
|
||||
void setUp() {
|
||||
testUser = new BotUser(1L, "testuser");
|
||||
testCache = new BookCreationCache();
|
||||
}
|
||||
|
||||
@Test
|
||||
void handleNewAddRequest_ShouldInitializeCache() {
|
||||
when(bookCacheService.updateCache(anyLong(), any(BookCreationCache.class)))
|
||||
.thenReturn(testCache);
|
||||
|
||||
bookCreationService.handleNewAddRequest(testUser, ADD_BOOK);
|
||||
|
||||
verify(bookCacheService).updateCache(eq(1L), any(BookCreationCache.class));
|
||||
verify(telegramClientService).sendMessageWithMarkdown(eq(testUser),
|
||||
contains("Введите название книги"), isNull());
|
||||
}
|
||||
|
||||
@Test
|
||||
void handleExistingAddCache_ShouldProgressThroughStates() {
|
||||
// Test title handling
|
||||
testCache.setCreationState(BookCreationCache.CreationState.ADDING_TITLE);
|
||||
when(bookCacheService.getCache(1L)).thenReturn(testCache);
|
||||
|
||||
bookCreationService.handleExistingAddCache(testUser, " Valid Title ");
|
||||
assertEquals("Valid Title", testCache.getTitle());
|
||||
assertEquals(BookCreationCache.CreationState.ADDING_AUTHOR, testCache.getCreationState());
|
||||
|
||||
// Test author handling
|
||||
testCache.setCreationState(BookCreationCache.CreationState.ADDING_AUTHOR);
|
||||
bookCreationService.handleExistingAddCache(testUser, " John Doe ");
|
||||
assertEquals("John Doe", testCache.getAuthor());
|
||||
assertEquals(BookCreationCache.CreationState.ADDING_RATING, testCache.getCreationState());
|
||||
|
||||
// Test rating handling
|
||||
testCache.setCreationState(BookCreationCache.CreationState.ADDING_RATING);
|
||||
when(bookCommonService.formatBookDetails(any())).thenReturn("Book Details");
|
||||
bookCreationService.handleExistingAddCache(testUser, "8");
|
||||
|
||||
verify(bookRepository).save(any(Book.class));
|
||||
verify(bookCacheService).clearCache(1L);
|
||||
}
|
||||
|
||||
@Test
|
||||
void handleInvalidTitle_ShouldRejectShortTitles() {
|
||||
testCache.setCreationState(BookCreationCache.CreationState.ADDING_TITLE);
|
||||
when(bookCacheService.getCache(1L)).thenReturn(testCache);
|
||||
|
||||
bookCreationService.handleExistingAddCache(testUser, "A");
|
||||
verify(telegramClientService).sendMessage(eq(testUser), contains("минимум 2 символа"));
|
||||
assertNull(testCache.getTitle());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
package ru.cathub.telegabot.service.impl;
|
||||
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.mockito.InjectMocks;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
import ru.cathub.telegabot.model.Book;
|
||||
import ru.cathub.telegabot.model.BookEditStateCache;
|
||||
import ru.cathub.telegabot.model.BotUser;
|
||||
import ru.cathub.telegabot.repository.BookRepository;
|
||||
import ru.cathub.telegabot.service.BookCacheService;
|
||||
import ru.cathub.telegabot.service.TelegramClientService;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.mockito.ArgumentMatchers.*;
|
||||
import static org.mockito.Mockito.*;
|
||||
import static ru.cathub.telegabot.model.BookEditStateCache.BookEditState.*;
|
||||
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
class BookEditingServiceImplTest {
|
||||
|
||||
@Mock private BookRepository bookRepository;
|
||||
@Mock private BookCacheService bookCacheService;
|
||||
@Mock private TelegramClientService telegramClientService;
|
||||
|
||||
@InjectMocks private BookEditingServiceImpl bookEditingService;
|
||||
|
||||
private BotUser testUser;
|
||||
private Book testBook;
|
||||
|
||||
@BeforeEach
|
||||
void setUp() {
|
||||
testUser = new BotUser(1L, "testuser");
|
||||
testBook = Book.builder()
|
||||
.id(1L)
|
||||
.title("Test Book")
|
||||
.author("Test Author")
|
||||
.rating(5)
|
||||
.botUser(testUser)
|
||||
.build();
|
||||
}
|
||||
|
||||
@Test
|
||||
void processBookSelection_ShouldUpdateCache() {
|
||||
when(bookRepository.findByIdAndBotUser(1L, testUser)).thenReturn(Optional.of(testBook));
|
||||
|
||||
bookEditingService.processBookSelection(testUser, 1L);
|
||||
|
||||
verify(bookCacheService).updateBookEditCache(eq(1L), any(BookEditStateCache.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
void handleEditTitle_ShouldUpdateState() {
|
||||
bookEditingService.handleEditTitle(testUser);
|
||||
verify(telegramClientService).sendMessage(eq(testUser), contains("название"));
|
||||
verify(bookCacheService).updateBookEditCache(eq(1L), argThat(cache ->
|
||||
cache.getBookEditState() == EDITING_TITLE));
|
||||
}
|
||||
|
||||
@Test
|
||||
void updateBookTitle_ShouldSaveChanges() {
|
||||
when(bookRepository.findById(1L)).thenReturn(Optional.of(testBook));
|
||||
when(bookCacheService.getBookEditCache(1L))
|
||||
.thenReturn(BookEditStateCache.builder().bookId(1L).build());
|
||||
|
||||
bookEditingService.updateBookTitle(testUser, "New Title");
|
||||
|
||||
assertEquals("New Title", testBook.getTitle());
|
||||
verify(bookRepository).save(testBook);
|
||||
verify(telegramClientService).sendMessage(eq(testUser), contains("успешно"));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
package ru.cathub.telegabot.service.impl;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.mockito.InjectMocks;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.PageImpl;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
import ru.cathub.telegabot.model.Book;
|
||||
import ru.cathub.telegabot.model.BotUser;
|
||||
import ru.cathub.telegabot.service.BookCacheService;
|
||||
import ru.cathub.telegabot.service.TelegramClientService;
|
||||
import ru.cathub.telegabot.utils.BookFormatUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.*;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
class BookListingServiceImplTest {
|
||||
|
||||
@Mock private BookCacheService bookCacheService;
|
||||
@Mock private TelegramClientService telegramClientService;
|
||||
@InjectMocks private BookListingServiceImpl bookListingService;
|
||||
|
||||
private final BotUser testUser = new BotUser(1L, "testuser");
|
||||
|
||||
@Test
|
||||
void showPaginatedBookList_ShouldHandleFirstPage() {
|
||||
List<Book> books = List.of(
|
||||
new Book(1L, "Book 1", "Author 1", 8, testUser),
|
||||
new Book(2L, "Book 2", "Author 2", 9, testUser)
|
||||
);
|
||||
Page<Book> page = new PageImpl<>(books);
|
||||
|
||||
bookListingService.showPaginatedBookList(testUser, 0, null, false);
|
||||
|
||||
verify(telegramClientService).sendMessageWithMarkdown(
|
||||
eq(testUser),
|
||||
contains("Book 1"),
|
||||
any());
|
||||
}
|
||||
|
||||
@Test
|
||||
void formatBookEntry_ShouldHandleEditMode() {
|
||||
Book book = new Book(1L, "Test Book", "Test Author", 7, testUser);
|
||||
String result = BookFormatUtils.formatBookEntry(book, 0, true);
|
||||
|
||||
assertTrue(result.contains("\uFE0F\u20E3")); // Check for edit emoji
|
||||
assertTrue(result.contains("Test Book"));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
package ru.cathub.telegabot.service.impl;
|
||||
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.mockito.InjectMocks;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
import ru.cathub.telegabot.model.BookCreationCache;
|
||||
import ru.cathub.telegabot.model.BotUser;
|
||||
import ru.cathub.telegabot.service.*;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.*;
|
||||
import static org.mockito.Mockito.*;
|
||||
import static ru.cathub.telegabot.utils.Constants.*;
|
||||
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
class BookManageServiceImplTest {
|
||||
|
||||
@Mock private BookCreationService bookCreationService;
|
||||
@Mock private BookEditingService bookEditingService;
|
||||
@Mock private BookListingService bookListingService;
|
||||
@Mock private UserRepository userRepository;
|
||||
@Mock private BookCacheService bookCacheService;
|
||||
@Mock private TelegramClientService telegramClientService;
|
||||
|
||||
@InjectMocks private BookManageServiceImpl bookManageService;
|
||||
|
||||
private BotUser testUser;
|
||||
|
||||
@BeforeEach
|
||||
void setUp() {
|
||||
testUser = new BotUser(1L, "testuser");
|
||||
}
|
||||
|
||||
@Test
|
||||
void processBookInput_ShouldRouteAddBookCommand() {
|
||||
bookManageService.processBookInput(testUser, ADD_BOOK);
|
||||
|
||||
verify(bookCacheService).clearCache(1L);
|
||||
verify(bookCreationService).handleNewAddRequest(eq(testUser), eq(ADD_BOOK));
|
||||
}
|
||||
|
||||
@Test
|
||||
void processBookInput_ShouldHandleListBooks() {
|
||||
bookManageService.processBookInput(testUser, LIST_BOOKS);
|
||||
|
||||
verify(bookListingService).showPaginatedBookList(eq(testUser), eq(0), isNull(), eq(false));
|
||||
}
|
||||
|
||||
@Test
|
||||
void handleStartMessage_ShouldSetBookMode() {
|
||||
bookManageService.handleStartMessage(testUser);
|
||||
|
||||
assertEquals(BotUser.WorkingMode.BOOK, testUser.getWorkingMode());
|
||||
verify(userRepository).save(testUser);
|
||||
verify(telegramClientService).sendMessageWithMarkdown(eq(testUser), anyString(), any());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user