public async Task AddFileFromTemplateAsync_Throws_If_Template_Processing_Has_Exceptions()
        {
            var mockFilesLocator = new Mock <IFilesLocator>();
            var mockTemplating   = new Mock <ITemplating>();
            var mockFileSystem   = new MockFileSystem();

            var templateName        = "TemplateName";
            var templatePath        = "C:\template.cshtml";
            var templateContent     = "TemplateContent";
            var processingException = new TemplateProcessingException(new[] { "Error1" }, string.Empty);

            mockFilesLocator.Setup(fl => fl.GetFilePath(templateName, It.IsAny <IEnumerable <string> >()))
            .Returns(templatePath);
            mockFileSystem.WriteAllText(templatePath, templateContent);
            mockTemplating.Setup(templating => templating.RunTemplateAsync(templateContent, null))
            .Returns(Task.FromResult(new TemplateResult()
            {
                ProcessingException = processingException
            }));

            var codeGeneratorActionService = new CodeGeneratorActionsService(
                mockTemplating.Object, mockFilesLocator.Object, mockFileSystem);

            var ex = await Assert.ThrowsAsync <InvalidOperationException>(async() =>
                                                                          await codeGeneratorActionService.AddFileFromTemplateAsync("Dummy",
                                                                                                                                    templateName,
                                                                                                                                    new[] { "TemplateFolder1", "TemplateFolder2" },
                                                                                                                                    null));

            Assert.Equal("There was an error running the template " + templatePath + ": Template Processing Failed:Error1", ex.Message);
        }
        public async Task AddFileFromTemplateAsync_Writes_If_Template_Processing_Is_Successful()
        {
            var mockFilesLocator = new Mock <IFilesLocator>();
            var mockTemplating   = new Mock <ITemplating>();
            var mockFileSystem   = new MockFileSystem();

            var templateName    = "TemplateName";
            var templatePath    = "C:\template.cshtml";
            var templateContent = "TemplateContent";
            var outputPath      = @"C:\Output.txt";
            var generatedText   = "GeneratedText";

            mockFilesLocator.Setup(fl => fl.GetFilePath(templateName, It.IsAny <IEnumerable <string> >()))
            .Returns(templatePath);
            mockFileSystem.WriteAllText(templatePath, templateContent);
            mockTemplating.Setup(templating => templating.RunTemplateAsync(templateContent, null))
            .Returns(Task.FromResult(new TemplateResult()
            {
                ProcessingException = null,
                GeneratedText       = generatedText
            }));

            var codeGeneratorActionService = new CodeGeneratorActionsService(
                mockTemplating.Object, mockFilesLocator.Object, mockFileSystem);

            await codeGeneratorActionService.AddFileFromTemplateAsync(outputPath,
                                                                      templateName,
                                                                      new[] { "TemplateFolder1", "TemplateFolder2" },
                                                                      null);

            Assert.True(mockFileSystem.FileExists(outputPath));
            Assert.Equal(generatedText, mockFileSystem.ReadAllText(outputPath));
        }
        public override async Task Generate(CommandLineGeneratorModel controllerGeneratorModel)
        {
            Contract.Assert(!String.IsNullOrEmpty(controllerGeneratorModel.ModelClass));

            string outputPath = ValidateAndGetOutputPath(controllerGeneratorModel);
            var    modelTypeAndContextModel = await ValidateModelAndGetMetadata(controllerGeneratorModel);

            if (string.IsNullOrEmpty(controllerGeneratorModel.ControllerName))
            {
                //Todo: Pluralize model name
                controllerGeneratorModel.ControllerName = modelTypeAndContextModel.ModelType.Name + Constants.ControllerSuffix;
            }

            var templateModel = new ControllerWithContextTemplateModel(modelTypeAndContextModel.ModelType, modelTypeAndContextModel.DbContextFullName)
            {
                ControllerName      = controllerGeneratorModel.ControllerName,
                AreaName            = string.Empty, //ToDo
                UseAsync            = controllerGeneratorModel.UseAsync,
                ControllerNamespace = GetControllerNamespace(),
                ModelMetadata       = modelTypeAndContextModel.ContextProcessingResult.ModelMetadata
            };

            await CodeGeneratorActionsService.AddFileFromTemplateAsync(outputPath, GetTemplateName(controllerGeneratorModel), TemplateFolders, templateModel);

            Logger.LogMessage("Added Controller : " + outputPath.Substring(ApplicationInfo.ApplicationBasePath.Length));

            await GenerateViewsIfRequired(controllerGeneratorModel, modelTypeAndContextModel, templateModel.ControllerRootName);

            if (modelTypeAndContextModel.ContextProcessingResult.ContextProcessingStatus == ContextProcessingStatus.ContextAddedButRequiresConfig)
            {
                throw new Exception(string.Format("{0} {1}", CodeGenerators.Mvc.MessageStrings.ScaffoldingSuccessful_unregistered,
                                                  CodeGenerators.Mvc.MessageStrings.Scaffolding_additionalSteps));
            }
        }
        public override async Task Generate(CommandLineGeneratorModel controllerGeneratorModel)
        {
            if (!string.IsNullOrEmpty(controllerGeneratorModel.ControllerName))
            {
                if (!controllerGeneratorModel.ControllerName.EndsWith(Constants.ControllerSuffix, StringComparison.Ordinal))
                {
                    controllerGeneratorModel.ControllerName = controllerGeneratorModel.ControllerName + Constants.ControllerSuffix;
                }
            }
            else
            {
                throw new ArgumentException("Controller name is required for an Empty Controller");
            }

            var layoutDependencyInstaller = ActivatorUtilities.CreateInstance <MvcLayoutDependencyInstaller>(ServiceProvider);
            await layoutDependencyInstaller.Execute();

            var templateModel = new ClassNameModel(className: controllerGeneratorModel.ControllerName, namespaceName: GetControllerNamespace());

            var templateName = "EmptyController.cshtml";
            var outputPath   = ValidateAndGetOutputPath(controllerGeneratorModel);
            await CodeGeneratorActionsService.AddFileFromTemplateAsync(outputPath, templateName, TemplateFolders, templateModel);

            Logger.LogMessage("Added Controller : " + outputPath.Substring(ApplicationEnvironment.ApplicationBasePath.Length));

            await layoutDependencyInstaller.InstallDependencies();
        }
Exemple #5
0
        public override async Task Generate(CommandLineGeneratorModel controllerGeneratorModel)
        {
            Contract.Assert(!String.IsNullOrEmpty(controllerGeneratorModel.ModelClass));

            string outputPath = ValidateAndGetOutputPath(controllerGeneratorModel);
            var    modelTypeAndContextModel = await ValidateModelAndGetMetadata(controllerGeneratorModel);

            if (string.IsNullOrEmpty(controllerGeneratorModel.ControllerName))
            {
                //Todo: Pluralize model name
                controllerGeneratorModel.ControllerName = modelTypeAndContextModel.ModelType.Name + Constants.ControllerSuffix;
            }

            var templateModel = new ControllerWithContextTemplateModel(modelTypeAndContextModel.ModelType, modelTypeAndContextModel.DbContextFullName)
            {
                ControllerName      = controllerGeneratorModel.ControllerName,
                AreaName            = string.Empty, //ToDo
                UseAsync            = controllerGeneratorModel.UseAsync,
                ControllerNamespace = GetControllerNamespace(),
                ModelMetadata       = modelTypeAndContextModel.ContextProcessingResult.ModelMetadata
            };

            await CodeGeneratorActionsService.AddFileFromTemplateAsync(outputPath, GetTemplateName(controllerGeneratorModel), TemplateFolders, templateModel);

            Logger.LogMessage("Added Controller : " + outputPath.Substring(ApplicationEnvironment.ApplicationBasePath.Length));

            await GenerateViewsIfRequired(controllerGeneratorModel, modelTypeAndContextModel, templateModel.ControllerRootName);

            if (modelTypeAndContextModel.ContextProcessingResult.ContextProcessingStatus == ContextProcessingStatus.ContextAddedButRequiresConfig)
            {
                throw new Exception("Scaffolding generated all the code but the new context created could be registered using dependency injection." +
                                    "There may be additional steps required for the generated code to work. Refer to <forward-link>");
            }
        }
Exemple #6
0
        public override async Task Generate(CommandLineGeneratorModel controllerGeneratorModel)
        {
            if (!string.IsNullOrEmpty(controllerGeneratorModel.ControllerName))
            {
                if (!controllerGeneratorModel.ControllerName.EndsWith(Constants.ControllerSuffix, StringComparison.Ordinal))
                {
                    controllerGeneratorModel.ControllerName = controllerGeneratorModel.ControllerName + Constants.ControllerSuffix;
                }
            }
            else
            {
                throw new ArgumentException(GetRequiredNameError);
            }
            ValidateNameSpaceName(controllerGeneratorModel);
            var layoutDependencyInstaller = ActivatorUtilities.CreateInstance <MvcLayoutDependencyInstaller>(ServiceProvider);
            await layoutDependencyInstaller.Execute();

            var namespaceName = string.IsNullOrEmpty(controllerGeneratorModel.ControllerNamespace)
                ? GetDefaultControllerNamespace(controllerGeneratorModel.RelativeFolderPath)
                : controllerGeneratorModel.ControllerNamespace;
            var templateModel = new ClassNameModel(className: controllerGeneratorModel.ControllerName, namespaceName: namespaceName);

            var outputPath = ValidateAndGetOutputPath(controllerGeneratorModel);
            await CodeGeneratorActionsService.AddFileFromTemplateAsync(outputPath, GetTemplateName(controllerGeneratorModel), TemplateFolders, templateModel);

            Logger.LogMessage(string.Format(MessageStrings.AddedController, outputPath.Substring(ApplicationInfo.ApplicationBasePath.Length)));

            await layoutDependencyInstaller.InstallDependencies();
        }
        public async Task AddFileFromTemplateAsync_Throws_If_Template_Processing_Has_Exceptions()
        {
            var mockFilesLocator = new Mock<IFilesLocator>();
            var mockTemplating = new Mock<ITemplating>();
            var mockFileSystem = new MockFileSystem();

            var templateName = "TemplateName";
            var templatePath = "C:\template.cshtml";
            var templateContent = "TemplateContent";
            var processingException = new TemplateProcessingException(new[] { "Error1" }, string.Empty);

            mockFilesLocator.Setup(fl => fl.GetFilePath(templateName, It.IsAny<IEnumerable<string>>()))
                .Returns(templatePath);
            mockFileSystem.WriteAllText(templatePath, templateContent);
            mockTemplating.Setup(templating => templating.RunTemplateAsync(templateContent, null))
                .Returns(Task.FromResult(new TemplateResult()
                {
                    ProcessingException = processingException
                }));

            var codeGeneratorActionService = new CodeGeneratorActionsService(
                mockTemplating.Object, mockFilesLocator.Object, mockFileSystem);

            var ex = await Assert.ThrowsAsync<InvalidOperationException>(async () =>
                await codeGeneratorActionService.AddFileFromTemplateAsync("Dummy",
                    templateName,
                    new[] { "TemplateFolder1", "TemplateFolder2" },
                    null));
            Assert.Equal("There was an error running the template " + templatePath + ": Template Processing Failed:Error1", ex.Message);
        }
Exemple #8
0
        public override async Task Generate(CommandLineGeneratorModel controllerGeneratorModel)
        {
            Contract.Assert(!String.IsNullOrEmpty(controllerGeneratorModel.ModelClass));
            ValidateNameSpaceName(controllerGeneratorModel);
            string outputPath = ValidateAndGetOutputPath(controllerGeneratorModel);

            _areaName = GetAreaName(ApplicationInfo.ApplicationBasePath, outputPath);

            var modelTypeAndContextModel = await ModelMetadataUtilities.ValidateModelAndGetEFMetadata(
                controllerGeneratorModel,
                EntityFrameworkService,
                ModelTypesLocator,
                _areaName
                );

            if (string.IsNullOrEmpty(controllerGeneratorModel.ControllerName))
            {
                //Todo: Pluralize model name
                controllerGeneratorModel.ControllerName = modelTypeAndContextModel.ModelType.Name + Constants.ControllerSuffix;
            }
            var namespaceName = string.IsNullOrEmpty(controllerGeneratorModel.ControllerNamespace)
                ? GetDefaultControllerNamespace(controllerGeneratorModel.RelativeFolderPath)
                : controllerGeneratorModel.ControllerNamespace;

            var templateModel = new ControllerWithContextTemplateModel(modelTypeAndContextModel.ModelType, modelTypeAndContextModel.DbContextFullName)
            {
                ControllerName      = controllerGeneratorModel.ControllerName,
                AreaName            = _areaName,
                UseAsync            = controllerGeneratorModel.UseAsync, // This is no longer used for controllers with context.
                ControllerNamespace = namespaceName,
                ModelMetadata       = modelTypeAndContextModel.ContextProcessingResult.ModelMetadata
            };

            await CodeGeneratorActionsService.AddFileFromTemplateAsync(
                outputPath,
                GetTemplateName(controllerGeneratorModel),
                TemplateFolders,
                templateModel
                );

            Logger.LogMessage("Added Controller : " + outputPath.Substring(ApplicationInfo.ApplicationBasePath.Length));

            await GenerateViewsIfRequired(
                controllerGeneratorModel,
                modelTypeAndContextModel,
                templateModel.ControllerRootName
                );

            if (modelTypeAndContextModel.ContextProcessingResult.ContextProcessingStatus
                == ContextProcessingStatus.ContextAddedButRequiresConfig)
            {
                throw new Exception(string.Format("{0} {1}", MessageStrings.ScaffoldingSuccessful_unregistered,
                                                  MessageStrings.Scaffolding_additionalSteps));
            }
        }
        public async Task AddFileFromTemplateAsync_Throws_If_Template_Is_Not_Found()
        {
            var mockFilesLocator = new Mock<IFilesLocator>();
            var mockTemplating = new Mock<ITemplating>();

            var codeGeneratorActionService = new CodeGeneratorActionsService(
                mockTemplating.Object, mockFilesLocator.Object);

            var ex = await Assert.ThrowsAsync<InvalidOperationException>(async () => 
                await codeGeneratorActionService.AddFileFromTemplateAsync("Dummy", 
                    "Template",
                    new[] { "TemplateFolder1", "TemplateFolder2" },
                    null));
            Assert.Equal("Template file Template not found within search paths TemplateFolder1;TemplateFolder2", ex.Message);
        }
        public async Task AddFileFromTemplateAsync_Throws_If_Template_Is_Not_Found()
        {
            var mockFilesLocator = new Mock <IFilesLocator>();
            var mockTemplating   = new Mock <ITemplating>();

            var codeGeneratorActionService = new CodeGeneratorActionsService(
                mockTemplating.Object, mockFilesLocator.Object, DefaultFileSystem.Instance);

            var ex = await Assert.ThrowsAsync <InvalidOperationException>(async() =>
                                                                          await codeGeneratorActionService.AddFileFromTemplateAsync("Dummy",
                                                                                                                                    "Template",
                                                                                                                                    new[] { "TemplateFolder1", "TemplateFolder2" },
                                                                                                                                    null));

            Assert.Equal("Template file Template not found within search paths TemplateFolder1;TemplateFolder2", ex.Message);
        }
        private async Task GenerateViewsIfRequired(CommandLineGeneratorModel controllerGeneratorModel,
                                                   ModelTypeAndContextModel modelTypeAndContextModel,
                                                   string controllerRootName)
        {
            if (!controllerGeneratorModel.IsRestController && !controllerGeneratorModel.NoViews)
            {
                var layoutDependencyInstaller = ActivatorUtilities.CreateInstance <MvcLayoutDependencyInstaller>(ServiceProvider);
                await layoutDependencyInstaller.Execute();

                foreach (var viewTemplate in _views)
                {
                    var viewName = viewTemplate == "List" ? "Index" : viewTemplate;
                    // ToDo: This is duplicated from ViewGenerator.
                    bool isLayoutSelected = controllerGeneratorModel.UseDefaultLayout ||
                                            !String.IsNullOrEmpty(controllerGeneratorModel.LayoutPage);

                    var viewTemplateModel = new ViewGeneratorTemplateModel()
                    {
                        ViewDataTypeName      = modelTypeAndContextModel.ModelType.FullName,
                        ViewDataTypeShortName = modelTypeAndContextModel.ModelType.Name,
                        ViewName                 = viewName,
                        LayoutPageFile           = controllerGeneratorModel.LayoutPage,
                        IsLayoutPageSelected     = isLayoutSelected,
                        IsPartialView            = false,
                        ReferenceScriptLibraries = controllerGeneratorModel.ReferenceScriptLibraries,
                        ModelMetadata            = modelTypeAndContextModel.ContextProcessingResult.ModelMetadata,
                        JQueryVersion            = "1.10.2"
                    };

                    // Todo: Need logic for areas
                    var viewOutputPath = Path.Combine(
                        ApplicationInfo.ApplicationBasePath,
                        Constants.ViewsFolderName,
                        controllerRootName,
                        viewName + Constants.ViewExtension);

                    await CodeGeneratorActionsService.AddFileFromTemplateAsync(viewOutputPath,
                                                                               viewTemplate + Constants.RazorTemplateExtension, TemplateFolders, viewTemplateModel);

                    Logger.LogMessage("Added View : " + viewOutputPath.Substring(ApplicationInfo.ApplicationBasePath.Length));
                }

                await layoutDependencyInstaller.InstallDependencies();
            }
        }
Exemple #12
0
        internal async Task Generate(CommandLineGeneratorModel model)
        {
            DocumentationViewModel viewModel = new DocumentationViewModel();

            viewModel.Attributes      = new List <AttributeInfo>();
            viewModel.Interfaces      = new List <InterfaceInfo>();
            viewModel.BaseControllers = new List <BaseControllerInfo>();
            viewModel.Models          = new List <ModelInfo>();

            ParseAttributes(viewModel);
            ParseInterfaces(viewModel);
            ParseBaseControllers(viewModel);
            ParseModels(viewModel);

            var viewOutputPath = Path.Combine(
                ApplicationEnvironment.ApplicationBasePath,
                "Views",
                "Home",
                "Documentation.cshtml");
            await CodeGeneratorActionsService.AddFileFromTemplateAsync(viewOutputPath,
                                                                       "StaticDocumentationBuilder.cshtml", TemplateFolders, viewModel);
        }
        public async Task AddFileFromTemplateAsync_Writes_If_Template_Processing_Is_Successful()
        {
            var mockFilesLocator = new Mock<IFilesLocator>();
            var mockTemplating = new Mock<ITemplating>();
            var mockFileSystem = new MockFileSystem();

            var templateName = "TemplateName";
            var templatePath = "C:\template.cshtml";
            var templateContent = "TemplateContent";
            var outputPath = @"C:\Output.txt";
            var generatedText = "GeneratedText";

            mockFilesLocator.Setup(fl => fl.GetFilePath(templateName, It.IsAny<IEnumerable<string>>()))
                .Returns(templatePath);
            mockFileSystem.WriteAllText(templatePath, templateContent);
            mockTemplating.Setup(templating => templating.RunTemplateAsync(templateContent, null))
                .Returns(Task.FromResult(new TemplateResult()
                {
                    ProcessingException = null,
                    GeneratedText = generatedText
                }));

            var codeGeneratorActionService = new CodeGeneratorActionsService(
                mockTemplating.Object, mockFilesLocator.Object, mockFileSystem);

            await codeGeneratorActionService.AddFileFromTemplateAsync(outputPath,
                    templateName,
                    new[] { "TemplateFolder1", "TemplateFolder2" },
                    null);

            Assert.True(mockFileSystem.FileExists(outputPath));
            Assert.Equal(generatedText, mockFileSystem.ReadAllText(outputPath));
        }