public async Task Retrieve_GivenTooFewColumns_ShouldRaiseException()
        {
            // Arrange.
            var url          = new Uri("https://somegooglesheet");
            var requestMaker = Substitute.For <IRestRequestMaker>();
            var logger       = Substitute.For <ILogger>();

            requestMaker
            .Get <GoogleSheet>(url)
            .Returns(new GoogleSheet
            {
                values = new[]
                {
                    new[] { "" }
                }
            });

            var testObject = new EmailAddressGoogleSheet(
                url,
                requestMaker,
                logger);

            // Act & Assert.
            try
            {
                await testObject.Retrieve();
            }
            catch (EmailAddressGoogleSheetFormatException)
            {
                Assert.Pass();
            }

            Assert.Fail();
        }
        public async Task Retrieve_GivenSuccessfulRetrieval_ShouldReturnTrue()
        {
            // Arrange.
            var url          = new Uri("https://somegooglesheet");
            var requestMaker = Substitute.For <IRestRequestMaker>();
            var logger       = Substitute.For <ILogger>();

            requestMaker
            .Get <GoogleSheet>(url)
            .Returns(new GoogleSheet
            {
                values = new []
                {
                    new [] { $"{ColumnHeader_FullSchedule}", "", "" }
                }
            });

            var testObject = new EmailAddressGoogleSheet(
                url,
                requestMaker,
                logger);

            // Act.
            bool result = await testObject.Retrieve();

            // Assert.
            Assert.IsTrue(result);
        }
        public async Task Retrieve_GivenSheetCorrectColumnHeaders_ShouldNotRaiseException()
        {
            // Arrange.
            var url          = new Uri("https://somegooglesheet");
            var requestMaker = Substitute.For <IRestRequestMaker>();
            var logger       = Substitute.For <ILogger>();

            requestMaker
            .Get <GoogleSheet>(url)
            .Returns(new GoogleSheet
            {
                values = new []
                {
                    new [] { ColumnHeader_FullSchedule },
                }
            });

            var testObject = new EmailAddressGoogleSheet(
                url,
                requestMaker,
                logger);

            // Act.
            await testObject.Retrieve();

            // Assert.
            Assert.Pass();
        }
        public async Task Retrieve_GivenFullScheduleEmailAddresses_ShouldReturnAddresses()
        {
            // Arrange.
            var url          = new Uri("https://somegooglesheet");
            var requestMaker = Substitute.For <IRestRequestMaker>();
            var logger       = Substitute.For <ILogger>();

            const string address1 = "abc";
            const string address2 = "def";

            requestMaker
            .Get <GoogleSheet>(url)
            .Returns(new GoogleSheet
            {
                values = new[]
                {
                    new [] { $"{ColumnHeader_FullSchedule}" },
                    new [] { $"{address1}" },
                    new [] { $"{address2}" }
                }
            });

            var testObject = new EmailAddressGoogleSheet(
                url,
                requestMaker,
                logger);

            // Act.
            await testObject.Retrieve();

            IEmailAddresses emailAddresses = testObject.EmailAddresses;

            // Assert.
            Assert.AreEqual(2, testObject.FullScheduleEmailAddresses.Count());
            Assert.AreEqual(address1, testObject.FullScheduleEmailAddresses.ElementAt(0));
            Assert.AreEqual(address2, testObject.FullScheduleEmailAddresses.ElementAt(1));

            Assert.IsNotNull(emailAddresses);
            Assert.AreEqual(2, emailAddresses.FullScheduleEmailAddresses.Count());
            Assert.AreEqual(address1, emailAddresses.FullScheduleEmailAddresses.ElementAt(0));
            Assert.AreEqual(address2, emailAddresses.FullScheduleEmailAddresses.ElementAt(1));
        }
        public async Task Retrieve_GivenUnsuccessfulRetrieval_ShouldReturnFalse()
        {
            // Arrange.
            var url          = new Uri("https://somegooglesheet");
            var requestMaker = Substitute.For <IRestRequestMaker>();
            var logger       = Substitute.For <ILogger>();

            requestMaker
            .Get <GoogleSheet>(url)
            .Throws(new RestRequestException(string.Empty, null));

            var testObject = new EmailAddressGoogleSheet(
                url,
                requestMaker,
                logger);

            // Act.
            bool result = await testObject.Retrieve();

            // Assert.
            Assert.IsFalse(result);
        }