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.TestUtils.baseUrl; 010import static org.junit.Assert.assertEquals; 011import static org.mockito.ArgumentMatchers.any; 012import static org.mockito.ArgumentMatchers.eq; 013import static org.mockito.Mockito.verify; 014import static org.mockito.Mockito.when; 015import static org.fcrepo.client.FedoraHeaderConstants.MEMENTO_DATETIME; 016import static org.fcrepo.client.HeaderHelpers.UTC_RFC_1123_FORMATTER; 017 018import java.net.URI; 019import java.time.Instant; 020import java.time.LocalDateTime; 021import java.time.ZoneOffset; 022import java.time.format.DateTimeParseException; 023 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 HistoricMementoBuilderTest { 039 040 private final String HISTORIC_DATETIME = 041 UTC_RFC_1123_FORMATTER.format(LocalDateTime.of(2000, 1, 1, 0, 0).atZone(ZoneOffset.UTC)); 042 043 @Mock 044 private FcrepoClient client; 045 046 @Mock 047 private FcrepoResponse fcrepoResponse; 048 049 @Captor 050 private ArgumentCaptor<HttpRequestBase> requestCaptor; 051 052 private HistoricMementoBuilder testBuilder; 053 054 private URI uri; 055 056 @Before 057 public void setUp() throws Exception { 058 when(client.executeRequest(any(URI.class), any(HttpRequestBase.class))) 059 .thenReturn(fcrepoResponse); 060 061 uri = create(baseUrl); 062 } 063 064 @Test 065 public void testCreateWithInstantHeader() throws Exception { 066 final Instant datetime = LocalDateTime.of(2000, 1, 1, 00, 00).atZone(ZoneOffset.UTC).toInstant(); 067 068 testBuilder = new HistoricMementoBuilder(uri, client, datetime); 069 testBuilder.perform(); 070 071 verify(client).executeRequest(eq(uri), requestCaptor.capture()); 072 073 final HttpEntityEnclosingRequestBase request = (HttpEntityEnclosingRequestBase) requestCaptor.getValue(); 074 assertEquals(HISTORIC_DATETIME, request.getFirstHeader(MEMENTO_DATETIME).getValue()); 075 } 076 077 @Test 078 public void testCreateWithStringMementoDatetime() throws Exception { 079 testBuilder = new HistoricMementoBuilder(uri, client, HISTORIC_DATETIME); 080 testBuilder.perform(); 081 082 verify(client).executeRequest(eq(uri), requestCaptor.capture()); 083 084 final HttpEntityEnclosingRequestBase request = (HttpEntityEnclosingRequestBase) requestCaptor.getValue(); 085 assertEquals(HISTORIC_DATETIME, request.getFirstHeader(MEMENTO_DATETIME).getValue()); 086 } 087 088 @Test(expected = NullPointerException.class) 089 public void testCreateWithNoDatetime() throws Exception { 090 testBuilder = new HistoricMementoBuilder(uri, client, (String) null); 091 testBuilder.perform(); 092 } 093 094 @Test(expected = DateTimeParseException.class) 095 public void testCreateWithNonRFC1123() throws Exception { 096 final String mementoDatetime = Instant.now().toString(); 097 testBuilder = new HistoricMementoBuilder(uri, client, mementoDatetime); 098 testBuilder.perform(); 099 } 100}