Esempio n. 1
0
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var jsonObject = JObject.Load(reader);

            WeeklyAvailability availability = new WeeklyAvailability
            {
                SlotDurationMinutes = jsonObject["SlotDurationMinutes"].ToObject <int>(),
                FacilityId          = ((JObject)jsonObject["Facility"])["FacilityId"].ToObject <string>()
            };

            // Deserialize days availability
            for (int i = 0; i < _days.Length; ++i)
            {
                JObject jsonDay = (JObject)jsonObject[_days[i]];
                if (jsonDay == null)
                {
                    continue;
                }

                availability.DaysAvailability.Add(new DailyAvailability()
                {
                    DayOfWeek  = i,
                    WorkPeriod = jsonDay["WorkPeriod"]?.ToObject <WorkPeriod>(),
                    BusySlots  = jsonDay["BusySlots"]?.ToObject <List <Slot> >()
                });
            }

            return(availability);
        }
Esempio n. 2
0
        public void ParseWorkPeriodsResultValidSlotsCountTest()
        {
            //Arrange
            WeeklyAvailability testAvailability = new WeeklyAvailability()
            {
                SlotDurationMinutes = 30,
                DaysAvailability    = new List <DailyAvailability>()
                {
                    new DailyAvailability()
                    {
                        DayOfWeek  = 3, //Thursday 25
                        WorkPeriod = new WorkPeriod()
                        {
                            StartHour      = 12,
                            LunchStartHour = 14,
                            LunchEndHour   = 15,
                            EndHour        = 16
                        }
                    }
                }
            };
            DateTime date = DateTime.ParseExact("23/01/2018", "dd/MM/yyyy", null); //Tuesday

            //Act
            var result = _slotService.ParseWorkPeriods(testAvailability, date);

            //Assert
            Assert.IsTrue(result.Count() == 6);
        }
        public void ReadJsonReturnedTypeNotNullTest()
        {
            //Arrange
            var testJson = BaseTests.GetTestJsonString();

            //Act
            WeeklyAvailability result = JsonConvert.DeserializeObject <WeeklyAvailability>(testJson);

            //Assert
            Assert.IsNotNull(result);
        }
        public void ReadJsonReturnedTypeCorrectFieldsTest()
        {
            //Arrange
            var testJson = BaseTests.GetTestJsonString();

            //Act
            WeeklyAvailability result = JsonConvert.DeserializeObject <WeeklyAvailability>(testJson);


            //Assert
            Assert.AreEqual(result.FacilityId, "e9f7bd81-965d-4464-b607-999112b56022");
            Assert.AreEqual(result.SlotDurationMinutes, 10);
            Assert.AreEqual(result.DaysAvailability.Count, 3);
        }
Esempio n. 5
0
        public void ParseWorkPeriodsFilterBusySlotsTest()
        {
            //Arrange
            WeeklyAvailability testAvailability = new WeeklyAvailability()
            {
                SlotDurationMinutes = 30,
                DaysAvailability    = new List <DailyAvailability>()
                {
                    new DailyAvailability()
                    {
                        DayOfWeek  = 3, //Thursday 25
                        WorkPeriod = new WorkPeriod()
                        {
                            StartHour      = 10,
                            LunchStartHour = 11,
                            LunchEndHour   = 15,
                            EndHour        = 16
                        },
                        BusySlots = new List <Slot>()
                        {
                            new Slot()
                            {
                                Start = DateTime.ParseExact("25/01/2018 10:00:00", "dd/MM/yyyy HH:mm:ss", null),
                                End   = DateTime.ParseExact("25/01/2018 10:30:00", "dd/MM/yyyy HH:mm:ss", null)
                            },
                            new Slot()
                            {
                                Start = DateTime.ParseExact("25/01/2018 15:30:00", "dd/MM/yyyy HH:mm:ss", null),
                                End   = DateTime.ParseExact("25/01/2018 16:00:00", "dd/MM/yyyy HH:mm:ss", null)
                            }
                        }
                    }
                }
            };
            DateTime date = DateTime.ParseExact("23/01/2018", "dd/MM/yyyy", null); //Tuesday

            //Act
            var result = _slotService.ParseWorkPeriods(testAvailability, date);

            //Assert
            Assert.IsTrue(result.Count == 2);
            Assert.AreEqual(result.ElementAt(0).Start.ToString("dd/MM/yyyy HH:mm:ss"), "25/01/2018 10:30:00");
            Assert.AreEqual(result.ElementAt(1).Start.ToString("dd/MM/yyyy HH:mm:ss"), "25/01/2018 15:00:00");
        }
        public async Task GetAsyncFailureTest()
        {
            //Arrange
            Mock <FakeHttpMessageHandler> httpMessageHandlerMock = new Mock <FakeHttpMessageHandler> {
                CallBase = true
            };

            httpMessageHandlerMock.Setup(x => x.Send(It.IsAny <HttpRequestMessage>())).Returns(new HttpResponseMessage
            {
                StatusCode = System.Net.HttpStatusCode.BadRequest
            });
            _httpClientFactoryMock.Setup(x => x.Create(It.IsAny <string>(), It.IsAny <AuthenticationHeaderValue>()))
            .Returns(() => new HttpClient(httpMessageHandlerMock.Object));

            //Act
            WeeklyAvailability result = await _slotHttpClient.GetAsync <WeeklyAvailability>("http://localhost:55670");

            //Assert
            Assert.IsNull(result);
        }
Esempio n. 7
0
        public void ParseWorkPeriodsResultValidDaysTest()
        {
            //Arrange
            WeeklyAvailability testAvailability = new WeeklyAvailability()
            {
                SlotDurationMinutes = 30,
                DaysAvailability    = new List <DailyAvailability>()
                {
                    new DailyAvailability()
                    {
                        DayOfWeek  = 3, //Thursday 25
                        WorkPeriod = new WorkPeriod()
                        {
                            StartHour      = 10,
                            LunchStartHour = 14,
                            LunchEndHour   = 15,
                            EndHour        = 18
                        }
                    },
                    new DailyAvailability()
                    {
                        DayOfWeek  = 4, //Friday 26
                        WorkPeriod = new WorkPeriod()
                        {
                            StartHour      = 10,
                            LunchStartHour = 14,
                            LunchEndHour   = 15,
                            EndHour        = 18
                        }
                    },
                }
            };
            DateTime date = DateTime.ParseExact("23/01/2018", "dd/MM/yyyy", null); //Tuesday

            //Act
            var result = _slotService.ParseWorkPeriods(testAvailability, date);

            //Assert
            Assert.IsTrue(result.All(s => s.Start.Date.Day == 25 || s.Start.Date.Day == 26));
        }
Esempio n. 8
0
        public List <Slot> ParseWorkPeriods(WeeklyAvailability weeklyAvailability, DateTime date)
        {
            DateTime mondayOfWeek = GetMondayOfWeek(date);

            int         slotDuration = weeklyAvailability.SlotDurationMinutes;
            List <Slot> slots        = new List <Slot>();

            //discard past days
            var todayWeekNumber = (int)(date.DayOfWeek + 6) % 7;
            var validDays       = weeklyAvailability.DaysAvailability.Where(d => d.DayOfWeek >= todayWeekNumber);

            foreach (var dailyAvailability in validDays)
            {
                DateTime dayDate = mondayOfWeek.AddDays(dailyAvailability.DayOfWeek);

                TimeSpan startMorningTime   = new TimeSpan(dailyAvailability.WorkPeriod.StartHour, 0, 0);
                TimeSpan endMorningTime     = new TimeSpan(dailyAvailability.WorkPeriod.LunchStartHour, 0, 0);
                TimeSpan startAfternoonTime = new TimeSpan(dailyAvailability.WorkPeriod.LunchEndHour, 0, 0);
                TimeSpan endAfternoonTime   = new TimeSpan(dailyAvailability.WorkPeriod.EndHour, 0, 0);

                List <Slot> morningSlots   = GetSlotsBetweenDates(dayDate.Date + startMorningTime, dayDate.Date + endMorningTime, slotDuration);
                List <Slot> afternoonSlots = GetSlotsBetweenDates(dayDate.Date + startAfternoonTime, dayDate.Date + endAfternoonTime, slotDuration);
                List <Slot> daySlots       = morningSlots.Concat(afternoonSlots).ToList();

                //remove busy slots from daily result set
                if (dailyAvailability.BusySlots != null && dailyAvailability.BusySlots.Any())
                {
                    daySlots.RemoveAll(s => dailyAvailability.BusySlots.Any(b => b.Start == s.Start));
                }

                //remove past hours
                daySlots.RemoveAll(s => s.Start < date);

                slots.AddRange(daySlots);
            }

            return(slots);
        }