From 016c9f563e6acf28a60b550e3916e83b6aed677e Mon Sep 17 00:00:00 2001 From: "Claudio Maggioni (maggicl)" Date: Tue, 19 May 2020 14:35:51 +0200 Subject: [PATCH] Added DeviceService tests possibly breaking everything --- .../sa4/sanmarinoes/smarthut/models/User.java | 138 ++++-------------- .../service/JWTUserDetailsService.java | 2 +- .../sanmarinoes/smarthut/SmartHutTest.java | 2 +- .../sa4/sanmarinoes/smarthut/UserTests.java | 8 +- .../smarthut/service/DeviceServiceTests.java | 105 ++++++++++++- 5 files changed, 141 insertions(+), 114 deletions(-) diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/User.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/User.java index 61bdf6d..fc575b5 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/User.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/User.java @@ -6,28 +6,40 @@ import java.util.HashSet; import java.util.Objects; import java.util.Set; import javax.persistence.*; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; /** A user of the Smarthut application */ @Entity(name = "smarthutuser") +@ToString public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id", updatable = false, nullable = false, unique = true) @ApiModelProperty(hidden = true) + @Getter + @Setter private Long id; /** The full name of the user */ @Column(nullable = false) + @Getter + @Setter private String name; /** The full username of the user */ @Column(nullable = false, unique = true) + @Getter + @Setter private String username; /** A properly salted way to store the password */ @Column(nullable = false) @GsonExclude + @Getter + @Setter private String password; /** @@ -35,11 +47,15 @@ public class User { * , technically not RFC 5322 compliant */ @Column(nullable = false, unique = true) + @Getter + @Setter private String email; /** Guests invited by this user */ @ManyToMany(mappedBy = "hosts", cascade = CascadeType.DETACH) @GsonExclude + @Getter + @ToString.Exclude private Set guests = new HashSet<>(); @ManyToMany(cascade = CascadeType.DETACH) @@ -48,74 +64,34 @@ public class User { joinColumns = @JoinColumn(name = "guest_id"), inverseJoinColumns = @JoinColumn(name = "host_id")) @GsonExclude + @Getter + @ToString.Exclude private Set hosts = new HashSet<>(); /** Determines whether a guest can access security cameras */ @Column(nullable = false) + @Getter + @Setter private boolean cameraEnabled; @Column(nullable = false) @GsonExclude + @Getter + @Setter private boolean isEnabled = false; - public Long getId() { - return id; + @Override + public int hashCode() { + if (id == null) return Integer.MAX_VALUE; + return (int) (id % Integer.MAX_VALUE); } - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public void setName(String name) { - this.name = name; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public boolean getEnabled() { - return isEnabled; - } - - public void setEnabled(boolean enabled) { - isEnabled = enabled; - } - - public Set getGuests() { - return guests; - } - - public Set getHosts() { - return hosts; - } - - public boolean isCameraEnabled() { - return cameraEnabled; + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + User user = (User) o; + return Objects.equals(id, user.id); } public void addGuest(User guest) { @@ -125,54 +101,4 @@ public class User { public void addHost(User host) { this.hosts.add(host); } - - public void removeGuest(User guest) { - this.guests.remove(guest); - } - - public void setCameraEnabled(boolean cameraEnabled) { - this.cameraEnabled = cameraEnabled; - } - - @Override - public String toString() { - return "User{id=" - + id - + ", name='" - + name - + '\'' - + ", username='" - + username - + '\'' - + ", password='" - + password - + '\'' - + ", email='" - + email - + '\'' - + ", cameraEnabled=" - + cameraEnabled - + ", isEnabled=" - + isEnabled - + '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - User user = (User) o; - return cameraEnabled == user.cameraEnabled - && isEnabled == user.isEnabled - && Objects.equals(id, user.id) - && Objects.equals(name, user.name) - && Objects.equals(username, user.username) - && Objects.equals(password, user.password) - && Objects.equals(email, user.email); - } - - @Override - public int hashCode() { - return Objects.hash(id, name, username, password, email, isEnabled, cameraEnabled); - } } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/JWTUserDetailsService.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/JWTUserDetailsService.java index 3312613..51eb7d9 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/JWTUserDetailsService.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/JWTUserDetailsService.java @@ -16,7 +16,7 @@ public class JWTUserDetailsService implements UserDetailsService { @Override public UserDetails loadUserByUsername(String username) { User toReturn = repository.findByUsername(username); - if (toReturn != null && toReturn.getEnabled()) { + if (toReturn != null && toReturn.isEnabled()) { return new org.springframework.security.core.userdetails.User( toReturn.getUsername(), toReturn.getPassword(), Set.of()); } else { diff --git a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/SmartHutTest.java b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/SmartHutTest.java index 4ac1a0f..95edf1a 100644 --- a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/SmartHutTest.java +++ b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/SmartHutTest.java @@ -56,7 +56,7 @@ public abstract class SmartHutTest { assertThat(res3).isNotNull(); assertThat(res3.getStatusCode()).isEqualTo(HttpStatus.FOUND); - assertThat(userRepository.findByUsername("enabled").getEnabled()).isTrue(); + assertThat(userRepository.findByUsername("enabled").isEnabled()).isTrue(); } @BeforeEach diff --git a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/UserTests.java b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/UserTests.java index 1d16b16..2331dc3 100644 --- a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/UserTests.java +++ b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/UserTests.java @@ -20,7 +20,7 @@ public class UserTests { @Test @DisplayName("get and set id") public void getAndSetId() { - user.setId(20l); + user.setId(20L); assertEquals(20, user.getId()); } @@ -62,7 +62,7 @@ public class UserTests { public void getAndSetEnabled() { user.setEnabled(true); - assertTrue(user.getEnabled()); + assertTrue(user.isEnabled()); } @Test @@ -76,8 +76,8 @@ public class UserTests { @Test @DisplayName("equals") public void eq() { - assertFalse(user.equals(null)); + assertNotEquals(null, user); - assertTrue(user.equals(user)); + assertEquals(user, user); } } diff --git a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/DeviceServiceTests.java b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/DeviceServiceTests.java index 683ec65..37db737 100644 --- a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/DeviceServiceTests.java +++ b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/DeviceServiceTests.java @@ -1,8 +1,8 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.service; import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.when; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*; @@ -12,6 +12,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) @@ -136,4 +137,104 @@ public class DeviceServiceTests { assertThat(deviceService.saveAsGuest(t, "user", 1L)).isEqualTo(t); } + + @Test + public void testDeleteIdAsOwner() { + try { + doNothing().when(devicePropagationService).deleteByIdAsOwner(1L, "user"); + deviceService.deleteByIdAsOwner(1L, "user"); + } catch (NotFoundException e) { + fail(e.getMessage()); + } + } + + @Test + public void populateComputedFields() { + doNothing().when(devicePopulationService).populateComputedFields(List.of()); + deviceService.populateComputedFields(List.of()); + } + + @Test + public void testSaveAllAsOwner() { + final DeviceService currentDeviceService = Mockito.spy(deviceService); + List devices = List.of(new RegularLight(), new ButtonDimmer()); + when(devicePropagationService.saveAllAsOwner( + eq(devices), eq("user"), anyBoolean(), eq(false))) + .thenReturn(devices); + + final int[] count = new int[1]; + + doAnswer(i -> count[0]++) + .when(currentDeviceService) + .triggerTriggers(any(Device.class), eq("user")); + + currentDeviceService.saveAllAsOwner(devices, "user", true, false); + assertThat(count[0]).isEqualTo(0); + + currentDeviceService.saveAllAsOwner(devices, "user", false, false); + assertThat(count[0]).isEqualTo(2); + } + + @Test + public void testSaveAsOwner() { + final DeviceService currentDeviceService = Mockito.spy(deviceService); + Device device = new ButtonDimmer(); + + final boolean[] count = new boolean[1]; + + doAnswer(i -> count[0] = true).when(currentDeviceService).triggerTriggers(device, "user"); + when(devicePropagationService.saveAsOwner(device, "user")).thenReturn(device); + + assertThat(currentDeviceService.saveAsOwner(device, "user")).isEqualTo(device); + assertThat(count[0]).isTrue(); + } + + @Test + public void testFindAll() throws NotFoundException { + final DeviceService currentDeviceService = Mockito.spy(deviceService); + final SecurityCamera gerryScotti = new SecurityCamera(); + doNothing().when(currentDeviceService).throwIfRoomNotOwned(1L, "user"); + doNothing().when(devicePopulationService).populateComputedFields(any()); + + when(deviceRepository.findByRoomId(1L)).thenReturn(List.of(gerryScotti)); + when(deviceRepository.findAllByUsername("user")).thenReturn(List.of(gerryScotti)); + + final User user = new User(); + user.setUsername("user"); + user.setEmail("user@example.com"); + user.setName("User"); + user.setId(1L); + user.setCameraEnabled(true); + + final User guest = new User(); + guest.setUsername("guest"); + guest.setEmail("guest@example.com"); + guest.setName("Guest"); + guest.setId(2L); + guest.getHosts().add(user); + user.getGuests().add(guest); + + when(userRepository.findByUsername("guest")).thenReturn(guest); + when(userRepository.findById(1L)).thenReturn(Optional.of(user)); + when(userRepository.findById(3L)).thenReturn(Optional.empty()); + + final Room r = new Room(); + r.setUserId(1L); + when(roomRepository.findById(1L)).thenReturn(Optional.of(r)); + when(roomRepository.findById(3L)).thenReturn(Optional.empty()); + + assertThat(currentDeviceService.findAll(1L, null, "user")).containsExactly(gerryScotti); + assertThat(currentDeviceService.findAll(null, "user")).containsExactly(gerryScotti); + + assertThatThrownBy(() -> currentDeviceService.findAll(1L, 3L, "guest")) + .isInstanceOf(NotFoundException.class); + assertThatThrownBy(() -> currentDeviceService.findAll(3L, 1L, "guest")) + .isInstanceOf(NotFoundException.class); + + assertThat(currentDeviceService.findAll(1L, 1L, "guest")).containsExactly(gerryScotti); + + user.setCameraEnabled(false); + + assertThat(currentDeviceService.findAll(1L, 1L, "guest")).isEmpty(); + } }