You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
EntityFrameworkCore.Jet/test/EFCore.Jet.Design.Functiona.../ReverseEngineering/JetE2ETests.cs

290 lines
13 KiB
C#

using System.Collections.Generic;
using System.Data.Jet;
using System.IO;
using System.Linq;
using EntityFramework.Jet.FunctionalTests;
using EntityFrameworkCore.Jet.Design.Internal;
using Microsoft.EntityFrameworkCore.ReverseEngineering;
using Microsoft.EntityFrameworkCore.Scaffolding.Internal;
using Microsoft.EntityFrameworkCore.TestUtilities;
using Microsoft.EntityFrameworkCore.TestUtilities.Xunit;
using Microsoft.Extensions.DependencyInjection;
using Xunit;
using Xunit.Abstractions;
namespace EntityFrameworkCore.Jet.Design.FunctionalTests.ReverseEngineering
{
public class JetE2ETests : E2ETestBase, IClassFixture<JetE2EFixture>
{
protected override string ProviderName => "EntityFrameworkCore.SqlServerCompact40.Design";
protected override void ConfigureDesignTimeServices(IServiceCollection services)
=> new JetDesignTimeServices().ConfigureDesignTimeServices(services);
public virtual string TestNamespace => "E2ETest.Namespace";
public virtual string TestProjectDir => Path.Combine("E2ETest", "Output");
public virtual string TestSubDir => "SubDir";
public virtual string CustomizedTemplateDir => Path.Combine("E2ETest", "CustomizedTemplate", "Dir");
//public static Microsoft.EntityFrameworkCore.Scaffolding.TableSelectionSet Filter
// => new Microsoft.EntityFrameworkCore.Scaffolding.TableSelectionSet(new List<string>{
// "AllDataTypes",
// "PropertyConfiguration",
// "Test Spaces Keywords Table",
// "MultipleFKsDependent",
// "MultipleFKsPrincipal",
// "OneToManyDependent",
// "OneToManyPrincipal",
// "OneToOneDependent",
// "OneToOnePrincipal",
// "OneToOneSeparateFKDependent",
// "OneToOneSeparateFKPrincipal",
// "OneToOneFKToUniqueKeyDependent",
// "OneToOneFKToUniqueKeyPrincipal",
// "ReferredToByTableWithUnmappablePrimaryKeyColumn",
// "TableWithUnmappablePrimaryKeyColumn",
// "selfReferencing",
// });
public static IEnumerable<string> Tables
=> new List<string>
{
"AllDataTypes",
"PropertyConfiguration",
"Test Spaces Keywords Table",
"MultipleFKsDependent",
"MultipleFKsPrincipal",
"OneToManyDependent",
"OneToManyPrincipal",
"OneToOneDependent",
"OneToOnePrincipal",
"OneToOneSeparateFKDependent",
"OneToOneSeparateFKPrincipal",
"OneToOneFKToUniqueKeyDependent",
"OneToOneFKToUniqueKeyPrincipal",
"ReferredToByTableWithUnmappablePrimaryKeyColumn",
"TableWithUnmappablePrimaryKeyColumn",
"selfreferencing"
};
// ReSharper disable once UnusedParameter.Local
public JetE2ETests(JetE2EFixture fixture, ITestOutputHelper output)
: base(output)
{
}
private string _connectionString = JetConnection.GetConnectionString(@"E2E.accdb");
private static readonly List<string> _expectedEntityTypeFiles = new List<string>
{
"AllDataTypes.expected",
"MultipleFKsDependent.expected",
"MultipleFKsPrincipal.expected",
"OneToManyDependent.expected",
"OneToManyPrincipal.expected",
"OneToOneDependent.expected",
"OneToOneFKToUniqueKeyDependent.expected",
"OneToOneFKToUniqueKeyPrincipal.expected",
"OneToOnePrincipal.expected",
"OneToOneSeparateFKDependent.expected",
"OneToOneSeparateFKPrincipal.expected",
"PropertyConfiguration.expected",
"ReferredToByTableWithUnmappablePrimaryKeyColumn.expected",
"SelfReferencing.expected",
"Test_Spaces_Keywords_Table.expected"
};
[Fact]
[UseCulture("en-US")]
public void E2ETestUseAttributesInsteadOfFluentApi()
{
var filePaths = Generator.Generate(
_connectionString,
Tables,
Enumerable.Empty<string>(),
TestProjectDir + Path.DirectorySeparatorChar, // tests that ending DirectorySeparatorChar does not affect namespace
TestSubDir,
TestNamespace,
contextName: "AttributesContext",
useDataAnnotations: true,
overwriteFiles: false,
useDatabaseNames: false);
var actualFileSet = new FileSet(InMemoryFiles, Path.GetFullPath(Path.Combine(TestProjectDir, TestSubDir)))
{
Files = Enumerable.Repeat(filePaths.ContextFile, 1).Concat(filePaths.EntityTypeFiles).Select(Path.GetFileName).ToList()
};
var expectedFileSet = new FileSet(new FileSystemFileService(),
Path.Combine("ReverseEngineering", "ExpectedResults", "E2E_UseAttributesInsteadOfFluentApi"),
contents => contents.Replace("namespace " + TestNamespace, "namespace " + TestNamespace + "." + TestSubDir)
.Replace("{{connectionString}}", _connectionString))
{
Files = new List<string> { "AttributesContext.expected" }
.Concat(_expectedEntityTypeFiles).ToList()
};
AssertEqualFileContents(expectedFileSet, actualFileSet);
//TODO ErikEJ Investigate compile issue
//AssertCompile(actualFileSet);
}
[Fact]
[UseCulture("en-US")]
public void E2ETestAllFluentApi()
{
var filePaths = Generator.Generate(
_connectionString,
Tables,
Enumerable.Empty<string>(),
TestProjectDir,
outputPath: null, // not used for this test
rootNamespace: TestNamespace,
contextName: null,
useDataAnnotations: false,
overwriteFiles: false,
useDatabaseNames: false);
var actualFileSet = new FileSet(InMemoryFiles, Path.GetFullPath(TestProjectDir))
{
Files = Enumerable.Repeat(filePaths.ContextFile, 1).Concat(filePaths.EntityTypeFiles).Select(Path.GetFileName).ToList()
};
var expectedFileSet = new FileSet(new FileSystemFileService(),
Path.Combine("ReverseEngineering", "ExpectedResults", "E2E_AllFluentApi"),
inputFile => inputFile.Replace("{{connectionString}}", _connectionString))
{
Files = new List<string> { "E2EContext.expected" }
.Concat(_expectedEntityTypeFiles).ToList()
};
AssertEqualFileContents(expectedFileSet, actualFileSet);
//TODO ErikEJ Investigate compile issue
//AssertCompile(actualFileSet);
}
[Fact]
public void Non_null_boolean_columns_with_default_constraint_become_nullable_properties()
{
using (var scratch = JetTestStore.Create("NonNullBooleanWithDefaultConstraint"))
{
scratch.ExecuteNonQuery(@"
CREATE TABLE NonNullBoolWithDefault
(
Id int NOT NULL PRIMARY KEY,
BoolWithDefaultValueSql bit NOT NULL DEFAULT (CONVERT(""bit"", GETDATE())),
BoolWithoutDefaultValueSql bit NOT NULL
)");
var expectedFileSet = new FileSet(new FileSystemFileService(),
Path.Combine("ReverseEngineering", "ExpectedResults"),
contents => contents.Replace("{{connectionString}}", scratch.ConnectionString))
{
Files = new List<string>
{
"NonNullBoolWithDefaultContext.cs",
"NonNullBoolWithDefault.cs",
}
};
var filePaths = Generator.Generate(
scratch.ConnectionString,
Enumerable.Empty<string>(),
Enumerable.Empty<string>(),
TestProjectDir + Path.DirectorySeparatorChar,
outputPath: null, // not used for this test
rootNamespace: TestNamespace,
contextName: "NonNullBoolWithDefaultContext",
useDataAnnotations: false,
overwriteFiles: false,
useDatabaseNames: false);
var actualFileSet = new FileSet(InMemoryFiles, Path.GetFullPath(TestProjectDir))
{
Files = new[] { filePaths.ContextFile }.Concat(filePaths.EntityTypeFiles).Select(Path.GetFileName).ToList()
};
AssertEqualFileContents(expectedFileSet, actualFileSet);
//AssertCompile(actualFileSet);
}
}
[ConditionalFact]
public void Correct_arguments_to_scaffolding_typemapper()
{
using (var scratch = JetTestStore.Create("StringKeys"))
{
scratch.ExecuteNonQuery(@"
CREATE TABLE [StringKeysBlogs] (
[PrimaryKey] nvarchar(256) NOT NULL,
[AlternateKey] nvarchar(256) NOT NULL,
[IndexProperty] nvarchar(256) NULL,
[RowVersion] rowversion NULL,
CONSTRAINT [PK_StringKeysBlogs] PRIMARY KEY ([PrimaryKey]),
CONSTRAINT [AK_StringKeysBlogs_AlternateKey] UNIQUE ([AlternateKey]));");
scratch.ExecuteNonQuery(@"
CREATE INDEX [IX_StringKeysBlogs_IndexProperty] ON [StringKeysBlogs] ([IndexProperty]);");
scratch.ExecuteNonQuery(@"
CREATE TABLE [StringKeysPosts] (
[Id] int NOT NULL IDENTITY,
[BlogAlternateKey] nvarchar(256) NULL,
CONSTRAINT [PK_StringKeysPosts] PRIMARY KEY ([Id]),
CONSTRAINT [FK_StringKeysPosts_StringKeysBlogs_BlogAlternateKey] FOREIGN KEY ([BlogAlternateKey]) REFERENCES [StringKeysBlogs] ([AlternateKey]))");
scratch.ExecuteNonQuery(@"
CREATE INDEX [IX_StringKeysPosts_BlogAlternateKey] ON [StringKeysPosts] ([BlogAlternateKey]);
");
var expectedFileSet = new FileSet(new FileSystemFileService(),
Path.Combine("ReverseEngineering", "ExpectedResults"),
contents => contents.Replace("{{connectionString}}", scratch.ConnectionString))
{
Files = new List<string>
{
"StringKeysContext.cs",
"StringKeysBlogs.cs",
"StringKeysPosts.cs",
}
};
var filePaths = Generator.Generate(
scratch.ConnectionString,
Enumerable.Empty<string>(),
Enumerable.Empty<string>(),
TestProjectDir + Path.DirectorySeparatorChar,
outputPath: null, // not used for this test
rootNamespace: TestNamespace,
contextName: "StringKeysContext",
useDataAnnotations: false,
overwriteFiles: false,
useDatabaseNames: false);
var actualFileSet = new FileSet(InMemoryFiles, Path.GetFullPath(TestProjectDir))
{
Files = new[] { filePaths.ContextFile }.Concat(filePaths.EntityTypeFiles).Select(Path.GetFileName).ToList()
};
AssertEqualFileContents(expectedFileSet, actualFileSet);
//AssertCompile(actualFileSet);
}
}
protected override ICollection<BuildReference> References { get; } = new List<BuildReference>
{
BuildReference.ByName("System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"),
BuildReference.ByName("System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"),
BuildReference.ByName("System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"),
BuildReference.ByName("System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"),
BuildReference.ByName("EntityFrameworkCore.SqlServerCompact40"),
BuildReference.ByName("System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"),
BuildReference.ByName("Microsoft.EntityFrameworkCore"),
BuildReference.ByName("Microsoft.EntityFrameworkCore.Relational"),
BuildReference.ByName("Microsoft.Extensions.Caching.Abstractions"),
BuildReference.ByName("Microsoft.Extensions.Logging.Abstractions")
};
}
}