Skip to content

Commit

Permalink
Merge 854ccea into c3b4eb4
Browse files Browse the repository at this point in the history
  • Loading branch information
rladdusaw committed Dec 17, 2019
2 parents c3b4eb4 + 854ccea commit 73c5d8b
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 12 deletions.
60 changes: 55 additions & 5 deletions src/main/java/edu/tamu/app/service/manager/GitHubService.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
package edu.tamu.app.service.manager;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.kohsuke.github.GHIssue;
import org.kohsuke.github.GHLabel;
Expand All @@ -18,13 +23,22 @@
import org.kohsuke.github.GHUser;
import org.kohsuke.github.GitHub;
import org.kohsuke.github.GitHubBuilder;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

import edu.tamu.app.cache.model.Card;
import edu.tamu.app.cache.model.Member;
import edu.tamu.app.cache.model.RemoteProject;
import edu.tamu.app.cache.model.Sprint;
import edu.tamu.app.model.ManagementService;
import edu.tamu.app.model.request.FeatureRequest;
import edu.tamu.app.rest.BasicAuthRestTemplate;
import edu.tamu.app.rest.TokenAuthRestTemplate;

public class GitHubService extends MappingRemoteProjectManagerBean {

Expand All @@ -44,12 +58,15 @@ public class GitHubService extends MappingRemoteProjectManagerBean {

private final Map<String, Member> members;

private final RestTemplate restTemplate;

private GHLabel label;

public GitHubService(final ManagementService managementService) throws IOException {
this.managementService = managementService;
ghBuilder = new GitHubBuilder();
github = getGitHubInstance();
restTemplate = getRestTemplate();
members = new HashMap<String, Member>();
}

Expand Down Expand Up @@ -124,9 +141,14 @@ private String getSettingValue(final String key) {
final Optional<String> setting = managementService.getSettingValue(key);
if (setting.isPresent()) {
return setting.get();
} else {
return null;
}

throw new RuntimeException("No setting " + key + " found in settings for service " + managementService.getName());
}

private RestTemplate getRestTemplate() {
String token = getSettingValue("token");
return StringUtils.isNotBlank(token) ? new TokenAuthRestTemplate(token) : new BasicAuthRestTemplate(getSettingValue("username"), getSettingValue("password"));
}

private RemoteProject buildRemoteProject(GHRepository repo, List<GHLabel> labels) throws IOException {
Expand All @@ -151,6 +173,9 @@ private RemoteProject buildRemoteProject(GHRepository repo, List<GHLabel> labels
private int getPrimaryWorkItemCount(final String type, final GHProject project, final List<GHLabel> labels)
throws IOException {
label = getLabelByName(labels, type);
if (label == null) {
return 0;
}
return project.listColumns()
.asList()
.stream()
Expand Down Expand Up @@ -184,8 +209,11 @@ private long countCardsOnColumn(GHProjectColumn column) {

private boolean cardContainsLabel(GHProjectCard card) {
try {
return card.getContent().getLabels().contains(label);
} catch (IOException e) {
return card.getContent().getLabels().parallelStream()
.filter(cardLabel -> cardLabel.getName().equals(label.getName()))
.findAny()
.isPresent();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
Expand Down Expand Up @@ -244,9 +272,15 @@ protected Member getMember(GHUser user) throws IOException {
member = cachedMember.get();
} else {
String name = user.getName();
String avatarPath = user.getAvatarUrl();
String avatarUrlString = user.getAvatarUrl();
String avatarPath = getAvatarPath(avatarUrlString);
member = new Member(memberId, name, avatarPath);

Optional<URL> avatarUrl = Optional.ofNullable(getClass().getResource("/images/" + avatarPath));
if (!avatarUrl.isPresent()) {
storeAvatar(avatarUrlString);
}

cacheMember(memberId, member);
}
return member;
Expand All @@ -256,6 +290,22 @@ private Optional<Member> getCachedMember(final String id) {
return Optional.ofNullable(members.get(id));
}

private String getAvatarPath(String url) {
return url.substring(url.indexOf("/u/") + 3, url.indexOf("?"));
}

private void storeAvatar(String avatarUrl) throws IOException {
URL imagesPath = getClass().getResource("/images/");
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM));
HttpEntity<String> entity = new HttpEntity<String>(headers);
ResponseEntity<byte[]> response = restTemplate.exchange(avatarUrl, HttpMethod.GET, entity, byte[].class, "1");
if (response.getStatusCode().equals(HttpStatus.OK)) {
File file = new File(imagesPath.getFile() + getAvatarPath(avatarUrl));
Files.write(file.toPath(), response.getBody());
}
}

private void cacheMember(String id, Member member) {
members.put(id, member);
}
Expand Down
39 changes: 32 additions & 7 deletions src/test/java/edu/tamu/app/service/manager/GitHubServiceTest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package edu.tamu.app.service.manager;

import static edu.tamu.app.service.manager.GitHubService.DEFECT_LABEL;
import static edu.tamu.app.service.manager.GitHubService.FEATURE_LABEL;
import static edu.tamu.app.service.manager.GitHubService.ISSUE_LABEL;
import static edu.tamu.app.service.manager.GitHubService.REQUEST_LABEL;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Answers.RETURNS_DEEP_STUBS;
Expand All @@ -8,11 +12,6 @@
import static org.mockito.Mockito.when;
import static org.springframework.test.util.ReflectionTestUtils.setField;

import static edu.tamu.app.service.manager.GitHubService.FEATURE_LABEL;
import static edu.tamu.app.service.manager.GitHubService.DEFECT_LABEL;
import static edu.tamu.app.service.manager.GitHubService.ISSUE_LABEL;
import static edu.tamu.app.service.manager.GitHubService.REQUEST_LABEL;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
Expand Down Expand Up @@ -40,7 +39,12 @@
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.web.client.RestTemplate;

import edu.tamu.app.cache.model.Member;
import edu.tamu.app.cache.model.RemoteProject;
Expand All @@ -67,7 +71,10 @@ public class GitHubServiceTest extends CacheMockTests {
private static final String TEST_FEATURE_REQUEST_TITLE = "Feature request";
private static final String TEST_FEATURE_REQUEST_DESCRIPTION = "Description of feature request";
private static final String TEST_USER1_NAME = "User 1 name";
private static final String TEST_USER1_AVATAR_PATH = "http://example.com/avatar.jpg";
private static final String TEST_USER1_AVATAR_PATH = "https://avatars2.githubusercontent.com/u/1234567?v=4";
private static final String TEST_USER2_AVATAR_PATH = "https://avatars2.githubusercontent.com/u/2222222?v=4";
private static final String TEST_USER3_AVATAR_PATH = "https://avatars2.githubusercontent.com/u/3333333?v=4";
private static final String TEST_USER1_AVATAR_NAME = "1234567";
private static final Long TEST_REPOSITORY1_ID = 1L;
private static final Long TEST_USER1_ID = 3L;

Expand Down Expand Up @@ -104,6 +111,11 @@ public class GitHubServiceTest extends CacheMockTests {

private static final FeatureRequest TEST_FEATURE_REQUEST = mock(FeatureRequest.class);

private static final RestTemplate restTemplate = mock(RestTemplate.class);

@SuppressWarnings("unchecked")
private ResponseEntity<byte[]> response = (ResponseEntity<byte[]>) mock(ResponseEntity.class);

private static final List<GHLabel> ALL_TEST_LABELS = new ArrayList<GHLabel>(
Arrays.asList(new GHLabel[] { TEST_LABEL1, TEST_LABEL2, TEST_LABEL3, TEST_LABEL4, TEST_LABEL5 }));
private static final List<GHLabel> TEST_CARD1_LABELS = new ArrayList<GHLabel>(
Expand Down Expand Up @@ -215,6 +227,8 @@ public void setUp() throws Exception {
when(TEST_USER1.getId()).thenReturn(TEST_USER1_ID);
when(TEST_USER1.getName()).thenReturn(TEST_USER1_NAME);
when(TEST_USER1.getAvatarUrl()).thenReturn(TEST_USER1_AVATAR_PATH);
when(TEST_USER2.getAvatarUrl()).thenReturn(TEST_USER2_AVATAR_PATH);
when(TEST_USER3.getAvatarUrl()).thenReturn(TEST_USER3_AVATAR_PATH);

when(TEST_LABEL1.getName()).thenReturn(REQUEST_LABEL);
when(TEST_LABEL2.getName()).thenReturn(ISSUE_LABEL);
Expand All @@ -226,6 +240,16 @@ public void setUp() throws Exception {
when(TEST_FEATURE_REQUEST.getTitle()).thenReturn(TEST_FEATURE_REQUEST_TITLE);
when(TEST_FEATURE_REQUEST.getDescription()).thenReturn(TEST_FEATURE_REQUEST_DESCRIPTION);

when(restTemplate.exchange(
any(String.class),
any(HttpMethod.class),
Mockito.<HttpEntity<String>>any(),
Mockito.<Class<byte[]>>any(),
Mockito.<Object>anyVararg()))
.thenReturn(response);

when(response.getStatusCode()).thenReturn(HttpStatus.NOT_FOUND);

when(cardTypeRepo.findByMapping(any(String.class))).thenAnswer(new Answer<Optional<CardType>>() {
@Override
public Optional<CardType> answer(InvocationOnMock invocation) {
Expand Down Expand Up @@ -297,6 +321,7 @@ public Optional<Estimate> answer(InvocationOnMock invocation) {
setField(gitHubService, "estimateMappingService", estimateMappingService);
setField(gitHubService, "github", github);
setField(gitHubService, "members", new HashMap<String, Member>());
setField(gitHubService, "restTemplate", restTemplate);
}

@Test
Expand Down Expand Up @@ -337,7 +362,7 @@ public void testGetMember() throws IOException {
Member member = gitHubService.getMember(TEST_USER1);
assertEquals("Member ID is incorrect", String.valueOf(TEST_USER1_ID), member.getId());
assertEquals("Member Name is incorrect", TEST_USER1_NAME, member.getName());
assertEquals("Member Avatar URL is incorrect", TEST_USER1_AVATAR_PATH, member.getAvatar());
assertEquals("Member Avatar URL is incorrect", TEST_USER1_AVATAR_NAME, member.getAvatar());
}

@Test
Expand Down

0 comments on commit 73c5d8b

Please sign in to comment.