package co.leantechniques.maven.buildtime;

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

import java.util.Properties;

import org.apache.maven.execution.ExecutionEvent;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.project.MavenProject;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class MavenHelperTest {

	@Mock
	private ExecutionEvent sessionEndEvent;

	@Mock
	private MavenSession session;

	@Before
	public void setUp() throws Exception {
		when( sessionEndEvent.getSession() ).thenReturn( session );
	}

	@Test
	public void testPropertyPriorityUser() throws Exception {
		Properties systemProperties = new Properties();
		systemProperties.setProperty( Constants.BUILDTIME_OUTPUT_LOG_PROPERTY, "systemProperty" );
		MavenProject mavenProject = new MavenProject();
		mavenProject.getProperties().setProperty( Constants.BUILDTIME_OUTPUT_LOG_PROPERTY, "projectProperty" );
		Properties userProperties = new Properties();
		userProperties.setProperty( Constants.BUILDTIME_OUTPUT_LOG_PROPERTY, "userProperty" );

		when( session.getSystemProperties() ).thenReturn( systemProperties );
		when( session.getUserProperties() ).thenReturn( userProperties );
		when( session.getTopLevelProject() ).thenReturn( mavenProject );

		assertEquals( "userProperty", MavenHelper.getExecutionProperty( sessionEndEvent, Constants.BUILDTIME_OUTPUT_LOG_PROPERTY, "default" ) );
	}

	@Test
	public void testPropertyPriorityProject() throws Exception {
		Properties systemProperties = new Properties();
		systemProperties.setProperty( Constants.BUILDTIME_OUTPUT_LOG_PROPERTY, "systemProperty" );
		MavenProject mavenProject = new MavenProject();
		mavenProject.getProperties().setProperty( Constants.BUILDTIME_OUTPUT_LOG_PROPERTY, "projectProperty" );
		Properties userProperties = new Properties();

		when( session.getSystemProperties() ).thenReturn( systemProperties );
		when( session.getUserProperties() ).thenReturn( userProperties );
		when( session.getTopLevelProject() ).thenReturn( mavenProject );

		assertEquals( "projectProperty", MavenHelper.getExecutionProperty( sessionEndEvent, Constants.BUILDTIME_OUTPUT_LOG_PROPERTY, "default" ) );
	}


	@Test
	public void testPropertyPrioritySystem() throws Exception {
		Properties systemProperties = new Properties();
		systemProperties.setProperty( Constants.BUILDTIME_OUTPUT_LOG_PROPERTY, "systemProperty" );
		MavenProject mavenProject = new MavenProject();
		Properties userProperties = new Properties();

		when( session.getSystemProperties() ).thenReturn( systemProperties );
		when( session.getUserProperties() ).thenReturn( userProperties );
		when( session.getTopLevelProject() ).thenReturn( mavenProject );

		assertEquals( "systemProperty", MavenHelper.getExecutionProperty( sessionEndEvent, Constants.BUILDTIME_OUTPUT_LOG_PROPERTY, "default" ) );
	}

	@Test
	public void testPropertyPriorityDefault() throws Exception {
		Properties systemProperties = new Properties();
		MavenProject mavenProject = new MavenProject();
		Properties userProperties = new Properties();

		when( session.getSystemProperties() ).thenReturn( systemProperties );
		when( session.getUserProperties() ).thenReturn( userProperties );
		when( session.getTopLevelProject() ).thenReturn( mavenProject );

		assertEquals( "default", MavenHelper.getExecutionProperty( sessionEndEvent, Constants.BUILDTIME_OUTPUT_LOG_PROPERTY, "default" ) );
	}

}