public async Task IsDisplayable_ManyDependencies()
        {
            var projectPath     = SystemIOUtilities.ResolvePath("WebAppWithDockerFile");
            var engine          = new RecommendationEngine(new[] { RecipeLocator.FindRecipeDefinitionsPath() }, new Orchestrator.OrchestratorSession());
            var recommendations = await engine.ComputeRecommendations(projectPath, new ());

            var fargateRecommendation  = recommendations.First(r => r.Recipe.Id == Constants.ASPNET_CORE_ASPNET_CORE_FARGATE_RECIPE_ID);
            var isDefaultOptionSetting = fargateRecommendation.GetOptionSetting("Vpc.IsDefault");
            var createNewOptionSetting = fargateRecommendation.GetOptionSetting("Vpc.CreateNew");
            var vpcIdOptionSetting     = fargateRecommendation.GetOptionSetting("Vpc.VpcId");

            // Before dependency aren't satisfied
            Assert.False(fargateRecommendation.IsOptionSettingDisplayable(vpcIdOptionSetting));

            // Satisfy dependencies
            isDefaultOptionSetting.SetValueOverride(false);
            Assert.False(fargateRecommendation.GetOptionSettingValue <bool>(isDefaultOptionSetting));

            // Default value for Vpc.CreateNew already false, this is to show explicitly setting an override that satisfies Vpc Id option setting
            createNewOptionSetting.SetValueOverride(false);
            Assert.False(fargateRecommendation.GetOptionSettingValue <bool>(createNewOptionSetting));

            // Verify
            Assert.True(fargateRecommendation.IsOptionSettingDisplayable(vpcIdOptionSetting));
        }
Example #2
0
        public async Task PackageReferenceTest()
        {
            var projectPath = SystemIOUtilities.ResolvePath("MessageProcessingApp");

            var projectDefinition = await new ProjectDefinitionParser(new FileManager(), new DirectoryManager()).Parse(projectPath);

            var test = new NuGetPackageReferenceTest();

            Assert.True(await test.Execute(new RecommendationTestInput(
                                               new RuleTest(
                                                   test.Name,
                                                   new RuleCondition
            {
                NuGetPackageName = "AWSSDK.SQS"
            }),
                                               projectDefinition,
                                               _session)));

            Assert.False(await test.Execute(new RecommendationTestInput(
                                                new RuleTest(
                                                    test.Name,
                                                    new RuleCondition
            {
                NuGetPackageName = "AWSSDK.S3"
            }),
                                                projectDefinition,
                                                _session)));
        }
        public async Task PackageReferenceTest()
        {
            var projectPath       = SystemIOUtilities.ResolvePath("MessageProcessingApp");
            var projectDefinition = new ProjectDefinition(projectPath);
            var test = new NuGetPackageReferenceTest();

            Assert.True(await test.Execute(new RecommendationTestInput
            {
                Test = new RuleTest
                {
                    Type      = test.Name,
                    Condition = new RuleCondition
                    {
                        NuGetPackageName = "AWSSDK.SQS"
                    }
                },
                ProjectDefinition = projectDefinition
            }));

            Assert.False(await test.Execute(new RecommendationTestInput
            {
                Test = new RuleTest
                {
                    Type      = test.Name,
                    Condition = new RuleCondition
                    {
                        NuGetPackageName = "AWSSDK.S3"
                    }
                },
                ProjectDefinition = projectDefinition
            }));
        }
        public SetOptionSettingTests()
        {
            var projectPath     = SystemIOUtilities.ResolvePath("WebAppNoDockerFile");
            var engine          = new RecommendationEngine(new[] { RecipeLocator.FindRecipeDefinitionsPath() }, new Orchestrator.OrchestratorSession());
            var recommendations = engine.ComputeRecommendations(projectPath, new Dictionary <string, string>()).GetAwaiter().GetResult();

            _recommendation = recommendations.First(r => r.Recipe.Id == Constants.ASPNET_CORE_BEANSTALK_RECIPE_ID);

            _optionSetting = _recommendation.Recipe.OptionSettings.First(x => x.Id.Equals("EnvironmentType"));
        }
        public async Task ValueMappingWithDefaultValue()
        {
            var projectPath     = SystemIOUtilities.ResolvePath("WebAppNoDockerFile");
            var engine          = new RecommendationEngine(new[] { RecipeLocator.FindRecipeDefinitionsPath() }, new Orchestrator.OrchestratorSession());
            var recommendations = await engine.ComputeRecommendations(projectPath, new Dictionary <string, string>());

            var beanstalkRecommendation      = recommendations.First(r => r.Recipe.Id == Constants.ASPNET_CORE_BEANSTALK_RECIPE_ID);
            var environmentTypeOptionSetting = beanstalkRecommendation.Recipe.OptionSettings.First(optionSetting => optionSetting.Id.Equals("EnvironmentType"));

            Assert.Equal("SingleInstance", beanstalkRecommendation.GetOptionSettingValue(environmentTypeOptionSetting, false));
        }
        public async Task PushDockerImage_RepositoryNameCheck()
        {
            var projectPath = SystemIOUtilities.ResolvePath("ConsoleAppTask");
            var project     = await _projectDefinitionParser.Parse(projectPath);

            var recommendation = new Recommendation(_recipeDefinition, project, new List <OptionSettingItem>(), 100, new Dictionary <string, string>());

            var cloudApplication = new CloudApplication("ConsoleAppTask", String.Empty);
            await _deploymentBundleHandler.PushDockerImageToECR(cloudApplication, recommendation, "ConsoleAppTask:latest");

            Assert.Equal(cloudApplication.StackName.ToLower(), recommendation.DeploymentBundle.ECRRepositoryName);
        }
Example #7
0
        public async Task GetOptionSettingTests_OptionSettingDoesNotExist(string jsonPath)
        {
            var projectPath     = SystemIOUtilities.ResolvePath("WebAppNoDockerFile");
            var engine          = new RecommendationEngine(new[] { RecipeLocator.FindRecipeDefinitionsPath() }, new Orchestrator.OrchestratorSession());
            var recommendations = await engine.ComputeRecommendations(projectPath, new Dictionary <string, string>());

            var beanstalkRecommendation = recommendations.First(r => r.Recipe.Id == Constants.ASPNET_CORE_BEANSTALK_RECIPE_ID);

            var optionSetting = beanstalkRecommendation.GetOptionSetting(jsonPath);

            Assert.Null(optionSetting);
        }
        public async Task BlazorWasmTest(string projectName)
        {
            var projectPath = SystemIOUtilities.ResolvePath(projectName);

            var engine = new RecommendationEngine(new[] { RecipeLocator.FindRecipeDefinitionsPath() }, new Orchestrator.OrchestratorSession());

            var recommendations = await engine.ComputeRecommendations(projectPath, new Dictionary <string, string>());

            var blazorRecommendation = recommendations.FirstOrDefault(r => r.Recipe.Id == Constants.BLAZOR_WASM);

            Assert.NotNull(blazorRecommendation);
            Assert.NotNull(blazorRecommendation.Recipe.DeploymentConfirmation.DefaultMessage);
        }
        public async Task ObjectMappingWithDefaultValue()
        {
            var projectPath     = SystemIOUtilities.ResolvePath("WebAppNoDockerFile");
            var engine          = new RecommendationEngine(new[] { RecipeLocator.FindRecipeDefinitionsPath() }, new Orchestrator.OrchestratorSession());
            var recommendations = await engine.ComputeRecommendations(projectPath, new Dictionary <string, string>());

            var beanstalkRecommendation         = recommendations.First(r => r.Recipe.Id == Constants.ASPNET_CORE_BEANSTALK_RECIPE_ID);
            var applicationIAMRoleOptionSetting = beanstalkRecommendation.Recipe.OptionSettings.First(optionSetting => optionSetting.Id.Equals("ApplicationIAMRole"));

            var iamRoleTypeHintResponse = beanstalkRecommendation.GetOptionSettingValue <IAMRoleTypeHintResponse>(applicationIAMRoleOptionSetting, false);

            Assert.Null(iamRoleTypeHintResponse.RoleArn);
            Assert.True(iamRoleTypeHintResponse.CreateNew);
        }
Example #10
0
        public async Task PushDockerImage_RepositoryNameCheck()
        {
            var projectPath       = SystemIOUtilities.ResolvePath("ConsoleAppTask");
            var projectDefinition = new ProjectDefinition(projectPath);
            var recipeDefinition  = new Mock <RecipeDefinition>();
            var recommendation    = new Recommendation(recipeDefinition.Object, projectDefinition.ProjectPath, 100, new Dictionary <string, string>());

            var cloudApplication = new CloudApplication {
                Name = "ConsoleAppTask"
            };
            await _deploymentBundleHandler.PushDockerImageToECR(cloudApplication, recommendation, "ConsoleAppTask:latest");

            Assert.Equal(cloudApplication.StackName.ToLower(), recommendation.DeploymentBundle.ECRRepositoryName);
        }
        public async Task DockerExecutionDirectory_DockerfileLevel()
        {
            var projectPath = Path.Combine("docker", "WebAppNoSolution");
            var engine      = await BuildRecommendationEngine(projectPath);

            var recommendations = await engine.ComputeRecommendations();

            var recommendation = recommendations.FirstOrDefault(x => x.Recipe.DeploymentBundle.Equals(DeploymentBundleTypes.Container));

            var cloudApplication = new CloudApplication("WebAppNoSolution", String.Empty);
            var result           = await _deploymentBundleHandler.BuildDockerImage(cloudApplication, recommendation);

            Assert.Equal(Path.GetFullPath(SystemIOUtilities.ResolvePath(projectPath)), recommendation.DeploymentBundle.DockerExecutionDirectory);
        }
Example #12
0
        public async Task ApplyApplicationIAMRolePreviousSettings(bool createNew, string roleArn)
        {
            var projectPath     = SystemIOUtilities.ResolvePath("WebAppNoDockerFile");
            var engine          = new RecommendationEngine(new[] { RecipeLocator.FindRecipeDefinitionsPath() }, new Orchestrator.OrchestratorSession());
            var recommendations = await engine.ComputeRecommendations(projectPath, new Dictionary <string, string>());

            var beanstalkRecommendation = recommendations.First(r => r.Recipe.Id == Constants.ASPNET_CORE_BEANSTALK_RECIPE_ID);

            var roleArnValue = roleArn == null ? "null" : $"\"{roleArn}\"";

            var serializedSettings = @$ "
            {{
                " "ApplicationIAMRole" ": {{
                    " "RoleArn" ": {roleArnValue},
        public async Task ApplyProjectNameToSettings()
        {
            var projectPath = SystemIOUtilities.ResolvePath("WebAppNoDockerFile");

            var engine = new RecommendationEngine(new[] { RecipeLocator.FindRecipeDefinitionsPath() }, new Orchestrator.OrchestratorSession());

            var recommendations = await engine.ComputeRecommendations(projectPath, new Dictionary <string, string>());

            var beanstalkRecommendation = recommendations.FirstOrDefault(r => r.Recipe.Id == Constants.ASPNET_CORE_BEANSTALK_RECIPE_ID);
            var beanstalEnvNameSetting  = beanstalkRecommendation.Recipe.OptionSettings.FirstOrDefault(x => string.Equals("EnvironmentName", x.Id));

            Assert.Equal("WebAppNoDockerFile-dev", beanstalkRecommendation.GetOptionSettingValue <string>(beanstalEnvNameSetting));

            beanstalkRecommendation.OverrideProjectName("CustomName");
            Assert.Equal("CustomName-dev", beanstalkRecommendation.GetOptionSettingValue <string>(beanstalEnvNameSetting));
        }
        public async Task WebAppWithDockerFileTest()
        {
            var projectPath = SystemIOUtilities.ResolvePath("WebAppWithDockerFile");

            var engine = new RecommendationEngine(new[] { RecipeLocator.FindRecipeDefinitionsPath() }, new Orchestrator.OrchestratorSession());

            var recommendations = await engine.ComputeRecommendations(projectPath, new Dictionary <string, string>());

            recommendations
            .Any(r => r.Recipe.Id == Constants.ASPNET_CORE_ASPNET_CORE_FARGATE_RECIPE_ID)
            .ShouldBeTrue("Failed to receive Recommendation: " + Constants.ASPNET_CORE_ASPNET_CORE_FARGATE_RECIPE_ID);

            recommendations
            .Any(r => r.Recipe.Id == Constants.ASPNET_CORE_BEANSTALK_RECIPE_ID)
            .ShouldBeTrue("Failed to receive Recommendation: " + Constants.ASPNET_CORE_BEANSTALK_RECIPE_ID);
        }
Example #15
0
        public async Task DockerExecutionDirectory_DockerfileLevel()
        {
            var projectPath = SystemIOUtilities.ResolvePath("docker\\WebAppNoSolution");
            var engine      = new RecommendationEngine(new[] { RecipeLocator.FindRecipeDefinitionsPath() }, _session);

            var recommendations = await engine.ComputeRecommendations(projectPath, new());

            var recommendation = recommendations.FirstOrDefault(x => x.Recipe.DeploymentBundle.Equals(DeploymentBundleTypes.Container));

            var cloudApplication = new CloudApplication {
                Name = "WebAppNoSolution"
            };
            var result = await _deploymentBundleHandler.BuildDockerImage(cloudApplication, recommendation);

            Assert.Equal(Path.GetFullPath(projectPath), recommendation.DeploymentBundle.DockerExecutionDirectory);
        }
        public async Task MessageProcessingAppTest()
        {
            var projectPath = SystemIOUtilities.ResolvePath("MessageProcessingApp");

            var engine = new RecommendationEngine(new[] { RecipeLocator.FindRecipeDefinitionsPath() }, new Orchestrator.OrchestratorSession());

            var recommendations = await engine.ComputeRecommendations(projectPath, new Dictionary <string, string>());

            recommendations
            .Any(r => r.Recipe.Id == Constants.CONSOLE_APP_FARGATE_SERVICE_RECIPE_ID)
            .ShouldBeTrue("Failed to receive Recommendation: " + Constants.CONSOLE_APP_FARGATE_SERVICE_RECIPE_ID);

            recommendations
            .Any(r => r.Recipe.Id == Constants.CONSOLE_APP_FARGATE_SCHEDULE_TASK_RECIPE_ID)
            .ShouldBeTrue("Failed to receive Recommendation: " + Constants.CONSOLE_APP_FARGATE_SCHEDULE_TASK_RECIPE_ID);
        }
Example #17
0
        public async Task ParseProjectDefinitionWithAbsoluteProjectPath(string projectName, string csprojName)
        {
            //Arrange
            var projectDirectoryPath         = SystemIOUtilities.ResolvePath(projectName);
            var absoluteProjectDirectoryPath = new DirectoryInfo(projectDirectoryPath).FullName;
            var absoluteProjectPath          = Path.Combine(absoluteProjectDirectoryPath, csprojName);
            var projectSolutionPath          = SystemIOUtilities.ResolvePathToSolution();

            // Act
            var projectDefinition = await new ProjectDefinitionParser(new FileManager(), new DirectoryManager()).Parse(absoluteProjectDirectoryPath);

            // Assert
            projectDefinition.ShouldNotBeNull();
            Assert.Equal(absoluteProjectPath, projectDefinition.ProjectPath);
            Assert.Equal(projectSolutionPath, projectDefinition.ProjectSolutionPath);
        }
Example #18
0
        public async Task MessageProcessingAppTest()
        {
            var projectPath = SystemIOUtilities.ResolvePath("MessageProcessingApp");

            var engine = await BuildRecommendationEngine("MessageProcessingApp");

            var recommendations = await engine.ComputeRecommendations();

            recommendations
            .Any(r => r.Recipe.Id == Constants.CONSOLE_APP_FARGATE_SERVICE_RECIPE_ID)
            .ShouldBeTrue("Failed to receive Recommendation: " + Constants.CONSOLE_APP_FARGATE_SERVICE_RECIPE_ID);

            recommendations
            .Any(r => r.Recipe.Id == Constants.CONSOLE_APP_FARGATE_SCHEDULE_TASK_RECIPE_ID)
            .ShouldBeTrue("Failed to receive Recommendation: " + Constants.CONSOLE_APP_FARGATE_SCHEDULE_TASK_RECIPE_ID);
        }
Example #19
0
        private async Task <RecommendationEngine> BuildRecommendationEngine(string testProjectName)
        {
            var fullPath = SystemIOUtilities.ResolvePath(testProjectName);

            var parser         = new ProjectDefinitionParser(new FileManager(), new DirectoryManager());
            var awsCredentials = new Mock <AWSCredentials>();
            var session        = new OrchestratorSession(
                await parser.Parse(fullPath),
                awsCredentials.Object,
                "us-west-2",
                "123456789012")
            {
                AWSProfileName = "default"
            };

            return(new RecommendationEngine(new[] { RecipeLocator.FindRecipeDefinitionsPath() }, session));
        }
Example #20
0
        public async Task ParseProjectDefinitionWithRelativeProjectPath(string projectName, string csprojName)
        {
            //Arrange
            var currrentWorkingDirectory     = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            var projectDirectoryPath         = SystemIOUtilities.ResolvePath(projectName);
            var absoluteProjectDirectoryPath = new DirectoryInfo(projectDirectoryPath).FullName;
            var absoluteProjectPath          = Path.Combine(absoluteProjectDirectoryPath, csprojName);
            var relativeProjectDirectoryPath = Path.GetRelativePath(currrentWorkingDirectory, absoluteProjectDirectoryPath);
            var projectSolutionPath          = SystemIOUtilities.ResolvePathToSolution();

            // Act
            var projectDefinition = await new ProjectDefinitionParser(new FileManager(), new DirectoryManager()).Parse(relativeProjectDirectoryPath);

            // Assert
            projectDefinition.ShouldNotBeNull();
            Assert.Equal(absoluteProjectPath, projectDefinition.ProjectPath);
            Assert.Equal(projectSolutionPath, projectDefinition.ProjectSolutionPath);
        }
        public async Task BuildDockerImage_DockerExecutionDirectoryNotSet()
        {
            var projectPath = SystemIOUtilities.ResolvePath("ConsoleAppTask");
            var project     = await _projectDefinitionParser.Parse(projectPath);

            var recommendation = new Recommendation(_recipeDefinition, project, new List <OptionSettingItem>(), 100, new Dictionary <string, string>());

            var cloudApplication = new CloudApplication("ConsoleAppTask", String.Empty);
            var result           = await _deploymentBundleHandler.BuildDockerImage(cloudApplication, recommendation);

            var dockerFile = Path.Combine(Path.GetDirectoryName(Path.GetFullPath(recommendation.ProjectPath)), "Dockerfile");
            var dockerExecutionDirectory = Directory.GetParent(Path.GetFullPath(recommendation.ProjectPath)).Parent.Parent;

            Assert.Equal($"docker build -t {result} -f \"{dockerFile}\" .",
                         _commandLineWrapper.CommandsToExecute.First().Command);
            Assert.Equal(dockerExecutionDirectory.FullName,
                         _commandLineWrapper.CommandsToExecute.First().WorkingDirectory);
        }
Example #22
0
        public async Task BuildDockerImage_DockerExecutionDirectorySet()
        {
            var projectPath       = SystemIOUtilities.ResolvePath("ConsoleAppTask");
            var projectDefinition = new ProjectDefinition(projectPath);
            var recipeDefinition  = new Mock <RecipeDefinition>();
            var recommendation    = new Recommendation(recipeDefinition.Object, projectDefinition.ProjectPath, 100, new Dictionary <string, string>());

            recommendation.DeploymentBundle.DockerExecutionDirectory = projectPath;

            var cloudApplication = new CloudApplication {
                Name = "ConsoleAppTask"
            };
            var result = await _deploymentBundleHandler.BuildDockerImage(cloudApplication, recommendation);

            var dockerFile = Path.Combine(Path.GetDirectoryName(Path.GetFullPath(recommendation.ProjectPath)), "Dockerfile");

            Assert.Equal($"docker build -t {result} -f \"{dockerFile}\" .",
                         _commandLineWrapper.CommandsToExecute.First().Command);
            Assert.Equal(projectPath,
                         _commandLineWrapper.CommandsToExecute.First().WorkingDirectory);
        }
Example #23
0
        public async Task RecipeController_GetRecipe_WithProjectPath()
        {
            var directoryManager        = new DirectoryManager();
            var fileManager             = new FileManager();
            var projectDefinitionParser = new ProjectDefinitionParser(fileManager, directoryManager);

            var mockCustomRecipeLocator = new Mock <ICustomRecipeLocator>();

            var sourceProjectDirectory = SystemIOUtilities.ResolvePath("WebAppWithDockerFile");

            var customLocatorCalls = 0;

            mockCustomRecipeLocator
            .Setup(x => x.LocateCustomRecipePaths(It.IsAny <string>(), It.IsAny <string>()))
            .Callback <string, string>((csProjectPath, solutionPath) =>
            {
                customLocatorCalls++;
                Assert.Equal(new DirectoryInfo(sourceProjectDirectory).FullName, Directory.GetParent(csProjectPath).FullName);
            })
            .Returns(Task.FromResult(new HashSet <string>()));

            var projectDefinition = await projectDefinitionParser.Parse(sourceProjectDirectory);

            var recipeDefinitions = await RecipeHandler.GetRecipeDefinitions(mockCustomRecipeLocator.Object, projectDefinition);

            var recipe = recipeDefinitions.First();

            Assert.NotEqual(0, customLocatorCalls);

            customLocatorCalls = 0;
            var recipeController = new RecipeController(mockCustomRecipeLocator.Object, projectDefinitionParser);
            var response         = await recipeController.GetRecipe(recipe.Id, sourceProjectDirectory);

            Assert.NotEqual(0, customLocatorCalls);

            var result       = Assert.IsType <OkObjectResult>(response);
            var resultRecipe = Assert.IsType <RecipeSummary>(result.Value);

            Assert.Equal(recipe.Id, resultRecipe.Id);
        }
Example #24
0
        public SetOptionSettingTests()
        {
            var projectPath = SystemIOUtilities.ResolvePath("WebAppNoDockerFile");

            var parser         = new ProjectDefinitionParser(new FileManager(), new DirectoryManager());
            var awsCredentials = new Mock <AWSCredentials>();
            var session        = new OrchestratorSession(
                parser.Parse(projectPath).Result,
                awsCredentials.Object,
                "us-west-2",
                "123456789012")
            {
                AWSProfileName = "default"
            };

            var engine          = new RecommendationEngine(new[] { RecipeLocator.FindRecipeDefinitionsPath() }, session);
            var recommendations = engine.ComputeRecommendations().GetAwaiter().GetResult();

            _recommendation = recommendations.First(r => r.Recipe.Id == Constants.ASPNET_CORE_BEANSTALK_RECIPE_ID);

            _optionSetting = _recommendation.Recipe.OptionSettings.First(x => x.Id.Equals("EnvironmentType"));
        }
Example #25
0
        public async Task CreateDotnetPublishZip_NotSelfContained()
        {
            var projectPath       = SystemIOUtilities.ResolvePath("ConsoleAppTask");
            var projectDefinition = new ProjectDefinition(projectPath);
            var recipeDefinition  = new Mock <RecipeDefinition>();
            var recommendation    = new Recommendation(recipeDefinition.Object, projectDefinition.ProjectPath, 100, new Dictionary <string, string>());

            recommendation.DeploymentBundle.DotnetPublishSelfContainedBuild       = false;
            recommendation.DeploymentBundle.DotnetPublishBuildConfiguration       = "Release";
            recommendation.DeploymentBundle.DotnetPublishAdditionalBuildArguments = "--nologo";

            await _deploymentBundleHandler.CreateDotnetPublishZip(recommendation);

            var expectedCommand =
                $"dotnet publish \"{projectDefinition.ProjectPath}\"" +
                $" -o \"{_directoryManager.CreatedDirectories.First()}\"" +
                " -c Release" +
                " " +
                " --nologo";

            Assert.Equal(expectedCommand, _commandLineWrapper.CommandsToExecute.First().Command);
        }
        public async Task CreateDotnetPublishZip_SelfContained()
        {
            var projectPath = SystemIOUtilities.ResolvePath("ConsoleAppTask");
            var project     = await _projectDefinitionParser.Parse(projectPath);

            var recommendation = new Recommendation(_recipeDefinition, project, new List <OptionSettingItem>(), 100, new Dictionary <string, string>());

            recommendation.DeploymentBundle.DotnetPublishSelfContainedBuild       = true;
            recommendation.DeploymentBundle.DotnetPublishBuildConfiguration       = "Release";
            recommendation.DeploymentBundle.DotnetPublishAdditionalBuildArguments = "--nologo";

            await _deploymentBundleHandler.CreateDotnetPublishZip(recommendation);

            var expectedCommand =
                $"dotnet publish \"{project.ProjectPath}\"" +
                $" -o \"{_directoryManager.CreatedDirectories.First()}\"" +
                " -c Release" +
                " --runtime linux-x64" +
                " --nologo" +
                " --self-contained true";

            Assert.Equal(expectedCommand, _commandLineWrapper.CommandsToExecute.First().Command);
        }
        public async Task IsDisplayable_OneDependency()
        {
            var projectPath     = SystemIOUtilities.ResolvePath("WebAppNoDockerFile");
            var engine          = new RecommendationEngine(new[] { RecipeLocator.FindRecipeDefinitionsPath() }, new Orchestrator.OrchestratorSession());
            var recommendations = await engine.ComputeRecommendations(projectPath, new());

            var beanstalkRecommendation      = recommendations.First(r => r.Recipe.Id == Constants.ASPNET_CORE_BEANSTALK_RECIPE_ID);
            var environmentTypeOptionSetting = beanstalkRecommendation.Recipe.OptionSettings.First(optionSetting => optionSetting.Id.Equals("EnvironmentType"));

            var loadBalancerTypeOptionSetting = beanstalkRecommendation.Recipe.OptionSettings.First(optionSetting => optionSetting.Id.Equals("LoadBalancerType"));

            Assert.Equal("SingleInstance", beanstalkRecommendation.GetOptionSettingValue(environmentTypeOptionSetting));

            // Before dependency isn't satisfied
            Assert.False(beanstalkRecommendation.IsOptionSettingDisplayable(loadBalancerTypeOptionSetting));

            // Satisfy dependency
            environmentTypeOptionSetting.SetValueOverride("LoadBalanced");
            Assert.Equal("LoadBalanced", beanstalkRecommendation.GetOptionSettingValue(environmentTypeOptionSetting));

            // Verify
            Assert.True(beanstalkRecommendation.IsOptionSettingDisplayable(loadBalancerTypeOptionSetting));
        }
        public async Task ClearOptionSettingValue_String()
        {
            var interactiveServices = new TestToolInteractiveServiceImpl(new List <string>
            {
                "<reset>"
            });
            var consoleUtilities = new ConsoleUtilities(interactiveServices);
            var projectPath      = SystemIOUtilities.ResolvePath("WebAppNoDockerFile");
            var engine           = new RecommendationEngine(new[] { RecipeLocator.FindRecipeDefinitionsPath() }, new Orchestrator.OrchestratorSession());
            var recommendations  = await engine.ComputeRecommendations(projectPath, new Dictionary <string, string>());

            var fargateRecommendation       = recommendations.First(r => r.Recipe.Id == Constants.ASPNET_CORE_ASPNET_CORE_FARGATE_RECIPE_ID);
            var ecsServiceNameOptionSetting = fargateRecommendation.Recipe.OptionSettings.First(optionSetting => optionSetting.Id.Equals("ECSServiceName"));

            var originalDefaultValue = fargateRecommendation.GetOptionSettingDefaultValue <string>(ecsServiceNameOptionSetting);

            ecsServiceNameOptionSetting.SetValueOverride("TestService");

            Assert.Equal("TestService", fargateRecommendation.GetOptionSettingValue <string>(ecsServiceNameOptionSetting));

            ecsServiceNameOptionSetting.SetValueOverride(consoleUtilities.AskUserForValue("Title", "TestService", true, originalDefaultValue));

            Assert.Equal(originalDefaultValue, fargateRecommendation.GetOptionSettingValue <string>(ecsServiceNameOptionSetting));
        }