private async Task ProvisionForSodaAuthAsync() { // Set a temporary service instance for the NewApplicationCreationInfo and GetServiceDefinition calls. var defaultHealthVaultUrl = Configuration.DefaultHealthVaultUrl; var defaultHealthVaultShellUrl = Configuration.DefaultHealthVaultShellUrl; var masterApplicationId = Configuration.MasterApplicationId; ServiceInstance = new HealthServiceInstance( "1", "Default", "Default HealthVault instance", UrlUtilities.GetFullPlatformUrl(defaultHealthVaultUrl), defaultHealthVaultShellUrl); // Note: This apparent circular call is intentional. This method is called from AuthenticateAsync. // PlatformClient is calling HealthVaultConnectionBase.ExecuteAsync("NewApplicationCreationInfo"), // which avoids calling AuthenticateAsync because "NewApplicationCreationInfo" is an anonymous method. IPlatformClient platformClient = CreatePlatformClient(); ApplicationCreationInfo newApplicationCreationInfo = await platformClient.NewApplicationCreationInfoAsync().ConfigureAwait(false); string environmentInstanceId = await _shellAuthService.ProvisionApplicationAsync( defaultHealthVaultShellUrl, masterApplicationId, newApplicationCreationInfo.AppCreationToken, newApplicationCreationInfo.AppInstanceId.ToString()).ConfigureAwait(false); ServiceInfo serviceInfo = await platformClient.GetServiceDefinitionAsync(ServiceInfoSections.Topology).ConfigureAwait(false); HealthServiceInstance bouncedHealthServiceInstance; if (!serviceInfo.ServiceInstances.TryGetValue(environmentInstanceId, out bouncedHealthServiceInstance)) { // TODO: Come up with better error for Current HealthServiceException is restrictive. throw new HealthServiceException(HealthServiceStatusCode.Failed); } // We've successfully made it through the flow. Save all the information. await _localObjectStore.WriteAsync(ServiceInstanceKey, bouncedHealthServiceInstance).ConfigureAwait(false); ServiceInstance = bouncedHealthServiceInstance; await _localObjectStore.WriteAsync(ApplicationCreationInfoKey, newApplicationCreationInfo).ConfigureAwait(false); ApplicationCreationInfo = newApplicationCreationInfo; }
public async Task WhenAuthenticateCalledWithNoStoredInfo_ThenInfoIsFetchedAndStored() { SetupEmptyLocalStore(); _healthVaultConfiguration.MasterApplicationId = s_masterApplicationId; var responseMessage1 = GenerateResponseMessage("NewApplicationCreationInfoResult.xml"); var responseMessage2 = GenerateResponseMessage("GetServiceDefinitionResult.xml"); // #3 is CAST call - but goes through IClientSessionCredentialClient and not HealthWebRequestClient var responseMessage4 = GenerateResponseMessage("GetAuthorizedPeopleResult.xml"); // The first few calls use the default endpoint _subHealthWebRequestClient .SendAsync( new Uri("https://platform2.healthvault.com/platform/wildcat.ashx"), Arg.Any <byte[]>(), Arg.Any <int>(), Arg.Any <IDictionary <string, string> >(), Arg.Any <CancellationToken>()) .Returns(responseMessage1, responseMessage2); // After GetServiceDefinition called, we are calling new endpoint _subHealthWebRequestClient .SendAsync( new Uri("https://platform.healthvault-ppe.com/platform/wildcat.ashx"), Arg.Any <byte[]>(), Arg.Any <int>(), Arg.Any <IDictionary <string, string> >(), Arg.Any <CancellationToken>()) .Returns(responseMessage4); var sessionCredential = new SessionCredential { Token = SessionToken, SharedSecret = SessionSharedSecret }; _subClientSessionCredentialClient .GetSessionCredentialAsync(Arg.Any <CancellationToken>()) .Returns(sessionCredential); _subServiceLocator .GetInstance <IClientSessionCredentialClient>() .Returns(_subClientSessionCredentialClient); // These values match the values in NewApplicationCreationInfoResult.xml _subShellAuthService .ProvisionApplicationAsync( new Uri("https://account.healthvault.com"), s_masterApplicationId, ApplicationCreationToken, ApplicationInstanceId) .Returns("1"); HealthVaultSodaConnection healthVaultSodaConnection = CreateHealthVaultSodaConnection(); await healthVaultSodaConnection.AuthenticateAsync(); _subClientSessionCredentialClient.Received().AppSharedSecret = ApplicationSharedSecret; _subClientSessionCredentialClient.Received().Connection = healthVaultSodaConnection; await _subLocalObjectStore.Received() .WriteAsync( HealthVaultSodaConnection.ServiceInstanceKey, Arg.Is <object>(o => ((HealthServiceInstance)o).HealthServiceUrl == new Uri("https://platform.healthvault-ppe.com/platform/wildcat.ashx"))); await _subLocalObjectStore.Received() .WriteAsync( HealthVaultSodaConnection.ApplicationCreationInfoKey, Arg.Is <object>(o => ((ApplicationCreationInfo)o).AppInstanceId == new Guid("b5c5593b-afb4-466d-88f2-31707fb8634b"))); await _subLocalObjectStore.Received() .WriteAsync( HealthVaultSodaConnection.SessionCredentialKey, Arg.Is <object>(o => ((SessionCredential)o).SharedSecret == SessionSharedSecret)); await _subLocalObjectStore.Received() .WriteAsync( HealthVaultSodaConnection.PersonInfoKey, Arg.Is <object>(o => ((PersonInfo)o).Name == "David Rickard")); }