public async Task LoanGetLockSnapshot()
        {
            var client = await GetTestClientAsync();

            var loan   = new Loan(client);
            var loanId = await client.Loans.CreateLoanAsync(loan);

            try
            {
                await Task.Delay(1000);

                var rateLockApi = loan.LoanApis.RateLocks;
                var rateLocks   = await rateLockApi.GetRateLocksAsync();

                Assert.IsNotNull(rateLocks);
                Assert.AreEqual(0, rateLocks.Count);
                var rateLockRequest = new RateLockRequest()
                {
                    LockRequest = new LockRequest()
                    {
                        LockDate         = DateTime.Today,
                        LockNumberOfDays = 15
                    }
                };
                await rateLockApi.SubmitRateLockRequestAsync(rateLockRequest, true);

                var requestId = rateLockRequest.Id;
                Assert.IsFalse(string.IsNullOrEmpty(requestId));
                AssertNoExtensionData(rateLockRequest, "RateLockRequest", requestId, true);
                var lockSnapshot = await rateLockApi.GetRateLockSnapshotAsync(requestId);

                Assert.IsNotNull(lockSnapshot);
                Assert.IsTrue(lockSnapshot.ContainsKey("4209"));
                Assert.AreEqual("Not Locked", lockSnapshot["4209"]);
            }
            finally
            {
                try
                {
                    await client.Loans.DeleteLoanAsync(loanId);
                }
                catch
                {
                }
            }
        }
        public async Task LoanSubmitLockRequest()
        {
            var client = await GetTestClientAsync();

            var loan   = new Loan(client);
            var loanId = await client.Loans.CreateLoanAsync(loan);

            try
            {
                await Task.Delay(1000);

                var rateLockApi = loan.LoanApis.RateLocks;
                var rateLocks   = await rateLockApi.GetRateLocksAsync();

                Assert.IsNotNull(rateLocks);
                Assert.AreEqual(0, rateLocks.Count);
                var rateLockRequest = new RateLockRequest()
                {
                    LoanInformation = new LoanInformation()
                    {
                        PenaltyTerm        = 36,
                        HelocActualBalance = 130000m
                    },
                    LockRequest = new LockRequest()
                    {
                        LockDate         = DateTime.Today,
                        LockNumberOfDays = 15,
                        BaseRate         = 3.875m,
                        BasePrice        = 100
                    }
                };
                await rateLockApi.SubmitRateLockRequestAsync(rateLockRequest, true);

                var requestId = rateLockRequest.Id;
                Assert.IsFalse(string.IsNullOrEmpty(requestId));
                AssertNoExtensionData(rateLockRequest, "RateLockRequest", requestId, true);
                Assert.AreEqual(LockStatus.Requested, rateLockRequest.LockStatus);
                await Task.Delay(1000);

                rateLocks = await rateLockApi.GetRateLocksAsync();

                Assert.IsNotNull(rateLocks);
                Assert.AreEqual(1, rateLocks.Count);
                AssertNoExtensionData(rateLocks[0], "RateLocks[0]", requestId, true);
                Assert.AreEqual(rateLockRequest.LockRequest.LockNumberOfDays, rateLocks[0].LockRequest.LockNumberOfDays);
                Assert.AreEqual(rateLockRequest.LockRequest.LockExpirationDate, rateLocks[0].LockRequest.LockExpirationDate);
                Assert.AreEqual(rateLockRequest.RequestedBy.EntityId, rateLocks[0].RequestedBy.EntityId);

                var retrievedRateLock = await rateLockApi.GetRateLockAsync(requestId, LockView.Detailed);

                Assert.IsNotNull(retrievedRateLock);
                AssertNoExtensionData(retrievedRateLock, "RetrievedRateLock", requestId, true);
                Assert.AreEqual(rateLockRequest.LockRequest.LockNumberOfDays, retrievedRateLock.LockRequest.LockNumberOfDays);
                Assert.AreEqual(rateLockRequest.LockRequest.LockExpirationDate, retrievedRateLock.LockRequest.LockExpirationDate);
                Assert.AreEqual(rateLockRequest.RequestedBy.EntityId, retrievedRateLock.RequestedBy.EntityId);

                // Updating a lock request currently does not work. Appears to be a bug in the Encompass API.
                // Always returns the same values as the original request.

                //rateLockRequest.LockRequest.BaseRate = 4;
                //rateLockRequest.LockRequest.BasePrice = 101.85m;
                //await rateLockApi.UpdateRateLockRequestAsync(rateLockRequest, true);
                //await Task.Delay(1000);

                //retrievedRateLock = await rateLockApi.GetRateLockAsync(requestId, LockView.Detailed);
                //Assert.IsNotNull(retrievedRateLock);
                //Assert.AreEqual(4, rateLockRequest.LockRequest.BaseRate);
                //Assert.AreEqual(101.85m, rateLockRequest.LockRequest.BasePrice);
                //Assert.AreEqual(4, retrievedRateLock.LockRequest.BaseRate);
                //Assert.AreEqual(101.85m, retrievedRateLock.LockRequest.BasePrice);

                //var cancelledRateLock = await rateLockApi.CancelRateLockRequestAsync(requestId, true);
                //Assert.IsNotNull(cancelledRateLock);
                //Assert.AreEqual(LockStatus.Cancelled, cancelledRateLock.LockStatus);
                //await Task.Delay(1000);
                //retrievedRateLock = await rateLockApi.GetRateLockAsync(requestId, LockView.Detailed);
                //Assert.IsNotNull(retrievedRateLock);
                //Assert.AreEqual(LockStatus.Cancelled, retrievedRateLock.LockStatus);

                await rateLockApi.ConfirmRateLockRequestAsync(retrievedRateLock, true);

                Assert.IsNotNull(retrievedRateLock);
                AssertNoExtensionData(retrievedRateLock, "RetrievedRateLock", requestId, true);
                Assert.AreEqual(LockStatus.Locked, retrievedRateLock.LockStatus);
                await Task.Delay(1000);

                retrievedRateLock = await rateLockApi.GetRateLockAsync(requestId, LockView.Detailed);

                Assert.IsNotNull(retrievedRateLock);
                Assert.AreEqual(LockStatus.Locked, retrievedRateLock.LockStatus);

                var deniedRateLock = await rateLockApi.DenyRateLockRequestAsync(requestId);

                Assert.IsNotNull(deniedRateLock);
                AssertNoExtensionData(deniedRateLock, "RetrievedRateLock", requestId, true);
                Assert.AreEqual(LockStatus.Denied, deniedRateLock.LockStatus);
                await Task.Delay(1000);

                retrievedRateLock = await rateLockApi.GetRateLockAsync(requestId, LockView.Detailed);

                Assert.IsNotNull(retrievedRateLock);
                Assert.AreEqual(LockStatus.Denied, retrievedRateLock.LockStatus);
            }
            finally
            {
                try
                {
                    await client.Loans.DeleteLoanAsync(loanId);
                }
                catch
                {
                }
            }
        }