package jnpf.dmsService; import jnpf.exception.DataException; import org.junit.jupiter.api.Test; import java.time.Instant; import java.util.Date; import static org.junit.jupiter.api.Assertions.*; class DmsApprovedFileDatesTest { private Date at(String instant) { return Date.from(Instant.parse(instant)); } @Test void formalDateUsesShanghaiMidnightWithoutMovingToRegistrationTime() { assertEquals(at("2026-09-19T16:00:00Z"), DmsApprovedFileDates.scheduled(at("2026-09-20T03:00:00Z"))); assertEquals(at("2026-09-13T16:00:00Z"), DmsApprovedFileDates.scheduled(at("2026-09-14T00:00:00Z"))); } @Test void formalEffectiveDateIsRequired() { assertThrows(DataException.class, () -> DmsApprovedFileDates.scheduled(null)); } @Test void revocationAndInvalidationNeverRunBeforeApproval() { Date approved = at("2026-09-17T04:30:00Z"); assertEquals(approved, DmsApprovedFileDates.disableScheduled(null, approved)); assertEquals(approved, DmsApprovedFileDates.disableScheduled(at("2026-09-16T16:00:00Z"), approved)); assertEquals(approved, DmsApprovedFileDates.disableScheduled(at("2026-09-10T16:00:00Z"), approved)); assertThrows(DataException.class, () -> DmsApprovedFileDates.disableScheduled(null, null)); } @Test void futureDisableDateUsesShanghaiMidnightAndEachFileKeepsItsDate() { Date approved = at("2026-09-17T04:30:00Z"); assertEquals(at("2026-09-17T16:00:00Z"), DmsApprovedFileDates.disableScheduled(at("2026-09-18T06:00:00Z"), approved)); assertEquals(at("2026-09-19T16:00:00Z"), DmsApprovedFileDates.disableScheduled(at("2026-09-20T06:00:00Z"), approved)); } @Test void expiryIncludesEntireBusinessDayAndRejectsExpiredInput() { assertEquals(at("2026-09-20T16:00:00Z"), DmsApprovedFileDates.expires(at("2026-09-20T00:00:00Z"), at("2026-09-20T05:00:00Z"))); assertThrows(DataException.class, () -> DmsApprovedFileDates.expires(at("2026-09-20T00:00:00Z"), at("2026-09-20T16:00:00Z"))); } }