public void CreateNewTConnectRequestIfNeeded_2ndRqstForVehicle_Passes() { using (IDbContext idtoFakeContext = new IDTOFakeContext()) using (IUnitOfWork unitOfWork = new UnitOfWork(idtoFakeContext)) { List <Step> steps; TConnect mt; Trip trip; SetupUowWithTripAndTConnect(unitOfWork, out trip, out steps, out mt); //Add a TConnectedVehicle row to simulate someone else already creating it,so that //the one we add will grab a reference to this one instead of making one. TConnectedVehicle newTv = new TConnectedVehicle(); newTv.OriginallyScheduledDeparture = steps[2].StartDate; newTv.TConnectStopCode = steps[2].FromStopCode; newTv.ModifiedBy = "test"; newTv.ModifiedDate = DateTime.UtcNow; unitOfWork.Repository <TConnectedVehicle>().Insert(newTv); unitOfWork.Save(); DateTime newEta = steps[0].EndDate.AddMinutes(11);//make sure we're late CreateNewTConnectRequestIfNeeded(unitOfWork, mt, newEta, steps[2]); TConnectRequest treq = unitOfWork.Repository <TConnectRequest>().Query().Get().First(); Assert.AreEqual(5, treq.RequestedHoldMinutes); TConnectedVehicle tveh = unitOfWork.Repository <TConnectedVehicle>().Query().Get().First(); Assert.AreEqual(0, tveh.CurrentAcceptedHoldMinutes, "TConnectedVehicle instance should be created, but still have an accepted time of 0 since no requests have been accepted yet."); } }
public void MonitorTConnect_UpdateExistingTConnect_Passes() { using (IDbContext idtoFakeContext = new IDTOFakeContext()) using (IUnitOfWork unitOfWork = new UnitOfWork(idtoFakeContext)) { List <Step> steps; TConnect mt; Trip trip; SetupUowWithTripAndTConnect(unitOfWork, out trip, out steps, out mt); DateTime newEta = ((DateTime)mt.StartWindow).AddMinutes(3); //Add a TconnectRequest so the path follows the update path TConnectRequest newRequest = new TConnectRequest(); //newRequest.TConnectedVehicleId = GetOrCreateTConnectedVehicleKey(Uow, outboundStep); newRequest.TConnectId = mt.Id; newRequest.EstimatedTimeArrival = newEta; //Calculate how late we'll be newRequest.RequestedHoldMinutes = 2; newRequest.TConnectStatusId = (int)TConnectStatuses.New;//new request unitOfWork.Repository <TConnectRequest>().Insert(newRequest); unitOfWork.Save(); MonitorTConnect(unitOfWork, mt, newEta); var treq = unitOfWork.Repository <TConnectRequest>().Query().Get(); Assert.AreEqual(1, treq.Count(), "Only one TConnectRequest should be existing."); TConnectRequest request = treq.First(); Assert.AreEqual(3, request.RequestedHoldMinutes, "Existing TConnectRequest should have been updated to 3 minutes"); Assert.AreEqual((int)TConnectStatuses.New, request.TConnectStatusId, "Status should be new"); } }
public void ListVehicles_SameBus_Passes() { using (IDbContext idtoFakeContext = new IDTOFakeContext()) using (IUnitOfWork unitOfWork = new UnitOfWork(idtoFakeContext)) { //Setup TConnectedVehicle vehicleEnt1 = new TConnectedVehicle(); vehicleEnt1.Id = 1; TConnectRequest reqEnt1 = new TConnectRequest(); reqEnt1.TConnectedVehicleId = vehicleEnt1.Id; reqEnt1.TConnectStatusId = (int)TConnectStatuses.New; unitOfWork.Repository <TConnectedVehicle>().Insert(vehicleEnt1); unitOfWork.Repository <TConnectRequest>().Insert(reqEnt1); unitOfWork.Save(); TConnectRequest reqEnt2 = new TConnectRequest(); reqEnt2.TConnectedVehicleId = vehicleEnt1.Id; reqEnt2.TConnectStatusId = (int)TConnectStatuses.New; unitOfWork.Repository <TConnectRequest>().Insert(reqEnt2); unitOfWork.Save(); TConnectedVehicleController tvCont = new TConnectedVehicleController(unitOfWork); List <TConnVehicleViewModel> vehicles = tvCont.GetVehiclesWithPendingRequests(); Assert.AreEqual(1, vehicles.Count()); Assert.AreEqual(2, vehicles[0].NumberRequests, "This bus should have two requests"); } }
public void ListVehicles_Passes() { using (IDbContext idtoFakeContext = new IDTOFakeContext()) using (IUnitOfWork unitOfWork = new UnitOfWork(idtoFakeContext)) { //Setup TConnectedVehicle vehicleEnt1 = new TConnectedVehicle(); vehicleEnt1.Id = 1; TConnect tc = new TConnect { Id = 1, TConnectStatusId = (int)TConnectStatuses.Monitored }; unitOfWork.Repository <TConnect>().Insert(tc); TConnectRequest reqEnt1 = new TConnectRequest(); reqEnt1.TConnectedVehicleId = vehicleEnt1.Id; reqEnt1.TConnectId = tc.Id; reqEnt1.TConnectStatusId = (int)TConnectStatuses.New; unitOfWork.Repository <TConnectedVehicle>().Insert(vehicleEnt1); unitOfWork.Repository <TConnectRequest>().Insert(reqEnt1); unitOfWork.Save(); TConnectedVehicle vehicleEnt2 = new TConnectedVehicle(); vehicleEnt2.Id = 2; TConnect tc2 = new TConnect { Id = 2, TConnectStatusId = (int)TConnectStatuses.Monitored }; unitOfWork.Repository <TConnect>().Insert(tc2); TConnectRequest reqEnt2 = new TConnectRequest(); reqEnt2.TConnectedVehicleId = vehicleEnt2.Id; reqEnt2.TConnectId = tc2.Id; reqEnt2.TConnectStatusId = (int)TConnectStatuses.New; unitOfWork.Repository <TConnectedVehicle>().Insert(vehicleEnt2); unitOfWork.Repository <TConnectRequest>().Insert(reqEnt2); unitOfWork.Save(); var bc = unitOfWork.Repository <TConnect>().Query().Get() .Where(r => r.TConnectStatusId.Equals((int)TConnectStatuses.Monitored)).ToList(); var vehicleidsWithNew = unitOfWork.Repository <TConnectRequest>().Query().Get().Include(r => r.TConnect) .Where(r => r.TConnectStatusId.Equals((int)TConnectStatuses.New) // && r.TConnect.TConnectStatusId.Equals((int)TConnectStatuses.Monitored) ) .Select(r => r.TConnectedVehicleId).Distinct(); int a = vehicleidsWithNew.Count(); //.Include does not work on Fake Repository! TConnectedVehicleController tvCont = new TConnectedVehicleController(unitOfWork); List <TConnVehicleViewModel> vehicles = tvCont.GetVehiclesWithPendingRequests(); Assert.AreEqual(2, vehicles.Count()); } }
public void CreateNewTConnectRequestIfNeeded_AddsRequest_Passes() { using (IDbContext idtoFakeContext = new IDTOFakeContext()) using (IUnitOfWork unitOfWork = new UnitOfWork(idtoFakeContext)) { List <Step> steps; TConnect mt; Trip trip; SetupUowWithTripAndTConnect(unitOfWork, out trip, out steps, out mt); DateTime newEta = steps[0].EndDate.AddMinutes(11);//make sure we're late CreateNewTConnectRequestIfNeeded(unitOfWork, mt, newEta, steps[2]); TConnectRequest treq = unitOfWork.Repository <TConnectRequest>().Query().Get().First(); Assert.AreEqual(5, treq.RequestedHoldMinutes); TConnectedVehicle tveh = unitOfWork.Repository <TConnectedVehicle>().Query().Get().First(); Assert.AreEqual(0, tveh.CurrentAcceptedHoldMinutes, "TConnectedVehicle instance should be created, but still have an accepted time of 0 since no requests have been accepted yet."); } }
public void MonitoredTConnect_NewRequest_Passes() { using (IDbContext idtoFakeContext = new IDTOFakeContext()) using (IUnitOfWork unitOfWork = new UnitOfWork(idtoFakeContext)) { TConnect tc = new TConnect { Id = 1, TConnectStatusId = (int)TConnectStatuses.Monitored }; unitOfWork.Repository <TConnect>().Insert(tc); TConnectRequest tr = new TConnectRequest { TConnectId = tc.Id, TConnectStatusId = (int)TConnectStatuses.New }; unitOfWork.Repository <TConnectRequest>().Insert(tr); unitOfWork.Save(); var controller = new TConnectController(idtoFakeContext); int status = (int)controller.DeduceExternalStatusForTConnect(tc); Assert.AreEqual((int)TConnectStatusModel.Status.Requested, status); } }
/// <summary> /// Checks TConnect to see if TConnectRequest already exists for this TConnect. /// Updates TConnectRequest (if already exists) or creates a new one if needed. /// </summary> /// <param name="Uow"></param> /// <param name="mt"></param> /// <param name="newEta">Expected arrival of the inbound vehicle for the tConnect</param> protected void MonitorTConnect(IUnitOfWork Uow, TConnect mt, DateTime newEta) { //First determine if we are updating an item that already has an active TRequest, or if //this is a general Monitored vehicle that has not yet generated a TConnectRequest. //Check TConnectRequest table for a matching row for this tconnect var tr = Uow.Repository <TConnectRequest>().Query().Get().Where(s => s.TConnectId.Equals(mt.Id)); //Will need outbound departure time and stopcode Step outboundStep = Uow.Repository <Step>().Query().Include(s => s.Block).Get().First(s => s.Id.Equals(mt.OutboundStepId)); if (tr.Any()) { TConnectRequest treq = tr.First(); UpdateExistingTConnectRequest(Uow, mt, newEta, treq); } else { CreateNewTConnectRequestIfNeeded(Uow, mt, newEta, outboundStep); } }
public void MonitorTConnect_UpdateExistingTConnect_AutoAccept_Passes() { using (IDbContext idtoFakeContext = new IDTOFakeContext()) using (IUnitOfWork unitOfWork = new UnitOfWork(idtoFakeContext)) { List <Step> steps; TConnect mt; Trip trip; SetupUowWithTripAndTConnect(unitOfWork, out trip, out steps, out mt); DateTime newEta = ((DateTime)mt.StartWindow).AddMinutes(5); //Add a TconnectRequest so the path follows the update path TConnectRequest newRequest = new TConnectRequest(); newRequest.TConnectedVehicleId = 2; newRequest.TConnectId = mt.Id; newRequest.EstimatedTimeArrival = newEta; newRequest.RequestedHoldMinutes = 2; newRequest.TConnectStatusId = (int)TConnectStatuses.New; unitOfWork.Repository <TConnectRequest>().Insert(newRequest); unitOfWork.Save(); //Add another tconnectrequest for another traveler for the same vehicle TConnectedVehicle v = new TConnectedVehicle(); v.Id = 2; v.CurrentAcceptedHoldMinutes = 7; unitOfWork.Repository <TConnectedVehicle>().Insert(v); unitOfWork.Save(); MonitorTConnect(unitOfWork, mt, newEta); var treq = unitOfWork.Repository <TConnectRequest>().Query().Get(); TConnectRequest request = treq.Where(t => t.TConnectId.Equals(mt.Id)).First(); Assert.AreEqual(5, request.RequestedHoldMinutes, "Existing TConnectRequest should have been upated to 3 minutes"); Assert.AreEqual((int)TConnectStatuses.Accepted, request.TConnectStatusId, "Status should be Accepted"); } }
/// <summary> /// A TConnectRequest had previously been created for this TConnect. Update it /// with new ETA information if the inbound vehicle is falling further behind schedule. /// The update will revert the TConnectRequest to status New, unless another TConnectRequest already /// has been accepted with a longer time. /// </summary> /// <param name="Uow"></param> /// <param name="newEta"></param> /// <param name="tr"></param> /// <param name="outboundStep"></param> async private static void UpdateExistingTConnectRequest(IUnitOfWork Uow, TConnect tConnect, DateTime newEta, TConnectRequest tr) { string msg = "Still monitoring TConnect. Eta=" + newEta.ToShortTimeString() + " : "; msg += "T-Connect Window [" + ((DateTime)tConnect.StartWindow).ToShortTimeString() + "-"; msg += ((DateTime)tConnect.EndWindow).ToShortTimeString() + "]"; LogTripEventIfDifferentFromLast(Uow, tConnect.InboundStep.TripId, msg); //We've already created a tConnect for this item, lets update it to see //if it has gotten even later. int newHoldMinutes = (int)Math.Ceiling((newEta - (DateTime)tConnect.StartWindow).TotalMinutes); if (newHoldMinutes > tr.RequestedHoldMinutes)//inbound getting even later. { tr.EstimatedTimeArrival = newEta; tr.RequestedHoldMinutes = newHoldMinutes; //By default, this updated time will be placed as "new" since we don't know if //this alteration is acceptable. //tr.TConnectStatusId = (int)TConnectStatuses.New; //However, If the ETA is beyond the EndWindow, then we know the bus will not //wait this long , and it must be automatically rejected. if (newEta > tConnect.EndWindow) { tr.TConnectStatusId = (int)TConnectStatuses.Rejected; //End monitoring --- Update status to done. tConnect.TConnectStatusId = (int)TConnectStatuses.Done; Uow.Repository <TConnect>().Update(tConnect); Uow.Repository <TripEvent>().Insert(new TripEvent(tConnect.InboundStep.TripId, "ETA of " + newEta.ToShortTimeString() + " is outside the T-Connect End Window")); } //Last, see if anyone else has requested a wait this long and had it accepted. //If so, we know this is accepted too. var l = Uow.Repository <TConnectedVehicle>().Query().Get().Where(s => s.Id.Equals(tr.TConnectedVehicleId)); if (l.Any()) { int acceptedWaitTime = l.First().CurrentAcceptedHoldMinutes; if (acceptedWaitTime >= newHoldMinutes && tr.TConnectStatusId != (int)TConnectStatuses.Accepted) { //A longer time has been accepted, so we can accept this too. tr.TConnectStatusId = (int)TConnectStatuses.Accepted; Uow.Repository <TripEvent>().Insert(new TripEvent(tConnect.InboundStep.TripId, "T-Connect Request set to Accepted due to previous accepted request")); Uow.Repository <TConnectRequest>().Update(tr); } } } else { //update arrival time, even though it is running earlier //and not at risk for missing connection tr.EstimatedTimeArrival = newEta; tr.RequestedHoldMinutes = newHoldMinutes; Uow.Repository <TConnectRequest>().Update(tr); } Uow.Save(); }
/// <summary> /// Checks the Eta for the inbound vehicle to the departure window that would warrant /// a TConnectRequest. Creates a TConnectRequest if possible. /// </summary> /// <param name="Uow"></param> /// <param name="tConnect"></param> /// <param name="newEta"></param> /// <param name="outboundStep"></param> async protected void CreateNewTConnectRequestIfNeeded(IUnitOfWork Uow, TConnect tConnect, DateTime newEta, Step outboundStep) { if (newEta > tConnect.StartWindow && newEta <= tConnect.EndWindow) { //We want to issue a TConnect Request. Diagnostics.WriteMainDiagnosticInfo(TraceEventType.Verbose, TraceEventId.TraceGeneral, "Requesting TConnect. newEta=" + newEta.ToShortTimeString() + " endwindow=" + tConnect.EndWindow.ToString() + " tConnect.Id=" + tConnect.Id); TConnectRequest newRequest = new TConnectRequest(); //Need a TConnectedVehicle for this new request. int acceptedWaitTime = 0; newRequest.TConnectedVehicleId = GetOrCreateTConnectedVehicleKey(Uow, outboundStep, out acceptedWaitTime); //set ref to vehicle newRequest.TConnectId = tConnect.Id; //set ref to owning tConnect. newRequest.EstimatedTimeArrival = newEta; //Calculate how late we'll be newRequest.RequestedHoldMinutes = (int)System.Math.Ceiling((newEta - (DateTime)tConnect.StartWindow).TotalMinutes); newRequest.ModifiedBy = ModifiedBy; newRequest.ModifiedDate = DateTime.UtcNow; if (newRequest.RequestedHoldMinutes <= acceptedWaitTime) { //This request is asking for a wait less than the amount the bus already agreed to, so this //is automatically accepted. newRequest.TConnectStatusId = (int)TConnectStatuses.Accepted; Uow.Repository <TripEvent>().Insert(new TripEvent(outboundStep.TripId, "T-Connect Request created and auto accapted")); } else { newRequest.TConnectStatusId = (int)TConnectStatuses.New;//new request Uow.Repository <TripEvent>().Insert(new TripEvent(outboundStep.TripId, "T-Connect Request created.")); } Uow.Repository <TConnectRequest>().Insert(newRequest); Uow.Save(); } else if (newEta > tConnect.EndWindow) { //Will be Too late to issue a TConnect, bus wont wait this long. Diagnostics.WriteMainDiagnosticInfo(TraceEventType.Information, TraceEventId.TraceGeneral, "Bus Missed before there was a chance to issue a request. newEta=" + newEta.ToShortTimeString() + " endwindow=" + tConnect.EndWindow.ToString() + " tConnect.Id=" + tConnect.Id); //Update status to done. tConnect.TConnectStatusId = (int)TConnectStatuses.Done; Uow.Repository <TConnect>().Update(tConnect); Uow.Repository <TripEvent>().Insert(new TripEvent(outboundStep.TripId, "T-Connect Request not created, Inbound bus will be too late.")); Uow.Save(); //Notify Traveler of TConnect creation //TODO need to find traveller device type (Android, IOS, etc) for now defaulting to Android //find traveler email and send push update Traveler t = Uow.Repository <Traveler>().Query().Get().Where(s => s.Id == tConnect.InboundStep.Trip.TravelerId).First(); if (t != null && t.Email != null) { bool result = await notificationManager.SendRejectNotificationsAsync(t.Email); } } else { string msg = "No need to issue a request yet. Eta=" + newEta.ToShortTimeString() + " : "; msg += "T-Connect Window [" + ((DateTime)tConnect.StartWindow).ToShortTimeString() + "-"; msg += ((DateTime)tConnect.EndWindow).ToShortTimeString() + "]"; LogTripEventIfDifferentFromLast(Uow, outboundStep.TripId, msg); //really verbose message Diagnostics.WriteMainDiagnosticInfo(TraceEventType.Verbose, TraceEventId.TraceGeneral, "No need to issue a request yet. newEta=" + newEta.ToShortTimeString() + " endwindow=" + tConnect.EndWindow.ToString() + " tConnect.Id=" + tConnect.Id); } }
public TConnectRequestModel(TConnectRequest req) { }