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); }
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); }
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); }
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)); }
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); }