Skip to content

Commit

Permalink
Merge branch 'integrationTesting' into INT-B-22309
Browse files Browse the repository at this point in the history
  • Loading branch information
begrohmann authored Feb 17, 2025
2 parents 49868dc + 13bb32d commit e8afaaf
Show file tree
Hide file tree
Showing 10 changed files with 587 additions and 9 deletions.
6 changes: 6 additions & 0 deletions pkg/handlers/primeapi/mto_service_item_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,13 @@ func (suite *HandlerSuite) TestCreateMTOServiceItemHandler() {
Model: mto,
LinkOnly: true,
},
{
Model: models.MTOShipment{
MarketCode: models.MarketCodeInternational,
},
},
}, nil)

mtoShipment.PrimeEstimatedWeight = nil
req := httptest.NewRequest("POST", "/mto-service-items", nil)
reason := "lorem ipsum"
Expand Down
5 changes: 5 additions & 0 deletions pkg/handlers/primeapiv2/mto_service_item_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,11 @@ func (suite *HandlerSuite) TestCreateMTOServiceItemHandler() {
Model: mto,
LinkOnly: true,
},
{
Model: models.MTOShipment{
MarketCode: models.MarketCodeInternational,
},
},
}, nil)
mtoShipment.PrimeEstimatedWeight = nil
factory.FetchReServiceByCode(suite.DB(), models.ReServiceCodeDOSHUT)
Expand Down
5 changes: 5 additions & 0 deletions pkg/handlers/primeapiv3/mto_service_item_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,11 @@ func (suite *HandlerSuite) TestCreateMTOServiceItemHandler() {
Model: mto,
LinkOnly: true,
},
{
Model: models.MTOShipment{
MarketCode: models.MarketCodeInternational,
},
},
}, nil)
mtoShipment.PrimeEstimatedWeight = nil
factory.FetchReServiceByCode(suite.DB(), models.ReServiceCodeDOSHUT)
Expand Down
23 changes: 23 additions & 0 deletions pkg/services/mto_service_item/mto_service_item_creator.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package mtoserviceitem
import (
"database/sql"
"fmt"
"slices"
"strconv"
"time"

Expand Down Expand Up @@ -710,6 +711,10 @@ func (o *mtoServiceItemCreator) CreateMTOServiceItem(appCtx appcontext.AppContex
return err
}
} else {
if isInternationalServiceItem(requestedServiceItem) {
err := fmt.Errorf("cannot create international service items for domestic shipment: %s", mtoShipment.ID)
return apperror.NewInvalidInputError(mtoShipment.ID, err, nil, err.Error())
}
verrs, err = o.builder.CreateOne(txnAppCtx, requestedServiceItem)
if verrs != nil || err != nil {
return fmt.Errorf("%#v %e", verrs, err)
Expand Down Expand Up @@ -1013,3 +1018,21 @@ func GetAdjustedWeight(incomingWeight unit.Pound, isUB bool) *unit.Pound {
}
return adjustedWeight
}

func isInternationalServiceItem(serviceItem *models.MTOServiceItem) bool {
var internationalAccessorialServiceItems = []models.ReServiceCode{
models.ReServiceCodeICRT,
models.ReServiceCodeIUCRT,
models.ReServiceCodeIOASIT,
models.ReServiceCodeIDASIT,
models.ReServiceCodeIOFSIT,
models.ReServiceCodeIDFSIT,
models.ReServiceCodeIOPSIT,
models.ReServiceCodeIDDSIT,
models.ReServiceCodeIDSHUT,
models.ReServiceCodeIOSHUT,
models.ReServiceCodeIOSFSC,
models.ReServiceCodeIDSFSC,
}
return slices.Contains(internationalAccessorialServiceItems, serviceItem.ReService.Code)
}
116 changes: 116 additions & 0 deletions pkg/services/mto_service_item/mto_service_item_creator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2070,6 +2070,122 @@ func (suite *MTOServiceItemServiceSuite) TestCreateDestSITServiceItem() {
suite.NotEmpty(invalidInputError.ValidationErrors)
suite.Contains(invalidInputError.ValidationErrors.Keys(), "reServiceCode")
})

suite.Run("Failure - cannot create domestic service item international domestic shipment", func() {
move := factory.BuildAvailableToPrimeMove(suite.DB(), nil, nil)
dimension := models.MTOServiceItemDimension{
Type: models.DimensionTypeItem,
Length: 12000,
Height: 12000,
Width: 12000,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}

// setup domestic shipment
shipment := factory.BuildMTOShipment(suite.DB(), []factory.Customization{
{
Model: move,
LinkOnly: true,
},
{
Model: models.MTOShipment{
MarketCode: models.MarketCodeInternational,
},
},
}, nil)
destAddress := factory.BuildDefaultAddress(suite.DB())

// setup international service item. must fail validation for a domestic shipment
reServiceDDFSIT := factory.FetchReServiceByCode(suite.DB(), models.ReServiceCodeDDFSIT)
internationalServiceItem := models.MTOServiceItem{
MoveTaskOrderID: move.ID,
MoveTaskOrder: move,
ReService: reServiceDDFSIT,
MTOShipmentID: &shipment.ID,
MTOShipment: shipment,
Dimensions: models.MTOServiceItemDimensions{dimension},
Status: models.MTOServiceItemStatusSubmitted,
SITDestinationFinalAddressID: &destAddress.ID,
SITDestinationFinalAddress: &destAddress,
}

builder := query.NewQueryBuilder()
moveRouter := moverouter.NewMoveRouter()
planner := &mocks.Planner{}
planner.On("ZipTransitDistance",
mock.AnythingOfType("*appcontext.appContext"),
mock.Anything,
mock.Anything,
false,
).Return(400, nil)
creator := NewMTOServiceItemCreator(planner, builder, moveRouter, ghcrateengine.NewDomesticUnpackPricer(), ghcrateengine.NewDomesticPackPricer(), ghcrateengine.NewDomesticLinehaulPricer(), ghcrateengine.NewDomesticShorthaulPricer(), ghcrateengine.NewDomesticOriginPricer(), ghcrateengine.NewDomesticDestinationPricer(), ghcrateengine.NewFuelSurchargePricer())

createdServiceItems, _, err := creator.CreateMTOServiceItem(suite.AppContextForTest(), &internationalServiceItem)
suite.Nil(createdServiceItems)
suite.Error(err)
suite.IsType(apperror.InvalidInputError{}, err)

suite.Contains(err.Error(), "cannot create domestic service items for international shipment")
})

suite.Run("Failure - cannot create international service item for domestic shipment", func() {
move := factory.BuildAvailableToPrimeMove(suite.DB(), nil, nil)
dimension := models.MTOServiceItemDimension{
Type: models.DimensionTypeItem,
Length: 12000,
Height: 12000,
Width: 12000,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}

// setup domestic shipment
shipment := factory.BuildMTOShipment(suite.DB(), []factory.Customization{
{
Model: move,
LinkOnly: true,
},
{
Model: models.MTOShipment{
MarketCode: models.MarketCodeDomestic,
},
},
}, nil)
destAddress := factory.BuildDefaultAddress(suite.DB())

// setup international service item. must fail validation for a domestic shipment
reServiceIDFSIT := factory.FetchReServiceByCode(suite.DB(), models.ReServiceCodeIDFSIT)
internationalServiceItem := models.MTOServiceItem{
MoveTaskOrderID: move.ID,
MoveTaskOrder: move,
ReService: reServiceIDFSIT,
MTOShipmentID: &shipment.ID,
MTOShipment: shipment,
Dimensions: models.MTOServiceItemDimensions{dimension},
Status: models.MTOServiceItemStatusSubmitted,
SITDestinationFinalAddressID: &destAddress.ID,
SITDestinationFinalAddress: &destAddress,
}

builder := query.NewQueryBuilder()
moveRouter := moverouter.NewMoveRouter()
planner := &mocks.Planner{}
planner.On("ZipTransitDistance",
mock.AnythingOfType("*appcontext.appContext"),
mock.Anything,
mock.Anything,
false,
).Return(400, nil)
creator := NewMTOServiceItemCreator(planner, builder, moveRouter, ghcrateengine.NewDomesticUnpackPricer(), ghcrateengine.NewDomesticPackPricer(), ghcrateengine.NewDomesticLinehaulPricer(), ghcrateengine.NewDomesticShorthaulPricer(), ghcrateengine.NewDomesticOriginPricer(), ghcrateengine.NewDomesticDestinationPricer(), ghcrateengine.NewFuelSurchargePricer())

createdServiceItems, _, err := creator.CreateMTOServiceItem(suite.AppContextForTest(), &internationalServiceItem)
suite.Nil(createdServiceItems)
suite.Error(err)
suite.IsType(apperror.InvalidInputError{}, err)

suite.Contains(err.Error(), "cannot create international service items for domestic shipment")
})
}

func (suite *MTOServiceItemServiceSuite) TestPriceEstimator() {
Expand Down
18 changes: 13 additions & 5 deletions pkg/services/mto_service_item/mto_service_item_updater.go
Original file line number Diff line number Diff line change
Expand Up @@ -373,7 +373,11 @@ func (p *mtoServiceItemUpdater) updateServiceItem(appCtx appcontext.AppContext,
if (serviceItem.ReService.Code == models.ReServiceCodeDDDSIT ||
serviceItem.ReService.Code == models.ReServiceCodeDDSFSC ||
serviceItem.ReService.Code == models.ReServiceCodeDDASIT ||
serviceItem.ReService.Code == models.ReServiceCodeDDFSIT) &&
serviceItem.ReService.Code == models.ReServiceCodeDDFSIT ||
serviceItem.ReService.Code == models.ReServiceCodeIDDSIT ||
serviceItem.ReService.Code == models.ReServiceCodeIDSFSC ||
serviceItem.ReService.Code == models.ReServiceCodeIDASIT ||
serviceItem.ReService.Code == models.ReServiceCodeIDFSIT) &&
serviceItem.SITDestinationOriginalAddressID == nil {

// Set the original address on a service item to the shipment's
Expand Down Expand Up @@ -401,9 +405,11 @@ func (p *mtoServiceItemUpdater) updateServiceItem(appCtx appcontext.AppContext,
serviceItem.SITDestinationFinalAddress = shipmentDestinationAddress
}

// Calculate SITDeliveryMiles for DDDSIT and DDSFSC origin SIT service items
// Calculate SITDeliveryMiles for DDDSIT/DDSFSC, IDDSIT/IDSFSC origin SIT service items
if serviceItem.ReService.Code == models.ReServiceCodeDDDSIT ||
serviceItem.ReService.Code == models.ReServiceCodeDDSFSC {
serviceItem.ReService.Code == models.ReServiceCodeDDSFSC ||
serviceItem.ReService.Code == models.ReServiceCodeIDDSIT ||
serviceItem.ReService.Code == models.ReServiceCodeIDSFSC {
// Destination SIT: distance between shipment destination address & service item ORIGINAL destination address
milesCalculated, err := p.planner.ZipTransitDistance(appCtx, mtoShipment.DestinationAddress.PostalCode, serviceItem.SITDestinationOriginalAddress.PostalCode, false)
if err != nil {
Expand All @@ -413,9 +419,11 @@ func (p *mtoServiceItemUpdater) updateServiceItem(appCtx appcontext.AppContext,
}

}
// Calculate SITDeliveryMiles for DOPSIT and DOSFSC origin SIT service items
// Calculate SITDeliveryMiles for DOPSIT/DOSFSC, IOPSIT/IOSFSC origin SIT service items
if serviceItem.ReService.Code == models.ReServiceCodeDOPSIT ||
serviceItem.ReService.Code == models.ReServiceCodeDOSFSC {
serviceItem.ReService.Code == models.ReServiceCodeDOSFSC ||
serviceItem.ReService.Code == models.ReServiceCodeIOPSIT ||
serviceItem.ReService.Code == models.ReServiceCodeIOSFSC {
// Origin SIT: distance between shipment pickup address & service item ORIGINAL pickup address
milesCalculated, err := p.planner.ZipTransitDistance(appCtx, mtoShipment.PickupAddress.PostalCode, serviceItem.SITOriginHHGOriginalAddress.PostalCode, false)
if err != nil {
Expand Down
Loading

0 comments on commit e8afaaf

Please sign in to comment.