예제 #1
0
        private void AddAndApplyMigrationImpl(
            string project,
            string contextName,
            string migrationName)
        {
            var targetProject = Path.Combine(_fixture.TestProjectRoot, project, "project.json");
            var migrationDir  = Path.Combine(Path.GetDirectoryName(targetProject), "Migrations");
            var snapshotFile  = contextName + "ModelSnapshot.cs";

            if (Directory.Exists(migrationDir))
            {
                Assert.False(Directory.EnumerateFiles(migrationDir, snapshotFile, SearchOption.AllDirectories).Any());
            }

            _fixture.InstallTool(targetProject, _output, _fixture.TestProjectRoot);

            var args = $" --context {contextName}";

            AssertCommand.Pass(new MigrationAddCommand(targetProject, migrationName, _output)
                               .Execute(args));

            Assert.True(Directory.EnumerateFiles(migrationDir, snapshotFile, SearchOption.AllDirectories).Any());

            AssertCommand.Pass(new DatabaseUpdateCommand(targetProject, _output)
                               .Execute(args));
        }
예제 #2
0
        private void AddAndApplyMigrationImpl(string project, string contextName, string migrationName)
        {
            var ignoredJson = Path.Combine(_testProjectRoot, project, "project.json.ignore");
            var testProject = Path.Combine(_testProjectRoot, project, "project.json");

            File.Move(ignoredJson, testProject);

            var migrationDir = Path.Combine(Path.GetDirectoryName(testProject), "Migrations");
            var snapshotFile = contextName + "ModelSnapshot.cs";

            try
            {
                if (Directory.Exists(migrationDir))
                {
                    Assert.False(Directory.EnumerateFiles(migrationDir, snapshotFile, SearchOption.AllDirectories).Any());
                }

                _fixture.InstallTool(testProject, _output, _testProjectRoot);

                AssertCommand.Passes(new MigrationAddCommand(testProject, migrationName, _output)
                                     .Execute($" --context {contextName}"));

                Assert.True(Directory.EnumerateFiles(migrationDir, snapshotFile, SearchOption.AllDirectories).Any());

                AssertCommand.Passes(new DatabaseUpdateCommand(testProject, _output)
                                     .Execute($" --context {contextName}"));
            }
            finally
            {
                // project.json, even nested in bin/, will fail dotnet-restore on the solution
                File.Move(testProject, ignoredJson);
            }
        }
예제 #3
0
        private void BuildToolsPackages(ITestOutputHelper logger)
        {
            if (_toolsBuilt)
            {
                return;
            }
            _toolsBuilt = true;
            var start        = new DateTime(2015, 1, 1);
            var seconds      = (long)(DateTime.UtcNow - start).TotalSeconds;
            var suffix       = "t" + seconds.ToString("x").PadLeft(9, (char)'0');
            var toolsProject = JsonConvert.DeserializeAnonymousType(
                File.ReadAllText(
                    Path.Combine(_solutionDir, "src", "Microsoft.EntityFrameworkCore.Tools", Constants.ProjectFileName)),
                new { version = "" });

            _toolVersion = toolsProject.version.Replace("*", suffix);


            foreach (var pkg in PackagesToBuild)
            {
                logger?.WriteLine($"Building {pkg} version {_toolVersion}");
                // TODO can remove when https://github.com/NuGet/Home/issues/2469 is available
                AssertCommand.Pass(
                    new PackCommand(
                        Path.Combine(_solutionDir, "src", pkg, Constants.ProjectFileName),
                        _localArtifacts,
                        logger)
                    .Execute($"--version-suffix {suffix}"));
            }
        }
예제 #4
0
        public void MigrationsForAspNetApp()
        {
            var libraryProject = Path.Combine(_fixture.TestProjectRoot, "LibraryUsingSqlite", "project.json");

            AssertCommand.Pass(new RestoreCommand(libraryProject, _output)
                               .Execute(" --verbosity error "));

            AddAndApplyMigrationImpl("AspNetHostingPortableApp", "LibraryContext", "initialLibrary");
            AddAndApplyMigrationImpl("AspNetHostingPortableApp", "TestContext", "initialTest");
        }
        public void Unsupported_MigrationsOnNetCoreClassLibrary()
        {
            var targetProject = Path.Combine(_fixture.TestProjectRoot, "NetStandardClassLibrary/project.json");

            _fixture.InstallTool(targetProject, _output, _fixture.TestProjectRoot);

            var result = new MigrationAddCommand(targetProject, "Initial", _output)
                         .ExecuteWithCapturedOutput();

            AssertCommand.Fail(result);
            Assert.Contains("does not support", result.StdErr);
        }
예제 #6
0
        public void AddMigrationToDifferentFolder()
        {
            var libraryProject = Path.Combine(_fixture.TestProjectRoot, "PortableApp", "project.json");

            Assert.False(Directory.Exists(Path.Combine(_fixture.TestProjectRoot, "SomeOtherDir")));

            _fixture.InstallTool(libraryProject, _output, _fixture.TestProjectRoot);

            AssertCommand.Pass(new MigrationAddCommand(libraryProject, "OtherFolderMigration", _output)
                               .Execute($" --context TestContext --output-dir ../SomeOtherDir"));

            Assert.True(Directory.Exists(Path.Combine(_fixture.TestProjectRoot, "SomeOtherDir")));
            Assert.True(Directory.EnumerateFiles(Path.Combine(_fixture.TestProjectRoot, "SomeOtherDir"), "*.cs").Any());
        }
예제 #7
0
        public void InstallTool(string projectPath, ITestOutputHelper logger, params string[] fallbackRestoreLocations)
        {
            BuildToolsPackages(logger);

            var json = File.ReadAllText(projectPath);

            File.WriteAllText(projectPath, json.Replace("$toolVersion$", _suffix));
            var fallbacks = new [] { LocalArtifacts }
            .Concat(fallbackRestoreLocations ?? Enumerable.Empty <string>())
            .Select(s => "--fallbacksource " + s);

            AssertCommand.Passes(
                new RestoreCommand(projectPath, logger)
                .Execute(string.Join(" ", fallbacks))
                );
        }
        public void Unsupported_MigrationsOnDesktopClassLibrary()
        {
            if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
            {
                return;
            }

            var targetProject = Path.Combine(_fixture.TestProjectRoot, "DesktopClassLibrary/project.json");

            _fixture.InstallTool(targetProject, _output, _fixture.TestProjectRoot);

            var result = new MigrationAddCommand(targetProject, "Initial", _output)
                         .ExecuteWithCapturedOutput();

            AssertCommand.Fail(result);
            Assert.Contains("does not support", result.StdErr);
        }
예제 #9
0
        public void InstallTool(string projectPath, ITestOutputHelper logger, params string[] fallbackRestoreLocations)
        {
            BuildToolsPackages(logger);

            var json = File.ReadAllText(projectPath);

            File.WriteAllText(projectPath, json.Replace("$toolVersion$", _toolVersion));
            var fallbacks = new[] { _localArtifacts }
            .Concat(fallbackRestoreLocations ?? Enumerable.Empty <string>())
            .Select(s => "--fallbacksource " + s);

            Reporter.Output.WriteLine($"Restoring packages to test project {projectPath}".Bold().Black());
            AssertCommand.Pass(
                new RestoreCommand(projectPath, logger)
                .Execute(" --verbosity error " + string.Join(" ", fallbacks))
                );
        }
        public void Unsupported_MigrationsOnDesktopClassLibrary()
        {
            if (!PlatformServices.Default.Runtime.OperatingSystem.Equals("Windows", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            var targetProject = Path.Combine(_fixture.TestProjectRoot, "DesktopClassLibrary/project.json");

            _fixture.InstallTool(targetProject, _output, _fixture.TestProjectRoot);

            var result = new MigrationAddCommand(targetProject, "Initial", _output)
                         .ExecuteWithCapturedOutput();

            AssertCommand.Fail(result);
            Assert.Contains("does not support", result.StdErr);
        }
예제 #11
0
        public void RunsMigrationsForAspNetApp()
        {
            var ignoredJson    = Path.Combine(_testProjectRoot, "LibraryUsingSqlite", "project.json.ignore");
            var libraryProject = Path.Combine(_testProjectRoot, "LibraryUsingSqlite", "project.json");

            File.Move(ignoredJson, libraryProject);

            try
            {
                AssertCommand.Passes(new RestoreCommand(libraryProject, _output)
                                     .Execute());

                AddAndApplyMigrationImpl("AspNetHostingPortableApp", "LibraryContext", "initialLibrary");
                AddAndApplyMigrationImpl("AspNetHostingPortableApp", "TestContext", "initialTest");
            }
            finally
            {
                File.Move(libraryProject, ignoredJson);
            }
        }
예제 #12
0
        private void AddAndApplyMigrationImpl(
            string targetProjectName,
            string contextName,
            string migrationName,
            string startupProjectName = null)
        {
            var targetProject  = Path.Combine(_fixture.TestProjectRoot, targetProjectName, "project.json");
            var startupProject = startupProjectName != null
                ? Path.Combine(_fixture.TestProjectRoot, startupProjectName, "project.json")
                : null;

            _output.WriteLine("Target dir = " + targetProject);

            var migrationDir = Path.Combine(Path.GetDirectoryName(targetProject), "Migrations");
            var snapshotFile = contextName + "ModelSnapshot.cs";

            if (Directory.Exists(migrationDir))
            {
                Assert.False(Directory.EnumerateFiles(migrationDir, snapshotFile, SearchOption.AllDirectories).Any());
            }

            _fixture.InstallTool(targetProject, _output, _fixture.TestProjectRoot);

            if (startupProject != null)
            {
                _fixture.InstallTool(startupProject, _output, _fixture.TestProjectRoot);
            }

            var args = $"--context {contextName}";

            AssertCommand.Pass(new MigrationAddCommand(targetProject, migrationName, _output, startupProject)
                               .Execute(args));

            Assert.True(Directory.EnumerateFiles(migrationDir, snapshotFile, SearchOption.AllDirectories).Any());

            AssertCommand.Pass(new DatabaseUpdateCommand(targetProject, _output, startupProject)
                               .Execute(args));

            AssertCommand.Pass(new MigrationScriptCommand(targetProject, _output, startupProject)
                               .Execute("--output " + Path.Combine(Path.GetDirectoryName(targetProject), "obj/dotnet-ef/migrations.sql")));
        }
예제 #13
0
        private void BuildToolsPackages(ITestOutputHelper logger)
        {
            if (_toolsBuilt)
            {
                return;
            }
            _toolsBuilt = true;

            _suffix = "t" + DateTime.UtcNow.ToString("yyMMddHHmmss");

            foreach (var pkg in PackagesToBuild)
            {
                logger?.WriteLine($"Building {pkg} version {_suffix}");
                // TODO can remove when https://github.com/NuGet/Home/issues/2469 is available
                AssertCommand.Passes(
                    new PackCommand(
                        Path.Combine(_solutionDir, "src", pkg, Constants.ProjectFileName),
                        LocalArtifacts,
                        logger)
                    .Execute($"--version-suffix {_suffix}"));
            }
        }