package org.dcache.webdav.federation;
import io.milton.http.Request;
import org.junit.Test;
import java.util.Map;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
public class QueryStringInfoTests
{
@Test
public void shouldNotHaveNextWhenNoParameters()
{
Map<String,String> parameters = mock(Map.class);
Request request = mock(Request.class);
given(request.getParams()).willReturn(parameters);
ReplicaInfo info = ReplicaInfo.forRequest(request);
assertThat(info.hasNext(), is(false));
}
@Test
public void shouldNotHaveNextWhenOnlyRid()
{
Map<String,String> parameters = mock(Map.class);
given(parameters.get("rid")).willReturn("5");
Request request = mock(Request.class);
given(request.getParams()).willReturn(parameters);
ReplicaInfo info = ReplicaInfo.forRequest(request);
assertThat(info.hasNext(), is(false));
}
@Test
public void shouldNotHaveNextWhenOnlyR1()
{
Map<String,String> parameters = mock(Map.class);
given(parameters.get("r1")).willReturn("7,http://www.example.org/a/file");
Request request = mock(Request.class);
given(request.getParams()).willReturn(parameters);
ReplicaInfo info = ReplicaInfo.forRequest(request);
assertThat(info.hasNext(), is(false));
}
@Test
public void shouldWorkWhenNotFoundAndFirstInStackWithOneExtraReplica()
{
Map<String,String> parameters = mock(Map.class);
given(parameters.get("rid")).willReturn("5");
given(parameters.get("r1")).willReturn("7,http://www.example.org/a/file");
Request request = mock(Request.class);
given(request.getParams()).willReturn(parameters);
ReplicaInfo info = ReplicaInfo.forRequest(request);
assertThat(info.hasNext(), is(true));
assertThat(info.buildLocationWhenNotFound(),
is("http://www.example.org/a/file?rid=7¬found=5"));
}
@Test
public void shouldWorkWhenForbiddenAndFirstInStackWithOneExtraReplica()
{
Map<String,String> parameters = mock(Map.class);
given(parameters.get("rid")).willReturn("9");
given(parameters.get("r1")).willReturn("4,http://www.example.org/a/file");
Request request = mock(Request.class);
given(request.getParams()).willReturn(parameters);
ReplicaInfo info = ReplicaInfo.forRequest(request);
assertThat(info.hasNext(), is(true));
assertThat(info.buildLocationWhenForbidden(),
is("http://www.example.org/a/file?rid=4&forbidden=9"));
}
@Test
public void shouldWorkWhenNotFoundAndAlreadyNotFoundWithOneExtra()
{
Map<String,String> parameters = mock(Map.class);
given(parameters.get("rid")).willReturn("9");
given(parameters.get("notfound")).willReturn("1");
given(parameters.get("r1")).willReturn("4,http://www.example.org/a/file");
Request request = mock(Request.class);
given(request.getParams()).willReturn(parameters);
ReplicaInfo info = ReplicaInfo.forRequest(request);
assertThat(info.hasNext(), is(true));
assertThat(info.buildLocationWhenNotFound(),
is("http://www.example.org/a/file?rid=4¬found=1,9"));
}
@Test
public void shouldWorkWhenForbiddenAndAlreadyMissingWithOneExtra()
{
Map<String,String> parameters = mock(Map.class);
given(parameters.get("rid")).willReturn("9");
given(parameters.get("notfound")).willReturn("1");
given(parameters.get("r1")).willReturn("4,http://www.example.org/a/file");
Request request = mock(Request.class);
given(request.getParams()).willReturn(parameters);
ReplicaInfo info = ReplicaInfo.forRequest(request);
assertThat(info.hasNext(), is(true));
assertThat(info.buildLocationWhenForbidden(),
is("http://www.example.org/a/file?rid=4&forbidden=9¬found=1"));
}
@Test
public void shouldWorkWhenNotFoundAndAlreadyForbiddenWithOneExtra()
{
Map<String,String> parameters = mock(Map.class);
given(parameters.get("rid")).willReturn("9");
given(parameters.get("forbidden")).willReturn("1");
given(parameters.get("r1")).willReturn("4,http://www.example.org/a/file");
Request request = mock(Request.class);
given(request.getParams()).willReturn(parameters);
ReplicaInfo info = ReplicaInfo.forRequest(request);
assertThat(info.hasNext(), is(true));
assertThat(info.buildLocationWhenNotFound(),
is("http://www.example.org/a/file?rid=4&forbidden=1¬found=9"));
}
@Test
public void shouldWorkWhenForbiddenAndAlreadyForbiddenWithOneExtra()
{
Map<String,String> parameters = mock(Map.class);
given(parameters.get("rid")).willReturn("9");
given(parameters.get("forbidden")).willReturn("1");
given(parameters.get("r1")).willReturn("4,http://www.example.org/a/file");
Request request = mock(Request.class);
given(request.getParams()).willReturn(parameters);
ReplicaInfo info = ReplicaInfo.forRequest(request);
assertThat(info.hasNext(), is(true));
assertThat(info.buildLocationWhenForbidden(),
is("http://www.example.org/a/file?rid=4&forbidden=1,9"));
}
@Test
public void shouldWorkWhenForbiddenAndAlreadyNotFoundAndForbiddenWithOneExtra()
{
Map<String,String> parameters = mock(Map.class);
given(parameters.get("rid")).willReturn("9");
given(parameters.get("forbidden")).willReturn("1");
given(parameters.get("notfound")).willReturn("2");
given(parameters.get("r1")).willReturn("4,http://www.example.org/a/file");
Request request = mock(Request.class);
given(request.getParams()).willReturn(parameters);
ReplicaInfo info = ReplicaInfo.forRequest(request);
assertThat(info.hasNext(), is(true));
assertThat(info.buildLocationWhenForbidden(),
is("http://www.example.org/a/file?rid=4&forbidden=1,9¬found=2"));
}
@Test
public void shouldWorkWhenNotFoundAndAlreadyNotFoundAndForbiddenWithOneExtra()
{
Map<String,String> parameters = mock(Map.class);
given(parameters.get("rid")).willReturn("9");
given(parameters.get("forbidden")).willReturn("1");
given(parameters.get("notfound")).willReturn("2");
given(parameters.get("r1")).willReturn("4,http://www.example.org/a/file");
Request request = mock(Request.class);
given(request.getParams()).willReturn(parameters);
ReplicaInfo info = ReplicaInfo.forRequest(request);
assertThat(info.hasNext(), is(true));
assertThat(info.buildLocationWhenNotFound(),
is("http://www.example.org/a/file?rid=4&forbidden=1¬found=2,9"));
}
@Test
public void shouldWorkWhenNotFoundAndTwoExtra()
{
Map<String,String> parameters = mock(Map.class);
given(parameters.get("rid")).willReturn("9");
given(parameters.get("r1")).willReturn("4,http://www.example.org/a/file");
given(parameters.get("r2")).willReturn("6,http://www.example.com/my/file");
Request request = mock(Request.class);
given(request.getParams()).willReturn(parameters);
ReplicaInfo info = ReplicaInfo.forRequest(request);
assertThat(info.hasNext(), is(true));
assertThat(info.buildLocationWhenNotFound(),
is("http://www.example.org/a/file?rid=4¬found=9&"
+ "r1=6,http://www.example.com/my/file"));
}
@Test
public void shouldWorkWhenNotFoundAndThreeExtra()
{
Map<String,String> parameters = mock(Map.class);
given(parameters.get("rid")).willReturn("9");
given(parameters.get("r1")).willReturn("4,http://www.example.org/a/file");
given(parameters.get("r2")).willReturn("6,http://www.example.com/my/file");
given(parameters.get("r3")).willReturn("13,http://www.example.net/another/file");
Request request = mock(Request.class);
given(request.getParams()).willReturn(parameters);
ReplicaInfo info = ReplicaInfo.forRequest(request);
assertThat(info.hasNext(), is(true));
assertThat(info.buildLocationWhenNotFound(),
is("http://www.example.org/a/file?rid=4¬found=9&"
+ "r1=6,http://www.example.com/my/file&"
+ "r2=13,http://www.example.net/another/file"));
}
}