Exemple #1
0
        public void Cannot_publish_without_price()
        {
            _classifiedAd.SetTitle(ClassifiedAdTitle.FromString("title"));
            _classifiedAd.UpdateText(ClassifiedAdText.FromString("buy"));

            Assert.Throws <InvalidEntityStateException>(() => _classifiedAd.RequestToPublish());
        }
Exemple #2
0
        public async Task Handle(object command)
        {
            switch (command)
            {
            case Contracts.V1.Create cmd:
                await HandleCreate(cmd);

                break;

            case Contracts.V1.SetTitle cmd:
                await HandleUpdate(cmd.Id, ad => ad.SetTitle(ClassifiedAdTitle.FromString(cmd.Title)));

                break;

            case Contracts.V1.UpdateText cmd:
                await HandleUpdate(cmd.Id, ad => ad.UpdateText(ClassifiedAdText.FromString(cmd.Text)));

                break;

            case Contracts.V1.UpdatePrice cmd:
                await HandleUpdate(cmd.Id,
                                   ad => ad.UpdatePrice(Price.FromDecimal(cmd.Price, cmd.Currency, _currencyLookup)));

                break;

            case Contracts.V1.RequestToPublish cmd:
                await HandleUpdate(cmd.Id, ad => ad.RequestToPublish());

                break;

            default:
                throw new InvalidOperationException($"Command type {command.GetType().FullName} is unknown");
            }
        }
        public void Cannot_publish_ad_without_title()
        {
            _classifiedAd.UpdateText(ClassifiedAdText.FromString("Please buy my stuff"));
            _classifiedAd.UpdatePrice(Price.FromDecimal(100.10m, "EUR", new FakeCurrencyLookup()));

            Assert.Throws <DomainExceptions.InvalidEntityStateException>(() => _classifiedAd.RequestToPublish());
        }
        public void Cannot_publish_without_price()
        {
            _classifiedAd.SetTitle(ClassifiedAddTitle.FromString("Test Ad"));
            _classifiedAd.UpdateText(ClassifiedAdText.FromString("Please buy my stuff"));

            Assert.Equal(ClassifiedAd.ClassifiedAdState.PendingReview, _classifiedAd.State);
        }
        public void Cannot_publish_ad_without_price()
        {
            _classifiedAd.SetTitle(ClassifiedAdTitle.FromString("Test ad"));
            _classifiedAd.UpdateText(ClassifiedAdText.FromString("Please buy my stuff"));

            Assert.Throws <DomainExceptions.InvalidEntityStateException>(() => _classifiedAd.RequestToPublish());
        }
        public async Task Handle(object command)
        {
            switch (command)
            {
            case Contracts.V1.Create cmd:
                if (await _store.Exists <Domain.ClassifiedAd.ClassifiedAd, ClassifiedAdId>(
                        new ClassifiedAdId(cmd.Id)))
                {
                    throw new InvalidOperationException($"Entity with id {cmd.Id} already exists");
                }

                var classifiedAd = new Domain.ClassifiedAd.ClassifiedAd(
                    new ClassifiedAdId(cmd.Id),
                    new UserId(cmd.OwnerId));

                await _store.Save <Domain.ClassifiedAd.ClassifiedAd, ClassifiedAdId>(classifiedAd);

                break;

            case Contracts.V1.SetTitle cmd:
                await this.HandleUpdate <Domain.ClassifiedAd.ClassifiedAd, ClassifiedAdId>(
                    _store, new ClassifiedAdId(cmd.Id),
                    c => c.SetTitle(ClassifiedAdTitle.FromString(cmd.Title)));

                break;

            case Contracts.V1.UpdateText cmd:
                await this.HandleUpdate <Domain.ClassifiedAd.ClassifiedAd, ClassifiedAdId>(
                    _store, new ClassifiedAdId(cmd.Id),
                    c => c.UpdateText(ClassifiedAdText.FromString(cmd.Text)));

                break;

            case Contracts.V1.UpdatePrice cmd:
                await this.HandleUpdate <Domain.ClassifiedAd.ClassifiedAd, ClassifiedAdId>(
                    _store, new ClassifiedAdId(cmd.Id),
                    c => c.UpdatePrice(Price.FromDecimal(cmd.Price, cmd.Currency, _currencyLookup)));

                break;

            case Contracts.V1.RequestToPublish cmd:
                await this.HandleUpdate <Domain.ClassifiedAd.ClassifiedAd, ClassifiedAdId>(
                    _store, new ClassifiedAdId(cmd.Id),
                    c => c.RequestToPublish());

                break;

            case Contracts.V1.Publish cmd:
                await this.HandleUpdate <Domain.ClassifiedAd.ClassifiedAd, ClassifiedAdId>(
                    _store, new ClassifiedAdId(cmd.Id),
                    c => c.Publish(new UserId(cmd.ApprovedBy)));

                break;

            default:
                throw new InvalidOperationException(
                          $"Command type {command.GetType().FullName} is unknown");
            }
        }
        public void Cannot_publish_with_zero_price()
        {
            _classifiedAd.SetTitle(ClassifiedAdTitle.FromString("Test ad"));
            _classifiedAd.UpdateText(ClassifiedAdText.FromString("Please buy my stuff"));
            _classifiedAd.UpdatePrice(Price.FromDecimal(0.0m, "EUR", new FakeCurrencyLookUp()));

            Assert.Throws <InvalidEntityStateException>(() => _classifiedAd.RequestToPublish());
        }
        public void Cannot_publish_with_zero_price()
        {
            _classifiedAd.SetTitle(ClassifiedAddTitle.FromString("Test Ad"));
            _classifiedAd.UpdateText(ClassifiedAdText.FromString("Please buy my stuff"));
            _classifiedAd.UpdatePrice(Price.FromDecimal(0.0M, "EUR", new FakeCurrencyLookup()));

            Assert.Equal(ClassifiedAd.ClassifiedAdState.PendingReview, _classifiedAd.State);
        }
        public async Task Handle(object command)
        {
            ClassifiedAd classifiedAd;

            switch (command)
            {
            case ClassifiedAds.V1.Create cmd:
                if (await _store.Exists <ClassifiedAd>(cmd.Id.ToString()))
                {
                    throw new InvalidOperationException($"Entity with id {cmd.Id } already exists");
                }

                classifiedAd = new ClassifiedAd(new ClassifiedAdId(cmd.Id), new UserId(cmd.OwnerId));

                await _store.Save(classifiedAd);

                break;

            case ClassifiedAds.V1.SetTitle cmd:
                classifiedAd = await _store.Load <ClassifiedAd>(cmd.Id.ToString());

                if (classifiedAd == null)
                {
                    throw new InvalidOperationException($"Entity with id {cmd.Id} cannot be found");
                }
                classifiedAd.SetTitle(ClassifiedAdTitle.FromString(cmd.Title));
                await _store.Save(classifiedAd);

                break;

            case ClassifiedAds.V1.UpdateText cmd:
                classifiedAd = await _store.Load <ClassifiedAd>(cmd.Id.ToString());

                if (classifiedAd == null)
                {
                    throw new InvalidOperationException($"Entity with id {cmd.Id} cannot be found");
                }
                classifiedAd.UpdateText(ClassifiedAdText.FromString(cmd.Text));
                await _store.Save(classifiedAd);

                break;

            // Let's not repeat ourselves!

            case ClassifiedAds.V1.UpdatePrice cmd:
                await HandleUpdate(cmd.Id, c => c.UpdatePrice(Price.FromDecimal(cmd.Price, cmd.Currency, _currencyLookup)));

                break;

            case ClassifiedAds.V1.RequestToPublish cmd:
                await HandleUpdate(cmd.Id, c => c.RequestToPublish());

                break;

            default:
                throw new InvalidOperationException($"Command type { command.GetType().FullName } is unknown");
            }
        }
Exemple #10
0
        public void Request_publishing_should_fail_when_title_is_missing()
        {
            var ad = new ClassifiedAd(new ClassifiedAdId(Guid.NewGuid()), new UserId(Guid.NewGuid()));

            ad.UpdateText(ClassifiedAdText.FromString("1981 Talbot. Mint condition, no rust"));
            ad.UpdatePrice(Price.FromDecimal(1500m, "EUR", new FakeCurrencyLookup()));

            Assert.Throws <InvalidEntityStateException>(() => ad.RequestToPublish());
        }
Exemple #11
0
        public void Request_publishing_should_fail_when_price_is_missing()
        {
            var ad = new ClassifiedAd(new ClassifiedAdId(Guid.NewGuid()), new UserId(Guid.NewGuid()));

            ad.SetTitle(ClassifiedAdTitle.FromTextOrHtml("Fine car!"));
            ad.UpdateText(ClassifiedAdText.FromString("1981 Talbot. Mint condition, no rust"));

            Assert.Throws <InvalidEntityStateException>(() => ad.RequestToPublish());
        }
        public void Can_publish_a_valid_ad()
        {
            _classifiedAd.SetTitle(ClassifiedAddTitle.FromString("Test Ad"));
            _classifiedAd.UpdateText(ClassifiedAdText.FromString("Please buy my stuff"));
            _classifiedAd.UpdatePrice(Price.FromDecimal(100.10M, "EUR", new FakeCurrencyLookup()));
            _classifiedAd.RequestToPublish();

            Assert.Equal(ClassifiedAd.ClassifiedAdState.PendingReview, _classifiedAd.State);
        }
Exemple #13
0
        public ClassifiedAdsCommandService(
            IAggregateStore store,
            ICurrencyLookup currencyLookup,
            UploadFile uploader) : base(store)
        {
            CreateWhen <V1.Create>(
                cmd => ClassifiedAdId.FromGuid(cmd.Id),
                (cmd, id) => ClassifiedAd.Create(
                    ClassifiedAdId.FromGuid(id),
                    UserId.FromGuid(cmd.OwnerId)
                    )
                );

            UpdateWhen <V1.ChangeTitle>(
                cmd => ClassifiedAdId.FromGuid(cmd.Id),
                (ad, cmd)
                => ad.SetTitle(ClassifiedAdTitle.FromString(cmd.Title))
                );

            UpdateWhen <V1.UpdateText>(
                cmd => ClassifiedAdId.FromGuid(cmd.Id),
                (ad, cmd)
                => ad.UpdateText(ClassifiedAdText.FromString(cmd.Text))
                );

            UpdateWhen <V1.UpdatePrice>(
                cmd => ClassifiedAdId.FromGuid(cmd.Id),
                (ad, cmd) => ad.UpdatePrice(
                    Price.FromDecimal(
                        cmd.Price, cmd.Currency ?? "EUR", currencyLookup
                        )
                    )
                );

            UpdateWhen <V1.RequestToPublish>(
                cmd => ClassifiedAdId.FromGuid(cmd.Id),
                (ad, cmd) => ad.RequestToPublish()
                );

            UpdateWhen <V1.Publish>(
                cmd => ClassifiedAdId.FromGuid(cmd.Id),
                (ad, cmd) => ad.Publish(UserId.FromGuid(cmd.ApprovedBy))
                );

            UpdateWhen <V1.Delete>(
                cmd => ClassifiedAdId.FromGuid(cmd.Id),
                (ad, cmd) => ad.Delete()
                );

            UpdateWhen <V1.UploadImage>(
                cmd => ClassifiedAdId.FromGuid(cmd.Id),
                async(ad, cmd) => ad.AddPicture(
                    await uploader(cmd.Image), new PictureSize(2000, 2000)
                    )
                );
        }
        public void Can_publish_a_valid_ad()
        {
            _classifiedAd.SetTitle(ClassifiedAdTitle.FromString("Test ad"));
            _classifiedAd.UpdateText(ClassifiedAdText.FromString("Please buy my stuff"));
            _classifiedAd.UpdatePrice(Price.FromDecimal(100.10m, "EUR", new FakeCurrencyLookup()));
            _classifiedAd.AddPicture(new Uri("http://www.google.de"), new PictureSize(1000, 1000));
            _classifiedAd.RequestToPublish();

            Assert.Equal(ClassifiedAd.ClassifiedAdState.PendingReview, _classifiedAd.State);
        }
Exemple #15
0
        public void test_throw_when_publish_without_title()
        {
            //Given
            _classifiedAd.UpdateText(ClassifiedAdText.FromString("keeping social distancing"));
            _classifiedAd.UpdatePrice(Price.Create(100M, Currency.Default));
            //When
            Action publish = () => _classifiedAd.RequestToPublish();

            //Then
            Assert.Throws <InvalidEntityStateException>(publish);
        }
Exemple #16
0
        public void test_publish_without_price_should_throw_exception()
        {
            //Given
            _classifiedAd.SetTitle(ClassifiedAdTitle.FromString("covid-19 comming"));
            _classifiedAd.UpdateText(ClassifiedAdText.FromString("keeping social distancing"));
            //When
            Action publish = () => _classifiedAd.RequestToPublish();

            //Then
            Assert.Throws <InvalidEntityStateException>(publish);
        }
Exemple #17
0
 public void test_publish_a_valid_ad_should_be_success()
 {
     //Given
     _classifiedAd.SetTitle(ClassifiedAdTitle.FromString("covid-19 comming"));
     _classifiedAd.UpdateText(ClassifiedAdText.FromString("keeping social distancing"));
     _classifiedAd.UpdatePrice(Price.Create(100M, Currency.Default));
     _classifiedAd.AddPicture(new Uri("http://localhost/storage/123.jpg"), new PictureSize(800, 600));
     //When
     _classifiedAd.RequestToPublish();
     //Then
     Assert.Equal(ClassifiedAdState.PendingReview, _classifiedAd.State);
 }
Exemple #18
0
        public void Request_publishing_should_succeed_when_ad_is_complete()
        {
            var ad = new ClassifiedAd(new ClassifiedAdId(Guid.NewGuid()), new UserId(Guid.NewGuid()));

            ad.AddPicture(new PictureId(Guid.NewGuid()), new PictureSize(800, 600), new Uri("http://example.com"));
            ad.SetTitle(ClassifiedAdTitle.FromTextOrHtml("Fine car!"));
            ad.UpdateText(ClassifiedAdText.FromString("1981 Talbot. Mint condition, no rust"));
            ad.UpdatePrice(Price.FromDecimal(1500m, "EUR", new FakeCurrencyLookup()));

            ad.RequestToPublish();
            Assert.Equal(ClassifiedAdState.PendingReview, ad.State);
        }
Exemple #19
0
        public void test_add_picture_to_ClassifiedAd()
        {
            //Given
            _classifiedAd.SetTitle(ClassifiedAdTitle.FromString("covid-19 comming"));
            _classifiedAd.UpdateText(ClassifiedAdText.FromString("keeping social distancing"));
            _classifiedAd.UpdatePrice(Price.Create(0, Currency.Default));
            var originCount = _classifiedAd.Pictures.Count();

            //When
            _classifiedAd.AddPicture(new Uri("https://google.com.tw"), new PictureSize(800, 600));
            //Then
            Assert.Equal(originCount + 1, _classifiedAd.Pictures.Count());
        }
        public async Task Handle(object command)
        {
            switch (command)
            {
            case ClassifiedAds.V1.Create cmd:
                if (await _repository.Exists(cmd.Id.ToString()))
                {
                    throw new InvalidOperationException($"Entity with id {cmd.Id} already exists");
                }

                var classifiedAd = new ClassifiedAd(
                    new ClassifiedAdId(cmd.Id),
                    new UserId(cmd.OwnerId));

                await _repository.Add(classifiedAd);

                await _unitOfWork.Commit();

                break;

            case ClassifiedAds.V1.SetTitle cmd:
                await HandleUpdate(cmd.Id,
                                   c => c.SetTitle(ClassifiedAdTitle.FromString(cmd.Title)));

                break;

            case ClassifiedAds.V1.UpdateText cmd:
                await HandleUpdate(cmd.Id,
                                   c => c.UpdateText(ClassifiedAdText.FromString(cmd.Text)));

                break;

            case ClassifiedAds.V1.UpdatePrice cmd:
                await HandleUpdate(cmd.Id,
                                   c => c.UpdatePrice(Price.FromDecimal(cmd.Price, cmd.Currency, _currencyLookup)));

                break;

            case ClassifiedAds.V1.RequestToPublish cmd:
                await HandleUpdate(cmd.Id,
                                   c => c.RequestToPublish());

                break;

            default:
                throw new InvalidOperationException(
                          $"Command type {command.GetType().FullName} is unknown");
            }
        }
        public ClassifiedAdsCommandService(
            IAggregateStore store,
            ICurrencyLookup currencyLookup) : base(store)
        {
            CreateWhen <V1.Create>(
                cmd => new ClassifiedAdId(cmd.Id),
                (cmd, id) => ClassifiedAd.Create(
                    new ClassifiedAdId(id), new UserId(cmd.OwnerId)
                    )
                );

            UpdateWhen <V1.ChangeTitle>(
                cmd => new ClassifiedAdId(cmd.Id),
                (ad, cmd) => ad.SetTitle(ClassifiedAdTitle.FromString(cmd.Title))
                );

            UpdateWhen <V1.UpdateText>(
                cmd => new ClassifiedAdId(cmd.Id),
                (ad, cmd) => ad.UpdateText(ClassifiedAdText.FromString(cmd.Text))
                );

            UpdateWhen <V1.UpdatePrice>(
                cmd => new ClassifiedAdId(cmd.Id),
                (ad, cmd) => ad.UpdatePrice(
                    Price.FromDecimal(cmd.Price, cmd.Currency ?? "EUR", currencyLookup)
                    )
                );

            UpdateWhen <V1.RequestToPublish>(
                cmd => new ClassifiedAdId(cmd.Id),
                (ad, cmd) => ad.RequestToPublish()
                );

            UpdateWhen <V1.Publish>(
                cmd => new ClassifiedAdId(cmd.Id),
                (ad, cmd) => ad.Publish(new UserId(cmd.ApprovedBy))
                );

            UpdateWhen <V1.Delete>(
                cmd => new ClassifiedAdId(cmd.Id),
                (ad, cmd) => ad.Delete()
                );
        }
Exemple #22
0
        public async Task Handle(object command)
        {
            switch (command)
            {
            case V1.Create cmd:
                await HandleCreate(cmd);

                break;

            case V1.SetTitle cmd:
                await HandleUpdate(cmd.Id, c => c.SetTitle(ClassifiedAdTitle.FromString(cmd.Title)));

                break;

            case V1.UpdateText cmd:
                await HandleUpdate(cmd.Id, c => c.UpdateText(ClassifiedAdText.FromString(cmd.Text)));

                break;

            case V1.UpdatePrice cmd:
                await HandleUpdate(cmd.Id, c => c.UpdatePrice(Price.FromDecimal(cmd.Price, cmd.Currency, _currencyLookup)));

                break;

            case V1.RequestToPublish cmd:
                await HandleUpdate(cmd.Id, c => c.RequestToPublish());

                break;

            case V1.Publish cmd:
                await HandleUpdate(cmd.Id, c => c.Publish(new UserId(cmd.ApprovedBy)));

                break;

            default:
                return(Task.CompletedTask);

                break;
            }
        }
Exemple #23
0
        public void AdText_present_can_be_checked()
        {
            var sut = ClassifiedAdText.FromString("foo");

            Assert.True(sut != null);
        }