Skip to content

Commit

Permalink
add functions to replace {times} to actual amount of times (#7871)
Browse files Browse the repository at this point in the history
* add functions to replace {times} to actual amount of times

* tests

* issue
  • Loading branch information
holotsvan authored Dec 5, 2024
1 parent c29d5b3 commit 1032e38
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import static greencity.utils.NotificationUtils.resolveTimesInEnglish;
import static greencity.utils.NotificationUtils.resolveTimesInUkrainian;

@Slf4j
@Service
Expand Down Expand Up @@ -360,10 +362,15 @@ private ScheduledEmailMessage createScheduledEmailMessage(Notification notificat
}
String customMessage = notification.getCustomMessage() != null ? notification.getCustomMessage() : "";
String secondMessage = notification.getSecondMessage() != null ? notification.getSecondMessage() : "";
int messagesCount = notification.getActionUsers().size();
String times = language.equals("ua")
? resolveTimesInUkrainian(messagesCount)
: resolveTimesInEnglish(messagesCount);
String body = bodyTemplate
.replace("{user}", actionUserText)
.replace("{message}", customMessage)
.replace("{secondMessage}", secondMessage);
.replace("{secondMessage}", secondMessage)
.replace("{times}", times);

return ScheduledEmailMessage.builder()
.email(notification.getTargetUser().getEmail())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
import java.util.Locale;
import java.util.Optional;
import java.util.ResourceBundle;
import static greencity.utils.NotificationUtils.resolveTimesInEnglish;
import static greencity.utils.NotificationUtils.resolveTimesInUkrainian;

/**
* Implementation of {@link UserNotificationService}.
Expand Down Expand Up @@ -379,30 +381,6 @@ private NotificationDto createNotificationDto(Notification notification, String
return dto;
}

private String resolveTimesInEnglish(final int number) {
return switch (number) {
case 1 -> "";
case 2 -> "twice";
default -> number + " times";
};
}

private String resolveTimesInUkrainian(int number) {
number = Math.abs(number);
final int lastTwoDigits = number % 100;
final int lastDigit = number % 10;

if (lastTwoDigits >= 11 && lastTwoDigits <= 19) {
return number + " разів";
}

return switch (lastDigit) {
case 1 -> "";
case 2, 3, 4 -> number + " рази";
default -> number + " разів";
};
}

/**
* Sends a new notification to a specified user.
*
Expand Down
35 changes: 35 additions & 0 deletions service/src/main/java/greencity/utils/NotificationUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package greencity.utils;

import lombok.AccessLevel;
import lombok.NoArgsConstructor;

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class NotificationUtils {
public static String resolveTimesInEnglish(final int number) {
return switch (number) {
case 1 -> "";
case 2 -> "twice";
default -> number + " times";
};
}

public static String resolveTimesInUkrainian(int number) {
number = Math.abs(number);
final int lastTwoDigits = number % 100;
final int lastDigit = number % 10;

if (number == 1) {
return "";
}

if (lastTwoDigits >= 11 && lastTwoDigits <= 19) {
return number + " разів";
}

return switch (lastDigit) {
case 1 -> number + " раз";
case 2, 3, 4 -> number + " рази";
default -> number + " разів";
};
}
}
51 changes: 51 additions & 0 deletions service/src/test/java/greencity/utils/NotificationUtilsTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package greencity.utils;

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import java.util.stream.Stream;
import static org.junit.jupiter.api.Assertions.assertEquals;

class NotificationUtilsTest {
@ParameterizedTest(name = "Test resolveTimeInUkrainian with input {0}")
@MethodSource("provideUkrainianTestCases")
void testResolveTimeInUkrainian(int input, String expected) {
String result = NotificationUtils.resolveTimesInUkrainian(input);
assertEquals(expected, result);
}

private static Stream<Arguments> provideUkrainianTestCases() {
return Stream.of(
Arguments.of(1, ""),
Arguments.of(2, "2 рази"),
Arguments.of(4, "4 рази"),
Arguments.of(5, "5 разів"),
Arguments.of(11, "11 разів"),
Arguments.of(19, "19 разів"),
Arguments.of(21, "21 раз"),
Arguments.of(22, "22 рази"),
Arguments.of(25, "25 разів"),
Arguments.of(100, "100 разів"),
Arguments.of(101, "101 раз"),
Arguments.of(102, "102 рази"),
Arguments.of(112, "112 разів"),
Arguments.of(123, "123 рази"));
}

@ParameterizedTest(name = "Test resolveTimesInEnglish with input {0}")
@MethodSource("provideEnglishTestCases")
void testResolveTimesInEnglish(int input, String expected) {
String result = NotificationUtils.resolveTimesInEnglish(input);
assertEquals(expected, result);
}

private static Stream<Arguments> provideEnglishTestCases() {
return Stream.of(
Arguments.of(1, ""),
Arguments.of(2, "twice"),
Arguments.of(3, "3 times"),
Arguments.of(5, "5 times"),
Arguments.of(11, "11 times"),
Arguments.of(21, "21 times"));
}
}

0 comments on commit 1032e38

Please sign in to comment.