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)); }
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); }
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); }