From 8cceeb9c083ba6afbe4f7b20e6e0f75c70a4eeb1 Mon Sep 17 00:00:00 2001 From: "Sanders (aider)" Date: Thu, 13 Feb 2025 19:19:24 +0300 Subject: [PATCH] feat: Add read date field to book creation with tests --- .../java/ru/cathub/telegabot/model/Book.java | 5 +- .../telegabot/model/BookCreationCache.java | 4 +- .../service/impl/BookCreationServiceImpl.java | 9 +++ .../db/migration/V2__Add_read_date_column.sql | 1 + .../impl/BookCreationServiceImplTest.java | 57 +++++++++++++++---- 5 files changed, 63 insertions(+), 13 deletions(-) create mode 100644 src/main/resources/db/migration/V2__Add_read_date_column.sql diff --git a/src/main/java/ru/cathub/telegabot/model/Book.java b/src/main/java/ru/cathub/telegabot/model/Book.java index e879b1b..95e0b22 100644 --- a/src/main/java/ru/cathub/telegabot/model/Book.java +++ b/src/main/java/ru/cathub/telegabot/model/Book.java @@ -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; -} \ No newline at end of file +} diff --git a/src/main/java/ru/cathub/telegabot/model/BookCreationCache.java b/src/main/java/ru/cathub/telegabot/model/BookCreationCache.java index 20de00a..d9c3817 100644 --- a/src/main/java/ru/cathub/telegabot/model/BookCreationCache.java +++ b/src/main/java/ru/cathub/telegabot/model/BookCreationCache.java @@ -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; diff --git a/src/main/java/ru/cathub/telegabot/service/impl/BookCreationServiceImpl.java b/src/main/java/ru/cathub/telegabot/service/impl/BookCreationServiceImpl.java index f25a2a1..c2f87bf 100644 --- a/src/main/java/ru/cathub/telegabot/service/impl/BookCreationServiceImpl.java +++ b/src/main/java/ru/cathub/telegabot/service/impl/BookCreationServiceImpl.java @@ -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(); } diff --git a/src/main/resources/db/migration/V2__Add_read_date_column.sql b/src/main/resources/db/migration/V2__Add_read_date_column.sql new file mode 100644 index 0000000..34f394e --- /dev/null +++ b/src/main/resources/db/migration/V2__Add_read_date_column.sql @@ -0,0 +1 @@ +ALTER TABLE books ADD COLUMN read_date DATE; diff --git a/src/test/java/ru/cathub/telegabot/service/impl/BookCreationServiceImplTest.java b/src/test/java/ru/cathub/telegabot/service/impl/BookCreationServiceImplTest.java index b1eb1c2..2073c49 100644 --- a/src/test/java/ru/cathub/telegabot/service/impl/BookCreationServiceImplTest.java +++ b/src/test/java/ru/cathub/telegabot/service/impl/BookCreationServiceImplTest.java @@ -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 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 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()); + }