public async Task ShouldCallUpdateAsyncWithStoreModelDataAndRequestRevision_WhenStoreModelIsValidWithRequestRevision() { // Arrange var id = "/test"; var json = "{ \"myValue\": \"test\" }"; var payload = JsonDocument.Parse(json).RootElement; var storeModel = new StoreModel(id, payload); var revisionContext = new RevisionContext { RequestRevision = Guid.NewGuid() }; var databaseIntegratorMock = GetDataIntegratorMock(1); var storeRepository = new StoreRepository(databaseIntegratorMock.Object, revisionContext); // Act await storeRepository.UpdateAsync(storeModel, default); // Aseert _storeEntity.Id.Should().Be(id); _storeEntity.Payload.ToString().Replace(" ", "").Should().BeEquivalentTo(payload.ToString().Replace(" ", "")); databaseIntegratorMock.Verify(integrator => integrator.ReplaceAsync(id, revisionContext.RequestRevision, It.IsAny <StoreEntity>(), default), Times.Once); }
public void ShouldThrowRecordNotModifiedException_WhenStoreModelIsValidWithRequestRevisionAndNoMatchIsPresent() { // Arrange var id = "/test"; var json = "{ \"myValue\": \"test\" }"; var payload = JsonDocument.Parse(json).RootElement; var storeModel = new StoreModel(id, payload); var revisionContext = new RevisionContext { RequestRevision = Guid.NewGuid() }; var databaseIntegratorMock = GetDataIntegratorMock(0); var storeRepository = new StoreRepository(databaseIntegratorMock.Object, revisionContext); // Act Func <Task> result = () => storeRepository.UpdateAsync(storeModel, default); // Aseert result.Should().Throw <RecordNotModifiedException>(); databaseIntegratorMock.Verify(integrator => integrator.ReplaceAsync(id, revisionContext.RequestRevision, It.IsAny <StoreEntity>(), default), Times.Once); }
public async Task ShouldNotSetResponseRevisionInRevisionContext_WhenStoreModelIsValidWithRequestRevisionAndNoMatchIsPresent() { // Arrange var id = "/test"; var json = "{ \"myValue\": \"test\" }"; var payload = JsonDocument.Parse(json).RootElement; var storeModel = new StoreModel(id, payload); var revisionContext = new RevisionContext { RequestRevision = Guid.NewGuid() }; var databaseIntegratorMock = GetDataIntegratorMock(0); var storeRepository = new StoreRepository(databaseIntegratorMock.Object, revisionContext); // Act try { await storeRepository.UpdateAsync(storeModel, default); } catch { } // Aseert revisionContext.ResponseRevision.Should().BeNull(); }
public async Task ShouldSetResponseRevisionInRevisionContext_WhenGivenAnIdAndExistingStoreModel() { // Arrange var id = "/test"; var json = "{ \"myValue\": \"test\" }"; var payload = BsonDocument.Parse(json); var storeEntity = new StoreEntity { Id = id, Revision = Guid.NewGuid(), Payload = payload }; var revisionContext = new RevisionContext(); var databaseIntegratorMock = GetDataIntegratorMock(storeEntity); var storeRepository = new StoreRepository(databaseIntegratorMock.Object, revisionContext); // Act var result = await storeRepository.ReadAsync(id, default); // Aseert revisionContext.ResponseRevision.Should().Be(storeEntity.Revision); }
public void ShouldThrowArgumentNullException_WhenStoreModelIsNull() { // Arrange var revisionContext = new RevisionContext(); var databaseIntegratorMock = new Mock <IDatabaseIntegrator <StoreEntity> >(); var storeRepository = new StoreRepository(databaseIntegratorMock.Object, revisionContext); // Act Func <Task> result = () => storeRepository.UpdateAsync(null, default); // Aseert result.Should().Throw <ArgumentNullException>().And.ParamName.Should().Be("storeModel"); }
public async Task ShouldCallDeleteAsync_WhenGivenAnIdAndExistingStoreModelWithNoRequestRevision() { // Arrange var id = "/test"; var revisionContext = new RevisionContext(); var databaseIntegratorMock = GetDataIntegratorMock(1); var storeRepository = new StoreRepository(databaseIntegratorMock.Object, revisionContext); // Act await storeRepository.DeleteAsync(id, default); // Aseert databaseIntegratorMock.Verify(integrator => integrator.DeleteAsync(id, default), Times.Once); }
public async Task ShouldNotSetETagHeader_WhenRevisionContextResponseRevisionIsNull() { // Arrange var revisionContext = new RevisionContext(); var appOptions = new ApplicationOptions(); var revisionActionFilter = new RevisionActionFilter(revisionContext, appOptions); var context = GetActionExcutingContext(); // Act await revisionActionFilter.OnActionExecutionAsync(context, Next); // Assert context.HttpContext.Response.Headers.ContainsKey("ETag").Should().BeFalse(); }
public void ShouldThrowRecordNotFoundException_WhenGivenAnIdAndNoExistingStoreModel() { // Arrange var id = "/test"; var revisionContext = new RevisionContext(); var databaseIntegratorMock = GetDataIntegratorMock(null); var storeRepository = new StoreRepository(databaseIntegratorMock.Object, revisionContext); // Act Func <Task <StoreModel> > result = () => storeRepository.ReadAsync(id, default); // Aseert result.Should().Throw <RecordNotFoundException>(); }
public void ShouldThrowRecordNotModifiedException_WhenGivenAnIdAndNoMatchIsPresent() { // Arrange var id = "/test"; var revisionContext = new RevisionContext(); var databaseIntegratorMock = GetDataIntegratorMock(0); var storeRepository = new StoreRepository(databaseIntegratorMock.Object, revisionContext); // Act Func <Task> result = () => storeRepository.DeleteAsync(id, default); // Aseert result.Should().Throw <RecordNotModifiedException>(); databaseIntegratorMock.Verify(integrator => integrator.DeleteAsync(id, default), Times.Once); }
public async Task ShouldSetRevisionContextRequestRevision_WhenIfMatchHeaderIsSet() { // Arrange var ifMatchValue = Guid.NewGuid(); var revisionContext = new RevisionContext(); var appOptions = new ApplicationOptions(); var revisionActionFilter = new RevisionActionFilter(revisionContext, appOptions); var context = GetActionExcutingContext(); context.HttpContext.Request.Headers.Add("If-Match", ifMatchValue.ToString()); // Act await revisionActionFilter.OnActionExecutionAsync(context, Next); // Assert revisionContext.RequestRevision.Should().Be(ifMatchValue); }
public async Task ShouldSetETagHeader_WhenRevisionContextResponseRevisionIsSet() { // Arrange var revisionContext = new RevisionContext { ResponseRevision = Guid.NewGuid() }; var appOptions = new ApplicationOptions(); var revisionActionFilter = new RevisionActionFilter(revisionContext, appOptions); var context = GetActionExcutingContext(); // Act await revisionActionFilter.OnActionExecutionAsync(context, Next); // Assert context.HttpContext.Response.Headers.ContainsKey("ETag").Should().BeTrue(); context.HttpContext.Response.Headers["ETag"].ToString().Should().Be(revisionContext.ResponseRevision.ToString()); }
public void ShouldThrowRecordAlreadyExistsException_WhenStoreModelIsValidAndIdIsAlreadyInUse() { // Arrange var id = "/test"; var json = "{ \"myValue\": \"test\" }"; var payload = JsonDocument.Parse(json).RootElement; var storeModel = new StoreModel(id, payload); var revisionContext = new RevisionContext(); var databaseIntegratorMock = GetDataIntegratorMock(0); var storeRepository = new StoreRepository(databaseIntegratorMock.Object, revisionContext); // Act Func <Task> result = () => storeRepository.CreateAsync(storeModel, default); // Aseert result.Should().Throw <RecordAlreadyExistsException>(); }
public async Task ShouldSetResponseRevisionInRevisionContext_WhenStoreModelIsValid() { // Arrange var id = "/test"; var json = "{ \"myValue\": \"test\" }"; var payload = JsonDocument.Parse(json).RootElement; var storeModel = new StoreModel(id, payload); var revisionContext = new RevisionContext(); var databaseIntegratorMock = GetDataIntegratorMock(1); var storeRepository = new StoreRepository(databaseIntegratorMock.Object, revisionContext); // Act await storeRepository.CreateAsync(storeModel, default); // Aseert revisionContext.ResponseRevision.Should().Be(_storeEntity.Revision); }
public async Task ShouldNotSetResponseRevisionInRevisionContext_WhenGivenAnIdAndNoExistingStoreModel() { // Arrange var id = "/test"; var revisionContext = new RevisionContext(); var databaseIntegratorMock = GetDataIntegratorMock(null); var storeRepository = new StoreRepository(databaseIntegratorMock.Object, revisionContext); // Act try { var result = await storeRepository.ReadAsync(id, default); } catch { } // Assert revisionContext.ResponseRevision.Should().BeNull(); }
public void ShouldNotThrowRequiredPreconditionInvalidException_WhenIfMatchIsNullRequireRevisionMatchingIsSetAndHttpMethodIsExcluded(string httpMethod) { // Arrange var revisionContext = new RevisionContext(); var appOptions = new ApplicationOptions { RequireRevisionMatching = true }; var revisionActionFilter = new RevisionActionFilter(revisionContext, appOptions); var context = GetActionExcutingContext(); context.HttpContext.Request.Method = httpMethod; // Act Func <Task> result = () => revisionActionFilter.OnActionExecutionAsync(context, Next); // Assert result.Should().NotThrow <RequiredPreconditionInvalidException>(); }
public async Task ShouldNotSetRevisionContextRequestRevision_WhenIfMatchIsInvalid(string ifMatchValue) { // Arrange var revisionContext = new RevisionContext(); var appOptions = new ApplicationOptions(); var revisionActionFilter = new RevisionActionFilter(revisionContext, appOptions); var context = GetActionExcutingContext(); if (ifMatchValue != null) { context.HttpContext.Request.Headers.Add("If-Match", ifMatchValue.ToString()); } // Act await revisionActionFilter.OnActionExecutionAsync(context, Next); // Assert revisionContext.RequestRevision.Should().BeNull(); }
public async Task ShouldCallInsertAsyncWithStoreModelData_WhenStoreModelIsValid() { // Arrange var id = "/test"; var json = "{ \"myValue\": \"test\" }"; var payload = JsonDocument.Parse(json).RootElement; var storeModel = new StoreModel(id, payload); var revisionContext = new RevisionContext(); var databaseIntegratorMock = GetDataIntegratorMock(1); var storeRepository = new StoreRepository(databaseIntegratorMock.Object, revisionContext); // Act await storeRepository.CreateAsync(storeModel, default); // Aseert _storeEntity.Id.Should().Be(id); _storeEntity.Payload.ToString().Replace(" ", "").Should().BeEquivalentTo(payload.ToString().Replace(" ", "")); }