public void Cannot_publish_without_price() { _classifiedAd.SetTitle(ClassifiedAdTitle.FromString("title")); _classifiedAd.UpdateText(ClassifiedAdText.FromString("buy")); Assert.Throws <InvalidEntityStateException>(() => _classifiedAd.RequestToPublish()); }
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"); } }
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()); }
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); }
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); }
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); }
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); }
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); }
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); }
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() ); }
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; } }
public void AdText_present_can_be_checked() { var sut = ClassifiedAdText.FromString("foo"); Assert.True(sut != null); }