package com.ctrip.framework.apollo.openapi.util;
import com.google.common.util.concurrent.SettableFuture;
import com.ctrip.framework.apollo.openapi.entity.ConsumerAudit;
import com.ctrip.framework.apollo.openapi.service.ConsumerService;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.runners.MockitoJUnitRunner;
import org.mockito.stubbing.Answer;
import org.springframework.test.util.ReflectionTestUtils;
import java.util.List;
import java.util.concurrent.TimeUnit;
import javax.servlet.http.HttpServletRequest;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.anyCollectionOf;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.when;
/**
* @author Jason Song(song_s@ctrip.com)
*/
@RunWith(MockitoJUnitRunner.class)
public class ConsumerAuditUtilTest {
private ConsumerAuditUtil consumerAuditUtil;
@Mock
private ConsumerService consumerService;
@Mock
private HttpServletRequest request;
private long batchTimeout = 50;
private TimeUnit batchTimeUnit = TimeUnit.MILLISECONDS;
@Before
public void setUp() throws Exception {
consumerAuditUtil = new ConsumerAuditUtil();
ReflectionTestUtils.setField(consumerAuditUtil, "consumerService", consumerService);
ReflectionTestUtils.setField(consumerAuditUtil, "BATCH_TIMEOUT", batchTimeout);
ReflectionTestUtils.setField(consumerAuditUtil, "BATCH_TIMEUNIT", batchTimeUnit);
consumerAuditUtil.afterPropertiesSet();
}
@After
public void tearDown() throws Exception {
consumerAuditUtil.stopAudit();
}
@Test
public void audit() throws Exception {
long someConsumerId = 1;
String someUri = "someUri";
String someQuery = "someQuery";
String someMethod = "someMethod";
when(request.getRequestURI()).thenReturn(someUri);
when(request.getQueryString()).thenReturn(someQuery);
when(request.getMethod()).thenReturn(someMethod);
SettableFuture<List<ConsumerAudit>> result = SettableFuture.create();
doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
Object[] args = invocation.getArguments();
result.set((List<ConsumerAudit>) args[0]);
return null;
}
}).when(consumerService).createConsumerAudits(anyCollectionOf(ConsumerAudit.class));
consumerAuditUtil.audit(request, someConsumerId);
List<ConsumerAudit> audits = result.get(batchTimeout * 5, batchTimeUnit);
assertEquals(1, audits.size());
ConsumerAudit audit = audits.get(0);
assertEquals(String.format("%s?%s", someUri, someQuery), audit.getUri());
assertEquals(someMethod, audit.getMethod());
assertEquals(someConsumerId, audit.getConsumerId());
}
}