using System.Collections.Generic; using CTA.Rules.Test.Models; using NUnit.Framework; using System.IO; using System.Linq; using CTA.Rules.Models; namespace CTA.Rules.Test { /// /// This class is exclusively for testing WebFormsFull.sln, /// a solution with a WebForms project containing all supported /// WebForms porting rules. /// [TestFixture] class WebFormsFullTests : AwsRulesBaseTest { public string ctaTestProjectsDir = ""; public string downloadLocation; private Dictionary _resultsDict; private static IEnumerable TestCases = SupportedFrameworks.GetSupportedFrameworksList(); [OneTimeSetUp] public void Setup() { ctaTestProjectsDir = SetupTests.CtaTestProjectsDir; downloadLocation = SetupTests.DownloadLocation; var solutionName = "WebFormsFull.sln"; var net31Results = CopySolutionToUniqueTempDirAndAnalyze(solutionName, ctaTestProjectsDir, SupportedFrameworks.Netcore31); var net50Results = CopySolutionToUniqueTempDirAndAnalyze(solutionName, ctaTestProjectsDir, SupportedFrameworks.Net5); var net60Results = CopySolutionToUniqueTempDirAndAnalyze(solutionName, ctaTestProjectsDir, SupportedFrameworks.Net6); var net70Results = CopySolutionToUniqueTempDirAndAnalyze(solutionName, ctaTestProjectsDir, SupportedFrameworks.Net7); _resultsDict = new Dictionary { {SupportedFrameworks.Netcore31, net31Results}, {SupportedFrameworks.Net5, net50Results}, {SupportedFrameworks.Net6, net60Results}, {SupportedFrameworks.Net7, net70Results} }; } [TestCase(SupportedFrameworks.Netcore31)] [TestCase(SupportedFrameworks.Net5)] [TestCase(SupportedFrameworks.Net6)] public void TestProjectFilePortingResults(string version) { var results = _resultsDict[version]; var webFormsFullResult = results.ProjectResults.First(proj => proj.CsProjectPath.EndsWith("WebFormsFull.csproj")); // Verify expected packages are in .csproj StringAssert.Contains($"{version}", webFormsFullResult.CsProjectContent); StringAssert.Contains(@"", webFormsFullResult.CsProjectContent); StringAssert.Contains(@"", webFormsFullResult.CsProjectContent); StringAssert.Contains(@"", webFormsFullResult.CsProjectContent); } [TestCase(SupportedFrameworks.Net7)] public void TestProjectFilePortingResults_Dotnet7AndAbove(string version) { var results = _resultsDict[version]; var webFormsFullResult = results.ProjectResults.First(proj => proj.CsProjectPath.EndsWith("WebFormsFull.csproj")); // Verify expected packages are in .csproj StringAssert.Contains($"{version}", webFormsFullResult.CsProjectContent); StringAssert.Contains(@"", webFormsFullResult.CsProjectContent); StringAssert.Contains(@"", webFormsFullResult.CsProjectContent); StringAssert.Contains(@"", webFormsFullResult.CsProjectContent); } [Test, TestCaseSource("TestCases")] public void TestUserControlsPortingResults(string version) { var results = _resultsDict[version]; var webFormsFullResult = results.ProjectResults.First(proj => proj.CsProjectPath.EndsWith("WebFormsFull.csproj")); var projectDir = Path.GetDirectoryName(webFormsFullResult.CsProjectPath); // Component file exists FileAssert.Exists(Path.Combine(projectDir, "Components", "ViewSwitcher.razor")); // Component code-behind contents var viewSwitcherRazorCs = File.ReadAllText(Path.Combine(projectDir, "Components", "ViewSwitcher.razor.cs")); StringAssert.Contains("using Microsoft.AspNetCore.Components;", viewSwitcherRazorCs); StringAssert.Contains("public partial class ViewSwitcher : ComponentBase", viewSwitcherRazorCs); StringAssert.DoesNotContain("public partial class ViewSwitcher : System.Web.UI.UserControl", viewSwitcherRazorCs); } [Test, TestCaseSource("TestCases")] public void TestStaticFilesMovedToWwwroot(string version) { var results = _resultsDict[version]; var webFormsFullResult = results.ProjectResults.First(proj => proj.CsProjectPath.EndsWith("WebFormsFull.csproj")); var projectDir = Path.GetDirectoryName(webFormsFullResult.CsProjectPath); var wwwrootDir = Path.Combine(projectDir, "wwwroot"); var contentDir = Path.Combine(wwwrootDir, "Content"); var fontsDir = Path.Combine(wwwrootDir, "fonts"); var imagesDir = Path.Combine(wwwrootDir, "images"); var picsDir = Path.Combine(wwwrootDir, "Pics"); var scriptsDir = Path.Combine(wwwrootDir, "Scripts"); // Verify static files are migrated to wwwroot dir Assert.AreEqual(1, Directory.EnumerateFiles(wwwrootDir).Count()); Assert.AreEqual(15, Directory.EnumerateFiles(contentDir).Count()); Assert.AreEqual(10, Directory.EnumerateFiles(fontsDir).Count()); Assert.AreEqual(4, Directory.EnumerateFiles(imagesDir).Count()); Assert.AreEqual(13, Directory.EnumerateFiles(picsDir).Count()); Assert.AreEqual(18, Directory.EnumerateFiles(scriptsDir, "*", SearchOption.AllDirectories).Count()); } [Test, TestCaseSource("TestCases")] public void TestProperHttpModulePortsCorrectly(string version) { var results = _resultsDict[version]; var webFormsFullResult = results.ProjectResults.First(proj => proj.CsProjectPath.EndsWith("WebFormsFull.csproj")); var projectDir = Path.GetDirectoryName(webFormsFullResult.CsProjectPath); // HttpModule contents var content = File.ReadAllText(Path.Combine(projectDir, "Middleware", "HttpModules", "TestProperHttpModule.cs")); StringAssert.AreEqualIgnoringCase(WebFormsFullExpectedOutputConstants.TestProperHttpModuleFile, content); } [Test, TestCaseSource("TestCases")] public void TestProperHttpModuleAlternatePortsCorrectly(string version) { var results = _resultsDict[version]; var webFormsFullResult = results.ProjectResults.First(proj => proj.CsProjectPath.EndsWith("WebFormsFull.csproj")); var projectDir = Path.GetDirectoryName(webFormsFullResult.CsProjectPath); // Application_ResolveRequestCache generates its own module var content = File.ReadAllText(Path.Combine(projectDir, "Middleware", "HttpModules", "TestProperHttpModuleAlternateResolveRequestCache.cs")); StringAssert.AreEqualIgnoringCase(WebFormsFullExpectedOutputConstants.TestProperHttpModuleAlternateResolveRequestCacheFile, content); // Application_PostResolveRequestCache generates its own module var spinoffContent = File.ReadAllText(Path.Combine(projectDir, "Middleware", "HttpModules", "TestProperHttpModuleAlternatePostResolveRequestCache.cs")); StringAssert.AreEqualIgnoringCase(WebFormsFullExpectedOutputConstants.TestProperHttpModuleAlternatePostResolveRequestCacheFile, spinoffContent); } [Test, TestCaseSource("TestCases")] public void TestImproperHttpModulePortsCorrectly(string version) { var results = _resultsDict[version]; var webFormsFullResult = results.ProjectResults.First(proj => proj.CsProjectPath.EndsWith("WebFormsFull.csproj")); var projectDir = Path.GetDirectoryName(webFormsFullResult.CsProjectPath); // HttpModule contents var content = File.ReadAllText(Path.Combine(projectDir, "Middleware", "HttpModules", "TestImproperHttpModule.cs")); StringAssert.AreEqualIgnoringCase(WebFormsFullExpectedOutputConstants.TestImproperHttpModuleFile, content); } [Test, TestCaseSource("TestCases")] public void TestHttpHandlersMovedToMiddleware(string version) { var results = _resultsDict[version]; var webFormsFullResult = results.ProjectResults.First(proj => proj.CsProjectPath.EndsWith("WebFormsFull.csproj")); var projectDir = Path.GetDirectoryName(webFormsFullResult.CsProjectPath); // HttpModule contents var content = File.ReadAllText(Path.Combine(projectDir, "Middleware", "HttpHandlers", "TestHttpHandler.cs")); StringAssert.AreEqualIgnoringCase(WebFormsFullExpectedOutputConstants.TestHttpHandlerFile, content); } [Test, TestCaseSource("TestCases")] public void TestDefaultAspxMigrations(string version) { var results = _resultsDict[version]; var webFormsFullResult = results.ProjectResults.First(proj => proj.CsProjectPath.EndsWith("WebFormsFull.csproj")); var projectDir = Path.GetDirectoryName(webFormsFullResult.CsProjectPath); var defaultRazor = File.ReadAllText(Path.Combine(projectDir, "Pages", "Default.razor")); StringAssert.DoesNotContain("asp:Content", defaultRazor); StringAssert.Contains(@"@page ""/""", defaultRazor); StringAssert.Contains("@inherits WebFormsFull._Default", defaultRazor); StringAssert.DoesNotContain("asp:Button", defaultRazor); StringAssert.Contains("Button", defaultRazor); StringAssert.DoesNotContain("asp:Label", defaultRazor); StringAssert.Contains("label", defaultRazor); StringAssert.DoesNotContain("asp:Hyperlink", defaultRazor); StringAssert.Contains("", defaultRazor); } [Test, TestCaseSource("TestCases")] public void TestOtherPageAspxMigration(string version) { var results = _resultsDict[version]; var webFormsFullResult = results.ProjectResults.First(proj => proj.CsProjectPath.EndsWith("WebFormsFull.csproj")); var projectDir = Path.GetDirectoryName(webFormsFullResult.CsProjectPath); var otherPageRazor = File.ReadAllText(Path.Combine(projectDir, "Pages", "OtherPage.razor")); StringAssert.Contains(@"@page ""/OtherPage""", otherPageRazor); StringAssert.Contains(@"@layout Site", otherPageRazor); StringAssert.Contains(@"@inherits WebFormsFull.OtherPage", otherPageRazor); StringAssert.DoesNotContain("<%: Title %>", otherPageRazor); StringAssert.Contains(@"@(Title)", otherPageRazor); StringAssert.DoesNotContain("
", otherPageRazor); StringAssert.Contains(@"
", otherPageRazor); StringAssert.DoesNotContain(@"", otherPageRazor); StringAssert.DoesNotContain(@"", otherPageRazor); StringAssert.DoesNotContain(@"", otherPageRazor); StringAssert.DoesNotContain(@"", otherPageRazor); StringAssert.DoesNotContain(@"", otherPageRazor); StringAssert.DoesNotContain(@"", otherPageRazor); StringAssert.DoesNotContain(@"", otherPageRazor); StringAssert.DoesNotContain(@"", otherPageRazor); StringAssert.Contains(@"", otherPageRazor); StringAssert.Contains(@"", otherPageRazor); StringAssert.Contains(@"