public void GenerateProject_Should_Render_Directories() { // Arrange var spec = new ProjectSpec(); var template = new ProjectTemplate { Manifest = new[] { new FileEntry { Path = "d1/" }, new FileEntry { Path = "d1/d2/" }, }, }; var generator = new StubbleProjectGeneratorBuilder().WithProjectTemplate(template).Build(); // Act var project = generator.GenerateProject(spec); // Assert project.FileEntries[1].Path.Should().Be("d1/"); project.FileEntries[1].Text.Should().BeNull(); project.FileEntries[2].Path.Should().Be("d1/d2/"); project.FileEntries[2].Text.Should().BeNull(); }
public void GenerateProject_Should_Evaluate_Parameter_Expression() { // Arrange var spec = new ProjectSpec { Dependencies = "Dep1,Dep2" }; var template = new ProjectTemplate { Manifest = new[] { new FileEntry { Path = "f", Text = "{{#Or}}text{{/Or}}" }, }, Parameters = new[] { new Parameter() { Name = "Or", Expression = "Dep1||Dep2", }, }, }; var generator = new StubbleProjectGeneratorBuilder().WithProjectTemplate(template).Build(); // Act var project = generator.GenerateProject(spec); // Assert project.FileEntries[1].Text.Should().Be("text"); }
public void GenerateProject_Should_Evaluate_Parameter_Value() { // Arrange var spec = new ProjectSpec(); var template = new ProjectTemplate { Manifest = new[] { new FileEntry { Path = "f", Text = "{{Param}}" }, }, Parameters = new[] { new Parameter() { Name = "Param", Value = "text", }, }, }; var generator = new StubbleProjectGeneratorBuilder().WithProjectTemplate(template).Build(); // Act var project = generator.GenerateProject(spec); // Assert project.FileEntries[1].Text.Should().Be("text"); }
public void GenerateProject_Should_Give_Precedence_To_Parameter_Value() { // Arrange var spec = new ProjectSpec { Dependencies = "Dep1" }; var template = new ProjectTemplate { Manifest = new[] { new FileEntry { Path = "f", Text = "{{Which}}" }, }, Parameters = new[] { new Parameter() { Name = "Which", Value = "text", Expression = "Dep", }, }, }; var generator = new StubbleProjectGeneratorBuilder().WithProjectTemplate(template).Build(); // Act var project = generator.GenerateProject(spec); // Assert project.FileEntries[1].Text.Should().Be("text"); }
public void GenerateProject_Should_NoOp_Parameter_With_Value_Or_Expression() { // Arrange var spec = new ProjectSpec { Dependencies = "Dep1" }; var template = new ProjectTemplate { Manifest = new[] { new FileEntry { Path = "f", Text = "{{Which}}" }, }, Parameters = new[] { new Parameter() { Name = "Which", }, }, }; var generator = new StubbleProjectGeneratorBuilder().WithProjectTemplate(template).Build(); // Act var project = generator.GenerateProject(spec); // Assert project.FileEntries[1].Text.Should().Be(string.Empty); }
public void Invalid_Version_Should_Log_An_Error() { // Arrange var config = new InitializrConfig { ProjectTemplates = new[] { new ProjectTemplateConfiguration { Uri = new Uri("pt:///izr?steeltoeVersionRange=1.0"), }, }, }; var logger = new Mock <ILogger <ProjectTemplateRegistry> >(); var registry = new TemplateRegistryBuilder().WithConfig(config).WithLogger(logger.Object).Build(); var spec = new ProjectSpec { SteeltoeVersion = "1..1" }; // Act var template = registry.Lookup(spec); // Assert template.Should().BeNull(); logger.VerifyLog(LogLevel.Error, "Error looking up project template: Version not in correct format: '1..1'"); }
public Task <byte[]> GenerateProjectArchive(ProjectSpec spec) { if (spec.Name is "nosuchproject") { throw new NoProjectForSpecException($"No project for spec."); } if (spec.Packaging is "nosuchpackaging") { throw new InvalidSpecException($"Packaging '{spec.Packaging}' not found."); } const char newline = '\n'; var buffer = new StringBuilder(); buffer.Append("project name=").Append(spec.Name ?? "<na>"); buffer.Append(newline); buffer.Append("description=").Append(spec.Description ?? "<na>"); buffer.Append(newline); buffer.Append("namespace=").Append(spec.Namespace ?? "<na>"); buffer.Append(newline); buffer.Append("steeltoe version=").Append(spec.SteeltoeVersion ?? "<na>"); buffer.Append(newline); buffer.Append("dotnet framework=").Append(spec.DotNetFramework ?? "<na>"); buffer.Append(newline); buffer.Append("language=").Append(spec.Language ?? "<na>"); buffer.Append(newline); buffer.Append("packaging=").Append(spec.Packaging ?? "<na>"); buffer.Append(newline); buffer.Append("dependencies=").Append(spec.Dependencies ?? "<na>"); buffer.Append(newline); return(Task.FromResult(Encoding.ASCII.GetBytes(buffer.ToString()))); }
public void GenerateProject_Should_Render_Files() { // Arrange var spec = new ProjectSpec { Name = "my name", Description = "my description", Namespace = "my namespace", SteeltoeVersion = "my steeltoe version", DotNetFramework = "my dotnet framework", DotNetTemplate = "my dotnet template", Language = "my language", }; var template = new ProjectTemplate { Manifest = new[] { new FileEntry { Path = "name", Text = "{{Name}}" }, new FileEntry { Path = "description", Text = "{{Description}}" }, new FileEntry { Path = "namespace", Text = "{{Namespace}}" }, new FileEntry { Path = "steeltoe version", Text = "{{SteeltoeVersion}}" }, new FileEntry { Path = "dotnet framework", Text = "{{DotNetFramework}}" }, new FileEntry { Path = "dotnet template", Text = "{{DotNetTemplate}}" }, new FileEntry { Path = "language", Text = "{{Language}}" }, }, }; var generator = new StubbleProjectGeneratorBuilder().WithProjectTemplate(template).Build(); // Act var project = generator.GenerateProject(spec); // Assert var i = 1; project.FileEntries[i++].Text.Should().Be("my name"); project.FileEntries[i++].Text.Should().Be("my description"); project.FileEntries[i++].Text.Should().Be("my namespace"); project.FileEntries[i++].Text.Should().Be("my steeltoe version"); project.FileEntries[i++].Text.Should().Be("my dotnet framework"); project.FileEntries[i++].Text.Should().Be("my dotnet template"); project.FileEntries[i].Text.Should().Be("my language"); }
public async Task Unsupported_DotNet_Framework_Should_Return_404_NotFound() { // Arrange var config = new UiConfig { Name = new UiConfig.Text { Default = "my project name" }, Description = new UiConfig.Text { Default = "my description" }, Namespace = new UiConfig.Text { Default = "my namespace" }, SteeltoeVersion = new UiConfig.SingleSelectList { Default = "0.0" }, DotNetFramework = new UiConfig.SingleSelectList { Default = "0.0" }, Dependencies = new UiConfig.GroupList { Values = new[] { new UiConfig.Group { Values = new[] { new UiConfig.GroupItem { Id = "MyDep", DotNetFrameworkRange = "1.0" }, }, }, }, }, }; var controller = new ProjectControllerBuilder() .WithInitializrConfiguration(config) .Build(); var spec = new ProjectSpec { Dependencies = "mydep", }; // Act var unknown = await controller.GetProjectArchive(spec); var result = Assert.IsType <NotFoundObjectResult>(unknown); // Assert result.Value.ToString().Should().Be("No dependency 'mydep' found for .NET framework 0.0."); }
public void Application_Should_Be_Assumed() { // Arrange var spec = new ProjectSpec { Packaging = "foo" }; // Act // Assert spec.Packaging.Should().Be("foo"); }
public void No_Template_Should_Return_Null_Project() { // Arrange var spec = new ProjectSpec(); var generator = new StubbleProjectGeneratorBuilder().Build(); // Act var project = generator.GenerateProject(spec); // Assert project.Should().BeNull(); }
public void RecoverStateFromXml(string rawXml) { var rootElement = XElement.Parse(rawXml); Title = rootElement.AttributeValue("Title"); ElapsedDayLimit = rootElement.AttributeValue("TimeLimit", int.Parse); Reward = rootElement.AttributeValue("Reward", int.Parse); MainStage = rootElement.AttributeValue("MainStage", bool.Parse); IconName = rootElement.AttributeValue("Icon"); Boss = new ProjectSpec(); Boss.RecoverStateFromXml(rootElement.Element("ProjectSpec").ToString()); }
public void GenerateProject_Should_Generate_A_Project() { // Arrange var spec = new ProjectSpec(); var template = new ProjectTemplate { Manifest = new FileEntry[0] }; var generator = new StubbleProjectGeneratorBuilder().WithProjectTemplate(template).Build(); // Act var project = generator.GenerateProject(spec); // Assert project.Should().NotBeNull(); }
public void Unknown_Dependency_Should_Return_404_Page_Not_found() { // Arrange var controller = new ProjectControllerBuilder().Build(); var spec = new ProjectSpec { Dependencies = "nosuchdep" }; // Act var unknown = controller.GetProjectArchive(spec); // Assert var result = Assert.IsType <NotFoundObjectResult>(unknown); result.Value.ToString().Should().Be("Dependency 'nosuchdep' not found."); }
public void Properties_Should_Be_Defined() { // Arrange var spec = new ProjectSpec(); // Act // Assert spec.Name.Should().BeNull(); spec.Description.Should().BeNull(); spec.Namespace.Should().BeNull(); spec.SteeltoeVersion.Should().BeNull(); spec.DotNetFramework.Should().BeNull(); spec.Language.Should().BeNull(); spec.Packaging.Should().BeNull(); }
public void Unknown_Archive_Format_Should_Return_404_Page_Not_Found() { // Arrange var controller = new ProjectControllerBuilder().Build(); var spec = new ProjectSpec { Packaging = "nosuchformat" }; // Act var unknown = controller.GetProjectArchive(spec); // Assert var result = Assert.IsType <NotFoundObjectResult>(unknown); result.Value.ToString().Should().Be("Packaging 'nosuchformat' not found."); }
public void GenerateProject_Should_Contain_Top_Level_Directory() { // Arrange var spec = new ProjectSpec { Name = "tld", }; var template = new ProjectTemplate { Manifest = new FileEntry[0] }; var generator = new StubbleProjectGeneratorBuilder().WithProjectTemplate(template).Build(); // Act var project = generator.GenerateProject(spec); // Assert project.FileEntries[0].Path.Should().Be("tld/"); }
public void No_Template_Found_Should_Return_404_Page_Not_Found() { // Arrange var controller = new ProjectControllerBuilder().Build(); var spec = new ProjectSpec { Name = "nosuchtemplate" }; // Act var unknown = controller.GetProjectArchive(spec); // Assert var result = Assert.IsType <NotFoundObjectResult>(unknown); result.Value.ToString().Should() .Be("No project template for spec: [name=nosuchtemplate,packaging=myarchive]"); }
public void Application_Should_Be_Default_to_Name() { // Arrange var spec = new ProjectSpec(); // Act spec.Name = "foo"; // Assert spec.Namespace.Should().Be("foo"); // Act spec.Namespace = "bar"; // Assert spec.Namespace.Should().Be("bar"); }
public void GenerateProject_Should_Omit_Files_If_Dependency_Not_Met() { // Arrange var spec = new ProjectSpec { Dependencies = "dep0,dep1" }; var template = new ProjectTemplate { Manifest = new[] { new FileEntry { Path = "f0" }, new FileEntry { Path = "f1", Dependencies = "dep0" }, new FileEntry { Path = "f2", Dependencies = "dep1" }, new FileEntry { Path = "f3", Dependencies = "dep0,dep1" }, new FileEntry { Path = "f4", Dependencies = "dep2" }, new FileEntry { Path = "f5", Dependencies = "dep0,dep2" }, }, }; var generator = new StubbleProjectGeneratorBuilder().WithProjectTemplate(template).Build(); // Act var project = generator.GenerateProject(spec); // Assert project.FileEntries.Count.Should().Be(6); var i = 1; project.FileEntries[i++].Path.Should().Be("f0"); project.FileEntries[i++].Path.Should().Be("f1"); project.FileEntries[i++].Path.Should().Be("f2"); project.FileEntries[i++].Path.Should().Be("f3"); project.FileEntries[i].Path.Should().Be("f5"); }
public void Dependencies_Should_Be_Case_Corrected() { // Arrange var config = new InitializrConfig { ProjectMetadata = new ProjectMetadata { Dependencies = new ProjectMetadata.GroupList { Values = new[] { new ProjectMetadata.Group { Values = new[] { new ProjectMetadata.GroupItem { Id = "CamelCaseDep", }, }, }, }, }, }, }; var spec = new ProjectSpec { Packaging = "myarchive", Dependencies = "camelcasedep", }; var controller = new ProjectControllerBuilder() .WithInitializrConfiguration(config) .Build(); // Act var unknown = controller.GetProjectArchive(spec); // Assert var result = Assert.IsType <FileContentResult>(unknown); using var reader = new StreamReader(new MemoryStream(result.FileContents)); var body = reader.ReadToEnd(); body.Should().Contain("dependencies=CamelCaseDep"); }
public void Null_Archive_Format_Should_Return_500_Internal_Server_Error() { // Arrange var spec = new ProjectSpec(); var config = new InitializrConfig { ProjectTemplates = new ProjectTemplateConfiguration[0] }; var controller = new ProjectControllerBuilder().WithInitializrConfiguration(config).Build(); // Act var unknown = controller.GetProjectArchive(spec); // Assert var result = Assert.IsType <ObjectResult>(unknown); result.StatusCode.Should().Be(StatusCodes.Status500InternalServerError); result.Value.Should().Be("Default packaging not configured."); }
public async Task Unknown_Packaging_Should_Return_400_BadRequest() { // Arrange var controller = new ProjectControllerBuilder().Build(); var spec = new ProjectSpec { SteeltoeVersion = "0.0", DotNetFramework = "0.0", Packaging = "nosuchpackaging", }; // Act var unknown = await controller.GetProjectArchive(spec); var result = Assert.IsType <BadRequestObjectResult>(unknown); // Assert result.Value.ToString().Should().Be("Packaging 'nosuchpackaging' not found."); }
public async Task Unknown_Dependency_Should_Return_404_Page_Not_found() { // Arrange var controller = new ProjectControllerBuilder().Build(); var spec = new ProjectSpec { SteeltoeVersion = "0.0", DotNetFramework = "0.0", Dependencies = "nosuchdep", }; // Act var unknown = await controller.GetProjectArchive(spec); var result = Assert.IsType <NotFoundObjectResult>(unknown); // Assert result.Value.ToString().Should().Be("Dependency 'nosuchdep' not found."); }
public async Task No_Template_Found_Should_Return_404_Page_Not_Found() { // Arrange var controller = new ProjectControllerBuilder().Build(); var spec = new ProjectSpec { SteeltoeVersion = "0.0", DotNetFramework = "0.0", Name = "nosuchproject", }; // Act var unknown = await controller.GetProjectArchive(spec); var result = Assert.IsType <NotFoundObjectResult>(unknown); // Assert result.Value.ToString().Should().Be("No project for spec."); }
public Project GenerateProject(ProjectSpec spec) { if (spec.Name != null && spec.Name.Equals("nosuchtemplate")) { return(null); } var project = new Project(); project.FileEntries.Add(new FileEntry { Path = "project name", Text = spec.Name ?? "<na>" }); project.FileEntries.Add(new FileEntry { Path = "description", Text = spec.Description ?? "<na>" }); project.FileEntries.Add(new FileEntry { Path = "namespace", Text = spec.Namespace ?? "<na>" }); project.FileEntries.Add(new FileEntry { Path = "steeltoe version", Text = spec.SteeltoeVersion ?? "<na>" }); project.FileEntries.Add(new FileEntry { Path = "dotnet framework", Text = spec.DotNetFramework ?? "<na>" }); project.FileEntries.Add( new FileEntry { Path = "dotnet template", Text = spec.DotNetTemplate ?? "<na>" }); project.FileEntries.Add(new FileEntry { Path = "language", Text = spec.Language ?? "<na>" }); project.FileEntries.Add(new FileEntry { Path = "packaging", Text = spec.Packaging ?? "<na>" }); project.FileEntries.Add(new FileEntry { Path = "dependencies", Text = spec.Dependencies ?? "<na>" }); return(project); }
public async Task Dependencies_Should_Be_Case_Corrected() { // Arrange var config = new UiConfig { Dependencies = new UiConfig.GroupList { Values = new[] { new UiConfig.Group { Values = new[] { new UiConfig.GroupItem { Id = "CamelCaseDep", }, }, }, }, }, }; var spec = new ProjectSpec { SteeltoeVersion = "0.0", DotNetFramework = "0.0", Packaging = "myarchive", Dependencies = "camelcasedep", }; var controller = new ProjectControllerBuilder() .WithInitializrConfiguration(config) .Build(); // Act var unknown = await controller.GetProjectArchive(spec); var result = Assert.IsType <FileContentResult>(unknown); var projectPackage = Encoding.ASCII.GetString(result.FileContents); // Assert projectPackage.Should().Contain("dependencies=CamelCaseDep"); }
public async Task Null_Archive_Format_Should_Return_500_Internal_Server_Error() { // Arrange var spec = new ProjectSpec { SteeltoeVersion = "0.0", DotNetFramework = "0.0", }; var config = new UiConfig(); var controller = new ProjectControllerBuilder().WithInitializrConfiguration(config).Build(); // Act var unknown = await controller.GetProjectArchive(spec); var result = Assert.IsType <ObjectResult>(unknown); // Assert result.StatusCode.Should().Be(StatusCodes.Status500InternalServerError); result.Value.Should().Be("Default packaging not configured."); }
public void GenerateProject_Should_Rename_Files() { // Arrange var spec = new ProjectSpec { Namespace = "My.Namespace" }; var template = new ProjectTemplate { Manifest = new[] { new FileEntry { Path = "oldName", Rename = "{{Namespace}}" }, }, }; var generator = new StubbleProjectGeneratorBuilder().WithProjectTemplate(template).Build(); // Act var project = generator.GenerateProject(spec); // Assert project.FileEntries[1].Path.Should().Be("My.Namespace"); }
public void Zip_Archive_Format_Should_Return_Zip_Archive() { // Arrange var archiverRegistry = new Mock <IArchiverRegistry>(); archiverRegistry.Setup(reg => reg.Lookup(It.Is <string>(s => s.Equals("zip")))) .Returns(new ZipArchiver()); var controller = new ProjectControllerBuilder().WithArchiverRegistry(archiverRegistry.Object).Build(); var spec = new ProjectSpec { Packaging = "zip" }; // Act var unknown = controller.GetProjectArchive(spec); // Assert var result = Assert.IsType <FileContentResult>(unknown); result.ContentType.Should().Be("application/zip"); result.FileDownloadName.Should().EndWith(".zip"); var stream = new MemoryStream(result.FileContents); new ZipArchive(stream).Should().BeOfType <ZipArchive>(); }