package sagan.team.support;
import sagan.support.Fixtures;
import sagan.team.MemberProfile;
import saganx.AbstractIntegrationTests;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.social.github.api.GitHub;
import org.springframework.social.github.api.GitHubUser;
import org.springframework.web.client.RestOperations;
import com.fasterxml.jackson.databind.ObjectMapper;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
public class ImportTeamFromGithubTests extends AbstractIntegrationTests {
@Autowired
private TeamRepository teamRepository;
@Autowired
private TeamImporter teamImporter;
private GitHub gitHub = mock(GitHub.class);
private ObjectMapper mapper = new ObjectMapper();
@Before
public void setUp() throws Exception {
RestOperations restOperations = mock(RestOperations.class);
given(gitHub.restOperations()).willReturn(restOperations);
String membersJson = Fixtures.load("/fixtures/github/ghTeamInfo.json");
GitHubUser[] gitHubUsers = mapper.readValue(membersJson, GitHubUser[].class);
ResponseEntity<GitHubUser[]> responseEntity = new ResponseEntity<>(gitHubUsers, HttpStatus.OK);
given(
restOperations.getForEntity("https://api.github.com/teams/{teamId}/members?per_page=100", GitHubUser[].class,
"482984")).willReturn(responseEntity);
given(restOperations.getForObject("https://api.github.com/users/{user}", GitHubUser.class, "jdoe"))
.willReturn(mapper.readValue(Fixtures.load("/fixtures/github/ghUserProfile-jdoe.json"), GitHubUser.class));
given(restOperations.getForObject("https://api.github.com/users/{user}", GitHubUser.class, "asmith"))
.willReturn(mapper.readValue(Fixtures.load("/fixtures/github/ghUserProfile-asmith.json"), GitHubUser.class));
}
@Test
public void importAddsNewTeamMembersAndSetsThemToBeHidden() throws Exception {
teamImporter.importTeamMembers(gitHub);
MemberProfile john = teamRepository.findByGithubId(123L);
assertThat(john, not(nullValue()));
assertThat(john.getGithubUsername(), equalTo("jdoe"));
assertThat(john.getUsername(), equalTo("jdoe"));
assertThat(john.getName(), equalTo("John Doe"));
assertThat(john.isHidden(), equalTo(true));
MemberProfile adam = teamRepository.findByGithubId(987L);
assertThat(adam, not(nullValue()));
assertThat(adam.getGithubUsername(), equalTo("asmith"));
assertThat(adam.getName(), equalTo("Adam Smith"));
assertThat(adam.isHidden(), equalTo(true));
}
@Test
public void importUpdatesExistingTeamMembersGithubUsername() throws Exception {
MemberProfile profile = new MemberProfile();
profile.setGithubId(123L);
profile.setGithubUsername("oldusername");
profile.setUsername("oldusername");
teamRepository.save(profile);
teamImporter.importTeamMembers(gitHub);
MemberProfile updatedProfile = teamRepository.findByGithubId(123L);
assertThat(updatedProfile, not(nullValue()));
assertThat(updatedProfile.getGithubUsername(), equalTo("jdoe"));
assertThat(updatedProfile.getUsername(), equalTo("oldusername"));
assertThat(updatedProfile.isHidden(), equalTo(false));
}
@Test
public void importHidesActiveMembersNoLongerOnTheTeam() throws Exception {
MemberProfile profile = new MemberProfile();
profile.setGithubId(456L);
profile.setGithubUsername("quitter");
profile.setUsername("quitter");
profile.setHidden(false);
teamRepository.save(profile);
teamImporter.importTeamMembers(gitHub);
MemberProfile updatedProfile = teamRepository.findByGithubId(456L);
assertThat(updatedProfile, not(nullValue()));
assertThat(updatedProfile.getGithubUsername(), equalTo("quitter"));
assertThat(updatedProfile.isHidden(), equalTo(true));
}
@Test
public void importHidesActiveMembersNoLongerOnTheTeamWithoutAGithubId() throws Exception {
MemberProfile profile = new MemberProfile();
profile.setGithubUsername("quitter");
profile.setUsername("quitter");
profile.setHidden(false);
teamRepository.save(profile);
teamImporter.importTeamMembers(gitHub);
MemberProfile updatedProfile = teamRepository.findByUsername("quitter");
assertThat(updatedProfile, not(nullValue()));
assertThat(updatedProfile.isHidden(), equalTo(true));
}
}