コード例 #1
0
        public void GetReadableAccessorAsync_GivenUnsupportedObjectProviderName_ShouldThrowException()
        {
            var expectedProviderName = "expected-provider";
            var actualProviderName   = "actual-provider";

            var mockServiceProvider             = new Mock <IServiceProvider>();
            var mockInputObjectAccessorProvider = new Mock <IInputObjectAccessorProvider>();

            var accessorProviderFactory = new NamedServiceFactory <IInputObjectAccessorProvider>(
                new Dictionary <string, Func <IServiceProvider, IInputObjectAccessorProvider> >
            {
                [expectedProviderName] = sp => mockInputObjectAccessorProvider.Object
            });

            var accessorRequest = new InputObjectAccessorRequest
            {
                ExecutionMetadata = new ExecutionRequest {
                    ExecutionId = Guid.NewGuid().ToString()
                },
                ObjectMetadata = new ExtensionInputObject {
                    Name = "InputObjectA"
                },
                ObjectProviderName = actualProviderName
            };

            var testAccessorProvider = new CompositeInputObjectAccessorProvider(
                mockServiceProvider.Object,
                accessorProviderFactory);

            Func <Task> act = async() => await testAccessorProvider.GetReadableAccessorAsync(accessorRequest);

            act.Should().Throw <NotSupportedException>();
        }
コード例 #2
0
        public async Task <JObject> GetWritableAccessorAsync(InputObjectAccessorRequest accessorRequest)
        {
            var accessorProvider = GetAccessorProvider(accessorRequest);
            var accessor         = await accessorProvider.GetWritableAccessorAsync(accessorRequest);

            return(accessor);
        }
コード例 #3
0
        public async Task GetWritableAccessorAsync_GivenValidAccessorRequest_ShouldReturnAccessor()
        {
            var mockUrlProvider = new Mock <IInputObjectUrlProvider>();
            var mockSigner      = new Mock <ISigner <ObjectUrl> >();

            var objectUrlAccessorProvider = new InputObjectUrlAccessorProvider(mockUrlProvider.Object, mockSigner.Object);

            var accessorRequest = new InputObjectAccessorRequest
            {
                ExecutionMetadata = new ExecutionRequest {
                    ExecutionId = Guid.NewGuid().ToString()
                },
                ObjectMetadata = new ExtensionInputObject {
                    Name = "InputObjectA"
                }
            };

            var objectUrl = new ObjectUrl
            {
                Url        = "http://test.com/some-object",
                HttpMethod = HttpMethod.Put.Method
            };

            var objectUrlJson = JObject.FromObject(objectUrl);

            mockUrlProvider.Setup(up => up.GetWritableUrlAsync(It.Is <ObjectUrlRequest>(
                                                                   ur => ur.ExecutionMetadata.ExecutionId == accessorRequest.ExecutionMetadata.ExecutionId &&
                                                                   ur.ObjectName == accessorRequest.ObjectMetadata.Name)))
            .Returns(Task.FromResult(objectUrl));

            var accessor = await objectUrlAccessorProvider.GetWritableAccessorAsync(accessorRequest);

            accessor.Should().NotBeNull();
            accessor.Should().BeEquivalentTo(objectUrlJson);
        }
コード例 #4
0
        public Task <JObject> GetWritableAccessorAsync(InputObjectAccessorRequest accessorRequest)
        {
            if (accessorRequest == null)
            {
                throw new ArgumentNullException(nameof(accessorRequest));
            }

            return(Task.FromResult(JObject.FromObject(accessorRequest)));
        }
コード例 #5
0
 /// <summary>
 /// Converts an input object accessor request core model to an API model
 /// </summary>
 /// <param name="coreModel"></param>
 /// <returns></returns>
 public static InputObjectAccessorRequestApiModel ToApiModel(this InputObjectAccessorRequest coreModel) =>
 new InputObjectAccessorRequestApiModel
 {
     ExecutionMetadata  = coreModel.ExecutionMetadata.ToApiModel(),
     ExpirationPeriod   = coreModel.ExpirationPeriod,
     ObjectMetadata     = coreModel.ObjectMetadata.ToApiModel(),
     ObjectProviderName = coreModel.ObjectProviderName,
     SignatureRsaKeyXml = coreModel.SignatureRsaKeyXml
 };
コード例 #6
0
        public async Task <JObject> GetWritableAccessorAsync(InputObjectAccessorRequest accessorRequest)
        {
            var urlRequest = CreateUrlRequest(accessorRequest);
            var url        = await urlProvider.GetWritableUrlAsync(urlRequest);

            if (!string.IsNullOrEmpty(accessorRequest.SignatureRsaKeyXml))
            {
                url.Signature = await urlSigner.GenerateSignatureAsync(accessorRequest.SignatureRsaKeyXml, url);
            }

            return(JObject.FromObject(url));
        }
コード例 #7
0
        private IInputObjectAccessorProvider GetAccessorProvider(InputObjectAccessorRequest accessorRequest)
        {
            if (accessorRequest == null)
            {
                throw new ArgumentNullException(nameof(accessorRequest));
            }

            if (accessorProviderFactory.CanCreateService(accessorRequest.ObjectProviderName) == false)
            {
                throw new NotSupportedException($"Object provider [{accessorRequest.ObjectProviderName}] not supported.");
            }

            return(accessorProviderFactory.CreateService(accessorRequest.ObjectProviderName, serviceProvider));
        }
コード例 #8
0
        private ObjectUrlRequest CreateUrlRequest(InputObjectAccessorRequest accessorRequest)
        {
            if (accessorRequest == null)
            {
                throw new ArgumentNullException(nameof(accessorRequest));
            }

            return(new ObjectUrlRequest
            {
                ExecutionMetadata = accessorRequest.ExecutionMetadata,
                ObjectName = accessorRequest.ObjectMetadata.Name,
                UrlExpirationPeriod = accessorRequest.ExpirationPeriod
            });
        }
コード例 #9
0
        public async Task GetReadableAccessorAsync_GivenSupportedObjectProviderName_ShouldReturnAccessor()
        {
            var providerName = "provider";

            var mockServiceProvider             = new Mock <IServiceProvider>();
            var mockInputObjectAccessorProvider = new Mock <IInputObjectAccessorProvider>();
            var objectMetadata = new ExtensionInputObject {
                Name = "InputObjectA"
            };

            var accessorProviderFactory = new NamedServiceFactory <IInputObjectAccessorProvider>(
                new Dictionary <string, Func <IServiceProvider, IInputObjectAccessorProvider> >
            {
                [providerName] = sp => mockInputObjectAccessorProvider.Object
            });

            var accessorRequest = new InputObjectAccessorRequest
            {
                ExecutionMetadata = new ExecutionRequest {
                    ExecutionId = Guid.NewGuid().ToString()
                },
                ObjectMetadata     = objectMetadata,
                ObjectProviderName = providerName
            };

            var expectedAccessor = JObject.FromObject(new InputObjectAccessor
            {
                ObjectAccessor = JObject.FromObject(accessorRequest),
                ObjectMetadata = objectMetadata
            });

            mockInputObjectAccessorProvider.Setup(ap => ap.GetReadableAccessorAsync(accessorRequest))
            .Returns(Task.FromResult(expectedAccessor));

            var testAccessorProvider = new CompositeInputObjectAccessorProvider(
                mockServiceProvider.Object,
                accessorProviderFactory);

            var actualAccessor = await testAccessorProvider.GetReadableAccessorAsync(accessorRequest);

            actualAccessor.Should().NotBeNull();
            actualAccessor.Should().BeEquivalentTo(expectedAccessor);
        }
コード例 #10
0
        public async Task <JObject> GetWritableAccessorAsync(InputObjectAccessorRequest accessorRequest)
        {
            if (accessorRequest == null)
            {
                throw new ArgumentNullException(nameof(accessorRequest));
            }

            var apiModel    = accessorRequest.ToApiModel();
            var apiUrl      = $"{proxyConfig.BaseUrl.TrimEnd('/')}/writable";
            var apiResponse = await jsonHttpClient.PostAsync <JObject>(apiUrl, apiModel);

            switch (apiResponse.StatusCode)
            {
            case HttpStatusCode.OK:
                return(apiResponse.Content);

            default:
                throw new HttpRequestException($"[Request {accessorRequest.ExecutionMetadata.ExecutionId}]: " +
                                               $"[Input Object {accessorRequest.ObjectMetadata.Name}]: " +
                                               $"Object provider API [{apiUrl}] responded with an unexpected status code: [{apiResponse.StatusCode}].");
            }
        }
コード例 #11
0
        /// <summary>
        /// Creates an execution-scoped collection of input object accessors to be provided to the target extension.
        /// For more information on execution objects, see /doc/architecture/execution-objects.md.
        /// </summary>
        /// <param name="execRequest">The execution request</param>
        /// <returns></returns>
        protected virtual async Task <Dictionary <string, InputObjectAccessor> > CreateInputObjectAccessorDictionaryAsync(ExecutionRequest execRequest)
        {
            var accessorDictionary = new Dictionary <string, InputObjectAccessor>();

            foreach (var providedInputObjectName in execRequest.ProvidedInputObjects)
            {
                var inputObject = execRequest.InputObjects[providedInputObjectName];

                var accessorRequest = new InputObjectAccessorRequest
                {
                    ExecutionMetadata  = execRequest,
                    ExpirationPeriod   = execRequest.ExecutionTimeoutDuration,
                    ObjectMetadata     = inputObject,
                    ObjectProviderName = execRequest.ObjectProviderName,
                    SignatureRsaKeyXml = execRequest.SignatureRsaKeyXml
                };

                var accessor = await inputObjectAccessorProvider.GetReadableAccessorAsync(accessorRequest);

                accessorDictionary[providedInputObjectName] = new InputObjectAccessor(inputObject, accessor);
            }

            return(accessorDictionary);
        }