public async Task ExecuteAsync_GivenRecordExists_ShouldReturnAggregateName(AggregateNameAggregateState state)
        {
            // Arrange
            await this.aggregateNameDatabaseHelper.AddRecordAsync(state);

            // Act
            var result = await this.sut.ExecuteAsync(state.Id);

            // Assert
            result.Should().BeEquivalentTo(
                state,
                x => x
                .Excluding(p => p.CreatedOn)
                .Excluding(p => p.UpdatedOn));
        }
        public async void CreateAsync_GivenRecordDoesNotExist_CreatesRecord(AggregateNameAggregateState state)
        {
            // Arrange
            // Act
            await this.sut.CreateAsync(new AggregateNameAggregate(state));

            this.aggregateNameDatabaseHelper.TrackId(state.Id);

            var result = (await this.sut.GetByIdAsync(state.Id)).State;

            // Assert
            result.Id.Should().Be(state.Id);
            result.Should().BeEquivalentTo(
                state,
                x => x
                .Excluding(p => p.CreatedOn)
                .Excluding(p => p.UpdatedOn));
            result.CreatedOn.Should().BeCloseTo(state.CreatedOn, TimeSpan.FromSeconds(1));
            result.UpdatedOn.Should().BeCloseTo(state.UpdatedOn, TimeSpan.FromSeconds(1));
        }
        public async void GetByIdAsync_GivenRecordExists_ShouldReturnAggregate(AggregateNameAggregateState state)
        {
            // Arrange
            await this.aggregateNameDatabaseHelper.AddRecordAsync(state);

            // Act
            var result = await this.sut.GetByIdAsync(state.Id);

            // Assert
            result.IsNew.Should().BeFalse();
            result.UncommittedEvents.Should().BeEmpty();
            result.Id.Should().Be(state.Id);
            result.State.Should().BeEquivalentTo(
                state,
                x => x
                .Excluding(p => p.CreatedOn)
                .Excluding(p => p.UpdatedOn));
            result.State.CreatedOn.Should().BeCloseTo(state.CreatedOn, TimeSpan.FromSeconds(1));
            result.State.UpdatedOn.Should().BeCloseTo(state.UpdatedOn, TimeSpan.FromSeconds(1));
        }
        public async void UpdateAsync_GivenRecordExists_UpdatesRecord(AggregateNameAggregateState state, AggregateNameAggregateState updatedState)
        {
            //// non updateable properties
            updatedState.CreatedOn = state.CreatedOn;

            // Arrange
            await this.aggregateNameDatabaseHelper.AddRecordAsync(state);

            // Act
            updatedState.Id = state.Id;
            await this.sut.UpdateAsync(new AggregateNameAggregate(updatedState));

            var result = (await this.sut.GetByIdAsync(state.Id)).State;

            // Assert
            result.Id.Should().Be(state.Id);
            result.Should().BeEquivalentTo(
                updatedState,
                x => x
                .Excluding(p => p.CreatedOn)
                .Excluding(p => p.UpdatedOn));
            result.CreatedOn.Should().BeCloseTo(updatedState.CreatedOn, TimeSpan.FromSeconds(1));
            result.UpdatedOn.Should().BeCloseTo(updatedState.UpdatedOn, TimeSpan.FromSeconds(1));
        }