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 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());
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user