Skip to content

Commit 435c21e

Browse files
committed
Get one repository
1 parent ab1ff56 commit 435c21e

File tree

9 files changed

+118
-2
lines changed

9 files changed

+118
-2
lines changed

Diff for: pom.xml

+4
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@
5050
<artifactId>gson</artifactId>
5151
<scope>test</scope>
5252
</dependency>
53+
<dependency>
54+
<groupId>org.springframework.boot</groupId>
55+
<artifactId>spring-boot-starter-jersey</artifactId>
56+
</dependency>
5357
</dependencies>
5458

5559
<build>

Diff for: src/main/java/com/springbrasil/repository/controller/RepositoryController.java

+7
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.springframework.data.domain.Page;
77
import org.springframework.http.HttpStatus;
88
import org.springframework.http.MediaType;
9+
import org.springframework.web.bind.annotation.PathVariable;
910
import org.springframework.web.bind.annotation.RequestBody;
1011
import org.springframework.web.bind.annotation.RequestMapping;
1112
import org.springframework.web.bind.annotation.RequestMethod;
@@ -38,5 +39,11 @@ public Page<Repository> getRepositories(
3839
@RequestParam(required=false, defaultValue="10") Integer size) {
3940
return repositoryService.getAll(page, size);
4041
}
42+
43+
@RequestMapping(method = RequestMethod.GET, value = "/repositories/{repository_id}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
44+
@ResponseStatus(code = HttpStatus.OK)
45+
public Repository getRepositories(@PathVariable(name="repository_id") String repositoryId) {
46+
return repositoryService.get(repositoryId);
47+
}
4148

4249
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.springbrasil.repository.controller.handler;
2+
3+
import javax.ws.rs.NotFoundException;
4+
5+
import org.springframework.http.HttpStatus;
6+
import org.springframework.web.bind.annotation.ControllerAdvice;
7+
import org.springframework.web.bind.annotation.ExceptionHandler;
8+
import org.springframework.web.bind.annotation.ResponseBody;
9+
import org.springframework.web.bind.annotation.ResponseStatus;
10+
11+
@ControllerAdvice
12+
public class GlobalExceptionHandler {
13+
14+
@ResponseStatus(HttpStatus.NOT_FOUND)
15+
@ExceptionHandler(NotFoundException.class)
16+
@ResponseBody
17+
public ErrorMessage handleNotFound(NotFoundException e) {
18+
return new ErrorMessage("not found",
19+
String.format("cannot found resource: '%s'", e.getMessage()));
20+
}
21+
22+
class ErrorMessage {
23+
String error;
24+
String message;
25+
26+
ErrorMessage(String error, String message) {
27+
this.error = error;
28+
this.message = message;
29+
}
30+
31+
}
32+
33+
}
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.springbrasil.repository.dao;
22

3-
import org.springframework.data.repository.PagingAndSortingRepository;
3+
import org.springframework.data.mongodb.repository.MongoRepository;
44

55
import com.springbrasil.repository.model.Repository;
66

7-
public interface RepositoryDao extends PagingAndSortingRepository<Repository, String>{
7+
public interface RepositoryDao extends MongoRepository<Repository, String>{
88

99
}

Diff for: src/main/java/com/springbrasil/repository/service/RepositoryService.java

+10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package com.springbrasil.repository.service;
22

3+
import java.util.Optional;
4+
5+
import javax.ws.rs.NotFoundException;
6+
37
import org.springframework.beans.factory.annotation.Autowired;
48
import org.springframework.data.domain.Page;
59
import org.springframework.data.domain.PageRequest;
@@ -22,4 +26,10 @@ public Page<Repository> getAll(Integer page, Integer size) {
2226
return repositoryDao.findAll(new PageRequest(page, size));
2327
}
2428

29+
public Repository get(String repositoryId) {
30+
return Optional
31+
.ofNullable(repositoryDao.findOne(repositoryId))
32+
.orElseThrow(() -> new NotFoundException(repositoryId));
33+
}
34+
2535
}

Diff for: src/test/java/com/springbrasil/repository/controller/RepositoryControllerUnitTest.java

+34
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package com.springbrasil.repository.controller;
22

3+
import static org.hamcrest.CoreMatchers.instanceOf;
34
import static org.mockito.Matchers.any;
45
import static org.mockito.Matchers.anyInt;
6+
import static org.mockito.Matchers.eq;
57
import static org.mockito.Mockito.doReturn;
8+
import static org.mockito.Mockito.doThrow;
69
import static org.mockito.Mockito.times;
710
import static org.mockito.Mockito.verify;
811
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
@@ -12,8 +15,12 @@
1215

1316
import java.util.Arrays;
1417

18+
import javax.ws.rs.NotFoundException;
19+
1520
import org.junit.Before;
21+
import org.junit.Rule;
1622
import org.junit.Test;
23+
import org.junit.rules.ExpectedException;
1724
import org.junit.runner.RunWith;
1825
import org.springframework.beans.factory.annotation.Autowired;
1926
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
@@ -22,6 +29,7 @@
2229
import org.springframework.http.MediaType;
2330
import org.springframework.test.context.junit4.SpringRunner;
2431
import org.springframework.test.web.servlet.MockMvc;
32+
import org.springframework.web.util.NestedServletException;
2533

2634
import com.springbrasil.repository.helper.JsonHelper;
2735
import com.springbrasil.repository.model.Repository;
@@ -39,6 +47,9 @@ public class RepositoryControllerUnitTest {
3947
@Autowired
4048
private MockMvc mvc;
4149

50+
@Rule
51+
public ExpectedException exception = ExpectedException.none();
52+
4253
private Repository repository;
4354

4455
@Before
@@ -49,6 +60,8 @@ public void setUp() {
4960
repository.setType(RepositoryType.GITHUB);
5061
doReturn(repository).when(repositoryService).save(any(Repository.class));
5162
doReturn(new PageImpl<>(Arrays.asList(repository))).when(repositoryService).getAll(anyInt(), anyInt());
63+
doReturn(repository).when(repositoryService).get(eq("6e71d0d568e134c029203593b00a0103e7cdf30b"));
64+
doThrow(new NotFoundException("unexisting_repository")).when(repositoryService).get(eq("unexisting_repository"));
5265
}
5366

5467
@Test
@@ -74,5 +87,26 @@ public void shouldGetAllRepositories() throws Exception {
7487

7588
verify(repositoryService, times(1)).getAll(0, 10);
7689
}
90+
91+
@Test
92+
public void shouldGetOneRepository() throws Exception {
93+
String response = JsonHelper.getResponseFileAsString("repository/get_one_repository_success.json");
94+
95+
mvc.perform(get("/repositories/6e71d0d568e134c029203593b00a0103e7cdf30b").accept(MediaType.APPLICATION_JSON_UTF8_VALUE))
96+
.andExpect(status().isOk())
97+
.andExpect(content().json(response));
98+
99+
verify(repositoryService, times(1)).get("6e71d0d568e134c029203593b00a0103e7cdf30b");
100+
}
101+
102+
@Test
103+
public void shouldThrowErrorWhenGetUnexistingRepository() throws Exception {
104+
exception.expect(NestedServletException.class);
105+
exception.expectCause(instanceOf(NotFoundException.class));
106+
107+
mvc.perform(get("/repositories/unexisting_repository")
108+
.accept(MediaType.APPLICATION_JSON_UTF8_VALUE))
109+
.andExpect(status().isNotFound());
110+
}
77111

78112
}

Diff for: src/test/java/com/springbrasil/repository/service/RepositoryServiceUnitTest.java

+19
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
package com.springbrasil.repository.service;
22

33
import static org.mockito.Matchers.any;
4+
import static org.mockito.Matchers.anyString;
5+
import static org.mockito.Matchers.eq;
6+
import static org.mockito.Mockito.doReturn;
47
import static org.mockito.Mockito.times;
58
import static org.mockito.Mockito.verify;
69

10+
import javax.ws.rs.NotFoundException;
11+
712
import org.junit.Test;
813
import org.junit.runner.RunWith;
914
import org.springframework.beans.factory.annotation.Autowired;
@@ -39,5 +44,19 @@ public void shouldFindAllRepositories() {
3944

4045
verify(repositoryDao, times(1)).findAll(any(PageRequest.class));
4146
}
47+
48+
@Test
49+
public void shouldFindOneRepository() {
50+
doReturn(new Repository()).when(repositoryDao).findOne(anyString());
51+
repositoryService.get("123");
52+
53+
verify(repositoryDao, times(1)).findOne(anyString());
54+
}
55+
56+
@Test(expected=NotFoundException.class)
57+
public void shouldThrowErrorWhenDoesntFindOneRepository() {
58+
doReturn(null).when(repositoryDao).findOne(eq("unexisting_repository"));
59+
repositoryService.get("unexisting_repository");
60+
}
4261

4362
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"error": "not found",
3+
"message": "cannot found resource: 'unexisting_resource' "
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"id": "6e71d0d568e134c029203593b00a0103e7cdf30b",
3+
"url": "http://my_repository",
4+
"type": "GITHUB"
5+
}

0 commit comments

Comments
 (0)