feat: Add read date field to book creation with tests

This commit is contained in:
2025-02-13 19:19:24 +03:00
parent 5a212f6024
commit 8cceeb9c08
5 changed files with 63 additions and 13 deletions
@@ -19,8 +19,11 @@ public class Book {
private String title; private String title;
private String author; private String author;
private Integer rating; private Integer rating;
@Column(name = "read_date")
private Date readDate;
@ManyToOne @ManyToOne
@JoinColumn(name = "bot_user_id") @JoinColumn(name = "bot_user_id")
private BotUser botUser; private BotUser botUser;
} }
@@ -11,12 +11,14 @@ public class BookCreationCache {
public enum CreationState { public enum CreationState {
ADDING_TITLE, ADDING_TITLE,
ADDING_AUTHOR, ADDING_AUTHOR,
ADDING_RATING ADDING_RATING,
ADDING_DATE
} }
private String title; private String title;
private String author; private String author;
private Integer rating; private Integer rating;
private Date readDate;
@Setter @Setter
@Getter @Getter
private CreationState creationState = CreationState.ADDING_TITLE; private CreationState creationState = CreationState.ADDING_TITLE;
@@ -65,6 +65,14 @@ public class BookCreationServiceImpl implements BookCreationService {
case ADDING_RATING -> { case ADDING_RATING -> {
int rating = validateAndParseRating(text); int rating = validateAndParseRating(text);
cache.setRating(rating); cache.setRating(rating);
cache.setCreationState(CreationState.ADDING_DATE);
bookCacheService.updateCache(user.getId(), cache);
telegramClientService.sendMessage(user, "📅 Введите дату прочтения (в формате ДД.ММ.ГГГГ):");
}
case ADDING_DATE -> {
Date readDate = parseDate(text.trim());
cache.setReadDate(readDate);
bookCacheService.updateCache(user.getId(), cache); bookCacheService.updateCache(user.getId(), cache);
// Создаем и сохраняем книгу // Создаем и сохраняем книгу
@@ -108,6 +116,7 @@ public class BookCreationServiceImpl implements BookCreationService {
.title(cache.getTitle()) .title(cache.getTitle())
.author(cache.getAuthor()) .author(cache.getAuthor())
.rating(cache.getRating()) .rating(cache.getRating())
.readDate(cache.getReadDate())
.botUser(user) .botUser(user)
.build(); .build();
} }
@@ -0,0 +1 @@
ALTER TABLE books ADD COLUMN read_date DATE;
@@ -110,7 +110,7 @@ class BookCreationServiceImplTest {
} }
@Test @Test
void handleValidRating_ShouldSaveBookAndClearCache() { void handleValidRating_ShouldTransitionToDateState() {
// Given // Given
BookCreationCache ratingCache = new BookCreationCache(); BookCreationCache ratingCache = new BookCreationCache();
ratingCache.setTitle("Valid Title"); ratingCache.setTitle("Valid Title");
@@ -122,16 +122,10 @@ class BookCreationServiceImplTest {
bookCreationService.handleExistingAddCache(testUser, "4"); bookCreationService.handleExistingAddCache(testUser, "4");
// Then // Then
ArgumentCaptor<Book> captor = ArgumentCaptor.forClass(Book.class); verify(bookCacheService).updateCache(eq(1L), argThat(cache ->
verify(bookRepository).save(captor.capture()); cache.getCreationState() == BookCreationCache.CreationState.ADDING_DATE
));
Book savedBook = captor.getValue(); verify(telegramClientService).sendMessage(eq(testUser), contains("дату прочтения"));
assertEquals("Valid Title", savedBook.getTitle());
assertEquals("John Doe", savedBook.getAuthor());
assertEquals(4, savedBook.getRating());
verify(bookCacheService).clearCache(1L);
verify(telegramClientService).sendMessageWithMarkdown(eq(testUser), contains("успешно добавлена"));
} }
@Test @Test
@@ -152,3 +146,44 @@ class BookCreationServiceImplTest {
verify(bookRepository, never()).save(any()); verify(bookRepository, never()).save(any());
} }
} }
@Test
void handleValidDate_ShouldSaveBookAndClearCache() throws Exception {
// Given
BookCreationCache dateCache = new BookCreationCache();
dateCache.setTitle("Valid Title");
dateCache.setAuthor("John Doe");
dateCache.setRating(4);
dateCache.setCreationState(BookCreationCache.CreationState.ADDING_DATE);
when(bookCacheService.getCache(1L)).thenReturn(dateCache);
// When
bookCreationService.handleExistingAddCache(testUser, "15.07.2023");
// Then
ArgumentCaptor<Book> captor = ArgumentCaptor.forClass(Book.class);
verify(bookRepository).save(captor.capture());
Book savedBook = captor.getValue();
assertEquals("Valid Title", savedBook.getTitle());
assertEquals("John Doe", savedBook.getAuthor());
assertEquals(4, savedBook.getRating());
assertEquals(java.sql.Date.valueOf("2023-07-15"), savedBook.getReadDate());
verify(bookCacheService).clearCache(1L);
verify(telegramClientService).sendMessageWithMarkdown(eq(testUser), contains("успешно добавлена"));
}
@Test
void handleInvalidDate_ShouldSendErrorMessage() {
// Given
BookCreationCache dateCache = new BookCreationCache();
dateCache.setCreationState(BookCreationCache.CreationState.ADDING_DATE);
when(bookCacheService.getCache(1L)).thenReturn(dateCache);
// When
bookCreationService.handleExistingAddCache(testUser, "invalid-date");
// Then
verify(telegramClientService).sendMessage(eq(testUser), contains("неверный формат"));
verify(bookRepository, never()).save(any());
}