public async Task <IEnumerable <MenuItemDto> > GetAllMenuItemsWithFilters(FilterDto filters)
        {
            ISpecification <MenuItem> specification;

            var mealType  = filters.MealType;
            var allergens = filters.Allergens;

            if (!(mealType == MealType.Unknown) && allergens != null && allergens.Any())
            {
                var mealTypeSpec         = new MenuItemForMealTypeSpecification(mealType);
                var excludeAllergensSpec = new MenuItemForAllergensSpecification(allergens).Not();

                specification = mealTypeSpec.And(excludeAllergensSpec);
            }
            else if (allergens != null && allergens.Any())
            {
                specification = new MenuItemForAllergensSpecification(allergens).Not();
            }
            else
            {
                specification = new MenuItemForMealTypeSpecification(mealType);
            }

            var menuItems = await _menuItemRepository.All(specification);

            var menuItemDtos = _mapper.Map <IEnumerable <MenuItemDto> >(menuItems);

            return(menuItemDtos);
        }
        public void IsSatisfiedBy_AppendsToBuilderAndAddsParameters()
        {
            var spec = new MenuItemForAllergensSpecification(Allergens);

            var builder    = new StringBuilder();
            var parameters = new Dictionary <string, object>();

            spec.IsSatisfiedBy(builder, parameters);

            builder.ToString().Should().Be("[Id] IN (SELECT MenuItemId FROM Allergens WHERE AllergenType IN @allergens)");
            parameters["allergens"].Should().BeEquivalentTo(Allergens.Select(x => x.ToString()));
        }
        public void IsSatisfiedBy_ReturnsFalse()
        {
            var spec = new MenuItemForAllergensSpecification(Allergens);

            var menuItem = new MenuItem
            {
                Allergens = new List <Allergen>
                {
                    new Allergen
                    {
                        AllergenType = AllergenType.Crustaceans,
                    },
                },
            };

            var result = spec.IsSatisfiedBy(menuItem);

            result.Should().BeFalse();
        }
        public void IsSatisfiedBy_ReturnsTrue()
        {
            var spec = new MenuItemForAllergensSpecification(Allergens);

            var menuItem = new MenuItem
            {
                Allergens = new List <Allergen>
                {
                    new Allergen
                    {
                        AllergenType = AllergenType.Soya,
                    },
                    new Allergen
                    {
                        AllergenType = AllergenType.Celery,
                    },
                },
            };

            var result = spec.IsSatisfiedBy(menuItem);

            result.Should().BeTrue();
        }