using System; using System.Data; using System.Data.Common; using System.Data.Odbc; using System.Data.OleDb; using System.IO; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace EntityFrameworkCore.Jet.Data.Tests { [TestClass] public class CreateDatabaseTest { private const string StoreName = nameof(CreateDatabaseTest) + ".accdb"; [TestInitialize] public void Setup() { Helpers.DeleteDatabase(StoreName); } [TestCleanup] public void TearDown() { Helpers.DeleteDatabase(StoreName); } [TestMethod] public void CreateAndDropDatabaseFromConnection() { using var connection = new JetConnection(StoreName, Helpers.DataAccessProviderFactory); connection.CreateDatabase(); Assert.IsTrue(File.Exists(StoreName)); connection.DropDatabase(); Assert.IsFalse(File.Exists(StoreName)); } [TestMethod] public void CreateAndDropDatabaseWithUnsetConnection() { using var connection = new JetConnection(Helpers.DataAccessProviderFactory); var command = connection.CreateCommand(); command.CommandText = $"CREATE DATABASE '{StoreName}'"; command.ExecuteNonQuery(); Assert.IsTrue(File.Exists(StoreName)); command.CommandText = $"DROP DATABASE '{StoreName}'"; command.ExecuteNonQuery(); Assert.IsFalse(File.Exists(StoreName)); } [TestMethod] public void CreateAndDropDatabaseWithUnsetConnectionWithoutDataAccessProviderFactoryThrows() { using var connection = new JetConnection(); Assert.ThrowsException( () => { using var command = connection.CreateCommand(); }); } [TestMethod] public void CreateAndDropDatabaseWithSingleQuotedConnectionString() { var connectionString = Helpers.DataAccessProviderFactory is OdbcFactory ? $"DBQ='{StoreName}'" : $"Data Source='{StoreName}'"; using var connection = new JetConnection(connectionString, Helpers.DataAccessProviderFactory); connection.CreateDatabase(); Assert.IsTrue(File.Exists(StoreName)); connection.DropDatabase(); Assert.IsFalse(File.Exists(StoreName)); } [TestMethod] public void CreateAndDropDatabaseWithDoubleQuotedConnectionString() { var connectionString = Helpers.DataAccessProviderFactory is OdbcFactory ? $"DBQ=\"{StoreName}\"" : $"Data Source=\"{StoreName}\""; using var connection = new JetConnection(connectionString, Helpers.DataAccessProviderFactory); connection.CreateDatabase(); Assert.IsTrue(File.Exists(StoreName)); connection.DropDatabase(); Assert.IsFalse(File.Exists(StoreName)); } [TestMethod] public void CreateDatabaseWithPassword() { var password = "Joe's password"; var escapedPassword = password.Replace("'", "''"); using var connection = new JetConnection(Helpers.DataAccessProviderFactory); var command = connection.CreateCommand(); command.CommandText = $"CREATE DATABASE '{StoreName}' PASSWORD '{escapedPassword}'"; command.ExecuteNonQuery(); Assert.IsTrue(File.Exists(StoreName)); var csb = Helpers.DataAccessProviderFactory.CreateConnectionStringBuilder(); csb.SetDataSource(StoreName); csb.SetDatabasePassword(password); connection.ConnectionString = csb.ConnectionString; connection.Open(); Assert.IsTrue(connection.State == ConnectionState.Open); } [TestMethod] public void CreateDatabaseWithWrongPassword() { using var connection = new JetConnection(Helpers.DataAccessProviderFactory); var command = connection.CreateCommand(); command.CommandText = $"CREATE DATABASE '{StoreName}' PASSWORD 'wrong password'"; command.ExecuteNonQuery(); Assert.IsTrue(File.Exists(StoreName)); var csb = Helpers.DataAccessProviderFactory.CreateConnectionStringBuilder(); csb.SetDataSource(StoreName); csb.SetDatabasePassword("right password"); connection.ConnectionString = csb.ConnectionString; try { connection.Open(); } catch (Exception e) { Assert.IsInstanceOfType(e, typeof(DbException)); } } } }