Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

164 lines
5.7 KiB
C#

// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
namespace System.Data.Entity.Migrations
{
using System.Collections.Generic;
using System.Data.Entity.Migrations.Design;
using System.Data.Entity.Migrations.Resources;
using System.Data.Entity.Migrations.Utilities;
using System.Linq;
using EnvDTE;
using Moq;
using Xunit;
public class AddMigrationCommandTests
{
[Fact]
public void Writes_scaffolding_message_when_new_migration()
{
var command = new TestableAddMigrationCommand();
command.Execute("M", false, false);
Assert.Equal(Strings.ScaffoldingMigration("M"), command.Messages.Single());
}
[Fact]
public void Opens_migration_file_when_no_error()
{
var command = new TestableAddMigrationCommand();
command.Execute("M", false, false);
command.MockDispatcher.Verify(p => p.OpenFile(@".\M"));
}
[Fact]
public void Writes_rescaffolding_message_when_rescaffolding()
{
var command = new TestableAddMigrationCommand();
command.MockToolingFacade
.Setup(f => f.Scaffold("M", It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>()))
.Returns(
new ScaffoldedMigration
{
IsRescaffold = true
});
command.Execute("M", false, false);
Assert.Equal(Strings.RescaffoldingMigration("M"), command.Messages.Single());
}
[Fact]
public void Writes_code_behind_warning_when_new_migration()
{
var command = new TestableAddMigrationCommand();
command.MockToolingFacade
.Setup(f => f.Scaffold("M", It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>()))
.Returns(
new ScaffoldedMigration
{
MigrationId = "Foo"
});
command.Execute("M", false, false);
Assert.Equal(Strings.SnapshotBehindWarning("M"), command.Warnings.Single());
}
[Fact]
public void Writes_rescaffold_warning_when_new_migration_name_matches_only_applied_migration()
{
var command = new TestableAddMigrationCommand();
command.MockToolingFacade
.Setup(f => f.GetDatabaseMigrations()).Returns(new[] { "201301040020540_M" });
command.Execute("M", false, false);
Assert.Equal(
Strings.DidYouMeanToRescaffold("M", "$InitialDatabase", "M"),
command.Warnings.Last().Trim());
}
[Fact]
public void Writes_rescaffold_warning_when_new_migration_name_matches_last_applied_migration()
{
var command = new TestableAddMigrationCommand();
command.MockToolingFacade
.Setup(f => f.GetDatabaseMigrations())
.Returns(new[] { "201301040020540_M2", "201301040020540_M1" });
command.Execute("M2", false, false);
Assert.Equal(
Strings.DidYouMeanToRescaffold("M2", "201301040020540_M1", "M2"),
command.Warnings.Last().Trim());
}
internal class TestableAddMigrationCommand : AddMigrationCommand
{
public readonly Mock<ToolingFacade> MockToolingFacade
= new Mock<ToolingFacade>
{
DefaultValue = DefaultValue.Mock
};
public readonly Mock<Project> MockProject
= new Mock<Project>
{
DefaultValue = DefaultValue.Mock
};
public readonly Mock<DomainDispatcher> MockDispatcher = new Mock<DomainDispatcher>();
public readonly List<string> Messages = new List<string>();
public readonly List<string> Warnings = new List<string>();
public TestableAddMigrationCommand()
{
AppDomain.CurrentDomain.SetData("efDispatcher", MockDispatcher.Object);
var mockFullPathProperty = new Mock<Property>();
mockFullPathProperty.SetupGet(p => p.Value).Returns(".");
MockProject.Setup(p => p.Properties.Item("FullPath")).Returns(mockFullPathProperty.Object);
var mockRootNamespaceProperty = new Mock<Property>();
mockRootNamespaceProperty.SetupGet(p => p.Value).Returns("N");
MockProject.Setup(p => p.Properties.Item("RootNamespace")).Returns(mockRootNamespaceProperty.Object);
}
public override ToolingFacade GetFacade(string configurationTypeName = null)
{
return MockToolingFacade.Object;
}
public override Project Project
{
get { return MockProject.Object; }
}
public override void WriteLine(string message)
{
Messages.Add(message);
}
public override void WriteWarning(string message)
{
Warnings.Add(message);
}
protected override string WriteMigration(string name, bool force, ScaffoldedMigration scaffoldedMigration, bool rescaffolding)
{
return name;
}
}
}
}