package com.buschmais.xo.impl;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Spy;
import org.mockito.runners.MockitoJUnitRunner;
import com.buschmais.xo.api.XOException;
import com.buschmais.xo.api.XOTransaction;
import com.buschmais.xo.spi.datastore.DatastoreTransaction;
@RunWith(MockitoJUnitRunner.class)
public class XOTransactionImplTest {
@Spy
private DatastoreTransaction datastoreTransaction = new DatastoreTransaction() {
private boolean active;
@Override
public void begin() {
this.active = true;
}
@Override
public void commit() {
this.active = false;
}
@Override
public void rollback() {
this.active = false;
}
@Override
public boolean isActive() {
return this.active;
}
};
@Test
public void commit() {
XOTransaction xoTransaction = new XOTransactionImpl(datastoreTransaction);
xoTransaction.begin();
assertThat(xoTransaction.isActive(), equalTo(true));
xoTransaction.commit();
assertThat(xoTransaction.isActive(), equalTo(false));
verify(datastoreTransaction).begin();
verify(datastoreTransaction).commit();
verify(datastoreTransaction, never()).rollback();
}
@Test
public void rollback() {
XOTransaction xoTransaction = new XOTransactionImpl(datastoreTransaction);
xoTransaction.begin();
assertThat(xoTransaction.isActive(), equalTo(true));
xoTransaction.rollback();
assertThat(xoTransaction.isActive(), equalTo(false));
verify(datastoreTransaction).begin();
verify(datastoreTransaction, never()).commit();
verify(datastoreTransaction).rollback();
verify(datastoreTransaction, times(2)).isActive();
}
@Test
public void commitOnRollbackOnly() {
XOTransaction xoTransaction = new XOTransactionImpl(datastoreTransaction);
xoTransaction.begin();
assertThat(xoTransaction.isActive(), equalTo(true));
xoTransaction.setRollbackOnly();
try {
xoTransaction.commit();
fail("Expecting an " + XOException.class.getName());
} catch (XOException e) {
assertThat(e.getMessage(), containsString("rollback only"));
}
assertThat(xoTransaction.isActive(), equalTo(true));
verify(datastoreTransaction).begin();
verify(datastoreTransaction, never()).commit();
verify(datastoreTransaction, never()).rollback();
verify(datastoreTransaction, times(2)).isActive();
}
@Test
public void rollbackOnClose() {
XOTransactionImpl xoTransaction = new XOTransactionImpl(datastoreTransaction);
try (XOTransaction tx = xoTransaction.begin()) {
assertThat(xoTransaction.isActive(), equalTo(true));
tx.setRollbackOnly();
assertThat(tx.isRollbackOnly(), equalTo(true));
}
assertThat(xoTransaction.isActive(), equalTo(false));
assertThat(xoTransaction.isRollbackOnly(), equalTo(false));
verify(datastoreTransaction).begin();
verify(datastoreTransaction, never()).commit();
verify(datastoreTransaction).rollback();
verify(datastoreTransaction, times(2)).isActive();
}
@Test
public void commitOnClose() {
XOTransactionImpl xoTransaction = new XOTransactionImpl(datastoreTransaction);
try (XOTransaction tx = xoTransaction.begin()) {
assertThat(tx.isActive(), equalTo(true));
}
assertThat(xoTransaction.isActive(), equalTo(false));
verify(datastoreTransaction).begin();
verify(datastoreTransaction).commit();
verify(datastoreTransaction, never()).rollback();
verify(datastoreTransaction, times(2)).isActive();
}
}