diff --git a/C4InterFlow.Automation/CsvDataProvider.cs b/C4InterFlow.Automation/CsvDataProvider.cs index 506f8b137..456257eea 100644 --- a/C4InterFlow.Automation/CsvDataProvider.cs +++ b/C4InterFlow.Automation/CsvDataProvider.cs @@ -383,6 +383,15 @@ public record Container [Index(5)] public string Description { get; set; } + [Name("Boundary")] + [Index(6)] + public string Boundary { get; set; } + + [Name("Technology")] + [Index(7)] + public string Technology { get; set; } + + public IEnumerable WithAttributes(CsvDataProvider dataProvider) { return dataProvider.ContainerAttributeRecords.Where(x => !string.IsNullOrEmpty(x.Container.Trim()) && @@ -488,6 +497,10 @@ public record Actor [Name("Alias")] [Index(3)] public string Alias { get; set; } + + [Name("Description")] + [Index(4)] + public string Description { get; set; } public bool TryGetType(CsvDataProvider dataProvider, out string? type) { type = dataProvider.ActorTypeRecords.FirstOrDefault(x => x.Name == TypeName)?.Type; diff --git a/C4InterFlow.Automation/Writers/CsvToAnyAaCWriter.cs b/C4InterFlow.Automation/Writers/CsvToAnyAaCWriter.cs index e9a30db8c..de578b691 100644 --- a/C4InterFlow.Automation/Writers/CsvToAnyAaCWriter.cs +++ b/C4InterFlow.Automation/Writers/CsvToAnyAaCWriter.cs @@ -16,7 +16,7 @@ protected CsvToAnyAaCWriter(string architectureInputPath) { ArchitectureInputPath = architectureInputPath; - Log.Information("Reading data from {Path}", ArchitectureInputPath); + Log.Information("Reading CSV data from '{Path}'", ArchitectureInputPath); DataProvider = new CsvDataProvider(ArchitectureInputPath); } diff --git a/C4InterFlow.Automation/Writers/CsvToJObjectAaCWriter.cs b/C4InterFlow.Automation/Writers/CsvToJObjectAaCWriter.cs index 842ec269d..1d9932956 100644 --- a/C4InterFlow.Automation/Writers/CsvToJObjectAaCWriter.cs +++ b/C4InterFlow.Automation/Writers/CsvToJObjectAaCWriter.cs @@ -86,7 +86,10 @@ public CsvToJObjectAaCWriter WithBusinessProcessesCollection() return DataProvider.BusinessProcessRecords.Where(x => !string.IsNullOrEmpty(x.Alias.Trim())); } - public override CsvToJObjectAaCWriter AddActor(string name, string type, string? label = null) + public override CsvToJObjectAaCWriter AddActor(string name, string type, string? label = null) => + AddActor(name, type, label, null); + + public CsvToJObjectAaCWriter AddActor(string name, string type, string? label = null, string? description = null) { var actorsObject = JsonArchitectureAsCode.SelectToken($"{ArchitectureNamespace}.Actors") as JObject; @@ -97,6 +100,10 @@ public override CsvToJObjectAaCWriter AddActor(string name, string type, string? { "Type", type }, { "Label", string.IsNullOrEmpty(label) ? AnyCodeWriter.GetLabel(name) : label }, }; + if (!string.IsNullOrWhiteSpace(description)) + { + actorObject["Description"] = description; + } actorsObject.Add(name, actorObject); } @@ -236,7 +243,10 @@ public override CsvToJObjectAaCWriter AddSoftwareSystemInterface( return this; } - public override CsvToJObjectAaCWriter AddContainer(string softwareSystemName, string name, string? containerType = null, string? label = null, string? description = null) + public override CsvToJObjectAaCWriter AddContainer(string softwareSystemName, string name, + string? containerType = null, string? label = null, string? description = null) => + AddContainer(softwareSystemName, name, containerType, label, description, null, null); + public CsvToJObjectAaCWriter AddContainer(string softwareSystemName, string name, string? containerType = null, string? label = null, string? description = null, string? boundary = null, string? technology = null) { var containersObject = JsonArchitectureAsCode.SelectToken($"{ArchitectureNamespace}.SoftwareSystems.{softwareSystemName}.Containers") as JObject; if (containersObject == null) @@ -263,6 +273,16 @@ public override CsvToJObjectAaCWriter AddContainer(string softwareSystemName, st containerObject.Add("Description", description); } + if (!string.IsNullOrEmpty(boundary)) + { + containerObject.Add("Boundary", boundary); + } + + if (!string.IsNullOrEmpty(technology)) + { + containerObject.Add("Technology", technology); + } + containersObject.Add(name, containerObject); } diff --git a/C4InterFlow.Automation/Writers/CsvToYamlAaCGenerator.cs b/C4InterFlow.Automation/Writers/CsvToYamlAaCGenerator.cs index ea0eae51b..a746efa27 100644 --- a/C4InterFlow.Automation/Writers/CsvToYamlAaCGenerator.cs +++ b/C4InterFlow.Automation/Writers/CsvToYamlAaCGenerator.cs @@ -30,7 +30,7 @@ public override void Execute() s.WithContainers(writer.DataProvider).ToList().ForEach(c => { var containerName = c.Alias.Split('.').Last(); - writer.AddContainer(softwareSystemName, containerName, c.Type, c.Name, c.Description); + writer.AddContainer(softwareSystemName, containerName, c.Type, c.Name, c.Description, c.Boundary, c.Technology); c.WithInterfaces(writer.DataProvider).ToList().ForEach(i => { @@ -66,7 +66,7 @@ public override void Execute() type = nameof(Person); } - writer.AddActor(a.Alias, type, a.Name); + writer.AddActor(a.Alias, type, a.Name, a.Description); writer.WriteArchitecture(Path.Combine(ArchitectureOutputPath, "Actors"), a.Alias); }); diff --git a/C4InterFlow.Cli/Program.cs b/C4InterFlow.Cli/Program.cs index c2589aadb..dc1b1ba34 100644 --- a/C4InterFlow.Cli/Program.cs +++ b/C4InterFlow.Cli/Program.cs @@ -2,21 +2,32 @@ using System.CommandLine.Builder; using System.CommandLine.Parsing; +using System.Runtime.CompilerServices; using C4InterFlow.Cli.Commands; using C4InterFlow.Cli.Extensions; using C4InterFlow.Cli.Root; -var rootCommandBuilder = RootCommandBuilder - .CreateDefaultBuilder(args) - .Configure(context => +[assembly:InternalsVisibleTo("C4InterFlow.Specs")] + +namespace C4InterFlow.Cli; + +internal class Program +{ + public static async Task Main(string[] args) { - context.Add(); - context.Add(); - context.Add(); - context.Add(); - context.Add(); - context.Add(); - }); + var rootCommandBuilder = RootCommandBuilder + .CreateDefaultBuilder(args) + .Configure(context => + { + context.Add(); + context.Add(); + context.Add(); + context.Add(); + context.Add(); + context.Add(); + }); -await new CommandLineBuilder(rootCommandBuilder.Build()) - .UseDefaults().UseLogging().Build().InvokeAsync(args); \ No newline at end of file + return await new CommandLineBuilder(rootCommandBuilder.Build()) + .UseDefaults().UseLogging().Build().InvokeAsync(args); + } +} \ No newline at end of file diff --git a/C4InterFlow.sln b/C4InterFlow.sln index 03efcb920..948f13eba 100644 --- a/C4InterFlow.sln +++ b/C4InterFlow.sln @@ -14,12 +14,18 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution .editorconfig = .editorconfig EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "C4Interflow.Specs", "C4Interflow.Specs\C4Interflow.Specs.csproj", "{F6E21C47-44DA-4569-AE39-6093C9222E03}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {EB78BBEC-4D8A-456C-90F1-920E45FFF982}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EB78BBEC-4D8A-456C-90F1-920E45FFF982}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EB78BBEC-4D8A-456C-90F1-920E45FFF982}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EB78BBEC-4D8A-456C-90F1-920E45FFF982}.Release|Any CPU.Build.0 = Release|Any CPU {B047B5AE-FA9A-453E-B522-F53ED61A0C80}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B047B5AE-FA9A-453E-B522-F53ED61A0C80}.Debug|Any CPU.Build.0 = Debug|Any CPU {B047B5AE-FA9A-453E-B522-F53ED61A0C80}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -28,10 +34,10 @@ Global {5DD6985D-35AC-4154-B09B-2186AB9AA3AD}.Debug|Any CPU.Build.0 = Debug|Any CPU {5DD6985D-35AC-4154-B09B-2186AB9AA3AD}.Release|Any CPU.ActiveCfg = Release|Any CPU {5DD6985D-35AC-4154-B09B-2186AB9AA3AD}.Release|Any CPU.Build.0 = Release|Any CPU - {EB78BBEC-4D8A-456C-90F1-920E45FFF982}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EB78BBEC-4D8A-456C-90F1-920E45FFF982}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EB78BBEC-4D8A-456C-90F1-920E45FFF982}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EB78BBEC-4D8A-456C-90F1-920E45FFF982}.Release|Any CPU.Build.0 = Release|Any CPU + {F6E21C47-44DA-4569-AE39-6093C9222E03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F6E21C47-44DA-4569-AE39-6093C9222E03}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F6E21C47-44DA-4569-AE39-6093C9222E03}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F6E21C47-44DA-4569-AE39-6093C9222E03}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/C4Interflow.Specs/C4Interflow.Specs.csproj b/C4Interflow.Specs/C4Interflow.Specs.csproj new file mode 100644 index 000000000..89a1193cb --- /dev/null +++ b/C4Interflow.Specs/C4Interflow.Specs.csproj @@ -0,0 +1,29 @@ + + + + net8.0 + enable + enable + + false + true + + + + + + + + + + + + + + + + + + + + diff --git a/C4Interflow.Specs/DrawDiagrams/Examples.feature b/C4Interflow.Specs/DrawDiagrams/Examples.feature new file mode 100644 index 000000000..4db914929 --- /dev/null +++ b/C4Interflow.Specs/DrawDiagrams/Examples.feature @@ -0,0 +1,23 @@ +Feature: Drawing Diagrams + Test out different combinations of drawing diagrams + +Scenario: Verify Examples + Given the 'draw-diagrams' command + And the '' example + And the path '' + And the reader strategy is '' + And the interfaces are '' + And the business processes are '' + And the level of details is '' + And send the output to '' + When invoking the commandline for those arguments + Then all files under '' should match example path '' + + Examples: + | Description | Example | Path | ReaderStrategy | Interfaces | BusinessProcesses | LevelOfDetails | OutputPath | ApprovedOutPath | + | Banking System via Yaml | Internet Banking System | CSV\Architecture\Yaml | Yaml | BigBankPlc.SoftwareSystems.*.Containers.*.Interfaces | BigBankPlc.BusinessProcesses.* | context container | _bankingYaml | Internet Banking System\CSV\Diagrams | + | Banking System via Json | Internet Banking System | CSV\Architecture\Json | Json | BigBankPlc.SoftwareSystems.*.Containers.*.Interfaces | BigBankPlc.BusinessProcesses.* | context container | _bankingJson | Internet Banking System\CSV\Diagrams | + | ECommerce via Yaml | E-Commerce Platform | Yaml\Architecture | Yaml | ECommercePlatform.*.*.SoftwareSystems.*.Interfaces.* ECommercePlatform.*.*.SoftwareSystems.*.Containers.*.Interfaces.* | ECommercePlatform.BusinessProcesses.* | context container | _ecommerceYaml | E-Commerce Platform\Yaml\Diagrams | + | TraderX via Json | TraderX | CSV\Architecture\Json | Json | TraderXExample.SoftwareSystems.*.Containers.*.Interfaces.* | TraderXExample.BusinessProcesses.* | context container | _traderXJson | TraderX\CSV\Diagrams | + | TraderX via Yaml | TraderX | CSV\Architecture\Yaml | Yaml | TraderXExample.SoftwareSystems.*.Containers.*.Interfaces.* | TraderXExample.BusinessProcesses.* | context container | _traderXYaml | TraderX\CSV\Diagrams | + | ToDoApp via Yaml | ToDoApp | Yaml\Architecture | Yaml | ToDoAppExample.SoftwareSystems.*.Containers.*.Interfaces.* ToDoAppExample.SoftwareSystems.*.Interfaces.* | | container | _todoYaml | ToDoApp\Yaml\Diagrams | diff --git a/C4Interflow.Specs/DrawDiagrams/Examples.feature.cs b/C4Interflow.Specs/DrawDiagrams/Examples.feature.cs new file mode 100644 index 000000000..acd073a7e --- /dev/null +++ b/C4Interflow.Specs/DrawDiagrams/Examples.feature.cs @@ -0,0 +1,278 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by SpecFlow (https://www.specflow.org/). +// SpecFlow Version:3.9.0.0 +// SpecFlow Generator Version:3.9.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +#region Designer generated code +#pragma warning disable +namespace C4Interflow.Specs.DrawDiagrams +{ + using TechTalk.SpecFlow; + using System; + using System.Linq; + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "3.9.0.0")] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestClassAttribute()] + public partial class DrawingDiagramsFeature + { + + private static TechTalk.SpecFlow.ITestRunner testRunner; + + private Microsoft.VisualStudio.TestTools.UnitTesting.TestContext _testContext; + + private static string[] featureTags = ((string[])(null)); + +#line 1 "Examples.feature" +#line hidden + + public virtual Microsoft.VisualStudio.TestTools.UnitTesting.TestContext TestContext + { + get + { + return this._testContext; + } + set + { + this._testContext = value; + } + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.ClassInitializeAttribute()] + public static void FeatureSetup(Microsoft.VisualStudio.TestTools.UnitTesting.TestContext testContext) + { + testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); + TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo("en-US"), "DrawDiagrams", "Drawing Diagrams", "\tTest out different combinations of drawing diagrams", ProgrammingLanguage.CSharp, featureTags); + testRunner.OnFeatureStart(featureInfo); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.ClassCleanupAttribute()] + public static void FeatureTearDown() + { + testRunner.OnFeatureEnd(); + testRunner = null; + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestInitializeAttribute()] + public void TestInitialize() + { + if (((testRunner.FeatureContext != null) + && (testRunner.FeatureContext.FeatureInfo.Title != "Drawing Diagrams"))) + { + global::C4Interflow.Specs.DrawDiagrams.DrawingDiagramsFeature.FeatureSetup(null); + } + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestCleanupAttribute()] + public void TestTearDown() + { + testRunner.OnScenarioEnd(); + } + + public void ScenarioInitialize(TechTalk.SpecFlow.ScenarioInfo scenarioInfo) + { + testRunner.OnScenarioInitialize(scenarioInfo); + testRunner.ScenarioContext.ScenarioContainer.RegisterInstanceAs(_testContext); + } + + public void ScenarioStart() + { + testRunner.OnScenarioStart(); + } + + public void ScenarioCleanup() + { + testRunner.CollectScenarioErrors(); + } + + public virtual void VerifyExamples(string description, string example, string path, string readerStrategy, string interfaces, string businessProcesses, string levelOfDetails, string outputPath, string approvedOutPath, string[] exampleTags) + { + string[] tagsOfScenario = exampleTags; + System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new System.Collections.Specialized.OrderedDictionary(); + argumentsOfScenario.Add("Description", description); + argumentsOfScenario.Add("Example", example); + argumentsOfScenario.Add("Path", path); + argumentsOfScenario.Add("ReaderStrategy", readerStrategy); + argumentsOfScenario.Add("Interfaces", interfaces); + argumentsOfScenario.Add("BusinessProcesses", businessProcesses); + argumentsOfScenario.Add("LevelOfDetails", levelOfDetails); + argumentsOfScenario.Add("OutputPath", outputPath); + argumentsOfScenario.Add("ApprovedOutPath", approvedOutPath); + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Verify Examples", null, tagsOfScenario, argumentsOfScenario, featureTags); +#line 4 +this.ScenarioInitialize(scenarioInfo); +#line hidden + if ((TagHelper.ContainsIgnoreTag(tagsOfScenario) || TagHelper.ContainsIgnoreTag(featureTags))) + { + testRunner.SkipScenario(); + } + else + { + this.ScenarioStart(); +#line 5 + testRunner.Given("the \'draw-diagrams\' command", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); +#line hidden +#line 6 + testRunner.And(string.Format("the \'{0}\' example", example), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line hidden +#line 7 + testRunner.And(string.Format("the path \'{0}\'", path), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line hidden +#line 8 + testRunner.And(string.Format("the reader strategy is \'{0}\'", readerStrategy), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line hidden +#line 9 + testRunner.And(string.Format("the interfaces are \'{0}\'", interfaces), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line hidden +#line 10 + testRunner.And(string.Format("the business processes are \'{0}\'", businessProcesses), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line hidden +#line 11 + testRunner.And(string.Format("the level of details is \'{0}\'", levelOfDetails), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line hidden +#line 12 + testRunner.And(string.Format("send the output to \'{0}\'", outputPath), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line hidden +#line 13 + testRunner.When("invoking the commandline for those arguments", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); +#line hidden +#line 14 + testRunner.Then(string.Format("all files under \'{0}\' should match example path \'{1}\'", outputPath, approvedOutPath), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden + } + this.ScenarioCleanup(); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Verify Examples: Banking System via Yaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Drawing Diagrams")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "Banking System via Yaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Description", "Banking System via Yaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Example", "Internet Banking System")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Path", "CSV\\Architecture\\Yaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:ReaderStrategy", "Yaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Interfaces", "BigBankPlc.SoftwareSystems.*.Containers.*.Interfaces")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:BusinessProcesses", "BigBankPlc.BusinessProcesses.*")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:LevelOfDetails", "context container")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:OutputPath", "_bankingYaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:ApprovedOutPath", "Internet Banking System\\CSV\\Diagrams")] + public void VerifyExamples_BankingSystemViaYaml() + { +#line 4 +this.VerifyExamples("Banking System via Yaml", "Internet Banking System", "CSV\\Architecture\\Yaml", "Yaml", "BigBankPlc.SoftwareSystems.*.Containers.*.Interfaces", "BigBankPlc.BusinessProcesses.*", "context container", "_bankingYaml", "Internet Banking System\\CSV\\Diagrams", ((string[])(null))); +#line hidden + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Verify Examples: Banking System via Json")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Drawing Diagrams")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "Banking System via Json")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Description", "Banking System via Json")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Example", "Internet Banking System")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Path", "CSV\\Architecture\\Json")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:ReaderStrategy", "Json")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Interfaces", "BigBankPlc.SoftwareSystems.*.Containers.*.Interfaces")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:BusinessProcesses", "BigBankPlc.BusinessProcesses.*")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:LevelOfDetails", "context container")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:OutputPath", "_bankingJson")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:ApprovedOutPath", "Internet Banking System\\CSV\\Diagrams")] + public void VerifyExamples_BankingSystemViaJson() + { +#line 4 +this.VerifyExamples("Banking System via Json", "Internet Banking System", "CSV\\Architecture\\Json", "Json", "BigBankPlc.SoftwareSystems.*.Containers.*.Interfaces", "BigBankPlc.BusinessProcesses.*", "context container", "_bankingJson", "Internet Banking System\\CSV\\Diagrams", ((string[])(null))); +#line hidden + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Verify Examples: ECommerce via Yaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Drawing Diagrams")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "ECommerce via Yaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Description", "ECommerce via Yaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Example", "E-Commerce Platform")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Path", "Yaml\\Architecture")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:ReaderStrategy", "Yaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Interfaces", "ECommercePlatform.*.*.SoftwareSystems.*.Interfaces.* ECommercePlatform.*.*.Softwa" + + "reSystems.*.Containers.*.Interfaces.*")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:BusinessProcesses", "ECommercePlatform.BusinessProcesses.*")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:LevelOfDetails", "context container")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:OutputPath", "_ecommerceYaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:ApprovedOutPath", "E-Commerce Platform\\Yaml\\Diagrams")] + public void VerifyExamples_ECommerceViaYaml() + { +#line 4 +this.VerifyExamples("ECommerce via Yaml", "E-Commerce Platform", "Yaml\\Architecture", "Yaml", "ECommercePlatform.*.*.SoftwareSystems.*.Interfaces.* ECommercePlatform.*.*.Softwa" + + "reSystems.*.Containers.*.Interfaces.*", "ECommercePlatform.BusinessProcesses.*", "context container", "_ecommerceYaml", "E-Commerce Platform\\Yaml\\Diagrams", ((string[])(null))); +#line hidden + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Verify Examples: TraderX via Json")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Drawing Diagrams")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "TraderX via Json")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Description", "TraderX via Json")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Example", "TraderX")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Path", "CSV\\Architecture\\Json")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:ReaderStrategy", "Json")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Interfaces", "TraderXExample.SoftwareSystems.*.Containers.*.Interfaces.*")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:BusinessProcesses", "TraderXExample.BusinessProcesses.*")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:LevelOfDetails", "context container")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:OutputPath", "_traderXJson")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:ApprovedOutPath", "TraderX\\CSV\\Diagrams")] + public void VerifyExamples_TraderXViaJson() + { +#line 4 +this.VerifyExamples("TraderX via Json", "TraderX", "CSV\\Architecture\\Json", "Json", "TraderXExample.SoftwareSystems.*.Containers.*.Interfaces.*", "TraderXExample.BusinessProcesses.*", "context container", "_traderXJson", "TraderX\\CSV\\Diagrams", ((string[])(null))); +#line hidden + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Verify Examples: TraderX via Yaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Drawing Diagrams")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "TraderX via Yaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Description", "TraderX via Yaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Example", "TraderX")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Path", "CSV\\Architecture\\Yaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:ReaderStrategy", "Yaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Interfaces", "TraderXExample.SoftwareSystems.*.Containers.*.Interfaces.*")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:BusinessProcesses", "TraderXExample.BusinessProcesses.*")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:LevelOfDetails", "context container")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:OutputPath", "_traderXYaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:ApprovedOutPath", "TraderX\\CSV\\Diagrams")] + public void VerifyExamples_TraderXViaYaml() + { +#line 4 +this.VerifyExamples("TraderX via Yaml", "TraderX", "CSV\\Architecture\\Yaml", "Yaml", "TraderXExample.SoftwareSystems.*.Containers.*.Interfaces.*", "TraderXExample.BusinessProcesses.*", "context container", "_traderXYaml", "TraderX\\CSV\\Diagrams", ((string[])(null))); +#line hidden + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Verify Examples: ToDoApp via Yaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Drawing Diagrams")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "ToDoApp via Yaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Description", "ToDoApp via Yaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Example", "ToDoApp")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Path", "Yaml\\Architecture")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:ReaderStrategy", "Yaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Interfaces", "ToDoAppExample.SoftwareSystems.*.Containers.*.Interfaces.* ToDoAppExample.Softwar" + + "eSystems.*.Interfaces.*")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:BusinessProcesses", "")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:LevelOfDetails", "container")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:OutputPath", "_todoYaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:ApprovedOutPath", "ToDoApp\\Yaml\\Diagrams")] + public void VerifyExamples_ToDoAppViaYaml() + { +#line 4 +this.VerifyExamples("ToDoApp via Yaml", "ToDoApp", "Yaml\\Architecture", "Yaml", "ToDoAppExample.SoftwareSystems.*.Containers.*.Interfaces.* ToDoAppExample.Softwar" + + "eSystems.*.Interfaces.*", "", "container", "_todoYaml", "ToDoApp\\Yaml\\Diagrams", ((string[])(null))); +#line hidden + } + } +} +#pragma warning restore +#endregion diff --git a/C4Interflow.Specs/ExecuteAaCStrategy/Examples.feature b/C4Interflow.Specs/ExecuteAaCStrategy/Examples.feature new file mode 100644 index 000000000..9965bd90e --- /dev/null +++ b/C4Interflow.Specs/ExecuteAaCStrategy/Examples.feature @@ -0,0 +1,16 @@ +Feature: Execute Architect-as-Code (AaC) Strategy + Take some input and generate the output for drawing diagrams. + +Scenario: Verify Examples + Given the 'execute-aac-strategy' command + And the '' example + And the parameter of 'aac-input-path' set to Example '' + And the writer strategy is '' + And the AaC root namespace of '' + And send the AaC output to '' + When invoking the commandline for those arguments + Then all files under '' should match example path '' + + Examples: + | Description | Example | RootNamespace | Path | WriterStrategy | OutputPath | ApprovedOutPath | + | Banking System via Yaml | Internet Banking System | BigBankPlc | CSV\Architecture Catalogue - CSV Export | CsvToYaml | _aac_bankingYaml | Internet Banking System\Yaml\Architecture | diff --git a/C4Interflow.Specs/ExecuteAaCStrategy/Examples.feature.cs b/C4Interflow.Specs/ExecuteAaCStrategy/Examples.feature.cs new file mode 100644 index 000000000..9092296b0 --- /dev/null +++ b/C4Interflow.Specs/ExecuteAaCStrategy/Examples.feature.cs @@ -0,0 +1,164 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by SpecFlow (https://www.specflow.org/). +// SpecFlow Version:3.9.0.0 +// SpecFlow Generator Version:3.9.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +#region Designer generated code +#pragma warning disable +namespace C4Interflow.Specs.ExecuteAaCStrategy +{ + using TechTalk.SpecFlow; + using System; + using System.Linq; + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "3.9.0.0")] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestClassAttribute()] + public partial class ExecuteArchitect_As_CodeAaCStrategyFeature + { + + private static TechTalk.SpecFlow.ITestRunner testRunner; + + private Microsoft.VisualStudio.TestTools.UnitTesting.TestContext _testContext; + + private static string[] featureTags = ((string[])(null)); + +#line 1 "Examples.feature" +#line hidden + + public virtual Microsoft.VisualStudio.TestTools.UnitTesting.TestContext TestContext + { + get + { + return this._testContext; + } + set + { + this._testContext = value; + } + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.ClassInitializeAttribute()] + public static void FeatureSetup(Microsoft.VisualStudio.TestTools.UnitTesting.TestContext testContext) + { + testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); + TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo("en-US"), "ExecuteAaCStrategy", "Execute Architect-as-Code (AaC) Strategy", " Take some input and generate the output for drawing diagrams.", ProgrammingLanguage.CSharp, featureTags); + testRunner.OnFeatureStart(featureInfo); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.ClassCleanupAttribute()] + public static void FeatureTearDown() + { + testRunner.OnFeatureEnd(); + testRunner = null; + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestInitializeAttribute()] + public void TestInitialize() + { + if (((testRunner.FeatureContext != null) + && (testRunner.FeatureContext.FeatureInfo.Title != "Execute Architect-as-Code (AaC) Strategy"))) + { + global::C4Interflow.Specs.ExecuteAaCStrategy.ExecuteArchitect_As_CodeAaCStrategyFeature.FeatureSetup(null); + } + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestCleanupAttribute()] + public void TestTearDown() + { + testRunner.OnScenarioEnd(); + } + + public void ScenarioInitialize(TechTalk.SpecFlow.ScenarioInfo scenarioInfo) + { + testRunner.OnScenarioInitialize(scenarioInfo); + testRunner.ScenarioContext.ScenarioContainer.RegisterInstanceAs(_testContext); + } + + public void ScenarioStart() + { + testRunner.OnScenarioStart(); + } + + public void ScenarioCleanup() + { + testRunner.CollectScenarioErrors(); + } + + public virtual void VerifyExamples(string description, string example, string rootNamespace, string path, string writerStrategy, string outputPath, string approvedOutPath, string[] exampleTags) + { + string[] tagsOfScenario = exampleTags; + System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new System.Collections.Specialized.OrderedDictionary(); + argumentsOfScenario.Add("Description", description); + argumentsOfScenario.Add("Example", example); + argumentsOfScenario.Add("RootNamespace", rootNamespace); + argumentsOfScenario.Add("Path", path); + argumentsOfScenario.Add("WriterStrategy", writerStrategy); + argumentsOfScenario.Add("OutputPath", outputPath); + argumentsOfScenario.Add("ApprovedOutPath", approvedOutPath); + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Verify Examples", null, tagsOfScenario, argumentsOfScenario, featureTags); +#line 4 +this.ScenarioInitialize(scenarioInfo); +#line hidden + if ((TagHelper.ContainsIgnoreTag(tagsOfScenario) || TagHelper.ContainsIgnoreTag(featureTags))) + { + testRunner.SkipScenario(); + } + else + { + this.ScenarioStart(); +#line 5 + testRunner.Given("the \'execute-aac-strategy\' command", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); +#line hidden +#line 6 + testRunner.And(string.Format("the \'{0}\' example", example), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line hidden +#line 7 + testRunner.And(string.Format("the parameter of \'aac-input-path\' set to Example \'{0}\'", path), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line hidden +#line 8 + testRunner.And(string.Format("the writer strategy is \'{0}\'", writerStrategy), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line hidden +#line 9 + testRunner.And(string.Format("the AaC root namespace of \'{0}\'", rootNamespace), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line hidden +#line 10 + testRunner.And(string.Format("send the AaC output to \'{0}\'", outputPath), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line hidden +#line 11 + testRunner.When("invoking the commandline for those arguments", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); +#line hidden +#line 12 + testRunner.Then(string.Format("all files under \'{0}\' should match example path \'{1}\'", outputPath, approvedOutPath), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden + } + this.ScenarioCleanup(); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Verify Examples: Banking System via Yaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Execute Architect-as-Code (AaC) Strategy")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "Banking System via Yaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Description", "Banking System via Yaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Example", "Internet Banking System")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:RootNamespace", "BigBankPlc")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:Path", "CSV\\Architecture Catalogue - CSV Export")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:WriterStrategy", "CsvToYaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:OutputPath", "_aac_bankingYaml")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:ApprovedOutPath", "Internet Banking System\\Yaml\\Architecture")] + public void VerifyExamples_BankingSystemViaYaml() + { +#line 4 +this.VerifyExamples("Banking System via Yaml", "Internet Banking System", "BigBankPlc", "CSV\\Architecture Catalogue - CSV Export", "CsvToYaml", "_aac_bankingYaml", "Internet Banking System\\Yaml\\Architecture", ((string[])(null))); +#line hidden + } + } +} +#pragma warning restore +#endregion diff --git a/C4Interflow.Specs/PublishSite/Examples.feature b/C4Interflow.Specs/PublishSite/Examples.feature new file mode 100644 index 000000000..3c53ad48a --- /dev/null +++ b/C4Interflow.Specs/PublishSite/Examples.feature @@ -0,0 +1,2 @@ +Feature: Publish Site + Take some input and generate a site diff --git a/C4Interflow.Specs/PublishSite/Examples.feature.cs b/C4Interflow.Specs/PublishSite/Examples.feature.cs new file mode 100644 index 000000000..8ddc177c2 --- /dev/null +++ b/C4Interflow.Specs/PublishSite/Examples.feature.cs @@ -0,0 +1,96 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by SpecFlow (https://www.specflow.org/). +// SpecFlow Version:3.9.0.0 +// SpecFlow Generator Version:3.9.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +#region Designer generated code +#pragma warning disable +namespace C4Interflow.Specs.PublishSite +{ + using TechTalk.SpecFlow; + using System; + using System.Linq; + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "3.9.0.0")] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestClassAttribute()] + public partial class PublishSiteFeature + { + + private static TechTalk.SpecFlow.ITestRunner testRunner; + + private Microsoft.VisualStudio.TestTools.UnitTesting.TestContext _testContext; + + private static string[] featureTags = ((string[])(null)); + +#line 1 "Examples.feature" +#line hidden + + public virtual Microsoft.VisualStudio.TestTools.UnitTesting.TestContext TestContext + { + get + { + return this._testContext; + } + set + { + this._testContext = value; + } + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.ClassInitializeAttribute()] + public static void FeatureSetup(Microsoft.VisualStudio.TestTools.UnitTesting.TestContext testContext) + { + testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); + TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo("en-US"), "PublishSite", "Publish Site", " Take some input and generate a site", ProgrammingLanguage.CSharp, featureTags); + testRunner.OnFeatureStart(featureInfo); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.ClassCleanupAttribute()] + public static void FeatureTearDown() + { + testRunner.OnFeatureEnd(); + testRunner = null; + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestInitializeAttribute()] + public void TestInitialize() + { + if (((testRunner.FeatureContext != null) + && (testRunner.FeatureContext.FeatureInfo.Title != "Publish Site"))) + { + global::C4Interflow.Specs.PublishSite.PublishSiteFeature.FeatureSetup(null); + } + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestCleanupAttribute()] + public void TestTearDown() + { + testRunner.OnScenarioEnd(); + } + + public void ScenarioInitialize(TechTalk.SpecFlow.ScenarioInfo scenarioInfo) + { + testRunner.OnScenarioInitialize(scenarioInfo); + testRunner.ScenarioContext.ScenarioContainer.RegisterInstanceAs(_testContext); + } + + public void ScenarioStart() + { + testRunner.OnScenarioStart(); + } + + public void ScenarioCleanup() + { + testRunner.CollectScenarioErrors(); + } + } +} +#pragma warning restore +#endregion diff --git a/C4Interflow.Specs/Query/ByInput.feature b/C4Interflow.Specs/Query/ByInput.feature new file mode 100644 index 000000000..7e9e9a29b --- /dev/null +++ b/C4Interflow.Specs/Query/ByInput.feature @@ -0,0 +1,2 @@ +Feature: Query By Input + Take some input and query the architecture by the inputs. diff --git a/C4Interflow.Specs/Query/ByInput.feature.cs b/C4Interflow.Specs/Query/ByInput.feature.cs new file mode 100644 index 000000000..24b716534 --- /dev/null +++ b/C4Interflow.Specs/Query/ByInput.feature.cs @@ -0,0 +1,96 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by SpecFlow (https://www.specflow.org/). +// SpecFlow Version:3.9.0.0 +// SpecFlow Generator Version:3.9.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +#region Designer generated code +#pragma warning disable +namespace C4Interflow.Specs.Query +{ + using TechTalk.SpecFlow; + using System; + using System.Linq; + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "3.9.0.0")] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestClassAttribute()] + public partial class QueryByInputFeature + { + + private static TechTalk.SpecFlow.ITestRunner testRunner; + + private Microsoft.VisualStudio.TestTools.UnitTesting.TestContext _testContext; + + private static string[] featureTags = ((string[])(null)); + +#line 1 "ByInput.feature" +#line hidden + + public virtual Microsoft.VisualStudio.TestTools.UnitTesting.TestContext TestContext + { + get + { + return this._testContext; + } + set + { + this._testContext = value; + } + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.ClassInitializeAttribute()] + public static void FeatureSetup(Microsoft.VisualStudio.TestTools.UnitTesting.TestContext testContext) + { + testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); + TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo("en-US"), "Query", "Query By Input", " Take some input and query the architecture by the inputs.", ProgrammingLanguage.CSharp, featureTags); + testRunner.OnFeatureStart(featureInfo); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.ClassCleanupAttribute()] + public static void FeatureTearDown() + { + testRunner.OnFeatureEnd(); + testRunner = null; + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestInitializeAttribute()] + public void TestInitialize() + { + if (((testRunner.FeatureContext != null) + && (testRunner.FeatureContext.FeatureInfo.Title != "Query By Input"))) + { + global::C4Interflow.Specs.Query.QueryByInputFeature.FeatureSetup(null); + } + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestCleanupAttribute()] + public void TestTearDown() + { + testRunner.OnScenarioEnd(); + } + + public void ScenarioInitialize(TechTalk.SpecFlow.ScenarioInfo scenarioInfo) + { + testRunner.OnScenarioInitialize(scenarioInfo); + testRunner.ScenarioContext.ScenarioContainer.RegisterInstanceAs(_testContext); + } + + public void ScenarioStart() + { + testRunner.OnScenarioStart(); + } + + public void ScenarioCleanup() + { + testRunner.CollectScenarioErrors(); + } + } +} +#pragma warning restore +#endregion diff --git a/C4Interflow.Specs/Query/UseFlows.feature b/C4Interflow.Specs/Query/UseFlows.feature new file mode 100644 index 000000000..1d322770e --- /dev/null +++ b/C4Interflow.Specs/Query/UseFlows.feature @@ -0,0 +1,2 @@ +Feature: Query By Flow + Take some input and query the architecture by the flow. diff --git a/C4Interflow.Specs/Query/UseFlows.feature.cs b/C4Interflow.Specs/Query/UseFlows.feature.cs new file mode 100644 index 000000000..6273a4b65 --- /dev/null +++ b/C4Interflow.Specs/Query/UseFlows.feature.cs @@ -0,0 +1,96 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by SpecFlow (https://www.specflow.org/). +// SpecFlow Version:3.9.0.0 +// SpecFlow Generator Version:3.9.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +#region Designer generated code +#pragma warning disable +namespace C4Interflow.Specs.Query +{ + using TechTalk.SpecFlow; + using System; + using System.Linq; + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "3.9.0.0")] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestClassAttribute()] + public partial class QueryByFlowFeature + { + + private static TechTalk.SpecFlow.ITestRunner testRunner; + + private Microsoft.VisualStudio.TestTools.UnitTesting.TestContext _testContext; + + private static string[] featureTags = ((string[])(null)); + +#line 1 "UseFlows.feature" +#line hidden + + public virtual Microsoft.VisualStudio.TestTools.UnitTesting.TestContext TestContext + { + get + { + return this._testContext; + } + set + { + this._testContext = value; + } + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.ClassInitializeAttribute()] + public static void FeatureSetup(Microsoft.VisualStudio.TestTools.UnitTesting.TestContext testContext) + { + testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); + TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo("en-US"), "Query", "Query By Flow", " Take some input and query the architecture by the flow.", ProgrammingLanguage.CSharp, featureTags); + testRunner.OnFeatureStart(featureInfo); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.ClassCleanupAttribute()] + public static void FeatureTearDown() + { + testRunner.OnFeatureEnd(); + testRunner = null; + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestInitializeAttribute()] + public void TestInitialize() + { + if (((testRunner.FeatureContext != null) + && (testRunner.FeatureContext.FeatureInfo.Title != "Query By Flow"))) + { + global::C4Interflow.Specs.Query.QueryByFlowFeature.FeatureSetup(null); + } + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestCleanupAttribute()] + public void TestTearDown() + { + testRunner.OnScenarioEnd(); + } + + public void ScenarioInitialize(TechTalk.SpecFlow.ScenarioInfo scenarioInfo) + { + testRunner.OnScenarioInitialize(scenarioInfo); + testRunner.ScenarioContext.ScenarioContainer.RegisterInstanceAs(_testContext); + } + + public void ScenarioStart() + { + testRunner.OnScenarioStart(); + } + + public void ScenarioCleanup() + { + testRunner.CollectScenarioErrors(); + } + } +} +#pragma warning restore +#endregion diff --git a/C4Interflow.Specs/Steps/CliDriver.cs b/C4Interflow.Specs/Steps/CliDriver.cs new file mode 100644 index 000000000..3f77add87 --- /dev/null +++ b/C4Interflow.Specs/Steps/CliDriver.cs @@ -0,0 +1,104 @@ +namespace C4Interflow.Specs.Steps +{ + public class CliDriver + { + public CliDriver(Action? logger = null) + { + _cliArgs = []; + _paramsArg = []; + _logger = logger ?? (m => { }); + } + + private readonly List _cliArgs; + private readonly Dictionary _paramsArg; + private readonly Action _logger; + private string? _workingDirectory; + + public string SampleRootName { get; set; } + + public string WorkingDirectory + { + get => _workingDirectory ?? Directory.GetCurrentDirectory(); + set => _workingDirectory = value; + } + + public async Task BuildAndInvoke() + { + if (_paramsArg.Count > 0) + { + _cliArgs.Add("--params"); + _cliArgs.AddRange(_paramsArg.Select(kvp => $"{kvp.Key}={kvp.Value}")); + } + var args = _cliArgs.ToArray(); + _logger(string.Join(" ", args)); + return await C4InterFlow.Cli.Program.Main(args); + } + + public void WithAaCInputPath(string path) + { + _cliArgs.Add("--aac-input-paths"); + _cliArgs.Add(Path.Join(WorkingDirectory, SampleRootName, path)); + } + + public void WithAaCReaderStrategy(Type readerType) + { + _cliArgs.Add("--aac-reader-strategy"); + _cliArgs.Add(readerType.AssemblyQualifiedName); + } + + public void WithInterfaces(string interfaceQuery) + { + _cliArgs.Add("--interfaces"); + _cliArgs.AddRange(interfaceQuery.Split(' ')); + } + + public void WithBusinessProcesses(string businessQuery) + { + _cliArgs.Add("--business-processes"); + _cliArgs.AddRange(businessQuery.Split(' ')); + } + + public void WithLevelOfDetails(string levelOfDetails) + { + _cliArgs.Add("--levels-of-details"); + _cliArgs.AddRange(levelOfDetails.Split(' ')); + } + + public void OutputTo(string outputPath) + { + _cliArgs.Add("--output-dir"); + _cliArgs.Add(outputPath); + } + public void AacOutputTo(string outputPath) + { + _cliArgs.Add("--aac-output-path"); + _cliArgs.Add(outputPath); + } + + public void ForCommand(string rootCommand) + { + _cliArgs.Clear(); + _cliArgs.Add(rootCommand); + } + + public void WithAacWriterStrategy(Type writerType) + { + _cliArgs.Add("--aac-writer-strategy"); + _cliArgs.Add(writerType.AssemblyQualifiedName); + } + + public void WithAaCRootNamespace(string rootNamespace) + { + _cliArgs.Add("--aac-root-namespace"); + _cliArgs.Add(rootNamespace); + } + + public void WithPathParameter(string name, string value) => + WithParameter(name, Path.Join(WorkingDirectory, SampleRootName, value)); + + public void WithParameter(string name, string value) + { + _paramsArg.Add(name, value); + } + } +} \ No newline at end of file diff --git a/C4Interflow.Specs/Steps/EnvironmentStepDefinitions.cs b/C4Interflow.Specs/Steps/EnvironmentStepDefinitions.cs new file mode 100644 index 000000000..a04dcb6a2 --- /dev/null +++ b/C4Interflow.Specs/Steps/EnvironmentStepDefinitions.cs @@ -0,0 +1,216 @@ +using System.Reflection; +using C4InterFlow.Automation.Readers; +using C4InterFlow.Automation.Writers; +using TechTalk.SpecFlow; + + +[assembly: Parallelize(Scope = ExecutionScope.ClassLevel)] + +namespace C4Interflow.Specs.Steps +{ + [Binding] + public sealed class EnvironmentStepDefinitions + { + private readonly ScenarioContext _scenarioContext; + private readonly TestContext _testContext; + + public EnvironmentStepDefinitions(ScenarioContext scenarioContext, TestContext testContext) + { + _scenarioContext = scenarioContext; + _testContext = testContext; + } + + [BeforeScenario] + public void UpdateScenarioRun(ITestRunnerManager testRunnerManager) + { + _scenarioContext.SetTempPath(Path.Combine(Path.GetTempPath(), Assembly.GetExecutingAssembly().GetName().Name, + Guid.NewGuid().ToString("N"))); + } + + [AfterScenario] + public void AfterScenario() + { + var exitCode = _scenarioContext.GetCliExitCode() ?? int.MinValue; + Assert.AreEqual(0, exitCode, "The command exited with a non-zero value."); + } + + [Given(@"the '(.+)' command")] + public void ForCommand(string command) + { + var driver = new CliDriver(m => _testContext.WriteLine($"[DRIVER]: {m}")); + driver.ForCommand(command); + _scenarioContext.SetDriver(driver); + } + + [Given(@"the AaC root namespace of '(.*)'")] + public void GivenTheAaCRootNamespaceOf(string rootNamespace) + { + _scenarioContext.GetDriver().WithAaCRootNamespace(rootNamespace); + } + + [Given(@"the parameter of '(.*)' set to (Example )'(.*)'")] + public void GivenTheParameterOfSetTo(string name, string isExample, string value) + { + var driver = _scenarioContext.GetDriver(); + if (string.IsNullOrWhiteSpace(isExample)) + { + driver.WithParameter(name, value); + } + else + { + driver.WithPathParameter(name, value); + } + } + + [Given(@"the '(.+)' example")] + public void GivenTheExample(string example) + { + var driver = _scenarioContext.GetDriver(); + driver.WorkingDirectory = + Path.GetFullPath("../../../../../Samples", Assembly.GetExecutingAssembly().Location); + driver.SampleRootName = example; + } + + [Given(@"the path '(.+)'")] + public void GivenThePath(string path) + { + _scenarioContext.GetDriver().WithAaCInputPath(path); + } + + [Given(@"the reader strategy is '(.+)'")] + public void GivenTheReaderStrategy(string strategy) + { + var driver = _scenarioContext.GetDriver(); + switch (strategy) + { + case "Yaml": + driver.WithAaCReaderStrategy(typeof(YamlAaCReaderStrategy)); + break; + case "Json": + driver.WithAaCReaderStrategy(typeof(JsonAaCReaderStrategy)); + break; + default: + Assert.Fail($"Unknown strategy: '{strategy}'"); + break; + } + } + + [Given(@"the interfaces are '(.*)'")] + public void GivenTheInterfacesAre(string interfaceQuery) + { + _scenarioContext.GetDriver().WithInterfaces(interfaceQuery); + } + + [Given(@"the business processes are '(.*)'")] + public void GivenTheBusinessProcessesAre(string businessQuery) + { + var driver = _scenarioContext.GetDriver(); + driver.WithBusinessProcesses(businessQuery); + } + + [Given(@"the writer strategy is '(.*)'")] + public void GivenTheWriterStrategyIs(string strategy) + { + var driver = _scenarioContext.GetDriver(); + switch (strategy) + { + case "CsvToYaml": + driver.WithAacWriterStrategy(typeof(CsvToYamlAaCGenerator)); + break; + default: + Assert.Fail($"Unknown writer strategy: '{strategy}'"); + break; + } + } + + [Given(@"the level of details is '(.*)'")] + public void GivenTheLevelOfDetailsIs(string levelOfDetails) + { + var driver = _scenarioContext.GetDriver(); + driver.WithLevelOfDetails(levelOfDetails); + } + + [Given(@"send the AaC output to '(.*)'")] + public void GivenSendTheAaCOutputTo(string outputPath) + { + SendOutputTo(outputPath, true); + } + + [Given(@"send the output to '(.*)'")] + public void GivenSendTheOutputTo(string outputPath) + { + SendOutputTo(outputPath, false); + } + + private void SendOutputTo(string path, bool isAaC) + { + if (!Path.IsPathRooted(path)) + { + path = Path.Combine(_scenarioContext.GetTempPath(), path); + } + + if (!Directory.Exists(path)) + { + Directory.CreateDirectory(path); + } + + var driver = _scenarioContext.GetDriver(); + if (isAaC) + { + driver.AacOutputTo(path); + } + else + { + driver.OutputTo(path); + } + } + + [When(@"invoking the commandline for those arguments")] + public void WhenInvokingTheCommandlineForThoseArguments() + { + var couldAdd = _scenarioContext.SetCliExitCode(_scenarioContext.GetDriver().BuildAndInvoke().Result); + Assert.IsTrue(couldAdd, "Failed to add the CLI exit code to the scenario. Likely because it already exists."); + } + + [Then(@"all files under '(.*)' should match example path '(.*)'")] + public void ThenAllFilesUnderShouldMatchExamplePath(string actualPath, string expectedPath) + { + if (!Path.IsPathRooted(actualPath)) + { + actualPath = Path.Combine(_scenarioContext.GetTempPath(), actualPath); + } + + expectedPath = Path.Combine(_scenarioContext.GetDriver().WorkingDirectory, expectedPath); + + var getFileList = (string path) => Directory.GetFiles(path, "*", SearchOption.AllDirectories) + .Select(p => new { FullPath = p, RelativePath = Path.GetRelativePath(path, p) }).ToArray(); + + _testContext.WriteLine($"...Expected Path: {expectedPath}"); + _testContext.WriteLine($"...Actual Path: {actualPath}"); + var expectedFiles = getFileList(expectedPath); + var actualFiles = getFileList(actualPath); + + Assert.AreNotEqual(0, actualFiles.Length, $"No files were generated under '{actualPath}'."); + + // We cannot compare the raw file count because what's in the Sample directory will always have more files. + // Instead, we have to compare based on the Relative paths. + + var actualRelativePaths = actualFiles.ToDictionary(x => x.RelativePath, x => x); + var expectedRelativePaths = expectedFiles.ToDictionary(x => x.RelativePath, x => x); + + var extraFiles = actualRelativePaths.Keys.Except(expectedRelativePaths.Keys).ToArray(); + Assert.AreEqual(0, extraFiles.Length, $"There are extra files in the output.{Environment.NewLine}{string.Join(Environment.NewLine, extraFiles.Select(p => $" - {p}"))}"); + + foreach (var kvp in actualRelativePaths) + { + var actualFullPath = kvp.Value.FullPath; + var expectedFullPath = expectedRelativePaths[kvp.Key].FullPath; + + var actualContents = File.ReadAllText(actualFullPath); + var expectedContents = File.ReadAllText(expectedFullPath); + Assert.AreEqual(expectedContents, actualContents, $"The contents of '{actualFullPath}' did not match the contents of '{expectedFullPath}'"); + } + } + } +} + diff --git a/C4Interflow.Specs/Steps/ScenarioContextExtensions.cs b/C4Interflow.Specs/Steps/ScenarioContextExtensions.cs new file mode 100644 index 000000000..9709f2de0 --- /dev/null +++ b/C4Interflow.Specs/Steps/ScenarioContextExtensions.cs @@ -0,0 +1,30 @@ +using TechTalk.SpecFlow; + +namespace C4Interflow.Specs.Steps +{ + internal static class ScenarioContextExtensions + { + private const string CLI_EXIT_CODE_KEY = "_exit_code_"; + private const string DRIVER_KEY = "_driver_"; + private const string TEMP_PATH_KEY = "_temp_path_"; + + public static CliDriver GetDriver(this ScenarioContext scenarioContext) => scenarioContext.Get(DRIVER_KEY); + + public static bool SetDriver(this ScenarioContext scenarioContext, CliDriver driver) + { + return scenarioContext.TryAdd(DRIVER_KEY, driver); + } + + public static string GetTempPath(this ScenarioContext scenarioContext) => + scenarioContext.Get(TEMP_PATH_KEY); + + public static bool SetTempPath(this ScenarioContext scenarioContext, string tempPath) => + scenarioContext.TryAdd(TEMP_PATH_KEY, tempPath); + + public static int? GetCliExitCode(this ScenarioContext scenarioContext) => + (int?)scenarioContext.GetValueOrDefault(CLI_EXIT_CODE_KEY, null); + + public static bool SetCliExitCode(this ScenarioContext scenarioContext, int exitCode) => + scenarioContext.TryAdd(CLI_EXIT_CODE_KEY, exitCode); + } +} \ No newline at end of file diff --git a/Samples/Internet Banking System/CSV/Architecture Catalogue - CSV Export/Actors.csv b/Samples/Internet Banking System/CSV/Architecture Catalogue - CSV Export/Actors.csv index c49f5d302..a67eb4d18 100644 --- a/Samples/Internet Banking System/CSV/Architecture Catalogue - CSV Export/Actors.csv +++ b/Samples/Internet Banking System/CSV/Architecture Catalogue - CSV Export/Actors.csv @@ -1,2 +1,2 @@ -Name,Type,Alias -Customer,Person,Customer +Name,Type,Alias,Description +Customer,Person,Customer,"A customer of the bank, with personal bank accounts" diff --git a/Samples/Internet Banking System/CSV/Architecture Catalogue - CSV Export/Container Interfaces.csv b/Samples/Internet Banking System/CSV/Architecture Catalogue - CSV Export/Container Interfaces.csv index 63e3fab78..8bbbb7ace 100644 --- a/Samples/Internet Banking System/CSV/Architecture Catalogue - CSV Export/Container Interfaces.csv +++ b/Samples/Internet Banking System/CSV/Architecture Catalogue - CSV Export/Container Interfaces.csv @@ -1,21 +1,21 @@ Container,Name,Alias,Description,Protocol -InternetBanking.Containers.WebApplication,Navigate,InternetBanking.Containers.WebApplication.Interfaces.Navigate,, -InternetBanking.Containers.SinglePageApp,Load And Start,InternetBanking.Containers.SinglePageApp.Interfaces.LoadAndStart,, -InternetBanking.Containers.SinglePageApp,Sign In,InternetBanking.Containers.SinglePageApp.Interfaces.SignIn,, -InternetBanking.Containers.SinglePageApp,Change Password,InternetBanking.Containers.SinglePageApp.Interfaces.ChangePassword,, -InternetBanking.Containers.SinglePageApp,View Customer Details,InternetBanking.Containers.SinglePageApp.Interfaces.ViewCustomerDetails,, -InternetBanking.Containers.SinglePageApp,View Account Transactions,InternetBanking.Containers.SinglePageApp.Interfaces.ViewAccountTransactions,, -InternetBanking.Containers.SinglePageApp,Create Account,InternetBanking.Containers.SinglePageApp.Interfaces.CreateAccount,, -InternetBanking.Containers.MobileApp,Sign In,InternetBanking.Containers.MobileApp.Interfaces.SignIn,, -InternetBanking.Containers.MobileApp,Change Password,InternetBanking.Containers.MobileApp.Interfaces.ChangePassword,, -InternetBanking.Containers.MobileApp,View Customer Details,InternetBanking.Containers.MobileApp.Interfaces.ViewCustomerDetails,, -InternetBanking.Containers.MobileApp,View Account Transactions,InternetBanking.Containers.MobileApp.Interfaces.ViewAccountTransactions,, -InternetBanking.Containers.APIApplication,Sign In,InternetBanking.Containers.APIApplication.Interfaces.SignIn,, -InternetBanking.Containers.APIApplication,Change Password,InternetBanking.Containers.APIApplication.Interfaces.ChangePassword,, -InternetBanking.Containers.APIApplication,Get Customer,InternetBanking.Containers.APIApplication.Interfaces.GetCustomer,, -InternetBanking.Containers.APIApplication,Get Customer Accounts,InternetBanking.Containers.APIApplication.Interfaces.GetCustomerAccounts,, -InternetBanking.Containers.APIApplication,Get Account Transactions,InternetBanking.Containers.APIApplication.Interfaces.GetAccountTransactions,, -InternetBanking.Containers.APIApplication,Create Account,InternetBanking.Containers.APIApplication.Interfaces.CreateAccount,, -InternetBanking.Containers.Database,Authenticate User,InternetBanking.Containers.Database.Interfaces.AuthenticateUser,, -InternetBanking.Containers.Database,Select User Data,InternetBanking.Containers.Database.Interfaces.SelectUserData,, -InternetBanking.Containers.Database,Update User Password,InternetBanking.Containers.Database.Interfaces.UpdateUserPassword,, +InternetBanking.Containers.WebApplication,Navigate,InternetBanking.Containers.WebApplication.Interfaces.Navigate,,HTTPS +InternetBanking.Containers.SinglePageApp,Load And Start,InternetBanking.Containers.SinglePageApp.Interfaces.LoadAndStart,,HTTPS +InternetBanking.Containers.SinglePageApp,Sign In,InternetBanking.Containers.SinglePageApp.Interfaces.SignIn,,HTTPS +InternetBanking.Containers.SinglePageApp,Change Password,InternetBanking.Containers.SinglePageApp.Interfaces.ChangePassword,,HTTPS +InternetBanking.Containers.SinglePageApp,View Customer Details,InternetBanking.Containers.SinglePageApp.Interfaces.ViewCustomerDetails,,HTTPS +InternetBanking.Containers.SinglePageApp,View Account Transactions,InternetBanking.Containers.SinglePageApp.Interfaces.ViewAccountTransactions,,HTTPS +InternetBanking.Containers.SinglePageApp,Create Account,InternetBanking.Containers.SinglePageApp.Interfaces.CreateAccount,,HTTPS +InternetBanking.Containers.MobileApp,Sign In,InternetBanking.Containers.MobileApp.Interfaces.SignIn,,HTTPS +InternetBanking.Containers.MobileApp,Change Password,InternetBanking.Containers.MobileApp.Interfaces.ChangePassword,,HTTPS +InternetBanking.Containers.MobileApp,View Customer Details,InternetBanking.Containers.MobileApp.Interfaces.ViewCustomerDetails,,HTTPS +InternetBanking.Containers.MobileApp,View Account Transactions,InternetBanking.Containers.MobileApp.Interfaces.ViewAccountTransactions,,HTTPS +InternetBanking.Containers.APIApplication,Sign In,InternetBanking.Containers.APIApplication.Interfaces.SignIn,,HTTPS +InternetBanking.Containers.APIApplication,Change Password,InternetBanking.Containers.APIApplication.Interfaces.ChangePassword,,HTTPS +InternetBanking.Containers.APIApplication,Get Customer,InternetBanking.Containers.APIApplication.Interfaces.GetCustomer,,HTTPS +InternetBanking.Containers.APIApplication,Get Customer Accounts,InternetBanking.Containers.APIApplication.Interfaces.GetCustomerAccounts,,HTTPS +InternetBanking.Containers.APIApplication,Get Account Transactions,InternetBanking.Containers.APIApplication.Interfaces.GetAccountTransactions,,HTTPS +InternetBanking.Containers.APIApplication,Create Account,InternetBanking.Containers.APIApplication.Interfaces.CreateAccount,,HTTPS +InternetBanking.Containers.Database,Authenticate User,InternetBanking.Containers.Database.Interfaces.AuthenticateUser,,"TCP/IP, SQL" +InternetBanking.Containers.Database,Select User Data,InternetBanking.Containers.Database.Interfaces.SelectUserData,,"TCP/IP, SQL" +InternetBanking.Containers.Database,Update User Password,InternetBanking.Containers.Database.Interfaces.UpdateUserPassword,,"TCP/IP, SQL" diff --git a/Samples/Internet Banking System/CSV/Architecture Catalogue - CSV Export/Containers.csv b/Samples/Internet Banking System/CSV/Architecture Catalogue - CSV Export/Containers.csv index 2d89ef4e2..aa3fb2d50 100644 --- a/Samples/Internet Banking System/CSV/Architecture Catalogue - CSV Export/Containers.csv +++ b/Samples/Internet Banking System/CSV/Architecture Catalogue - CSV Export/Containers.csv @@ -1,6 +1,6 @@ -Software System,Name,Type,Alias,Description -InternetBanking,Web Application,WebApplication,InternetBanking.Containers.WebApplication, -InternetBanking,Single-Page App,Spa,InternetBanking.Containers.SinglePageApp, -InternetBanking,Mobile App,Mobile,InternetBanking.Containers.MobileApp, -InternetBanking,API Application,Spa,InternetBanking.Containers.APIApplication, -InternetBanking,Database,Database,InternetBanking.Containers.Database, +Software System,Name,Type,Alias,Description,Boundary,Technology +InternetBanking,Web Application,WebApplication,InternetBanking.Containers.WebApplication,Delivers the static content and the Internet banking SPA,Internal,"Java, Spring MVC" +InternetBanking,Single-Page Application,Spa,InternetBanking.Containers.SinglePageApp,Provides all the Internet banking functionality to customers via their web browser,Internal,"JavaScript, Angular" +InternetBanking,Mobile App,Mobile,InternetBanking.Containers.MobileApp,Provides a limited subset of the Internet banking functionality to customers via their mobile device,Internal,"C#, Xamarin" +InternetBanking,API Application,Api,InternetBanking.Containers.APIApplication,Provides Internet banking functionality via API,Internal,"Java, Spring MVC" +InternetBanking,Database,Database,InternetBanking.Containers.Database,"Stores user registration information, hashed auth credentials, access logs, etc.",Internal,Oracle Database Schema diff --git a/Samples/Internet Banking System/CSV/Architecture Catalogue - CSV Export/Software System Interfaces.csv b/Samples/Internet Banking System/CSV/Architecture Catalogue - CSV Export/Software System Interfaces.csv index 56493173a..dc7173294 100644 --- a/Samples/Internet Banking System/CSV/Architecture Catalogue - CSV Export/Software System Interfaces.csv +++ b/Samples/Internet Banking System/CSV/Architecture Catalogue - CSV Export/Software System Interfaces.csv @@ -1,9 +1,9 @@ Software System,Name,Alias,Description,Protocol -EMailSystem,Send New Account Created Notification E-Mail,EMailSystem.Interfaces.SendNewAccountCreatedNotificationEMail,, -EMailSystem,Receive New Account Created Notification E-Mail,EMailSystem.Interfaces.ReceiveNewAccountCreatedNotificationEMail,, -EMailSystem,Send Password Changed Notification E-Mail,EMailSystem.Interfaces.SendPasswordChangedNotificationEMail,, -EMailSystem,Receive Password Changed Notification E-Mail,EMailSystem.Interfaces.ReceivePasswordChangedNotificationEMail,, -MainframeBankingSystem,Get Customer,MainframeBankingSystem.Interfaces.GetCustomer,, -MainframeBankingSystem,Get Customer Accounts,MainframeBankingSystem.Interfaces.GetCustomerAccounts,, -MainframeBankingSystem,Get Account Transactions,MainframeBankingSystem.Interfaces.GetAccountTransactions,, -MainframeBankingSystem,Create Account,MainframeBankingSystem.Interfaces.CreateAccount,, +EMailSystem,Send New Account Created Notification E-Mail,EMailSystem.Interfaces.SendNewAccountCreatedNotificationEMail,,SMTP +EMailSystem,Receive New Account Created Notification E-Mail,EMailSystem.Interfaces.ReceiveNewAccountCreatedNotificationEMail,,POP3 +EMailSystem,Send Password Changed Notification E-Mail,EMailSystem.Interfaces.SendPasswordChangedNotificationEMail,,SMTP +EMailSystem,Receive Password Changed Notification E-Mail,EMailSystem.Interfaces.ReceivePasswordChangedNotificationEMail,,POP3 +MainframeBankingSystem,Get Customer,MainframeBankingSystem.Interfaces.GetCustomer,,XML/HTTPS +MainframeBankingSystem,Get Customer Accounts,MainframeBankingSystem.Interfaces.GetCustomerAccounts,,XML/HTTPS +MainframeBankingSystem,Get Account Transactions,MainframeBankingSystem.Interfaces.GetAccountTransactions,,XML/HTTPS +MainframeBankingSystem,Create Account,MainframeBankingSystem.Interfaces.CreateAccount,,XML/HTTPS diff --git a/Samples/Internet Banking System/CSV/Architecture Catalogue - CSV Export/Software Systems.csv b/Samples/Internet Banking System/CSV/Architecture Catalogue - CSV Export/Software Systems.csv index e9b93be58..5032372e8 100644 --- a/Samples/Internet Banking System/CSV/Architecture Catalogue - CSV Export/Software Systems.csv +++ b/Samples/Internet Banking System/CSV/Architecture Catalogue - CSV Export/Software Systems.csv @@ -1,4 +1,4 @@ Name,Is External,Alias,Description -E-Mail System,Yes,EMailSystem, -Internet Banking,No,InternetBanking, -Mainframe Banking System,Yes,MainframeBankingSystem, +E-Mail System,Yes,EMailSystem,The internal Microsoft Exchange system +Internet Banking,No,InternetBanking,Provided Internet Banking services +Mainframe Banking System,Yes,MainframeBankingSystem,"Stores all of the core banking information about customers, accounts, transactions, etc." diff --git a/Samples/Internet Banking System/Yaml/Architecture/Actors.yaml b/Samples/Internet Banking System/Yaml/Architecture/Actors/Customer.yaml similarity index 95% rename from Samples/Internet Banking System/Yaml/Architecture/Actors.yaml rename to Samples/Internet Banking System/Yaml/Architecture/Actors/Customer.yaml index 1809abcf4..dc94d5138 100644 --- a/Samples/Internet Banking System/Yaml/Architecture/Actors.yaml +++ b/Samples/Internet Banking System/Yaml/Architecture/Actors/Customer.yaml @@ -3,4 +3,4 @@ BigBankPlc: Customer: Type: Person Label: Customer - Description: A customer of the bank, with personal bank accounts \ No newline at end of file + Description: A customer of the bank, with personal bank accounts diff --git a/Samples/Internet Banking System/Yaml/Architecture/BusinessProcesses/CompleteEndToEnd.yaml b/Samples/Internet Banking System/Yaml/Architecture/BusinessProcesses/CompleteEndToEnd.yaml index a73722d1c..06d28db3f 100644 --- a/Samples/Internet Banking System/Yaml/Architecture/BusinessProcesses/CompleteEndToEnd.yaml +++ b/Samples/Internet Banking System/Yaml/Architecture/BusinessProcesses/CompleteEndToEnd.yaml @@ -3,35 +3,35 @@ BigBankPlc: CompleteEndToEnd: Label: Complete (End-To-End) Activities: - - Label: Banking via Web App - Actor: BigBankPlc.Actors.Customer - Flow: - Flows: - - Type: Use - Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.WebApplication.Interfaces.Navigate - - Type: Use - Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.SinglePageApp.Interfaces.SignIn - - Type: Use - Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.SinglePageApp.Interfaces.ViewCustomerDetails - - Type: Use - Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.SinglePageApp.Interfaces.ViewAccountTransactions - - Type: Use - Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.SinglePageApp.Interfaces.CreateAccount - - Label: Banking via Mobile App - Actor: BigBankPlc.Actors.Customer - Flow: - Flows: - - Type: Use - Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.MobileApp.Interfaces.SignIn - - Type: Use - Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.MobileApp.Interfaces.ViewCustomerDetails - - Type: Use - Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.MobileApp.Interfaces.ViewAccountTransactions - - Label: Receive E-Mail Notifications - Actor: BigBankPlc.Actors.Customer - Flow: - Flows: - - Type: Use - Expression: BigBankPlc.SoftwareSystems.EMailSystem.Interfaces.ReceivePasswordChangedNotificationEMail - - Type: Use - Expression: BigBankPlc.SoftwareSystems.EMailSystem.Interfaces.ReceiveNewAccountCreatedNotificationEMail \ No newline at end of file + - Label: Banking via Web App + Actor: BigBankPlc.Actors.Customer + Flow: + Flows: + - Type: Use + Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.WebApplication.Interfaces.Navigate + - Type: Use + Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.SinglePageApp.Interfaces.SignIn + - Type: Use + Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.SinglePageApp.Interfaces.ViewCustomerDetails + - Type: Use + Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.SinglePageApp.Interfaces.ViewAccountTransactions + - Type: Use + Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.SinglePageApp.Interfaces.CreateAccount + - Label: Banking via Mobile App + Actor: BigBankPlc.Actors.Customer + Flow: + Flows: + - Type: Use + Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.MobileApp.Interfaces.SignIn + - Type: Use + Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.MobileApp.Interfaces.ViewCustomerDetails + - Type: Use + Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.MobileApp.Interfaces.ViewAccountTransactions + - Label: Receive E-Mail Notifications + Actor: BigBankPlc.Actors.Customer + Flow: + Flows: + - Type: Use + Expression: BigBankPlc.SoftwareSystems.EMailSystem.Interfaces.ReceivePasswordChangedNotificationEMail + - Type: Use + Expression: BigBankPlc.SoftwareSystems.EMailSystem.Interfaces.ReceiveNewAccountCreatedNotificationEMail diff --git a/Samples/Internet Banking System/Yaml/Architecture/BusinessProcesses/CreateNewAccount.yaml b/Samples/Internet Banking System/Yaml/Architecture/BusinessProcesses/CreateNewAccount.yaml index 1bbde8079..bdd345f11 100644 --- a/Samples/Internet Banking System/Yaml/Architecture/BusinessProcesses/CreateNewAccount.yaml +++ b/Samples/Internet Banking System/Yaml/Architecture/BusinessProcesses/CreateNewAccount.yaml @@ -3,29 +3,29 @@ BigBankPlc: CreateNewAccount: Label: Create New Account Activities: - - Label: Go to Online Banking URL - Actor: BigBankPlc.Actors.Customer - Flow: - Flows: - - Type: Use - Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.WebApplication.Interfaces.Navigate - - Label: Sign In and View Home Page - Actor: BigBankPlc.Actors.Customer - Flow: - Flows: - - Type: Use - Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.SinglePageApp.Interfaces.SignIn - - Type: Use - Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.SinglePageApp.Interfaces.ViewCustomerDetails - - Label: Create New Account - Actor: BigBankPlc.Actors.Customer - Flow: - Flows: - - Type: Use - Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.SinglePageApp.Interfaces.CreateAccount - - Label: Receive New Account Created Notification E-Mail - Actor: BigBankPlc.Actors.Customer - Flow: - Flows: - - Type: Use - Expression: BigBankPlc.SoftwareSystems.EMailSystem.Interfaces.ReceiveNewAccountCreatedNotificationEMail \ No newline at end of file + - Label: Go to Online Banking URL + Actor: BigBankPlc.Actors.Customer + Flow: + Flows: + - Type: Use + Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.WebApplication.Interfaces.Navigate + - Label: Sign In and View Home Page + Actor: BigBankPlc.Actors.Customer + Flow: + Flows: + - Type: Use + Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.SinglePageApp.Interfaces.SignIn + - Type: Use + Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.SinglePageApp.Interfaces.ViewCustomerDetails + - Label: Create New Account + Actor: BigBankPlc.Actors.Customer + Flow: + Flows: + - Type: Use + Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.SinglePageApp.Interfaces.CreateAccount + - Label: Receive New Account Created Notification E-Mail + Actor: BigBankPlc.Actors.Customer + Flow: + Flows: + - Type: Use + Expression: BigBankPlc.SoftwareSystems.EMailSystem.Interfaces.ReceiveNewAccountCreatedNotificationEMail diff --git a/Samples/Internet Banking System/Yaml/Architecture/SoftwareSystems/EMailSystem.yaml b/Samples/Internet Banking System/Yaml/Architecture/SoftwareSystems/EMailSystem.yaml index 14e22cafa..08d6b2eb0 100644 --- a/Samples/Internet Banking System/Yaml/Architecture/SoftwareSystems/EMailSystem.yaml +++ b/Samples/Internet Banking System/Yaml/Architecture/SoftwareSystems/EMailSystem.yaml @@ -10,10 +10,10 @@ BigBankPlc: Protocol: SMTP ReceiveNewAccountCreatedNotificationEMail: Label: Receive New Account Created Notification E-Mail - Protocol: 'POP3' + Protocol: POP3 SendPasswordChangedNotificationEMail: Label: Send Password Changed Notification E-Mail Protocol: SMTP ReceivePasswordChangedNotificationEMail: Label: Receive Password Changed Notification E-Mail - Protocol: POP3 \ No newline at end of file + Protocol: POP3 diff --git a/Samples/Internet Banking System/Yaml/Architecture/SoftwareSystems/InternetBanking.yaml b/Samples/Internet Banking System/Yaml/Architecture/SoftwareSystems/InternetBanking.yaml index 5bbbf3645..e0d659a5c 100644 --- a/Samples/Internet Banking System/Yaml/Architecture/SoftwareSystems/InternetBanking.yaml +++ b/Samples/Internet Banking System/Yaml/Architecture/SoftwareSystems/InternetBanking.yaml @@ -7,8 +7,8 @@ BigBankPlc: Containers: WebApplication: Label: Web Application - Description: Delivers the static content and the Internet banking SPA ContainerType: WebApplication + Description: Delivers the static content and the Internet banking SPA Boundary: Internal Technology: Java, Spring MVC Interfaces: @@ -20,8 +20,8 @@ BigBankPlc: Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.SinglePageApp.Interfaces.LoadAndStart SinglePageApp: Label: Single-Page Application - Description: Provides all the Internet banking functionality to customers via their web browser ContainerType: Spa + Description: Provides all the Internet banking functionality to customers via their web browser Boundary: Internal Technology: JavaScript, Angular Interfaces: @@ -62,8 +62,8 @@ BigBankPlc: Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.APIApplication.Interfaces.CreateAccount MobileApp: Label: Mobile App - Description: Provides a limited subset of the Internet banking functionality to customers via their mobile device ContainerType: Mobile + Description: Provides a limited subset of the Internet banking functionality to customers via their mobile device Boundary: Internal Technology: C#, Xamarin Interfaces: @@ -95,8 +95,8 @@ BigBankPlc: Expression: BigBankPlc.SoftwareSystems.InternetBanking.Containers.APIApplication.Interfaces.GetAccountTransactions APIApplication: Label: API Application - Description: 'Provides Internet banking functionality via API' ContainerType: Api + Description: Provides Internet banking functionality via API Boundary: Internal Technology: Java, Spring MVC Interfaces: @@ -142,8 +142,8 @@ BigBankPlc: Expression: BigBankPlc.SoftwareSystems.EMailSystem.Interfaces.SendNewAccountCreatedNotificationEMail Database: Label: Database - Description: Stores user registration information, hashed auth credentials, access logs, etc. ContainerType: Database + Description: Stores user registration information, hashed auth credentials, access logs, etc. Boundary: Internal Technology: Oracle Database Schema Interfaces: @@ -155,4 +155,4 @@ BigBankPlc: Protocol: TCP/IP, SQL UpdateUserPassword: Label: Update User Password - Protocol: TCP/IP, SQL \ No newline at end of file + Protocol: TCP/IP, SQL diff --git a/Samples/Internet Banking System/Yaml/Architecture/SoftwareSystems/MainframeBankingSystem.yaml b/Samples/Internet Banking System/Yaml/Architecture/SoftwareSystems/MainframeBankingSystem.yaml index 88a2a8a7a..d8a3d556e 100644 --- a/Samples/Internet Banking System/Yaml/Architecture/SoftwareSystems/MainframeBankingSystem.yaml +++ b/Samples/Internet Banking System/Yaml/Architecture/SoftwareSystems/MainframeBankingSystem.yaml @@ -16,4 +16,4 @@ BigBankPlc: Protocol: XML/HTTPS CreateAccount: Label: Create Account - Protocol: XML/HTTPS \ No newline at end of file + Protocol: XML/HTTPS