package com.ctrip.framework.apollo.portal.spi.ctrip;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.ctrip.framework.apollo.portal.AbstractUnitTest;
import com.ctrip.framework.apollo.portal.component.config.PortalConfig;
import com.ctrip.framework.apollo.portal.entity.bo.UserInfo;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.test.util.ReflectionTestUtils;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.RestTemplate;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.when;
/**
* @author Jason Song(song_s@ctrip.com)
*/
public class CtripUserServiceTest extends AbstractUnitTest{
private CtripUserService ctripUserService;
private String someUserServiceUrl;
private String someUserServiceToken;
private ParameterizedTypeReference<Map<String, List<CtripUserService.UserServiceResponse>>>
someResponseType;
@Mock
private PortalConfig portalConfig;
@Mock
private RestTemplate restTemplate;
@Before
public void setUp() throws Exception {
when(portalConfig.connectTimeout()).thenReturn(3000);
when(portalConfig.readTimeout()).thenReturn(3000);
ctripUserService = new CtripUserService(portalConfig);
ReflectionTestUtils.setField(ctripUserService, "restTemplate", restTemplate);
someResponseType =
(ParameterizedTypeReference<Map<String, List<CtripUserService.UserServiceResponse>>>) ReflectionTestUtils
.getField(ctripUserService, "responseType");
someUserServiceUrl = "http://someurl";
someUserServiceToken = "someToken";
when(portalConfig.userServiceUrl()).thenReturn(someUserServiceUrl);
when(portalConfig.userServiceAccessToken()).thenReturn(someUserServiceToken);
}
@Test
public void testAssembleSearchUserRequest() throws Exception {
String someKeyword = "someKeyword";
int someOffset = 0;
int someLimit = 10;
CtripUserService.UserServiceRequest request =
ctripUserService.assembleSearchUserRequest(someKeyword, someOffset, someLimit);
assertEquals(someUserServiceToken, request.getAccess_token());
CtripUserService.UserServiceRequestBody requestBody = request.getRequest_body();
assertEquals("itdb_emloyee", requestBody.getIndexAlias());
Map<String, Object> queryJson = requestBody.getQueryJson();
assertEquals(someOffset, queryJson.get("from"));
assertEquals(someLimit, queryJson.get("size"));
Map<String, Object> query = (Map<String, Object>) queryJson.get("query");
Map<String, Object> multiMatchMap = (Map<String, Object>) query.get("multi_match");
assertEquals(someKeyword, multiMatchMap.get("query"));
}
@Test
public void testAssembleFindUserRequest() throws Exception {
String someUserId = "someUser";
String anotherUserId = "anotherUser";
List<String> userIds = Lists.newArrayList(someUserId, anotherUserId);
CtripUserService.UserServiceRequest request = ctripUserService.assembleFindUserRequest(userIds);
assertEquals(someUserServiceToken, request.getAccess_token());
CtripUserService.UserServiceRequestBody requestBody = request.getRequest_body();
assertEquals("itdb_emloyee", requestBody.getIndexAlias());
Map<String, Object> queryJson = requestBody.getQueryJson();
assertEquals(0, queryJson.get("from"));
assertEquals(2, queryJson.get("size"));
Map<String, Object> query = (Map<String, Object>) queryJson.get("query");
Map<String, Object> terms =
getMapFromMap(getMapFromMap(getMapFromMap(query, "filtered"), "filter"), "terms");
List<String> userIdTerms = (List<String>) terms.get("empaccount");
assertTrue(userIdTerms.containsAll(userIds));
}
private Map<String, Object> getMapFromMap(Map<String, Object> map, String key) {
return (Map<String, Object>) map.get(key);
}
@Test
public void testSearchUsers() throws Exception {
String someUserId = "someUserId";
String someName = "someName";
String someEmail = "someEmail";
String anotherUserId = "anotherUserId";
String anotherName = "anotherName";
String anotherEmail = "anotherEmail";
String someKeyword = "someKeyword";
int someOffset = 0;
int someLimit = 10;
CtripUserService.UserServiceResponse someUserResponse =
assembleUserServiceResponse(someUserId, someName, someEmail);
CtripUserService.UserServiceResponse anotherUserResponse =
assembleUserServiceResponse(anotherUserId, anotherName, anotherEmail);
Map<String, List<CtripUserService.UserServiceResponse>> resultMap =
ImmutableMap.of("result", Lists.newArrayList(someUserResponse, anotherUserResponse));
ResponseEntity<Map<String, List<CtripUserService.UserServiceResponse>>> someResponse
= new ResponseEntity<>(resultMap, HttpStatus.OK);
when(restTemplate.exchange(eq(someUserServiceUrl), eq(HttpMethod.POST), any(HttpEntity.class),
eq(someResponseType))).thenReturn(someResponse);
List<UserInfo> users = ctripUserService.searchUsers(someKeyword, someOffset, someLimit);
assertEquals(2, users.size());
compareUserInfoAndUserServiceResponse(someUserResponse, users.get(0));
compareUserInfoAndUserServiceResponse(anotherUserResponse, users.get(1));
}
@Test(expected = HttpClientErrorException.class)
public void testSearchUsersWithError() throws Exception {
when(restTemplate.exchange(eq(someUserServiceUrl), eq(HttpMethod.POST), any(HttpEntity.class),
eq(someResponseType)))
.thenThrow(new HttpClientErrorException(HttpStatus.INTERNAL_SERVER_ERROR));
String someKeyword = "someKeyword";
int someOffset = 0;
int someLimit = 10;
ctripUserService.searchUsers(someKeyword, someOffset, someLimit);
}
@Test
public void testFindByUserId() throws Exception {
String someUserId = "someUserId";
String someName = "someName";
String someEmail = "someEmail";
CtripUserService.UserServiceResponse someUserResponse =
assembleUserServiceResponse(someUserId, someName, someEmail);
Map<String, List<CtripUserService.UserServiceResponse>> resultMap =
ImmutableMap.of("result", Lists.newArrayList(someUserResponse));
ResponseEntity<Map<String, List<CtripUserService.UserServiceResponse>>> someResponse
= new ResponseEntity<>(resultMap, HttpStatus.OK);
when(restTemplate.exchange(eq(someUserServiceUrl), eq(HttpMethod.POST), any(HttpEntity.class),
eq(someResponseType))).thenReturn(someResponse);
UserInfo user = ctripUserService.findByUserId(someUserId);
compareUserInfoAndUserServiceResponse(someUserResponse, user);
}
@Test
public void testFindByUserIds() throws Exception {
String someUserId = "someUserId";
String someName = "someName";
String someEmail = "someEmail";
String anotherUserId = "anotherUserId";
String anotherName = "anotherName";
String anotherEmail = "anotherEmail";
String someKeyword = "someKeyword";
CtripUserService.UserServiceResponse someUserResponse =
assembleUserServiceResponse(someUserId, someName, someEmail);
CtripUserService.UserServiceResponse anotherUserResponse =
assembleUserServiceResponse(anotherUserId, anotherName, anotherEmail);
Map<String, List<CtripUserService.UserServiceResponse>> resultMap =
ImmutableMap.of("result", Lists.newArrayList(someUserResponse, anotherUserResponse));
ResponseEntity<Map<String, List<CtripUserService.UserServiceResponse>>> someResponse
= new ResponseEntity<>(resultMap, HttpStatus.OK);
when(restTemplate.exchange(eq(someUserServiceUrl), eq(HttpMethod.POST), any(HttpEntity.class),
eq(someResponseType))).thenReturn(someResponse);
List<UserInfo> users =
ctripUserService.findByUserIds(Lists.newArrayList(someUserId, anotherUserId));
assertEquals(2, users.size());
compareUserInfoAndUserServiceResponse(someUserResponse, users.get(0));
compareUserInfoAndUserServiceResponse(anotherUserResponse, users.get(1));
}
private void compareUserInfoAndUserServiceResponse(
CtripUserService.UserServiceResponse userServiceReponse, UserInfo userInfo) {
assertEquals(userServiceReponse.getEmpaccount(), userInfo.getUserId());
assertEquals(userServiceReponse.getDisplayname(), userInfo.getName());
assertEquals(userServiceReponse.getEmail(), userInfo.getEmail());
}
private CtripUserService.UserServiceResponse assembleUserServiceResponse(String userId,
String name,
String email) {
CtripUserService.UserServiceResponse response = new CtripUserService.UserServiceResponse();
response.setEmpaccount(userId);
response.setDisplayname(name);
response.setEmail(email);
return response;
}
}