public void TestCreateFilter()
        {
            //setup
            var exam = new EventTopicCacheView();
            exam.Id = 1;
            exam.Name = "Exam";
            var seminar = new EventTopicCacheView();
            seminar.Id = 2;
            seminar.Name = "Seminar";
            var source = new List<EventCacheView>();

            var event1 = new EventCacheView();
            event1.EventTopics.Add(exam);
            event1.EventTopics.Add(seminar);

            var event2 = new EventCacheView();
            event2.EventTopics.Add(exam);
            event2.EventTopics.Add(seminar);

            var event3 = new EventCacheView();
            event3.EventTopics.Add(seminar);
            event3.EventTopics.Add(exam);

            var event4 = new EventCacheView();

            source.Add(event1);
            source.Add(event2);
            source.Add(event3);
            source.Add(event4);

            var builder = new EventTopicFilterBuilder();

            //act
            var filter = builder.CreateFilters(source.AsQueryable()).FirstOrDefault();

            //assert
            Assert.IsNotNull(filter);
            Assert.AreEqual(QueryStringKeys.EventTopicIdKey, filter.QueryStringParameterName);
            Assert.AreEqual("Event Topics", filter.Name);
            Assert.IsNotNull(filter.FilterValues);
            Assert.AreEqual(2, filter.FilterValues.Count());

            var value = filter.FilterValues.ElementAt(0);
            Assert.AreEqual(exam.Name, value.DisplayName);
            Assert.AreEqual(3, value.Count);
            Assert.AreEqual(exam.Id.ToString(CultureInfo.CurrentCulture), value.QueryStringParameterValue);

            value = filter.FilterValues.ElementAt(1);
            Assert.AreEqual(seminar.Name, value.DisplayName);
            Assert.AreEqual(3, value.Count);
            Assert.AreEqual(seminar.Id.ToString(CultureInfo.CurrentCulture), value.QueryStringParameterValue);
        }
        public void TestCreateFilter()
        {
            //setup
            DateTime currentDate = new DateTime(2000, 1, 1);
            DateTime futureDate = new DateTime(2000, 2, 1);
            DateTime pastDate = new DateTime(1970, 1, 1);

            var orgUnitType_locations = new OrgUnitTypeCacheView()
            {
                Id = 1,
                Name = "Locations"
            };

            var orgUnitType_departments = new OrgUnitTypeCacheView()
            {
                Id = 2,
                Name = "Departments"
            };

            // orgUnit
            var orgUnit1 = new OrgUnitCacheView()
            {
                Id = 1,
                Name = "Hospital A"
            };

            orgUnit1.OrgUnitTypes.Add(orgUnitType_locations);

            // orgUnit
            var orgUnit2 = new OrgUnitCacheView()
            {
                Id = 2,
                Name = "Department A"
            };

            orgUnit2.OrgUnitTypes.Add(orgUnitType_departments);

            // orgUnit
            var orgUnit3 = new OrgUnitCacheView()
            {
                Id = 3,
                Name = "Hospital B"
            };

            orgUnit3.OrgUnitTypes.Add(orgUnitType_locations);

            // orgUnit
            var orgUnit4 = new OrgUnitCacheView()
            {
                Id = 4,
                Name = "Department B"
            };

            orgUnit4.OrgUnitTypes.Add(orgUnitType_departments);

            var source = new List<EventCacheView>();

            var Event = new EventCacheView() { Id = 1 };
            var eventOccurence = new EventOccurrenceCacheView();
            eventOccurence.OrgUnit = orgUnit1;
            eventOccurence.OrgUnitId = orgUnit1.Id;
            eventOccurence.OccurrenceDates.Add(new EventOccurrenceDateCacheView() { StartDate = futureDate, EventOccurrenceId = eventOccurence.Id });
            Event.Occurrences.Add(eventOccurence);
            eventOccurence = new EventOccurrenceCacheView();
            eventOccurence.OrgUnit = orgUnit3;
            eventOccurence.OrgUnitId = orgUnit3.Id;
            Event.Occurrences.Add(eventOccurence);
            source.Add(Event);

            Event = new EventCacheView() { Id = 2 };
            eventOccurence = new EventOccurrenceCacheView();
            eventOccurence.OrgUnit = orgUnit1;
            eventOccurence.OrgUnitId = orgUnit1.Id;
            eventOccurence.OccurrenceDates.Add(new EventOccurrenceDateCacheView() { StartDate = futureDate, EventOccurrenceId = eventOccurence.Id });
            Event.Occurrences.Add(eventOccurence);
            eventOccurence = new EventOccurrenceCacheView();
            eventOccurence.OrgUnit = orgUnit2;
            eventOccurence.OrgUnitId = orgUnit2.Id;
            eventOccurence.OccurrenceDates.Add(new EventOccurrenceDateCacheView() { StartDate = futureDate, EventOccurrenceId = eventOccurence.Id });
            Event.Occurrences.Add(eventOccurence);
            source.Add(Event);

            Event = new EventCacheView() { Id = 3 };
            eventOccurence = new EventOccurrenceCacheView();
            eventOccurence.OrgUnit = orgUnit3;
            eventOccurence.OrgUnitId = orgUnit3.Id;
            eventOccurence.OccurrenceDates.Add(new EventOccurrenceDateCacheView() { StartDate = futureDate, EventOccurrenceId = eventOccurence.Id });
            Event.Occurrences.Add(eventOccurence);
            eventOccurence = new EventOccurrenceCacheView();
            eventOccurence.OrgUnit = orgUnit4;
            eventOccurence.OrgUnitId = orgUnit4.Id;
            eventOccurence.OccurrenceDates.Add(new EventOccurrenceDateCacheView() { StartDate = futureDate, EventOccurrenceId = eventOccurence.Id });
            Event.Occurrences.Add(eventOccurence);
            source.Add(Event);

            Event = new EventCacheView() { Id = 4 };
            eventOccurence = new EventOccurrenceCacheView();
            eventOccurence.OrgUnit = orgUnit1;
            eventOccurence.OrgUnitId = orgUnit1.Id;
            eventOccurence.OccurrenceDates.Add(new EventOccurrenceDateCacheView() { StartDate = futureDate, EventOccurrenceId = eventOccurence.Id });
            Event.Occurrences.Add(eventOccurence);
            eventOccurence = new EventOccurrenceCacheView();
            eventOccurence.OrgUnit = orgUnit2;
            eventOccurence.OrgUnitId = orgUnit2.Id;
            eventOccurence.OccurrenceDates.Add(new EventOccurrenceDateCacheView() { StartDate = futureDate, EventOccurrenceId = eventOccurence.Id });
            Event.Occurrences.Add(eventOccurence);
            eventOccurence = new EventOccurrenceCacheView();
            eventOccurence.OrgUnit = orgUnit3;
            eventOccurence.OrgUnitId = orgUnit3.Id;
            eventOccurence.OccurrenceDates.Add(new EventOccurrenceDateCacheView() { StartDate = futureDate, EventOccurrenceId = eventOccurence.Id });
            Event.Occurrences.Add(eventOccurence);
            eventOccurence = new EventOccurrenceCacheView();
            eventOccurence.OrgUnit = orgUnit4;
            eventOccurence.OrgUnitId = orgUnit4.Id;
            eventOccurence.OccurrenceDates.Add(new EventOccurrenceDateCacheView() { StartDate = futureDate, EventOccurrenceId = eventOccurence.Id });
            Event.Occurrences.Add(eventOccurence);
            eventOccurence = new EventOccurrenceCacheView();
            eventOccurence.OrgUnit = orgUnit4;
            eventOccurence.OrgUnitId = orgUnit4.Id;
            eventOccurence.OccurrenceDates.Add(new EventOccurrenceDateCacheView() { StartDate = pastDate, EventOccurrenceId = eventOccurence.Id });
            Event.Occurrences.Add(eventOccurence);
            source.Add(Event);

            Event = new EventCacheView() { Id = 5 };
            source.Add(Event);

            var builder = new OrgUnitFilterBuilder();
            var mockClock = new Mock<IClock>();
            mockClock.SetupGet(c => c.Now).Returns(currentDate);
            builder.Clock = mockClock.Object;

            //act
            var filters = builder.CreateFilters(source.AsQueryable());

            //assert
            Assert.IsNotNull(filters);
            Assert.AreEqual(2, filters.Count());

            //locations
            var locationsFilter = filters.Where(f => f.Name == "Locations").Single();
            Assert.AreEqual(2, locationsFilter.FilterValues.Count());
            Assert.AreEqual(3, locationsFilter.FilterValues.ElementAt(0).Count);
            Assert.AreEqual(3, locationsFilter.FilterValues.ElementAt(1).Count);
            Assert.IsNotNullOrEmpty(locationsFilter.FilterValues.ElementAt(0).DisplayName);
            Assert.IsNotNullOrEmpty(locationsFilter.FilterValues.ElementAt(1).DisplayName);

            //departments
            var departmentsFilter = filters.Where(f => f.Name == "Departments").Single();
            Assert.AreEqual(2, departmentsFilter.FilterValues.Count());
            Assert.AreEqual(2, departmentsFilter.FilterValues.ElementAt(0).Count);
            Assert.AreEqual(2, departmentsFilter.FilterValues.ElementAt(1).Count);
            Assert.IsNotNullOrEmpty(departmentsFilter.FilterValues.ElementAt(0).DisplayName);
            Assert.IsNotNullOrEmpty(departmentsFilter.FilterValues.ElementAt(1).DisplayName);
        }