public async Task GetDatasetSchemaSasUrl_GivenNullOrEmptyDefinitionName_ReturnsBadRequest() { //Arrange DatasetSchemaSasUrlRequestModel model = new DatasetSchemaSasUrlRequestModel(); string json = JsonConvert.SerializeObject(model); byte[] byteArray = Encoding.UTF8.GetBytes(json); MemoryStream stream = new MemoryStream(byteArray); HttpRequest request = Substitute.For <HttpRequest>(); request .Body .Returns(stream); ILogger logger = CreateLogger(); DefinitionsService definitionsService = CreateDefinitionsService(logger); //Act IActionResult result = await definitionsService.GetDatasetSchemaSasUrl(request); //Assert result .Should() .BeOfType <BadRequestObjectResult>() .Which .Value .Should() .Be("No dataset schema name was provided"); logger .Received(1) .Warning(Arg.Is("No dataset schema name was provided")); }
public async Task <IActionResult> GetDatasetSchemaSasUrl(HttpRequest request) { string json = await request.GetRawBodyStringAsync(); DatasetSchemaSasUrlRequestModel requestModel = JsonConvert.DeserializeObject <DatasetSchemaSasUrlRequestModel>(json); if (requestModel == null) { _logger.Warning("No dataset schema request model was provided"); return(new BadRequestObjectResult("No dataset schema request model was provided")); } if (requestModel.DatasetDefinitionId.IsNullOrEmpty()) { _logger.Warning("No dataset schema name was provided"); return(new BadRequestObjectResult("No dataset schema name was provided")); } DatasetDefinition datasetDefinition = await _datasetsRepositoryPolicy.ExecuteAsync(() => _datasetsRepository.GetDatasetDefinition(requestModel.DatasetDefinitionId)); if (datasetDefinition == null) { return(new NotFoundObjectResult("Data schema definiton not found")); } string definitionName = datasetDefinition.Name.Replace("/", "_").Replace("\\", "_"); string fileName = $"schemas/{definitionName}.xlsx"; string blobUrl = _blobClient.GetBlobSasUrl(fileName, DateTimeOffset.UtcNow.AddDays(1), SharedAccessBlobPermissions.Read); return(new OkObjectResult(new DatasetSchemaSasUrlResponseModel { SchemaUrl = blobUrl })); }
public async Task GetDatasetSchemaSasUrl_GivenModelAndDatasetNameContainsSlashes_ReplacesSlashesWithUnderscoreAndReturnsUrl() { // Arrange DatasetSchemaSasUrlRequestModel model = new DatasetSchemaSasUrlRequestModel { DatasetDefinitionId = "12345" }; string json = JsonConvert.SerializeObject(model); byte[] byteArray = Encoding.UTF8.GetBytes(json); MemoryStream stream = new MemoryStream(byteArray); HttpRequest request = Substitute.For <HttpRequest>(); request .Body .Returns(stream); IBlobClient blobClient = CreateBlobClient(); DatasetDefinition datasetDefinition = new DatasetDefinition() { Id = "12345", Name = "TEST/SLASH Definition", }; IDatasetRepository datasetRepository = CreateDataSetsRepository(); datasetRepository .GetDatasetDefinition(Arg.Is(model.DatasetDefinitionId)) .Returns(datasetDefinition); DefinitionsService definitionsService = CreateDefinitionsService( datasetsRepository: datasetRepository, blobClient: blobClient); // Act IActionResult result = await definitionsService.GetDatasetSchemaSasUrl(request); // Assert result .Should() .BeOfType <OkObjectResult>(); blobClient .Received(1) .GetBlobSasUrl(Arg.Is("schemas/TEST_SLASH Definition.xlsx"), Arg.Any <DateTimeOffset>(), Arg.Any <SharedAccessBlobPermissions>()); }
public async Task <IActionResult> Download([FromRoute] string schemaId) { Guard.IsNullOrWhiteSpace(schemaId, nameof(schemaId)); DatasetSchemaSasUrlRequestModel downloadDatasetSchemaRequest = new DatasetSchemaSasUrlRequestModel { DatasetDefinitionId = schemaId }; ApiResponse <DatasetSchemaSasUrlResponseModel> apiResponse = await _datasetApiClient.GetDatasetSchemaSasUrl(downloadDatasetSchemaRequest); if (apiResponse.StatusCode == HttpStatusCode.OK && !string.IsNullOrWhiteSpace(apiResponse.Content?.SchemaUrl)) { return(Redirect(apiResponse.Content.SchemaUrl)); } return(new NotFoundResult()); }
public async Task <ApiResponse <DatasetSchemaSasUrlResponseModel> > GetDatasetSchemaSasUrl(DatasetSchemaSasUrlRequestModel datasetSchemaSasUrlRequestModel) { Guard.ArgumentNotNull(datasetSchemaSasUrlRequestModel, nameof(datasetSchemaSasUrlRequestModel)); return(await PostAsync <DatasetSchemaSasUrlResponseModel, DatasetSchemaSasUrlRequestModel>( DataSetsUriFor("get-schema-download-url"), datasetSchemaSasUrlRequestModel)); }
public async Task GetDatasetSchemaSasUrl_GivenModelAndDatasetNameDoesNotContainSlashes_GetSasUrl() { //Arrange const string sasUrl = "https://wherever.naf?jhjhjhjhjhhjhjhjhjjhj"; DatasetSchemaSasUrlRequestModel model = new DatasetSchemaSasUrlRequestModel { DatasetDefinitionId = "12345" }; string json = JsonConvert.SerializeObject(model); byte[] byteArray = Encoding.UTF8.GetBytes(json); MemoryStream stream = new MemoryStream(byteArray); HttpRequest request = Substitute.For <HttpRequest>(); request .Body .Returns(stream); IBlobClient blobClient = CreateBlobClient(); blobClient .GetBlobSasUrl(Arg.Any <string>(), Arg.Any <DateTimeOffset>(), Arg.Any <SharedAccessBlobPermissions>()) .Returns(sasUrl); DatasetDefinition datasetDefinition = new DatasetDefinition() { Id = "12345", Name = "14 15", }; IDatasetRepository datasetRepository = CreateDataSetsRepository(); datasetRepository .GetDatasetDefinition(Arg.Is(model.DatasetDefinitionId)) .Returns(datasetDefinition); DefinitionsService definitionsService = CreateDefinitionsService( datasetsRepository: datasetRepository, blobClient: blobClient); //Act IActionResult result = await definitionsService.GetDatasetSchemaSasUrl(request); //Assert result .Should() .BeOfType <OkObjectResult>(); OkObjectResult okObjectResult = result as OkObjectResult; DatasetSchemaSasUrlResponseModel responseModel = okObjectResult.Value as DatasetSchemaSasUrlResponseModel; responseModel .SchemaUrl .Should() .Be(sasUrl); blobClient .Received(1) .GetBlobSasUrl(Arg.Is("schemas/14 15.xlsx"), Arg.Any <DateTimeOffset>(), Arg.Any <SharedAccessBlobPermissions>()); }
public Task <IActionResult> GetDatasetSchemaSasUrl([FromBody] DatasetSchemaSasUrlRequestModel datasetSchemaSasUrlRequestModel) { return(_definitionService.GetDatasetSchemaSasUrl(datasetSchemaSasUrlRequestModel)); }