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);
            }
Exemple #7
0
            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);
            }
Exemple #10
0
            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);
            }
Exemple #11
0
            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());
            }
Exemple #12
0
            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>();
            }
Exemple #13
0
            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);
            }
Exemple #14
0
            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();
            }
Exemple #15
0
            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>();
            }
Exemple #16
0
            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();
            }
Exemple #17
0
            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(" ", ""));
            }