package eu.dnetlib.api.client;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.apache.http.client.utils.URIBuilder;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.junit.Before;
import org.junit.Test;

import eu.dnetlib.api.utils.OpenAireDocumentPage;
import eu.dnetlib.api.utils.ResponseHeader;

public class OpenairePublicationsApiClientTest extends OpenaireApiClientTest {

	String today = "";

	@Before
	public void setUp() {
		Date d = new Date();
		SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd");
		today = format.format(d);
	}

	@Test
	public void testPublications() throws URISyntaxException, DocumentException {
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath);
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		ResponseHeader pageHeader = page.getResponseHeader();
		assertEquals(publicationsQuery, pageHeader.getQuery());
		assertEquals(1, pageHeader.getPage());
		assertEquals(defaultPageSize, pageHeader.getPageSize());
	}

	@Test
	public void testPublicationParameters() throws URISyntaxException, DocumentException {
		for (String param : commonParameters) {
			if (!param.equals("model") && !param.equals("format") && !param.equals("page") && !param.equals("size") && !param.equals("sortBy")) {
				URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath).addParameter(param, "test");
				URI uri = builder.build();
				System.out.println(uri);
				String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
				checkNotException(results);
			}
		}
		for (String param : publicationParameters) {
			if (!param.equals("fromDateAccepted") && !param.equals("toDateAccepted")) {
				URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath).addParameter(param, "test");
				URI uri = builder.build();
				System.out.println(uri);
				String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
				checkNotException(results);
			}
		}
	}

	@Test
	public void testPublicationsUnexistingParameter() throws URISyntaxException, DocumentException {
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath);
		builder.addParameter("pippo", "hello");
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		checkException(results, "java.lang.IllegalArgumentException");
	}

	@Test
	public void testSortByPublicationsParameters() throws URISyntaxException, DocumentException {
		checkSortByParamaters(EntityType.publication);
	}

	@Test
	public void testPublicationsPage() throws URISyntaxException, DocumentException {
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath);
		builder.addParameter("page", "4");
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		ResponseHeader pageHeader = page.getResponseHeader();
		assertEquals(4, pageHeader.getPage());
	}

	@Test
	public void testPublicationsPageSize() throws URISyntaxException, DocumentException {
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath);
		builder.addParameter("size", "100");
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		ResponseHeader pageHeader = page.getResponseHeader();
		assertEquals(publicationsQuery, pageHeader.getQuery());
		assertEquals(100, pageHeader.getPageSize());
	}

	@Test
	public void testMaxPageSizePublication() throws URISyntaxException, DocumentException {
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath).addParameter("size", "" + MAX_PAGE_SIZE + 1);
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		checkException(results, "java.lang.IllegalArgumentException");

		builder = new URIBuilder(requestBaseURL).setPath(publicationsPath).addParameter("size", "" + MAX_PAGE_SIZE);
		uri = builder.build();
		System.out.println(uri);
		results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		checkNotException(results);

		assertTrue(MAX_NUM_RESULTS >= MAX_PAGE_SIZE);
	}

	@Test
	public void testPublicationsFormatXML() throws URISyntaxException, DocumentException {
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath);
		builder.addParameter("format", "xml");
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		Document doc = DocumentHelper.parseText(results);
		assertNotNull(doc);
	}

	@Test
	public void testPublicationsFormatWrong() throws URISyntaxException, DocumentException {
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath);
		builder.addParameter("format", "hello");
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		checkException(results, "java.lang.IllegalArgumentException");
	}

	@Test
	public void testPublicationsECFunding() throws URISyntaxException, DocumentException {
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath);
		builder.addParameter("hasECFunding", "true");
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		assertTrue(page.allWithECFundng());
	}

	@Test
	public void testPublicationsUKFunding() throws URISyntaxException, DocumentException {
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath);
		builder.addParameter("hasUKFunding", "true");
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		assertTrue(page.allWithUKFundng());
	}

	@Test
	public void testPublicationsWTFunder() throws URISyntaxException, DocumentException {
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath);
		builder.addParameter("funder", "wt");
		URI uri1 = builder.build();
		System.out.println(uri1);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri1);
		OpenAireDocumentPage pageWT = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		assertTrue(pageWT.allWithUKFundng());

		URIBuilder builderUK = new URIBuilder(requestBaseURL).setPath(publicationsPath);
		builderUK.addParameter("hasUKFunding", "true");
		URI uri2 = builderUK.build();
		System.out.println(uri2);
		String resultsUK = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri2);
		OpenAireDocumentPage pageUK = new OpenAireDocumentPage(DocumentHelper.parseText(resultsUK));

		assertTrue(pageUK.getResponseHeader().getTotal() >= pageWT.getResponseHeader().getTotal());
	}

	@Test
	public void testPublicationsECFunders() throws URISyntaxException, DocumentException {
		URIBuilder builderFP7 = new URIBuilder(requestBaseURL).setPath(publicationsPath);
		builderFP7.addParameter("funder", "fp7");
		URI uri1 = builderFP7.build();
		System.out.println(uri1);
		String resultsFP7 = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri1);
		OpenAireDocumentPage pageFP7 = new OpenAireDocumentPage(DocumentHelper.parseText(resultsFP7));
		assertTrue(pageFP7.allWithECFundng());

		URIBuilder builderH2020 = new URIBuilder(requestBaseURL).setPath(publicationsPath);
		builderH2020.addParameter("funder", "h2020");
		URI uri2 = builderH2020.build();
		System.out.println(uri2);
		String resultsH2020 = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri2);
		OpenAireDocumentPage pageH2020 = new OpenAireDocumentPage(DocumentHelper.parseText(resultsH2020));
		assertTrue(pageH2020.allWithECFundng());

		URIBuilder builderEC = new URIBuilder(requestBaseURL).setPath(publicationsPath);
		builderEC.addParameter("hasECFunding", "true");
		URI uri3 = builderEC.build();
		System.out.println(uri3);
		String resultsUK = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri3);
		OpenAireDocumentPage pageEC = new OpenAireDocumentPage(DocumentHelper.parseText(resultsUK));

		assertTrue(pageEC.getResponseHeader().getTotal() == (pageFP7.getResponseHeader().getTotal() + pageH2020.getResponseHeader().getTotal()));
	}

	@Test
	public void testPublicationsSingleOpenaireID() throws URISyntaxException, DocumentException, UnsupportedEncodingException {
		String testRecordId = "dedup_wf_001::d1bb389d90e0a4393f7ea00c457a62b5";
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath);
		builder.addParameter("openairePublicationID", testRecordId);
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		assertEquals(1, page.getResponseHeader().getTotal());
		List<String> objIds = page.getObjIdentifiers();
		assertEquals(1, objIds.size());
		assertTrue(objIds.contains(testRecordId));
	}

	@Test
	public void testPublicationsMultipleOpenaireIDs1() throws URISyntaxException, DocumentException, UnsupportedEncodingException {
		String testRecordId1 = "dedup_wf_001::d1bb389d90e0a4393f7ea00c457a62b5";
		String testRecordId2 = "od________18::5ea480618e9ab9e7db827fa498422075";
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath);
		builder.addParameter("openairePublicationID", testRecordId1 + "," + testRecordId2);
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		assertEquals(2, page.getResponseHeader().getTotal());
		List<String> objIds = page.getObjIdentifiers();
		assertEquals(2, objIds.size());
		assertTrue(objIds.contains(testRecordId1));
		assertTrue(objIds.contains(testRecordId2));
	}

	@Test
	public void testPublicationsMultipleOpenaireIDs2() throws URISyntaxException, DocumentException, UnsupportedEncodingException {
		String testRecordId1 = "dedup_wf_001::d1bb389d90e0a4393f7ea00c457a62b5";
		String testRecordId2 = "od________18::5ea480618e9ab9e7db827fa498422075";
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath);
		builder.addParameter("openairePublicationID", testRecordId1);
		builder.addParameter("openairePublicationID", testRecordId2);
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		assertEquals(2, page.getResponseHeader().getTotal());
		List<String> objIds = page.getObjIdentifiers();
		assertEquals(2, objIds.size());
		assertTrue(objIds.contains(testRecordId1));
		assertTrue(objIds.contains(testRecordId2));
	}

	@Test
	public void testPublicationsUnexistingOpenaireID() throws URISyntaxException, DocumentException, UnsupportedEncodingException {
		String testRecordId = "foo::d1bb389d90e0a4393f7ea00c457a62b5";
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath);
		builder.addParameter("openairePublicationID", testRecordId);
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		assertEquals(0, page.getResponseHeader().getTotal());
	}

	@Test
	public void testPublicationsSingleDOI() throws URISyntaxException, DocumentException, UnsupportedEncodingException {
		String testRecordId = "dedup_wf_001::d1bb389d90e0a4393f7ea00c457a62b5";
		String doi = "10.3389/fnhum.2013.00107";
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath);
		builder.addParameter("doi", doi);
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		assertEquals(page.getResponseHeader().getTotal(), 1);
		List<String> objIds = page.getObjIdentifiers();
		assertEquals(1, objIds.size());
		assertTrue(objIds.contains(testRecordId));
	}

	@Test
	public void testPublicationsMultipleDOIs1() throws URISyntaxException, DocumentException, UnsupportedEncodingException {
		String testRecordId1 = "dedup_wf_001::d1bb389d90e0a4393f7ea00c457a62b5";
		String testRecordId2 = "od________18::5ea480618e9ab9e7db827fa498422075";
		String doi1 = "10.3389/fnhum.2013.00107";
		String doi2 = "10.1016/j.jmb.2010.12.024";
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath);
		builder.addParameter("doi", doi1 + "," + doi2);
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		assertTrue(page.getResponseHeader().getTotal() >= 2);
		List<String> objIds = page.getObjIdentifiers();
		assertEquals(page.getResponseHeader().getTotal(), objIds.size());
		assertTrue(objIds.contains(testRecordId1));
		assertTrue(objIds.contains(testRecordId2));
	}

	@Test
	public void testPublicationsMultipleDOIs2() throws URISyntaxException, DocumentException, UnsupportedEncodingException {
		String testRecordId1 = "dedup_wf_001::d1bb389d90e0a4393f7ea00c457a62b5";
		String testRecordId2 = "od________18::5ea480618e9ab9e7db827fa498422075";
		String doi1 = "10.3389/fnhum.2013.00107";
		String doi2 = "10.1016/j.jmb.2010.12.024";
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath);
		builder.addParameter("doi", doi1);
		builder.addParameter("doi", doi2);
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		assertTrue(page.getResponseHeader().getTotal() >= 2);
		List<String> objIds = page.getObjIdentifiers();
		assertEquals(page.getResponseHeader().getTotal(), objIds.size());
		assertTrue(objIds.contains(testRecordId1));
		assertTrue(objIds.contains(testRecordId2));
	}

	@Test
	public void testPublicationsFromDate() throws URISyntaxException, DocumentException, UnsupportedEncodingException {
		String date = "2012-03-15";
		String expectedQuery = "(((deletedbyinference = false) AND (oaftype exact result)) and (resulttypeid exact publication)) and (resultdateofacceptance within \"2012-03-15 "
				+ today + "\")";

		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath).addParameter("fromDateAccepted", date);
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		assertNotNull(page);
		assertEquals(expectedQuery, page.getResponseHeader().getQuery());
	}

	@Test
	public void testPublicationsToDate() throws URISyntaxException, DocumentException, UnsupportedEncodingException {
		String date = "2013-03-15";
		String expectedQuery = "(((deletedbyinference = false) AND (oaftype exact result)) and (resulttypeid exact publication)) and (resultdateofacceptance within \"* 2013-03-15\")";

		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath).addParameter("toDateAccepted", date);
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		System.out.println(results.substring(0, 500));
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		assertNotNull(page);
		assertEquals(expectedQuery, page.getResponseHeader().getQuery());
	}

	@Test
	public void testPublicationsByTitle() throws URISyntaxException, DocumentException, UnsupportedEncodingException {
		String title = "Enhanced Publications";
		String expectedQuery = "((((deletedbyinference = false) AND (oaftype exact result)) and (resulttypeid exact publication)) and (resulttitle = Enhanced)) and (resulttitle = Publications)";
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath).addParameter("title", title);
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		assertNotNull(page);
		assertEquals(expectedQuery, page.getResponseHeader().getQuery());
	}

	@Test
	public void testPublicationsByAuthor() throws URISyntaxException, DocumentException, UnsupportedEncodingException {
		String author = "bardi alessia manghi";
		String expectedQuery = "(((((deletedbyinference = false) AND (oaftype exact result)) and (resulttypeid exact publication)) and (relperson = bardi)) and (relperson = alessia)) and (relperson = manghi)";
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath).addParameter("author", author);
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		assertNotNull(page);
		assertEquals(expectedQuery, page.getResponseHeader().getQuery());
	}

	@Test
	public void testPublicationsByAuthorId() throws URISyntaxException, DocumentException, UnsupportedEncodingException {
		String authorId = "od______2367::3fbd0b3533bd0e6089c1fe68b115f772";
		String expectedQuery = "(((deletedbyinference = false) AND (oaftype exact result)) and (resulttypeid exact publication)) and (relpersonid exact od______2367::3fbd0b3533bd0e6089c1fe68b115f772)";
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath).addParameter("openaireAuthorID", authorId);
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		assertNotNull(page);
		assertEquals(expectedQuery, page.getResponseHeader().getQuery());
	}

	@Test
	public void testPublicationsByMultipleAuthorId() throws URISyntaxException, DocumentException, UnsupportedEncodingException {
		String authorId1 = "od______2367::3fbd0b3533bd0e6089c1fe68b115f772";
		String authorId2 = "od______2367::3fbd0b3533bd0e6089c1fe68b115f772";
		String expectedQuery = "(((deletedbyinference = false) AND (oaftype exact result)) and (resulttypeid exact publication)) and (relpersonid exact od______2367::3fbd0b3533bd0e6089c1fe68b115f772 or (relpersonid exact od______2367::3fbd0b3533bd0e6089c1fe68b115f772)";
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath).addParameter("openaireAuthorID", authorId1)
				.addParameter("openaireAuthorID", authorId2);
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		assertNotNull(page);
		assertEquals(expectedQuery, page.getResponseHeader().getQuery());
	}

	@Test
	public void testPublicationsByProviderId() throws URISyntaxException, DocumentException, UnsupportedEncodingException {
		// this is PUMA
		String providerId = "opendoar____::300891a62162b960cf02ce3827bb363c";
		String expectedQuery = "(((deletedbyinference = false) AND (oaftype exact result)) and (resulttypeid exact publication)) and (resulthostingdatasourceid exact opendoar____::300891a62162b960cf02ce3827bb363c)";
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath).addParameter("openaireProviderID", providerId);
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		assertNotNull(page);
		assertEquals(expectedQuery, page.getResponseHeader().getQuery());
	}

	@Test
	public void testPublicationsByMultipleProviderIds() throws URISyntaxException, DocumentException, UnsupportedEncodingException {
		// this is PUMA
		String providerId1 = "opendoar____::300891a62162b960cf02ce3827bb363c";
		String providerId2 = "opendoar____::300891a62162b960cf02ce3827bb363c";
		String expectedQuery = "(((deletedbyinference = false) AND (oaftype exact result)) and (resulttypeid exact publication)) and (resulthostingdatasourceid exact opendoar____::300891a62162b960cf02ce3827bb363c or resulthostingdatasourceid exact opendoar____::300891a62162b960cf02ce3827bb363c)";
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath).addParameter("openaireProviderID", providerId1 + "," + providerId2);
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		assertNotNull(page);
		assertEquals(expectedQuery, page.getResponseHeader().getQuery());
	}

	@Test
	public void testPublicationsBy2ProviderId() throws URISyntaxException, DocumentException, UnsupportedEncodingException {
		// this is PUMA
		String providerId1 = "opendoar____::300891a62162b960cf02ce3827bb363c";
		// this is UTL Repository
		String providerId2 = "opendoar____::0c8ce55163055c4da50a81e0a273468c";
		// String expectedQuery =
		// "(((deletedbyinference = false) AND (oaftype exact result)) and (resulttypeid exact publication)) and (resulthostingdatasourceid exact opendoar____::300891a62162b960cf02ce3827bb363c)";
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath).addParameter("openaireProviderID", providerId1)
				.addParameter("openaireProviderID", providerId2);
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		assertNotNull(page);
		// assertEquals(expectedQuery, page.getResponseHeader().getQuery());
	}

	@Test
	public void testPublicationsByProject() throws URISyntaxException, DocumentException {
		// <code>213153</code>
		// <acronym>BREAST CT</acronym>
		// <objIdentifier>corda_______::227de3026bb4ceb724f139437520a9ce</objIdentifier>
		URIBuilder builderFP7ProjectID = new URIBuilder(requestBaseURL).setPath(publicationsPath);
		builderFP7ProjectID.addParameter("FP7ProjectID", "213153");
		URI uri1 = builderFP7ProjectID.build();
		System.out.println(uri1);
		String resultsFP7ProjectID = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri1);
		OpenAireDocumentPage pageFP7ProjectID = new OpenAireDocumentPage(DocumentHelper.parseText(resultsFP7ProjectID));

		URIBuilder builderOAProjectID = new URIBuilder(requestBaseURL).setPath(publicationsPath);
		builderOAProjectID.addParameter("openaireProjectID", "corda_______::227de3026bb4ceb724f139437520a9ce");
		URI uri2 = builderOAProjectID.build();
		System.out.println(uri2);
		String resultsOAProjectID = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri2);
		OpenAireDocumentPage pageOAProjectID = new OpenAireDocumentPage(DocumentHelper.parseText(resultsOAProjectID));

		assertEquals(pageFP7ProjectID.getResponseHeader().getTotal(), pageOAProjectID.getResponseHeader().getTotal());
	}

	@Test
	public void testPublicationsWithProjects() throws URISyntaxException, DocumentException, UnsupportedEncodingException {
		String expectedQuery = "(((deletedbyinference = false) AND (oaftype exact result)) and (resulttypeid exact publication)) and (relprojectid = *)";
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath).addParameter("hasProject", "true");
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		assertNotNull(page);
		assertEquals(expectedQuery, page.getResponseHeader().getQuery());
	}

	@Test
	public void testPublicationsWithoutProjects() throws URISyntaxException, DocumentException, UnsupportedEncodingException {
		String expectedQuery = "(((deletedbyinference = false) AND (oaftype exact result)) and (resulttypeid exact publication)) not (relprojectid = *)";
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath).addParameter("hasProject", "false");
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		assertNotNull(page);
		assertEquals(expectedQuery, page.getResponseHeader().getQuery());
	}

	@Test
	public void testPublicationsOA() throws URISyntaxException, DocumentException, UnsupportedEncodingException {
		String expectedQuery = "(((deletedbyinference = false) AND (oaftype exact result)) and (resulttypeid exact publication)) and (resultbestlicense exact \"Open Access\")";
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath).addParameter("OA", "true");
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		assertNotNull(page);
		assertEquals(expectedQuery, page.getResponseHeader().getQuery());
	}

	@Test
	public void testPublicationsNonOA() throws URISyntaxException, DocumentException, UnsupportedEncodingException {
		String expectedQuery = "(((deletedbyinference = false) AND (oaftype exact result)) and (resulttypeid exact publication)) and (resultbestlicense <> \"Open Access\")";
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(publicationsPath).addParameter("OA", "false");
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		OpenAireDocumentPage page = new OpenAireDocumentPage(DocumentHelper.parseText(results));
		assertNotNull(page);
		assertEquals(expectedQuery, page.getResponseHeader().getQuery());
	}
}
