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(@"