예제 #1
0
        public bool EndDateLaterThanStartDate(DiscountShortDto discount)
        {
            if (discount.EndDate != null)
            {
                return(discount.EndDate.Value.Date >= discount.StartDate.Date);
            }

            return(true);
        }
예제 #2
0
        public async Task CanValidateAddressesAreFromVendor()
        {
            var discount = new DiscountShortDto {
                AddressesIds = new List <int> {
                    1
                }
            };

            Assert.True(await Task.FromResult(_validationService.AddressesAreFromVendor(_mapper.Map <VendorDto>(_vendor),
                                                                                        new List <DiscountShortDto> {
                discount
            })));

            discount.AddressesIds = new List <int> {
                2
            };

            Assert.False(await Task.FromResult(
                             _validationService.AddressesAreFromVendor(_mapper.Map <VendorDto>(_vendor),
                                                                       new List <DiscountShortDto> {
                discount
            })));
        }
예제 #3
0
        public VendorValidatorTests()
        {
            _tagValidationService      = new Mock <ITagValidationService>();
            _categoryValidationService = new Mock <ICategoryValidationService>();
            _vendorValidationService   = new Mock <IVendorValidationService>();
            _discountValidationService = new Mock <IDiscountValidationService>();
            _methodProvider            = new Mock <IMethodProvider>();

            _vendorValidator = new VendorValidator(_vendorValidationService.Object,
                                                   _discountValidationService.Object, _categoryValidationService.Object,
                                                   _tagValidationService.Object, _methodProvider.Object);

            _vendors = new List <VendorDto>
            {
                new VendorDto
                {
                    Id        = Guid.NewGuid(),
                    Name      = "Food vendor",
                    Addresses = new List <AddressDto>
                    {
                        new AddressDto
                        {
                            Id        = 1,
                            CountryId = Guid.NewGuid(),
                            CityId    = Guid.NewGuid(),
                            Street    = "Street"
                        }
                    },
                    Phones = new List <PhoneDto>
                    {
                        new PhoneDto
                        {
                            Id     = 1,
                            Number = "201-20-12"
                        }
                    }
                },
                new VendorDto
                {
                    Id        = Guid.NewGuid(),
                    Name      = "Sport vendor",
                    Addresses = new List <AddressDto>
                    {
                        new AddressDto
                        {
                            CountryId = Guid.NewGuid(),
                            CityId    = Guid.NewGuid(),
                            Street    = "Street2"
                        }
                    }
                }
            };

            _vendorValidationService.Setup(s => s.VendorExistsAsync(It.IsAny <Guid>(), CancellationToken.None))
            .Returns((Guid id, CancellationToken token) =>
                     Task.FromResult(_vendors.Any(c => c.Id == id)));

            _vendorValidationService.Setup(s => s.VendorNotExistsAsync(It.IsAny <Guid>(), CancellationToken.None))
            .Returns((Guid id, CancellationToken token) =>
                     Task.FromResult(_vendors.All(c => c.Id != id)));

            _vendorValidationService.Setup(s => s.VendorNameNotExists(It.IsAny <string>(), CancellationToken.None))
            .Returns((string name, CancellationToken token) =>
                     Task.FromResult(_vendors.All(c => c.Name != name)));

            _vendorValidationService.Setup(s => s.VendorNameChangedAndNotExists(It.IsAny <Guid>(),
                                                                                It.IsAny <string>(), CancellationToken.None))
            .Returns((Guid id, string name, CancellationToken token) =>
            {
                var category = _vendors.First(c => c.Id == id);
                if (category.Name == name)
                {
                    return(Task.FromResult(true));
                }

                return(Task.FromResult(_vendors.All(c => c.Name != name)));
            });

            _vendorValidationService.Setup(s => s.PhonesAreUnique(It.IsAny <IEnumerable <int> >()))
            .Returns((IEnumerable <int> ids) =>
            {
                var list = ids.ToList();
                return(list.Count == list.Distinct().Count());
            });

            _vendorValidationService.Setup(s => s.AddressesIdsAreUnique(It.IsAny <IEnumerable <int> >()))
            .Returns((IEnumerable <int> ids) =>
            {
                var list = ids.ToList();
                return(list.Count == list.Distinct().Count());
            });

            _vendorValidationService.Setup(s => s.StreetWithCity(It.IsAny <AddressDto>()))
            .Returns((AddressDto address) =>
            {
                if (string.IsNullOrEmpty(address.Street))
                {
                    return(true);
                }

                return(address.CityId.HasValue);
            });

            _vendorValidationService
            .Setup(s => s.AddressExists(It.IsAny <Guid>(), It.IsAny <Guid?>(), CancellationToken.None))
            .Returns(Task.FromResult(true));

            _vendorValidationService
            .Setup(s => s.AddressesAreUnique(It.IsAny <IEnumerable <AddressDto> >()))
            .Returns((IEnumerable <AddressDto> addresses) =>
            {
                var addressesList = addresses.ToList();
                return(addressesList.Count == addressesList
                       .GroupBy(a => new { a.CountryId, a.CityId, a.Street })
                       .Select(g => g)
                       .Count());
            });

            _vendorValidationService
            .Setup(s => s.AddressesAreFromVendor(It.IsAny <VendorDto>(), It.IsAny <IEnumerable <DiscountShortDto> >()))
            .Returns((VendorDto vendor, IEnumerable <DiscountShortDto> vendorDiscounts) =>
            {
                var discountAddressesIds = vendorDiscounts.SelectMany(d => d.AddressesIds)
                                           .Distinct()
                                           .ToList();

                var vendorAddressesIds = vendor.Addresses.Select(p => p.Id);

                return(discountAddressesIds.All(id => vendorAddressesIds.Contains(id)));
            });

            _vendorValidationService
            .Setup(s => s.PhonesAreFromVendorAsync(It.IsAny <VendorDto>(), It.IsAny <IEnumerable <DiscountShortDto> >(), CancellationToken.None))
            .Returns((VendorDto vendor, IEnumerable <DiscountShortDto> vendorDiscounts, CancellationToken token) =>
            {
                var discountPhonesIds = vendorDiscounts.SelectMany(d =>
                {
                    if (d.PhonesIds != null)
                    {
                        return(d.PhonesIds);
                    }

                    return(new List <int>());
                })
                                        .Distinct()
                                        .ToList();

                if (vendor.Phones != null)
                {
                    var newPhonesIds = vendor.Phones.Select(p => p.Id).ToList();

                    if (vendor.Id != Guid.Empty)
                    {
                        var oldVendor = _vendors.First(v => v.Id == vendor.Id);
                        if (oldVendor != null)
                        {
                            var vendorPhonesIds = oldVendor.Phones.Select(a => a.Id);

                            var phonesToBeRemoved = vendorPhonesIds
                                                    .Where(p => !newPhonesIds.Contains(p)).ToList();

                            if (phonesToBeRemoved.Any())
                            {
                                return(Task.FromResult(discountPhonesIds.All(p => newPhonesIds.Contains(p) ||
                                                                             phonesToBeRemoved.Contains(p))));
                            }

                            return(Task.FromResult(discountPhonesIds.All(p => newPhonesIds.Contains(p))));
                        }
                    }
                    else
                    {
                        return(Task.FromResult(discountPhonesIds.All(p => newPhonesIds.Contains(p))));
                    }
                }
                else
                {
                    if (discountPhonesIds.Any() && vendor.Id == Guid.Empty)
                    {
                        return(Task.FromResult(false));
                    }
                }

                return(Task.FromResult(true));
            });

            _vendorValidationService
            .Setup(s => s.AddressesCanBeRemovedAsync(It.IsAny <VendorDto>(), CancellationToken.None))
            .Returns((VendorDto vendor, CancellationToken token) =>
            {
                var oldVendor = _vendors.First(v => v.Id == vendor.Id);

                var vendorAddressesIds = oldVendor.Addresses.Select(a => a.Id);
                var newAddressesIds    = vendor.Addresses.Select(a => a.Id).ToList();

                var addressesToBeRemoved = vendorAddressesIds
                                           .Where(a => !newAddressesIds.Contains(a)).ToList();

                if (addressesToBeRemoved.Any())
                {
                    var discountAddresses = vendor.Discounts
                                            .SelectMany(d => d.AddressesIds)
                                            .Distinct()
                                            .ToList();

                    if (discountAddresses.Any(a => addressesToBeRemoved.Contains(a)))
                    {
                        return(Task.FromResult(false));
                    }
                }

                return(Task.FromResult(true));
            });

            _discount = new DiscountShortDto
            {
                Id           = Guid.NewGuid(),
                VendorId     = _vendors[0].Id,
                VendorName   = _vendors[0].Name,
                AddressesIds = new List <int>
                {
                    _vendors[0].Addresses.ElementAt(0).Id
                },
                PhonesIds = new List <int>
                {
                    _vendors[0].Phones.ElementAt(0).Id
                }
            };

            var discounts = new List <DiscountShortDto>
            {
                _discount
            };

            _discountValidationService.Setup(s => s.DiscountNotExists(It.IsAny <Guid>(), CancellationToken.None))
            .Returns((Guid id, CancellationToken token) =>
                     Task.FromResult(discounts.All(d => d.Id != id)));

            _discountValidationService.Setup(s => s.EndDateLaterThanStartDate(It.IsAny <DiscountShortDto>()))
            .Returns((DiscountShortDto discount) =>
            {
                if (discount.EndDate != null)
                {
                    return(discount.EndDate.Value.Date >= discount.StartDate.Date);
                }

                return(true);
            });

            _categories = new List <CategoryDto>
            {
                new CategoryDto
                {
                    Id   = Guid.NewGuid(),
                    Name = "Food"
                },
                new CategoryDto
                {
                    Id   = Guid.NewGuid(),
                    Name = "Sport"
                }
            };

            _categoryValidationService.Setup(s => s.CategoryExistsAsync(It.IsAny <Guid>(), CancellationToken.None))
            .Returns((Guid id, CancellationToken token) =>
                     Task.FromResult(_categories.Any(c => c.Id == id)));

            var tags = new List <TagDto>
            {
                new TagDto
                {
                    Id   = Guid.NewGuid(),
                    Name = "Pizza"
                },
                new TagDto
                {
                    Id   = Guid.NewGuid(),
                    Name = "Sushi"
                }
            };

            _tagValidationService.Setup(s => s.TagExistsAsync(It.IsAny <Guid>(), CancellationToken.None))
            .Returns((Guid id, CancellationToken token) =>
                     Task.FromResult(tags.Any(c => c.Id == id)));
        }