test: add unit tests for book services

This commit is contained in:
2025-02-09 20:00:51 +03:00
parent 04fb31ec3d
commit 84ec79d444
4 changed files with 276 additions and 0 deletions
@@ -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());
}
}