test: add availability rule tests
This commit is contained in:
1 parent
4faf329b8a
commit
f3e095a20e
1 file changed
+111
@@ -0,0 +1,111 @@
|
|||||||
|
package com.slotline.availability;
|
||||||
|
|
||||||
|
import com.slotline.availability.dto.BlackoutRequest;
|
||||||
|
import com.slotline.availability.dto.OperatingHoursRequest;
|
||||||
|
import com.slotline.common.AvailabilityViolationException;
|
||||||
|
import com.slotline.organization.Organization;
|
||||||
|
import com.slotline.organization.OrganizationRepository;
|
||||||
|
import com.slotline.reservation.ReservationService;
|
||||||
|
import com.slotline.reservation.dto.ReservationRequest;
|
||||||
|
import com.slotline.resource.ResourceService;
|
||||||
|
import com.slotline.resource.dto.ResourceRequest;
|
||||||
|
import com.slotline.security.AuthenticatedUser;
|
||||||
|
import com.slotline.user.Role;
|
||||||
|
import com.slotline.user.User;
|
||||||
|
import com.slotline.user.UserRepository;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.LocalTime;
|
||||||
|
import java.time.ZoneId;
|
||||||
|
import java.time.ZonedDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.assertj.core.api.Assertions.assertThatCode;
|
||||||
|
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||||
|
|
||||||
|
@SpringBootTest
|
||||||
|
class AvailabilityRulesTest {
|
||||||
|
|
||||||
|
private static final ZoneId zone = ZoneId.of("Europe/Warsaw");
|
||||||
|
private static final LocalDate monday = LocalDate.of(2026, 9, 7);
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private OrganizationRepository organizations;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private UserRepository users;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private PasswordEncoder passwordEncoder;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ResourceService resourceService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private AvailabilityService availabilityService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ReservationService reservationService;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void operatingHoursAndBufferGovernBooking() {
|
||||||
|
AuthenticatedUser actor = tenant("availability-hours");
|
||||||
|
Long resourceId = resourceService.create(actor.organizationId(),
|
||||||
|
new ResourceRequest("Studio", "with hours", zone.getId(), 30)).id();
|
||||||
|
availabilityService.replaceOperatingHours(actor.organizationId(), resourceId,
|
||||||
|
List.of(new OperatingHoursRequest(monday.getDayOfWeek(), LocalTime.of(9, 0), LocalTime.of(17, 0))));
|
||||||
|
|
||||||
|
assertThatCode(() -> reservationService.create(actor,
|
||||||
|
new ReservationRequest(resourceId, at(monday, 10, 0), at(monday, 11, 0))))
|
||||||
|
.doesNotThrowAnyException();
|
||||||
|
|
||||||
|
assertThatThrownBy(() -> reservationService.create(actor,
|
||||||
|
new ReservationRequest(resourceId, at(monday, 11, 15), at(monday, 12, 0))))
|
||||||
|
.isInstanceOf(AvailabilityViolationException.class);
|
||||||
|
|
||||||
|
assertThatThrownBy(() -> reservationService.create(actor,
|
||||||
|
new ReservationRequest(resourceId, at(monday, 18, 0), at(monday, 19, 0))))
|
||||||
|
.isInstanceOf(AvailabilityViolationException.class);
|
||||||
|
|
||||||
|
LocalDate closedDay = monday.plusDays(1);
|
||||||
|
assertThatThrownBy(() -> reservationService.create(actor,
|
||||||
|
new ReservationRequest(resourceId, at(closedDay, 10, 0), at(closedDay, 11, 0))))
|
||||||
|
.isInstanceOf(AvailabilityViolationException.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void blackoutRangeBlocksBooking() {
|
||||||
|
AuthenticatedUser actor = tenant("availability-blackout");
|
||||||
|
Long resourceId = resourceService.create(actor.organizationId(),
|
||||||
|
new ResourceRequest("Court", "blacked out", zone.getId(), 0)).id();
|
||||||
|
availabilityService.addBlackout(actor.organizationId(), resourceId,
|
||||||
|
new BlackoutRequest(monday, monday, "maintenance"));
|
||||||
|
|
||||||
|
assertThatThrownBy(() -> reservationService.create(actor,
|
||||||
|
new ReservationRequest(resourceId, at(monday, 10, 0), at(monday, 11, 0))))
|
||||||
|
.isInstanceOf(AvailabilityViolationException.class);
|
||||||
|
|
||||||
|
LocalDate freeDay = monday.plusDays(3);
|
||||||
|
assertThatCode(() -> reservationService.create(actor,
|
||||||
|
new ReservationRequest(resourceId, at(freeDay, 10, 0), at(freeDay, 11, 0))))
|
||||||
|
.doesNotThrowAnyException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private AuthenticatedUser tenant(String slug) {
|
||||||
|
Organization organization = organizations.save(new Organization(slug, slug, Instant.now()));
|
||||||
|
User user = users.save(new User(organization.getId(), slug + "-user",
|
||||||
|
passwordEncoder.encode("password123"), Role.USER, Instant.now()));
|
||||||
|
assertThat(monday.getDayOfWeek().getValue()).isEqualTo(1);
|
||||||
|
return new AuthenticatedUser(user.getId(), user.getUsername(), user.getRole(), organization.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Instant at(LocalDate date, int hour, int minute) {
|
||||||
|
return ZonedDateTime.of(date, LocalTime.of(hour, minute), zone).toInstant();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user