package com.youlai.boot.device; import com.youlai.boot.common.result.ResultCode; import com.youlai.boot.device.controller.DeviceAlbumController; import com.youlai.boot.device.model.vo.DevicePictureVO; import com.youlai.boot.device.service.DevicePictureService; import jakarta.validation.Validation; import org.junit.jupiter.api.Test; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.*; class DeviceAlbumControllerTest { private final DevicePictureService pictures = mock(DevicePictureService.class); private final DeviceAlbumController controller = new DeviceAlbumController(pictures); @Test void listUsesAuthenticatedDeviceAndRetainsFavoriteState() { DevicePictureVO photo = new DevicePictureVO(); photo.setUrl("https://example.com/photo.jpg"); photo.setFavorite(1); when(pictures.listPictures("device-a")).thenReturn(List.of(photo)); assertThat(controller.list("device-a").getData()).containsExactly(photo); verify(pictures).listPictures("device-a"); verifyNoMoreInteractions(pictures); } @Test void favoriteAndDeleteUseAuthenticatedDeviceAndExactUrl() { String url = "https://example.com/photo.jpg?key=a%2Bb"; when(pictures.updateFavorite("device-a", url, true)).thenReturn(true); assertThat(controller.favorite("device-a", url, 1).getCode()).isEqualTo(ResultCode.SUCCESS.getCode()); controller.delete("device-a", url); verify(pictures).updateFavorite("device-a", url, true); verify(pictures).deletePicture("device-a", url); verifyNoMoreInteractions(pictures); } @Test void missingPictureDoesNotReportFavoriteSuccess() { assertThat(controller.favorite("device-a", "missing", 0).getCode()).isNotEqualTo(ResultCode.SUCCESS.getCode()); } @Test void mutationRejectsBlankIdentityAndInvalidFavorite() throws Exception { try (var factory = Validation.buildDefaultValidatorFactory()) { var validator = factory.getValidator().forExecutables(); var method = DeviceAlbumController.class.getMethod("favorite", String.class, String.class, Integer.class); assertThat(validator.validateParameters(controller, method, new Object[]{"device-a", "url", 2})).isNotEmpty(); assertThat(validator.validateParameters(controller, method, new Object[]{"", " ", 1})).hasSize(2); assertThat(validator.validateParameters(controller, method, new Object[]{"device-a", "url", 0})).isEmpty(); } } }