package eu.dnetlib.soap.cxf;

import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when;

import java.util.HashMap;

import javax.xml.namespace.QName;
import javax.xml.ws.EndpointReference;

import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.service.Service;
import org.apache.cxf.service.model.EndpointInfo;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnit44Runner;

/**
 * test the CxfEndpointReferenceBuilder.
 *
 * @author marko
 *
 */
@RunWith(MockitoJUnit44Runner.class)
public class CxfEndpointReferenceBuilderTest {

	/**
	 * service mock.
	 */
	@Mock
	private Service service;

	/**
	 * endpoint info mock.
	 */
	@Mock
	private EndpointInfo endpointInfo;

	/**
	 * endpoint mock.
	 */
	@Mock
	private Endpoint endpoint;

	/**
	 * object under test.
	 */
	private CxfEndpointReferenceBuilder builder;

	/**
	 * initialize object under test and prepare a commmon endpoint mock.
	 */
	@Before
	public void setUp() {
		builder = new CxfEndpointReferenceBuilder();
		when(service.getName()).thenReturn(new QName("http://my.test", "TestService"));

		when(endpoint.getEndpointInfo()).thenReturn(endpointInfo);
		when(endpoint.getService()).thenReturn(service);
		when(endpointInfo.getAddress()).thenReturn("http://localhost/something");
		when(endpointInfo.getName()).thenReturn(new QName("http://my.test", "TestServiceEndpoint"));
	}

	/**
	 * test.
	 */
	@Test
	public void testGetEndpointReference() {

		final EndpointReference epr = builder.getEndpointReference(endpoint);

		assertTrue(
				"check serialization",
				epr
						.toString()
						.contains(
								"<EndpointReference xmlns=\"http://www.w3.org/2005/08/addressing\"><Address>http://localhost/something</Address><ReferenceParameters/><Metadata>"
										+ "<wsaw:ServiceName EndpointName=\"TestServiceEndpoint\" xmlns=\"\" xmlns:ns2=\"http://my.test\" xmlns:wsa=\"http://www.w3.org/2005/08/addressing\""
										+ " xmlns:wsaw=\"http://www.w3.org/2006/05/addressing/wsdl\" xmlns:ns5=\"http://www.w3.org/2005/08/addressing\">ns2:TestService</wsaw:ServiceName>"
										+ "<wsdl:definitions xmlns:wsa=\"http://www.w3.org/2005/08/addressing\" xmlns:wsaw=\"http://www.w3.org/2006/05/addressing/wsdl\" "
										+ "xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\"><wsdl:import location=\"http://localhost/something?wsdl\" namespace=\"http://my.test\" "
										+ "xmlns=\"\" xmlns:ns5=\"http://www.w3.org/2005/08/addressing\"/></wsdl:definitions></Metadata></EndpointReference>"));

	}

	/**
	 * test method.
	 */
	@Test
	public void testGetEndpointReferenceMetadata() {
		final HashMap<String, Object> defaultMetadata = new HashMap<String, Object>();
		defaultMetadata.put("{http://someuri}somename", "somevalue");
		builder.setDefaultMetadata(defaultMetadata);

		final EndpointReference epr = builder.getEndpointReference(endpoint);

		assertTrue(
				"check serialization",
				epr
						.toString()
						.contains(
								"<EndpointReference xmlns=\"http://www.w3.org/2005/08/addressing\"><Address>http://localhost/something</Address><ReferenceParameters/><Metadata>"
										+ "<wsaw:ServiceName EndpointName=\"TestServiceEndpoint\" xmlns=\"\" xmlns:ns2=\"http://my.test\" xmlns:wsa=\"http://www.w3.org/2005/08/addressing\""
										+ " xmlns:wsaw=\"http://www.w3.org/2006/05/addressing/wsdl\" xmlns:ns5=\"http://www.w3.org/2005/08/addressing\">ns2:TestService</wsaw:ServiceName>"
										+ "<wsdl:definitions xmlns:wsa=\"http://www.w3.org/2005/08/addressing\" xmlns:wsaw=\"http://www.w3.org/2006/05/addressing/wsdl\" "
										+ "xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\"><wsdl:import location=\"http://localhost/something?wsdl\" namespace=\"http://my.test\""
										+ " xmlns=\"\" xmlns:ns5=\"http://www.w3.org/2005/08/addressing\"/></wsdl:definitions><somename:somename xmlns=\"http://someuri\" "
										+ "xmlns:wsa=\"http://www.w3.org/2005/08/addressing\" xmlns:wsaw=\"http://www.w3.org/2006/05/addressing/wsdl\" "
										+ "xmlns:somename=\"http://someuri\">somevalue</somename:somename></Metadata></EndpointReference>"));

	}

	protected Service getService() {
		return service;
	}

	protected void setService(final Service service) {
		this.service = service;
	}

	protected EndpointInfo getEndpointInfo() {
		return endpointInfo;
	}

	protected void setEndpointInfo(final EndpointInfo endpointInfo) {
		this.endpointInfo = endpointInfo;
	}

	protected Endpoint getEndpoint() {
		return endpoint;
	}

	protected void setEndpoint(final Endpoint endpoint) {
		this.endpoint = endpoint;
	}

	protected CxfEndpointReferenceBuilder getBuilder() {
		return builder;
	}

	protected void setBuilder(final CxfEndpointReferenceBuilder builder) {
		this.builder = builder;
	}
}
