From 479012d661e59ecd51f6ea5d06bf87fff1c9e1ae Mon Sep 17 00:00:00 2001 From: Nessar Date: Fri, 17 Jul 2026 10:00:20 +0200 Subject: [PATCH] fix(#20): use inclusive query for rent payment month range --- .../repository/RentPaymentRepository.java | 2 ++ .../integration/RentPaymentPersistenceIT.java | 31 ++++++++++++------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/backend/src/main/java/fr/nessar/lmnporganizer/backend/repository/RentPaymentRepository.java b/backend/src/main/java/fr/nessar/lmnporganizer/backend/repository/RentPaymentRepository.java index 89030b7..53825ac 100644 --- a/backend/src/main/java/fr/nessar/lmnporganizer/backend/repository/RentPaymentRepository.java +++ b/backend/src/main/java/fr/nessar/lmnporganizer/backend/repository/RentPaymentRepository.java @@ -2,12 +2,14 @@ package fr.nessar.lmnporganizer.backend.repository; import fr.nessar.lmnporganizer.backend.model.RentPayment; import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.data.mongodb.repository.Query; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface RentPaymentRepository extends MongoRepository { + @Query("{ 'leaseId': ?0, 'month': { $gte: ?1, $lte: ?2 } }") List findAllByLeaseIdAndMonthBetween(String leaseId, String firstMonth, String lastMonth); List findAllByOrderByDueDateAsc(); diff --git a/backend/src/test/java/fr/nessar/lmnporganizer/backend/integration/RentPaymentPersistenceIT.java b/backend/src/test/java/fr/nessar/lmnporganizer/backend/integration/RentPaymentPersistenceIT.java index cda2a8f..77bc06f 100644 --- a/backend/src/test/java/fr/nessar/lmnporganizer/backend/integration/RentPaymentPersistenceIT.java +++ b/backend/src/test/java/fr/nessar/lmnporganizer/backend/integration/RentPaymentPersistenceIT.java @@ -23,14 +23,10 @@ import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -@SpringBootTest( - classes = RentPaymentPersistenceIT.MongoTestApplication.class, - webEnvironment = SpringBootTest.WebEnvironment.NONE, - properties = { - "lmnp.data-initializer.enabled=false", - "spring.data.mongodb.auto-index-creation=true" - } -) +@SpringBootTest(classes = RentPaymentPersistenceIT.MongoTestApplication.class, webEnvironment = SpringBootTest.WebEnvironment.NONE, properties = { + "lmnp.data-initializer.enabled=false", + "spring.data.mongodb.auto-index-creation=true" +}) class RentPaymentPersistenceIT { private static final MongoDBContainer mongoDb = startMongoDb(); @@ -55,7 +51,8 @@ class RentPaymentPersistenceIT { void rejectsTwoRentPaymentsForTheSameLeaseAndMonth() { rentPaymentRepository.save(rentPayment("payment-1", "2026-06", LocalDate.of(2026, 6, 5))); - assertThatThrownBy(() -> rentPaymentRepository.save(rentPayment("payment-2", "2026-06", LocalDate.of(2026, 6, 5)))) + assertThatThrownBy( + () -> rentPaymentRepository.save(rentPayment("payment-2", "2026-06", LocalDate.of(2026, 6, 5)))) .isInstanceOf(DuplicateKeyException.class); } @@ -64,14 +61,26 @@ class RentPaymentPersistenceIT { rentPaymentRepository.saveAll(List.of( rentPayment("payment-3", "2026-03", LocalDate.of(2026, 3, 5)), rentPayment("payment-1", "2026-01", LocalDate.of(2026, 1, 5)), - rentPayment("payment-2", "2026-02", LocalDate.of(2026, 2, 5)) - )); + rentPayment("payment-2", "2026-02", LocalDate.of(2026, 2, 5)))); assertThat(rentPaymentRepository.findAllByOrderByDueDateAsc()) .extracting(RentPayment::getMonth) .containsExactly("2026-01", "2026-02", "2026-03"); } + @Test + void testBetweenBehavior() { + rentPaymentRepository.saveAll(List.of( + rentPayment("payment-1", "2026-01", LocalDate.of(2026, 1, 5)), + rentPayment("payment-2", "2026-02", LocalDate.of(2026, 2, 5)), + rentPayment("payment-3", "2026-03", LocalDate.of(2026, 3, 5)) + )); + + assertThat(rentPaymentRepository.findAllByLeaseIdAndMonthBetween("lease-1", "2026-01", "2026-03")) + .extracting(RentPayment::getMonth) + .containsExactly("2026-01", "2026-02", "2026-03"); + } + private static RentPayment rentPayment(String id, String month, LocalDate dueDate) { return new RentPayment(id, "default-landlord", "lease-1", month, dueDate, new BigDecimal("850.00"), new BigDecimal("50.00"), null);