package de.otto.hmac.authentication;
import de.otto.hmac.HmacAttributes;
import org.testng.annotations.Test;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URISyntaxException;
import java.time.Clock;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyByte;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.when;
import static org.testng.AssertJUnit.assertEquals;
public class WrappedOutputStreamTest {
@Test
public void shouldNotWriteOutputStreamOnWriteMethods() throws IOException {
// setup
WrappedOutputStreamContext clientRequestMock = mock(WrappedOutputStreamContext.class);
OutputStream outputStreamMock = mock(OutputStream.class);
WrappedOutputStream wrapper =
new WrappedOutputStream("user", "secretKey", clientRequestMock, outputStreamMock, Clock.systemUTC());
// test
wrapper.write(new String("br").getBytes(), 0, 2);
wrapper.write(new String("br").getBytes());
wrapper.write((byte) 10);
verify(outputStreamMock, never()).write((byte[]) any(), anyInt(), anyInt());
verify(outputStreamMock, never()).write((byte[]) any());
verify(outputStreamMock, never()).write(anyByte());
}
@Test
public void shouldWriteOutputStreamOnFlush() throws IOException, URISyntaxException {
// setup
WrappedOutputStreamContext clientRequestMock = mock(WrappedOutputStreamContext.class);
when(clientRequestMock.getMethod()).thenReturn("GET");
when(clientRequestMock.getRequestUri()).thenReturn("/test");
ByteArrayOutputStream outputStreamMock = new ByteArrayOutputStream();
WrappedOutputStream wrapper =
new WrappedOutputStream("user", "secretKey", clientRequestMock, outputStreamMock, Clock.systemUTC());
// test
wrapper.write(new String("br").getBytes(), 0, 2);
wrapper.write(new String("br").getBytes());
wrapper.write((byte) 10);
wrapper.close();
assertEquals(new byte[] {(byte) 'b', (byte) 'r', (byte) 'b', (byte) 'r', (byte) 10}, outputStreamMock.toByteArray());
verify(clientRequestMock).putSingle(eq(HmacAttributes.X_HMAC_AUTH_SIGNATURE), anyString());
verify(clientRequestMock).putSingle(eq(HmacAttributes.X_HMAC_AUTH_DATE), anyString());
}
}