001/*
002 * The contents of this file are subject to the license and copyright
003 * detailed in the LICENSE and NOTICE files at the root of the source
004 * tree.
005 */
006package org.fcrepo.client;
007
008import static java.net.URI.create;
009import static org.fcrepo.client.FedoraHeaderConstants.CONTENT_TYPE;
010import static org.fcrepo.client.FedoraHeaderConstants.IF_STATE_TOKEN;
011import static org.fcrepo.client.FedoraHeaderConstants.LINK;
012import static org.fcrepo.client.TestUtils.baseUrl;
013import static org.junit.Assert.assertEquals;
014import static org.mockito.ArgumentMatchers.any;
015import static org.mockito.ArgumentMatchers.eq;
016import static org.mockito.Mockito.mock;
017import static org.mockito.Mockito.verify;
018import static org.mockito.Mockito.when;
019
020import java.io.InputStream;
021import java.net.URI;
022
023import org.apache.http.HttpEntity;
024import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
025import org.apache.http.client.methods.HttpRequestBase;
026import org.junit.Before;
027import org.junit.Test;
028import org.junit.runner.RunWith;
029import org.mockito.ArgumentCaptor;
030import org.mockito.Captor;
031import org.mockito.Mock;
032import org.mockito.junit.MockitoJUnitRunner;
033
034/**
035 * @author bbpennel
036 */
037@RunWith(MockitoJUnitRunner.class)
038public class PatchBuilderTest {
039
040    @Mock
041    private FcrepoClient client;
042
043    @Mock
044    private FcrepoResponse fcrepoResponse;
045
046    @Captor
047    private ArgumentCaptor<HttpRequestBase> requestCaptor;
048
049    private PatchBuilder testBuilder;
050
051    private URI uri;
052
053    @Before
054    public void setUp() throws Exception {
055        when(client.executeRequest(any(URI.class), any(HttpRequestBase.class)))
056                .thenReturn(fcrepoResponse);
057
058        uri = create(baseUrl);
059        testBuilder = new PatchBuilder(uri, client);
060    }
061
062    @Test
063    public void testWithBodyDefaultType() throws Exception {
064        final InputStream bodyStream = mock(InputStream.class);
065
066        testBuilder.body(bodyStream)
067                .perform();
068
069        verify(client).executeRequest(eq(uri), requestCaptor.capture());
070
071        final HttpEntityEnclosingRequestBase request = (HttpEntityEnclosingRequestBase) requestCaptor.getValue();
072        final HttpEntity bodyEntity = request.getEntity();
073        assertEquals(bodyStream, bodyEntity.getContent());
074
075        assertEquals("application/sparql-update", request.getFirstHeader(CONTENT_TYPE).getValue());
076    }
077
078    @Test
079    public void testWithBodyCustomType() throws Exception {
080        final InputStream bodyStream = mock(InputStream.class);
081
082        testBuilder.body(bodyStream, "text/plain")
083                .perform();
084
085        verify(client).executeRequest(eq(uri), requestCaptor.capture());
086
087        final HttpEntityEnclosingRequestBase request = (HttpEntityEnclosingRequestBase) requestCaptor.getValue();
088        final HttpEntity bodyEntity = request.getEntity();
089        assertEquals(bodyStream, bodyEntity.getContent());
090
091        assertEquals("text/plain", request.getFirstHeader(CONTENT_TYPE).getValue());
092    }
093
094    @Test
095    public void testStateToken() throws Exception {
096        final InputStream bodyStream = mock(InputStream.class);
097        final String token = "state";
098
099        testBuilder.body(bodyStream)
100                .ifStateToken(token)
101                .perform();
102
103        verify(client).executeRequest(eq(uri), requestCaptor.capture());
104
105        final HttpEntityEnclosingRequestBase request = (HttpEntityEnclosingRequestBase) requestCaptor.getValue();
106        assertEquals(token, request.getFirstHeader(IF_STATE_TOKEN).getValue());
107    }
108
109    @Test
110    public void testAddHeader() throws Exception {
111        testBuilder.addHeader("my-header", "head-val").perform();
112
113        verify(client).executeRequest(eq(uri), requestCaptor.capture());
114        final HttpRequestBase request = requestCaptor.getValue();
115        assertEquals("head-val", request.getFirstHeader("my-header").getValue());
116    }
117
118    @Test
119    public void testAddLinkHeader() throws Exception {
120        final FcrepoLink link = FcrepoLink.fromUri("http://example.com/link").type("foo").build();
121        testBuilder.addLinkHeader(link).perform();
122
123        verify(client).executeRequest(eq(uri), requestCaptor.capture());
124        final HttpRequestBase request = requestCaptor.getValue();
125        assertEquals(link.toString(), request.getFirstHeader(LINK).getValue());
126    }
127}