public void ThenIReceiveTheWelcomeKitEmail()
        {
            var host     = TestSetup.TestAccountImapHost;
            var port     = TestSetup.TestAccountImapPort;
            var email    = TestSetup.TestAccountEmail;
            var password = TestSetup.TestAccountEmailPassword;

            var imis = Context <IMIS>(ContextKeys.IMIS);

            var pc   = Ctx.PrimaryContact;
            var coId = PollUtils.Poll <IEnumerable <Name> >(
                $"Query name entry by company and primary: {pc.CompanyName} {pc.FirstName} {pc.LastName}",
                TestSetup.DbTimeout, TestSetup.DbPollInterval,
                () => imis.NamesByCompanyAndUser(pc.CompanyName, pc.FirstName, pc.LastName),
                x => x.Where(o => o.LAST_UPDATED > ImisStartTime).Count() > 0
                ).First().CO_ID;

            PollUtils.Poll <bool>(
                $"Search Welcome Kit in inbox for CO_ID={coId}", 180, 30,
                () => {
                var mail = new Mail.MailClient(host, port, email, password);
                var r    = mail.ReceivedWelcomeKit(Ctx.StartTime, coId, pc.CompanyName);
                mail.Disconnect();
                return(r);
            },
                x => x == true
                ).ShouldBeTrue();
        }
        public void ThenSubscriptionEntriesAreCreatedAsFollows(Table table)
        {
            var imis = Context <IMIS>(IMIS);
            var pc   = Ctx.PrimaryContact;
            var coId = imis.NamesByCompanyAndUser(pc.CompanyName, pc.FirstName, pc.LastName).First().CO_ID;

            Console.WriteLine($"CO_ID={coId}");

            var expectedCount = Ctx.NewAccount ? 1 : Ctx.Capacities.Count();

            PollUtils.Poll <IEnumerable <Subscription> >(
                $"Querying subscriptions table for CO_ID={coId}", DB_TIMEOUT, DB_INTERVAL,
                () => imis.SubscriptionsForCompany(coId),
                x => table.Rows.All(row =>
                                    x.Where(o => o.DATE_ADDED > ImisStartTime && o.PRODUCT_CODE == row["ProductCode"])
                                    .Count() == Int32.Parse(row["Count"])
                                    )
                );

            // Wait 10 more seconds just in case database changes further.
            System.Threading.Thread.Sleep(TimeSpan.FromSeconds(10));

            var subs = imis.SubscriptionsForCompany(coId).Where(o => o.DATE_ADDED >= ImisStartTime);

            var expectedTotal = table.Rows.Sum(o => Int32.Parse(o["Count"]));
            var extra         = Ctx.NewAccount ? 0 : subs.Where(o => o.PRODUCT_CODE == "PC_AN_CAP").Count();

            subs.Count().ShouldBe(expectedTotal + extra);

            foreach (var row in table.Rows)
            {
                subs.Where(o => o.PRODUCT_CODE == row["ProductCode"])
                .Count().ShouldBe(Int32.Parse(row["Count"]));
            }
        }
        public void ThenInNameTableFollowingEntriesAreCreated(Table table)
        {
            var imis = Context <IMIS>(IMIS);

            var pc      = Ctx.PrimaryContact;
            var account = PollUtils.Poll <Account>(
                $"Get initial name entries since {ImisStartTime}", DB_TIMEOUT, DB_INTERVAL,
                () => new Account(imis, pc.CompanyName, pc.FirstName, pc.LastName),
                (acct) => table.Rows.All(row =>
            {
                var n = Int32.Parse(row["Count"]);
                return(acct[row["MemberType"]]
                       .Where(o => o.LAST_UPDATED >= ImisStartTime)
                       .Count() >= n);
            })
                );

            account.ShouldNotBeNull();

            System.Threading.Thread.Sleep(TimeSpan.FromSeconds(10));

            var coId = account["CM"].First().ID;

            account = new Account(imis, coId);

            foreach (var row in table.Rows)
            {
                var t = row["MemberType"];
                var n = Int32.Parse(row["Count"]);
                account[t].Where(o => o.LAST_UPDATED >= ImisStartTime).Count().ShouldBe(n);
            }
        }
        public void WhenICheckThisIdentifierAvailableInCompanyPrefixHoldTable()
        {
            var prefix = Setup.TestSetup.UiisContext.PrefixToVendOrHold;

            PollUtils.Poll(
                $"Querying held prefix {prefix}", 60, 5,
                () => Setup.TestSetup.UiisDb.GetHeldPrefixByValue(prefix),
                o => o.Count() > 0
                ).First().Value.ShouldBe(prefix);
        }
        public void ThenICheckThisPrefixIsNotInCompanyPrefixTable()
        {
            var prefix = Setup.TestSetup.UiisContext.PrefixToVendOrHold;

            PollUtils.Poll(
                $"Querying prefix {prefix}", 60, 5,
                () => Setup.TestSetup.UiisDb.GetPrefixByValue(prefix),
                o => o.Count() == 0
                ).ShouldBeEmpty();
        }
        public void ThenICheckThisPrefixIsNotAvailableInCompanyPrefixHoldTable()
        {
            var prefix = Setup.TestSetup.UiisContext.PrefixToVendOrHold;

            Console.WriteLine($"prefix {prefix}");
            PollUtils.Poll(
                $"Querying held prefix {prefix}", 60, 5,
                () => Setup.TestSetup.UiisDb.GetHeldPrefixByValue(prefix),
                o => o.Count() == 0
                ).ShouldBeEmpty();
        }
        public void ThenISeeThisRangeInCompanyPrefixAvailableRangeTable()
        {
            var range = Setup.TestSetup.UiisContext.Range;
            var ars   = PollUtils.Poll(
                $"Query available range for {range}", 60, 5,
                () => Setup.TestSetup.UiisDb.AvailableRangeByPredicate(range),
                xs => xs.Count() > 0
                );

            ars.Count().ShouldBe(1);
        }
        public void ThenTheRangePredicateGetsRemovedFromCompanyPrefixRangeTable()
        {
            var range = Setup.TestSetup.UiisContext.Range;
            var ars   = PollUtils.Poll(
                $"Query open range for {range}", 60, 5,
                () => Setup.TestSetup.UiisDb.OpenRangeByPredicate(range),
                xs => xs.Count() == 0
                );

            ars.Count().ShouldBe(0);
        }
        public void ThenISeeInCompanyPrefixRangeTableAutoAssignIs1(int autoAssign)
        {
            var range = Setup.TestSetup.UiisContext.Range;
            var prs   = PollUtils.Poll(
                $"Query open range for {range}", 60, 5,
                () => Setup.TestSetup.UiisDb.OpenRangeByPredicate(range),
                xs => xs.Count() > 0
                );

            prs.All(o => o.AutoAssign);
        }
        public void ThenRelationshipEntriesAreCreatedCorrectly()
        {
            var imis = Context <IMIS>(IMIS);
            var pc   = Ctx.PrimaryContact;

            PollUtils.Poll(
                $"Query relationships for company {pc.CompanyName}", DB_TIMEOUT, DB_INTERVAL,
                () => {
                var coId = imis.NamesByCompanyAndUser(pc.CompanyName, pc.FirstName, pc.LastName).First().CO_ID;
                return(imis.RelationshipsByCoId(coId));
            },
                (e) => {
                try
                {
                    return(f(e));
                }
                catch
                {
                    return(false);
                };
            }
                );

            bool f(IEnumerable <Relationship> entries)
            {
                var keyRel  = entries.Where((o) => o.RELATION_TYPE == "KEY").First();
                var billRel = entries.Where((o) => o.RELATION_TYPE == "BILL").First();
                var ceoRel  = entries.Where((o) => o.RELATION_TYPE == "CEO").First();

                var result = true;

                var coId  = imis.NamesByCompanyAndUser(pc.CompanyName, pc.FirstName, pc.LastName).First().CO_ID;
                var names = imis.NamesByCoId(coId);

                var pName = names.Where(o => o.ID == keyRel.TARGET_ID).First();

                result = result && pName.FIRST_NAME == pc.FirstName;
                result = result && pName.LAST_NAME == pc.LastName;
                result = keyRel.TARGET_ID == billRel.TARGET_ID;

                if (result == false)
                {
                    return(false);
                }

                var ec    = Ctx.ExecutiveContact;
                var eName = names.Where(o => o.ID == ceoRel.TARGET_ID).First();

                result = result && eName.FIRST_NAME == ec.FirstName;
                result = result && eName.LAST_NAME == ec.LastName;

                return(result);
            }
        }
        public void ThenTheRangePredicateGetAddedToCompanyPrefixRangeTable()
        {
            var range  = Setup.TestSetup.UiisContext.Range;
            var ranges = PollUtils.Poll(
                $"Query open range for {range}", 60, 5,
                () => Setup.TestSetup.UiisDb.OpenRangeByPredicate(range),
                xs => xs.Count() > 0
                );

            ranges.Count().ShouldBe(1);
        }
        public void ThenICheckThisPrefixInCompanyPrefixTable()
        {
            var page   = new Pages.Confirmation(Setup.TestSetup.Driver);
            var prefix = page.GetVendedPrefix();

            Console.WriteLine($"prefix = {prefix}");
            PollUtils.Poll(
                $"Querying prefix {prefix}", 60, 5,
                () => Setup.TestSetup.UiisDb.GetPrefixByValue(prefix),
                o => o.Count() > 0
                ).First().Value.ShouldBe(prefix);
        }
        public void ThenInSubscriptionsTableBillingAmountsAreCorrect()
        {
            var imis = Context <IMIS>(IMIS);
            var pc   = Ctx.PrimaryContact;
            var coId = imis.NamesByCompanyAndUser(pc.CompanyName, pc.FirstName, pc.LastName).First().CO_ID;

            Console.WriteLine($"CO_ID={coId}");

            int expectedCount;

            if (Ctx.NewAccount)
            {
                expectedCount = 2;
            }
            else
            {
                var cm         = imis.NamesByCoId(coId).Where(o => o.MEMBER_TYPE == "CM").First();
                var multiplier = cm.PAID_THRU.Month == DateTime.Now.Month ? 2 : 3;
                expectedCount = multiplier * Ctx.Capacities.Count();
            }

            var subs = PollUtils.Poll <IEnumerable <Subscription> >(
                $"Querying subscriptions table for CO_ID={coId}", DB_TIMEOUT, DB_INTERVAL,
                () => imis.SubscriptionsForCompany(coId),
                x => {
                var list = x.Where(o => o.DATE_ADDED >= ImisStartTime);
                if (!Ctx.NewAccount)
                {
                    list = list.Where(o => o.PRODUCT_CODE != "PC_AN_CAP");
                }
                return(list.Count() == expectedCount);
            }
                ).Where(o => o.DATE_ADDED >= ImisStartTime);

            var(fee1, fee2, fee3) = Ctx.BillingAmounts();

            subs.Where(o => o.PRODUCT_CODE == "PC_AN_CAP" || o.PRODUCT_CODE == "PC_AN_CAP_A")
            .Select(o => o.BILL_AMOUNT)
            .Sum()
            .ShouldBeInRange(fee1 - 0.1, fee1 + 0.1);

            subs.Where(o => o.PRODUCT_CODE == "PC_AN_CAP1" || o.PRODUCT_CODE == "PC_AN_CAP_A1")
            .Select(o => o.BILL_AMOUNT)
            .Sum()
            .ShouldBeInRange(fee2 - 0.1, fee2 + 0.1);

            subs.Where(o => o.PRODUCT_CODE == "PC_AN_CAP_A2")
            .Select(o => o.BILL_AMOUNT)
            .Sum()
            .ShouldBeInRange(fee3 - 0.1, fee3 + 0.1);
        }
        public void ThenInTransTableThePaymentIsAddedToABatch()
        {
            var imis    = Context <IMIS>(IMIS);
            var pc      = Ctx.PrimaryContact;
            var coId    = imis.NamesByCompanyAndUser(pc.CompanyName, pc.FirstName, pc.LastName).First().CO_ID;
            var account = new Account(imis, coId);

            var n             = Ctx.NewAccount ? 1 : Ctx.Capacities.Count();
            var currentMonth  = DateTime.Now.Month;
            var paidThruMonth = Ctx.NewAccount ? currentMonth : account.Company.PAID_THRU.Month;
            var m             = currentMonth == paidThruMonth ? 2 : 3;

            var subs = PollUtils.Poll <IEnumerable <Subscription> >(
                $"Querying subscriptions table for CO_ID={coId} n={n * m}", DB_TIMEOUT, DB_INTERVAL,
                () =>
            {
                var x = imis.SubscriptionsForCompany(coId).Where(o => o.DATE_ADDED > ImisStartTime);
                if (!Ctx.NewAccount)
                {
                    x = x.Where(o => o.PRODUCT_CODE != "PC_AN_CAP");
                }
                return(x);
            },
                x => x.Count() == n * m
                );

            var btIds = subs.Where(o => o.BT_ID != "").Select(o => o.BT_ID).Distinct();

            btIds.Count().ShouldBe(n);

            foreach (var btId in btIds)
            {
                var trans = PollUtils.Poll <IEnumerable <Trans> >(
                    $"Querying transactions table for BT_ID={btId}", DB_TIMEOUT, DB_INTERVAL,
                    () => imis.TransactionForBtId(btId),
                    (x) => x.Count() >= m + 1
                    );

                foreach (var tran in trans.Where(o => o.PRODUCT_CODE != ""))
                {
                    subs.Where(o => o.BT_ID == btId && o.PRODUCT_CODE == tran.PRODUCT_CODE)
                    .Count()
                    .ShouldBe(1);
                }
                trans.Where(o => o.PRODUCT_CODE == "").Count().ShouldBe(1);
            }
        }
        public void ThenICheckThatVendedIdentifierMatchesMajorKeyInNameTable(string removeLeading0)
        {
            var page    = new Pages.Confirmation(Setup.TestSetup.Driver);
            var account = Setup.TestSetup.UiisContext.TestAccount;
            var prefix  = page.GetVendedPrefix();

            if (!String.IsNullOrEmpty(removeLeading0))
            {
                prefix = prefix.TrimStart('0');
            }
            Console.WriteLine($"Vended Prefix = {prefix}");
            var names = PollUtils.Poll(
                $"Querying account by ID {account.ID}", 60, 5,
                () => Setup.TestSetup.Imis.NamesByCoId(account.ID),
                xs => xs.Where(x => x.MAJOR_KEY == prefix).Count() > 0
                );

            names.Where(o => o.MAJOR_KEY == prefix).ShouldNotBeEmpty();
        }
 public void ThenIfCaseIsNewICheckThatEntityGLNIsNotCreatedInDemog_All_WTable(string case1)
 {
     if (case1 == "New")
     {
         var account = Setup.TestSetup.UiisContext.TestAccount;
         try
         {
             var gln = PollUtils.Poll(
                 $"Querying entity GLN for coid={account.ID}", 60, 5,
                 () => Setup.TestSetup.Imis.EntityGlnByCoId(account.ID),
                 o => !String.IsNullOrEmpty(o)
                 );
             Assert.Fail($"entity GLN found: {gln}");
         }
         catch (TimeoutException)
         {
             // success
         }
     }
 }
 public void ThenIfCaseICheckThatDisplayedGLNWithDemog_All_WTable(string case1, string caseVal, string negation)
 {
     if (case1 == caseVal)
     {
         var page = new Pages.Confirmation(Setup.TestSetup.Driver);
         var displayedEntityGln = page.GetVendedEntityGLN();
         var account            = Setup.TestSetup.UiisContext.TestAccount;
         var entityGln          = PollUtils.Poll(
             $"Querying entity GLN for coid={account.ID}", 60, 5,
             () => Setup.TestSetup.Imis.EntityGlnByCoId(account.ID),
             o => !String.IsNullOrEmpty(o)
             );
         if (String.IsNullOrEmpty(negation))
         {
             entityGln.ShouldBe(displayedEntityGln);
         }
         else
         {
             entityGln.ShouldNotBe(displayedEntityGln);
         }
     }
 }
        public void ThenIfProratedIShouldSeePC_AN_CAP_AEntries(int n)
        {
            var imis    = Context <IMIS>(IMIS);
            var pc      = Ctx.PrimaryContact;
            var coId    = imis.NamesByCompanyAndUser(pc.CompanyName, pc.FirstName, pc.LastName).First().CO_ID;
            var account = new Account(imis, coId);

            var subs = PollUtils.Poll <IEnumerable <Subscription> >(
                $"Getting a new subscription for CO_ID={coId}", DB_TIMEOUT, DB_INTERVAL,
                () => imis.SubscriptionsForCompany(coId).Where(o => o.DATE_ADDED > ImisStartTime),
                x => x.Count() > 0
                );

            var paidThruMonth = subs.First().BILL_THRU.Month;
            var currentMonth  = DateTime.Now.Month;
            var prorated      = currentMonth == paidThruMonth;

            if (prorated)
            {
                var table = new Table("ProductCode", "Count");
                table.AddRow("PC_AN_CAP_A2", $"{n}");
                ThenSubscriptionEntriesAreCreatedAsFollows(table);
            }
        }
        public void ThenInIDMDatabaseCompanyUserAndClaimsAreCreatedCorrectly()
        {
            var pc   = Ctx.PrimaryContact;
            var coId = Context <IMIS>(IMIS)
                       .NamesByCompanyAndUser(pc.CompanyName, pc.FirstName, pc.LastName)
                       .First()
                       .CO_ID;

            var idm = Context <IDM>(IDM);

            var claims = PollUtils.Poll <IEnumerable <Claim> >(
                $"Querying IDM database with CO_ID={coId}", DB_TIMEOUT, DB_INTERVAL,
                () => idm.ClaimsByCoId(coId),
                x => x.Count() == 6
                );

            HashSet <string> expectedClaims = new HashSet <string>
            {
                "User Administrator",
                "CLAIM_DHGTN_ADMIN",
                "CLAIM_DHGLN_ADMIN",
                "CLAIM_DHGTN_C_01",
                "CLAIM_DHGLN_C_01"
            };

            var createdClaims = new HashSet <string>(claims.Select(o => o.ClaimName));

            expectedClaims.All(o => createdClaims.Contains(o)).ShouldBeTrue();
            claims.All(o => o.CompanyName == pc.CompanyName).ShouldBeTrue();
            // The following is not true in general.
            // Suppose someone created 2 company. If the user used the same primary email
            // but different first and/or last name, the IDM records retains the names
            // used for the first company.
            //claims.All(o => o.FirstName == pc.FirstName).ShouldBeTrue();
            //claims.All(o => o.LastName == pc.LastName).ShouldBeTrue();
        }