public async Task AddLoadStatusTransaction() { var inTransitStatus = new LoadStatusInTransitData { LoadId = VALID_LOAD_ID, LocationTime = new DateTimeOffset(new DateTime(2020, 2, 11, 10, 0, 0)), //Oregon Latitude = 46.161605m, Longitude = -123.414906m }; _carrierWebApiService.Setup(_ => _.Send <InTransitLoadData>(It.IsAny <LoadStatusEvent <InTransitLoadData> >())) .ReturnsAsync(new LoadStatusEvent <CarrierApiResponseMessages> { MessageId = Guid.Parse("44444444-4444-4444-4444-555555555555"), MessageTime = new DateTimeOffset(new DateTime(2020, 2, 11, 12, 13, 14)) }); _svc = CreateService(); var response = await _svc.AddInTransitStatus(inTransitStatus); response.IsSuccess.Should().BeTrue(); _dbBuilder.MockLoadStatusTransactions.Verify(_ => _.Add(It.Is <LoadStatusTransactionEntity>(x => x.MessageId == Guid.Parse("44444444-4444-4444-4444-555555555555") && x.MessageTime == new DateTimeOffset(new DateTime(2020, 2, 11, 12, 13, 14)) && x.LoadId == VALID_LOAD_ID //can't verity the TransactionDtTm since it's using DateTime.Now ))); }
/// <summary> /// Adds in transit status if most recent event was a departure /// </summary> /// <param name="stopData"></param> /// <param name="load"></param> /// <returns></returns> public async Task <LoadStatusInTransitData> AddInTransitStopStatus(LoadStatusStopData stopData, LoadEntity load) { var mostRecentStop = stopData?.Events?.OrderBy(x => x.StopNumber).LastOrDefault(); if (mostRecentStop?.EventType == StopEventTypeEnum.Departure) { var mostRecentLoadStop = load?.LoadStops?.FirstOrDefault(_ => _.StopNbr == mostRecentStop.StopNumber); if (mostRecentLoadStop != null) { var inTransitStopData = new LoadStatusInTransitData() { LoadId = load.LoadId, LocationTime = mostRecentStop.EventTime, // https://kbxltrans.visualstudio.com/Suite/_workitems/edit/40298 Latitude = mostRecentLoadStop.Latitude, Longitude = mostRecentLoadStop.Longitude }; await AddInTransitStatus(inTransitStopData); return(inTransitStopData); } } return(null); }
public async Task SubmitsCorrectInTransitTime() { var inTransitStatus = new LoadStatusInTransitData { LoadId = VALID_LOAD_ID, LocationTime = new DateTimeOffset(new DateTime(2020, 2, 11, 10, 0, 0)), //Oregon Latitude = 46.161605m, Longitude = -123.414906m }; _carrierWebApiService.Setup(_ => _.Send <InTransitLoadData>(It.IsAny <LoadStatusEvent <InTransitLoadData> >())) .ReturnsAsync(new LoadStatusEvent <CarrierApiResponseMessages> { MessageId = Guid.Parse("44444444-4444-4444-4444-555555555555"), MessageTime = new DateTimeOffset(new DateTime(2020, 2, 11, 12, 13, 14)) }); _svc = CreateService(); var response = await _svc.AddInTransitStatus(inTransitStatus); response.IsSuccess.Should().BeTrue(); _carrierWebApiService.Verify(_ => _.Send <InTransitLoadData>(It.Is <LoadStatusEvent <InTransitLoadData> >( e => e.MessageType == "LoadLocation" && e.ApiVersion == "1.1" && e.Payload.Loads[0].LoadNumber == VALID_REF_LOAD_ID && e.Payload.Loads[0].Latitude == 46.161605m && e.Payload.Loads[0].Longitude == -123.414906m && e.Payload.Loads[0].LocationTime == "2020-02-11T10:00:00" && e.Payload.Loads[0].IsLocalTime == true ))); }
public async Task PreventsFutureTimeForTimeZone() { var inTransitStatus = new LoadStatusInTransitData { LoadId = VALID_LOAD_ID, LocationTime = new DateTimeOffset(DateTime.Now),//Assuming this is central time //Oregon Latitude = 46.161605m, Longitude = -123.414906m }; _carrierWebApiService.Setup(_ => _.Send <InTransitLoadData>(It.IsAny <LoadStatusEvent <InTransitLoadData> >())) .ReturnsAsync(new LoadStatusEvent <CarrierApiResponseMessages> { MessageId = Guid.Parse("44444444-4444-4444-4444-555555555555"), MessageTime = new DateTimeOffset(new DateTime(2020, 2, 11, 12, 13, 14)) }); _svc = CreateService(); var response = await _svc.AddInTransitStatus(inTransitStatus); response.IsSuccess.Should().BeFalse(); AssertHasError(response, $"urn:root:LocationTime", "Status Date/Time must be in the past"); }
public async Task LoadNotAcceptedOrPending() { var inTransitStatus = new LoadStatusInTransitData { LoadId = UNBOOKED_LOAD_ID }; _svc = CreateService(); Func <Task> action = async() => await _svc.AddInTransitStatus(inTransitStatus); (await action.Should().ThrowAsync <Exception>()).WithMessage("Load not accepted"); }
public async Task LoadNotFound() { var inTransitStatus = new LoadStatusInTransitData { LoadId = INVALID_LOAD_ID }; _svc = CreateService(); Func <Task> action = async() => await _svc.AddInTransitStatus(inTransitStatus); (await action.Should().ThrowAsync <Exception>()).WithMessage("Load not found"); }
public async Task SubmitsBillingLoadId() { var load = VALID_LOAD; load.PlatformPlusLoadId = "PLATFORM_PLUS_ID"; load.LatestLoadTransaction.Claim.BillingLoadId = "BILLING_LOAD_ID"; var loads = new List <LoadEntity> { load }; _dbBuilder = new MockDbBuilder(); _db = _dbBuilder .WithLoads(loads) .WithUsers(new List <UserEntity> { VALID_CARRIER_USER }) .Build(); var inTransitStatus = new LoadStatusInTransitData { LoadId = VALID_LOAD_ID, LocationTime = new DateTimeOffset(new DateTime(2020, 2, 11, 10, 0, 0)), //Oregon Latitude = 46.161605m, Longitude = -123.414906m }; _carrierWebApiService.Setup(_ => _.Send <InTransitLoadData>(It.IsAny <LoadStatusEvent <InTransitLoadData> >())) .ReturnsAsync(new LoadStatusEvent <CarrierApiResponseMessages> { MessageId = Guid.Parse("44444444-4444-4444-4444-555555555555"), MessageTime = new DateTimeOffset(new DateTime(2020, 2, 11, 12, 13, 14)) }); _svc = CreateService(); var response = await _svc.AddInTransitStatus(inTransitStatus); response.IsSuccess.Should().BeTrue(); _carrierWebApiService.Verify(_ => _.Send <InTransitLoadData>(It.Is <LoadStatusEvent <InTransitLoadData> >( e => e.MessageType == "LoadLocation" && e.ApiVersion == "1.1" && e.Payload.Loads[0].LoadNumber == "BILLING_LOAD_ID" && e.Payload.Loads[0].Latitude == 46.161605m && e.Payload.Loads[0].Longitude == -123.414906m && e.Payload.Loads[0].LocationTime == "2020-02-11T10:00:00" && e.Payload.Loads[0].IsLocalTime == true ))); }
public async Task UserHasWrongPrimaryScac() { var inTransitStatus = new LoadStatusInTransitData { LoadId = VALID_LOAD_ID }; _userContext.SetupGet(_ => _.UserId).Returns(INVALID_USER_ID); _svc = CreateService(); Func <Task> action = async() => await _svc.AddInTransitStatus(inTransitStatus); (await action.Should().ThrowAsync <Exception>()).WithMessage("Load not found"); }
public async Task LocationLongitudeIsNull() { var inTransitStatus = new LoadStatusInTransitData { LoadId = VALID_LOAD_ID, LocationTime = new DateTimeOffset(new DateTime(2020, 2, 11, 10, 0, 0)), Latitude = 0, Longitude = null }; _svc = CreateService(); var response = await _svc.AddInTransitStatus(inTransitStatus); response.IsSuccess.Should().BeFalse(); AssertHasError(response, $"urn:root:Longitude", "Location is required"); }
public async Task LocationIsNull() { var inTransitStatus = new LoadStatusInTransitData { LoadId = VALID_LOAD_ID, LocationTime = null, Latitude = 0, Longitude = 0 }; _svc = CreateService(); var response = await _svc.AddInTransitStatus(inTransitStatus); response.IsSuccess.Should().BeFalse(); AssertHasError(response, $"urn:root:LocationTime", "Status Date/Time is required"); }
public async Task <IActionResult> PostInTransitStatus([FromBody] LoadStatusInTransitData inTransitStatus) { var response = await _loadStatusTransactionService.AddInTransitStatus(inTransitStatus); if (!response.IsSuccess) { var problemDetails = new ValidationProblemDetails(response.ModelState) { Title = "Send \"In Transit\" Status", Detail = "One or more errors occurred when trying to update the In Transit status of the load. See form for error details", Status = (int)HttpStatusCode.BadRequest, Instance = $"urn:kbxl:error:{Guid.NewGuid()}" }; return(BadRequest(problemDetails)); } var data = await _loadStatusTransactionService.GetLatestStatus(inTransitStatus.LoadId); return(Success(data)); }
public async Task UserDoesNotHaveAction() { var inTransitStatus = new LoadStatusInTransitData { LoadId = VALID_LOAD_ID }; _securityService.Setup(_ => _.UserHasActionAsync(It.IsAny <string[]>())).ReturnsAsync(false); _svc = CreateService(); Func <Task> action = async() => await _svc.AddInTransitStatus(inTransitStatus); await action.Should().ThrowAsync <Exception>(); _securityService.Verify(_ => _.UserHasActionAsync(It.Is <string[]>(actions => actions != null && actions.Length == 1 && actions[0] == SecurityActions.Loadshop_Ui_My_Loads_Status_Update ))); }
public async Task <BaseServiceResponse> AddInTransitStatus(LoadStatusInTransitData inTransitData) { await _securityService.GuardActionAsync(SecurityActions.Loadshop_Ui_My_Loads_Status_Update); var(load, scac) = await GetLoadAndScac(inTransitData.LoadId, includeStops : false); //Adjust the time if it's close to current bool inFuture; (inTransitData.LocationTime, inFuture) = AdjustLocationTime(inTransitData.LocationTime, inTransitData.Latitude, inTransitData.Longitude); var response = new BaseServiceResponse(); if (inTransitData.LocationTime == null) { response.AddError($"urn:root:{nameof(LoadStatusInTransitData.LocationTime)}", "Status Date/Time is required"); } else if (inFuture) { response.AddError($"urn:root:{nameof(LoadStatusInTransitData.LocationTime)}", "Status Date/Time must be in the past"); } if (inTransitData.Latitude == null) { response.AddError($"urn:root:{nameof(LoadStatusInTransitData.Latitude)}", "Location is required"); } else if (inTransitData.Longitude == null) { response.AddError($"urn:root:{nameof(LoadStatusInTransitData.Longitude)}", "Location is required"); } if (!response.IsSuccess) { return(response); } var currentTime = DateTimeOffset.UtcNow; var lst = new LoadStatusTransactionEntity { LoadId = load.LoadId, TransactionDtTm = currentTime.DateTime//this may not be needed anymore if we can send the MessageTime }; var eventResponse = await _carrierWebAPIService.Send(new LoadStatusEvent <InTransitLoadData> { MessageType = "LoadLocation", MessageId = Guid.NewGuid(), MessageTime = DateTimeOffset.Now, ApiVersion = "1.1", Payload = new InTransitLoadData { Loads = new InTransitEventData[] { new InTransitEventData { LoadNumber = load.LatestLoadTransaction.Claim.BillingLoadId ?? load.PlatformPlusLoadId ?? load.ReferenceLoadId, Latitude = inTransitData.Latitude.Value, Longitude = inTransitData.Longitude.Value, LocationTime = inTransitData.LocationTime?.ToString("yyyy-MM-ddTHH:mm:ss"), IsLocalTime = true, //Always true if in local status time Scac = scac } } } }); lst.MessageId = eventResponse.MessageId; lst.MessageTime = eventResponse.MessageTime; _context.LoadStatusTransactions.Add(lst); await _context.SaveChangesAsync(_userContext.UserName); return(response); }