From 2fd236337478e80c124566342187a903b746ee4e Mon Sep 17 00:00:00 2001 From: Tarah Date: Thu, 22 Apr 2021 00:59:16 -0400 Subject: [PATCH 1/4] UserImplUnitTest --- usermodel-initial/pom.xml | 10 +- .../com/lambdaschool/usermodel/SeedData.java | 6 + .../services/HelperFunctionsImpl.java | 7 +- .../services/SecurityUserServiceImpl.java | 3 +- .../com/lambdaschool/usermodel/SeedData.java | 170 +++++++ .../UserServiceImplTestUnitTestNoDB.java | 463 ++++++++++++++++++ .../src/test/resources/application.properties | 34 ++ .../src/test/resources/info/curl.txt | 69 +++ 8 files changed, 757 insertions(+), 5 deletions(-) create mode 100644 usermodel-initial/src/test/java/com/lambdaschool/usermodel/SeedData.java create mode 100644 usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestUnitTestNoDB.java create mode 100644 usermodel-initial/src/test/resources/application.properties create mode 100644 usermodel-initial/src/test/resources/info/curl.txt diff --git a/usermodel-initial/pom.xml b/usermodel-initial/pom.xml index 4a5df7a..38c921d 100644 --- a/usermodel-initial/pom.xml +++ b/usermodel-initial/pom.xml @@ -15,7 +15,7 @@ Demo project for Spring Boot - 11 + 14 @@ -77,6 +77,14 @@ + + + io.rest-assured + spring-mock-mvc + 3.3.0 + test + + org.springframework.boot 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..acbdeb5 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,11 @@ * 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/services/HelperFunctionsImpl.java b/usermodel-initial/src/main/java/com/lambdaschool/usermodel/services/HelperFunctionsImpl.java index 76211bf..fb2d250 100644 --- a/usermodel-initial/src/main/java/com/lambdaschool/usermodel/services/HelperFunctionsImpl.java +++ b/usermodel-initial/src/main/java/com/lambdaschool/usermodel/services/HelperFunctionsImpl.java @@ -27,7 +27,8 @@ public List getConstraintViolation(Throwable cause) // data validations get wrapped in other exceptions as we work through the Spring // exception chain. Hence we have to search the entire Spring Exception Stack // to see if we have any violation constraints. - while ((cause != null) && !(cause instanceof org.hibernate.exception.ConstraintViolationException || cause instanceof MethodArgumentNotValidException)) + while ((cause != null) && !(cause instanceof ConstraintViolationException || + cause instanceof MethodArgumentNotValidException)) { System.out.println(cause.getClass() .toString()); @@ -39,9 +40,9 @@ public List getConstraintViolation(Throwable cause) // we know that cause either null or an instance of ConstraintViolationException if (cause != null) { - if (cause instanceof org.hibernate.exception.ConstraintViolationException) + if (cause instanceof ConstraintViolationException) { - org.hibernate.exception.ConstraintViolationException ex = (ConstraintViolationException) cause; + ConstraintViolationException ex = (ConstraintViolationException) cause; ValidationError newVe = new ValidationError(); newVe.setCode(ex.getMessage()); newVe.setMessage(ex.getConstraintName()); diff --git a/usermodel-initial/src/main/java/com/lambdaschool/usermodel/services/SecurityUserServiceImpl.java b/usermodel-initial/src/main/java/com/lambdaschool/usermodel/services/SecurityUserServiceImpl.java index 45b9b56..daa6988 100644 --- a/usermodel-initial/src/main/java/com/lambdaschool/usermodel/services/SecurityUserServiceImpl.java +++ b/usermodel-initial/src/main/java/com/lambdaschool/usermodel/services/SecurityUserServiceImpl.java @@ -43,7 +43,8 @@ public UserDetails loadUserByUsername(String s) { throw new ResourceNotFoundException("Invalid username or password."); } - return new org.springframework.security.core.userdetails.User(user.getUsername(), + return new org.springframework.security.core.userdetails.User( + user.getUsername(), user.getPassword(), user.getAuthority()); } 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..d991be1 --- /dev/null +++ b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/SeedData.java @@ -0,0 +1,170 @@ +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.*; +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("testadmin"); + Role r2 = new Role("testuser"); + Role r3 = new Role("testdata"); + + r1 = roleService.save(r1); + r2 = roleService.save(r2); + r3 = roleService.save(r3); + + // admin, data, user + User u1 = new User("testadmin", + "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("testcinnamon", + "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("testbarnbarn", + "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("testputtat", + "password", + "puttat@school.lambda"); + u4.getRoles() + .add(new UserRoles(u4, + r2)); + userService.save(u4); + + User u5 = new User("testmisskitty", + "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/services/UserServiceImplTestUnitTestNoDB.java b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestUnitTestNoDB.java new file mode 100644 index 0000000..393be6e --- /dev/null +++ b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestUnitTestNoDB.java @@ -0,0 +1,463 @@ +package com.lambdaschool.usermodel.services; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.lambdaschool.usermodel.UserModelApplicationTesting; +import com.lambdaschool.usermodel.exceptions.ResourceNotFoundException; +import com.lambdaschool.usermodel.models.*; +import com.lambdaschool.usermodel.repository.RoleRepository; +import com.lambdaschool.usermodel.repository.UserRepository; +import org.junit.*; +import org.junit.runner.RunWith; +import org.junit.runners.MethodSorters; +import org.mockito.*; +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.*; + +import static junit.framework.TestCase.assertEquals; +import static org.junit.Assert.*; +import static org.mockito.ArgumentMatchers.any; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = UserModelApplicationTesting.class, + properties = { + "command.line.runner.enabled=false"}) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class UserServiceImplTestUnitTestNoDB { + + @Autowired + private UserService userService; + + // mocks -> fake data + // stubs -> fake methods + // Java -> mocks + + @MockBean + private UserRepository userrepos; + + @MockBean + private RoleRepository rolerepos; + + private List userList; + + @Before + public void setUp() throws Exception { + userList = new ArrayList<>(); + + Role r1 = new Role("testadmin"); + Role r2 = new Role("testuser"); + Role r3 = new Role("testdata"); + + r1.setRoleid(1); + r2.setRoleid(2); + r3.setRoleid(3); + + // admin, data, user + User u1 = new User("testadmin", + "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")); + + userList.add(u1); + + // data, user + User u2 = new User("testcinnamon", + "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")); + userList.add(u2); + + // user + User u3 = new User("testbarnbarn", + "ILuvM4th!", + "barnbarn@lambdaschool.local"); + u3.getRoles() + .add(new UserRoles(u3, + r2)); + u3.getUseremails() + .add(new Useremail(u3, + "barnbarn@email.local")); + userList.add(u3); + + User u4 = new User("testputtat", + "password", + "puttat@school.lambda"); + u4.getRoles() + .add(new UserRoles(u4, + r2)); + userList.add(u4); + + User u5 = new User("testmisskitty", + "password", + "misskitty@school.lambda"); + u5.getRoles() + .add(new UserRoles(u5, + r2)); + userList.add(u5); + + MockitoAnnotations.initMocks(this); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test_findUserById() { + Mockito.when(userrepos.findById(1L)) + .thenReturn(Optional.of(userList.get(0))); + + assertEquals("testadmin", userService.findUserById(1).getUsername()); + } + @Test(expected = ResourceNotFoundException.class) + public void test_findUserByIdNotFound() + { + Mockito.when(userrepos.findById(10000L)) + .thenThrow(ResourceNotFoundException.class); + + assertEquals("testadmin", + userService.findUserById(10000) + .getUsername()); + } + + @Test + public void test_findByNameContaining() { + Mockito.when(userrepos.findByUsernameContainingIgnoreCase("testbarnbarn")) + .thenReturn(userList); + + assertEquals(5, userService.findByNameContaining("testbarnbarn") + .size()); + } + + @Test(expected = ResourceNotFoundException.class) + public void test_findUserByNameFailed() + { + Mockito.when(userrepos.findByUsername("Lambda")) + .thenThrow(ResourceNotFoundException.class); + + assertEquals("Lambda", + userService.findByName("testmisskitty") + .getUsername()); + } + + @Test + public void test_findAll() { + Mockito.when(userrepos.findAll()).thenReturn(userList); + + System.out.println(userService.findAll()); + assertEquals(5, userService.findAll().size()); + } + + @Test + public void test_delete() { + Mockito.when(userrepos.findById(6L)).thenReturn( + Optional.of(userList.get(0))); + + Mockito.doNothing() + .when(userrepos) + .deleteById(6L); + + userService.delete(6); + assertEquals(5, userList.size()); + } + + @Test(expected = ResourceNotFoundException.class) + public void test_deletefailed() + { + Mockito.when(userrepos.findById(777L)) + .thenReturn(Optional.empty()); + + Mockito.doNothing() + .when(userrepos) + .deleteById(777L); + + userService.delete(777L); + assertEquals(5, + userList.size()); + } + + @Test + public void test_findByName() { + Mockito.when(userrepos.findByUsername("testcinnamon")) + .thenReturn(userList.get(1)); + + assertEquals("testcinnamon", userService.findByName( + "testCinnaMon").getUsername()); + } + + @Test + public void test_save() { + User newUser = new User( + "testtarah", + "password", + "tarah.agbokhana@gmail.com"); + + Role newRole = new Role("DATA-MGR"); + newRole.setRoleid(1); + + newUser.getRoles() + .add(new UserRoles(newUser, newRole)); + newUser.getUseremails() + .add(new Useremail(newUser, "tagbokhana@gmail.com")); + + Mockito.when(userrepos.save(any(User.class))) + .thenReturn(newUser); + + Mockito.when(rolerepos.findById(1L)) + .thenReturn(Optional.of(newRole)); + + User addUser = userService.save(newUser); + assertNotNull(addUser); + assertEquals("testtarah",addUser.getUsername()); + } + + @Test(expected = ResourceNotFoundException.class) + public void test_saveRoleNotFound() { + User newUser = new User( + "testtarah", + "password", + "tarah.agbokhana@gmail.com"); + + Role newRole = new Role("DATA-MGR"); + newRole.setRoleid(1); + + newUser.getRoles() + .add(new UserRoles(newUser, newRole)); + newUser.getUseremails() + .add(new Useremail(newUser, "tagbokhana@gmail.com")); + + Mockito.when(userrepos.save(any(User.class))) + .thenReturn(newUser); + + Mockito.when(rolerepos.findById(1L)) + .thenReturn(Optional.empty());//return no role + + User addUser = userService.save(newUser); + assertNotNull(addUser); + assertEquals("testtarah",addUser.getUsername()); + } + + @Test + public void test_save_put(){ + User newUser = new User( + "testtarah", + "password", + "tarah.agbokhana@gmail.com"); + + newUser.setUserid(7); + + Role newRole1 = new Role("Unknown1"); + newRole1.setRoleid(1); + + Role newRole2 = new Role("Unknown2"); + newRole2.setRoleid(2); + + newUser.getRoles() + .clear(); + + newUser.getRoles() + .add(new UserRoles(newUser, newRole1)); + newUser.getRoles() + .add(new UserRoles(newUser, newRole2)); + + newUser.getUseremails() + .add(new Useremail(newUser, "tagbokhana@gmail.com")); + + Mockito.when(userrepos.findById(7L)) + .thenReturn(Optional.of(newUser)); + + Mockito.when(rolerepos.findById(1L)) + .thenReturn(Optional.of(newRole1)); + + Mockito.when(rolerepos.findById(2L)) + .thenReturn(Optional.of(newRole2)); + + Mockito.when(userrepos.save(any(User.class))) + .thenReturn(newUser); + + assertEquals(7L, + userService.save(newUser).getUserid()); + } + + @Test(expected = ResourceNotFoundException.class) + public void test_save_put_failed() { + User newUser = new User( + "testtarah", + "password", + "tarah.agbokhana@gmail.com"); + + newUser.setUserid(7); + + Role newRole1 = new Role("Unknown1"); + newRole1.setRoleid(1); + + Role newRole2 = new Role("Unknown2"); + newRole2.setRoleid(2); + + newUser.getRoles() + .clear(); + + newUser.getRoles() + .add(new UserRoles(newUser, newRole1)); + newUser.getRoles() + .add(new UserRoles(newUser, newRole2)); + + newUser.getUseremails() + .add(new Useremail(newUser, "tagbokhana@gmail.com")); + + Mockito.when(userrepos.findById(77L)) + .thenThrow(ResourceNotFoundException.class); + + Mockito.when(userrepos.save(any(User.class))) + .thenReturn(newUser); + + Mockito.when(rolerepos.findById(1L)) + .thenReturn(Optional.of(newRole1)); + + Mockito.when(rolerepos.findById(2L)) + .thenReturn(Optional.of(newRole2)); + + assertEquals(77L, + userService.save(newUser).getUserid()); + } + + @Test + public void test_update() throws Exception { + User newUser = new User( + "testtarah", + "password", + "tarah.agbokhana@gmail.com"); + + newUser.setUserid(18); + + Role newRole1 = new Role("Unknown1"); + newRole1.setRoleid(1); + + Role newRole2 = new Role("Unknown2"); + newRole2.setRoleid(2); + + newUser.getRoles() + .add(new UserRoles(newUser, newRole1)); + newUser.getRoles() + .add(new UserRoles(newUser, newRole2)); + + newUser.getUseremails() + .add(new Useremail(newUser, "tagbokhana@gmail.com")); + System.out.println(newUser.getUsername()); + + + // I need a copy of "newUser" to send to update so the original "newUser" + // is not changed. I am using Jackson to make a clone of the object + ObjectMapper objectMapper = new ObjectMapper(); + + User clonedUser = objectMapper + .readValue(objectMapper.writeValueAsString(newUser), User.class); + + Mockito.when(userrepos.findById(18L)) + .thenReturn(Optional.of(clonedUser)); + + System.out.println(clonedUser.getUsername()); + + Mockito.when(rolerepos.findById(1L)) + .thenReturn(Optional.of(newRole1)); + + Mockito.when(rolerepos.findById(2L)) + .thenReturn(Optional.of(newRole2)); + + Mockito.when(userrepos.save(any(User.class))) + .thenReturn(newUser); + + User addUser = userService.update(newUser, 18); + + assertNotNull(addUser); + assertEquals("testtarah", + addUser.getUsername()); + } + + @Test + public void test_update_failed() throws Exception { + User newUser = new User( + "testtarah", + "password", + "tarah.agbokhana@gmail.com"); + + newUser.setUserid(18); + + Role newRole1 = new Role("Unknown1"); + newRole1.setRoleid(1); + + Role newRole2 = new Role("Unknown2"); + newRole2.setRoleid(2); + + newUser.getRoles() + .clear(); + + newUser.getRoles() + .add(new UserRoles(newUser, newRole1)); + newUser.getRoles() + .add(new UserRoles(newUser, newRole2)); + + newUser.getUseremails() + .add(new Useremail(newUser, "tagbokhana@gmail.com")); + + // I need a copy of "newUser" to send to update so the original "newUser" + // is not changed. I am using Jackson to make a clone of the object + ObjectMapper objectMapper = new ObjectMapper(); + User clonedUser = objectMapper + .readValue(objectMapper.writeValueAsString(newUser), User.class); + + Mockito.when(userrepos.findById(18L)) + .thenReturn(Optional.of(clonedUser)); + + Mockito.when(rolerepos.findById(1L)) + .thenReturn(Optional.of(newRole1)); + + Mockito.when(rolerepos.findById(2L)) + .thenReturn(Optional.of(newRole2)); + + Mockito.when(userrepos.save(any(User.class))) + .thenReturn(newUser); + + User addUser = userService.update(newUser, 18); + + assertNotNull(addUser); + assertEquals("testtarah", + addUser.getUsername()); + } + + @Test + public void test_deleteAll() { + } +} \ 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 diff --git a/usermodel-initial/src/test/resources/info/curl.txt b/usermodel-initial/src/test/resources/info/curl.txt new file mode 100644 index 0000000..8e6a532 --- /dev/null +++ b/usermodel-initial/src/test/resources/info/curl.txt @@ -0,0 +1,69 @@ +// admins access token = 56ab5075-de2e-43ba-a407-e52b8f267ac7 +// barnbarns access token = a87cdc74-7188-43d7-9c2e-f689841f083f + +// get admins access code +curl -X POST --user "lambda-client:lambda-secret" -d "grant_type=password&username=admin&password=password" http://localhost:2019/login + +// this works +curl -X GET -H "Accept: application/json" -H "Authorization: Bearer 56ab5075-de2e-43ba-a407-e52b8f267ac7" http://localhost:2019/users/users + +// get users access code +curl -X POST --user "lambda-client:lambda-secret" -d 'grant_type=password&username=barnbarn&password=ILuvM4th!' http://localhost:2019/login + +// this has an authentication error +curl -X GET -H "Accept: application/json" -H "Authorization: Bearer a87cdc74-7188-43d7-9c2e-f689841f083f" http://localhost:2019/users/users + +// switch back to admins access code and this works +curl -X GET -H "Accept: application/json" -H "Authorization: Bearer 56ab5075-de2e-43ba-a407-e52b8f267ac7" http://localhost:2019/users/users + +// add snoopy as a user +curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer 56ab5075-de2e-43ba-a407-e52b8f267ac7" -d "{ \"username\":\"snoopy\", \"password\":\"password\", \"roleid\":"1" }" http://localhost:2019/users/user + +// look up users and find snoopy's id +curl -X GET -H "Accept: application/json" -H "Authorization: Bearer 56ab5075-de2e-43ba-a407-e52b8f267ac7" http://localhost:2019/users/users + +// delete snoopy user +curl -X DELETE -H "Authorization: Bearer 56ab5075-de2e-43ba-a407-e52b8f267ac7" http://localhost:2019/users/user/15 + +// verify that snoopy is deleted +curl -X GET -H "Accept: application/json" -H "Authorization: Bearer 56ab5075-de2e-43ba-a407-e52b8f267ac7" http://localhost:2019/users/user/15 + +// add ginger a new user +curl -X POST -H "Content-Type: application/json" -d "{\"username\": \"Ginger\", \"password\": \"EATEATEAT\"}" http://localhost:2019/createnewuser + +// add snoopy again with full information +curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer 56ab5075-de2e-43ba-a407-e52b8f267ac7" -d "{ \"username\": \"Snoopy\", \"password\": \"password\", \"userRoles\": [ { \"role\": { \"roleid\": 1 } } ], \"userphones\": [ { \"userphone\": \"myemail@local.home\" } ]}" http://localhost:2019/users/user + +// look at all users and verify that snoopy and ginger are available +curl -X GET -H "Accept: application/json" -H "Authorization: Bearer 56ab5075-de2e-43ba-a407-e52b8f267ac7" http://localhost:2019/users/users + +// revokes token for admin +curl -X GET -H "Accept: application/json" -H "Authorization: Bearer 56ab5075-de2e-43ba-a407-e52b8f267ac7" http://localhost:2019/oauth/revoke-token + +// this should fail with invalid token +curl -X GET -H "Accept: application/json" -H "Authorization: Bearer 56ab5075-de2e-43ba-a407-e52b8f267ac7" http://localhost:2019/users/users + +// get admins access code +curl -X POST --user "lambda-client:lambda-secret" -d "grant_type=password&username=admin&password=password" http://localhost:2019/login + +// look at all users and ginger's id +curl -X GET -H "Accept: application/json" -H "Authorization: Bearer 3d28337c-b699-4ae6-86fe-4961f42b1142" http://localhost:2019/users/users + +// add email to ginger +curl -X PUT -H "Content-Type: application/json" -H "Authorization: Bearer 3d28337c-b699-4ae6-86fe-4961f42b1142" -d "{ \"userid\": 16, \"userphones\": [ { \"userphone\": \"whisker@home.local\" } ] }" http://localhost:2019/users/user/16 + +// look at all users and ginger's emails +curl -X GET -H "Accept: application/json" -H "Authorization: Bearer 3d28337c-b699-4ae6-86fe-4961f42b1142" http://localhost:2019/users/users + +*** using a different host + +// sign on admin when on heroku +curl -X POST --user "lambda-client:lambda-secret" -d "grant_type=password&username=admin&password=password" http://jrmmba-starthere.herokuapp.com/oauth/token + + +{ + "userid": 7, + "userphones": [ + { "userphone": "whisker@home.local"} + ] +} \ No newline at end of file From 1d150a9d5b807e9a3013e8691ecd06e43c31e812 Mon Sep 17 00:00:00 2001 From: Tarah Date: Thu, 22 Apr 2021 02:26:49 -0400 Subject: [PATCH 2/4] Still Working --- .../src/main/resources/application.properties | 2 +- .../UserControllerTestUnitTestNoDB.java | 52 +++++++ .../UserServiceImplTestUnitTestNoDB.java | 130 +++++++++--------- .../src/test/resources/application.properties | 4 +- .../src/test/resources/info/curl.txt | 69 ---------- 5 files changed, 123 insertions(+), 134 deletions(-) create mode 100644 usermodel-initial/src/test/java/com/lambdaschool/usermodel/controllers/UserControllerTestUnitTestNoDB.java delete mode 100644 usermodel-initial/src/test/resources/info/curl.txt diff --git a/usermodel-initial/src/main/resources/application.properties b/usermodel-initial/src/main/resources/application.properties index 6467ccd..867a6c3 100644 --- a/usermodel-initial/src/main/resources/application.properties +++ b/usermodel-initial/src/main/resources/application.properties @@ -7,7 +7,7 @@ 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 +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, diff --git a/usermodel-initial/src/test/java/com/lambdaschool/usermodel/controllers/UserControllerTestUnitTestNoDB.java b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/controllers/UserControllerTestUnitTestNoDB.java new file mode 100644 index 0000000..f48d5ad --- /dev/null +++ b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/controllers/UserControllerTestUnitTestNoDB.java @@ -0,0 +1,52 @@ +package com.lambdaschool.usermodel.controllers; + +import org.junit.*; + +import static org.junit.Assert.*; + +public class UserControllerTestUnitTestNoDB { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void listAllUsers() { + } + + @Test + public void getUserById() { + } + + @Test + public void getUserByName() { + } + + @Test + public void getUserLikeName() { + } + + @Test + public void addNewUser() { + } + + @Test + public void updateFullUser() { + } + + @Test + public void updateUser() { + } + + @Test + public void deleteUserById() { + } + + @Test + public void getCurrentUserInfo() { + } +} \ No newline at end of file diff --git a/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestUnitTestNoDB.java b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestUnitTestNoDB.java index 393be6e..27a7571 100644 --- a/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestUnitTestNoDB.java +++ b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestUnitTestNoDB.java @@ -1,6 +1,6 @@ package com.lambdaschool.usermodel.services; -import com.fasterxml.jackson.core.JsonProcessingException; + import com.fasterxml.jackson.databind.ObjectMapper; import com.lambdaschool.usermodel.UserModelApplicationTesting; import com.lambdaschool.usermodel.exceptions.ResourceNotFoundException; @@ -176,7 +176,7 @@ public void test_findUserByNameFailed() public void test_findAll() { Mockito.when(userrepos.findAll()).thenReturn(userList); - System.out.println(userService.findAll()); + System.out.println(userService.findAll().toString()); assertEquals(5, userService.findAll().size()); } @@ -353,60 +353,62 @@ public void test_save_put_failed() { userService.save(newUser).getUserid()); } - @Test - public void test_update() throws Exception { - User newUser = new User( - "testtarah", - "password", - "tarah.agbokhana@gmail.com"); - - newUser.setUserid(18); - - Role newRole1 = new Role("Unknown1"); - newRole1.setRoleid(1); - - Role newRole2 = new Role("Unknown2"); - newRole2.setRoleid(2); - - newUser.getRoles() - .add(new UserRoles(newUser, newRole1)); - newUser.getRoles() - .add(new UserRoles(newUser, newRole2)); - - newUser.getUseremails() - .add(new Useremail(newUser, "tagbokhana@gmail.com")); - System.out.println(newUser.getUsername()); - - - // I need a copy of "newUser" to send to update so the original "newUser" - // is not changed. I am using Jackson to make a clone of the object - ObjectMapper objectMapper = new ObjectMapper(); - - User clonedUser = objectMapper - .readValue(objectMapper.writeValueAsString(newUser), User.class); - - Mockito.when(userrepos.findById(18L)) - .thenReturn(Optional.of(clonedUser)); - - System.out.println(clonedUser.getUsername()); +// @Test +// public void test_update() throws Exception { +// User newUser = new User( +// "testtarah", +// "password", +// "tarah.agbokhana@gmail.com"); +// +// newUser.setUserid(22); +// +// Role newRole1 = new Role("Unknown1"); +// newRole1.setRoleid(1); +// +// Role newRole2 = new Role("Unknown2"); +// newRole2.setRoleid(2); +// +// newUser.getRoles() +// .add(new UserRoles(newUser, newRole1)); +// newUser.getRoles() +// .add(new UserRoles(newUser, newRole2)); +// +// newUser.getUseremails() +// .add(new Useremail(newUser, "tagbokhana@gmail.com")); +// System.out.println(newUser.getUsername()); +// +// +// // I need a copy of "newUser" to send to update so the original "newUser" +// // is not changed. I am using Jackson to make a clone of the object +// ObjectMapper objectMapper = new ObjectMapper(); +// +// User clonedUser = objectMapper +// .readValue(objectMapper.writeValueAsString(newUser), User.class); +// +// Mockito.when(userrepos.findById(22L)) +// .thenReturn(Optional.of(clonedUser)); +// +// System.out.println(clonedUser.getUsername()); +// +// Mockito.when(rolerepos.findById(1L)) +// .thenReturn(Optional.of(newRole1)); +// +// Mockito.when(rolerepos.findById(2L)) +// .thenReturn(Optional.of(newRole2)); +// +// Mockito.when(userrepos.save(any(User.class))) +// .thenReturn(newUser); +// +// User addUser = userService.update(newUser, 22L); +// System.out.println("adduser: " + addUser.getUsername()); +// +// String name = "testtarah"; +// assertNotNull(addUser); +// assertEquals(name, +// addUser.getUsername()); +// } - Mockito.when(rolerepos.findById(1L)) - .thenReturn(Optional.of(newRole1)); - - Mockito.when(rolerepos.findById(2L)) - .thenReturn(Optional.of(newRole2)); - - Mockito.when(userrepos.save(any(User.class))) - .thenReturn(newUser); - - User addUser = userService.update(newUser, 18); - - assertNotNull(addUser); - assertEquals("testtarah", - addUser.getUsername()); - } - - @Test + @Test(expected = ResourceNotFoundException.class) public void test_update_failed() throws Exception { User newUser = new User( "testtarah", @@ -432,14 +434,8 @@ public void test_update_failed() throws Exception { newUser.getUseremails() .add(new Useremail(newUser, "tagbokhana@gmail.com")); - // I need a copy of "newUser" to send to update so the original "newUser" - // is not changed. I am using Jackson to make a clone of the object - ObjectMapper objectMapper = new ObjectMapper(); - User clonedUser = objectMapper - .readValue(objectMapper.writeValueAsString(newUser), User.class); - Mockito.when(userrepos.findById(18L)) - .thenReturn(Optional.of(clonedUser)); + .thenThrow(ResourceNotFoundException.class); Mockito.when(rolerepos.findById(1L)) .thenReturn(Optional.of(newRole1)); @@ -459,5 +455,15 @@ public void test_update_failed() throws Exception { @Test public void test_deleteAll() { + Mockito.when(userrepos.findAll()).thenReturn(userList); + + 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 index 92abaad..867a6c3 100644 --- a/usermodel-initial/src/test/resources/application.properties +++ b/usermodel-initial/src/test/resources/application.properties @@ -7,7 +7,7 @@ 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 +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, @@ -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=never +spring.datasource.initialization-mode=always # # Good for production! # spring.jpa.hibernate.ddl-auto=update diff --git a/usermodel-initial/src/test/resources/info/curl.txt b/usermodel-initial/src/test/resources/info/curl.txt deleted file mode 100644 index 8e6a532..0000000 --- a/usermodel-initial/src/test/resources/info/curl.txt +++ /dev/null @@ -1,69 +0,0 @@ -// admins access token = 56ab5075-de2e-43ba-a407-e52b8f267ac7 -// barnbarns access token = a87cdc74-7188-43d7-9c2e-f689841f083f - -// get admins access code -curl -X POST --user "lambda-client:lambda-secret" -d "grant_type=password&username=admin&password=password" http://localhost:2019/login - -// this works -curl -X GET -H "Accept: application/json" -H "Authorization: Bearer 56ab5075-de2e-43ba-a407-e52b8f267ac7" http://localhost:2019/users/users - -// get users access code -curl -X POST --user "lambda-client:lambda-secret" -d 'grant_type=password&username=barnbarn&password=ILuvM4th!' http://localhost:2019/login - -// this has an authentication error -curl -X GET -H "Accept: application/json" -H "Authorization: Bearer a87cdc74-7188-43d7-9c2e-f689841f083f" http://localhost:2019/users/users - -// switch back to admins access code and this works -curl -X GET -H "Accept: application/json" -H "Authorization: Bearer 56ab5075-de2e-43ba-a407-e52b8f267ac7" http://localhost:2019/users/users - -// add snoopy as a user -curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer 56ab5075-de2e-43ba-a407-e52b8f267ac7" -d "{ \"username\":\"snoopy\", \"password\":\"password\", \"roleid\":"1" }" http://localhost:2019/users/user - -// look up users and find snoopy's id -curl -X GET -H "Accept: application/json" -H "Authorization: Bearer 56ab5075-de2e-43ba-a407-e52b8f267ac7" http://localhost:2019/users/users - -// delete snoopy user -curl -X DELETE -H "Authorization: Bearer 56ab5075-de2e-43ba-a407-e52b8f267ac7" http://localhost:2019/users/user/15 - -// verify that snoopy is deleted -curl -X GET -H "Accept: application/json" -H "Authorization: Bearer 56ab5075-de2e-43ba-a407-e52b8f267ac7" http://localhost:2019/users/user/15 - -// add ginger a new user -curl -X POST -H "Content-Type: application/json" -d "{\"username\": \"Ginger\", \"password\": \"EATEATEAT\"}" http://localhost:2019/createnewuser - -// add snoopy again with full information -curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer 56ab5075-de2e-43ba-a407-e52b8f267ac7" -d "{ \"username\": \"Snoopy\", \"password\": \"password\", \"userRoles\": [ { \"role\": { \"roleid\": 1 } } ], \"userphones\": [ { \"userphone\": \"myemail@local.home\" } ]}" http://localhost:2019/users/user - -// look at all users and verify that snoopy and ginger are available -curl -X GET -H "Accept: application/json" -H "Authorization: Bearer 56ab5075-de2e-43ba-a407-e52b8f267ac7" http://localhost:2019/users/users - -// revokes token for admin -curl -X GET -H "Accept: application/json" -H "Authorization: Bearer 56ab5075-de2e-43ba-a407-e52b8f267ac7" http://localhost:2019/oauth/revoke-token - -// this should fail with invalid token -curl -X GET -H "Accept: application/json" -H "Authorization: Bearer 56ab5075-de2e-43ba-a407-e52b8f267ac7" http://localhost:2019/users/users - -// get admins access code -curl -X POST --user "lambda-client:lambda-secret" -d "grant_type=password&username=admin&password=password" http://localhost:2019/login - -// look at all users and ginger's id -curl -X GET -H "Accept: application/json" -H "Authorization: Bearer 3d28337c-b699-4ae6-86fe-4961f42b1142" http://localhost:2019/users/users - -// add email to ginger -curl -X PUT -H "Content-Type: application/json" -H "Authorization: Bearer 3d28337c-b699-4ae6-86fe-4961f42b1142" -d "{ \"userid\": 16, \"userphones\": [ { \"userphone\": \"whisker@home.local\" } ] }" http://localhost:2019/users/user/16 - -// look at all users and ginger's emails -curl -X GET -H "Accept: application/json" -H "Authorization: Bearer 3d28337c-b699-4ae6-86fe-4961f42b1142" http://localhost:2019/users/users - -*** using a different host - -// sign on admin when on heroku -curl -X POST --user "lambda-client:lambda-secret" -d "grant_type=password&username=admin&password=password" http://jrmmba-starthere.herokuapp.com/oauth/token - - -{ - "userid": 7, - "userphones": [ - { "userphone": "whisker@home.local"} - ] -} \ No newline at end of file From 3f915e1aa9c33f4f35fa1ecc2344242d9d9cd4b4 Mon Sep 17 00:00:00 2001 From: Tarah Date: Thu, 22 Apr 2021 11:46:02 -0400 Subject: [PATCH 3/4] UserImplUnitTest --- .../UserServiceImplTestUnitTestNoDB.java | 142 +++++++----------- .../src/test/resources/application.properties | 3 +- 2 files changed, 54 insertions(+), 91 deletions(-) diff --git a/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestUnitTestNoDB.java b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestUnitTestNoDB.java index 27a7571..f18838e 100644 --- a/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestUnitTestNoDB.java +++ b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestUnitTestNoDB.java @@ -21,6 +21,7 @@ import static junit.framework.TestCase.assertEquals; import static org.junit.Assert.*; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; @RunWith(SpringRunner.class) @SpringBootTest(classes = UserModelApplicationTesting.class, @@ -36,12 +37,19 @@ public class UserServiceImplTestUnitTestNoDB { // stubs -> fake methods // Java -> mocks + @MockBean + private HelperFunctions helperFunctions; + + @MockBean + private RoleService roleService; + @MockBean private UserRepository userrepos; @MockBean private RoleRepository rolerepos; + private List userList; @Before @@ -242,33 +250,6 @@ public void test_save() { assertNotNull(addUser); assertEquals("testtarah",addUser.getUsername()); } - - @Test(expected = ResourceNotFoundException.class) - public void test_saveRoleNotFound() { - User newUser = new User( - "testtarah", - "password", - "tarah.agbokhana@gmail.com"); - - Role newRole = new Role("DATA-MGR"); - newRole.setRoleid(1); - - newUser.getRoles() - .add(new UserRoles(newUser, newRole)); - newUser.getUseremails() - .add(new Useremail(newUser, "tagbokhana@gmail.com")); - - Mockito.when(userrepos.save(any(User.class))) - .thenReturn(newUser); - - Mockito.when(rolerepos.findById(1L)) - .thenReturn(Optional.empty());//return no role - - User addUser = userService.save(newUser); - assertNotNull(addUser); - assertEquals("testtarah",addUser.getUsername()); - } - @Test public void test_save_put(){ User newUser = new User( @@ -281,16 +262,11 @@ public void test_save_put(){ Role newRole1 = new Role("Unknown1"); newRole1.setRoleid(1); - Role newRole2 = new Role("Unknown2"); - newRole2.setRoleid(2); - newUser.getRoles() .clear(); newUser.getRoles() .add(new UserRoles(newUser, newRole1)); - newUser.getRoles() - .add(new UserRoles(newUser, newRole2)); newUser.getUseremails() .add(new Useremail(newUser, "tagbokhana@gmail.com")); @@ -301,9 +277,6 @@ public void test_save_put(){ Mockito.when(rolerepos.findById(1L)) .thenReturn(Optional.of(newRole1)); - Mockito.when(rolerepos.findById(2L)) - .thenReturn(Optional.of(newRole2)); - Mockito.when(userrepos.save(any(User.class))) .thenReturn(newUser); @@ -353,60 +326,49 @@ public void test_save_put_failed() { userService.save(newUser).getUserid()); } -// @Test -// public void test_update() throws Exception { -// User newUser = new User( -// "testtarah", -// "password", -// "tarah.agbokhana@gmail.com"); -// -// newUser.setUserid(22); -// -// Role newRole1 = new Role("Unknown1"); -// newRole1.setRoleid(1); -// -// Role newRole2 = new Role("Unknown2"); -// newRole2.setRoleid(2); -// -// newUser.getRoles() -// .add(new UserRoles(newUser, newRole1)); -// newUser.getRoles() -// .add(new UserRoles(newUser, newRole2)); -// -// newUser.getUseremails() -// .add(new Useremail(newUser, "tagbokhana@gmail.com")); -// System.out.println(newUser.getUsername()); -// -// -// // I need a copy of "newUser" to send to update so the original "newUser" -// // is not changed. I am using Jackson to make a clone of the object -// ObjectMapper objectMapper = new ObjectMapper(); -// -// User clonedUser = objectMapper -// .readValue(objectMapper.writeValueAsString(newUser), User.class); -// -// Mockito.when(userrepos.findById(22L)) -// .thenReturn(Optional.of(clonedUser)); -// -// System.out.println(clonedUser.getUsername()); -// -// Mockito.when(rolerepos.findById(1L)) -// .thenReturn(Optional.of(newRole1)); -// -// Mockito.when(rolerepos.findById(2L)) -// .thenReturn(Optional.of(newRole2)); -// -// Mockito.when(userrepos.save(any(User.class))) -// .thenReturn(newUser); -// -// User addUser = userService.update(newUser, 22L); -// System.out.println("adduser: " + addUser.getUsername()); -// -// String name = "testtarah"; -// assertNotNull(addUser); -// assertEquals(name, -// addUser.getUsername()); -// } + @Test + public void test_update() { + User newUser = new User( + "testtarah", + "password", + "tarah.agbokhana@gmail.com"); + + Role newRole1 = new Role("Unknown1"); + newRole1.setRoleid(1); + + newUser.getRoles() + .add(new UserRoles(newUser, newRole1)); + + newUser.getUseremails() + .add(new Useremail(newUser, "tagbokhana@gmail.com")); + newUser.getUseremails() + .add(new Useremail(newUser, "tarah@gmail.com")); + System.out.println(newRole1.getRoleid()); + + Mockito.when(roleService.findRoleById(1)) + .thenReturn(newRole1); + System.out.println(roleService.findRoleById(1)); + + Mockito.when(userrepos.findById(7L)) + .thenReturn(Optional.of(userList.get(1))); + System.out.println(userrepos.findById(7L)); + + Mockito.when(userrepos.save(any(User.class))) + .thenReturn(newUser); + + Mockito.when(helperFunctions.isAuthorizedToMakeChange(anyString())) + .thenReturn(true); + +/// User addUser = userService.update(newUser, 22L); + // System.out.println("adduser: " + addUser.getUsername()); + + + assertEquals("tarah@gmail.com", + userService.update(newUser, 7L) + .getUseremails() + .get(1) + .getUseremail()); + } @Test(expected = ResourceNotFoundException.class) public void test_update_failed() throws Exception { @@ -447,7 +409,7 @@ public void test_update_failed() throws Exception { .thenReturn(newUser); User addUser = userService.update(newUser, 18); - + System.out.println("#3 "+ addUser.getUsername()); assertNotNull(addUser); assertEquals("testtarah", addUser.getUsername()); diff --git a/usermodel-initial/src/test/resources/application.properties b/usermodel-initial/src/test/resources/application.properties index 867a6c3..617331c 100644 --- a/usermodel-initial/src/test/resources/application.properties +++ b/usermodel-initial/src/test/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 @@ -32,3 +32,4 @@ spring.jackson.time-zone=America/Los_Angeles server.error.whitelabel.enabled=false spring.mvc.throw-exception-if-no-handler-found=true spring.resources.add-mappings=false +#spring.batch.job.enabled=false \ No newline at end of file From 248e78f8437b732f11a5109298bb4166b9bebefd Mon Sep 17 00:00:00 2001 From: Tarah Date: Thu, 22 Apr 2021 22:31:36 -0400 Subject: [PATCH 4/4] UserServiceImplUnitTestWithDB --- usermodel-initial/pom.xml | 23 ++ .../src/main/resources/application.properties | 5 + .../UserServiceImplTestUnitTestNoDB.java | 2 - .../UserServiceImplTestUnitTestWithDB.java | 308 ++++++++++++++++++ 4 files changed, 336 insertions(+), 2 deletions(-) create mode 100644 usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestUnitTestWithDB.java diff --git a/usermodel-initial/pom.xml b/usermodel-initial/pom.xml index 38c921d..a5396ff 100644 --- a/usermodel-initial/pom.xml +++ b/usermodel-initial/pom.xml @@ -103,14 +103,37 @@ 2.3.6.RELEASE + + + + + + + org.springframework.boot spring-boot-maven-plugin + + + + + + + + + + + + + + + + diff --git a/usermodel-initial/src/main/resources/application.properties b/usermodel-initial/src/main/resources/application.properties index 867a6c3..0d04048 100644 --- a/usermodel-initial/src/main/resources/application.properties +++ b/usermodel-initial/src/main/resources/application.properties @@ -1,6 +1,11 @@ +#local.run.db=H2 +#local.run.db=POSTGRESQL +# # Configurations useful for working with H2 spring.h2.console.enabled=true spring.h2.console.path=/h2-console +#Allow Heroku to connect +#spring.h2.console.settings.web-allow-others=true # # We set a port that is not frequently used server.port=${PORT:2019} diff --git a/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestUnitTestNoDB.java b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestUnitTestNoDB.java index f18838e..0e81f4f 100644 --- a/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestUnitTestNoDB.java +++ b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestUnitTestNoDB.java @@ -1,7 +1,5 @@ package com.lambdaschool.usermodel.services; - -import com.fasterxml.jackson.databind.ObjectMapper; import com.lambdaschool.usermodel.UserModelApplicationTesting; import com.lambdaschool.usermodel.exceptions.ResourceNotFoundException; import com.lambdaschool.usermodel.models.*; diff --git a/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestUnitTestWithDB.java b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestUnitTestWithDB.java new file mode 100644 index 0000000..2a234b7 --- /dev/null +++ b/usermodel-initial/src/test/java/com/lambdaschool/usermodel/services/UserServiceImplTestUnitTestWithDB.java @@ -0,0 +1,308 @@ +package com.lambdaschool.usermodel.services; + +import com.lambdaschool.usermodel.UserModelApplicationTesting; +import com.lambdaschool.usermodel.exceptions.ResourceFoundException; +import com.lambdaschool.usermodel.exceptions.ResourceNotFoundException; +import com.lambdaschool.usermodel.models.*; +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 javax.annotation.Resource; + +import static junit.framework.TestCase.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.anyString; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = UserModelApplicationTesting.class) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class UserServiceImplTestUnitTestWithDB { + + @Autowired + private UserService userService; + + @Autowired + private RoleService roleService; + + @MockBean + private HelperFunctions helperFunctions; + + @Before + public void setUp() throws Exception { + + MockitoAnnotations.initMocks(this); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDB_findUserById() { + System.out.println(userService.findUserById(4) + .getUsername()); + assertEquals("testadmin", + userService.findUserById(4) + .getUsername()); + } + + @Test(expected = ResourceNotFoundException.class) + public void testDB_findUserByIdNotFound() { + assertEquals("testadmin", + userService.findUserById(10) + .getUsername()); + } + + @Test + public void testDB_findByNameContaining() { + + } + + @Test + public void testDB_findAll() { + assertEquals(5, + userService.findAll().size()); + } + + @Test + public void ztestDB_delete() { + userService.delete(13); + assertEquals(5, + userService.findAll().size()); + } + + @Test + public void testDB_findByName() { + assertEquals("testadmin", + userService.findByName("testadmin").getUsername()); + } + + @Test + public void testDB_save() { + Role newRole = new Role("ADMIN"); + newRole.setRoleid(1); //sets a role that already exist + + User newUser = new User("tagbokhana", + "password", + "tagbokhana@gmail.com"); + + newUser.getRoles() + .add(new UserRoles(newUser, newRole)); + newUser.getUseremails() + .add(new Useremail(newUser, "tarah.agbokhana@gmail.com")); + + User addUser = userService.save(newUser); + + assertEquals("tagbokhana", addUser.getUsername()); + } + + @Test(expected = ResourceNotFoundException.class) + public void testDB_saveNotFound() { + Role newRole = new Role("ADMIN"); + newRole.setRoleid(8); //sets a role that already exist + + User newUser = new User("tagbokhana", + "password", + "tagbokhana@gmail.com"); + + newUser.getRoles() + .add(new UserRoles(newUser, newRole)); + newUser.getUseremails() + .add(new Useremail(newUser, "tarah.agbokhana@gmail.com")); + + User addUser = userService.save(newUser); + + assertEquals("tagbokhana", addUser.getUsername()); + } + + @Test + public void testDB_savePut(){ + Role newRole = new Role("testuser"); + newRole.setRoleid(3); + + User newUser = new User("bebop", + "password", + "beep@lol.com"); + + newUser.getRoles() + .add(new UserRoles(newUser, newRole)); + newUser.getUseremails() + .add(new Useremail(newUser, "beepbeep@lol.com")); + newUser.setUserid(4); + + User addUser = userService.save(newUser); + + assertEquals("beepbeep@lol.com", + addUser.getUseremails() + .get(0) + .getUseremail()); + } + + @Test(expected = ResourceNotFoundException.class) + public void testDB_savePutNotFound(){ + Role newRole = new Role("testuser"); + newRole.setRoleid(3); + + User newUser = new User("bebop", + "password", + "beep@lol.com"); + + newUser.getRoles() + .add(new UserRoles(newUser, newRole)); + newUser.getUseremails() + .add(new Useremail(newUser, "beepbeep@lol.com")); + newUser.setUserid(40); + + User addUser = userService.save(newUser); + + assertEquals("beepbeep@lol.com", + addUser.getUseremails() + .get(0) + .getUseremail()); + } + + @Test + public void testDB_update() { + Mockito.when(helperFunctions.isAuthorizedToMakeChange(anyString())) + .thenReturn(true); + + Role newRole = new Role("testnewuser"); + newRole.setRoleid(1); + + User newUser = new User("tata", + "password", + "tata@agency.com"); + newUser.getRoles() + .add(new UserRoles(newUser, newRole)); + newUser.getUseremails() + .add(new Useremail(newUser, "admin@agency.com")); + newUser.getUseremails() + .add(new Useremail(newUser, "manager@agency.com")); + + User updatedUser = userService.update(newUser, 4); + + int lastIndex = updatedUser.getUseremails() + .size() - 1; + assertEquals("manager@agency.com", + updatedUser.getUseremails() + .get(lastIndex) + .getUseremail()); + } + + + @Test(expected = ResourceNotFoundException.class) + public void testDB_updateNotFound() { + Mockito.when(helperFunctions.isAuthorizedToMakeChange(anyString())) + .thenReturn(true); + + Role newRole = new Role("testnewuser"); + newRole.setRoleid(1); + + User newUser = new User("tata", + "password", + "tata@agency.com"); + newUser.getRoles() + .add(new UserRoles(newUser, newRole)); + newUser.getUseremails() + .add(new Useremail(newUser, "admin@agency.com")); + newUser.getUseremails() + .add(new Useremail(newUser, "manager@agency.com")); + + User updatedUser = userService.update(newUser, 8); + + int lastIndex = updatedUser.getUseremails() + .size() - 1; + assertEquals("manager@agency.com", + updatedUser.getUseremails() + .get(lastIndex) + .getUseremail()); + } + + @Test + public void ztestDB_deleteAll() { + userService.deleteAll(); + assertEquals(0, + userService.findAll().size()); + } + + @Test + public void testDB_findAllRoles() { + assertEquals(3, + roleService.findAll().size()); + } + + @Test + public void testDB_findRoleByName() { + assertEquals("testadmin".toUpperCase(), + roleService.findByName("testadmin".toUpperCase()).getName()); + } + + @Test(expected = ResourceNotFoundException.class) + public void testDB_findRoleByNameNotFound() { + assertEquals("bunnyrabbit".toUpperCase(), + roleService.findByName("bunnyrabbit".toUpperCase()).getName()); + } + + @Test(expected = ResourceFoundException.class) + public void testDB_saveRoleNotFound(){ + Role newRole = new Role("ADMIN"); + newRole.setRoleid(99); + + User newUser = new User("tagbokhana", + "password", + "tagbokhana@gmail.com"); + + User newUser2 = new User("tagbokhana", + "password", + "tagbokhana@gmail.com"); + newRole.getUsers() + .add(new UserRoles(newUser, newRole)); + newRole.getUsers() + .add(new UserRoles(newUser2, newRole)); + + newUser.getRoles() + .add(new UserRoles(newUser, newRole)); + newUser.getUseremails() + .add(new Useremail(newUser, "tarah.agbokhana@gmail.com")); + + Role addRole = roleService.save(newRole); + + assertEquals(2, addRole.getUsers()); + } + + @Test(expected = ResourceNotFoundException.class) + public void testDB_updateRoleNotFound(){ + Mockito.when(helperFunctions.isAuthorizedToMakeChange(anyString())) + .thenReturn(true); + + User newUser = new User("tata", + "password", + "tata@agency.com"); + newUser.setUserid(48); + + Role newRole = new Role("testnewuser"); +// newRole.setRoleid(50); + + newUser.getRoles() + .add(new UserRoles(newUser, newRole)); + newUser.getUseremails() + .add(new Useremail(newUser, "admin@agency.com")); + newUser.getUseremails() + .add(new Useremail(newUser, "manager@agency.com")); + + Role updatedRole = roleService.update(8L, newRole); + + assertEquals(50, + updatedRole.getRoleid()); + } +} \ No newline at end of file