package eu.dnetlib.data.cleaner;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

import eu.dnetlib.data.cleaner.CleanerServiceImpl;
import eu.dnetlib.data.cleaner.CleaningRule;
import eu.dnetlib.data.cleaner.CleaningRuleFactory;
import eu.dnetlib.enabling.resultset.factory.ResultSetFactory;
import eu.dnetlib.rmi.common.ResultSet;
import eu.dnetlib.rmi.data.CleanerException;

@RunWith(MockitoJUnitRunner.class)
public class CleanerServiceImplTest {

	/**
	 * Class under test.
	 */
	private CleanerServiceImpl service;

	@Mock
	private CleaningRuleFactory cleaningRuleFactory;
	@Mock
	private ResultSetFactory resultSetFactory;
	@Mock
	private CleaningRule cleaningRule;
	@Mock
	private ResultSet<String> rs_IN;
	@Mock
	private ResultSet<String> rs_OUT;

	private static final String RULE_ID = "RULE_01";

	@Before
	public void setUp() throws Exception {
		when(this.cleaningRuleFactory.obtainCleaningRule(RULE_ID)).thenReturn(this.cleaningRule);
		when(this.resultSetFactory.map(this.rs_IN, String.class, this.cleaningRule)).thenReturn(this.rs_OUT);

		this.service = new CleanerServiceImpl();
		this.service.setCleaningRuleFactory(this.cleaningRuleFactory);
		this.service.setResultSetFactory(this.resultSetFactory);
	}

	@Test
	public void testClean() throws CleanerException {
		final ResultSet<String> rs = this.service.clean(this.rs_IN, RULE_ID);
		assertNotNull(rs);
		assertEquals(this.rs_OUT, rs);
		verify(this.cleaningRuleFactory).obtainCleaningRule(RULE_ID);
	}

	@Test(expected = CleanerException.class)
	public void testClean_null_1() throws CleanerException {
		this.service.clean(this.rs_IN, null);
	}

	@Test(expected = CleanerException.class)
	public void testClean_null_2() throws CleanerException {
		this.service.clean(null, RULE_ID);
	}
}
