Beispiel #1
0
        public async Task ImportGraph_Success()
        {
            // Arrange
            const string s3Key            = "s3://some.fancy.kid.said/i.like.turtles";
            var          loadId           = Guid.NewGuid().ToString();
            var          formFile         = GenerateTtlFormFile();
            var          graphName        = new Uri("https://www.speedofart.com/glorious/painting/1.0");
            var          expectedResponse = new NeptuneLoaderResponse
            {
                status  = "200 OK",
                payload = new Dictionary <string, string> {
                    { "loadId", loadId }, { "namedGraphName", graphName.AbsoluteUri }
                }
            };

            _mockAwsS3Service.Setup(x => x.UploadFile(It.IsAny <IFormFile>())).ReturnsAsync(s3Key);
            _mockGraphRepository.Setup(x => x.CheckIfNamedGraphExists(It.IsAny <Uri>())).Returns(false);
            _mockNeptuneLoaderConnector.Setup(x => x.LoadGraph(s3Key, graphName)).ReturnsAsync(expectedResponse);

            // Act
            var result = await _service.ImportGraph(formFile, graphName, false);

            // Assert
            Assert.NotNull(result);
            Assert.Equal(expectedResponse.status, result.status);
            Assert.True(result.payload.TryGetValue("loadId", out var resultLoadIdValue));
            Assert.Equal(loadId, resultLoadIdValue);
            Assert.True(result.payload.TryGetValue("namedGraphName", out var resultGraphName));
            Assert.Equal(graphName.AbsoluteUri, resultGraphName);
        }
        /// <summary>
        /// Import a graph with the given name into AWS Neptune. The ttl file has to get uploaded to S3 first in order
        /// to import it.
        /// </summary>
        /// <param name="s3Key">Path to ttl file in s3</param>
        /// <param name="graphName">the graph name to store as an Uri</param>
        /// <exception cref="NeptuneLoaderException">In case of errors</exception>
        public async Task <NeptuneLoaderResponse> LoadGraph(string s3Key, Uri graphName)
        {
            using var client = _clientFactory.CreateClient();
            var loaderRequest = new NeptuneLoaderRequest()
            {
                Source              = s3Key,
                Format              = "turtle",
                IamRoleArn          = _iamRoleArn,
                Region              = _region,
                FailOnError         = "FALSE",
                Parallelism         = "MEDIUM",
                ParserConfiguration = new Dictionary <string, string> {
                    { "namedGraphUri", graphName.AbsoluteUri }
                }
            };
            var json = JsonConvert.SerializeObject(loaderRequest, new JsonSerializerSettings {
                ContractResolver = _contractResolver
            });
            HttpContent content = new StringContent(json, Encoding.UTF8, MediaTypeNames.Application.Json);

            var response = await client.PostAsync(_loaderUrl, content);

            var responseContent = await response.Content.ReadAsStringAsync();

            if (response.IsSuccessStatusCode)
            {
                var neptuneResponse = JsonConvert.DeserializeObject <NeptuneLoaderResponse>(responseContent);
                var loadId          = neptuneResponse.payload["loadId"];
                var loaderResponse  = new NeptuneLoaderResponse()
                {
                    status  = "200 OK",
                    payload = new Dictionary <string, string>
                    {
                        { "loadId", loadId },
                        { "namedGraphName", graphName.AbsoluteUri }
                    }
                };

                return(loaderResponse);
            }

            var neptuneError = JsonConvert.DeserializeObject <NeptuneLoaderErrorResponse>(responseContent);

            throw new NeptuneLoaderException(neptuneError);
        }