package no.difi.datahotel.resources;
import com.sun.jersey.api.core.HttpRequestContext;
import no.difi.datahotel.BaseTest;
import no.difi.datahotel.logic.FieldBean;
import no.difi.datahotel.model.Definition;
import no.difi.datahotel.model.DefinitionLight;
import no.difi.datahotel.model.Metadata;
import no.difi.datahotel.util.DatahotelException;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class DefinitionResourceTest extends BaseTest {
private FieldBean fieldBean;
private DefinitionResource definitionResource;
private UriInfo uriInfo;
private HttpRequestContext httpRequestContext;
private MultivaluedMap<String, String> parameterMap;
@SuppressWarnings("unchecked")
@Before
public void before() throws Exception {
fieldBean = Mockito.mock(FieldBean.class);
parameterMap = Mockito.mock(MultivaluedMap.class);
Mockito.when(parameterMap.containsKey("query")).thenReturn(false);
Mockito.when(parameterMap.containsKey("callback")).thenReturn(false);
Mockito.when(parameterMap.containsKey("page")).thenReturn(false);
uriInfo = Mockito.mock(UriInfo.class);
Mockito.when(uriInfo.getQueryParameters()).thenReturn(parameterMap);
httpRequestContext = Mockito.mock(HttpRequestContext.class);
Mockito.when(httpRequestContext.getHeaderValue(HttpHeaders.IF_NONE_MATCH)).thenReturn(null);
definitionResource = new DefinitionResource();
definitionResource.setFieldEJB(fieldBean);
Field uriInfoField = BaseResource.class.getDeclaredField("uriInfo");
uriInfoField.setAccessible(true);
uriInfoField.set(definitionResource, uriInfo);
Field requestField = BaseResource.class.getDeclaredField("request");
requestField.setAccessible(true);
requestField.set(definitionResource, httpRequestContext);
}
@Test
public void testGetDefinitions() {
List<DefinitionLight> defs = new ArrayList<DefinitionLight>();
defs.add(new DefinitionLight(new Definition()));
Mockito.when(fieldBean.getDefinitions()).thenReturn(defs);
Response response = definitionResource.getDefinitions("xml");
Assert.assertEquals(200, response.getStatus());
}
@Test
public void testGetDefinitionsEmpty() {
Mockito.when(fieldBean.getDefinitions()).thenReturn(new ArrayList<DefinitionLight>());
DatahotelException ex = null;
try {
definitionResource.getDefinitions("xml");
Assert.fail();
} catch (DatahotelException e) {
ex = e;
}
Assert.assertNotNull(ex);
Assert.assertEquals(404, ex.getStatus());
Assert.assertEquals("No definitions available.", ex.getMessage());
}
@Test
public void testGetDefinitionsException() {
Mockito.when(fieldBean.getDefinitions()).thenThrow(new RuntimeException("Catch me!"));
DatahotelException ex = null;
try {
definitionResource.getDefinitions("xml");
Assert.fail();
} catch (DatahotelException e) {
ex = e;
}
Assert.assertNotNull(ex);
Assert.assertEquals(500, ex.getStatus());
Assert.assertEquals("Catch me!", ex.getMessage());
}
@Test
public void testGetDefinitionSimple() {
Metadata metadata = new Metadata();
metadata.setLocation("dataset");
no.difi.datahotel.model.Field field1 = new no.difi.datahotel.model.Field();
field1.setMetadata(metadata);
List<no.difi.datahotel.model.Field> fields = new ArrayList<no.difi.datahotel.model.Field>();
fields.add(field1);
Mockito.when(fieldBean.getUsage("def1")).thenReturn(fields);
Response response = definitionResource.getDefinition("xml", "def1");
Assert.assertNotNull(response);
Assert.assertEquals(200, response.getStatus());
Assert.assertTrue(response.getEntity().toString().contains("dataset"));
}
@Test
public void testGetDefinitionDuplicate() {
Metadata metadata = new Metadata();
metadata.setLocation("dataset");
no.difi.datahotel.model.Field field1 = new no.difi.datahotel.model.Field();
field1.setMetadata(metadata);
no.difi.datahotel.model.Field field2 = new no.difi.datahotel.model.Field();
field2.setMetadata(metadata);
List<no.difi.datahotel.model.Field> fields = new ArrayList<no.difi.datahotel.model.Field>();
fields.add(field1);
fields.add(field2);
Mockito.when(fieldBean.getUsage("def1")).thenReturn(fields);
Response response = definitionResource.getDefinition("xml", "def1");
Assert.assertNotNull(response);
Assert.assertEquals(200, response.getStatus());
Assert.assertFalse(response.getEntity().toString().replaceFirst("dataset", "").contains("dataset"));
}
@Test
public void testGetDefinitionEmpty() {
Mockito.when(fieldBean.getUsage("field1")).thenReturn(new ArrayList<no.difi.datahotel.model.Field>());
DatahotelException ex = null;
try {
definitionResource.getDefinition("xml", "field1");
Assert.fail();
} catch (DatahotelException e) {
ex = e;
}
Assert.assertNotNull(ex);
Assert.assertEquals(404, ex.getStatus());
Assert.assertEquals("Definition never used.", ex.getMessage());
}
@Test
public void testGetDefinitionException() {
Mockito.when(fieldBean.getUsage("field1")).thenThrow(new RuntimeException("Catch me!"));
DatahotelException ex = null;
try {
definitionResource.getDefinition("xml", "field1");
Assert.fail();
} catch (DatahotelException e) {
ex = e;
}
Assert.assertNotNull(ex);
Assert.assertEquals(500, ex.getStatus());
Assert.assertEquals("Catch me!", ex.getMessage());
}
}