public async Task Throw_exception_when_missing_index_for_user_need() { CreateDirectory("UN1"); await AssertExtensions.ExceptionAsync(async() => { await _requirementsBuilder.BuildRequirementsFromDirectory(_tempDirectory); }, ex => { Assert.Equal(ex.Message, "File 'index.md' doesn't exist for user need UN1"); }); }
public async Task <RequirementsContext> Build() { var builder = _serviceProvider.GetRequiredService <IWebBuilder>(); var requirementsDirectory = Path.Combine(_options.ContentDirectory, "requirements"); var pagesDirectory = Path.Combine(_options.ContentDirectory, "pages"); if (!Directory.Exists(requirementsDirectory)) { throw new DocGenException($"Requirements directory {requirementsDirectory} doesn't exist"); } if (!Directory.Exists(pagesDirectory)) { throw new DocGenException($"Pages directory {pagesDirectory} doesn't exist"); } // Register our static files. builder.RegisterDirectory("/Users/pknopf/git/docgen/src/DocGen.Web.Requirements/Internal/Resources/wwwroot"); var userNeeds = await _requirementsBuilder.BuildRequirementsFromDirectory(requirementsDirectory); var pages = await Task.Run(() => Directory.GetFiles(pagesDirectory, "*.md", System.IO.SearchOption.AllDirectories)); var menuStore = new MenuStore(); foreach (var page in pages) { var url = page.Replace("\\", "/").Substring(pagesDirectory.Length); if (Path.GetFileNameWithoutExtension(page) == "index") { // This is an extension-less url. url = url.Substring(0, url.LastIndexOf("/", StringComparison.InvariantCultureIgnoreCase)); if (string.IsNullOrEmpty(url)) { url = "/"; } } var markdown = await _markdownRenderer.RenderMarkdownFromFile(page); builder.RegisterMvc(url, new { controller = "Markdown", action = "Page", page = page }); menuStore.AddPage(url, (string)markdown.Yaml?.Title, 0); } foreach (var userNeed in userNeeds) { builder.RegisterMvc(((IUrlHelper)null).UserNeed(userNeed), new { controller = "Requirements", action = "UserNeed", number = userNeed.NumberFullyQualified }); menuStore.AddPage(((IUrlHelper)null).UserNeed(userNeed), userNeed.Title, userNeeds.IndexOf(userNeed)); foreach (var productRequirement in userNeed.ProductRequirements) { builder.RegisterMvc(((IUrlHelper)null).ProductRequirement(productRequirement), new { controller = "Requirements", action = "ProductRequirement", number = productRequirement.NumberFullyQualified }); menuStore.AddPage(((IUrlHelper)null).ProductRequirement(productRequirement), productRequirement.Title, userNeed.ProductRequirements.IndexOf(productRequirement)); foreach (var softwareSpecification in productRequirement.SoftwareSpecifications) { builder.RegisterMvc(((IUrlHelper)null).SoftwareSpecification(softwareSpecification), new { controller = "Requirements", action = "SoftwareSpecification", number = softwareSpecification.NumberFullyQualified }); menuStore.AddPage(((IUrlHelper)null).SoftwareSpecification(softwareSpecification), softwareSpecification.Title, productRequirement.SoftwareSpecifications.IndexOf(softwareSpecification)); } } } foreach (var test in userNeeds.SelectMany(x => x.TestCases.Union( x.ProductRequirements.SelectMany(y => y.TestCases.Union( y.SoftwareSpecifications.SelectMany(z => z.TestCases)))))) { builder.RegisterMvc(((IUrlHelper)null).TestCase(test), new { controller = "Requirements", action = "TestCase", number = test.NumberFullyQualified }); } builder.RegisterServices(services => { services.AddMvc(); services.Configure <RazorViewEngineOptions>(options => { options.FileProviders.Add(new PhysicalFileProvider("/Users/pknopf/git/docgen/src/DocGen.Web.Requirements/Internal/Resources")); }); services.AddSingleton <IList <UserNeed> >(userNeeds); services.AddSingleton <IRequirementsStore, RequirementsStore>(); services.AddSingleton <IMenuStore>(menuStore); // These regitrations are so that our controllers can inject core DocGen services. DocGen.Core.Services.Register(services); }); return(new RequirementsContext { Menu = menuStore, WebBuilder = builder }); }