// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Linq; using EntityFrameworkCore.Jet.FunctionalTests.TestUtilities; using EntityFrameworkCore.Jet.Data; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.EntityFrameworkCore.TestUtilities; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Xunit; // ReSharper disable InconsistentNaming // ReSharper disable ClassNeverInstantiated.Local // ReSharper disable UnusedAutoPropertyAccessor.Local namespace EntityFrameworkCore.Jet.FunctionalTests { public class ConnectionSpecificationTest { [ConditionalFact] public void Can_specify_connection_string_in_OnConfiguring() { var serviceProvider = new ServiceCollection() .AddDbContext() .BuildServiceProvider(); using (JetTestStore.GetNorthwindStore()) { using (var context = serviceProvider.GetRequiredService()) { Assert.True(context.Customers.Any()); } } } [ConditionalFact] public void Can_specify_connection_string_in_OnConfiguring_with_default_service_provider() { using (JetTestStore.GetNorthwindStore()) { using (var context = new StringInOnConfiguringContext()) { Assert.True(context.Customers.Any()); } } } private class StringInOnConfiguringContext : NorthwindContextBase { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder .EnableServiceProviderCaching(false) .UseJet(JetNorthwindTestStoreFactory.NorthwindConnectionString, TestEnvironment.DataAccessProviderFactory, b => b.ApplyConfiguration()); } [ConditionalFact] public void Can_specify_connection_in_OnConfiguring() { var serviceProvider = new ServiceCollection() .AddScoped(p => new JetConnection(JetNorthwindTestStoreFactory.NorthwindConnectionString)) .AddDbContext().BuildServiceProvider(); using (JetTestStore.GetNorthwindStore()) { using (var context = serviceProvider.GetRequiredService()) { Assert.True(context.Customers.Any()); } } } [ConditionalFact] public void Can_specify_connection_in_OnConfiguring_with_default_service_provider() { using (JetTestStore.GetNorthwindStore()) { using (var context = new ConnectionInOnConfiguringContext( new JetConnection(JetNorthwindTestStoreFactory.NorthwindConnectionString))) { Assert.True(context.Customers.Any()); } } } private class ConnectionInOnConfiguringContext : NorthwindContextBase { private readonly JetConnection _connection; public ConnectionInOnConfiguringContext(JetConnection connection) { _connection = connection; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder .EnableServiceProviderCaching(false) .UseJet(_connection, b => b.ApplyConfiguration()); public override void Dispose() { _connection.Dispose(); base.Dispose(); } } // ReSharper disable once UnusedMember.Local private class StringInConfigContext : NorthwindContextBase { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder.UseJet("Database=Crunchie", TestEnvironment.DataAccessProviderFactory, b => b.ApplyConfiguration()); } [ConditionalFact] public void Throws_if_no_connection_found_in_config_without_UseJet() { var serviceProvider = new ServiceCollection() .AddDbContext().BuildServiceProvider(); using (var context = serviceProvider.GetRequiredService()) { Assert.Equal( CoreStrings.NoProviderConfigured, Assert.Throws(() => context.Customers.Any()).Message); } } [ConditionalFact] public void Throws_if_no_config_without_UseJet() { var serviceProvider = new ServiceCollection() .AddDbContext().BuildServiceProvider(); using (var context = serviceProvider.GetRequiredService()) { Assert.Equal( CoreStrings.NoProviderConfigured, Assert.Throws(() => context.Customers.Any()).Message); } } private class NoUseJetContext : NorthwindContextBase { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder.EnableServiceProviderCaching(false); } [ConditionalFact] public void Can_depend_on_DbContextOptions() { var serviceProvider = new ServiceCollection() .AddScoped(p => new JetConnection(JetNorthwindTestStoreFactory.NorthwindConnectionString)) .AddDbContext() .BuildServiceProvider(); using (JetTestStore.GetNorthwindStore()) { using (var context = serviceProvider.GetRequiredService()) { Assert.True(context.Customers.Any()); } } } [ConditionalFact] public void Can_depend_on_DbContextOptions_with_default_service_provider() { using (JetTestStore.GetNorthwindStore()) { using (var context = new OptionsContext( new DbContextOptions(), new JetConnection(JetNorthwindTestStoreFactory.NorthwindConnectionString))) { Assert.True(context.Customers.Any()); } } } private class OptionsContext : NorthwindContextBase { private readonly JetConnection _connection; private readonly DbContextOptions _options; public OptionsContext(DbContextOptions options, JetConnection connection) : base(options) { _options = options; _connection = connection; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { Assert.Same(_options, optionsBuilder.Options); optionsBuilder .EnableServiceProviderCaching(false) .UseJet(_connection, b => b.ApplyConfiguration()); Assert.NotSame(_options, optionsBuilder.Options); } public override void Dispose() { _connection.Dispose(); base.Dispose(); } } [ConditionalFact] public void Can_depend_on_non_generic_options_when_only_one_context() { var serviceProvider = new ServiceCollection() .AddDbContext() .BuildServiceProvider(); using (JetTestStore.GetNorthwindStore()) { using (var context = serviceProvider.GetRequiredService()) { Assert.True(context.Customers.Any()); } } } [ConditionalFact] public void Can_depend_on_non_generic_options_when_only_one_context_with_default_service_provider() { using (JetTestStore.GetNorthwindStore()) { using (var context = new NonGenericOptionsContext(new DbContextOptions())) { Assert.True(context.Customers.Any()); } } } private class NonGenericOptionsContext : NorthwindContextBase { private readonly DbContextOptions _options; public NonGenericOptionsContext(DbContextOptions options) : base(options) { _options = options; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { Assert.Same(_options, optionsBuilder.Options); optionsBuilder .EnableServiceProviderCaching(false) .UseJet(JetNorthwindTestStoreFactory.NorthwindConnectionString, TestEnvironment.DataAccessProviderFactory, b => b.ApplyConfiguration()); Assert.NotSame(_options, optionsBuilder.Options); } } [ConditionalTheory] [InlineData("MyConnectionString", "name=MyConnectionString")] [InlineData("ConnectionStrings:DefaultConnection", "name=ConnectionStrings:DefaultConnection")] [InlineData("ConnectionStrings:DefaultConnection", " NamE = ConnectionStrings:DefaultConnection ")] public void Can_use_AddDbContext_and_get_connection_string_from_config(string key, string connectionString) { var configBuilder = new ConfigurationBuilder() .AddInMemoryCollection( new Dictionary { { key, JetNorthwindTestStoreFactory.NorthwindConnectionString } }); var serviceProvider = new ServiceCollection() .AddSingleton(configBuilder.Build()) .AddDbContext( b => b.UseJet(connectionString, TestEnvironment.DataAccessProviderFactory).EnableServiceProviderCaching(false)) .BuildServiceProvider(); using (JetTestStore.GetNorthwindStore()) { using (var serviceScope = serviceProvider.GetRequiredService().CreateScope()) { using (var context = serviceScope.ServiceProvider.GetRequiredService()) { Assert.True(context.Customers.Any()); } } } } private class UseConfigurationContext : NorthwindContextBase { public UseConfigurationContext(DbContextOptions options) : base(options) { } } private class NorthwindContextBase : DbContext { protected NorthwindContextBase() { } protected NorthwindContextBase(DbContextOptions options) : base(options) { } public DbSet Customers { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity( b => { b.HasKey(c => c.CustomerID); b.ToTable("Customers"); }); } } private class Customer { public string CustomerID { get; set; } // ReSharper disable UnusedMember.Local public string CompanyName { get; set; } public string Fax { get; set; } // ReSharper restore UnusedMember.Local } } }