public void ShouldSend()
        {
            NotificationSettingsRequest nsRequest = new NotificationSettingsRequest()
            {
                EmailEnabled        = true,
                EmailAddress        = "*****@*****.**",
                SMSEnabled          = false,
                SMSNumber           = "2505555555",
                SubjectHdid         = "hdid",
                SMSVerificationCode = "123456",
                SMSVerified         = false,
            };
            string bearerToken = "bearer token";

            NotificationSettingsResponse nsResponse = new NotificationSettingsResponse(nsRequest);
            RequestResult <NotificationSettingsResponse> expectedResult = new RequestResult <NotificationSettingsResponse>()
            {
                ResourcePayload = nsResponse,
                ResultStatus    = Common.Constants.ResultType.Success,
            };
            var mockLogger     = new Mock <ILogger <NotificationSettingsService> >();
            var mockJobClient  = new Mock <IBackgroundJobClient>();
            var mockNSDelegate = new Mock <INotificationSettingsDelegate>();

            mockNSDelegate.Setup(s => s.SetNotificationSettings(nsRequest, bearerToken)).Returns(Task.FromResult(expectedResult));
            INotificationSettingsService service = new NotificationSettingsService(
                mockLogger.Object,
                mockJobClient.Object,
                mockNSDelegate.Object);
            RequestResult <NotificationSettingsResponse> actualResult = Task.Run(async() => await
                                                                                 service.SendNotificationSettings(nsRequest, bearerToken)).Result;

            Assert.True(actualResult.IsDeepEqual(expectedResult));
        }
Exemple #2
0
        public async Task UpdateNotificationSettingsTest()
        {
            var service = new Mock <ISettingsService>();
            var request = new UpdateNotificationSettingsRequest
            {
                Settings = new List <NotificationSettingModel>
                {
                    new NotificationSettingModel
                    {
                        Type    = NotificationType.Push,
                        Event   = NotificationEvent.ArticleCreated,
                        Enabled = true
                    }
                }
            };

            var response = new NotificationSettingsResponse
            {
                UserId   = UserId,
                Settings = new List <NotificationSettingModel>
                {
                    new NotificationSettingModel
                    {
                        Type    = NotificationType.Push,
                        Event   = NotificationEvent.ArticleCreated,
                        Enabled = true
                    }
                }
            };

            UpdateNotificationSettingsRequest req = null;

            service.Setup(x => x.UpdateNotificationSettingsAsync(It.Is <UpdateNotificationSettingsRequest>(settingsRequest => settingsRequest == request && settingsRequest.UserId == UserId)))
            .Callback <UpdateNotificationSettingsRequest>(r => req = r)
            .ReturnsAsync(response)
            .Verifiable();

            var controller = new SettingsController(_logger, service.Object).WithUser();
            var result     = await controller.UpdateNotificationSettingsAsync(request);

            service.Verify();
            Assert.NotNull(req);
            Assert.Equal(UserId, req.UserId);

            var res = Assert.IsType <OkObjectResult>(result);

            Assert.Equal(response, res.Value);
            Assert.IsType <NotificationSettingsResponse>(res.Value);
        }
Exemple #3
0
        public async Task GetNotificationSettingsTest()
        {
            var service  = new Mock <ISettingsService>();
            var response = new NotificationSettingsResponse
            {
                UserId = UserId
            };

            service.Setup(x => x.GetNotificationSettingsAsync(It.Is <UserRequest>(request => request.UserId == UserId)))
            .ReturnsAsync(response)
            .Verifiable();

            var controller = new SettingsController(_logger, service.Object).WithUser();
            var result     = await controller.GetNotificationSettingsAsync();

            service.Verify();

            var res = Assert.IsType <OkObjectResult>(result);

            Assert.Equal(response, res.Value);
            Assert.IsType <NotificationSettingsResponse>(res.Value);
        }
        /// <inheritdoc/>
        public async Task <RequestResult <NotificationSettingsResponse> > GetNotificationSettings(string bearerToken)
        {
            RequestResult <NotificationSettingsResponse> retVal = new RequestResult <NotificationSettingsResponse>()
            {
                ResultStatus = Common.Constants.ResultType.Error,
            };
            Stopwatch timer = new Stopwatch();

            timer.Start();
            this.logger.LogTrace($"Getting Notification Settings from PHSA...");
            using HttpClient client = this.httpClientService.CreateDefaultHttpClient();
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", bearerToken);
            client.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue(MediaTypeNames.Application.Json));
            try
            {
                Uri endpoint = new Uri(this.nsConfig.Endpoint);
                HttpResponseMessage response = await client.GetAsync(endpoint).ConfigureAwait(true);

                string payload = await response.Content.ReadAsStringAsync().ConfigureAwait(true);

                switch (response.StatusCode)
                {
                case HttpStatusCode.OK:
                    var options = new JsonSerializerOptions
                    {
                        PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
                        IgnoreNullValues     = true,
                        WriteIndented        = true,
                    };
                    NotificationSettingsResponse notificationSettings = JsonSerializer.Deserialize <NotificationSettingsResponse>(payload, options);
                    if (notificationSettings != null)
                    {
                        retVal.ResultStatus     = Common.Constants.ResultType.Success;
                        retVal.ResourcePayload  = notificationSettings;
                        retVal.TotalResultCount = 1;
                    }
                    else
                    {
                        retVal.ResultError = new RequestResultError()
                        {
                            ResultMessage = "Error with JSON data", ErrorCode = ErrorTranslator.ServiceError(ErrorType.CommunicationExternal, ServiceType.PHSA)
                        };
                    }

                    break;

                case HttpStatusCode.NoContent:     // No Notification Settings exits for this user
                    retVal.ResultStatus     = Common.Constants.ResultType.Success;
                    retVal.ResourcePayload  = new NotificationSettingsResponse();
                    retVal.TotalResultCount = 0;
                    break;

                case HttpStatusCode.Forbidden:
                    // TODO: Parse Problem Details.
                    this.logger.LogError($"Error Details: {payload}");
                    retVal.ResultError = new RequestResultError()
                    {
                        ResultMessage = $"DID Claim is missing or can not resolve PHN, HTTP Error {response.StatusCode}", ErrorCode = ErrorTranslator.ServiceError(ErrorType.CommunicationExternal, ServiceType.PHSA)
                    };
                    break;

                default:
                    retVal.ResultError = new RequestResultError()
                    {
                        ResultMessage = $"Unable to connect to Notfiication Settings Endpoint, HTTP Error {response.StatusCode}", ErrorCode = ErrorTranslator.ServiceError(ErrorType.CommunicationExternal, ServiceType.PHSA)
                    };
                    this.logger.LogError($"Unable to connect to endpoint {endpoint}, HTTP Error {response.StatusCode}\n{payload}");
                    break;
                }
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (Exception e)
#pragma warning restore CA1031 // Do not catch general exception types
            {
                retVal.ResultError = new RequestResultError()
                {
                    ResultMessage = $"Exception getting Notification Settings: {e}", ErrorCode = ErrorTranslator.ServiceError(ErrorType.CommunicationExternal, ServiceType.PHSA)
                };
                this.logger.LogError($"Unexpected exception in GetNotificationSettings {e}");
            }

            timer.Stop();
            this.logger.LogDebug($"Finished getting Notification Settings, Time Elapsed: {timer.Elapsed}");
            return(retVal);
        }
        /// <inheritdoc/>
        public async Task <RequestResult <NotificationSettingsResponse> > SetNotificationSettings(NotificationSettingsRequest notificationSettings, string bearerToken)
        {
            RequestResult <NotificationSettingsResponse> retVal = new RequestResult <NotificationSettingsResponse>()
            {
                ResultStatus = Common.Constants.ResultType.Error,
            };
            Stopwatch timer = new Stopwatch();

            timer.Start();
            this.logger.LogDebug($"Sending Notification Settings to PHSA...");
            this.logger.LogTrace($"Bearer token: {bearerToken}");
            using HttpClient client = this.httpClientService.CreateDefaultHttpClient();
            client.DefaultRequestHeaders.Clear();
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", bearerToken);
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(MediaTypeNames.Application.Json));
            client.DefaultRequestHeaders.Add(SubjectResourceHeader, notificationSettings.SubjectHdid);
            try
            {
                Uri endpoint = new Uri(this.nsConfig.Endpoint);
                var options  = new JsonSerializerOptions
                {
                    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
                    IgnoreNullValues     = true,
                    WriteIndented        = true,
                };
                string json = JsonSerializer.Serialize(notificationSettings, options);
                using HttpContent content = new StringContent(json, Encoding.UTF8, MediaTypeNames.Application.Json);
                this.logger.LogTrace($"Http content: {json}");
                HttpResponseMessage response = await client.PutAsync(endpoint, content).ConfigureAwait(true);

                string payload = await response.Content.ReadAsStringAsync().ConfigureAwait(true);

                switch (response.StatusCode)
                {
                case HttpStatusCode.Created:
                case HttpStatusCode.OK:
                    NotificationSettingsResponse nsResponse = JsonSerializer.Deserialize <NotificationSettingsResponse>(payload, options);
                    retVal.ResultStatus     = Common.Constants.ResultType.Success;
                    retVal.TotalResultCount = 1;
                    retVal.ResourcePayload  = nsResponse;
                    break;

                case HttpStatusCode.BadRequest:
                    this.logger.LogError($"Error Details: {payload}");
                    retVal.ResultError = new RequestResultError()
                    {
                        ResultMessage = $"Bad Request, HTTP Error {response.StatusCode}\nDetails:\n{payload}", ErrorCode = ErrorTranslator.ServiceError(ErrorType.CommunicationExternal, ServiceType.PHSA)
                    };
                    break;

                case HttpStatusCode.Forbidden:
                    this.logger.LogError($"Error Details: {payload}");
                    retVal.ResultError = new RequestResultError()
                    {
                        ResultMessage = $"DID Claim is missing or can not resolve PHN, HTTP Error {response.StatusCode}", ErrorCode = ErrorTranslator.ServiceError(ErrorType.CommunicationExternal, ServiceType.PHSA)
                    };
                    break;

                default:
                    retVal.ResultError = new RequestResultError()
                    {
                        ResultMessage = $"Unable to connect to Notfiication Settings Endpoint, HTTP Error {response.StatusCode}", ErrorCode = ErrorTranslator.ServiceError(ErrorType.CommunicationExternal, ServiceType.PHSA)
                    };
                    this.logger.LogError($"Unable to connect to endpoint {endpoint}, HTTP Error {response.StatusCode}\n{payload}");
                    break;
                }
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (Exception e)
#pragma warning restore CA1031 // Do not catch general exception types
            {
                retVal.ResultError = new RequestResultError()
                {
                    ResultMessage = $"Exception getting Notification Settings: {e}", ErrorCode = ErrorTranslator.ServiceError(ErrorType.CommunicationExternal, ServiceType.PHSA)
                };
                this.logger.LogError($"Unexpected exception in GetNotificationSettings {e}");
            }

            timer.Stop();
            this.logger.LogDebug($"Finished getting Notification Settings, Time Elapsed: {timer.Elapsed}");
            return(retVal);
        }