diff --git a/usermodel-initial/pom.xml b/usermodel-initial/pom.xml index eedeb7e..d53695d 100644 --- a/usermodel-initial/pom.xml +++ b/usermodel-initial/pom.xml @@ -76,6 +76,14 @@ 2.9.2 + + + + io.rest-assured + spring-mock-mvc + 3.3.0 + test + diff --git a/usermodel-initial/src/main/java/com/lambdaschool/usermodel/services/UserServiceImpl.java b/usermodel-initial/src/main/java/com/lambdaschool/usermodel/services/UserServiceImpl.java index 3b450cf..fa0c9a6 100755 --- a/usermodel-initial/src/main/java/com/lambdaschool/usermodel/services/UserServiceImpl.java +++ b/usermodel-initial/src/main/java/com/lambdaschool/usermodel/services/UserServiceImpl.java @@ -13,23 +13,14 @@ import java.util.ArrayList; import java.util.List; -/** - * Implements UserService Interface - */ @Transactional @Service(value = "userService") public class UserServiceImpl implements UserService { - /** - * Connects this service to the User table. - */ @Autowired private UserRepository userrepos; - /** - * Connects this service to the Role table - */ @Autowired private RoleService roleService; 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 100755 index 0000000..50d2caa --- /dev/null +++ b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/SeedData.java @@ -0,0 +1,167 @@ +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.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 +@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("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("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("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("puttat", + "password", + "puttat@school.lambda"); + u4.getRoles() + .add(new UserRoles(u4, + r2)); + userService.save(u4); + + User u5 = new User("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/UserControllerIntegrationTest.java b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/controllers/UserControllerIntegrationTest.java new file mode 100644 index 0000000..f74f261 --- /dev/null +++ b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/controllers/UserControllerIntegrationTest.java @@ -0,0 +1,189 @@ +package com.lambdaschool.usermodel.controllers; + +import com.lambdaschool.usermodel.UserModelApplication; +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.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) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, + classes = UserModelApplication.class) +@AutoConfigureMockMvc +public class UserControllerIntegrationTest +{ + @Autowired + private WebApplicationContext webApplicationContext; + + private MockMvc mockMvc; + + + @Before + public void setUp() throws Exception + { + RestAssuredMockMvc.webAppContextSetup(webApplicationContext); + + mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext) + .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("timestamp", + (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}", + 100)) + .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}", + "rabbit")) + .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}", + 100)) + .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()); + } +} diff --git a/usermodel-initial/src/test/java/com/lambdaschool/usermodel/controllers/UserControllerUnitNoDBTest.java b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/controllers/UserControllerUnitNoDBTest.java new file mode 100644 index 0000000..ab9a118 --- /dev/null +++ b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/controllers/UserControllerUnitNoDBTest.java @@ -0,0 +1,398 @@ +package com.lambdaschool.usermodel.controllers; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.lambdaschool.usermodel.UserModelApplication; +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.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.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +/************************************************************************************************** + ********************* REMEMBER TO TURN OFF SEEDDATA (both in test and main) ********************* + **************************************************************************************************/ + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, + classes = UserModelApplication.class) +@AutoConfigureMockMvc +public class UserControllerUnitNoDBTest +{ + @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); + + // admin, data, user + User u1 = new User("admin", + "ILuvM4th!", + "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@email.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); + + // data, user + ArrayList datas = new ArrayList<>(); + User u2 = new User("cinnamon", + "1234567", + "cinnamon@lambdaschool.test"); + u1.getRoles() + .add(new UserRoles(u2, + r2)); + u1.getRoles() + .add(new UserRoles(u2, + r3)); + + u2.getUseremails() + .add(new Useremail(u2, + "cinnamon@mymail.test")); + u2.getUseremails() + .get(0) + .setUseremailid(20); + + u2.getUseremails() + .add(new Useremail(u2, + "hops@mymail.test")); + u2.getUseremails() + .get(1) + .setUseremailid(21); + + u2.getUseremails() + .add(new Useremail(u2, + "bunny@email.test")); + u2.getUseremails() + .get(2) + .setUseremailid(22); + + u2.setUserid(102); + userList.add(u2); + + // user + User u3 = new User("testingbarn", + "ILuvM4th!", + "testingbarn@school.lambda"); + 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", + "password", + "testingcat@school.lambda"); + u4.getRoles() + .add(new UserRoles(u4, + r2)); + + u4.setUserid(104); + userList.add(u4); + + User u5 = new User("testingdog", + "password", + "testingdog@school.lambda"); + u4.getRoles() + .add(new UserRoles(u5, + r2)); + + u5.setUserid(105); + userList.add(u5); + + RestAssuredMockMvc.webAppContextSetup(webApplicationContext); + + mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext) + .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); + + // the following actually performs a real controller call + MvcResult r = mockMvc.perform(rb) + .andReturn(); // this could throw an exception + String tr = r.getResponse() + .getContentAsString(); + + ObjectMapper mapper = new ObjectMapper(); + String er = mapper.writeValueAsString(userList); + + System.out.println("Expect: " + er); + System.out.println("Actual: " + tr); + + assertEquals("Rest API Returns List", + er, + tr); + } + + @Test + public void listUsersNameContaining() throws + Exception + { + String apiUrl = "/users/user/name/like/cin"; + + Mockito.when(userService.findByNameContaining(any(String.class))) + .thenReturn(userList); + + RequestBuilder rb = MockMvcRequestBuilders.get(apiUrl) + .accept(MediaType.APPLICATION_JSON); + + // the following actually performs a real controller call + MvcResult r = mockMvc.perform(rb) + .andReturn(); // this could throw an exception + String tr = r.getResponse() + .getContentAsString(); + + ObjectMapper mapper = new ObjectMapper(); + String er = mapper.writeValueAsString(userList); + + System.out.println("Expect: " + er); + System.out.println("Actual: " + tr); + + 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(); // this could throw an exception + String tr = r.getResponse() + .getContentAsString(); + + ObjectMapper mapper = new ObjectMapper(); + String er = mapper.writeValueAsString(userList.get(1)); + + System.out.println("Expect: " + er); + System.out.println("Actual: " + tr); + + assertEquals("Rest API Returns List", + er, + tr); + } + + @Test + public void getUserByIdNotFound() throws + Exception + { + String apiUrl = "/users/user/77"; + + Mockito.when(userService.findUserById(77)) + .thenReturn(null); + + RequestBuilder rb = MockMvcRequestBuilders.get(apiUrl) + .accept(MediaType.APPLICATION_JSON); + MvcResult r = mockMvc.perform(rb) + .andReturn(); // this could throw an exception + String tr = r.getResponse() + .getContentAsString(); + + String er = ""; + + System.out.println("Expect: " + er); + System.out.println("Actual: " + tr); + + assertEquals("Rest API Returns List", + er, + tr); + } + + @Test + public void getUserByName() throws + Exception + { + String apiUrl = "/users/user/name/testing"; + + Mockito.when(userService.findByName("testing")) + .thenReturn(userList.get(0)); + + RequestBuilder rb = MockMvcRequestBuilders.get(apiUrl) + .accept(MediaType.APPLICATION_JSON); + MvcResult r = mockMvc.perform(rb) + .andReturn(); // this could throw an exception + String tr = r.getResponse() + .getContentAsString(); + + ObjectMapper mapper = new ObjectMapper(); + String er = mapper.writeValueAsString(userList.get(0)); + + System.out.println("Expect: " + er); + System.out.println("Actual: " + tr); + + 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.post(apiUrl) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .content("{\"username\": \"tiger\", \"password\": \"ILuvM4th!\", \"primaryemail\" : \"tiger@home.local\"}"); + + mockMvc.perform(rb) + .andExpect(status().isCreated()) + .andDo(MockMvcResultHandlers.print()); + } + + @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\": \"tigerUpdated\", \"password\": \"EATEATEAT\", \"primaryemail\" : \"ginger@home.local\"}"); + + mockMvc.perform(rb) + .andExpect(status().is2xxSuccessful()) + .andDo(MockMvcResultHandlers.print()); + } + + @Test + public void updateUserPatch() throws + Exception + { + String apiUrl = "/users/user/{userid}"; + + Mockito.when(userService.update(any(User.class), + any(Long.class))) + .thenReturn(userList.get(0)); + + RequestBuilder rb = MockMvcRequestBuilders.patch(apiUrl, + 100L) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .content("{\"username\": \"tigerUpdated\", \"password\": \"EATEATEAT\", \"primaryemail\" : \"ginger@home.local\"}"); + + 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()); + } +} \ No newline at end of file diff --git a/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestNoDB.java b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestNoDB.java new file mode 100644 index 0000000..8c53969 --- /dev/null +++ b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestNoDB.java @@ -0,0 +1,412 @@ +package com.lambdaschool.usermodel.services; + +import com.lambdaschool.usermodel.UserModelApplication; +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.UserRepository; +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 junit.framework.TestCase.assertEquals; +import static org.mockito.ArgumentMatchers.any; + +/************************************************************************************************** + ********************* REMEMBER TO TURN OFF SEEDDATA (both in test and main) ********************* + **************************************************************************************************/ + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = UserModelApplication.class) +public class UserServiceImplNoDBTest +{ + @Autowired + private UserService userService; + + @MockBean + private UserRepository userrepos; + + @MockBean + private RoleService roleService; + + 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); + + // admin, data, user + User u1 = new User("admin", + "ILuvM4th!", + "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@email.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); + + // data, user + ArrayList datas = new ArrayList<>(); + User u2 = new User("cinnamon", + "1234567", + "cinnamon@lambdaschool.test"); + u1.getRoles() + .add(new UserRoles(u2, + r2)); + u1.getRoles() + .add(new UserRoles(u2, + r3)); + + u2.getUseremails() + .add(new Useremail(u2, + "cinnamon@mymail.test")); + u2.getUseremails() + .get(0) + .setUseremailid(20); + + u2.getUseremails() + .add(new Useremail(u2, + "hops@mymail.test")); + u2.getUseremails() + .get(1) + .setUseremailid(21); + + u2.getUseremails() + .add(new Useremail(u2, + "bunny@email.test")); + u2.getUseremails() + .get(2) + .setUseremailid(22); + + u2.setUserid(102); + userList.add(u2); + + // user + User u3 = new User("testingbarn", + "ILuvM4th!", + "testingbarn@school.lambda"); + 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", + "password", + "testingcat@school.lambda"); + u4.getRoles() + .add(new UserRoles(u4, + r2)); + + u4.setUserid(104); + userList.add(u4); + + User u5 = new User("testingdog", + "password", + "testingdog@school.lambda"); + u4.getRoles() + .add(new UserRoles(u5, + r2)); + + u5.setUserid(105); + userList.add(u5); + + MockitoAnnotations.initMocks(this); + } + + @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(10L)) + .thenReturn(Optional.empty()); + + assertEquals("admin", + userService.findUserById(10L) + .getUsername()); + } + + @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 notFoundDelete() + { + Mockito.when(userrepos.findById(10L)) + .thenReturn(Optional.empty()); + + Mockito.doNothing() + .when(userrepos) + .deleteById(10L); + + userService.delete(10L); + assertEquals(5, + userList.size()); + } + + @Test + public void findByUsername() + { + Mockito.when(userrepos.findByUsername("admin")) + .thenReturn(userList.get(0)); + + assertEquals("admin", + userService.findByName("admin") + .getUsername()); + } + + @Test(expected = ResourceNotFoundException.class) + public void findByUsernameNotfound() + { + Mockito.when(userrepos.findByUsername("nonsense")) + .thenReturn(null); + + assertEquals("nonsense", + userService.findByName("nonsense") + .getUsername()); + } + + @Test + public void findByNameContaining() + { + Mockito.when(userrepos.findByUsernameContainingIgnoreCase("a")) + .thenReturn(userList); + + assertEquals(5, + userService.findByNameContaining("a") + .size()); + } + + @Test + public void save() + { + Role r2 = new Role("user"); + r2.setRoleid(2); + + User u2 = new User("tiger", + "ILuvMath!", + "tiger@school.lambda"); + u2.getRoles() + .add(new UserRoles(u2, + r2)); + u2.getUseremails() + .add(new Useremail(u2, + "tiger@tiger.local")); + + Mockito.when(userrepos.save(any(User.class))) + .thenReturn(u2); + + Mockito.when(roleService.findRoleById(2)) + .thenReturn(r2); + + assertEquals("tiger", + userService.save(u2) + .getUsername()); + } + + @Test + public void savePut() + { + Role r2 = new Role("user"); + r2.setRoleid(2); + + User u2 = new User("tiger", + "ILuvMath!", + "tiger@school.lambda"); + u2.getRoles() + .add(new UserRoles(u2, + r2)); + u2.getUseremails() + .add(new Useremail(u2, + "tiger@tiger.local")); + u2.setUserid(103L); + + Mockito.when(roleService.findRoleById(2)) + .thenReturn(r2); + + Mockito.when(userrepos.findById(103L)) + .thenReturn(Optional.of(u2)); + + Mockito.when(userrepos.save(any(User.class))) + .thenReturn(u2); + + assertEquals(103L, + userService.save(u2) + .getUserid()); + } + + @Test + public void update() + { + Role r2 = new Role("user"); + r2.setRoleid(2); + + User u2 = new User("cinnamon", + "password", + "cinnamon@school.lambda"); + u2.getRoles() + .add(new UserRoles(u2, + r2)); + + u2.getUseremails() + .add(new Useremail(u2, + "cinnamon@mymail.thump")); + u2.getUseremails() + .add(new Useremail(u2, + "hops@mymail.thump")); + u2.getUseremails() + .add(new Useremail(u2, + "bunny@email.thump")); + + 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); + + assertEquals("bunny@email.thump", + userService.update(u2, + 103L) + .getUseremails() + .get(2) + .getUseremail()); + } + + @Test(expected = ResourceNotFoundException.class) + public void updateNotFound() + { + Role r2 = new Role("user"); + r2.setRoleid(2); + + User u2 = new User("cinnamon", + "password", + "cinnamon@school.lambda"); + u2.getRoles() + .add(new UserRoles(u2, + r2)); + + u2.getUseremails() + .add(new Useremail(u2, + "cinnamon@mymail.thump")); + u2.getUseremails() + .add(new Useremail(u2, + "hops@mymail.thump")); + u2.getUseremails() + .add(new Useremail(u2, + "bunny@email.thump")); + + Mockito.when(roleService.findRoleById(2)) + .thenReturn(r2); + + Mockito.when(userrepos.findById(103L)) + .thenReturn(Optional.empty()); + + Mockito.when(userrepos.save(any(User.class))) + .thenReturn(u2); + + assertEquals("bunny@email.thump", + userService.update(u2, + 103L) + .getUseremails() + .get(2) + .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/java/com/lambdaschool/usermodel/services/UserServiceImplWithDBTest.java b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplWithDBTest.java new file mode 100644 index 0000000..46032fe --- /dev/null +++ b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplWithDBTest.java @@ -0,0 +1,267 @@ +package com.lambdaschool.usermodel.services; + +import com.lambdaschool.usermodel.UserModelApplication; +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.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import static junit.framework.TestCase.assertEquals; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = UserModelApplication.class) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class UserServiceImplWithDBTest +{ + @Autowired + private UserService userService; + + @Before + public void setUp() throws Exception + { + MockitoAnnotations.initMocks(this); + } + + @After + public void tearDown() throws Exception + { + } + + @Test + public void B_findUserById() + { + assertEquals("admin", + userService.findUserById(4) + .getUsername()); + } + + @Test(expected = ResourceNotFoundException.class) + public void BA_findUserByIdNotFound() + { + assertEquals("admin", + userService.findUserById(10) + .getUsername()); + } + + @Test + public void C_findAll() + { + assertEquals(5, + userService.findAll() + .size()); + } + + @Test + public void D_delete() + { + userService.delete(13); + assertEquals(4, + userService.findAll() + .size()); + } + + @Test(expected = ResourceNotFoundException.class) + public void DA_notFoundDelete() + { + userService.delete(100); + assertEquals(4, + userService.findAll() + .size()); + } + + @Test + public void E_findByUsername() + { + assertEquals("admin", + userService.findByName("admin") + .getUsername()); + } + + @Test(expected = ResourceNotFoundException.class) + public void AA_findByUsernameNotfound() + { + assertEquals("admin", + userService.findByName("turtle") + .getUsername()); + } + + @Test + public void AB_findByNameContaining() + { + assertEquals(4, + userService.findByNameContaining("a") + .size()); + } + + @Test + public void F_save() + { + Role r2 = new Role("user"); + r2.setRoleid(2); + + User u2 = new User("tiger", + "ILuvMath!", + "tiger@school.lambda"); + u2.getRoles() + .add(new UserRoles(u2, + r2)); + u2.getUseremails() + .add(new Useremail(u2, + "tiger@tiger.local")); + + User saveU2 = userService.save(u2); + + System.out.println("*** DATA ***"); + System.out.println(saveU2); + System.out.println("*** DATA ***"); + + assertEquals("tiger@tiger.local", + saveU2.getUseremails() + .get(0) + .getUseremail()); + } + + @Test(expected = ResourceNotFoundException.class) + public void FA_saveputnotfound() + { + Role r2 = new Role("user"); + r2.setRoleid(2); + + User u2 = new User("tiger", + "ILuvMath!", + "tiger@school.lambda"); + u2.getRoles() + .add(new UserRoles(u2, + r2)); + u2.getUseremails() + .add(new Useremail(u2, + "tiger@tiger.local")); + u2.setUserid(777); + + User saveU2 = userService.save(u2); + + System.out.println("*** DATA ***"); + System.out.println(saveU2); + System.out.println("*** DATA ***"); + + assertEquals("tiger@tiger.local", + saveU2.getUseremails() + .get(0) + .getUseremail()); + } + + @Test + public void FA_saveputfound() + { + Role r2 = new Role("user"); + r2.setRoleid(2); + + User u2 = new User("mojo", + "ILuvMath!", + "mojo@school.lambda"); + u2.getRoles() + .add(new UserRoles(u2, + r2)); + u2.getUseremails() + .add(new Useremail(u2, + "mojo@corgi.local")); + u2.setUserid(4); + + User saveU2 = userService.save(u2); + + System.out.println("*** DATA ***"); + System.out.println(saveU2); + System.out.println("*** DATA ***"); + + assertEquals("mojo@corgi.local", + saveU2.getUseremails() + .get(0) + .getUseremail()); + } + + @Test + public void G_update() + { + Role r2 = new Role("user"); + r2.setRoleid(2); + + User u2 = new User("cinnamon", + "password", + "cinnamon@school.lambda"); + u2.getRoles() + .add(new UserRoles(u2, + r2)); + + u2.getUseremails() + .add(new Useremail(u2, + "cinnamon@mymail.thump")); + u2.getUseremails() + .add(new Useremail(u2, + "hops@mymail.thump")); + u2.getUseremails() + .add(new Useremail(u2, + "bunny@email.thump")); + + User updatedu2 = userService.update(u2, + 7); + + System.out.println("*** DATA ***"); + System.out.println(updatedu2); + System.out.println("*** DATA ***"); + + int checking = updatedu2.getUseremails() + .size() - 1; + assertEquals("bunny@email.thump", + updatedu2.getUseremails() + .get(checking) + .getUseremail()); + } + + @Test(expected = ResourceNotFoundException.class) + public void GB_updateNotCurrentUserNorAdmin() + { + Role r2 = new Role("user"); + r2.setRoleid(2); + + User u2 = new User("cinnamon", + "password", + "cinnamon@school.lambda"); + u2.getRoles() + .add(new UserRoles(u2, + r2)); + u2.getUseremails() + .add(new Useremail(u2, + "cinnamon@mymail.thump")); + u2.getUseremails() + .add(new Useremail(u2, + "hops@mymail.thump")); + u2.getUseremails() + .add(new Useremail(u2, + "bunny@email.thump")); + + User updatedu2 = userService.update(u2, + 8); + + System.out.println("*** DATA ***"); + System.out.println(updatedu2); + System.out.println("*** DATA ***"); + + int checking = updatedu2.getUseremails() + .size() - 1; + assertEquals("bunny@email.thump", + updatedu2.getUseremails() + .get(checking) + .getUseremail()); + } +} \ No newline at end of file