forked from Sanders/TelegaBot
feat: Add read date field to book creation with tests
This commit is contained in:
@@ -19,8 +19,11 @@ public class Book {
|
||||
private String title;
|
||||
private String author;
|
||||
private Integer rating;
|
||||
|
||||
@Column(name = "read_date")
|
||||
private Date readDate;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "bot_user_id")
|
||||
private BotUser botUser;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,12 +11,14 @@ public class BookCreationCache {
|
||||
public enum CreationState {
|
||||
ADDING_TITLE,
|
||||
ADDING_AUTHOR,
|
||||
ADDING_RATING
|
||||
ADDING_RATING,
|
||||
ADDING_DATE
|
||||
}
|
||||
|
||||
private String title;
|
||||
private String author;
|
||||
private Integer rating;
|
||||
private Date readDate;
|
||||
@Setter
|
||||
@Getter
|
||||
private CreationState creationState = CreationState.ADDING_TITLE;
|
||||
|
||||
@@ -65,6 +65,14 @@ public class BookCreationServiceImpl implements BookCreationService {
|
||||
case ADDING_RATING -> {
|
||||
int rating = validateAndParseRating(text);
|
||||
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);
|
||||
|
||||
// Создаем и сохраняем книгу
|
||||
@@ -108,6 +116,7 @@ public class BookCreationServiceImpl implements BookCreationService {
|
||||
.title(cache.getTitle())
|
||||
.author(cache.getAuthor())
|
||||
.rating(cache.getRating())
|
||||
.readDate(cache.getReadDate())
|
||||
.botUser(user)
|
||||
.build();
|
||||
}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
ALTER TABLE books ADD COLUMN read_date DATE;
|
||||
@@ -110,7 +110,7 @@ class BookCreationServiceImplTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
void handleValidRating_ShouldSaveBookAndClearCache() {
|
||||
void handleValidRating_ShouldTransitionToDateState() {
|
||||
// Given
|
||||
BookCreationCache ratingCache = new BookCreationCache();
|
||||
ratingCache.setTitle("Valid Title");
|
||||
@@ -122,16 +122,10 @@ class BookCreationServiceImplTest {
|
||||
bookCreationService.handleExistingAddCache(testUser, "4");
|
||||
|
||||
// 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());
|
||||
|
||||
verify(bookCacheService).clearCache(1L);
|
||||
verify(telegramClientService).sendMessageWithMarkdown(eq(testUser), contains("успешно добавлена"));
|
||||
verify(bookCacheService).updateCache(eq(1L), argThat(cache ->
|
||||
cache.getCreationState() == BookCreationCache.CreationState.ADDING_DATE
|
||||
));
|
||||
verify(telegramClientService).sendMessage(eq(testUser), contains("дату прочтения"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -152,3 +146,44 @@ class BookCreationServiceImplTest {
|
||||
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());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user