Fixes for adding read date

This commit is contained in:
2025-02-13 19:40:37 +03:00
parent 8cceeb9c08
commit d5b1854753
5 changed files with 68 additions and 22 deletions
@@ -5,6 +5,8 @@ import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import java.sql.Date;
@RequiredArgsConstructor
@Data
public class BookCreationCache {
@@ -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())
@@ -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()
);
}
@@ -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<Long> userIdCaptor = ArgumentCaptor.forClass(Long.class);
ArgumentCaptor<BookCreationCache> 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());
}
}
@@ -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<Book> 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<Book> 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