diff --git a/src/EntityFrameworkCore.AutoFixture.Tests/Common/Persistence/TestConfigurationOptions.cs b/src/EntityFrameworkCore.AutoFixture.Tests/Common/Persistence/TestConfigurationOptions.cs new file mode 100644 index 0000000..0ada353 --- /dev/null +++ b/src/EntityFrameworkCore.AutoFixture.Tests/Common/Persistence/TestConfigurationOptions.cs @@ -0,0 +1,7 @@ +namespace EntityFrameworkCore.AutoFixture.Tests.Common.Persistence +{ + public class TestConfigurationOptions + { + public string SomeValue { get; set; } + } +} diff --git a/src/EntityFrameworkCore.AutoFixture.Tests/Common/Persistence/TestCustomDbContext.cs b/src/EntityFrameworkCore.AutoFixture.Tests/Common/Persistence/TestCustomDbContext.cs new file mode 100644 index 0000000..5696797 --- /dev/null +++ b/src/EntityFrameworkCore.AutoFixture.Tests/Common/Persistence/TestCustomDbContext.cs @@ -0,0 +1,34 @@ +using EntityFrameworkCore.AutoFixture.Tests.Common.Persistence.Configuration; +using EntityFrameworkCore.AutoFixture.Tests.Common.Persistence.Entities; +using Microsoft.EntityFrameworkCore; + +namespace EntityFrameworkCore.AutoFixture.Tests.Common.Persistence +{ + public class TestCustomDbContext : DbContext + { + public TestCustomDbContext() + { + } + + public TestCustomDbContext( + DbContextOptions options, + ConfigurationOptions configurationOptions) + : base(options) + { + this.ConfigurationOptions = configurationOptions; + } + + public ConfigurationOptions ConfigurationOptions { get; } + + public DbSet Customers { get; set; } + public DbSet Items { get; set; } + public DbSet Orders { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.ApplyConfiguration(new CustomerConfiguration()); + modelBuilder.ApplyConfiguration(new ItemConfiguration()); + modelBuilder.ApplyConfiguration(new OrderConfiguration()); + } + } +} diff --git a/src/EntityFrameworkCore.AutoFixture.Tests/Common/Persistence/TestDbContext.cs b/src/EntityFrameworkCore.AutoFixture.Tests/Common/Persistence/TestDbContext.cs index c17d47a..3c5aea0 100644 --- a/src/EntityFrameworkCore.AutoFixture.Tests/Common/Persistence/TestDbContext.cs +++ b/src/EntityFrameworkCore.AutoFixture.Tests/Common/Persistence/TestDbContext.cs @@ -21,10 +21,14 @@ public TestDbContext(DbContextOptions options) protected override void OnModelCreating(ModelBuilder modelBuilder) { - base.OnModelCreating(modelBuilder); modelBuilder.ApplyConfiguration(new CustomerConfiguration()); modelBuilder.ApplyConfiguration(new ItemConfiguration()); modelBuilder.ApplyConfiguration(new OrderConfiguration()); } } + + public class ConfigurationOptions + { + public string SomeValue { get; set; } + } } diff --git a/src/EntityFrameworkCore.AutoFixture.Tests/Core/DbContextCustomizationTests.cs b/src/EntityFrameworkCore.AutoFixture.Tests/Core/DbContextCustomizationTests.cs index c3e78a7..12d97a1 100644 --- a/src/EntityFrameworkCore.AutoFixture.Tests/Core/DbContextCustomizationTests.cs +++ b/src/EntityFrameworkCore.AutoFixture.Tests/Core/DbContextCustomizationTests.cs @@ -9,18 +9,6 @@ namespace EntityFrameworkCore.AutoFixture.Tests.Core { public class DbContextCustomizationTests { - [Theory] - [AutoData] - public void Customize_ShouldAddContextBuilderToFixture( - Fixture fixture, - DbContextCustomization customization) - { - fixture.Customize(customization); - - fixture.Customizations.Should() - .ContainSingle(x => x.GetType() == typeof(DbContextSpecimenBuilder)); - } - [Theory] [AutoData] public void Customize_ShouldAddOptionsBuilderToFixture( diff --git a/src/EntityFrameworkCore.AutoFixture.Tests/Core/DbContextSpecimenBuilderTests.cs b/src/EntityFrameworkCore.AutoFixture.Tests/Core/DbContextSpecimenBuilderTests.cs deleted file mode 100644 index 864f455..0000000 --- a/src/EntityFrameworkCore.AutoFixture.Tests/Core/DbContextSpecimenBuilderTests.cs +++ /dev/null @@ -1,136 +0,0 @@ -using System; -using AutoFixture; -using AutoFixture.Idioms; -using AutoFixture.Kernel; -using AutoFixture.Xunit2; -using EntityFrameworkCore.AutoFixture.Core; -using EntityFrameworkCore.AutoFixture.Tests.Common.Attributes; -using EntityFrameworkCore.AutoFixture.Tests.Common.Persistence; -using FluentAssertions; -using Microsoft.EntityFrameworkCore; -using Moq; -using Xunit; - -namespace EntityFrameworkCore.AutoFixture.Tests.Core -{ - public class DbContextSpecimenBuilderTests - { - [Theory] - [AutoDomainData] - public void Create_ShouldThrowArgumentException_WhenSpecimenContextNull( - DbContextSpecimenBuilder builder) - { - Action act = () => builder.Create(typeof(TestDbContext), null); - - act.Should().ThrowExactly(); - } - - [Theory] - [AutoDomainData] - public void Create_ShouldReturnNoSpecimen_WhenRequestTypeNotDbContext( - DbContextSpecimenBuilder builder, - Mock contextMock) - { - var actual = builder.Create(typeof(string), contextMock.Object); - - actual.Should().BeOfType(); - } - - [Theory] - [AutoDomainData] - public void Create_ShouldReturnNoSpecimen_WhenRequestIsPropertyInfo( - DbContextSpecimenBuilder builder, - Mock contextMock) - { - var property = typeof(string).GetProperty(nameof(string.Length)); - var actual = builder.Create(property, contextMock.Object); - - actual.Should().BeOfType(); - } - - [Theory] - [AutoDomainData] - public void Create_ShouldReturnNoSpecimen_WhenRequestNotType( - [Frozen] Mock requestSpecificationMock, - Mock contextMock, - [Greedy] DbContextSpecimenBuilder builder) - { - requestSpecificationMock - .Setup(x => x.IsSatisfiedBy(It.IsAny())) - .Returns(true); - - var property = typeof(string).GetProperty(nameof(string.Length)); - var actual = builder.Create(property, contextMock.Object); - - actual.Should().BeOfType(); - } - - [Theory] - [AutoDomainData] - public void Create_ShouldReturnNoSpecimen_WhenContextCanNotResolveOptions( - DbContextSpecimenBuilder builder, - Mock contextMock) - { - contextMock.Setup(x => x.Resolve(typeof(DbContextOptions))) - .Returns(new NoSpecimen()); - - var actual = builder.Create(typeof(TestDbContext), contextMock.Object); - - actual.Should().BeOfType(); - } - - [Theory] - [AutoDomainData] - public void Create_ShouldReturnOmitSpecimen_WhenContextSkipsOptionsResolution( - DbContextSpecimenBuilder builder, - Mock contextMock) - { - contextMock.Setup(x => x.Resolve(typeof(DbContextOptions))) - .Returns(new OmitSpecimen()); - - var actual = builder.Create(typeof(TestDbContext), contextMock.Object); - - actual.Should().BeOfType(); - } - - [Theory] - [AutoDomainData] - public void Create_ShouldReturnNull_WhenContextResolvesOptionsAsNull( - DbContextSpecimenBuilder builder, - Mock contextMock) - { - contextMock.Setup(x => x.Resolve(typeof(DbContextOptions))) - .Returns(null); - - var actual = builder.Create(typeof(TestDbContext), contextMock.Object); - - actual.Should().BeNull(); - } - - [Theory] - [AutoDomainData] - public void Create_ShouldBeOfRequestedType_WhenContextResolvesOptions( - DbContextSpecimenBuilder builder, - Mock contextMock) - { - contextMock.Setup(x => x.Resolve(typeof(DbContextOptions))) - .Returns(new DbContextOptionsBuilder() - .UseInMemoryDatabase(Guid.NewGuid().ToString()) - .Options); - - var actual = builder.Create(typeof(TestDbContext), contextMock.Object); - - actual.Should().BeOfType(); - } - - [Theory] - [AutoDomainData] - public void Ctors_ShouldReceiveInitializedParameters(Fixture fixture) - { - var assertion = new GuardClauseAssertion(fixture); - var members = typeof(DbContextSpecimenBuilder).GetConstructors(); - - assertion.Verify(members); - } - } -} diff --git a/src/EntityFrameworkCore.AutoFixture.Tests/InMemory/InMemoryCustomizationTests.cs b/src/EntityFrameworkCore.AutoFixture.Tests/InMemory/InMemoryCustomizationTests.cs index 7a44470..b24b504 100644 --- a/src/EntityFrameworkCore.AutoFixture.Tests/InMemory/InMemoryCustomizationTests.cs +++ b/src/EntityFrameworkCore.AutoFixture.Tests/InMemory/InMemoryCustomizationTests.cs @@ -1,6 +1,7 @@ using System; using System.Threading.Tasks; using AutoFixture; +using AutoFixture.Kernel; using AutoFixture.Xunit2; using EntityFrameworkCore.AutoFixture.InMemory; using EntityFrameworkCore.AutoFixture.Tests.Common.Attributes; @@ -15,9 +16,17 @@ public class InMemoryCustomizationTests { [Theory] [AutoData] - public void SaveChanges_ShouldCreateCustomerRecord(Fixture fixture, InMemoryContextCustomization customization) + public void SaveChanges_ShouldCreateCustomerRecord( + InMemoryContextCustomization customization, + Fixture fixture) { - fixture.Customize(customization); + fixture.Customize( + new CompositeCustomization( + customization, + new ConstructorCustomization( + typeof(TestDbContext), + new GreedyConstructorQuery()))); + using var context = fixture.Create(); context.Database.EnsureCreated(); @@ -29,7 +38,7 @@ public void SaveChanges_ShouldCreateCustomerRecord(Fixture fixture, InMemoryCont [Theory] [AutoDomainDataWithInMemoryContext] - public async Task SaveChangesAsync_ShouldCreateCustomerRecord(TestDbContext context) + public async Task SaveChangesAsync_ShouldCreateCustomerRecord([Greedy] TestDbContext context) { using (context) { @@ -44,11 +53,13 @@ public async Task SaveChangesAsync_ShouldCreateCustomerRecord(TestDbContext cont [Theory] [AutoData] - public void Customize_ShouldAddOptionsBuilderToFixture(Fixture fixture, InMemoryContextCustomization customization) + public void Customize_ShouldAddOptionsBuilderToFixture(InMemoryContextCustomization customization, + Fixture fixture) { fixture.Customize(customization); - fixture.Customizations.Should().ContainSingle(x => x.GetType() == typeof(InMemoryOptionsSpecimenBuilder)); + fixture.Customizations.Should() + .ContainSingle(x => x.GetType() == typeof(InMemoryOptionsSpecimenBuilder)); } [Theory] @@ -59,5 +70,21 @@ public void Customize_ForNullFixture_ShouldThrow(InMemoryContextCustomization cu act.Should().ThrowExactly(); } + + [Theory] + [AutoDomainDataWithInMemoryContext] + public void Customize_ForCustomDbContext_ShouldReturnContextInstance([Greedy] TestCustomDbContext context) + { + context.Should().NotBeNull() + .And.BeOfType(); + } + + [Theory] + [AutoDomainDataWithInMemoryContext] + public void Customize_ForCustomDbContext_ProvideValueForOtherParameters( + [Greedy] TestCustomDbContext context) + { + context.ConfigurationOptions.Should().NotBeNull(); + } } } diff --git a/src/EntityFrameworkCore.AutoFixture.Tests/Sqlite/SqliteCustomizationTests.cs b/src/EntityFrameworkCore.AutoFixture.Tests/Sqlite/SqliteCustomizationTests.cs index 026feca..6888045 100644 --- a/src/EntityFrameworkCore.AutoFixture.Tests/Sqlite/SqliteCustomizationTests.cs +++ b/src/EntityFrameworkCore.AutoFixture.Tests/Sqlite/SqliteCustomizationTests.cs @@ -15,7 +15,10 @@ public class SqliteCustomizationTests { [Theory] [AutoDomainDataWithSqliteContext] - public void Customize_ShouldProvideSqliteContext([Frozen] SqliteConnection connection, TestDbContext context, Item item, Customer customer) + public void Customize_ShouldProvideSqliteContext( + [Frozen] SqliteConnection connection, + [Greedy] TestDbContext context, + Item item, Customer customer) { using (connection) using (context) @@ -60,5 +63,21 @@ public void Customize_ForNullFixture_ShouldThrow(SqliteContextCustomization cust act.Should().ThrowExactly(); } + + [Theory] + [AutoDomainDataWithSqliteContext] + public void Customize_ForCustomDbContext_ShouldReturnContextInstance([Greedy] TestCustomDbContext context) + { + context.Should().NotBeNull() + .And.BeOfType(); + } + + [Theory] + [AutoDomainDataWithSqliteContext] + public void Customize_ForCustomDbContext_ProvideValueForOtherParameters( + [Greedy] TestCustomDbContext context) + { + context.ConfigurationOptions.Should().NotBeNull(); + } } } diff --git a/src/EntityFrameworkCore.AutoFixture/Core/DbContextCustomization.cs b/src/EntityFrameworkCore.AutoFixture/Core/DbContextCustomization.cs index 53c6721..b5d074e 100644 --- a/src/EntityFrameworkCore.AutoFixture/Core/DbContextCustomization.cs +++ b/src/EntityFrameworkCore.AutoFixture/Core/DbContextCustomization.cs @@ -12,7 +12,6 @@ public virtual void Customize(IFixture fixture) throw new ArgumentNullException(nameof(fixture)); } - fixture.Customizations.Add(new DbContextSpecimenBuilder()); fixture.Customizations.Add(new DbContextOptionsSpecimenBuilder()); } } diff --git a/src/EntityFrameworkCore.AutoFixture/Core/DbContextSpecimenBuilder.cs b/src/EntityFrameworkCore.AutoFixture/Core/DbContextSpecimenBuilder.cs deleted file mode 100644 index 88cfff4..0000000 --- a/src/EntityFrameworkCore.AutoFixture/Core/DbContextSpecimenBuilder.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using AutoFixture.Kernel; -using Microsoft.EntityFrameworkCore; - -namespace EntityFrameworkCore.AutoFixture.Core -{ - public class DbContextSpecimenBuilder : ISpecimenBuilder - { - public DbContextSpecimenBuilder() - : this(new IsDbContextSpecification()) - { - } - - public DbContextSpecimenBuilder(IRequestSpecification contextSpecification) - { - this.ContextSpecification = contextSpecification - ?? throw new ArgumentNullException(nameof(contextSpecification)); - } - - public IRequestSpecification ContextSpecification { get; } - - public object Create(object request, ISpecimenContext context) - { - if (context == null) - { - throw new ArgumentNullException(nameof(context)); - } - - if (!this.ContextSpecification.IsSatisfiedBy(request)) - { - return new NoSpecimen(); - } - - if (!(request is Type type)) - { - return new NoSpecimen(); - } - - var options = context.Resolve(typeof(DbContextOptions<>).MakeGenericType(type)); - - if (options is NoSpecimen || options is OmitSpecimen || options is null) - { - return options; - } - - return Activator.CreateInstance(type, options); - } - - private class IsDbContextSpecification : IRequestSpecification - { - public bool IsSatisfiedBy(object request) - { - return request is Type type - && !type.IsAbstract - && typeof(DbContext).IsAssignableFrom(type); - } - } - } -}