public async Task LoginAsync_ShouldReturnString_WhenConnectionFailed()
        {
            // Arrange
            var localSettingsMock     = new Mock <ILocalSettings>();
            var configurationSettings = new ConfigurationSettingsDouble
            {
                ApiBaseUrl = "https://yahoo.com"
            };

            using (var httpTest = new HttpTest())
            {
                var errorMsg = "Call failed with status code 500 (Internal Server Error)";
                httpTest.RespondWith(errorMsg, 500);

                IDopplerAPI dopplerAPI = new DopplerAPI(configurationSettings, localSettingsMock.Object);

                // Act
                var loginResult = await dopplerAPI.LoginAsync("*****@*****.**", "TestPassword", "apiKey");

                // Assert
                Assert.False(loginResult.IsSuccessResult);
                Assert.NotNull(loginResult.ErrorValue);
                Assert.Null(loginResult.SuccessValue);
                Assert.StartsWith(errorMsg, loginResult.ErrorValue);
            }
        }
        public async Task LoginAsync_ShouldReturnDopplerErrorMessage_WhenAuthenticationFailed()
        {
            // Arrange
            var localSettingsMock     = new Mock <ILocalSettings>();
            var configurationSettings = new ConfigurationSettingsDouble
            {
                ApiBaseUrl = "https://yahoo.com/"
            };

            using (var httpTest = new HttpTest())
            {
                var dopplerError = new DopplerErrorDto
                {
                    Title     = "Authentication error",
                    Status    = 401,
                    ErrorCode = 2,
                    Detail    = "Authentication credentials are invalid",
                    Type      = "/docs/errors/401.2-authentication-error"
                };
                httpTest.RespondWithJson(dopplerError, 401);
                IDopplerAPI dopplerAPI = new DopplerAPI(configurationSettings, localSettingsMock.Object);

                // Act
                var loginResult = await dopplerAPI.LoginAsync("*****@*****.**", "TestPassword", "apiKey");

                // Assert
                Assert.False(loginResult.IsSuccessResult);
                Assert.NotNull(loginResult.ErrorValue);
                Assert.Null(loginResult.SuccessValue);
                Assert.Equal(dopplerError.Detail, loginResult.ErrorValue);
            }
        }
        public async Task GetCampaignRecipientsAsync_ShouldReturnPage_WhenConnectionIsSuccessful()
        {
            // Arrange
            var localSettingsMock     = new Mock <ILocalSettings>();
            var configurationSettings = new ConfigurationSettingsDouble
            {
                ApiBaseUrl = "https://yahoo.com"
            };

            using (var httpTest = new HttpTest())
            {
                var getCampaignRecipientsResponse = Mocks.Mocks.GetCampaignRecipientListDto();

                httpTest.RespondWithJson(getCampaignRecipientsResponse);

                IDopplerAPI dopplerAPI = new DopplerAPI(configurationSettings, localSettingsMock.Object);

                // Act
                var getCampaignRecipientsResult = await dopplerAPI.GetCampaignRecipientsAsync("*****@*****.**", 1);

                // Assert
                Assert.True(getCampaignRecipientsResult.IsSuccessResult);
                Assert.Null(getCampaignRecipientsResult.ErrorValue);
                Assert.NotNull(getCampaignRecipientsResult.SuccessValue);
                Assert.Equal(getCampaignRecipientsResponse.Items.Count, getCampaignRecipientsResult.SuccessValue.Items.Count);
                Assert.Equal(getCampaignRecipientsResponse.Items[0].ListId, getCampaignRecipientsResult.SuccessValue.Items[0].ListId);
            }
        }
        public async Task GetHtmlCampaignPreviewAsync_ShouldReturnHtmlString_WhenConnectionIsSuccessful()
        {
            // Arrange
            var localSettingsMock     = new Mock <ILocalSettings>();
            var configurationSettings = new ConfigurationSettingsDouble
            {
                ApiBaseUrl = "https://yahoo.com"
            };

            using (var httpTest = new HttpTest())
            {
                httpTest.RespondWith("HTML HERE");

                IDopplerAPI dopplerAPI = new DopplerAPI(configurationSettings, localSettingsMock.Object);

                // Act
                var getHtmlCampaignPreviewResult = await dopplerAPI.GetCampaignHtmlPreviewAsync("*****@*****.**", 12323);

                // Assert
                Assert.True(getHtmlCampaignPreviewResult.IsSuccessResult);
                Assert.Null(getHtmlCampaignPreviewResult.ErrorValue);
                Assert.NotNull(getHtmlCampaignPreviewResult.SuccessValue);
                Assert.NotEmpty(getHtmlCampaignPreviewResult.SuccessValue);
            }
        }
        public async Task LoginAsync_ShouldReturnTrue_WhenAuthenticationIsSuccessful()
        {
            // Arrange
            var localSettingsMock     = new Mock <ILocalSettings>();
            var configurationSettings = new ConfigurationSettingsDouble {
                ApiBaseUrl = "https://yahoo.com/"
            };

            using (var httpTest = new HttpTest())
            {
                var userAuthenticationResponse = Mocks.Mocks.GetUserAuthenticationResponseDto();

                httpTest.RespondWithJson(userAuthenticationResponse);

                IDopplerAPI dopplerAPI = new DopplerAPI(configurationSettings, localSettingsMock.Object);

                // Act
                var loginResult = await dopplerAPI.LoginAsync("*****@*****.**", "TestPassword", "apiKey");

                // Assert
                Assert.True(loginResult.IsSuccessResult);
                Assert.Null(loginResult.ErrorValue);
                Assert.NotNull(loginResult.SuccessValue);
                Assert.Equal(userAuthenticationResponse.AccessToken, loginResult.SuccessValue.AccessToken);
            }
        }