Commit 78fbcfc4 authored by Noel Alonso's avatar Noel Alonso
Browse files

Refactoriza y pasa funcionalidades a la base

parent 6042ee91
Loading
Loading
Loading
Loading
+43 −137
Original line number Diff line number Diff line
package es.redmic.vesselscommands.aggregate;

import es.redmic.brokerlib.avro.common.Event;
import es.redmic.brokerlib.avro.common.SimpleEvent;
import es.redmic.commandslib.aggregate.Aggregate;
import es.redmic.commandslib.exceptions.HistoryNotFoundException;
import es.redmic.commandslib.exceptions.ItemLockedException;
import es.redmic.exception.data.ItemNotFoundException;
import es.redmic.exception.database.DBNotFoundException;
import es.redmic.vesselscommands.commands.CreateVesselCommand;
import es.redmic.vesselscommands.commands.DeleteVesselCommand;
@@ -15,15 +11,10 @@ import es.redmic.vesselslib.dto.VesselDTO;
import es.redmic.vesselslib.events.vessel.VesselEventTypes;
import es.redmic.vesselslib.events.vessel.common.VesselEvent;
import es.redmic.vesselslib.events.vessel.create.CreateVesselCancelledEvent;
import es.redmic.vesselslib.events.vessel.create.CreateVesselConfirmedEvent;
import es.redmic.vesselslib.events.vessel.create.CreateVesselEvent;
import es.redmic.vesselslib.events.vessel.create.VesselCreatedEvent;
import es.redmic.vesselslib.events.vessel.delete.DeleteVesselConfirmedEvent;
import es.redmic.vesselslib.events.vessel.delete.DeleteVesselEvent;
import es.redmic.vesselslib.events.vessel.delete.VesselDeletedEvent;
import es.redmic.vesselslib.events.vessel.update.UpdateVesselConfirmedEvent;
import es.redmic.vesselslib.events.vessel.update.UpdateVesselEvent;
import es.redmic.vesselslib.events.vessel.update.VesselUpdatedEvent;

public class VesselAggregate extends Aggregate {

@@ -39,28 +30,16 @@ public class VesselAggregate extends Aggregate {

		assert vesselStateStore != null;

		String vesselId = cmd.getVessel().getId();
		String id = cmd.getVessel().getId();

		if (vesselId != null) {
			// comprueba que el MMSI no esté introducido
			Event state = vesselStateStore.getVessel(vesselId);

			if (state != null) {

				loadFromHistory(state);

				if (!isDeleted()) {
					logger.info("Descartando barco " + vesselId + ". El barco ya está registrado.");
		if (exist(id)) {
			logger.info("Descartando inserción de " + id + ". El item ya está registrado.");
			return null; // Se lanza excepción en el origen no aquí
		}
				reset();
			}
		}

		this.setAggregateId(vesselId);
		this.setAggregateId(id);

		CreateVesselEvent evt = new CreateVesselEvent(cmd.getVessel());
		evt.setAggregateId(vesselId);
		evt.setAggregateId(id);
		evt.setVersion(1);
		return evt;
	}
@@ -69,29 +48,16 @@ public class VesselAggregate extends Aggregate {

		assert vesselStateStore != null;

		String vesselId = cmd.getVessel().getId();

		Event state = vesselStateStore.getVessel(vesselId);
		String id = cmd.getVessel().getId();

		if (state == null) {
			logger.error("Intentando modificar un elemento del cual no se tiene historial, ", vesselId);
			throw new HistoryNotFoundException(VesselEventTypes.UPDATE.toString(), vesselId);
		}
		Event state = getStateFromHistory(id);

		loadFromHistory(state);

		if (this.deleted) {
			logger.error("Intentando modificar un elemento eliminado, ", vesselId);
			throw new ItemNotFoundException("id", vesselId);
		}

		if (VesselEventTypes.isLocked(state.getType())) {
			logger.error("Intentando modificar un elemento bloqueado por una edición en curso, ", vesselId);
			throw new ItemLockedException("id", vesselId);
		}
		checkState(id, state.getType());

		UpdateVesselEvent evt = new UpdateVesselEvent(cmd.getVessel());
		evt.setAggregateId(vesselId);
		evt.setAggregateId(id);
		evt.setVersion(getVersion() + 1);
		return evt;
	}
@@ -100,29 +66,16 @@ public class VesselAggregate extends Aggregate {

		assert vesselStateStore != null;

		String vesselId = cmd.getVesselId();

		Event state = vesselStateStore.getVessel(vesselId);
		String id = cmd.getVesselId();

		if (state == null) {
			logger.error("Intentando eliminar un elemento del cual no se tiene historial, " + vesselId);
			throw new HistoryNotFoundException(VesselEventTypes.DELETE.toString(), vesselId);
		}
		Event state = getStateFromHistory(id);

		loadFromHistory(state);

		if (this.deleted) {
			logger.error("Intentando eliminar un elemento que ya está eliminado, ", vesselId);
			throw new ItemNotFoundException("id", vesselId);
		}

		if (VesselEventTypes.isLocked(state.getType())) {
			logger.error("Intentando eliminar un elemento bloqueado por una edición en curso, ", vesselId);
			throw new ItemLockedException("id", vesselId);
		}
		checkState(id, state.getType());

		DeleteVesselEvent evt = new DeleteVesselEvent();
		evt.setAggregateId(vesselId);
		evt.setAggregateId(id);
		evt.setVersion(getVersion() + 1);
		return evt;
	}
@@ -135,7 +88,7 @@ public class VesselAggregate extends Aggregate {

		CreateVesselCommand cmd = new CreateVesselCommand(type);

		Event state = vesselStateStore.getVessel(cmd.getVessel().getId());
		Event state = getItemFromStateStore(cmd.getVessel().getId());

		if (state == null) {
			throw new DBNotFoundException("id", cmd.getVessel().getId());
@@ -146,6 +99,18 @@ public class VesselAggregate extends Aggregate {
		return getVessel();
	}

	@Override
	protected boolean isLocked(String eventType) {

		return VesselEventTypes.isLocked(eventType);
	}

	@Override
	protected Event getItemFromStateStore(String id) {

		return vesselStateStore.getVessel(id);
	}

	@Override
	public void loadFromHistory(Event history) {

@@ -155,113 +120,54 @@ public class VesselAggregate extends Aggregate {

		switch (eventType) {
		case "CREATE":
			apply((CreateVesselEvent) history);
			break;
		case "CREATE_CONFIRMED":
			apply((CreateVesselConfirmedEvent) history);
			logger.debug("En fase de creación");
			apply((VesselEvent) history);
			break;
		case "CREATED":
			apply((VesselCreatedEvent) history);
			logger.debug("Item creado");
			apply((VesselEvent) history);
			break;
		case "UPDATE":
			apply((UpdateVesselEvent) history);
			break;
		case "UPDATE_CONFIRMED":
			apply((UpdateVesselConfirmedEvent) history);
			logger.debug("En fase de modificación");
			apply((VesselEvent) history);
			break;
		case "UPDATED":
			apply((VesselUpdatedEvent) history);
			break;
		case "DELETE":
			apply((DeleteVesselEvent) history);
			break;
		case "DELETE_CONFIRMED":
			apply((DeleteVesselConfirmedEvent) history);
			logger.debug("Item modificado");
			apply((VesselEvent) history);
			break;
		case "DELETED":
			logger.debug("Item borrado");
			apply((VesselDeletedEvent) history);
			break;
		// FAILED
		case "CREATE_FAILED":
		case "UPDATE_FAILED":
		case "DELETE_FAILED":
			logger.debug("Evento fallido");
			_apply((SimpleEvent) history);
			break;
		// CANCELLED
		case "CREATE_CANCELLED":
			logger.debug("Compensación por creación fallida");
			apply((CreateVesselCancelledEvent) history);
			break;
		case "UPDATE_CANCELLED":
		case "DELETE_CANCELLED":
			logger.debug("Compensación por edición/borrado fallido");
			_apply((VesselEvent) history);
			apply((VesselEvent) history);
			break;
		default:
			logger.debug("Evento no manejado ", history.getType());
			super._loadFromHistory(history);
			break;
		}
	}

	public void apply(CreateVesselEvent event) {
		logger.debug("En fase de creación");
		_apply(event);
	}

	public void apply(CreateVesselConfirmedEvent event) {
		logger.debug("Creación confirmada");
		_apply(event);
	}

	public void apply(VesselCreatedEvent event) {
		logger.debug("Item creado");
		_apply(event);
	}

	public void apply(CreateVesselCancelledEvent event) {
		logger.debug("Compensación por creación fallida");
		this.deleted = true;
		setVersion(event.getVersion());
		setAggregateId(event.getAggregateId());
	}

	public void apply(UpdateVesselEvent event) {
		logger.debug("En fase de modificación");
		_apply(event);
	}

	public void apply(UpdateVesselConfirmedEvent event) {
		logger.debug("Modificación confirmada");
		_apply(event);
	}

	public void apply(VesselUpdatedEvent event) {
		logger.debug("Item modificado");
		_apply(event);
	}

	public void apply(DeleteVesselEvent event) {
		logger.debug("En fase de borrado");
		this.deleted = true;
		_apply(event);
	}

	public void apply(DeleteVesselConfirmedEvent event) {
		logger.debug("Borrado confirmado");
		this.deleted = true;
		_apply(event);
		apply(event);
	}

	public void apply(VesselDeletedEvent event) {
		logger.debug("Item borrado");
		this.deleted = true;
		_apply(event);
		super.apply(event);
	}

	private void _apply(VesselEvent event) {
	public void apply(VesselEvent event) {
		this.vessel = event.getVessel();
		setVersion(event.getVersion());
		setAggregateId(event.getAggregateId());
		super.apply(event);
	}

	@Override
+42 −133
Original line number Diff line number Diff line
package es.redmic.vesselscommands.aggregate;

import es.redmic.brokerlib.avro.common.Event;
import es.redmic.brokerlib.avro.common.SimpleEvent;
import es.redmic.commandslib.aggregate.Aggregate;
import es.redmic.commandslib.exceptions.HistoryNotFoundException;
import es.redmic.commandslib.exceptions.ItemLockedException;
import es.redmic.exception.data.ItemNotFoundException;
import es.redmic.exception.database.DBNotFoundException;
import es.redmic.vesselscommands.commands.CreateVesselTypeCommand;
import es.redmic.vesselscommands.commands.DeleteVesselTypeCommand;
@@ -15,15 +11,10 @@ import es.redmic.vesselslib.dto.VesselTypeDTO;
import es.redmic.vesselslib.events.vesseltype.VesselTypeEventTypes;
import es.redmic.vesselslib.events.vesseltype.common.VesselTypeEvent;
import es.redmic.vesselslib.events.vesseltype.create.CreateVesselTypeCancelledEvent;
import es.redmic.vesselslib.events.vesseltype.create.CreateVesselTypeConfirmedEvent;
import es.redmic.vesselslib.events.vesseltype.create.CreateVesselTypeEvent;
import es.redmic.vesselslib.events.vesseltype.create.VesselTypeCreatedEvent;
import es.redmic.vesselslib.events.vesseltype.delete.DeleteVesselTypeConfirmedEvent;
import es.redmic.vesselslib.events.vesseltype.delete.DeleteVesselTypeEvent;
import es.redmic.vesselslib.events.vesseltype.delete.VesselTypeDeletedEvent;
import es.redmic.vesselslib.events.vesseltype.update.UpdateVesselTypeConfirmedEvent;
import es.redmic.vesselslib.events.vesseltype.update.UpdateVesselTypeEvent;
import es.redmic.vesselslib.events.vesseltype.update.VesselTypeUpdatedEvent;

public class VesselTypeAggregate extends Aggregate {

@@ -40,26 +31,17 @@ public class VesselTypeAggregate extends Aggregate {

		assert vesselTypeStateStore != null;

		String vesselTypeId = cmd.getVesselType().getId();
		String id = cmd.getVesselType().getId();

		Event state = vesselTypeStateStore.getVesselType(vesselTypeId);

		if (state != null) {

			loadFromHistory(state);

			if (!isDeleted()) {
				logger.info("Descartando vessel type " + vesselTypeId + ". Ya está registrado.");
		if (exist(id)) {
			logger.info("Descartando vessel type " + id + ". Ya está registrado.");
			return null; // Se lanza excepción en el origen no aquí
		}

			reset();
		}

		this.setAggregateId(vesselTypeId);
		this.setAggregateId(id);

		CreateVesselTypeEvent evt = new CreateVesselTypeEvent(cmd.getVesselType());
		evt.setAggregateId(vesselTypeId);
		evt.setAggregateId(id);
		evt.setVersion(1);
		return evt;
	}
@@ -68,29 +50,16 @@ public class VesselTypeAggregate extends Aggregate {

		assert vesselTypeStateStore != null;

		String vesselTypeId = cmd.getVesselType().getId();
		String id = cmd.getVesselType().getId();

		Event state = vesselTypeStateStore.getVesselType(vesselTypeId);

		if (state == null) {
			logger.error("Intentando modificar un elemento del cual no se tiene historial", vesselTypeId);
			throw new HistoryNotFoundException(VesselTypeEventTypes.UPDATE, vesselTypeId);
		}
		Event state = getStateFromHistory(id);

		loadFromHistory(state);

		if (this.deleted) {
			logger.error("Intentando editar un elemento que ya está eliminado, ", vesselTypeId);
			throw new ItemNotFoundException("id", vesselTypeId);
		}

		if (VesselTypeEventTypes.isLocked(state.getType())) {
			logger.error("Intentando modificar un elemento bloqueado por una edición en curso, ", vesselTypeId);
			throw new ItemLockedException("id", vesselTypeId);
		}
		checkState(id, state.getType());

		UpdateVesselTypeEvent evt = new UpdateVesselTypeEvent(cmd.getVesselType());
		evt.setAggregateId(vesselTypeId);
		evt.setAggregateId(id);
		evt.setVersion(getVersion() + 1);
		return evt;
	}
@@ -99,29 +68,16 @@ public class VesselTypeAggregate extends Aggregate {

		assert vesselTypeStateStore != null;

		String vesselTypeId = cmd.getVesselTypeId();
		String id = cmd.getVesselTypeId();

		Event state = vesselTypeStateStore.getVesselType(vesselTypeId);

		if (state == null) {
			logger.error("Intentando eliminar un elemento del cual no se tiene historial, " + vesselTypeId);
			throw new HistoryNotFoundException(VesselTypeEventTypes.UPDATE, vesselTypeId);
		}
		Event state = getStateFromHistory(id);

		loadFromHistory(state);

		if (this.deleted) {
			logger.error("Intentando eliminar un elemento que ya está eliminado, ", vesselTypeId);
			throw new ItemNotFoundException("id", vesselTypeId);
		}

		if (VesselTypeEventTypes.isLocked(state.getType())) {
			logger.error("Intentando eliminar un elemento bloqueado por una edición en curso, ", vesselTypeId);
			throw new ItemLockedException("id", vesselTypeId);
		}
		checkState(id, state.getType());

		DeleteVesselTypeEvent evt = new DeleteVesselTypeEvent();
		evt.setAggregateId(vesselTypeId);
		evt.setAggregateId(id);
		evt.setVersion(getVersion() + 1);
		return evt;
	}
@@ -145,6 +101,18 @@ public class VesselTypeAggregate extends Aggregate {
		return getVesselType();
	}

	@Override
	protected boolean isLocked(String eventType) {

		return VesselTypeEventTypes.isLocked(eventType);
	}

	@Override
	protected Event getItemFromStateStore(String id) {

		return vesselTypeStateStore.getVesselType(id);
	}

	@Override
	public void loadFromHistory(Event history) {

@@ -154,112 +122,53 @@ public class VesselTypeAggregate extends Aggregate {

		switch (eventType) {
		case "CREATE":
			apply((CreateVesselTypeEvent) history);
			break;
		case "CREATE_CONFIRMED":
			apply((CreateVesselTypeConfirmedEvent) history);
			logger.debug("En fase de creación");
			apply((VesselTypeEvent) history);
			break;
		case "CREATED":
			apply((VesselTypeCreatedEvent) history);
			logger.debug("Item creado");
			apply((VesselTypeEvent) history);
			break;
		case "UPDATE":
			apply((UpdateVesselTypeEvent) history);
			break;
		case "UPDATE_CONFIRMED":
			apply((UpdateVesselTypeConfirmedEvent) history);
			logger.debug("En fase de modificación");
			apply((VesselTypeEvent) history);
			break;
		case "UPDATED":
			apply((VesselTypeUpdatedEvent) history);
			break;
		case "DELETE":
			apply((DeleteVesselTypeEvent) history);
			break;
		case "DELETE_CONFIRMED":
			apply((DeleteVesselTypeConfirmedEvent) history);
			logger.debug("Item modificado");
			apply((VesselTypeEvent) history);
			break;
		case "DELETED":
			logger.debug("Item borrado");
			apply((VesselTypeDeletedEvent) history);
			break;
		// FAILED
		case "CREATE_FAILED":
		case "UPDATE_FAILED":
		case "DELETE_FAILED":
			logger.debug("Evento fallido");
			_apply((SimpleEvent) history);
			break;
		// CANCELLED
		case "CREATE_CANCELLED":
			logger.debug("Compensación por creación fallida");
			apply((CreateVesselTypeCancelledEvent) history);
			break;
		case "UPDATE_CANCELLED":
		case "DELETE_CANCELLED":
			logger.debug("Compensación por edición/borrado fallido");
			_apply((VesselTypeEvent) history);
			apply((VesselTypeEvent) history);
			break;
		default:
			break;
		}
			super._loadFromHistory(history);
		}

	public void apply(CreateVesselTypeEvent event) {
		logger.debug("En fase de creación");
		_apply(event);
	}

	public void apply(CreateVesselTypeConfirmedEvent event) {
		logger.debug("Creación confirmada");
		_apply(event);
	}

	public void apply(VesselTypeCreatedEvent event) {
		logger.debug("Item creado");
		_apply(event);
	}

	public void apply(CreateVesselTypeCancelledEvent event) {
		logger.debug("Compensación por creación fallida");
		this.deleted = true;
		setVersion(event.getVersion());
		setAggregateId(event.getAggregateId());
	}

	public void apply(UpdateVesselTypeEvent event) {
		logger.debug("En fase de modificación");
		_apply(event);
	}

	public void apply(UpdateVesselTypeConfirmedEvent event) {
		logger.debug("Modificación confirmada");
		_apply(event);
	}

	public void apply(VesselTypeUpdatedEvent event) {
		logger.debug("Item modificado");
		_apply(event);
	}

	public void apply(DeleteVesselTypeEvent event) {
		logger.debug("En fase de borrado");
		this.deleted = true;
		_apply(event);
	}

	public void apply(DeleteVesselTypeConfirmedEvent event) {
		logger.debug("Borrado confirmado");
		this.deleted = true;
		_apply(event);
		apply(event);
	}

	public void apply(VesselTypeDeletedEvent event) {
		logger.debug("Item borrado");
		this.deleted = true;
		_apply(event);
		super.apply(event);
	}

	private void _apply(VesselTypeEvent event) {
	public void apply(VesselTypeEvent event) {
		this.vesselType = event.getVesselType();
		setVersion(event.getVersion());
		setAggregateId(event.getAggregateId());
		super.apply(event);
	}

	@Override
+63 −14
Original line number Diff line number Diff line
@@ -12,35 +12,59 @@ import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;

import es.redmic.brokerlib.avro.common.Event;
import es.redmic.vesselslib.events.vessel.common.VesselEvent;
import es.redmic.vesselslib.events.vessel.create.CreateVesselEvent;
import es.redmic.vesselslib.events.vessel.create.VesselCreatedEvent;
import es.redmic.vesselslib.events.vessel.delete.DeleteVesselEvent;
import es.redmic.vesselslib.events.vessel.delete.VesselDeletedEvent;
import es.redmic.vesselslib.events.vessel.update.UpdateVesselEvent;
import es.redmic.vesselslib.events.vessel.update.VesselUpdatedEvent;

@RunWith(MockitoJUnitRunner.class)
public class ApplyEventTest extends AggregateBaseTest {

	@Test
	public void applyVesselCreateEvent_ChangeAggrefateState_IfProcessIsOk() {
	public void applyCreateVesselEvent_ChangeAggrefateState_IfProcessIsOk() {

		CreateVesselEvent evt = getCreateVesselEvent();

		agg.apply(evt);

		checkCreateState(evt);
		checkCreateOrUpdateState(evt);
	}

	@Test
	public void applyVesselUpdateEvent_ChangeAggregateState_IfProcessIsOk() {
	public void applyVesselCreatedEvent_ChangeAggrefateState_IfProcessIsOk() {

		VesselCreatedEvent evt = getVesselCreatedEvent();

		agg.apply(evt);

		checkCreateOrUpdateState(evt);
	}

	@Test
	public void applyUpdateVesselEvent_ChangeAggregateState_IfProcessIsOk() {

		UpdateVesselEvent evt = getUpdateVesselEvent();

		agg.apply(evt);

		checkUpdateState(evt);
		checkCreateOrUpdateState(evt);
	}

	@Test
	public void applyVesselUpdatedEvent_ChangeAggregateState_IfProcessIsOk() {

		VesselUpdatedEvent evt = getVesselUpdatedEvent();

		agg.apply(evt);

		checkCreateOrUpdateState(evt);
	}

	@Test
	public void applyVesselDeleteEvent_ChangeAggregateState_IfProcessIsOk() {
	public void applyDeleteVesselEvent_ChangeAggregateState_IfProcessIsOk() {

		DeleteVesselEvent evt = getDeleteVesselEvent();

@@ -49,6 +73,16 @@ public class ApplyEventTest extends AggregateBaseTest {
		checkDeleteState(evt);
	}

	@Test
	public void applyVesselDeletedEvent_ChangeAggregateState_IfProcessIsOk() {

		VesselDeletedEvent evt = getVesselDeletedEvent();

		agg.apply(evt);

		checkDeletedState(evt);
	}

	@Test
	public void loadFromHistory_ChangeAggregateStateToCreate_IfEventIsCreate() {

@@ -56,7 +90,7 @@ public class ApplyEventTest extends AggregateBaseTest {

		agg.loadFromHistory(evt);

		checkCreateState(evt);
		checkCreateOrUpdateState(evt);
	}

	@Test
@@ -66,7 +100,7 @@ public class ApplyEventTest extends AggregateBaseTest {

		agg.loadFromHistory(evt);

		checkUpdateState(evt);
		checkCreateOrUpdateState(evt);
	}

	@Test
@@ -88,14 +122,30 @@ public class ApplyEventTest extends AggregateBaseTest {
		history.add(getUpdateVesselEvent());
		history.add(getDeleteVesselEvent());

		DeleteVesselEvent evt = getDeleteVesselEvent();
		history.add(getDeleteVesselEvent());

		agg.loadFromHistory(evt);
		agg.loadFromHistory(history);

		checkDeleteState(evt);
		checkDeleteState((DeleteVesselEvent) history.get(3));
	}

	@Test
	public void loadFromHistory_ChangeAggregateStateToDeleted_IfEventIsDelete() {

		List<Event> history = new ArrayList<>();

		history.add(getCreateVesselEvent());
		history.add(getUpdateVesselEvent());
		history.add(getDeleteVesselEvent());

		history.add(getVesselDeletedEvent());

		agg.loadFromHistory(history);

		checkDeletedState((VesselDeletedEvent) history.get(3));
	}

	private void checkCreateState(CreateVesselEvent evt) {
	private void checkCreateOrUpdateState(VesselEvent evt) {

		assertEquals(agg.getVersion(), evt.getVersion());
		assertEquals(agg.getAggregateId(), evt.getAggregateId());
@@ -103,15 +153,14 @@ public class ApplyEventTest extends AggregateBaseTest {
		assertFalse(agg.isDeleted());
	}

	private void checkUpdateState(UpdateVesselEvent evt) {
	private void checkDeleteState(DeleteVesselEvent evt) {

		assertEquals(agg.getVersion(), evt.getVersion());
		assertEquals(agg.getAggregateId(), evt.getAggregateId());
		assertEquals(agg.getVessel(), evt.getVessel());
		assertFalse(agg.isDeleted());
	}

	private void checkDeleteState(DeleteVesselEvent evt) {
	private void checkDeletedState(VesselDeletedEvent evt) {

		assertEquals(agg.getVersion(), evt.getVersion());
		assertEquals(agg.getAggregateId(), evt.getAggregateId());
+62 −14
Original line number Diff line number Diff line
@@ -12,35 +12,59 @@ import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;

import es.redmic.brokerlib.avro.common.Event;
import es.redmic.vesselslib.events.vesseltype.common.VesselTypeEvent;
import es.redmic.vesselslib.events.vesseltype.create.CreateVesselTypeEvent;
import es.redmic.vesselslib.events.vesseltype.create.VesselTypeCreatedEvent;
import es.redmic.vesselslib.events.vesseltype.delete.DeleteVesselTypeEvent;
import es.redmic.vesselslib.events.vesseltype.delete.VesselTypeDeletedEvent;
import es.redmic.vesselslib.events.vesseltype.update.UpdateVesselTypeEvent;
import es.redmic.vesselslib.events.vesseltype.update.VesselTypeUpdatedEvent;

@RunWith(MockitoJUnitRunner.class)
public class ApplyEventTest extends AggregateBaseTest {

	@Test
	public void applyVesselTypeCreateEvent_ChangeAggrefateState_IfProcessIsOk() {
	public void applyCreateVesselTypeEvent_ChangeAggrefateState_IfProcessIsOk() {

		CreateVesselTypeEvent evt = getCreateVesselTypeEvent();

		agg.apply(evt);

		checkCreateState(evt);
		checkCreateOrUpdateState(evt);
	}

	@Test
	public void applyVesselTypeUpdateEvent_ChangeAggregateState_IfProcessIsOk() {
	public void applyVesselTypeCreatedEvent_ChangeAggrefateState_IfProcessIsOk() {

		VesselTypeCreatedEvent evt = getVesselTypeCreatedEvent();

		agg.apply(evt);

		checkCreateOrUpdateState(evt);
	}

	@Test
	public void applyUpdateVesselTypeEvent_ChangeAggregateState_IfProcessIsOk() {

		UpdateVesselTypeEvent evt = getUpdateVesselTypeEvent();

		agg.apply(evt);

		checkUpdateState(evt);
		checkCreateOrUpdateState(evt);
	}

	@Test
	public void applyVesselTypeUpdatedEvent_ChangeAggregateState_IfProcessIsOk() {

		VesselTypeUpdatedEvent evt = getVesselTypeUpdatedEvent();

		agg.apply(evt);

		checkCreateOrUpdateState(evt);
	}

	@Test
	public void applyVesselTypeDeleteEvent_ChangeAggregateState_IfProcessIsOk() {
	public void applyDeleteVesselTypeEvent_ChangeAggregateState_IfProcessIsOk() {

		DeleteVesselTypeEvent evt = getDeleteVesselTypeEvent();

@@ -49,6 +73,16 @@ public class ApplyEventTest extends AggregateBaseTest {
		checkDeleteState(evt);
	}

	@Test
	public void applyVesselTypeDeletedEvent_ChangeAggregateState_IfProcessIsOk() {

		VesselTypeDeletedEvent evt = getVesselTypeDeletedEvent();

		agg.apply(evt);

		checkDeletedState(evt);
	}

	@Test
	public void loadFromHistory_ChangeAggregateStateToCreate_IfEventIsCreate() {

@@ -56,7 +90,7 @@ public class ApplyEventTest extends AggregateBaseTest {

		agg.loadFromHistory(evt);

		checkCreateState(evt);
		checkCreateOrUpdateState(evt);
	}

	@Test
@@ -66,7 +100,7 @@ public class ApplyEventTest extends AggregateBaseTest {

		agg.loadFromHistory(evt);

		checkUpdateState(evt);
		checkCreateOrUpdateState(evt);
	}

	@Test
@@ -88,14 +122,29 @@ public class ApplyEventTest extends AggregateBaseTest {
		history.add(getUpdateVesselTypeEvent());
		history.add(getDeleteVesselTypeEvent());

		DeleteVesselTypeEvent evt = getDeleteVesselTypeEvent();
		history.add(getDeleteVesselTypeEvent());

		agg.loadFromHistory(evt);
		agg.loadFromHistory(history);

		checkDeleteState(evt);
		checkDeleteState((DeleteVesselTypeEvent) history.get(3));
	}

	private void checkCreateState(CreateVesselTypeEvent evt) {
	@Test
	public void loadFromHistory_ChangeAggregateStateToDeleted_IfLastEventIsDelete() {

		List<Event> history = new ArrayList<>();

		history.add(getCreateVesselTypeEvent());
		history.add(getUpdateVesselTypeEvent());

		history.add(getVesselTypeDeletedEvent());

		agg.loadFromHistory(history);

		checkDeletedState((VesselTypeDeletedEvent) history.get(2));
	}

	private void checkCreateOrUpdateState(VesselTypeEvent evt) {

		assertEquals(agg.getVersion(), evt.getVersion());
		assertEquals(agg.getAggregateId(), evt.getAggregateId());
@@ -103,15 +152,14 @@ public class ApplyEventTest extends AggregateBaseTest {
		assertFalse(agg.isDeleted());
	}

	private void checkUpdateState(UpdateVesselTypeEvent evt) {
	private void checkDeleteState(DeleteVesselTypeEvent evt) {

		assertEquals(agg.getVersion(), evt.getVersion());
		assertEquals(agg.getAggregateId(), evt.getAggregateId());
		assertEquals(agg.getVesselType(), evt.getVesselType());
		assertFalse(agg.isDeleted());
	}

	private void checkDeleteState(DeleteVesselTypeEvent evt) {
	private void checkDeletedState(VesselTypeDeletedEvent evt) {

		assertEquals(agg.getVersion(), evt.getVersion());
		assertEquals(agg.getAggregateId(), evt.getAggregateId());