package eu.dnetlib.data.information;

import static org.junit.Assert.*;

import javax.annotation.Resource;
import javax.xml.ws.wsaddressing.W3CEndpointReference;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.mockito.Mockito.*;

import eu.dnetlib.data.mdstore.IMDStoreService;
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService;
import eu.dnetlib.enabling.tools.ServiceResolver;
import eu.dnetlib.soap.cxf.StandaloneCxfEndpointReferenceBuilder;

/**
 * Sink resolver Dispatcher test.
 *
 * @author marko
 *
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class DataSinkResolverDispatcherTest {

	@Resource
	private transient DataSinkResolver resolver;

	@Resource(name = "lookupService")
	private transient ISLookUpService lookupService;

	@Resource(name = "serviceResolver")
	private transient ServiceResolver serviceResolver;

	@Resource(name = "mdstoreService")
	private transient IMDStoreService mdstoreService;

	@Resource
	private transient MDStoreDataSinkSourceDescriptorGenerator generator;

	private transient StandaloneCxfEndpointReferenceBuilder eprBuilder = new StandaloneCxfEndpointReferenceBuilder();

	@Before
	public void setUp() throws Exception {
		when(lookupService.getResourceProfileByQuery(anyString())).thenReturn("123");
		when(serviceResolver.getService(eq(IMDStoreService.class), (W3CEndpointReference) anyObject())).thenReturn(mdstoreService);
	}

	@Test
	public void testResolve() {
		final DataSink sink = resolver.resolve(generator.generateDataSinkDescriptor("1234", "REFRESH")); // "dnet://MDStoreDS/1234?type=REFRESH");
		assertNotNull(sink);

		W3CEndpointReference epr = eprBuilder.getEndpointReference("http://test.com", null, null, null, null, null);
		sink.store(epr);

		verify(mdstoreService).storeMDRecordsFromRS("1234", epr, "REFRESH");
	}

}
