/*
 * Copyright 2013 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.batch.core.jsr;

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

import java.util.Properties;

import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;

public class JobContextTests {

	private JobContext context;
	@Mock
	private JobExecution execution;
	@Mock
	private JobInstance instance;

	@Before
	public void setUp() throws Exception {
		MockitoAnnotations.initMocks(this);

		Properties properties = new Properties();
		properties.put("jobLevelProperty1", "jobLevelValue1");

		context = new JobContext();
		context.setProperties(properties);
		context.setJobExecution(execution);

		when(execution.getJobInstance()).thenReturn(instance);
	}

	@Test(expected=IllegalArgumentException.class)
	public void testCreateWithNull() {
		context = new JobContext();
		context.setJobExecution(null);
	}

	@Test
	public void testGetJobName() {
		when(instance.getJobName()).thenReturn("jobName");

		assertEquals("jobName", context.getJobName());
	}

	@Test
	public void testTransientUserData() {
		context.setTransientUserData("This is my data");
		assertEquals("This is my data", context.getTransientUserData());
	}

	@Test
	public void testGetInstanceId() {
		when(instance.getId()).thenReturn(5L);

		assertEquals(5L, context.getInstanceId());
	}

	@Test
	public void testGetExecutionId() {
		when(execution.getId()).thenReturn(5L);

		assertEquals(5L, context.getExecutionId());
	}

	@Test
	public void testJobParameters() {
		JobParameters params = new JobParametersBuilder()
		.addString("key1", "value1")
		.toJobParameters();

		when(execution.getJobParameters()).thenReturn(params);

		assertEquals("value1", execution.getJobParameters().getString("key1"));
	}

	@Test
	public void testJobProperties() {
		assertEquals("jobLevelValue1", context.getProperties().get("jobLevelProperty1"));
	}

	@Test
	public void testGetBatchStatus() {
		when(execution.getStatus()).thenReturn(BatchStatus.COMPLETED);

		assertEquals(javax.batch.runtime.BatchStatus.COMPLETED, context.getBatchStatus());
	}

	@Test
	public void testExitStatus() {
		context.setExitStatus("my exit status");
		verify(execution).setExitStatus(new ExitStatus("my exit status"));

		when(execution.getExitStatus()).thenReturn(new ExitStatus("exit"));
		assertEquals("exit", context.getExitStatus());
	}

	@Test
	public void testInitialNullExitStatus() {
		when(execution.getExitStatus()).thenReturn(new ExitStatus("exit"));
		assertEquals(null, context.getExitStatus());
	}
}
