package de.codecentric.batch.metrics;

import org.junit.Before;
import org.junit.Test;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.scope.context.StepSynchronizationManager;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.transaction.support.TransactionSynchronizationUtils;

public class BatchMetricsImplTest {

	private BatchMetricsImpl batchMetrics;

	@Before
	public void beforeTest() {
		batchMetrics = new BatchMetricsImpl();
		StepSynchronizationManager
				.register(new StepExecution("step", new JobExecution(new JobInstance(1L, "jobname"), 1L, null, null)));
	}

	@Test
	public void incrementBy1Transactional() throws Exception {
		// Given
		TransactionSynchronizationManager.initSynchronization();
		// When
		batchMetrics.increment("counter.test", 1L);
		TransactionSynchronizationUtils.triggerAfterCompletion(TransactionSynchronization.STATUS_COMMITTED);
		// Then
		TransactionSynchronizationManager.clearSynchronization();
	}

	@Test
	public void decrementBy1Transactional() throws Exception {
		// Given
		TransactionSynchronizationManager.initSynchronization();
		// When
		batchMetrics.decrement("counter.test", 1L);
		TransactionSynchronizationUtils.triggerAfterCompletion(TransactionSynchronization.STATUS_COMMITTED);
		// Then
		TransactionSynchronizationManager.clearSynchronization();
	}

	@Test
	public void incrementBy1NonTransactional() throws Exception {
		// Given
		// No transaction
		// When
		batchMetrics.increment("counter.test", 1L);
		// Then
	}

	@Test
	public void submitTransactional() throws Exception {
		// Given
		TransactionSynchronizationManager.initSynchronization();
		// When
		batchMetrics.submit("counter.test", 1L);
		TransactionSynchronizationUtils.triggerAfterCompletion(TransactionSynchronization.STATUS_COMMITTED);
		// Then
		TransactionSynchronizationManager.clearSynchronization();
	}

	@Test
	public void submitNonTransactional() throws Exception {
		// Given
		// No transaction
		// When
		batchMetrics.submit("counter.test", 1L);
		// Then
	}
}