diff --git a/pom.xml b/pom.xml index 17fd7ad..8098d29 100644 --- a/pom.xml +++ b/pom.xml @@ -31,24 +31,30 @@ org.springframework.boot spring-boot-starter-web - org.flywaydb flyway-core runtime - com.h2database h2 runtime - org.springframework.boot spring-boot-starter-test test + + org.projectlombok + lombok + 1.18.26 + + + org.springframework.boot + spring-boot-starter-data-jpa + diff --git a/src/main/java/com/zoomcare/candidatechallenge/.DS_Store b/src/main/java/com/zoomcare/candidatechallenge/.DS_Store new file mode 100644 index 0000000..e75b544 Binary files /dev/null and b/src/main/java/com/zoomcare/candidatechallenge/.DS_Store differ diff --git a/src/main/java/com/zoomcare/candidatechallenge/CandidateChallengeApplication.java b/src/main/java/com/zoomcare/candidatechallenge/CandidateChallengeApplication.java index 0114259..e5f98cb 100644 --- a/src/main/java/com/zoomcare/candidatechallenge/CandidateChallengeApplication.java +++ b/src/main/java/com/zoomcare/candidatechallenge/CandidateChallengeApplication.java @@ -4,12 +4,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class CandidateChallengeApplication -{ - - public static void main(String[] args) - { - SpringApplication.run(CandidateChallengeApplication.class, args); - } - +public class CandidateChallengeApplication { + public static void main(String[] args) { + SpringApplication.run(CandidateChallengeApplication.class, args); + } } diff --git a/src/main/java/com/zoomcare/candidatechallenge/controller/EmployeeController.java b/src/main/java/com/zoomcare/candidatechallenge/controller/EmployeeController.java new file mode 100644 index 0000000..d9b1915 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/controller/EmployeeController.java @@ -0,0 +1,29 @@ +package com.zoomcare.candidatechallenge.controller; + +import com.zoomcare.candidatechallenge.model.Employee; +import com.zoomcare.candidatechallenge.service.EmployeeService; +import lombok.AllArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.constraints.NotNull; +import java.util.List; + +@RestController +@RequestMapping("/api/v1/employees") +@AllArgsConstructor +public class EmployeeController { + private EmployeeService service; + + @GetMapping("/{id}") + public Employee getEmployee(@PathVariable @NotNull Long id) { + return service.getEmployee(id); + } + + @GetMapping + public List getEmployees() { + return service.getEmployees(); + } +} diff --git a/src/main/java/com/zoomcare/candidatechallenge/model/Employee.java b/src/main/java/com/zoomcare/candidatechallenge/model/Employee.java new file mode 100644 index 0000000..429c96d --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/model/Employee.java @@ -0,0 +1,28 @@ +package com.zoomcare.candidatechallenge.model; + +import lombok.Data; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import java.util.List; + +@Data +@Entity +@Table(name= "employee") +public class Employee { + + @Id + @Column + private Long id; + @Column(name="supervisor_id") + private Long supervisorId; + + @OneToMany(mappedBy = "employee", fetch = FetchType.EAGER, cascade = CascadeType.ALL) + private List propertyList; + +} \ No newline at end of file diff --git a/src/main/java/com/zoomcare/candidatechallenge/model/Property.java b/src/main/java/com/zoomcare/candidatechallenge/model/Property.java new file mode 100644 index 0000000..23864a2 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/model/Property.java @@ -0,0 +1,28 @@ +package com.zoomcare.candidatechallenge.model; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +@Data +@Entity +@Table(name= "property") +public class Property { + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "employee_id") + @JsonIgnore + private Employee employee; + @Id + @Column + private String key; + @Column + private String value; +} + diff --git a/src/main/java/com/zoomcare/candidatechallenge/repository/EmployeeRepository.java b/src/main/java/com/zoomcare/candidatechallenge/repository/EmployeeRepository.java new file mode 100644 index 0000000..2cab4a9 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/repository/EmployeeRepository.java @@ -0,0 +1,12 @@ +package com.zoomcare.candidatechallenge.repository; + +import com.zoomcare.candidatechallenge.model.Employee; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import javax.transaction.Transactional; + +@Repository +@Transactional +public interface EmployeeRepository extends JpaRepository { +} \ No newline at end of file diff --git a/src/main/java/com/zoomcare/candidatechallenge/repository/PropertyRepository.java b/src/main/java/com/zoomcare/candidatechallenge/repository/PropertyRepository.java new file mode 100644 index 0000000..cbd640d --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/repository/PropertyRepository.java @@ -0,0 +1,12 @@ +package com.zoomcare.candidatechallenge.repository; + +import com.zoomcare.candidatechallenge.model.Property; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import javax.transaction.Transactional; + +@Repository +@Transactional +public interface PropertyRepository extends JpaRepository { +} \ No newline at end of file diff --git a/src/main/java/com/zoomcare/candidatechallenge/service/EmployeeService.java b/src/main/java/com/zoomcare/candidatechallenge/service/EmployeeService.java new file mode 100644 index 0000000..133c5cd --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/service/EmployeeService.java @@ -0,0 +1,10 @@ +package com.zoomcare.candidatechallenge.service; + +import com.zoomcare.candidatechallenge.model.Employee; + +import java.util.List; + +public interface EmployeeService { + Employee getEmployee(Long id); + List getEmployees(); +} diff --git a/src/main/java/com/zoomcare/candidatechallenge/service/EmployeeServiceImpl.java b/src/main/java/com/zoomcare/candidatechallenge/service/EmployeeServiceImpl.java new file mode 100644 index 0000000..6e95995 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/service/EmployeeServiceImpl.java @@ -0,0 +1,30 @@ +package com.zoomcare.candidatechallenge.service; + +import com.zoomcare.candidatechallenge.model.Employee; +import com.zoomcare.candidatechallenge.repository.EmployeeRepository; +import com.zoomcare.candidatechallenge.repository.PropertyRepository; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +@AllArgsConstructor +public class EmployeeServiceImpl implements EmployeeService { + EmployeeRepository employeeRepository; + PropertyRepository propertyRepository; + + @Override + public Employee getEmployee(Long id) { + Optional employeeOptional = employeeRepository.findById(id); + Employee employee = employeeOptional.isPresent() ? employeeOptional.get() : new Employee(); + return employee; + } + + @Override + public List getEmployees() { + List employeeList = employeeRepository.findAll(); + return employeeList; + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 4408d17..d6bd5c9 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -2,6 +2,11 @@ spring: h2: console: enabled: true + datasource: + url: jdbc:h2:mem:testdb + username: sa + main: + allow-bean-definition-overriding: true management: endpoints: web: @@ -9,4 +14,4 @@ management: include: "*" endpoint: health: - show-details: always \ No newline at end of file + show-details: always diff --git a/src/test/java/com/zoomcare/candidatechallenge/controller/EmployeeControllerTest.java b/src/test/java/com/zoomcare/candidatechallenge/controller/EmployeeControllerTest.java new file mode 100644 index 0000000..ca538ff --- /dev/null +++ b/src/test/java/com/zoomcare/candidatechallenge/controller/EmployeeControllerTest.java @@ -0,0 +1,68 @@ +package com.zoomcare.candidatechallenge.controller; + +import com.zoomcare.candidatechallenge.model.Employee; +import com.zoomcare.candidatechallenge.model.Property; +import com.zoomcare.candidatechallenge.service.EmployeeService; +import com.zoomcare.candidatechallenge.service.EmployeeServiceImpl; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class EmployeeControllerTest { + + private EmployeeController controller; + EmployeeService service; + + @Before + public void setUp() { + service = Mockito.mock(EmployeeServiceImpl.class); + controller = new EmployeeController(service); + } + + @Test + public void test_getEmployee_success() { + Employee employee = getEmployee(1L, null,"title", "CEO"); + Mockito.when(service.getEmployee(Mockito.any())).thenReturn(employee); + Employee controllerResponse = controller.getEmployee(1L); + assertNotNull(employee); + assertEquals(employee, controllerResponse); + } + + @Test + public void test_getEmployees_success() { + List employeesResponse = new ArrayList<>(); + Mockito.when(service.getEmployees()).thenReturn(employeesResponse); + List controllerResponse = controller.getEmployees(); + assertNotNull(employeesResponse); + assertEquals(employeesResponse, controllerResponse); + } + + @Test + public void test_getEmployee_notFound() { + Employee Employee = getEmployee(0L, null, null, null); + Mockito.when(service.getEmployee(Mockito.any())).thenReturn(Employee); + Employee controllerResponse = controller.getEmployee(0L); + assertNotNull(Employee); + assertEquals(Employee, controllerResponse); + } + + private static Employee getEmployee(Long id, Long supervisorId, String key, String title) { + Employee employee = new Employee(); + employee.setId(id); + employee.setSupervisorId(supervisorId); + Property property = new Property(); + property.setEmployee(employee); + property.setKey(key); + property.setValue(title); + List propertyByEmployeeId = new ArrayList<>(); + propertyByEmployeeId.add(property); + return employee; + } + +} \ No newline at end of file diff --git a/src/test/java/com/zoomcare/candidatechallenge/service/EmployeeServiceImplTest.java b/src/test/java/com/zoomcare/candidatechallenge/service/EmployeeServiceImplTest.java new file mode 100644 index 0000000..5cb21e2 --- /dev/null +++ b/src/test/java/com/zoomcare/candidatechallenge/service/EmployeeServiceImplTest.java @@ -0,0 +1,43 @@ +package com.zoomcare.candidatechallenge.service; + +import com.zoomcare.candidatechallenge.model.Employee; +import com.zoomcare.candidatechallenge.repository.EmployeeRepository; +import com.zoomcare.candidatechallenge.repository.PropertyRepository; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; + +import java.util.List; +import java.util.Optional; + +import static org.junit.Assert.assertNotNull; + +public class EmployeeServiceImplTest { + + private EmployeeServiceImpl service; + EmployeeRepository employeeRepository; + PropertyRepository propertyRepository; + + @Before + public void setUp() { + employeeRepository = Mockito.mock(EmployeeRepository.class); + propertyRepository = Mockito.mock(PropertyRepository.class); + service = new EmployeeServiceImpl(employeeRepository, propertyRepository); + } + + @Test + public void test_getEmployee_success() { + Optional employeeOptional = Optional.of(new Employee()); + Mockito.when(employeeRepository.findById(Mockito.any())).thenReturn(employeeOptional); + Employee employee = service.getEmployee(5L); + assertNotNull(employee); + } + + @Test + public void test_getEmployees_success() { + Optional employeeOptional = Optional.of(new Employee()); + Mockito.when(employeeRepository.findById(Mockito.any())).thenReturn(employeeOptional); + List employeeResponseList = service.getEmployees(); + assertNotNull(employeeResponseList); + } +} \ No newline at end of file