Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -31,24 +31,30 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>

<build>
Expand Down
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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<Employee> getEmployees() {
return service.getEmployees();
}
}
28 changes: 28 additions & 0 deletions src/main/java/com/zoomcare/candidatechallenge/model/Employee.java
Original file line number Diff line number Diff line change
@@ -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<Property> propertyList;

}
28 changes: 28 additions & 0 deletions src/main/java/com/zoomcare/candidatechallenge/model/Property.java
Original file line number Diff line number Diff line change
@@ -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;
}

Original file line number Diff line number Diff line change
@@ -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<Employee, Long> {
}
Original file line number Diff line number Diff line change
@@ -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<Property, Long> {
}
Original file line number Diff line number Diff line change
@@ -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<Employee> getEmployees();
}
Original file line number Diff line number Diff line change
@@ -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<Employee> employeeOptional = employeeRepository.findById(id);
Employee employee = employeeOptional.isPresent() ? employeeOptional.get() : new Employee();
return employee;
}

@Override
public List<Employee> getEmployees() {
List<Employee> employeeList = employeeRepository.findAll();
return employeeList;
}
}
7 changes: 6 additions & 1 deletion src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,16 @@ spring:
h2:
console:
enabled: true
datasource:
url: jdbc:h2:mem:testdb
username: sa
main:
allow-bean-definition-overriding: true
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
show-details: always
Original file line number Diff line number Diff line change
@@ -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<Employee> employeesResponse = new ArrayList<>();
Mockito.when(service.getEmployees()).thenReturn(employeesResponse);
List<Employee> 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<Property> propertyByEmployeeId = new ArrayList<>();
propertyByEmployeeId.add(property);
return employee;
}

}
Original file line number Diff line number Diff line change
@@ -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<Employee> 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<Employee> employeeOptional = Optional.of(new Employee());
Mockito.when(employeeRepository.findById(Mockito.any())).thenReturn(employeeOptional);
List<Employee> employeeResponseList = service.getEmployees();
assertNotNull(employeeResponseList);
}
}