diff --git a/src/main/java/ru/cathub/telegabot/model/BookCreationCache.java b/src/main/java/ru/cathub/telegabot/model/BookCreationCache.java index d9c3817..057902f 100644 --- a/src/main/java/ru/cathub/telegabot/model/BookCreationCache.java +++ b/src/main/java/ru/cathub/telegabot/model/BookCreationCache.java @@ -5,6 +5,8 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; +import java.sql.Date; + @RequiredArgsConstructor @Data public class BookCreationCache { 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 c2f87bf..356f3c2 100644 --- a/src/main/java/ru/cathub/telegabot/service/impl/BookCreationServiceImpl.java +++ b/src/main/java/ru/cathub/telegabot/service/impl/BookCreationServiceImpl.java @@ -10,6 +10,10 @@ import ru.cathub.telegabot.model.BotUser; import ru.cathub.telegabot.service.*; import ru.cathub.telegabot.utils.Constants; +import java.sql.Date; +import java.text.ParseException; +import java.text.SimpleDateFormat; + import static ru.cathub.telegabot.model.BookEditStateCache.BookEditState.*; import static ru.cathub.telegabot.utils.Constants.*; @@ -65,7 +69,7 @@ public class BookCreationServiceImpl implements BookCreationService { case ADDING_RATING -> { int rating = validateAndParseRating(text); cache.setRating(rating); - cache.setCreationState(CreationState.ADDING_DATE); + cache.setCreationState(BookCreationCache.CreationState.ADDING_DATE); bookCacheService.updateCache(user.getId(), cache); telegramClientService.sendMessage(user, "πŸ“… Π’Π²Π΅Π΄ΠΈΡ‚Π΅ Π΄Π°Ρ‚Ρƒ прочтСния (Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Π”Π”.ММ.Π“Π“Π“Π“):"); } @@ -96,6 +100,10 @@ public class BookCreationServiceImpl implements BookCreationService { } catch (NumberFormatException e) { log.error("Invalid rating format for user {}", user.getId(), e); telegramClientService.sendMessage(user, "❌ Ошибка: Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ числом ΠΎΡ‚ 0 Π΄ΠΎ 10"); + } + catch (ParseException e) { + log.error("Invalid date format for user {}", user.getId(), e); + telegramClientService.sendMessage(user, "❌ Ошибка: Π΄Π°Ρ‚Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Π”Π”.ММ.Π“Π“Π“Π“"); } catch (Exception e) { log.error("Error creating book for user {}", user.getId(), e); telegramClientService.sendMessage(user, "❌ Ошибка ΠΏΡ€ΠΈ создании ΠΊΠ½ΠΈΠ³ΠΈ"); @@ -111,6 +119,12 @@ public class BookCreationServiceImpl implements BookCreationService { return rating; } + private Date parseDate(String text) throws ParseException { + SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy"); + format.setLenient(false); + return new Date(format.parse(text).getTime()); + } + private Book createBookFromCache(BookCreationCache cache, BotUser user) { return Book.builder() .title(cache.getTitle()) diff --git a/src/main/java/ru/cathub/telegabot/service/impl/ProfileServiceImpl.java b/src/main/java/ru/cathub/telegabot/service/impl/ProfileServiceImpl.java index 10e1f31..ed82925 100644 --- a/src/main/java/ru/cathub/telegabot/service/impl/ProfileServiceImpl.java +++ b/src/main/java/ru/cathub/telegabot/service/impl/ProfileServiceImpl.java @@ -21,9 +21,12 @@ public class ProfileServiceImpl implements ProfileService { public void enterProfileEditingMode(BotUser user) { user.setWorkingMode(BotUser.WorkingMode.EDIT_PROFILE); userRepository.save(user); + telegramClientService.sendMessage( + user, + "⌨️ Π Π΅ΠΆΠΈΠΌ рСдактирования профиля:\nВСкущая Ρ†Π΅Π»ΡŒ ΠΏΠΎ ΠΊΠ½ΠΈΠ³Π°ΠΌ "+user.getBooksToRead()); telegramClientService.sendMessage( user, - "⌨️ Π Π΅ΠΆΠΈΠΌ рСдактирования профиля:\nΠ’Π²Π΅Π΄ΠΈΡ‚Π΅ Ρ†Π΅Π»ΡŒ ΠΏΠΎ количСству ΠΊΠ½ΠΈΠ³ ΠΈΠ»ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ΡΡŒ Π½Π°Π·Π°Π΄", + "Π’Π²Π΅Π΄ΠΈΡ‚Π΅ Ρ†Π΅Π»ΡŒ ΠΏΠΎ количСству ΠΊΠ½ΠΈΠ³ ΠΈΠ»ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ΡΡŒ Π½Π°Π·Π°Π΄", KeyboardHelper.getProfileMenuKeyboard() ); } 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 2073c49..3adff51 100644 --- a/src/test/java/ru/cathub/telegabot/service/impl/BookCreationServiceImplTest.java +++ b/src/test/java/ru/cathub/telegabot/service/impl/BookCreationServiceImplTest.java @@ -1,6 +1,7 @@ package ru.cathub.telegabot.service.impl; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; @@ -23,17 +24,22 @@ import static org.mockito.Mockito.*; import static ru.cathub.telegabot.model.BookCreationCache.CreationState.*; import static ru.cathub.telegabot.utils.Constants.*; +@Nested @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; - + @Mock + private TelegramClientService telegramClientService; + @Mock + private BookRepository bookRepository; + @Mock + private BookCommonService bookCommonService; + + @InjectMocks + private BookCreationServiceImpl bookCreationService; + private BotUser testUser; private BookCreationCache testCache; @@ -50,24 +56,24 @@ class BookCreationServiceImplTest { // Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ArgumentCaptor для Π·Π°Ρ…Π²Π°Ρ‚Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ArgumentCaptor userIdCaptor = ArgumentCaptor.forClass(Long.class); ArgumentCaptor cacheCaptor = ArgumentCaptor.forClass(BookCreationCache.class); - + // ΠœΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ Π²Ρ‹Π·ΠΎΠ² с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ when(bookCacheService.updateCache(eq(1L), any(BookCreationCache.class))) - .thenReturn(testCache); + .thenReturn(testCache); bookCreationService.handleNewAddRequest(testUser, ADD_BOOK); // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π²Ρ‹Π·ΠΎΠ²Π° verify(bookCacheService).updateCache(userIdCaptor.capture(), cacheCaptor.capture()); - + // УбСТдаСмся Π² коррСктности ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² assertEquals(1L, userIdCaptor.getValue()); assertEquals(ADDING_TITLE, cacheCaptor.getValue().getCreationState()); - + verify(telegramClientService).sendMessageWithMarkdown( - eq(testUser), - contains("Π’Π²Π΅Π΄ΠΈΡ‚Π΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠ½ΠΈΠ³ΠΈ"), - isNull() + eq(testUser), + contains("Π’Π²Π΅Π΄ΠΈΡ‚Π΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠ½ΠΈΠ³ΠΈ"), + isNull() ); } @@ -123,7 +129,7 @@ class BookCreationServiceImplTest { // Then verify(bookCacheService).updateCache(eq(1L), argThat(cache -> - cache.getCreationState() == BookCreationCache.CreationState.ADDING_DATE + cache.getCreationState() == BookCreationCache.CreationState.ADDING_DATE )); verify(telegramClientService).sendMessage(eq(testUser), contains("Π΄Π°Ρ‚Ρƒ прочтСния")); } @@ -145,7 +151,7 @@ class BookCreationServiceImplTest { verify(telegramClientService).sendMessage(eq(testUser), contains("ΠΎΡ‚ 0 Π΄ΠΎ 10")); verify(bookRepository, never()).save(any()); } -} + @Test void handleValidDate_ShouldSaveBookAndClearCache() throws Exception { // Given @@ -184,6 +190,7 @@ class BookCreationServiceImplTest { bookCreationService.handleExistingAddCache(testUser, "invalid-date"); // Then - verify(telegramClientService).sendMessage(eq(testUser), contains("Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚")); + verify(telegramClientService).sendMessage(eq(testUser), contains("Π΄Π°Ρ‚Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ")); verify(bookRepository, never()).save(any()); } +} \ No newline at end of file diff --git a/src/test/java/ru/cathub/telegabot/service/impl/BookListingServiceImplTest.java b/src/test/java/ru/cathub/telegabot/service/impl/BookListingServiceImplTest.java index 7f8100d..29757b2 100644 --- a/src/test/java/ru/cathub/telegabot/service/impl/BookListingServiceImplTest.java +++ b/src/test/java/ru/cathub/telegabot/service/impl/BookListingServiceImplTest.java @@ -17,6 +17,8 @@ import ru.cathub.telegabot.service.BookCacheService; import ru.cathub.telegabot.service.TelegramClientService; import ru.cathub.telegabot.utils.BookFormatUtils; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.List; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -39,10 +41,22 @@ class BookListingServiceImplTest { } @Test - void showPaginatedBookList_ShouldHandleFirstPage() { + void showPaginatedBookList_ShouldHandleFirstPage() throws ParseException { List books = List.of( - new Book(1L, "Book 1", "Author 1", 8, testUser), - new Book(2L, "Book 2", "Author 2", 9, testUser) + Book.builder() + .id(1L) + .title("Book 1") + .author("Author 1") + .rating(8) + .botUser(testUser) + .build(), + Book.builder() + .id(2L) + .title("Book 2") + .author("Author 2") + .rating(9) + .botUser(testUser) + .build() ); Page page = new PageImpl<>(books); @@ -62,7 +76,13 @@ class BookListingServiceImplTest { @Test void formatBookEntry_ShouldHandleEditMode() { - Book book = new Book(1L, "Test Book", "Test Author", 7, testUser); + var book = Book.builder() + .id(1L) + .title("Test Book") + .author("Test Author") + .rating(7) + .botUser(testUser) + .build(); String result = BookFormatUtils.formatBookEntry(book, 0, true); assertTrue(result.contains("\uFE0F\u20E3")); // Check for edit emoji