Skip to content

Commit 28cccee

Browse files
committed
tests update
1 parent 68dd5cd commit 28cccee

15 files changed

Lines changed: 150 additions & 49 deletions

src/Ditto/test/ModelTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public async Task Parse_ReturnsModelValues_ForValidInput() {
3030
time_array = [12:00:00, 13:00:00, 14:00:00]
3131
"""));
3232

33-
var modelValues = await Shared.ModelValuesParser.Parse(input);
33+
var modelValues = await ModelValuesParser.Parse(input);
3434

3535
Assert.NotNull(modelValues);
3636
Assert.Equal("value", modelValues.GetString("str"));
@@ -61,7 +61,7 @@ public async Task Parse_ReturnsModelValues_ForValidInput() {
6161
public async Task Parse_ReturnsEmptyModelValues_ForEmptyInput() {
6262
var input = new MemoryStream(Encoding.UTF8.GetBytes(""));
6363

64-
var modelValues = await Shared.ModelValuesParser.Parse(input);
64+
var modelValues = await ModelValuesParser.Parse(input);
6565

6666
Assert.NotNull(modelValues);
6767
Assert.Null(modelValues.GetString("str"));

src/Ditto/test/PageFileTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ public void LoadFiles_ReturnsPageFiles_WhenValidInput() {
88

99
Assert.NotNull(pageFiles);
1010
Assert.NotEmpty(pageFiles);
11-
Assert.Equal(4, pageFiles.Count);
11+
Assert.Equal(5, pageFiles.Count);
1212
Assert.All(pageFiles, pageFile => {
1313
Assert.NotNull(pageFile.InputPath);
1414
Assert.NotNull(pageFile.OutputPath);

src/Ditto/test/PageTests.cs

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
namespace Ditto.Tests;
22

33
public sealed class PageParserTests {
4-
private readonly PageParser _pageParser = new(Shared.ModelValuesParser, Shared.SiteConfig);
4+
private readonly PageParser _pageParser = new(Shared.SiteConfig);
55

66
[Fact]
77
public async Task Parse_ReturnsPage_WhenValidInput() {
@@ -11,6 +11,7 @@ public async Task Parse_ReturnsPage_WhenValidInput() {
1111
description = "This is a test page."
1212
layout = "test-template"
1313
tags = ["test", "sample"]
14+
published = 2023-10-05
1415
---
1516
<h1>{{title}}</h1>
1617
<h2>{{description}}</h2>
@@ -20,23 +21,29 @@ public async Task Parse_ReturnsPage_WhenValidInput() {
2021
var pageFile = new PageFile(
2122
InputPath: Path.ChangeExtension(Path.GetRandomFileName(), "html"),
2223
OutputPath: Path.ChangeExtension(Path.GetRandomFileName(), "html"),
23-
Path: "/valid-page/",
24+
Path: "/about/valid-page/",
2425
PageName: "valid-page",
2526
ViewType: ViewType.Html);
2627

2728
using var input = new StringReader(pageContent);
2829
var page = await _pageParser.Parse(input, pageFile);
2930

3031
Assert.Equal(pageFile.Path, page.Path);
32+
Assert.Equal(pageFile.PageName, page.Slug);
33+
Assert.Equal("/about/valid-page/", page.Path);
34+
Assert.Equal("valid-page", page.Slug);
3135
Assert.Equal($"{Shared.SiteConfig.BaseUrl}{page.Path}", page.Url);
3236
Assert.Equal("Test Page", page.PageTitle);
3337
Assert.Equal($"Test Page{Shared.SiteConfig.TitleSeparator}{Shared.SiteConfig.Title}", page.Title);
3438
Assert.Equal("This is a test page.", page.Description);
39+
Assert.Equal(new DateTime(2023, 10, 5), page.Published);
3540

3641
Assert.NotNull(page.Data);
37-
Assert.Contains("title", page.Data.Keys);
38-
Assert.Contains("description", page.Data.Keys);
39-
Assert.Contains("layout", page.Data.Keys);
42+
Assert.DoesNotContain("title", page.Data.Keys);
43+
Assert.DoesNotContain("description", page.Data.Keys);
44+
Assert.DoesNotContain("layout", page.Data.Keys);
45+
Assert.DoesNotContain("tags", page.Data.Keys);
46+
Assert.DoesNotContain("published", page.Data.Keys);
4047

4148
Assert.Equal(2, page.Tags.Length);
4249

@@ -82,10 +89,14 @@ public async Task Parse_ReturnsPage_WithDefaultLayout() {
8289
Assert.Equal("Test Page", page.PageTitle);
8390
Assert.Equal($"Test Page{Shared.SiteConfig.TitleSeparator}{Shared.SiteConfig.Title}", page.Title);
8491
Assert.Equal("This is a test page.", page.Description);
92+
Assert.Null(page.Published);
8593

8694
Assert.NotNull(page.Data);
87-
Assert.Contains("title", page.Data.Keys);
88-
Assert.Contains("description", page.Data.Keys);
95+
Assert.DoesNotContain("title", page.Data.Keys);
96+
Assert.DoesNotContain("description", page.Data.Keys);
97+
Assert.DoesNotContain("layout", page.Data.Keys);
98+
Assert.DoesNotContain("tags", page.Data.Keys);
99+
Assert.DoesNotContain("published", page.Data.Keys);
89100

90101
Assert.Empty(page.Tags);
91102

@@ -125,12 +136,12 @@ public async Task Parse_ReturnsPage_WithNoFrontMatter() {
125136
Assert.Null(page.PageTitle);
126137
Assert.Equal(Shared.SiteConfig.Title, page.Title);
127138
Assert.Equal(Shared.SiteConfig.Description, page.Description);
139+
Assert.Empty(page.Tags);
140+
Assert.Null(page.Published);
128141

129142
Assert.NotNull(page.Data);
130143
Assert.Empty(page.Data);
131144

132-
Assert.Empty(page.Tags);
133-
134145
Assert.Equal(pageFile.PageName, page.View.Name);
135146
Assert.Equal(Website.DefaultLayoutName, page.View.LayoutName);
136147
Assert.Equal(ViewType.Html, page.View.Type);

src/Ditto/test/Shared.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,14 @@ namespace Ditto.Tests;
44

55
public static class Shared {
66
public static string BasePath => Path.Join(AppContext.BaseDirectory, "assets", "pages");
7-
public static IModelValuesParser ModelValuesParser => new ModelValuesParser();
87
public static string OutputPath => Path.Join(AppContext.BaseDirectory, "assets", "output");
98

109
public static SiteConfig SiteConfig => new(
1110
BaseUrl: "https://example.com",
1211
Title: "Example Site",
1312
Description: "This is an example site.",
14-
TitleSeparator: Website.DefaultTitleSeparator);
15-
16-
public static IDictionary<string, object> SupplementalData => new Dictionary<string, object> {
17-
["site"] = SiteConfig
18-
};
13+
TitleSeparator: Website.DefaultTitleSeparator,
14+
Data: new Dictionary<string, object>());
1915

2016
public static IViewLoader TestViewLoader => new ViewLoader(BasePath);
2117

src/Ditto/test/SiteConfigTests.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,20 @@ public async Task Parse_ReturnsSiteConfig_WhenValidToml() {
1010
title = 'Example Site'
1111
description = 'This is an example site.'
1212
title_separator = '{Website.DefaultTitleSeparator}'
13+
contact_email = 'info@eastcitysoftware.com'
1314
""";
1415

1516
using var file = new MemoryStream(Encoding.UTF8.GetBytes(toml));
16-
var parser = new SiteConfigParser(Shared.ModelValuesParser);
17-
var config = await parser.Parse(file);
17+
var config = await SiteConfigParser.Parse(file);
1818
Assert.True(config.IsOk);
1919

2020
if (config.TryGet(out var siteConfig)) {
2121
Assert.Equal("https://example.com/", siteConfig.BaseUrl);
2222
Assert.Equal("Example Site", siteConfig.Title);
2323
Assert.Equal("This is an example site.", siteConfig.Description);
2424
Assert.Equal(Website.DefaultTitleSeparator, siteConfig.TitleSeparator);
25+
Assert.True(siteConfig.Data.ContainsKey("contact_email"));
26+
Assert.Equal("info@eastcitysoftware.com", siteConfig.Data["contact_email"]);
2527
}
2628
}
2729

@@ -32,18 +34,15 @@ public async Task Parse_ReturnsNull_WhenMissingRequiredFields() {
3234
";
3335

3436
using var input = new MemoryStream(Encoding.UTF8.GetBytes(toml));
35-
var parser = new SiteConfigParser(Shared.ModelValuesParser);
36-
var config = await parser.Parse(input);
37+
var config = await SiteConfigParser.Parse(input);
3738
Assert.True(config.IsError);
3839
}
3940
}
4041

4142
public sealed class SiteConfigLoaderTests {
42-
private readonly ISiteConfigParser _siteConfigParser = new SiteConfigParser(Shared.ModelValuesParser);
43-
4443
[Fact]
4544
public async Task Load_ReturnsSiteConfig_WhenFileExists() {
46-
var loader = new SiteConfigLoader(Shared.BasePath, _siteConfigParser);
45+
var loader = new SiteConfigLoader(Shared.BasePath);
4746
var config = await loader.Load();
4847
Assert.True(config.IsOk);
4948

@@ -57,7 +56,7 @@ public async Task Load_ReturnsSiteConfig_WhenFileExists() {
5756

5857
[Fact]
5958
public async Task Load_ReturnsNull_WhenFileDoesNotExist() {
60-
var loader = new SiteConfigLoader("nonexistent.toml", _siteConfigParser);
59+
var loader = new SiteConfigLoader("nonexistent.toml");
6160
var config = await loader.Load();
6261
Assert.True(config.IsError);
6362
}

src/Ditto/test/ViewTests.cs

Lines changed: 77 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,28 @@ public async Task Render_ReturnsRenderedString_WithLayoutAndPartial() {
66
var pageContent = """
77
<h1>{{title}}</h1>
88
<h2>{{description}}</h2>
9+
<h2>{{slug}}</h2>
10+
{{ if published }}
11+
<h3>{{ published | date.to_string '%Y-%m-%d' }}</h3>
12+
{{ end }}
913
<p>This is the content of the test page.</p>
1014
""";
1115

1216
var page = new Page(
1317
Path: "/test-page",
18+
Slug: "test-page",
1419
Url: "https://example.com/test-page",
1520
PageTitle: "Test Page",
1621
Title: $"Test Page{Shared.SiteConfig.TitleSeparator}{Shared.SiteConfig.Title}",
1722
Description: "This is a test page.",
1823
Tags: [],
24+
Published: default,
1925
Data: new Dictionary<string, object>(),
2026
View: new(Path.GetRandomFileName(), pageContent, ViewType.Html, "test-template"));
2127

22-
var result = await Shared.TestViewEngine.Render(page, Shared.SupplementalData);
28+
var result = await Shared.TestViewEngine.Render(page, Shared.SiteConfig, []);
2329

24-
var expected = $"""
30+
Shared.AssertHtmlEqual(result, $"""
2531
<html>
2632
<head>
2733
<title>Test Page{Shared.SiteConfig.TitleSeparator}{Shared.SiteConfig.Title}</title>
@@ -32,16 +38,40 @@ public async Task Render_ReturnsRenderedString_WithLayoutAndPartial() {
3238
<main>
3339
<h1>Test Page{Shared.SiteConfig.TitleSeparator}{Shared.SiteConfig.Title}</h1>
3440
<h2>This is a test page.</h2>
41+
<h2>test-page</h2>
3542
<p>This is the content of the test page.</p>
3643
</main>
3744
<footer>
3845
<p>&copy; {Shared.SiteConfig.Title}</p>
3946
</footer>
4047
</body>
4148
</html>
42-
""";
49+
""");
50+
51+
page = page with { Published = new(2023, 10, 05) };
52+
result = await Shared.TestViewEngine.Render(page, Shared.SiteConfig, []);
4353

44-
Shared.AssertHtmlEqual(expected, result);
54+
Shared.AssertHtmlEqual(result, $"""
55+
<html>
56+
<head>
57+
<title>Test Page{Shared.SiteConfig.TitleSeparator}{Shared.SiteConfig.Title}</title>
58+
<meta name="description" content="This is a test page.">
59+
</head>
60+
<body>
61+
<header>Test Template</header>
62+
<main>
63+
<h1>Test Page{Shared.SiteConfig.TitleSeparator}{Shared.SiteConfig.Title}</h1>
64+
<h2>This is a test page.</h2>
65+
<h2>test-page</h2>
66+
<h3>2023-10-05</h3>
67+
<p>This is the content of the test page.</p>
68+
</main>
69+
<footer>
70+
<p>&copy; {Shared.SiteConfig.Title}</p>
71+
</footer>
72+
</body>
73+
</html>
74+
""");
4575
}
4676

4777
[Fact]
@@ -50,24 +80,31 @@ public async Task Render_ReturnsRenderedString_ForMarkdown() {
5080
var pageContent = """
5181
# Test Page{{site.title_separator}}{{site.title}}
5282
83+
## {{ slug }}
84+
85+
{{ if published }}
86+
## {{ published | date.to_string '%Y-%m-%d' }}
87+
{{ end }}
5388
This is a test page.
5489
5590
This is the content of the test page.
5691
""";
5792

5893
var page = new Page(
5994
Path: "/test-page",
95+
Slug: "test-page",
6096
Url: "https://example.com/test-page",
6197
PageTitle: "Test Page",
6298
Title: $"Test Page{Shared.SiteConfig.TitleSeparator}{Shared.SiteConfig.Title}",
6399
Description: "This is a test page.",
64100
Tags: [],
101+
Published: default,
65102
Data: new Dictionary<string, object>(),
66103
View: new(Path.GetRandomFileName(), pageContent, ViewType.Markdown, "test-template"));
67104

68-
var result = await Shared.TestViewEngine.Render(page, Shared.SupplementalData);
105+
var result = await Shared.TestViewEngine.Render(page, Shared.SiteConfig, []);
69106

70-
var expected = $"""
107+
Shared.AssertHtmlEqual(result, $"""
71108
<html>
72109
<head>
73110
<title>Test Page{Shared.SiteConfig.TitleSeparator}{Shared.SiteConfig.Title}</title>
@@ -77,6 +114,7 @@ This is the content of the test page.
77114
<header>Test Template</header>
78115
<main>
79116
<h1>Test Page{Shared.SiteConfig.TitleSeparator}{Shared.SiteConfig.Title}</h1>
117+
<h2>test-page</h2>
80118
<p>This is a test page.</p>
81119
<p>This is the content of the test page.</p>
82120
</main>
@@ -85,9 +123,32 @@ This is the content of the test page.
85123
</footer>
86124
</body>
87125
</html>
88-
""";
126+
""");
127+
128+
page = page with { Published = new(2023, 10, 5) };
129+
result = await Shared.TestViewEngine.Render(page, Shared.SiteConfig, []);
89130

90-
Shared.AssertHtmlEqual(expected, result);
131+
Shared.AssertHtmlEqual(result, $"""
132+
<html>
133+
<head>
134+
<title>Test Page{Shared.SiteConfig.TitleSeparator}{Shared.SiteConfig.Title}</title>
135+
<meta name="description" content="This is a test page.">
136+
</head>
137+
<body>
138+
<header>Test Template</header>
139+
<main>
140+
<h1>Test Page{Shared.SiteConfig.TitleSeparator}{Shared.SiteConfig.Title}</h1>
141+
<h2>test-page</h2>
142+
<h2>2023-10-05</h2>
143+
<p>This is a test page.</p>
144+
<p>This is the content of the test page.</p>
145+
</main>
146+
<footer>
147+
<p>&copy; {Shared.SiteConfig.Title}</p>
148+
</footer>
149+
</body>
150+
</html>
151+
""");
91152
}
92153
}
93154

@@ -98,7 +159,7 @@ public async Task Render_ReturnsRenderedString_ForValidViewAndModel() {
98159
var model = new { name = "World" };
99160
var renderer = new ViewRenderer();
100161

101-
var result = await renderer.Render(view, model, default);
162+
var result = await renderer.Render(view, model);
102163

103164
Assert.Equal("Hello, World!", result);
104165
}
@@ -109,7 +170,7 @@ public async Task Render_ReturnsView_WhenModelIsEmpty() {
109170
var model = new { };
110171
var renderer = new ViewRenderer();
111172

112-
var result = await renderer.Render(view, model, default);
173+
var result = await renderer.Render(view, model);
113174

114175
Assert.Equal("Hello, !", result);
115176
}
@@ -123,7 +184,7 @@ public async Task Render_ReturnsView_WithPartial_WhenPartialExists() {
123184
var model = new { name = "Alice" };
124185
var renderer = new ViewRenderer(partials);
125186

126-
var result = await renderer.Render(view, model, default);
187+
var result = await renderer.Render(view, model);
127188
Assert.Equal("Hello, Alice!", result);
128189
}
129190

@@ -133,7 +194,7 @@ public async Task Render_DateOnly_ToDateTimeExtension_WorksInTemplate() {
133194
var model = new { testDate = new DateOnly(2024, 6, 15) };
134195
var renderer = new ViewRenderer();
135196

136-
var result = await renderer.Render(view, model, default);
197+
var result = await renderer.Render(view, model);
137198

138199
Assert.Equal("The date is 2024-06-15 00:00:00.", result);
139200
}
@@ -171,6 +232,7 @@ public async Task LoadViews_ReturnsLayoutViews_WhenValidInput() {
171232
var views = await Shared.TestViewLoader.LoadViews(Website.LayoutsDirectory);
172233
Assert.NotNull(views);
173234
Assert.NotEmpty(views.Names);
235+
Assert.Equal(2, views.Names.Count);
174236
Assert.Contains("default", views.Names);
175237
Assert.Contains("test-template", views.Names);
176238
}
@@ -180,8 +242,11 @@ public async Task LoadViews_ReturnsPartialViews_WhenValidInput() {
180242
var views = await Shared.TestViewLoader.LoadViews(Website.PartialsDirectory);
181243
Assert.NotNull(views);
182244
Assert.NotEmpty(views.Names);
245+
Assert.Equal(4, views.Names.Count);
183246
Assert.Contains("header", views.Names);
184247
Assert.Contains("footer", views.Names);
248+
Assert.Contains("posts/title", views.Names);
249+
Assert.Contains("posts/hello-world/info-graphic", views.Names);
185250
}
186251
}
187252

0 commit comments

Comments
 (0)