test(attendance): guard component method surfaces

This commit is contained in:
sechmachine
2026-08-15 11:49:53 +07:00
parent 9023062477
commit 5ddbd75f07
2 changed files with 127 additions and 13 deletions
@@ -11,6 +11,7 @@ import com.lab.labtimesheet.feature.attendance.model.AttendancePolicy;
import com.lab.labtimesheet.feature.attendance.model.AttendanceRecord;
import com.lab.labtimesheet.feature.attendance.model.AttendanceRole;
import com.lab.labtimesheet.feature.attendance.model.AttendanceViolations;
import com.lab.labtimesheet.feature.attendance.model.dto.AttendanceCurrentState;
import com.lab.labtimesheet.feature.attendance.model.dto.AttendanceHistoryItem;
import com.lab.labtimesheet.feature.attendance.model.dto.GlobalCalendarEvent;
import com.lab.labtimesheet.feature.attendance.model.entity.AttendancePolicyEntity;
@@ -31,6 +32,7 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.math.BigDecimal;
import java.security.Principal;
import java.time.Clock;
import java.time.Instant;
import java.time.LocalDate;
@@ -38,8 +40,11 @@ import java.time.LocalTime;
import java.time.ZoneId;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import org.junit.jupiter.api.Test;
import org.springframework.ui.Model;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
class AttendanceLombokBoilerplateTest {
@@ -213,6 +218,120 @@ class AttendanceLombokBoilerplateTest {
assertMethodSurface(LeaveRequestEntity.class);
}
@Test
void componentsExposeOnlyIntentionalPublicAndProtectedDeclaredMethods() {
assertMethodSurface(
AttendanceController.class,
method(
Modifier.PUBLIC,
"ownHistory",
String.class,
Principal.class,
LocalDate.class,
LocalDate.class,
Model.class),
method(
Modifier.PUBLIC,
"inspectHistory",
String.class,
Principal.class,
long.class,
LocalDate.class,
LocalDate.class,
Model.class),
method(
Modifier.PUBLIC,
"checkIn",
String.class,
Principal.class,
RedirectAttributes.class),
method(
Modifier.PUBLIC,
"checkOut",
String.class,
Principal.class,
RedirectAttributes.class));
assertMethodSurface(
CalendarController.class,
method(Modifier.PUBLIC, "calendar", String.class, Principal.class, Model.class),
method(
Modifier.PUBLIC,
"create",
String.class,
Principal.class,
LocalDate.class,
String.class,
boolean.class,
RedirectAttributes.class),
method(
Modifier.PUBLIC,
"update",
String.class,
Principal.class,
long.class,
long.class,
LocalDate.class,
String.class,
boolean.class,
RedirectAttributes.class));
assertMethodSurface(
AttendanceApplicationService.class,
method(Modifier.PUBLIC, "checkIn", AttendanceRecord.class, long.class),
method(Modifier.PUBLIC, "checkOut", AttendanceRecord.class, long.class),
method(Modifier.PUBLIC, "currentState", AttendanceCurrentState.class, long.class),
method(
Modifier.PUBLIC,
"history",
List.class,
AttendanceActor.class,
long.class,
LocalDate.class,
LocalDate.class),
method(Modifier.PUBLIC, "currentBusinessDate", LocalDate.class));
assertMethodSurface(
AttendanceCurrentUserService.class,
method(Modifier.PUBLIC, "actor", AttendanceActor.class, Principal.class));
assertMethodSurface(
AttendanceService.class,
method(
Modifier.PUBLIC,
"checkIn",
AttendanceRecord.class,
long.class,
Instant.class,
AttendancePolicy.class,
AttendanceDayContext.class,
Optional.class),
method(
Modifier.PUBLIC,
"checkOut",
AttendanceRecord.class,
Optional.class,
Instant.class));
assertMethodSurface(
CalendarApplicationService.class,
method(
Modifier.PUBLIC,
"createManual",
GlobalCalendarEvent.class,
AttendanceActor.class,
LocalDate.class,
String.class,
boolean.class),
method(
Modifier.PUBLIC,
"updateManual",
GlobalCalendarEvent.class,
AttendanceActor.class,
long.class,
long.class,
LocalDate.class,
String.class,
boolean.class),
method(Modifier.PUBLIC, "list", List.class, LocalDate.class, LocalDate.class),
method(Modifier.PUBLIC, "isGlobalDayOff", boolean.class, LocalDate.class));
}
private static void assertConstructors(
Class<?> type, ConstructorContract... expectedConstructors) {
List<ConstructorContract> actual = Arrays.stream(type.getDeclaredConstructors())