package sagan.team.support;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentMatcher;
import org.mockito.BDDMockito.BDDMyOngoingStubbing;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.social.github.api.GitHub;
import org.springframework.social.github.api.GitHubUserProfile;
import org.springframework.social.github.api.UserOperations;
import org.springframework.web.client.RestOperations;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.mockito.BDDMockito.given;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.argThat;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class SignInServiceTests {
@Mock
private GitHub gitHub;
@Mock
private TeamService teamService;
private SignInService signInService;
private String username = "user";
private String name = "Full Name";
private String location = "London";
private String email = "user@example.com";
private String avatarUrl = "http://gravatar.com/avatar/ABC";
@Before
public void setup() {
signInService = new SignInService(teamService, "482984");
}
@Test
public void createOrUpdateMemberProfileOnLogin() {
GitHubUserProfile userProfile =
new GitHubUserProfile(1234L, username, name, location, "", "", email, avatarUrl, null);
UserOperations userOperations = mock(UserOperations.class);
given(userOperations.getUserProfile()).willReturn(userProfile);
given(gitHub.userOperations()).willReturn(userOperations);
signInService.getOrCreateMemberProfile(1234L, gitHub);
verify(teamService).createOrUpdateMemberProfile(1234L, username, avatarUrl, name);
}
@Test
public void isSpringMember() {
mockIsMemberOfTeam(true);
assertThat(signInService.isSpringMember("member", gitHub), is(true));
}
@Test
public void isNotSpringMember() {
mockIsMemberOfTeam(false);
assertThat(signInService.isSpringMember("notmember", gitHub), is(false));
}
private void mockIsMemberOfTeam(boolean isMember) {
RestOperations restOperations = mock(RestOperations.class);
given(gitHub.restOperations()).willReturn(restOperations);
BDDMyOngoingStubbing<ResponseEntity<Void>> expectedResult =
given(restOperations.getForEntity(anyString(), argThat(new ArgumentMatcher<Class<Void>>() {
@Override
public boolean matches(Object argument) {
return true;
}
}), anyString(), anyString()));
HttpStatus statusCode = isMember ? HttpStatus.NO_CONTENT : HttpStatus.NOT_FOUND;
expectedResult.willReturn(new ResponseEntity<>(statusCode));
}
}