diff --git a/usermodel-initial/pom.xml b/usermodel-initial/pom.xml index 4a5df7a..be8b726 100644 --- a/usermodel-initial/pom.xml +++ b/usermodel-initial/pom.xml @@ -95,6 +95,12 @@ 2.3.6.RELEASE + + io.rest-assured + spring-mock-mvc + 3.3.0 + test + diff --git a/usermodel-initial/src/main/java/com/lambdaschool/usermodel/SeedData.java b/usermodel-initial/src/main/java/com/lambdaschool/usermodel/SeedData.java index 50d2caa..0d265d1 100755 --- a/usermodel-initial/src/main/java/com/lambdaschool/usermodel/SeedData.java +++ b/usermodel-initial/src/main/java/com/lambdaschool/usermodel/SeedData.java @@ -11,6 +11,7 @@ import com.lambdaschool.usermodel.services.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -23,6 +24,12 @@ * after the application context has been loaded. */ @Transactional +@ConditionalOnProperty( + prefix = "command.line.runner", + value = "enabled", + havingValue = "true", + matchIfMissing = true +) @Component public class SeedData implements CommandLineRunner diff --git a/usermodel-initial/src/main/java/com/lambdaschool/usermodel/UserModelApplication.java b/usermodel-initial/src/main/java/com/lambdaschool/usermodel/UserModelApplication.java index 6a7fd50..a871c2f 100644 --- a/usermodel-initial/src/main/java/com/lambdaschool/usermodel/UserModelApplication.java +++ b/usermodel-initial/src/main/java/com/lambdaschool/usermodel/UserModelApplication.java @@ -9,7 +9,7 @@ /** * Main class to start the application. */ -@EnableJpaAuditing +//@EnableJpaAuditing @SpringBootApplication public class UserModelApplication { diff --git a/usermodel-initial/src/main/java/com/lambdaschool/usermodel/config/SimpleCorsFilter.java b/usermodel-initial/src/main/java/com/lambdaschool/usermodel/config/SimpleCorsFilter.java index 46fb9d2..3655f90 100644 --- a/usermodel-initial/src/main/java/com/lambdaschool/usermodel/config/SimpleCorsFilter.java +++ b/usermodel-initial/src/main/java/com/lambdaschool/usermodel/config/SimpleCorsFilter.java @@ -17,7 +17,7 @@ */ @Component @Order(Ordered.HIGHEST_PRECEDENCE) -public class SimpleCorsFilter +public abstract class SimpleCorsFilter implements Filter { @Override diff --git a/usermodel-initial/src/main/resources/application.properties b/usermodel-initial/src/main/resources/application.properties index 6467ccd..92abaad 100644 --- a/usermodel-initial/src/main/resources/application.properties +++ b/usermodel-initial/src/main/resources/application.properties @@ -17,7 +17,7 @@ spring.jpa.open-in-view=true # What do with the schema # drop n create table again, good for testing spring.jpa.hibernate.ddl-auto=create -spring.datasource.initialization-mode=always +spring.datasource.initialization-mode=never # # Good for production! # spring.jpa.hibernate.ddl-auto=update diff --git a/usermodel-initial/src/test/java/com/lambdaschool/usermodel/SeedData.java b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/SeedData.java new file mode 100644 index 0000000..6a31e3b --- /dev/null +++ b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/SeedData.java @@ -0,0 +1,174 @@ +package com.lambdaschool.usermodel; + +import com.github.javafaker.Faker; +import com.github.javafaker.service.FakeValuesService; +import com.github.javafaker.service.RandomService; +import com.lambdaschool.usermodel.models.Role; +import com.lambdaschool.usermodel.models.User; +import com.lambdaschool.usermodel.models.UserRoles; +import com.lambdaschool.usermodel.models.Useremail; +import com.lambdaschool.usermodel.services.RoleService; +import com.lambdaschool.usermodel.services.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Locale; + +/** + * SeedData puts both known and random data into the database. It implements CommandLineRunner. + *

+ * CoomandLineRunner: Spring Boot automatically runs the run method once and only once + * after the application context has been loaded. + */ +@Transactional +@ConditionalOnProperty( + prefix = "command.line.runner", + value = "enabled", + havingValue = "true", + matchIfMissing = true +) +@Component +public class SeedData + implements CommandLineRunner +{ + /** + * Connects the Role Service to this process + */ + @Autowired + RoleService roleService; + + /** + * Connects the user service to this process + */ + @Autowired + UserService userService; + + /** + * Generates test, seed data for our application + * First a set of known data is seeded into our database. + * Second a random set of data using Java Faker is seeded into our database. + * Note this process does not remove data from the database. So if data exists in the database + * prior to running this process, that data remains in the database. + * + * @param args The parameter is required by the parent interface but is not used in this process. + */ + @Transactional + @Override + public void run(String[] args) throws + Exception + { + userService.deleteAll(); + roleService.deleteAll(); + Role r1 = new Role("admin"); + Role r2 = new Role("user"); + Role r3 = new Role("data"); + + r1 = roleService.save(r1); + r2 = roleService.save(r2); + r3 = roleService.save(r3); + + // admin, data, user + User u1 = new User("test admin", + "password", + "admin@lambdaschool.local"); + u1.getRoles() + .add(new UserRoles(u1, + r1)); + u1.getRoles() + .add(new UserRoles(u1, + r2)); + u1.getRoles() + .add(new UserRoles(u1, + r3)); + u1.getUseremails() + .add(new Useremail(u1, + "admin@email.local")); + u1.getUseremails() + .add(new Useremail(u1, + "admin@mymail.local")); + + userService.save(u1); + + // data, user + User u2 = new User("test cinnamon", + "1234567", + "cinnamon@lambdaschool.local"); + u2.getRoles() + .add(new UserRoles(u2, + r2)); + u2.getRoles() + .add(new UserRoles(u2, + r3)); + u2.getUseremails() + .add(new Useremail(u2, + "cinnamon@mymail.local")); + u2.getUseremails() + .add(new Useremail(u2, + "hops@mymail.local")); + u2.getUseremails() + .add(new Useremail(u2, + "bunny@email.local")); + userService.save(u2); + + // user + User u3 = new User("test barnbarn", + "ILuvM4th!", + "barnbarn@lambdaschool.local"); + u3.getRoles() + .add(new UserRoles(u3, + r2)); + u3.getUseremails() + .add(new Useremail(u3, + "barnbarn@email.local")); + userService.save(u3); + + User u4 = new User("test puttat", + "password", + "puttat@school.lambda"); + u4.getRoles() + .add(new UserRoles(u4, + r2)); + userService.save(u4); + + User u5 = new User("test misskitty", + "password", + "misskitty@school.lambda"); + u5.getRoles() + .add(new UserRoles(u5, + r2)); + userService.save(u5); + + if (false) + { + // using JavaFaker create a bunch of regular users + // https://www.baeldung.com/java-faker + // https://www.baeldung.com/regular-expressions-java + + FakeValuesService fakeValuesService = new FakeValuesService(new Locale("en-US"), + new RandomService()); + Faker nameFaker = new Faker(new Locale("en-US")); + + for (int i = 0; i < 25; i++) + { + new User(); + User fakeUser; + + fakeUser = new User(nameFaker.name() + .username(), + "password", + nameFaker.internet() + .emailAddress()); + fakeUser.getRoles() + .add(new UserRoles(fakeUser, + r2)); + fakeUser.getUseremails() + .add(new Useremail(fakeUser, + fakeValuesService.bothify("????##@gmail.com"))); + userService.save(fakeUser); + } + } + } +} \ No newline at end of file diff --git a/usermodel-initial/src/test/java/com/lambdaschool/usermodel/controllers/UserControllerTestIntegration.java b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/controllers/UserControllerTestIntegration.java new file mode 100644 index 0000000..cf08b1e --- /dev/null +++ b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/controllers/UserControllerTestIntegration.java @@ -0,0 +1,161 @@ +package com.lambdaschool.usermodel.controllers; + +import com.lambdaschool.usermodel.UserModelApplicationTesting; +import io.restassured.module.mockmvc.RestAssuredMockMvc; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithUserDetails; +import org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import static org.hamcrest.Matchers.containsString; +import static org.junit.Assert.assertTrue; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RunWith(SpringRunner.class) +@WithUserDetails("admin") +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = UserModelApplicationTesting.class) +@AutoConfigureMockMvc +public class UserControllerTestIntegration { + + @Autowired + private WebApplicationContext webApplicationContext; + + private MockMvc mockMvc; + + @Before + public void setUp() throws Exception { + RestAssuredMockMvc.webAppContextSetup(webApplicationContext); + mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext) + .apply(SecurityMockMvcConfigurers.springSecurity()).build(); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void whenMeasuredResponseTime() throws Exception { + long time = System.currentTimeMillis(); + this.mockMvc.perform(get("/users/users")).andDo(print()); + long responseTime = (System.currentTimeMillis() - time); + + assertTrue((responseTime < 5000L)); + } + + @Test + public void getAllUsers() throws Exception { + this.mockMvc.perform(get("/users/users")) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("cinnamon"))); + } + + + @Test + public void getUserLikeName() throws Exception { + this.mockMvc.perform(get("/users/user/name/like/{userName}", "kitty")) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("misskitty"))); + } + + @Test + public void getUserById() throws Exception { + this.mockMvc.perform(get("/users/user/{userid}", 4)) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("admin"))); + } + + @Test + public void getUserByIdNotFound() throws Exception { + this.mockMvc.perform(get("/users/user/{userid}", 400)) + .andDo(print()) + .andExpect(status().is4xxClientError()) + .andExpect(content().string(containsString("ResourceNotFoundException"))); + } + + @Test + public void getUserByName() throws Exception { + this.mockMvc.perform(get("/users/user/name/{userName}", "admin")) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("admin"))); + } + @Test + public void getUserByNameNotFound() throws Exception { + this.mockMvc.perform(get("/users/user/name/{userName}", "nimda")) + .andDo(print()) + .andExpect(status().is4xxClientError()) + .andExpect(content().string(containsString("ResourceNotFoundException"))); + } + + + @Test + public void givenPostAUser() throws Exception { + mockMvc.perform(MockMvcRequestBuilders.post("/users/user") + .content("{\"username\": \"Ginger\", \"password\": \"EATEATEAT\", \"primaryemail\": \"ginger@home.local\" }") + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isCreated()) + .andExpect(MockMvcResultMatchers.header() + .exists("location")); + + } + @Test + public void givenPutAUser() throws Exception { + mockMvc.perform(MockMvcRequestBuilders.put("/users/user/11") + .content("{\"username\": \"stumps\", \"password\": \"EATEATEAT\", \"primaryemail\": \"stumps@home.local\" }") + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isOk()); + } + + @Test + public void deleteUserById() throws Exception { + mockMvc.perform(MockMvcRequestBuilders.delete("/users/user/{id}", 13)) + .andDo(print()) + .andExpect(status().is2xxSuccessful()); + } + @Test + public void deleteUserByIdNotFound() throws Exception { + mockMvc.perform(MockMvcRequestBuilders.delete("/users/user/{id}", 130)) + .andDo(print()) + .andExpect(status().is4xxClientError()); + } + + @Test + public void updateUser() throws Exception { + mockMvc.perform(MockMvcRequestBuilders.patch("/users/user/{userid}", 7) + .content("{\"password\": \"EATEATEAT\"}") + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isOk()); + } + + @Test + public void getCurrentUserInfo() throws Exception { + this.mockMvc.perform(get("/users/getuserinfo")) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("admin"))); + } +} \ No newline at end of file diff --git a/usermodel-initial/src/test/java/com/lambdaschool/usermodel/controllers/UserControllerTestNoDB.java b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/controllers/UserControllerTestNoDB.java new file mode 100644 index 0000000..53eedfc --- /dev/null +++ b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/controllers/UserControllerTestNoDB.java @@ -0,0 +1,291 @@ +package com.lambdaschool.usermodel.controllers; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.lambdaschool.usermodel.UserModelApplicationTesting; +import com.lambdaschool.usermodel.models.Role; +import com.lambdaschool.usermodel.models.User; +import com.lambdaschool.usermodel.models.UserRoles; +import com.lambdaschool.usermodel.models.Useremail; +import com.lambdaschool.usermodel.services.UserService; +import io.restassured.module.mockmvc.RestAssuredMockMvc; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.RequestBuilder; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultHandlers; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import java.util.ArrayList; +import java.util.List; + +import static org.mockito.ArgumentMatchers.any; +import static org.junit.Assert.*; +import static org.mockito.ArgumentMatchers.anyString; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RunWith(SpringRunner.class) +@WithMockUser(username = "admin", roles = {"USER", "ADMIN"}) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, + classes = UserModelApplicationTesting.class, + properties = {"command.line.runner.enabled=false"}) +@AutoConfigureMockMvc +public class UserControllerTestNoDB { + + @Autowired + private WebApplicationContext webApplicationContext; + + private MockMvc mockMvc; + + @MockBean + private UserService userService; + + private List userList; + + @Before + public void setUp() throws Exception { + userList = new ArrayList<>(); + + Role r1 = new Role("admin"); + r1.setRoleid(1); + Role r2 = new Role("user"); + r2.setRoleid(2); + Role r3 = new Role("data"); + r3.setRoleid(3); + + User u1 = new User("admin", "password", "admin@lambda.test"); + u1.getRoles().add(new UserRoles(u1, r1)); + u1.getRoles().add(new UserRoles(u1, r2)); + u1.getRoles().add(new UserRoles(u1, r3)); + + u1.getUseremails().add(new Useremail(u1, "admin@test.test")); + u1.getUseremails().get(0).setUseremailid(10); + u1.getUseremails().add(new Useremail(u1, "admin@mymail.test")); + u1.getUseremails().get(1).setUseremailid(11); + + u1.setUserid(101); + userList.add(u1); + + ArrayList datas = new ArrayList<>(); + User u2 = new User("cinnamon", "password", "cinnamon@lambda.test"); + u2.getRoles().add(new UserRoles(u2, r2)); + u2.getRoles().add(new UserRoles(u2, r3)); + + u2.getUseremails().add(new Useremail(u2, "cinnamon@test.test")); + u2.getUseremails().get(0).setUseremailid(20); + u2.getUseremails().add(new Useremail(u2, "cinnamon@ymail.test")); + u2.getUseremails().get(1).setUseremailid(21); + u2.getUseremails().add(new Useremail(u2, "cinnamon@email.test")); + u2.getUseremails().get(2).setUseremailid(22); + + u2.setUserid(102); + userList.add(u2); + + User u3 = new User("barn", "password", "barn@lambda.test"); + u3.getRoles().add(new UserRoles(u3, r1)); + u3.getUseremails().add(new Useremail(u3, "barn@test.test")); + u3.getUseremails().get(0).setUseremailid(30); + + u3.setUserid(103); + userList.add(u3); + + User u4 = new User("cat", "password", "cat@test.test"); + u4.getRoles().add(new UserRoles(u4, r2)); + + u4.setUserid(104); + userList.add(u4); + + User u5 = new User("dog", "password", "dog@test.test"); + u5.getRoles().add(new UserRoles(u5, r2)); + + u5.setUserid(105); + userList.add(u5); + + RestAssuredMockMvc.webAppContextSetup(webApplicationContext); + + mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext) + .apply(SecurityMockMvcConfigurers.springSecurity()) + .build(); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void listAllUsers() throws Exception{ + String apiUrl = "/users/users"; + + Mockito.when(userService.findAll()).thenReturn(userList); + + RequestBuilder rb = MockMvcRequestBuilders.get(apiUrl).accept(MediaType.APPLICATION_JSON); + + MvcResult r = mockMvc.perform(rb).andReturn(); + String tr = r.getResponse().getContentAsString(); + + ObjectMapper mapper = new ObjectMapper(); + String er = mapper.writeValueAsString(userList); + + assertEquals("Rest API Returns List", er, tr); + } + + @Test + public void getUserById() throws Exception { + String apiUrl = "/users/user/12"; + + Mockito.when(userService.findUserById(12)).thenReturn(userList.get(1)); + + RequestBuilder rb = MockMvcRequestBuilders.get(apiUrl).accept(MediaType.APPLICATION_JSON); + + MvcResult r = mockMvc.perform(rb).andReturn(); + String tr = r.getResponse().getContentAsString(); + + ObjectMapper mapper = new ObjectMapper(); + String er = mapper.writeValueAsString(userList); + + assertEquals("Rest API Returns List", er, tr); + } + @Test + public void getUserByIdNotFound() throws Exception { + String apiUrl = "/users/user/88"; + + Mockito.when(userService.findUserById(88)).thenReturn(null); + + RequestBuilder rb = MockMvcRequestBuilders.get(apiUrl).accept(MediaType.APPLICATION_JSON); + + MvcResult r = mockMvc.perform(rb).andReturn(); + String tr = r.getResponse().getContentAsString(); + + ObjectMapper mapper = new ObjectMapper(); + String er = mapper.writeValueAsString(userList); + + assertEquals("Rest API Returns List", er, tr); + } + + @Test + public void getUserByName() throws Exception { + String apiUrl = "/users/user/name/admin"; + + Mockito.when(userService.findByName("admin")).thenReturn(userList.get(0)); + + RequestBuilder rb = MockMvcRequestBuilders.get(apiUrl).accept(MediaType.APPLICATION_JSON); + + MvcResult r = mockMvc.perform(rb).andReturn(); + String tr = r.getResponse().getContentAsString(); + + ObjectMapper mapper = new ObjectMapper(); + String er = mapper.writeValueAsString(userList); + + assertEquals("Rest API Returns List", er, tr); + } + +// @Test +// public void getUserLikeName() { +// String apiUrl = "/users/user/name/admin"; +// +// Mockito.when(userService.findByName("admin")).thenReturn(userList.get(0)); +// +// RequestBuilder rb = MockMvcRequestBuilders.get(apiUrl).accept(MediaType.APPLICATION_JSON); +// +// MvcResult r = mockMvc.perform(rb).andReturn(); +// String tr = r.getResponse().getContentAsString(); +// +// ObjectMapper mapper = new ObjectMapper(); +// String er = mapper.writeValueAsString(userList); +// +// assertEquals("Rest API Returns List", er, tr); +// } + + @Test + public void addNewUser() throws Exception { + String apiUrl = "/users/user"; + + Mockito.when(userService.save(any(User.class))).thenReturn(userList.get(0)); + + RequestBuilder rb = MockMvcRequestBuilders.get(apiUrl) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .content("{\"username\": \"admin\", \"password\": \"password\", \"primaryemail\": \"admin@test.test\" }"); + + mockMvc.perform(rb) + .andExpect(status().isCreated()) + .andDo(MockMvcResultHandlers.print()); + } + +// @Test +// public void updateFullUser() { +// String apiUrl = "/users/user/name/admin"; +// +// Mockito.when(userService.findByName("admin")).thenReturn(userList.get(0)); +// +// RequestBuilder rb = MockMvcRequestBuilders.get(apiUrl).accept(MediaType.APPLICATION_JSON); +// +// MvcResult r = mockMvc.perform(rb).andReturn(); +// String tr = r.getResponse().getContentAsString(); +// +// ObjectMapper mapper = new ObjectMapper(); +// String er = mapper.writeValueAsString(userList); +// +// assertEquals("Rest API Returns List", er, tr); +// } + + @Test + public void updateUser() throws Exception { + String apiUrl = "/users/user/{userid}"; + + Mockito.when(userService.update(any(User.class), any(Long.class))) + .thenReturn(userList.get(0)); + + RequestBuilder rb = MockMvcRequestBuilders.put(apiUrl, 100L) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .content("{\"username\": \"adminupdated\", \"password\": \"password\", \"primaryemail\": \"admin@test.test\" }"); + + mockMvc.perform(rb) + .andExpect(status().is2xxSuccessful()) + .andDo(MockMvcResultHandlers.print()); + } + + @Test + public void deleteUserById() throws Exception { + String apiUrl = "/users/user/{userid}"; + + RequestBuilder rb = MockMvcRequestBuilders.delete(apiUrl, "3") + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON); + + mockMvc.perform(rb) + .andExpect(status().is2xxSuccessful()) + .andDo(MockMvcResultHandlers.print()); + } + + @Test + public void getCurrentUserInfo() throws Exception { + String apiUrl = "/users/getuserinfo"; + + Mockito.when(userService.findByName(anyString())).thenReturn(userList.get(0)); + + RequestBuilder rb = MockMvcRequestBuilders.get(apiUrl).accept(MediaType.APPLICATION_JSON); + + MvcResult r = mockMvc.perform(rb).andReturn(); + String tr = r.getResponse().getContentAsString(); + + ObjectMapper mapper = new ObjectMapper(); + String er = mapper.writeValueAsString(userList.get(0)); + + assertEquals("Rest API Returns List", er, tr); + } +} \ No newline at end of file diff --git a/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestWithDB.java b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestWithDB.java new file mode 100644 index 0000000..86eb50d --- /dev/null +++ b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestWithDB.java @@ -0,0 +1,128 @@ +package com.lambdaschool.usermodel.services; + +import com.lambdaschool.usermodel.UserModelApplicationTesting; +import com.lambdaschool.usermodel.exceptions.ResourceNotFoundException; +import com.lambdaschool.usermodel.models.Role; +import com.lambdaschool.usermodel.models.User; +import com.lambdaschool.usermodel.models.UserRoles; +import com.lambdaschool.usermodel.models.Useremail; +import org.junit.After; +import org.junit.Before; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.MethodSorters; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.Assert.*; +import static org.mockito.ArgumentMatchers.anyString; + + + + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = UserModelApplicationTesting.class) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class UserServiceImplTestWithDB { + + @Autowired + private UserService userService; + + @MockBean + HelperFunctions helperFunctions; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void findUserById() { + assertEquals("admin", userService.findUserById(4).getUsername()); + } + + @Test(expected = ResourceNotFoundException.class) + public void findUserByIdNotFound() { + assertEquals("admin", userService.findUserById(100).getUsername()); + } + + @Test + public void findByNameContaining() { + assertEquals(4, userService.findByNameContaining("a").size()); + } + + @Test + public void findAll() { + assertEquals(5, userService.findAll().size()); + } + + @Test + public void delete() { + userService.delete(13); + assertEquals(4, userService.findAll().size()); + } + @Test(expected = ResourceNotFoundException.class) + public void deleteNotFound() { + userService.delete(100); + assertEquals(4, userService.findAll().size()); + } + + @Test + public void findByName() { + assertEquals("admin", userService.findByName("admin").getUsername()); + } + + @Test(expected = ResourceNotFoundException.class) + public void findByNameNotFound() { + assertEquals("admin", userService.findByName("namenotindb").getUsername()); + } + + @Test + public void save() { + Role r2 = new Role("user"); + r2.setRoleid(2); + + User u2 = new User("test", "testpw", "test@email.com"); + u2.getRoles().add(new UserRoles(u2, r2)); + u2.getUseremails().add(new Useremail(u2, "test2@test2.com")); + + User saveU2 = userService.save(u2); + + assertEquals("test2@test2.com", saveU2.getUseremails().get(0).getUseremail()); + } + + @Test + public void update() { + Mockito.when(helperFunctions.isAuthorizedToMakeChange(anyString())).thenReturn(true); + + Role r2 = new Role("user"); + r2.setRoleid(2); + + User u2 = new User("testupdate", "testpw", "temail@temail.com"); + u2.getRoles().add(new UserRoles(u2, r2)); + + u2.getUseremails().add(new Useremail(u2, "temail2@temail2.com")); + u2.getUseremails().add(new Useremail(u2, "temail3@temail3.com")); + u2.getUseremails().add(new Useremail(u2, "temail4@temail4.com")); + + User updatedu2 = userService.update(u2, 7); + + int checking = updatedu2.getUseremails().size() - 1; + assertEquals("temail4@temail4.com", updatedu2.getUseremails().get(checking).getUseremail()); + } + + @Test + public void deleteAll() { + userService.deleteAll(); + assertEquals(0, userService.findAll().size()); + } +} \ No newline at end of file diff --git a/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplUnitTestNoDB.java b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplUnitTestNoDB.java new file mode 100644 index 0000000..e4a0bf4 --- /dev/null +++ b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplUnitTestNoDB.java @@ -0,0 +1,222 @@ +package com.lambdaschool.usermodel.services; + +import com.lambdaschool.usermodel.UserModelApplicationTesting; +import com.lambdaschool.usermodel.exceptions.ResourceNotFoundException; +import com.lambdaschool.usermodel.models.Role; +import com.lambdaschool.usermodel.models.User; +import com.lambdaschool.usermodel.models.UserRoles; +import com.lambdaschool.usermodel.models.Useremail; +import com.lambdaschool.usermodel.repository.RoleRepository; +import com.lambdaschool.usermodel.repository.UserRepository; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.junit.Assert.*; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = UserModelApplicationTesting.class, + properties = {"command.line.runner.enable=false"}) +public class UserServiceImplUnitTestNoDB { + + // Mocks -> fake data + // Stubs -> fake methods + // Java calls them both mocks usually + @Autowired + private UserService userService; + + @MockBean + private UserRepository userrepos; + + @MockBean + private RoleService roleService; + + @MockBean + private HelperFunctions helperFunctions; + + private List userList; + + @MockBean + private UserRepository userRepository; + + @MockBean + private RoleRepository roleRepository; + + @Before + public void setUp() throws Exception { + userList = new ArrayList<>(); + + Role r1 = new Role("admin"); + r1.setRoleid(1); + Role r2 = new Role("user"); + r2.setRoleid(1); + Role r3 = new Role("data"); + r3.setRoleid(1); + + User u1 = new User("admin", "testpw", "admin@lambdaschool.test"); + u1.getRoles().add(new UserRoles(u1, r1)); + u1.getRoles().add(new UserRoles(u1, r2)); + u1.getRoles().add(new UserRoles(u1, r3)); + u1.getUseremails().add(new Useremail(u1, "admin@mymail.test")); + u1.getUseremails().get(1).setUseremailid(11); + u1.setUserid(101); + userList.add(u1); + + ArrayList datas = new ArrayList<>(); + User u2 = new User("cinnamon", "testpw", "cinnamon@lambdaschool.test"); + u2.getRoles().add(new UserRoles(u2, r2)); + u2.getRoles().add(new UserRoles(u2, r3)); + u2.getUseremails().add(new Useremail(u2, "cinnamon@ymail.test")); + u2.getUseremails().get(0).setUseremailid(20); + u2.getUseremails().add(new Useremail(u2, "bunny@ymail.test")); + u2.getUseremails().get(1).setUseremailid(21); + u2.getUseremails().add(new Useremail(u2, "hops@ymail.test")); + u2.getUseremails().get(2).setUseremailid(22); + + u2.setUserid(102); + userList.add(u2); + + User u3 = new User("testingbarn", "testpw", "testingbarn@lambdaschool.test"); + u3.getRoles().add(new UserRoles(u3, r1)); + u3.getUseremails().add(new Useremail(u3, "barnbarn@email.test")); + u3.getUseremails().get(0).setUseremailid(30); + + u3.setUserid(103); + userList.add(u3); + + User u4 = new User("testingcat", "testpw", "testingcat@lambdaschool.test"); + u4.getRoles().add(new UserRoles(u4, r2)); + + u4.setUserid(104); + userList.add(u4); + + User u5 = new User("testingdog", "testpw", "testingdog@lambdaschool.test"); + u5.getRoles().add(new UserRoles(u5, r2)); + + u5.setUserid(105); + userList.add(u5); + + MockitoAnnotations.initMocks(this); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void findUserById() { + Mockito.when(userrepos.findById(101L)) + .thenReturn(Optional.of(userList.get(0))); + + assertEquals("admin", userService.findUserById(101L).getUsername()); + } + @Test(expected = ResourceNotFoundException.class) + public void findUserByIdNotFound() { + Mockito.when(userrepos.findById(101L)) + .thenReturn(Optional.empty()); + + assertEquals("admin", userService.findUserById(101L).getUsername()); + } + + @Test + public void findByNameContaining() { + Mockito.when(userrepos.findByUsernameContainingIgnoreCase("a")).thenReturn(userList); + + assertEquals(5, userService.findByNameContaining("a").size()); + } + + @Test + public void findAll() { + Mockito.when(userrepos.findAll()).thenReturn(userList); + + assertEquals(5, userService.findAll().size()); + } + + @Test + public void delete() { + Mockito.when(userrepos.findById(103L)).thenReturn(Optional.of(userList.get(0))); + + Mockito.doNothing().when(userrepos).deleteById(103L); + + userService.delete(103L); + assertEquals(5, userList.size()); + } + @Test(expected = ResourceNotFoundException.class) + public void deleteNotFound() { + Mockito.when(userrepos.findById(10L)).thenReturn(Optional.empty()); + + Mockito.doNothing().when(userrepos).deleteById(10L); + + userService.delete(10L); + assertEquals(5, userList.size()); + } + + @Test + public void findByName() { + Mockito.when(userrepos.findByUsername("admin")).thenReturn(userList.get(0)); + + assertEquals("admin", userService.findByName("admin").getUsername()); + } + @Test(expected = ResourceNotFoundException.class) + public void findByNameNotFound() { + Mockito.when(userrepos.findByUsername("gibberish")).thenReturn(null); + + assertEquals("gibberish", userService.findByName("gibberish").getUsername()); + } + + @Test + public void save() { + Role r2 = new Role("user"); + r2.setRoleid(2); + + User u2 = new User("user", "password", "user@user.test"); + u2.getRoles().add(new UserRoles(u2, r2)); + u2.getUseremails().add(new Useremail(u2, "user@ymail.test")); + + Mockito.when(userrepos.save(any(User.class))).thenReturn(u2); + Mockito.when(roleService.findRoleById(2)).thenReturn(r2); + + assertEquals("user", userService.save(u2).getUsername()); + } + + @Test + public void update() { + Role r2 = new Role("user"); + r2.setRoleid(2); + + User u2 = new User("user", "password", "user@user.test"); + u2.getRoles().add(new UserRoles(u2, r2)); + u2.getUseremails().add(new Useremail(u2, "user@ymail.test")); + u2.getUseremails().add(new Useremail(u2, "bunny@email.test")); + + Mockito.when(roleService.findRoleById(2)).thenReturn(r2); + + Mockito.when(userrepos.findById(103L)).thenReturn(Optional.of(userList.get(2))); + Mockito.when(userrepos.save(any(User.class))).thenReturn(u2); + + Mockito.when(helperFunctions.isAuthorizedToMakeChange(anyString())).thenReturn(true); + + assertEquals("bunny@email.test", userService.update(u2, 103L).getUseremails().get(1).getUseremail()); + + } + + @Test + public void deleteAll() { + Mockito.doNothing().when(userrepos).deleteAll(); + + userService.deleteAll(); + assertEquals(5, userList.size()); + } +} \ No newline at end of file diff --git a/usermodel-initial/src/test/resources/application.properties b/usermodel-initial/src/test/resources/application.properties new file mode 100644 index 0000000..92abaad --- /dev/null +++ b/usermodel-initial/src/test/resources/application.properties @@ -0,0 +1,34 @@ +# Configurations useful for working with H2 +spring.h2.console.enabled=true +spring.h2.console.path=/h2-console +# +# We set a port that is not frequently used +server.port=${PORT:2019} +# +# Feature that determines what happens when no accessors are found for a type +# (and there are no annotations to indicate it is meant to be serialized). +spring.jackson.serialization.fail-on-empty-beans=false +# +# keeps a transaction inside of the same entity manager +# This property register an EntityManager to the current thread, +# so you will have the same EntityManager until the web request is finished. +spring.jpa.open-in-view=true +# +# What do with the schema +# drop n create table again, good for testing +spring.jpa.hibernate.ddl-auto=create +spring.datasource.initialization-mode=never +# +# Good for production! +# spring.jpa.hibernate.ddl-auto=update +# since we have our data in SeedData, do not also load it from data.sql +# spring.datasource.initialization-mode=never +# +# Used to set the date format for JSON Output +spring.jackson.date-format=yyyy-MM-dd HH:mm:ss +spring.jackson.time-zone=America/Los_Angeles +# +# Turns off Spring Boot automatic exception handling +server.error.whitelabel.enabled=false +spring.mvc.throw-exception-if-no-handler-found=true +spring.resources.add-mappings=false