public WopiDiscoveryDocumentRepository(IHttpClientFactory httpClientFactory, IOptionsSnapshot <WopiConfiguration> wopiConfiguration, ILogger <WopiDiscoveryDocumentRepository> logger) { _logger = logger; _httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory)); _wopiConfiguration = wopiConfiguration?.Value ?? throw new ArgumentNullException(nameof(wopiConfiguration)); }
public async Task CreateDocumentAsync_ReturnsPrimedDocumentWhenDiscoveryEndpointReturnsValidResponse() { var cancellationToken = new CancellationToken(); var logger = new Moq.Mock <ILogger <WopiDiscoveryDocumentFactory> >().Object; var services = new ServiceCollection(); services.AddMemoryCache(); var serviceProvider = services.BuildServiceProvider(); var memoryCache = serviceProvider.GetRequiredService <IMemoryCache>(); var sourceEndpoint = new Uri(WopiDiscoveryDocumentTests.WOPI_ROOT + WopiDiscoveryDocumentTests.WOPI_DISCOVERY_DOCUMENT_URL, UriKind.Absolute); var wopiConfiguration = new WopiConfiguration() { ClientDiscoveryDocumentUrl = sourceEndpoint.AbsoluteUri }; var wopiConfigurationOptionsSnapshot = new Moq.Mock <IOptionsSnapshot <WopiConfiguration> >(); wopiConfigurationOptionsSnapshot.SetupGet(x => x.Value).Returns(wopiConfiguration); var httpClientFactory = new Moq.Mock <IHttpClientFactory>(); var httpResponseMessage = new HttpResponseMessage(System.Net.HttpStatusCode.OK) { Content = new StringContent(WopiDiscoveryDocumentTests.WOPI_DISCOVERY_DOCUMENT_XML, Encoding.UTF8, "application/xml") }; var httpMessageHandler = new HttpMessageHandlerStub((request, _) => httpResponseMessage); var httpClient = new HttpClient(httpMessageHandler, true); httpClientFactory.Setup(x => x.CreateClient("wopi-discovery-document")).Returns(httpClient); var newWopiDiscoveryDocument = new Moq.Mock <IWopiDiscoveryDocument>().Object; var wopiDiscoveryDocumentRepository = new Moq.Mock <IWopiDiscoveryDocumentRepository>(); wopiDiscoveryDocumentRepository.Setup(x => x.GetAsync(Moq.It.IsAny <CancellationToken>())).Returns(Task.FromResult(newWopiDiscoveryDocument)); IWopiDiscoveryDocumentFactory wopiDiscoveryDocumentFactory = new WopiDiscoveryDocumentFactory(memoryCache, wopiDiscoveryDocumentRepository.Object, logger); var wopiDiscoveryDocument = await wopiDiscoveryDocumentFactory.CreateDocumentAsync(cancellationToken); Assert.IsFalse(wopiDiscoveryDocument.IsEmpty, "Expected a none empty document to be returned when the discovery endpoint is known and returns a valid response"); }
public WopiDiscoveryDocumentRepository(IHttpClientFactory httpClientFactory, IOptionsSnapshot <WopiConfiguration> wopiConfiguration, ILogger <WopiDiscoveryDocumentRepository> logger) { _logger = logger; _httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory)); _wopiConfiguration = wopiConfiguration?.Value ?? throw new ArgumentNullException(nameof(wopiConfiguration)); var clientDiscoveryDocumentUrl = _wopiConfiguration.ClientDiscoveryDocumentUrl; if (clientDiscoveryDocumentUrl is null) { throw new ApplicationException($"The {nameof(WopiConfiguration.ClientDiscoveryDocumentUrl)} is null"); } if (!clientDiscoveryDocumentUrl.IsAbsoluteUri) { throw new ApplicationException($"The {nameof(WopiConfiguration.ClientDiscoveryDocumentUrl)} is not an absolute URI = {clientDiscoveryDocumentUrl}"); } }
public async Task HandleAsync_(string title, string description, string groupName, string version, string owner, string fileName, string extension, ulong sizeInBytes, string contentHash) { var cancellationToken = CancellationToken.None; var file = FutureNHS.WOPIHost.File.With(fileName, version); var services = new ServiceCollection(); var endpointForFileExtension = new Uri("https://domain.com/path?param=value", UriKind.Absolute); var wopiDiscoveryDocument = new Moq.Mock <IWopiDiscoveryDocument>(); wopiDiscoveryDocument.Setup(o => o.GetEndpointForFileExtension(extension, "view", Moq.It.IsAny <Uri>())).Returns(endpointForFileExtension); wopiDiscoveryDocument.Setup(o => o.IsEmpty).Returns(false); wopiDiscoveryDocument.Setup(o => o.IsTainted).Returns(false); var wopiDiscoveryDocumentFactory = new Moq.Mock <IWopiDiscoveryDocumentFactory>(); wopiDiscoveryDocumentFactory.Setup(o => o.CreateDocumentAsync(cancellationToken)).Returns(Task.FromResult(wopiDiscoveryDocument.Object)); var fileId = Guid.NewGuid(); var fileMetadata = new UserFileMetadata() { FileId = fileId, Title = title, Description = description, GroupName = groupName, FileVersion = version, OwnerUserName = owner, Name = fileName, Extension = extension, BlobName = fileName, SizeInBytes = sizeInBytes, LastWriteTimeUtc = DateTimeOffset.UtcNow, ContentHash = Convert.FromBase64String("aGFzaA == "), UserHasViewPermission = true, UserHasEditPermission = false }; var authenticatedUser = new AuthenticatedUser(Guid.NewGuid(), default) { FileMetadata = fileMetadata }; var wopiConfiguration = new WopiConfiguration { HostFilesUrl = new Uri("https://hostfiles.net/path", UriKind.Absolute) }; var wopiConfigurationSnapshot = new Moq.Mock <IOptionsSnapshot <WopiConfiguration> >(); wopiConfigurationSnapshot.Setup(o => o.Value).Returns(wopiConfiguration); var userAuthenticationService = new Moq.Mock <IUserAuthenticationService>(); var permission = FileAccessPermission.View; var userFileAccessToken = new UserFileAccessToken(Guid.NewGuid(), authenticatedUser, permission, DateTimeOffset.UtcNow.AddDays(1)); userAuthenticationService.Setup(x => x.GenerateAccessToken(authenticatedUser, file, permission, cancellationToken)).Returns(Task.FromResult(userFileAccessToken)); services.AddScoped(sp => wopiDiscoveryDocumentFactory.Object); services.AddScoped(sp => wopiConfigurationSnapshot.Object); services.AddScoped(sp => new Moq.Mock <IAzureTableStoreClient>().Object); services.AddScoped(sp => userAuthenticationService.Object); services.AddScoped(sp => new Moq.Mock <IUserFileAccessTokenRepository>().Object); var httpContext = new DefaultHttpContext { RequestServices = services.BuildServiceProvider() }; using var responseBodyStream = new MemoryStream(); httpContext.Response.Body = responseBodyStream; var postAuthoriseUserRequestHandler = AuthoriseUserRequestHandler.With(authenticatedUser, permission, file); await postAuthoriseUserRequestHandler.HandleAsync(httpContext, cancellationToken); Assert.AreEqual((int)HttpStatusCode.OK, httpContext.Response.StatusCode); Assert.AreEqual("application/json; charset=utf-8", httpContext.Response.ContentType); Assert.AreSame(responseBodyStream, httpContext.Response.Body); responseBodyStream.Position = 0; dynamic responseBody = await JsonSerializer.DeserializeAsync <ExpandoObject>(responseBodyStream, cancellationToken : cancellationToken); Assert.IsNotNull(responseBody); var accessToken = ((JsonElement)(responseBody.accessToken)).GetString(); Assert.IsNotNull(accessToken); var wopiClientUrlForFile = ((JsonElement)(responseBody.wopiClientUrlForFile)).GetString(); Assert.IsTrue(Uri.IsWellFormedUriString(wopiClientUrlForFile, UriKind.Absolute)); Assert.AreEqual(endpointForFileExtension, new Uri(wopiClientUrlForFile, UriKind.Absolute)); } }