public async Task CanWriteReadAndDeleteContainer() { var sut = CreateAzureBlobRdDataStorage(out var metadataStorage); var dataType = nameof(DataBlob); var id = "BlobStorageTestBlob"; var dataBlob = new DataBlob(id, new byte[] { 0x42, 0x43, 0x44 }, "myFile.bin"); var payload = DataEncoder.Encode(JsonConvert.SerializeObject(dataBlob)); var submitter = "jdoe"; var utcNow = DateTime.UtcNow; var container = new GenericDataContainer(id, submitter, utcNow, submitter, utcNow, ApiVersion.Current, payload); if (await sut.ExistsAsync(dataType, id)) { await sut.DeleteDataContainerAsync(dataType, id); } IdReservationResult idReservation = null; Assert.That(async() => idReservation = await sut.ReserveIdAsync(dataType, id, submitter), Throws.Nothing); Assert.That(idReservation.IsReserved, Is.True); Assert.That(() => sut.StoreAsync(dataType, container, true), Throws.Nothing); metadataStorage.Setup(x => x.GetFromIdAsync(dataType, id)).Returns(Task.FromResult(container)); Assert.That(await sut.ExistsAsync(dataType, id), Is.True); GenericDataContainer retreivedContainer = null; Assert.That(async() => retreivedContainer = await sut.GetFromIdAsync(dataType, id), Throws.Nothing); Assert.That(retreivedContainer, Is.Not.Null); Assert.That(async() => await sut.DeleteDataContainerAsync(dataType, id), Throws.Nothing); metadataStorage.Setup(x => x.GetFromIdAsync(dataType, id)).Returns(Task.FromResult(default(GenericDataContainer))); Assert.That(await sut.ExistsAsync(dataType, id), Is.False); }
public async Task <IdReservationResult> ReserveIdAsync(string dataType, string id, string submitter) { if (await ExistsAsync(dataType, id)) { return(IdReservationResult.Failed()); } try { var isNewCollection = await IsNewCollection(dataType); var utcNow = DateTime.UtcNow; await metadataStorage.StoreAsync( dataType, new GenericDataContainer(id, submitter, utcNow, submitter, utcNow, ApiVersion.Current, new BsonDocument()), false); var container = binaryDataStorage.GetContainer(dataType); await container.CreateIfNotExistsAsync(); var blob = binaryDataStorage.GetBlob(dataType, id); await blob.WriteAsync(new MemoryStream(Encoding.ASCII.GetBytes("Reserved"))); return(IdReservationResult.Success(id, isNewCollection)); } catch (DocumentAlreadyExistsException) { return(IdReservationResult.Failed()); } }
public async Task <IdReservationResult> ReserveIdAsync(string dataType, string id, string submitter) { var isNewCollection = await IsNewCollectionAsync(dataType); if (isNewCollection) { await CreateTable(dataType); } else if (await ExistsAsync(dataType, id)) { return(IdReservationResult.Failed()); } var utcNow = DateTime.UtcNow; var query = $"INSERT INTO {dataType} (Id,OriginalSubmitter,CreatedTimeUtc,Submitter,SubmissionTimeUtc) " + $"VALUES ('{id}','{submitter}','{utcNow:yyyy-MM-dd HH:mm:ss}','{submitter}','{utcNow:yyyy-MM-dd HH:mm:ss}')"; try { await sqlQueryExecutor.ExecuteQueryAsync(query); return(IdReservationResult.Success(id, isNewCollection)); } catch { return(IdReservationResult.Failed()); } }
public async Task RdDataStorageIdIsUsed() { var rdDataStorageId = "RdDataStorageId"; var idReservationResult = IdReservationResult.Success(rdDataStorageId, false); var rdDataStorage = new Mock <IRdDataStorage>(); rdDataStorage.Setup(x => x.GetIdsAsync(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>())).Returns(Task.FromResult(new List <IdReservationResult> { idReservationResult })); var obj = new ClassWithoutId("Bob"); var submitBody = new SubmitDataBody(nameof(ClassWithoutId), obj, false); // ! No ID provided ! submitBody = JsonConvert.DeserializeObject <SubmitDataBody>(JsonConvert.SerializeObject(submitBody)); var sut = new DefaultIdPolicy(); var actual = await sut.DetermineIdAsync(submitBody, Submitter, rdDataStorage.Object); Assert.That(actual.Id, Is.EqualTo(rdDataStorageId)); rdDataStorage.Verify(x => x.GetIdsAsync(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>()), Times.Once); }
public async Task <IdReservationResult> ReserveIdAsync(string dataType, string id, string submitter) { var isNewCollection = await IsNewCollectionAsync(dataType); var collection = rdDataClient.DataDatabase.GetCollection <GenericDataContainer>(dataType); try { var utcNow = DateTime.UtcNow; await collection.InsertOneAsync(new GenericDataContainer(id, submitter, utcNow, submitter, utcNow, ApiVersion.Current, new BsonDocument())); return(IdReservationResult.Success(id, isNewCollection)); } catch (MongoWriteException writeException) { if (writeException.WriteError.Category == ServerErrorCategory.DuplicateKey) { return(IdReservationResult.Failed()); } throw; } }
public async Task <List <IdReservationResult> > GetIdsAsync(string dataType, string submitter, int count) { var tableSetup = tableSetups[dataType]; var reservationContainer = tableSetup.BuildReservationContainer(submitter); var reservationResults = new List <IdReservationResult>(); for (int i = 0; i < count; i++) { IdReservationResult reservationResult; try { var storeResult = await StoreAsync(dataType, reservationContainer, false); reservationResult = IdReservationResult.Success(storeResult.Id, storeResult.IsNewCollection); } catch (DocumentAlreadyExistsException) { reservationResult = IdReservationResult.Failed(); } reservationResults.Add(reservationResult); } return(reservationResults); }