public async Task Get()
        {
            var mine = new FrogMine();

            // uncached
            var basket = new GetBasket <int, Frog>(3);
            await mine.SendAsync(basket).ConfigureAwait(false);

            Assert.True(basket.Note is OkNote);
            Assert.Equal(3, basket.AscentPayload.Id);
            Assert.Equal("Kermit", basket.AscentPayload.Name);
            Assert.Equal(3, basket.Visits.Count);

            // cached
            basket = new GetBasket <int, Frog>(3);
            await mine.SendAsync(basket).ConfigureAwait(false);

            Assert.True(basket.Note is ReturnNote);
            Assert.Equal(3, basket.AscentPayload.Id);
            Assert.Equal("Kermit", basket.AscentPayload.Name);
            Assert.Equal(1, basket.Visits.Count);

            // uncached
            basket = new GetBasket <int, Frog>(4);
            await mine.SendAsync(basket).ConfigureAwait(false);

            Assert.True(basket.Note is OkNote);
            Assert.Equal(4, basket.AscentPayload.Id);
            Assert.Equal("Kermit", basket.AscentPayload.Name);
            Assert.Equal(3, basket.Visits.Count);
        }
        public Task AddResultAsync(IPostBasket <Types.MatingEvent, string> basket, IVisit visit)
        {
            // get what we need out of the basket so that a response can be generated
            var male   = basket.DescentPayload.Male;
            var female = basket.DescentPayload.Female;
            var date   = basket.DescentPayload.Date;

            // we're going to patch the male and female, so there is a record of them mating
            var modifiedProps = new Dictionary <string, object> {
                { nameof(Types.Frog.DateLastMated), date }
            };

            var patchMaleBasket = new PatchBasket <int, Types.Frog, int>(
                new PatchRequest <int, Types.Frog>(new Delta <int, Types.Frog>(male.Id, modifiedProps)), basket);

            var patchFemaleBaset = new PatchBasket <int, Types.Frog, int>(
                new PatchRequest <int, Types.Frog>(new Delta <int, Types.Frog>(female.Id, modifiedProps)), basket);

            // generate some children for the male and female
            var tadpoleBaskets = GenerateTadpoles(basket, female, male, date);

            Task.WaitAll(_frogMine.SendAsync(patchMaleBasket), _frogMine.SendAsync(patchFemaleBaset));

            var tadpoleCount = tadpoleBaskets.Select(t => t.AscentPayload).Count();

            // the result of this operation is a string
            basket.AscentPayload = $"[{date:d}] {male.Name} and {female.Name} had {tadpoleCount} children";

            return(Task.CompletedTask);
        }
Exemple #3
0
        public Task AddResultAsync(IGetSingleBasket <Types.PairSelection> basket, IVisit visit)
        {
            var date = basket?.DescentPayload?.Filter?.Terms?.FirstOrDefault(
                t => t.PropertyName == nameof(Types.PairSelection.Date))?.Value as DateTime?;

            if (date == null)
            {
                throw new ArgumentException($"Expected filter on '{nameof(Types.PairSelection.Date)}'");
            }

            // only consider males which haven't mated in the past 3 months
            var maleFilter = new Filter <Types.Frog>(new[]
            {
                new FilterTerm(nameof(Types.Frog.IsMale), FilterOperators.Equal, true),
                new FilterTerm(nameof(Types.Frog.DateLastMated), FilterOperators.LessThan, date.Value.AddMonths(-3))
            });

            // ... and the same for females
            var femaleFilter = new Filter <Types.Frog>(new[]
            {
                new FilterTerm(nameof(Types.Frog.IsMale), FilterOperators.Equal, false),
                new FilterTerm(nameof(Types.Frog.DateLastMated), FilterOperators.LessThan, date.Value.AddMonths(-3))
            });

            // Try and find a suitable pair.
            // In a real application you would most likely have a single efficient DB query.  Here I just want to
            // demonstrate operating across different mines.
            // Note that the main basket is pased into these "child" baskets.  This is optional however doing this allows
            // for the baskets to be linked together when exporting tracing information (see FileTraceExporter)
            var getMaleBasket =
                new GetCollectionBasket <Types.Frog>(new GetCollectionRequest <Types.Frog>(maleFilter, 1, 0), basket);
            var getMaleTask = _frogMine.SendAsync(getMaleBasket);

            var getFemaleBasket =
                new GetCollectionBasket <Types.Frog>(new GetCollectionRequest <Types.Frog>(femaleFilter, 1, 0), basket);
            var getFemaleTask = _frogMine.SendAsync(getFemaleBasket);

            Task.WaitAll(getMaleTask, getFemaleTask);

            Types.Frog male = null;
            if (getMaleBasket.AscentPayload.Length > 0)
            {
                male = getMaleBasket.AscentPayload[0];
            }

            Types.Frog female = null;
            if (getFemaleBasket.AscentPayload.Length > 0)
            {
                female = getFemaleBasket.AscentPayload[0];
            }

            basket.AscentPayload = new Types.PairSelection(male, female, date.Value);

            return(Task.CompletedTask);
        }
Exemple #4
0
        private void Inhabit(Pond pond)
        {
            var frogam = new Frog {
                Name = "Frogam", IsMale = true, LivesInPondId = pond.Id, DateOfBirth = _day
            };
            var freve = new Frog {
                Name = "Freve", IsMale = false, LivesInPondId = pond.Id, DateOfBirth = _day
            };

            Task.WaitAll(
                _frogMine.SendAsync(new PostBasket <Frog, int>(frogam)),
                _frogMine.SendAsync(new PostBasket <Frog, int>(freve))
                );
        }
        public async Task Patch()
        {
            var mine   = new FrogMine("allowed");
            var basket = new PatchBasket <int, Frog, int>(new PatchRequest <int, Frog>(new Delta <int, Frog>(5,
                                                                                                             new Dictionary <string, object> {
                { nameof(Frog.Name), "abc" }
            })));
            await mine.SendAsync(basket);

            Assert.Equal(1, basket.AscentPayload);

            mine   = new FrogMine("Patch");
            basket = new PatchBasket <int, Frog, int>(new PatchRequest <int, Frog>(new Delta <int, Frog>(5,
                                                                                                         new Dictionary <string, object> {
                { nameof(Frog.Name), "abc" }
            })));
            await mine.SendAsync(basket);

            Assert.Equal(1, basket.AscentPayload);

            mine   = new FrogMine("not-allowed");
            basket = new PatchBasket <int, Frog, int>(new PatchRequest <int, Frog>(new Delta <int, Frog>(5,
                                                                                                         new Dictionary <string, object> {
                { nameof(Frog.Name), "abc" }
            })));
            await Assert.ThrowsAnyAsync <ShaftException>(() => mine.SendAsync(basket));
        }
        public async Task DeleteCollection()
        {
            var mine   = new FrogMine("allowed");
            var basket = new DeleteCollectionBasket <Frog, int>(new DeleteCollectionRequest <Frog>(new Filter <Frog>(new[]
            {
                new FilterTerm(nameof(Frog.Name), FilterOperators.StartsWith, "abc")
            })));

            await mine.SendAsync(basket);

            Assert.Equal(5, basket.AscentPayload);

            mine   = new FrogMine("DeleteCollection");
            basket = new DeleteCollectionBasket <Frog, int>(new DeleteCollectionRequest <Frog>(new Filter <Frog>(new[]
            {
                new FilterTerm(nameof(Frog.Name), FilterOperators.StartsWith, "abc")
            })));
            await mine.SendAsync(basket);

            Assert.Equal(5, basket.AscentPayload);

            mine   = new FrogMine("not-allowed");
            basket = new DeleteCollectionBasket <Frog, int>(new DeleteCollectionRequest <Frog>(new Filter <Frog>(new[]
            {
                new FilterTerm(nameof(Frog.Name), FilterOperators.StartsWith, "abc")
            })));
            await Assert.ThrowsAnyAsync <ShaftException>(() => mine.SendAsync(basket));
        }
        public async Task GetCollection()
        {
            var mine = new FrogMine();

            // uncached
            var basket = new GetCollectionBasket <Frog>(new GetCollectionRequest <Frog>());
            await mine.SendAsync(basket).ConfigureAwait(false);

            Assert.True(basket.Note is OkNote);
            Assert.Equal(3, basket.Visits.Count);
            Assert.Equal(3, basket.AscentPayload.Length);

            // cached
            basket = new GetCollectionBasket <Frog>(new GetCollectionRequest <Frog>());
            await mine.SendAsync(basket).ConfigureAwait(false);

            Assert.True(basket.Note is ReturnNote);
            Assert.Equal(1, basket.Visits.Count);
            Assert.Equal(3, basket.AscentPayload.Length);
        }
        public async Task Post()
        {
            var mine = new FrogMine();

            // uncached item
            var getBasket = new GetBasket <int, Frog>(33);
            await mine.SendAsync(getBasket).ConfigureAwait(false);

            Assert.True(getBasket.Note is OkNote);
            Assert.Equal(3, getBasket.Visits.Count);
            Assert.Equal(33, getBasket.AscentPayload.Id);

            // cached item
            getBasket = new GetBasket <int, Frog>(33);
            await mine.SendAsync(getBasket).ConfigureAwait(false);

            Assert.True(getBasket.Note is ReturnNote);
            Assert.Equal(1, getBasket.Visits.Count);
            Assert.Equal(33, getBasket.AscentPayload.Id);

            // uncached collection
            var getCollectionBasket = new GetCollectionBasket <Frog>(new GetCollectionRequest <Frog>());
            await mine.SendAsync(getCollectionBasket).ConfigureAwait(false);

            Assert.True(getCollectionBasket.Note is OkNote);
            Assert.Equal(3, getCollectionBasket.Visits.Count);
            Assert.Equal(3, getCollectionBasket.AscentPayload.Length);

            // cached collection
            getCollectionBasket = new GetCollectionBasket <Frog>(new GetCollectionRequest <Frog>());
            await mine.SendAsync(getCollectionBasket).ConfigureAwait(false);

            Assert.True(getCollectionBasket.Note is ReturnNote);
            Assert.Equal(1, getCollectionBasket.Visits.Count);
            Assert.Equal(3, getCollectionBasket.AscentPayload.Length);

            await mine.SendAsync(new PostBasket <Frog, int>(new Frog {
                Id = 852
            })).ConfigureAwait(false);

            // get cache should still exist
            getBasket = new GetBasket <int, Frog>(33);
            await mine.SendAsync(getBasket).ConfigureAwait(false);

            Assert.True(getBasket.Note is ReturnNote);
            Assert.Equal(33, getBasket.AscentPayload.Id);

            // but get collection shouldn't
            getCollectionBasket = new GetCollectionBasket <Frog>(new GetCollectionRequest <Frog>());
            await mine.SendAsync(getCollectionBasket).ConfigureAwait(false);

            Assert.True(getCollectionBasket.Note is OkNote);
            Assert.Equal(3, getCollectionBasket.AscentPayload.Length);
        }
        private void InsertFrogs(FrogMine mine, int count)
        {
            var tasks = new Task[count];

            for (var i = 1; i <= count; i++)
            {
                var frog = new Frog {
                    Name = $"Frank{i}", DateOfBirth = DateTime.Today.AddDays(-i)
                };
                tasks[i - 1] = mine.SendAsync(new PostBasket <Frog, int>(frog));
            }

            Task.WaitAll(tasks);
        }
        public async Task Post()
        {
            var mine   = new FrogMine("allowed");
            var basket = new PostBasket <Frog, int>(new Frog());
            await mine.SendAsync(basket);

            Assert.True(basket.AscentPayload > 0);

            mine   = new FrogMine("Post");
            basket = new PostBasket <Frog, int>(new Frog());
            await mine.SendAsync(basket);

            Assert.True(basket.AscentPayload > 0);

            mine   = new FrogMine("not-allowed");
            basket = new PostBasket <Frog, int>(new Frog());
            await Assert.ThrowsAnyAsync <ShaftException>(() => mine.SendAsync(basket));
        }
        public async Task GetCollection()
        {
            var mine   = new FrogMine("allowed");
            var basket = new GetCollectionBasket <Frog>(new GetCollectionRequest <Frog>());
            await mine.SendAsync(basket);

            Assert.Equal(3, basket.AscentPayload.Length);

            mine   = new FrogMine("GetCollection");
            basket = new GetCollectionBasket <Frog>(new GetCollectionRequest <Frog>());
            await mine.SendAsync(basket);

            Assert.Equal(3, basket.AscentPayload.Length);

            mine   = new FrogMine("not-allowed");
            basket = new GetCollectionBasket <Frog>(new GetCollectionRequest <Frog>());
            await Assert.ThrowsAnyAsync <ShaftException>(() => mine.SendAsync(basket));
        }
        public async Task GetSingle()
        {
            var mine   = new FrogMine("allowed");
            var basket = new GetSingleBasket <Frog>();
            await mine.SendAsync(basket);

            Assert.Equal(465, basket.AscentPayload.Id);

            mine   = new FrogMine("GetSingle");
            basket = new GetSingleBasket <Frog>();
            await mine.SendAsync(basket);

            Assert.Equal(465, basket.AscentPayload.Id);

            mine   = new FrogMine("not-allowed");
            basket = new GetSingleBasket <Frog>();
            await Assert.ThrowsAnyAsync <ShaftException>(() => mine.SendAsync(basket));
        }
        public async Task Delete()
        {
            var mine   = new FrogMine("allowed");
            var basket = new DeleteBasket <int, Frog, int>(6);
            await mine.SendAsync(basket);

            Assert.Equal(1, basket.AscentPayload);

            mine   = new FrogMine("Delete");
            basket = new DeleteBasket <int, Frog, int>(6);
            await mine.SendAsync(basket);

            Assert.Equal(1, basket.AscentPayload);

            mine   = new FrogMine("not-allowed");
            basket = new DeleteBasket <int, Frog, int>(6);
            await Assert.ThrowsAnyAsync <ShaftException>(() => mine.SendAsync(basket));
        }
        public async Task Put()
        {
            var mine   = new FrogMine("allowed");
            var basket = new PutBasket <int, Frog, int>(new PutRequest <int, Frog>(2, new Frog()));
            await mine.SendAsync(basket);

            Assert.Equal(1, basket.AscentPayload);

            mine   = new FrogMine("Put");
            basket = new PutBasket <int, Frog, int>(new PutRequest <int, Frog>(2, new Frog()));
            await mine.SendAsync(basket);

            Assert.Equal(1, basket.AscentPayload);

            mine   = new FrogMine("not-allowed");
            basket = new PutBasket <int, Frog, int>(new PutRequest <int, Frog>(2, new Frog()));
            await Assert.ThrowsAnyAsync <ShaftException>(() => mine.SendAsync(basket));
        }
        public async Task AddResultAsync(IPostBasket <Types.MaturationEvent, int> basket, IVisit visit)
        {
            var date   = basket.DescentPayload.Date;
            var filter = new Filter <Types.Tadpole>(new[]
            {
                new FilterTerm(nameof(Types.Tadpole.DateOfBirth), FilterOperators.LessThanOrEqual, date.AddMonths(-2))
            });

            // get all tadpoles who are of a certain age - see filter above
            var getTadpolesBasket =
                new GetCollectionBasket <Types.Tadpole>(new GetCollectionRequest <Types.Tadpole>(filter));

            await _tadpoleMine.SendAsync(getTadpolesBasket).ConfigureAwait(false);

            var tadpoles = getTadpolesBasket.AscentPayload;

            if (tadpoles.Length > 0)
            {
                // covert the retrieved tadpoles into frogs...
                foreach (var tadpole in tadpoles)
                {
                    var frog = tadpole.ToFrog();
                    using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
                    {
                        // ... create frog
                        var postFrogBasket = new PostBasket <Types.Frog, int>(frog);
                        var postFrogTask   = _frogMine.SendAsync(postFrogBasket);

                        // ...and get rid of the tapole which has now become a frog
                        var deleteTadpoleBasket = new DeleteBasket <int, Types.Tadpole, int>(tadpole.Id);
                        var deleteTadpoleTask   = _tadpoleMine.SendAsync(deleteTadpoleBasket);

                        Task.WaitAll(postFrogTask, deleteTadpoleTask);

                        scope.Complete();
                    }
                }
            }

            basket.AscentPayload = tadpoles.Length;
        }
        public async Task Patch()
        {
            var mine = new FrogMine();

            // uncached item
            var getBasket = new GetBasket <int, Frog>(33);
            await mine.SendAsync(getBasket).ConfigureAwait(false);

            Assert.True(getBasket.Note is OkNote);
            Assert.Equal(33, getBasket.AscentPayload.Id);

            // cached item
            getBasket = new GetBasket <int, Frog>(33);
            await mine.SendAsync(getBasket).ConfigureAwait(false);

            Assert.True(getBasket.Note is ReturnNote);
            Assert.Equal(33, getBasket.AscentPayload.Id);

            // uncached collection
            var getCollectionBasket = new GetCollectionBasket <Frog>(new GetCollectionRequest <Frog>());
            await mine.SendAsync(getCollectionBasket).ConfigureAwait(false);

            Assert.True(getCollectionBasket.Note is OkNote);
            Assert.Equal(3, getCollectionBasket.AscentPayload.Length);

            // cached collection
            getCollectionBasket = new GetCollectionBasket <Frog>(new GetCollectionRequest <Frog>());
            await mine.SendAsync(getCollectionBasket).ConfigureAwait(false);

            Assert.True(getCollectionBasket.Note is ReturnNote);
            Assert.Equal(3, getCollectionBasket.AscentPayload.Length);

            await mine.SendAsync(new PatchBasket <int, Frog, int>(
                                     new PatchRequest <int, Frog>(
                                         new Delta <int, Frog>(8, new Dictionary <string, object> {
                { nameof(Frog.Name), "a" }
            }))))
            .ConfigureAwait(false);

            // get cache should still exist
            getBasket = new GetBasket <int, Frog>(33);
            await mine.SendAsync(getBasket).ConfigureAwait(false);

            Assert.True(getBasket.Note is ReturnNote);
            Assert.Equal(33, getBasket.AscentPayload.Id);

            // but get collection shouldn't
            getCollectionBasket = new GetCollectionBasket <Frog>(new GetCollectionRequest <Frog>());
            await mine.SendAsync(getCollectionBasket).ConfigureAwait(false);

            Assert.True(getCollectionBasket.Note is OkNote);
            Assert.Equal(3, getCollectionBasket.AscentPayload.Length);

            await mine.SendAsync(new PatchBasket <int, Frog, int>(
                                     new PatchRequest <int, Frog>(
                                         new Delta <int, Frog>(33, new Dictionary <string, object> {
                { nameof(Frog.Name), "a" }
            }))))
            .ConfigureAwait(false);

            // get cache should now be cleared exist
            getBasket = new GetBasket <int, Frog>(33);
            await mine.SendAsync(getBasket).ConfigureAwait(false);

            Assert.True(getBasket.Note is OkNote);
            Assert.Equal(33, getBasket.AscentPayload.Id);

            // and so should the get collection's
            getCollectionBasket = new GetCollectionBasket <Frog>(new GetCollectionRequest <Frog>());
            await mine.SendAsync(getCollectionBasket).ConfigureAwait(false);

            Assert.True(getCollectionBasket.Note is OkNote);
            Assert.Equal(3, getCollectionBasket.AscentPayload.Length);
        }
        public async Task Delete()
        {
            var mine = new FrogMine();

            // uncached item
            var getBasket = new GetBasket <int, Frog>(33);
            await mine.SendAsync(getBasket).ConfigureAwait(false);

            Assert.True(getBasket.Note is OkNote);
            Assert.Equal(33, getBasket.AscentPayload.Id);

            // cached item
            getBasket = new GetBasket <int, Frog>(33);
            await mine.SendAsync(getBasket).ConfigureAwait(false);

            Assert.True(getBasket.Note is ReturnNote);
            Assert.Equal(33, getBasket.AscentPayload.Id);

            // uncached collection
            var getCollectionBasket = new GetCollectionBasket <Frog>(new GetCollectionRequest <Frog>());
            await mine.SendAsync(getCollectionBasket).ConfigureAwait(false);

            Assert.True(getCollectionBasket.Note is OkNote);
            Assert.Equal(3, getCollectionBasket.AscentPayload.Length);

            // cached collection
            getCollectionBasket = new GetCollectionBasket <Frog>(new GetCollectionRequest <Frog>());
            await mine.SendAsync(getCollectionBasket).ConfigureAwait(false);

            Assert.True(getCollectionBasket.Note is ReturnNote);
            Assert.Equal(3, getCollectionBasket.AscentPayload.Length);

            await mine.SendAsync(new DeleteBasket <int, Frog, int>(8)).ConfigureAwait(false);

            // get cache should still exist
            getBasket = new GetBasket <int, Frog>(33);
            await mine.SendAsync(getBasket).ConfigureAwait(false);

            Assert.True(getBasket.Note is ReturnNote);
            Assert.Equal(33, getBasket.AscentPayload.Id);

            // but get collection shouldn't
            getCollectionBasket = new GetCollectionBasket <Frog>(new GetCollectionRequest <Frog>());
            await mine.SendAsync(getCollectionBasket).ConfigureAwait(false);

            Assert.True(getCollectionBasket.Note is OkNote);
            Assert.Equal(3, getCollectionBasket.AscentPayload.Length);

            await mine.SendAsync(new DeleteBasket <int, Frog, int>(33)).ConfigureAwait(false);

            // get cache should now be cleared exist
            getBasket = new GetBasket <int, Frog>(33);
            await mine.SendAsync(getBasket).ConfigureAwait(false);

            Assert.True(getBasket.Note is OkNote);
            Assert.Equal(33, getBasket.AscentPayload.Id);

            // and so should the get collection's
            getCollectionBasket = new GetCollectionBasket <Frog>(new GetCollectionRequest <Frog>());
            await mine.SendAsync(getCollectionBasket).ConfigureAwait(false);

            Assert.True(getCollectionBasket.Note is OkNote);
            Assert.Equal(3, getCollectionBasket.AscentPayload.Length);
        }