public async Task DeleteCollection()
        {
            var layer = GetLayer();

            InsertFrogs(layer, 10);

            var deleteBasket = new DeleteCollectionBasket <Frog, int>(
                new DeleteCollectionRequest <Frog>(new Filter <Frog>(new[]
                                                                     { new InFilterTerm(nameof(Frog.Id), new object[] { 2, 4, 6, 8 }) })));

            await layer.AddResultAsync(deleteBasket, new Visit("something", VisitDirections.Down)).ConfigureAwait(false);

            Assert.Equal(4, deleteBasket.AscentPayload);

            var getBasket = new GetCollectionBasket <Frog>(new GetCollectionRequest <Frog>());
            await layer.AddResultAsync(getBasket, new Visit("something", VisitDirections.Down)).ConfigureAwait(false);

            Assert.Equal(6, getBasket.AscentPayload.Length);
            foreach (var frog in getBasket.AscentPayload)
            {
                Assert.NotEqual(2, frog.Id);
                Assert.NotEqual(4, frog.Id);
                Assert.NotEqual(6, frog.Id);
                Assert.NotEqual(8, frog.Id);
            }
        }
Example #2
0
        public async Task GetCollection()
        {
            var layer = new SalesforceLayer <MyContact>(_forceClient, new MyContactObjectDescriptor());

            var getBasket = new GetCollectionBasket <MyContact>(new GetCollectionRequest <MyContact>(10, 20));
            await layer.AddResultAsync(getBasket, new Visit("GetCol", VisitDirections.Down)).ConfigureAwait(false);

            Assert.True(getBasket.AscentPayload.Length == 10);
        }
Example #3
0
        public void Construct()
        {
            var filter  = new Filter <Frog>(new[] { new FilterTerm(nameof(Frog.Name), FilterOperators.StartsWith, "Fr") });
            var request = new GetCollectionRequest <Frog>(filter);

            var basket = new GetCollectionBasket <Frog>(request);

            Assert.Equal(typeof(Frog), basket.DataType);
            Assert.Same(request, basket.DescentPayload);
        }
Example #4
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);
        }
        public async Task GetAll()
        {
            var layer = GetLayer();

            InsertFrogs(layer, 100);

            var getBasket = new GetCollectionBasket <Frog>(new GetCollectionRequest <Frog>());
            await layer.AddResultAsync(getBasket, new Visit("something", VisitDirections.Down)).ConfigureAwait(false);

            Assert.Equal(100, getBasket.AscentPayload.Length);
        }
Example #6
0
        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);
        }
        public async Task GetFiltered()
        {
            var layer = GetLayer();

            InsertFrogs(layer, 100);

            var getBasket = new GetCollectionBasket <Frog>(new GetCollectionRequest <Frog>(new Filter <Frog>(new[]
                                                                                                             { new FilterTerm(nameof(Frog.DateOfBirth), FilterOperators.LessThan, DateTime.Today.AddDays(-50)) })));

            await layer.AddResultAsync(getBasket, new Visit("something", VisitDirections.Down)).ConfigureAwait(false);

            Assert.Equal(50, getBasket.AscentPayload.Length);
        }
        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 GetPaged()
        {
            var layer = GetLayer();

            InsertFrogs(layer, 100);

            for (var i = 0; i < 16; i++)
            {
                var getBasket = new GetCollectionBasket <Frog>(new GetCollectionRequest <Frog>(6, i));
                await layer.AddResultAsync(getBasket, new Visit("something", VisitDirections.Down)).ConfigureAwait(false);

                Assert.Equal(6, getBasket.AscentPayload.Length);
            }

            var getFinalBasket = new GetCollectionBasket <Frog>(new GetCollectionRequest <Frog>(6, 16));
            await layer.AddResultAsync(getFinalBasket, new Visit("something", VisitDirections.Down)).ConfigureAwait(false);

            Assert.Equal(4, getFinalBasket.AscentPayload.Length);
        }
Example #10
0
        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 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 Delete()
        {
            var layer = GetLayer();

            InsertFrogs(layer, 10);

            var deleteBasket = new DeleteBasket <int, Frog, int>(4);

            await layer.AddResultAsync(deleteBasket, new Visit("something", VisitDirections.Down)).ConfigureAwait(false);

            Assert.Equal(1, deleteBasket.AscentPayload);

            var getBasket = new GetCollectionBasket <Frog>(new GetCollectionRequest <Frog>());
            await layer.AddResultAsync(getBasket, new Visit("something", VisitDirections.Down)).ConfigureAwait(false);

            Assert.Equal(9, getBasket.AscentPayload.Length);
            foreach (var frog in getBasket.AscentPayload)
            {
                Assert.NotEqual(4, frog.Id);
            }
        }
        public async Task Patch()
        {
            var layer = GetLayer();

            InsertFrogs(layer, 10);

            var patchBasket = new PatchBasket <int, Frog, int>(
                new PatchRequest <int, Frog>(new Delta <int, Frog>(7,
                                                                   new Dictionary <string, object> {
                { nameof(Frog.Name), "Patched" }
            })));

            await layer.AddResultAsync(patchBasket, new Visit("something", VisitDirections.Down)).ConfigureAwait(false);

            Assert.Equal(1, patchBasket.AscentPayload);

            var getBasket = new GetCollectionBasket <Frog>(new GetCollectionRequest <Frog>());
            await layer.AddResultAsync(getBasket, new Visit("something", VisitDirections.Down)).ConfigureAwait(false);

            var seenPatched = false;

            Assert.Equal(10, getBasket.AscentPayload.Length);
            foreach (var frog in getBasket.AscentPayload)
            {
                if (frog.Id == 7)
                {
                    Assert.Equal("Patched", frog.Name);
                    seenPatched = true;
                }
                else
                {
                    Assert.Equal($"Frank{frog.Id}", frog.Name);
                }
            }

            Assert.True(seenPatched);
        }
Example #14
0
        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);
        }
Example #15
0
        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);
        }