From 7652610c5d85d2417261880f7918a2aed4d9f968 Mon Sep 17 00:00:00 2001 From: omenem Date: Sun, 24 May 2020 14:16:07 +0200 Subject: [PATCH 1/3] I can't mock a method --- .../RegularLightControllerTests.java | 126 ++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/RegularLightControllerTests.java diff --git a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/RegularLightControllerTests.java b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/RegularLightControllerTests.java new file mode 100644 index 0000000..f3c2136 --- /dev/null +++ b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/RegularLightControllerTests.java @@ -0,0 +1,126 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.controller; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.when; + +import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.SwitchableSaveRequest; +import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException; +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.DeviceRepository; +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.RegularLight; +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.RegularLightRepository; +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.SceneRepository; +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.State; +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.StateRepository; +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.UserRepository; +import ch.usi.inf.sa4.sanmarinoes.smarthut.service.DeviceService; +import ch.usi.inf.sa4.sanmarinoes.smarthut.utils.Utils; +import java.security.Principal; +import lombok.SneakyThrows; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +@ExtendWith(MockitoExtension.class) +@WithMockUser(username = "user") +public class RegularLightControllerTests { + + @InjectMocks private RegularLightController regularLightController; + + @Mock private RegularLightRepository regularLightRepository; + + @Mock private SceneRepository sceneRepository; + + @Mock private StateRepository stateRepository; + + @Mock private DeviceService deviceService; + + @Mock private Principal mockPrincipal; + + @Mock private UserRepository userRepository; + + @Mock private DeviceRepository deviceRepository; + + @BeforeEach + public void setup() { + when(mockPrincipal.getName()).thenReturn("user"); + } + + private void checkRegularLightAgainstRequest( + final RegularLight toCheck, final SwitchableSaveRequest request) { + assertThat(toCheck).isNotNull(); + assertThat(toCheck.isOn()).isEqualTo(request.isOn()); + assertThat(toCheck.getName()).isEqualTo(request.getName()); + assertThat(toCheck.getRoomId()).isEqualTo(request.getRoomId()); + } + + @Test + @DisplayName("when creating should return the same object") + @SneakyThrows(NotFoundException.class) + public void testCreate() { + doNothing().when(deviceService).throwIfRoomNotOwned(anyLong(), eq("user")); + when(deviceService.saveAsOwner(any(RegularLight.class), eq("user"))) + .thenAnswer(i -> i.getArguments()[0]); + + MockHttpServletRequest request = new MockHttpServletRequest(); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + + final SwitchableSaveRequest toSend = new SwitchableSaveRequest(); + toSend.setName("rl"); + toSend.setRoomId(20L); + toSend.setOn(true); + + final RegularLight regularLight = regularLightController.create(toSend, mockPrincipal); + + checkRegularLightAgainstRequest(regularLight, toSend); + } + + @Test + @DisplayName("when updating should return the same object") + @SneakyThrows(NotFoundException.class) + public void testUpdate() { + + final SwitchableSaveRequest toSend = new SwitchableSaveRequest(); + toSend.setId(50L); + toSend.setName("rl"); + toSend.setRoomId(20L); + toSend.setOn(true); + + final RegularLight toUpdate = new RegularLight(); + toUpdate.setName("OOO"); + toUpdate.setRoomId(40L); + toSend.setId(50L); + toUpdate.setOn(false); + + when(regularLightRepository.findByIdAndUserId(anyLong(), anyLong())) + .thenReturn(java.util.Optional.of(toUpdate)); + + when(deviceService.saveAsGuest(any(RegularLight.class), eq("user"), anyLong())) + .thenAnswer(i -> i.getArguments()[0]); + + when(Utils.returnIfGuest( + any(UserRepository.class), + any(RegularLight.class), + anyLong(), + any(Principal.class))) + .thenAnswer(i -> i.getArguments()[1]); + + MockHttpServletRequest request = new MockHttpServletRequest(); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + + final RegularLight regularLight = regularLightController.update(toSend, mockPrincipal, 20L); + + checkRegularLightAgainstRequest(regularLight, toSend); + } +} From bb9ccd2d6d50fa1fbcf1ca2b498f85e088758429 Mon Sep 17 00:00:00 2001 From: omenem Date: Sun, 24 May 2020 15:01:23 +0200 Subject: [PATCH 2/3] WIP --- .../controller/ThermostatControllerTests.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/ThermostatControllerTests.java b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/ThermostatControllerTests.java index db66ddd..2f23934 100644 --- a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/ThermostatControllerTests.java +++ b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/ThermostatControllerTests.java @@ -1,6 +1,7 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.controller; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.eq; @@ -8,16 +9,20 @@ import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.when; import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.ThermostatSaveRequest; +import ch.usi.inf.sa4.sanmarinoes.smarthut.error.DuplicateStateException; import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException; +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Scene; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.SceneRepository; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.State; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.StateRepository; +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.SwitchableState; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Thermostat; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.ThermostatRepository; import ch.usi.inf.sa4.sanmarinoes.smarthut.service.DeviceService; import ch.usi.inf.sa4.sanmarinoes.smarthut.service.ThermostatPopulationService; import java.math.BigDecimal; import java.security.Principal; +import java.util.Optional; import lombok.SneakyThrows; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -128,4 +133,37 @@ public class ThermostatControllerTests { Assertions.assertDoesNotThrow(() -> thermostatController.deleteById(42L, mockPrincipal)); } + + @Test + public void testSceneBinding() { + Thermostat thermostat = new Thermostat(); + when(thermostatRepository.findByIdAndUsername(24L, "user")) + .thenReturn(Optional.of(thermostat)); + Scene scene = new Scene(); + scene.setId(1L); + SwitchableState state = new SwitchableState(); + state.setSceneId(1L); + State s = thermostat.cloneState(); + when(sceneRepository.findById(1L)).thenReturn(Optional.of(scene)); + when(stateRepository.countByDeviceIdAndSceneId(24L, 1L)).thenReturn(0); + Assertions.assertDoesNotThrow( + () -> thermostatController.sceneBinding(24L, 1L, mockPrincipal)); + } + + @Test + public void testSceneBinding2() { + when(mockPrincipal.getName()).thenReturn("user"); + Thermostat thermostat = new Thermostat(); + when(thermostatRepository.findByIdAndUsername(24L, "user")) + .thenReturn(Optional.of(thermostat)); + Scene scene = new Scene(); + scene.setId(1L); + SwitchableState state = new SwitchableState(); + state.setSceneId(1L); + State s = thermostat.cloneState(); + when(sceneRepository.findById(1L)).thenReturn(Optional.of(scene)); + when(stateRepository.countByDeviceIdAndSceneId(24L, 1L)).thenReturn(2); + assertThatThrownBy(() -> thermostatController.sceneBinding(24L, 1L, mockPrincipal)) + .isInstanceOf(DuplicateStateException.class); + } } From 4253e652411414f3a455e516626c70ec85ef7ad7 Mon Sep 17 00:00:00 2001 From: "Claudio Maggioni (maggicl)" Date: Sun, 24 May 2020 22:27:00 +0200 Subject: [PATCH 3/3] Fixes --- .../smarthut/config/JWTRequestFilter.java | 10 ++++++-- .../RegularLightControllerTests.java | 23 ++++++++----------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/JWTRequestFilter.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/JWTRequestFilter.java index 3cfc094..f5d7d18 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/JWTRequestFilter.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/JWTRequestFilter.java @@ -18,9 +18,15 @@ import org.springframework.web.filter.OncePerRequestFilter; @Component public class JWTRequestFilter extends OncePerRequestFilter { - @Autowired private JWTUserDetailsService jwtUserDetailsService; + private final JWTUserDetailsService jwtUserDetailsService; + private final JWTTokenUtils jwtTokenUtils; - @Autowired private JWTTokenUtils jwtTokenUtils; + @Autowired + public JWTRequestFilter( + JWTUserDetailsService jwtUserDetailsService, JWTTokenUtils jwtTokenUtils) { + this.jwtUserDetailsService = jwtUserDetailsService; + this.jwtTokenUtils = jwtTokenUtils; + } @Override protected void doFilterInternal( diff --git a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/RegularLightControllerTests.java b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/RegularLightControllerTests.java index f3c2136..1e4523f 100644 --- a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/RegularLightControllerTests.java +++ b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/RegularLightControllerTests.java @@ -9,16 +9,10 @@ import static org.mockito.Mockito.when; import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.SwitchableSaveRequest; import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException; -import ch.usi.inf.sa4.sanmarinoes.smarthut.models.DeviceRepository; -import ch.usi.inf.sa4.sanmarinoes.smarthut.models.RegularLight; -import ch.usi.inf.sa4.sanmarinoes.smarthut.models.RegularLightRepository; -import ch.usi.inf.sa4.sanmarinoes.smarthut.models.SceneRepository; -import ch.usi.inf.sa4.sanmarinoes.smarthut.models.State; -import ch.usi.inf.sa4.sanmarinoes.smarthut.models.StateRepository; -import ch.usi.inf.sa4.sanmarinoes.smarthut.models.UserRepository; +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*; import ch.usi.inf.sa4.sanmarinoes.smarthut.service.DeviceService; -import ch.usi.inf.sa4.sanmarinoes.smarthut.utils.Utils; import java.security.Principal; +import java.util.Optional; import lombok.SneakyThrows; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -109,12 +103,13 @@ public class RegularLightControllerTests { when(deviceService.saveAsGuest(any(RegularLight.class), eq("user"), anyLong())) .thenAnswer(i -> i.getArguments()[0]); - when(Utils.returnIfGuest( - any(UserRepository.class), - any(RegularLight.class), - anyLong(), - any(Principal.class))) - .thenAnswer(i -> i.getArguments()[1]); + User guest = new User(); + User host = new User(); + host.getGuests().add(guest); + guest.getHosts().add(host); + + when(userRepository.findById(20L)).thenReturn(Optional.of(host)); + when(userRepository.findByUsername("user")).thenReturn(guest); MockHttpServletRequest request = new MockHttpServletRequest(); RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));