blob: 060d8d3d4979e8072b5ce12b3c82e3b59b051a08 [file] [log] [blame]
/*
* Copyright 2011 Marc Grue.
*
* 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.apache.zest.sample.dcicargo.sample_a.context.shipping.handling;
import java.util.Date;
import org.junit.Before;
import org.junit.Test;
import org.apache.zest.api.unitofwork.UnitOfWork;
import org.apache.zest.sample.dcicargo.sample_a.bootstrap.test.TestApplication;
import org.apache.zest.sample.dcicargo.sample_a.context.shipping.booking.BookNewCargo;
import org.apache.zest.sample.dcicargo.sample_a.data.entity.CargosEntity;
import org.apache.zest.sample.dcicargo.sample_a.data.shipping.cargo.Cargo;
import org.apache.zest.sample.dcicargo.sample_a.data.shipping.cargo.Cargos;
import org.apache.zest.sample.dcicargo.sample_a.data.shipping.cargo.TrackingId;
import org.apache.zest.sample.dcicargo.sample_a.data.shipping.delivery.Delivery;
import org.apache.zest.sample.dcicargo.sample_a.data.shipping.delivery.RoutingStatus;
import org.apache.zest.sample.dcicargo.sample_a.data.shipping.delivery.TransportStatus;
import org.apache.zest.sample.dcicargo.sample_a.data.shipping.itinerary.Itinerary;
import org.apache.zest.sample.dcicargo.sample_a.data.shipping.location.Location;
import org.apache.zest.sample.dcicargo.sample_a.data.shipping.voyage.Voyage;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.apache.zest.sample.dcicargo.sample_a.data.shipping.handling.HandlingEventType.UNLOAD;
/**
* Testing the Register Handling Event use case.
*
* Test method names describe the test purpose. The prefix refers to the step in the use case.
*/
public class RegisterHandlingEventTest
extends TestApplication
{
Date time;
String trackId;
String msg;
private Date arrival;
private Cargo cargo;
private TrackingId trackingId;
private Cargos CARGOS;
private Location HONGKONG;
private Location STOCKHOLM;
private Location NEWYORK;
private Location DALLAS;
private Voyage V100S;
private Voyage V200T;
private Voyage V300A;
@Before
public void beforeEachTest() throws Exception {
UnitOfWork uow = module.currentUnitOfWork();
CARGOS = uow.get(Cargos.class, CargosEntity.CARGOS_ID );
HONGKONG = uow.get( Location.class, CNHKG.code().get() );
STOCKHOLM = uow.get( Location.class, SESTO.code().get() );
NEWYORK = uow.get( Location.class, USNYC.code().get() );
DALLAS = uow.get( Location.class, USDAL.code().get() );
V100S = uow.get( Voyage.class, "V100S" );
V200T = uow.get( Voyage.class, "V200T" );
V300A = uow.get( Voyage.class, "V300A" );
trackingId = new BookNewCargo( CARGOS, HONGKONG, STOCKHOLM, day( 17 ) ).createCargo( "ABC" );
cargo = uow.get( Cargo.class, trackingId.id().get() );
Itinerary itinerary = itinerary(
leg( V100S, HONGKONG, NEWYORK, day( 1 ), day( 8 ) ),
leg( V200T, NEWYORK, DALLAS, day( 9 ), day( 12 ) ),
leg( V300A, DALLAS, STOCKHOLM, day( 13 ),
arrival = day( 16 ) )
);
new BookNewCargo( cargo, itinerary ).assignCargoToRoute();
time = day( 1 );
trackId = trackingId.id().get();
}
// INPUT EXISTENCE VALIDATION ==================================================================
@Test
public void deviation_2a_MissingRegistrationTime() throws Exception
{
msg = register( null, time, trackId, "RECEIVE", "CNHKG", null );
assertThat( msg, is( equalTo( "Registration time was null. All parameters have to be passed." ) ) );
}
@Test
public void deviation_2a_MissingCompletionTime() throws Exception
{
msg = register( time, null, trackId, "RECEIVE", "CNHKG", null );
assertThat( msg, is( equalTo( "Completion time was null. All parameters have to be passed." ) ) );
}
@Test
public void deviation_2a_MissingTrackingId() throws Exception
{
msg = register( time, time, null, "RECEIVE", "CNHKG", null );
assertThat( msg, is( equalTo( "Tracking id was null. All parameters have to be passed." ) ) );
}
@Test
public void deviation_2a_EmptyTrackingId() throws Exception
{
msg = register( time, time, "", "RECEIVE", "CNHKG", null );
assertThat( msg, is( equalTo( "Tracking id cannot be empty." ) ) );
}
@Test
public void deviation_2a_MissingEventType() throws Exception
{
msg = register( time, time, trackId, null, "CNHKG", null );
assertThat( msg, is( equalTo( "Event type was null. All parameters have to be passed." ) ) );
}
@Test
public void deviation_2a_EmptyEventType() throws Exception
{
msg = register( time, time, trackId, "", "CNHKG", null );
assertThat( msg, is( equalTo( "Event type cannot be empty." ) ) );
}
@Test
public void deviation_2a_MissingUnlocode() throws Exception
{
msg = register( time, time, trackId, "RECEIVE", null, null );
assertThat( msg, is( equalTo( "UnLocode was null. All parameters have to be passed." ) ) );
}
@Test
public void deviation_2a_EmptyUnlocode() throws Exception
{
msg = register( time, time, trackId, "RECEIVE", "", null );
assertThat( msg, is( equalTo( "UnLocode cannot be empty." ) ) );
}
@Test
public void step_2_CompleteData__Receive_in_Hong_Kong() throws Exception
{
new RegisterHandlingEvent( time, time, trackId, "RECEIVE", "CNHKG", null ).register();
}
// INPUT VALIDATION ==================================================================
@Test
public void deviation_3a_HandlingTypeNotRecognized() throws Exception
{
msg = register( time, time, trackId, "RECEIPT", "CNHKG", null );
assertThat( msg, is( equalTo(
"'RECEIPT' is not a valid handling event type. Valid types are: [RECEIVE, LOAD, UNLOAD, CUSTOMS, CLAIM]" ) ) );
}
@Test
public void deviation_3b_NoCargoWithTrackingId() throws Exception
{
msg = register( time, time, "XXX", "RECEIVE", "CNHKG", null );
assertThat( msg, is( equalTo( "Found no cargo with tracking id 'XXX'." ) ) );
}
@Test
public void deviation_3c_CargoNotRoutedYet() throws Exception
{
TrackingId nonRoutedTrackingId = new BookNewCargo( CARGOS, HONGKONG, STOCKHOLM, day( 17 ) ).createCargo( "NonRoutedCargo" );
String nonRouted = nonRoutedTrackingId.id().get();
msg = register( time, time, nonRouted, "RECEIVE", "CNHKG", null );
assertThat( msg, is( equalTo( "Can't create handling event for non-routed cargo '" + nonRouted + "'." ) ) );
}
@Test
public void deviation_3d_NoLocationWithUnlocode() throws Exception
{
msg = register( time, time, trackId, "RECEIVE", "ZZZZZ", null );
assertThat( msg, is( equalTo( "Unknown location: ZZZZZ" ) ) );
}
@Test
public void deviation_3e_1a_MissingVoyageNumber() throws Exception
{
msg = register( time, time, trackId, "LOAD", "CNHKG", null );
assertThat( msg, is( equalTo( "Handling event LOAD requires a voyage. No voyage number submitted." ) ) );
}
@Test
public void deviation_3e_1b_MissingVoyage() throws Exception
{
msg = register( time, time, trackId, "LOAD", "CNHKG", "V600S" );
assertThat( msg, is( equalTo( "Found no voyage with voyage number 'V600S'." ) ) );
}
@Test
public void deviation_3f_SkipVoyageNumberSilentlyWhenProhibited() throws Exception
{
new RegisterHandlingEvent( time, time, trackId, "RECEIVE", "CNHKG", "V100S" ).register();
assertThat( cargo.delivery().get().currentVoyage().get(), is( equalTo( null ) ) );
}
@Test
public void step_3_to_5_ValidRegistration__Load_in_Hong_Kong() throws Exception
{
new RegisterHandlingEvent( time, time, trackId, "LOAD", "CNHKG", "V100S" ).register();
Delivery delivery = cargo.delivery().get();
assertThat( delivery.routingStatus().get(), is( equalTo( RoutingStatus.ROUTED ) ) );
assertThat( delivery.transportStatus().get(), is( equalTo( TransportStatus.ONBOARD_CARRIER ) ) );
assertThat( delivery.nextExpectedHandlingEvent().get().handlingEventType().get(), is( equalTo( UNLOAD ) ) );
assertThat( delivery.nextExpectedHandlingEvent().get().location().get(), is( equalTo( NEWYORK ) ) );
assertThat( delivery.nextExpectedHandlingEvent().get().voyage().get(), is( equalTo( V100S ) ) );
assertThat( delivery.lastKnownLocation().get(), is( equalTo( HONGKONG ) ) );
assertThat( delivery.currentVoyage().get(), is( equalTo( V100S ) ) );
assertThat( delivery.eta().get(), is( equalTo( arrival ) ) );
assertThat( delivery.isMisdirected().get(), is( equalTo( false ) ) );
assertThat( delivery.isUnloadedAtDestination().get(), is( equalTo( false ) ) );
}
private String register( Date registrationTime,
Date completionTime,
String trackingIdString,
String eventTypeString,
String unLocodeString,
String voyageNumberString ) throws Exception
{
try
{
new RegisterHandlingEvent( registrationTime,
completionTime,
trackingIdString,
eventTypeString,
unLocodeString,
voyageNumberString ).register();
}
catch (IllegalArgumentException e)
{
return e.getMessage();
}
throw new Exception( "Unexpected exception." );
}
}