public void ThenIfChildIsNullDontAddItToTheParentAsAChild(ParentChildrenMapper <Parent, Child> sut)
        {
            var lookup = new Dictionary <int, Parent>();

            var parent = new Parent {
                Id = 2, Children = new List <Child>()
            };
            Child child = null;

            sut.Map(lookup, x => x.Id, x => x.Children)(parent, child);

            lookup.Values.Single().Children.Count.Should().Be(0);
        }
        public void ThenIfLookupIsEmptyShouldAddParentObjectAndWithChild(ParentChildrenMapper <Parent, Child> sut)
        {
            var lookup = new Dictionary <int, Parent>();
            var parent = new Parent {
                Id = 2, Children = new List <Child>()
            };
            var child = new Child();

            var result = sut.Map(lookup, x => x.Id, x => x.Children)(parent, child);

            result.Should().Be(parent);
            result.Children.Should().Contain(child);
            lookup.Values.Should().Contain(parent);
        }
        public async Task <List <Framework> > GetAllFrameworks()
        {
            var lookup = new Dictionary <object, Framework>();
            var mapper = new ParentChildrenMapper <Framework, FundingPeriod>();

            return(await WithConnection(async connection =>
            {
                var results = await connection.QueryAsync(
                    sql: $"[dbo].[GetFrameworks]",
                    commandType: CommandType.StoredProcedure,
                    map: mapper.Map(lookup, x => x.Id, x => x.FundingPeriods),
                    splitOn: "Id"
                    );

                return results.GroupBy(c => c.Id).Select(item => item.First()).ToList();
            }));
        }
        private static async Task <Commitment> GetCommitment(long commitmentId, IDbConnection connection, IDbTransaction transation = null)
        {
            var lookup = new Dictionary <object, Commitment>();
            var mapper = new ParentChildrenMapper <Commitment, Apprenticeship>();

            var parameters = new DynamicParameters();

            parameters.Add("@commitmentId", commitmentId);

            var results = await connection.QueryAsync(
                sql : $"[dbo].[GetCommitment]",
                param : parameters,
                transaction : transation,
                commandType : CommandType.StoredProcedure,
                map : mapper.Map(lookup, x => x.Id, x => x.Apprenticeships));

            return(lookup.Values.SingleOrDefault());
        }
        private Task <IList <CommitmentSummary> > GetCommitmentsByIdentifier(string identifierName, long identifierValue)
        {
            var lookup = new Dictionary <object, CommitmentSummary>();
            var mapper = new ParentChildrenMapper <CommitmentSummary, Message>();

            return(WithConnection <IList <CommitmentSummary> >(async c =>
            {
                var parameters = new DynamicParameters();
                parameters.Add($"@id", identifierValue);

                var results = await c.QueryAsync(
                    sql: $"SELECT * FROM [dbo].[CommitmentSummaryWithMessages] WHERE {identifierName} = @id AND CommitmentStatus <> {(int)CommitmentStatus.Deleted} ORDER BY CreatedOn DESC;",
                    param: parameters,
                    map: mapper.Map(lookup, x => x.Id, x => x.Messages),
                    splitOn: "CommitmentId");

                return lookup.Values.ToList();
            }));
        }
        public void ThenIfLookupAlreadyContainsEntryWithIdOfParentShouldAddNewChildToExistingParent(
            ParentChildrenMapper <Parent, Child> sut)
        {
            var lookup        = new Dictionary <int, Parent>();
            var existingEntry = new Parent {
                Id = 2, Children = new List <Child> {
                    new Child()
                }
            };

            lookup.Add(existingEntry.Id, existingEntry);

            var parent = new Parent {
                Id = 2, Children = new List <Child>()
            };
            var child = new Child();

            sut.Map(lookup, x => x.Id, x => x.Children)(parent, child);

            lookup.Values.Count.Should().Be(1);
            lookup.Values.Single().Children.Count.Should().Be(2);
        }
        public void ThenANullLookupParameterThrowsAnArgumentNullException(ParentChildrenMapper <Parent, Child> sut)
        {
            Action act = () => sut.Map(null, x => x, x => new List <Child>());

            act.ShouldThrow <ArgumentNullException>();
        }