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.");
                }
        }
Beispiel #6
0
        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);
                }
        }
Beispiel #7
0
        /// <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");
                }
        }
Beispiel #9
0
        /// <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();
        }
Beispiel #10
0
        /// <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);
            }
        }
Beispiel #11
0
 public TConnectRequestModel(TConnectRequest req)
 {
 }