public void Can_compare_DateTime() { var context = new TemplatePagesContext { Args = { ["year2000"] = new DateTime(2000, 1, 1), ["year2100"] = new DateTime(2100, 1, 1), } }.Init(); Assert.That(new PageResult(context.OneTimePage("{{ 'now > year2000' | if(gt(now,year2000)) | raw }}")).Result, Is.EqualTo("now > year2000")); Assert.That(new PageResult(context.OneTimePage("{{ 'now >= year2000' | if(gte(now,year2000)) | raw }}")).Result, Is.EqualTo("now >= year2000")); Assert.That(new PageResult(context.OneTimePage("{{ 'now <= year2000' | if(lte(now,year2000)) }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ 'now < year2000' | if(lt(now,year2000)) }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ 'now > year2100' | if(gt(now,year2100)) }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ 'now >= year2100' | if(gte(now,year2100)) }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ 'now <= year2100' | if(lte(now,year2100)) | raw }}")).Result, Is.EqualTo("now <= year2100")); Assert.That(new PageResult(context.OneTimePage("{{ 'now < year2100' | if(lt(now,year2100)) | raw }}")).Result, Is.EqualTo("now < year2100")); Assert.That(new PageResult(context.OneTimePage("{{ '\"2001-01-01\" > year2100' | if(gt(\"2001-01-01\",year2100)) }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ '\"2001-01-01\" >= year2100' | if(gte(\"2001-01-01\",year2100)) }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ '\"2001-01-01\" <= year2100' | if(lte(\"2001-01-01\",year2100)) | raw }}")).Result, Is.EqualTo("\"2001-01-01\" <= year2100")); Assert.That(new PageResult(context.OneTimePage("{{ '\"2001-01-01\" < year2100' | if(lt(\"2001-01-01\",year2100)) | raw }}")).Result, Is.EqualTo("\"2001-01-01\" < year2100")); }
public async Task Can_generate_html_template_with_layout_in_memory() { var context = new TemplatePagesContext(); context.VirtualFiles.WriteFile("_layout.html", @" <html> <title>{{ title }}</title> </head> <body> {{ page }} </body>"); context.VirtualFiles.WriteFile("page.html", @"<h1>{{ title }}</h1>"); var page = context.GetPage("page"); var result = new PageResult(page) { Args = { { "title", "The Title" }, } }; var html = await result.RenderToStringAsync(); Assert.That(html, Is.EqualTo(@"<html> <title>The Title</title> </head> <body> <h1>The Title</h1> </body>")); }
public async Task Does_use_custom_filter() { var context = new TemplatePagesContext { Args = { ["contextArg"] = "foo" }, }.Init(); context.VirtualFiles.WriteFile("page.html", "<h1>{{ 'hello' | echo }}</h1>"); var result = await new PageResult(context.GetPage("page")) { TemplateFilters = { new MyFilter() } }.RenderToStringAsync(); Assert.That(result, Is.EqualTo("<h1>hello hello</h1>")); context.VirtualFiles.WriteFile("page-greet.html", "<h1>{{ 'contextArg' | greetArg }}</h1>"); result = await new PageResult(context.GetPage("page-greet")) { TemplateFilters = { new MyFilter() } }.RenderToStringAsync(); Assert.That(result, Is.EqualTo("<h1>Hello foo</h1>")); }
public void Can_use_logical_boolean_operators() { var context = new TemplatePagesContext { Args = { ["foo"] = "foo", ["bar"] = "bar", ["year2000"] = new DateTime(2000, 1, 1), ["year2100"] = new DateTime(2100, 1, 1), ["contextTrue"] = true, ["contextFalse"] = false, } }.Init(); Assert.That(new PageResult(context.OneTimePage("{{ 'or(true,true)' | if(or(true,true)) | raw }}")).Result, Is.EqualTo("or(true,true)")); Assert.That(new PageResult(context.OneTimePage("{{ 'or(true,false)' | if(or(true,false)) | raw }}")).Result, Is.EqualTo("or(true,false)")); Assert.That(new PageResult(context.OneTimePage("{{ 'or(false,false)' | if(or(false,false)) | raw }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ 'and(true,true)' | if(and(true,true)) | raw }}")).Result, Is.EqualTo("and(true,true)")); Assert.That(new PageResult(context.OneTimePage("{{ 'and(true,false)' | if(and(true,false)) | raw }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ 'and(false,false)' | if(and(false,false)) | raw }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ 'or(contextTrue,contextTrue)' | if(or(contextTrue,contextTrue)) | raw }}")).Result, Is.EqualTo("or(contextTrue,contextTrue)")); Assert.That(new PageResult(context.OneTimePage("{{ 'or(contextTrue,contextFalse)' | if(or(contextTrue,contextFalse)) | raw }}")).Result, Is.EqualTo("or(contextTrue,contextFalse)")); Assert.That(new PageResult(context.OneTimePage("{{ 'or(contextFalse,contextFalse)' | if(or(contextFalse,contextFalse)) | raw }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ 'or(gt(now,year2000),eq(\"foo\",bar))' | if(or(gt(now,year2000),eq(\"foo\",bar))) | raw }}")).Result, Is.EqualTo("or(gt(now,year2000),eq(\"foo\",bar))")); Assert.That(new PageResult(context.OneTimePage(@"{{ 'or(gt(now,year2000),eq(""foo"",bar))' | if ( or ( gt ( now, year2000 ), eq ( ""foo"", bar ) ) ) | raw }}")).Result, Is.EqualTo("or(gt(now,year2000),eq(\"foo\",bar))")); Assert.That(new PageResult(context.OneTimePage(@"{{ 'or(and(gt(now,year2000),eq(""foo"",bar)),and(gt(now,year2000),eq(""foo"",foo)))' | if ( or ( and ( gt ( now, year2000 ), eq ( ""foo"", bar ) ), and ( gt ( now, year2000 ), eq ( ""foo"", foo ) ) ) ) | raw }}")).Result, Is.EqualTo(@"or(and(gt(now,year2000),eq(""foo"",bar)),and(gt(now,year2000),eq(""foo"",foo)))")); }
public void Can_use_protected_includeFiles_in_context_or_PageResult() { var context = new TemplatePagesContext { TemplateFilters = { new TemplateProtectedFilters() } }.Init(); context.VirtualFiles.WriteFile("index.txt", "file contents"); Assert.That(new PageResult(context.OneTimePage("{{ 'index.txt' | includeFile }}")).Result, Is.EqualTo("file contents")); }
public async Task Does_explode_Model_properties_of_anon_object_into_scope() { var context = new TemplatePagesContext(); context.VirtualFiles.WriteFile("page.html", @"Id: {{ Id }}, Name: {{ Name }}"); var result = await new PageResult(context.GetPage("page")) { Model = new { Id = 1, Name = "<foo>" } }.RenderToStringAsync(); Assert.That(result, Is.EqualTo("Id: 1, Name: <foo>")); }
public TemplatePagesContext CreateContext() { var context = new TemplatePagesContext { ScanAssemblies = { typeof(FilterExamples).GetAssembly() } }; context.Container.AddSingleton <IDep>(() => new Dep { Greeting = "hi " }); return(context); }
public void Can_compare_numbers() { var context = new TemplatePagesContext { Args = { ["two"] = 2 } }.Init(); Assert.That(new PageResult(context.OneTimePage("{{ 2 | greaterThan(1) }}")).Result, Is.EqualTo("True")); Assert.That(new PageResult(context.OneTimePage("{{ two | greaterThan(1) }}")).Result, Is.EqualTo("True")); Assert.That(new PageResult(context.OneTimePage("{{ greaterThan(two,1) }}")).Result, Is.EqualTo("True")); Assert.That(new PageResult(context.OneTimePage("{{ greaterThan(2,2) }}")).Result, Is.EqualTo("False")); Assert.That(new PageResult(context.OneTimePage("{{ greaterThan(two,2) }}")).Result, Is.EqualTo("False")); Assert.That(new PageResult(context.OneTimePage("{{ greaterThan(two,two) }}")).Result, Is.EqualTo("False")); Assert.That(new PageResult(context.OneTimePage("{{ 'two > 1' | if(gt(two,1)) | raw }}")).Result, Is.EqualTo("two > 1")); Assert.That(new PageResult(context.OneTimePage("{{ 'two > 2' | if(greaterThan(two,2)) }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ 'two > 3' | if(greaterThan(two,3)) }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ 'two > two' | if(greaterThan(two,two)) }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ 'two >= two' | if(greaterThanEqual(two,two)) | raw }}")).Result, Is.EqualTo("two >= two")); Assert.That(new PageResult(context.OneTimePage("{{ '1 >= 2' | if(greaterThanEqual(1,2)) }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ '2 >= 2' | if(greaterThanEqual(2,2)) | raw }}")).Result, Is.EqualTo("2 >= 2")); Assert.That(new PageResult(context.OneTimePage("{{ '3 >= 2' | if(greaterThanEqual(3,2)) | raw }}")).Result, Is.EqualTo("3 >= 2")); Assert.That(new PageResult(context.OneTimePage("{{ '1 > 2' | if(greaterThan(1,2)) }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ '2 > 2' | if(greaterThan(2,2)) }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ '3 > 2' | if(greaterThan(3,2)) | raw }}")).Result, Is.EqualTo("3 > 2")); Assert.That(new PageResult(context.OneTimePage("{{ '1 <= 2' | if(lessThanEqual(1,2)) | raw }}")).Result, Is.EqualTo("1 <= 2")); Assert.That(new PageResult(context.OneTimePage("{{ '2 <= 2' | if(lessThanEqual(2,2)) | raw }}")).Result, Is.EqualTo("2 <= 2")); Assert.That(new PageResult(context.OneTimePage("{{ '3 <= 2' | if(lessThanEqual(3,2)) }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ '1 < 2' | if(lessThan(1,2)) | raw }}")).Result, Is.EqualTo("1 < 2")); Assert.That(new PageResult(context.OneTimePage("{{ '2 < 2' | if(lessThan(2,2)) }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ '3 < 2' | if(lessThan(3,2)) }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ '2 > 2' | if(gt(2,2)) }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ '2 >= 2' | if(gte(2,2)) | raw }}")).Result, Is.EqualTo("2 >= 2")); Assert.That(new PageResult(context.OneTimePage("{{ '2 <= 2' | if(lte(2,2)) | raw }}")).Result, Is.EqualTo("2 <= 2")); Assert.That(new PageResult(context.OneTimePage("{{ '2 < 2' | if(lt(2,2)) }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ '2 == 2' | if(equals(2,2)) }}")).Result, Is.EqualTo("2 == 2")); Assert.That(new PageResult(context.OneTimePage("{{ '2 == 2' | if(eq(2,2)) }}")).Result, Is.EqualTo("2 == 2")); Assert.That(new PageResult(context.OneTimePage("{{ '2 != 2' | if(notEquals(2,2)) }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ '2 != 2' | if(not(2,2)) }}")).Result, Is.EqualTo("")); }
public async Task Does_reload_modified_page_contents_in_DebugMode() { var context = new TemplatePagesContext { DebugMode = true, //default }; context.VirtualFiles.WriteFile("page.html", "<h1>Original</h1>"); Assert.That(await new PageResult(context.GetPage("page")).RenderToStringAsync(), Is.EqualTo("<h1>Original</h1>")); await Task.Delay(1); //Memory VFS is too fast! context.VirtualFiles.WriteFile("page.html", "<h1>Updated</h1>"); Assert.That(await new PageResult(context.GetPage("page")).RenderToStringAsync(), Is.EqualTo("<h1>Updated</h1>")); }
public void Context_Throws_FileNotFoundException_when_page_does_not_exist() { var context = new TemplatePagesContext(); Assert.That(context.Pages.GetPage("not-exists.html"), Is.Null); try { var page = context.GetPage("not-exists.html"); Assert.Fail("Should throw"); } catch (FileNotFoundException e) { e.ToString().Print(); } }
public TemplatePagesContext CreateContext(Dictionary <string, object> args = null) { var context = new TemplatePagesContext { Args = { ["foo"] = "bar", ["intVal"] = 1, ["doubleVal"] = 2.2 } }; args.Each((key, val) => context.Args[key] = val); return(context); }
public async Task Does_embed_partials() { var context = new TemplatePagesContext { Args = { ["copyright"] = "Copyright © ServiceStack 2008-2017", ["footer"] = "global-footer" } }.Init(); context.VirtualFiles.WriteFile("_layout.html", @" <html> <head><title>{{ title }}</title></head> <body> {{ 'header' | partial }} <div id='content'>{{ page }}</div> {{ footer | partial }} </body> </html> "); context.VirtualFiles.WriteFile("header.html", "<header>{{ pageTitle | titleCase }}</header>"); context.VirtualFiles.WriteFile("page.html", "<h2>{{ contentTitle }}</h2><section>{{ 'page-content' | partial }}</section>"); context.VirtualFiles.WriteFile("page-content.html", "<p>{{ contentBody | padRight(20,'.') }}</p>"); context.VirtualFiles.WriteFile("global-footer.html", "<footer>{{ copyright | raw }}</footer>"); var result = await new PageResult(context.GetPage("page")) { Args = { ["pageTitle"] = "I'm in your header", ["contentTitle"] = "Content is King!", ["contentBody"] = "About this page", } }.RenderToStringAsync(); Assert.That(result.SanitizeNewLines(), Is.EqualTo(@" <html> <head><title>{{ title }}</title></head> <body> <header>I'm In Your Header</header> <div id='content'><h2>Content is King!</h2><section><p>About this page.....</p></section></div> <footer>Copyright © ServiceStack 2008-2017</footer> </body> </html> ".SanitizeNewLines())); }
public void Does_not_include_protected_filters_by_default() { var context = new TemplatePagesContext().Init(); context.VirtualFiles.WriteFile("index.txt", "file contents"); Assert.That(new PageResult(context.OneTimePage("{{ 'index.txt' | includeFile }}")).Result, Is.EqualTo("{{ 'index.txt' | includeFile }}")); using (new BasicAppHost().Init()) { var feature = new TemplatePagesFeature().Init(); feature.VirtualFiles.WriteFile("index.txt", "file contents"); Assert.That(new PageResult(context.OneTimePage("{{ 'index.txt' | includeFile }}")).Result, Is.EqualTo("{{ 'index.txt' | includeFile }}")); } }
public async Task Can_generate_markdown_template_with_html_layout_in_memory() { var context = new TemplatePagesContext { PageFormats = { new MarkdownPageFormat() } }; context.VirtualFiles.WriteFile("_layout.html", @" <html> <title>{{ title }}</title> </head> <body> {{ page }} </body>"); context.VirtualFiles.WriteFile("page.md", @"### {{ title }}"); var page = context.GetPage("page"); var result = new PageResult(page) { Args = { { "title", "The Title" }, }, ContentType = MimeTypes.Html, PageTransformers = { MarkdownPageFormat.TransformToHtml }, }; var html = await result.RenderToStringAsync(); Assert.That(html.SanitizeNewLines(), Is.EqualTo(@"<html> <title>The Title</title> </head> <body> <h3>The Title</h3> </body>".SanitizeNewLines())); }
public void Can_incrment_and_decrement() { var context = new TemplatePagesContext { Args = { ["ten"] = 10 } }.Init(); Assert.That(new PageResult(context.OneTimePage("{{ 1 | incr }}")).Result, Is.EqualTo("2")); Assert.That(new PageResult(context.OneTimePage("{{ ten | incr }}")).Result, Is.EqualTo("11")); Assert.That(new PageResult(context.OneTimePage("{{ 1 | incrBy(2) }}")).Result, Is.EqualTo("3")); Assert.That(new PageResult(context.OneTimePage("{{ ten | incrBy(2) }}")).Result, Is.EqualTo("12")); Assert.That(new PageResult(context.OneTimePage("{{ incr(1) }}")).Result, Is.EqualTo("2")); Assert.That(new PageResult(context.OneTimePage("{{ incr(ten) }}")).Result, Is.EqualTo("11")); Assert.That(new PageResult(context.OneTimePage("{{ incrBy(ten,2) }}")).Result, Is.EqualTo("12")); Assert.That(new PageResult(context.OneTimePage("{{ 1 | decr }}")).Result, Is.EqualTo("0")); Assert.That(new PageResult(context.OneTimePage("{{ ten | decrBy(2) }}")).Result, Is.EqualTo("8")); }
public void Can_compare_strings() { var context = new TemplatePagesContext { Args = { ["foo"] = "foo", ["bar"] = "bar", } }.Init(); Assert.That(new PageResult(context.OneTimePage("{{ 'foo > \"foo\"' | if(gt(foo,\"foo\")) }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ 'foo >= \"foo\"' | if(gte(foo,\"foo\")) | raw }}")).Result, Is.EqualTo("foo >= \"foo\"")); Assert.That(new PageResult(context.OneTimePage("{{ 'foo <= \"foo\"' | if(lte(foo,\"foo\")) | raw }}")).Result, Is.EqualTo("foo <= \"foo\"")); Assert.That(new PageResult(context.OneTimePage("{{ 'foo < \"foo\"' | if(lt(foo,\"foo\")) }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ 'bar > \"foo\"' | if(gt(bar,\"foo\")) }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ 'bar >= \"foo\"' | if(gte(bar,\"foo\")) | raw }}")).Result, Is.EqualTo("")); Assert.That(new PageResult(context.OneTimePage("{{ 'bar <= \"foo\"' | if(lte(bar,\"foo\")) | raw }}")).Result, Is.EqualTo("bar <= \"foo\"")); Assert.That(new PageResult(context.OneTimePage("{{ 'bar < \"foo\"' | if(lt(bar,\"foo\")) | raw }}")).Result, Is.EqualTo("bar < \"foo\"")); }
public async Task Can_generate_markdown_template_with_layout_in_memory() { var context = new TemplatePagesContext { PageFormats = { new MarkdownPageFormat() } }; context.VirtualFiles.WriteFile("_layout.md", @" # {{ title }} Brackets in Layout < & > {{ page }}"); context.VirtualFiles.WriteFile("page.md", @"## {{ title }}"); var page = context.GetPage("page"); var result = new PageResult(page) { Args = { { "title", "The Title" }, }, ContentType = MimeTypes.Html, OutputTransformers = { MarkdownPageFormat.TransformToHtml }, }; var html = await result.RenderToStringAsync(); Assert.That(html.SanitizeNewLines(), Is.EqualTo(@"<h1>The Title</h1> <p>Brackets in Layout < & > </p> <h2>The Title</h2>".SanitizeNewLines())); }