public async Task FormatIsMaintained() { var rootPath = FindRootPath(); var cmd = new GenerateProjectCommand { Name = "Lucid" }; var bytes = await cmd.ExecuteAsync(); var zipCreated = File.GetLastWriteTimeUtc(Path.Combine(rootPath, "Modules/ProjectCreation/Module/Project.zip")); var zippedFiles = new List <string>(); using (var ms = new MemoryStream(bytes)) using (var zipFile = new ZipArchive(ms)) { foreach (var zipEntry in zipFile.Entries) { var name = zipEntry.FullName; if (ZipGenerator.ShouldProcessFile(name)) { var originalFile = Path.Combine(rootPath, name); if (!File.Exists(originalFile)) { TestContext.Progress.WriteLine($"Skip checks on file not-found: {originalFile}"); continue; } var originalLastWrite = File.GetLastWriteTimeUtc(originalFile); if (originalLastWrite > zipCreated) { TestContext.Progress.WriteLine($"Skip checks on file {originalFile} as it is more recent {originalLastWrite} than zip {zipCreated}."); continue; } using (var stream = File.OpenRead(originalFile)) using (var copy = zipEntry.Open()) { var originalBom = ZipGenerator.ReadBomEncoding(stream); var copiedBom = ZipGenerator.ReadBomEncoding(copy); copiedBom.Should().Be(originalBom, $"BOM of file {name} is not the same in the generated project"); } using (var copy = zipEntry.Open()) using (var streamReader = new StreamReader(copy)) { var copyContent = streamReader.ReadToEnd(); var original = File.ReadAllText(originalFile); var copyLfCount = copyContent.Count(c => c == '\n'); var originalLfCount = original.Count(c => c == '\n'); copyLfCount.Should().Be(originalLfCount, $"{originalFile} has {originalLfCount} line-feeds, so copy should have same amount"); var copyCrCount = copyContent.Count(c => c == '\r'); var originalCrCount = original.Count(c => c == '\r'); copyCrCount.Should().Be(originalCrCount, $"{originalFile} has {originalCrCount} carriage returns, so copy should have same amount"); } } } } }
public async Task GeneratedProjectContainsExpectedFiles() { var cmd = new GenerateProjectCommand { Name = "DemoProj" }; var bytes = await cmd.ExecuteAsync(); var zippedFiles = new List <string>(); using (var ms = new MemoryStream(bytes)) using (var zipFile = new ZipArchive(ms)) { foreach (var zipEntry in zipFile.Entries) { var name = zipEntry.FullName; name.ToLower().Should().NotBe("license.txt", "LICENSE.txt should not be included in output (should be part of skipped files)"); name.ToLower().Should().NotContain("ftphost", $"Host information should not be included (file {name} was zipped into output)"); var zippedFileName = name.Replace("/", "\\"); zippedFiles.Add(zippedFileName); } } // verify a selection of files // root files zippedFiles.Should().Contain(".gitignore"); zippedFiles.Should().Contain("build.proj"); zippedFiles.Should().Contain("CommandPrompt.bat"); zippedFiles.Should().Contain("global.json"); zippedFiles.Should().Contain("DemoProj.sln"); zippedFiles.Should().Contain("readme.md"); zippedFiles.Should().Contain("docker-compose.yml"); // build files zippedFiles.Should().Contain("Build\\App_Offline.htm"); zippedFiles.Should().Contain("Build\\common.build.proj"); zippedFiles.Should().Contain("Build\\common.targets"); zippedFiles.Should().Contain("Build\\BuildUtil\\Build.BuildUtil.csproj"); zippedFiles.Should().Contain("Build\\BuildUtil\\Program.cs"); // Host files zippedFiles.Should().Contain("Host\\web.config.xml"); zippedFiles.Should().Contain("Host\\Web\\bundleconfig.json"); zippedFiles.Should().Contain("Host\\Web\\compilerconfig.json.defaults"); zippedFiles.Should().Contain("Host\\Web\\nlog.config"); zippedFiles.Should().Contain("Host\\Web\\Content\\demoProj.js"); zippedFiles.Should().Contain("Host\\Web\\Content\\web.scss"); zippedFiles.Should().Contain("Host\\Web\\Home\\Index.cshtml"); zippedFiles.Should().Contain("Host\\Web\\wwwroot\\favicon.ico"); zippedFiles.Should().NotContain("Host\\Web\\wwwroot\\css\\site.min.css"); zippedFiles.Should().NotContain("Host\\Web\\wwwroot\\js\\site.min.js"); zippedFiles.Should().NotContain("Host\\Web.Tests\\wwwroot\\DemoProj.Host.Web.Tests.csproj.user"); // lib files zippedFiles.Should().Contain("Lib\\MvcApp\\DemoProj.Lib.MvcApp.csproj"); zippedFiles.Should().NotContain("Lib\\MvcApp\\wwwroot\\lib\\mvcForms\\css\\mvcForms.css"); // ProjectCreation module zippedFiles.Should().Contain("Modules\\ProjectCreation\\Module\\DemoProj.Modules.ProjectCreation.csproj"); zippedFiles.Should().Contain("Modules\\ProjectCreation\\Module\\Zip.proj"); zippedFiles.Should().NotContain("Modules\\ProjectCreation\\Module\\Project.zip"); zippedFiles.Should().NotContain("Modules\\ProjectCreation\\Module\\Project.zip.nextUpdate"); zippedFiles.Should().NotContain("Modules\\ProjectCreation\\Module\\bin\\Debug\\netstandard2.0\\DemoProj.Modules.ProjectCreation.dll"); zippedFiles.Should().NotContain("Modules\\ProjectCreation\\Module\\obj\\project.assets.json"); // Tool binaries zippedFiles.Should().Contain("Tools\\PuTTY\\psftp.exe"); }