@@ -7,12 +7,38 @@ namespace AspNetCoreAnalyzers.Tests.Helpers
77
88 public class UrlTemplateTests
99 {
10- [ TestCase ( "{id}/info" , new [ ] { "{id}" , "info" } ) ]
11- [ TestCase ( "{id?}/info" , new [ ] { "{id?}" , "info" } ) ]
12- [ TestCase ( "{id:int}/info" , new [ ] { "{id:int}" , "info" } ) ]
13- [ TestCase ( "api/orders/{id}" , new [ ] { "api" , "orders" , "{id}" } ) ]
10+ [ TestCase ( "foo" , new [ ] { "foo" } ) ]
11+ [ TestCase ( "foo/bar" , new [ ] { "foo" , "bar" } ) ]
12+ public void TryParse ( string text , string [ ] expected )
13+ {
14+ var syntaxTree = CSharpSyntaxTree . ParseText ( @"
15+ namespace ValidCode
16+ {
17+ using System.Threading.Tasks;
18+ using Microsoft.AspNetCore.Mvc;
19+
20+ [ApiController]
21+ public class OrdersController : Controller
22+ {
23+ [HttpGet(""api/orders/{id}"")]
24+ public async Task<IActionResult> GetOrder([FromRoute]int id)
25+ {
26+ }
27+ }
28+ }" . AssertReplace ( "api/orders/{id}" , text ) ) ;
29+ var literal = syntaxTree . FindLiteralExpression ( text ) ;
30+ Assert . AreEqual ( true , UrlTemplate . TryParse ( literal , out var template ) ) ;
31+ CollectionAssert . AreEqual ( expected , template . Path . Select ( x => x . Text . Text ) ) ;
32+ }
33+
34+ [ TestCase ( "{id}" , new [ ] { "{id}" } ) ]
35+ [ TestCase ( "{id}/info" , new [ ] { "{id}" , "info" } ) ]
36+ [ TestCase ( "{id?}/info" , new [ ] { "{id?}" , "info" } ) ]
37+ [ TestCase ( "{id:int}/info" , new [ ] { "{id:int}" , "info" } ) ]
38+ [ TestCase ( "{id:required}/info" , new [ ] { "{id:required}" , "info" } ) ]
39+ [ TestCase ( "api/orders/{id}" , new [ ] { "api" , "orders" , "{id}" } ) ]
1440 [ TestCase ( "api/orders/{id}/info" , new [ ] { "api" , "orders" , "{id}" , "info" } ) ]
15- public void TryParseWhenInt ( string text , string [ ] expected )
41+ public void TryParseWithParameter ( string text , string [ ] expected )
1642 {
1743 var syntaxTree = CSharpSyntaxTree . ParseText ( @"
1844namespace ValidCode
@@ -34,12 +60,49 @@ public async Task<IActionResult> GetOrder([FromRoute]int id)
3460 CollectionAssert . AreEqual ( expected , template . Path . Select ( x => x . Text . Text ) ) ;
3561
3662 // ReSharper disable once PossibleInvalidOperationException
37- var parameter = template . Path . Single ( x => x . Parameter . HasValue ) . Parameter . Value ;
63+ var parameter = template . Path . Single ( x => x . Parameter . HasValue )
64+ . Parameter . Value ;
65+ Assert . AreEqual ( "id" , parameter . Name . Text ) ;
66+ }
67+
68+ [ TestCase ( "orders/{id:min(1)}" , new [ ] { "orders" , "{id:min(1)}" } ) ]
69+ [ TestCase ( "orders/{id:max(2)}" , new [ ] { "orders" , "{id:max(2)}" } ) ]
70+ [ TestCase ( "orders/{id:int:max(2)}" , new [ ] { "orders" , "{id:int:max(2)}" } ) ]
71+ [ TestCase ( "orders/{id:range(1,23)}" , new [ ] { "orders" , "{id:range(1,23)}" } ) ]
72+ public void TryParseWhenIntParameter ( string text , string [ ] expected )
73+ {
74+ var syntaxTree = CSharpSyntaxTree . ParseText ( @"
75+ namespace ValidCode
76+ {
77+ using System.Threading.Tasks;
78+ using Microsoft.AspNetCore.Mvc;
79+
80+ [ApiController]
81+ public class OrdersController : Controller
82+ {
83+ [HttpGet(""orders/{id}"")]
84+ public async Task<IActionResult> GetOrder([FromRoute]int id)
85+ {
86+ }
87+ }
88+ }" . AssertReplace ( "orders/{id}" , text ) ) ;
89+ var literal = syntaxTree . FindLiteralExpression ( text ) ;
90+ Assert . AreEqual ( true , UrlTemplate . TryParse ( literal , out var template ) ) ;
91+ CollectionAssert . AreEqual ( expected , template . Path . Select ( x => x . Text . Text ) ) ;
92+
93+ // ReSharper disable once PossibleInvalidOperationException
94+ var parameter = template . Path . Single ( x => x . Parameter . HasValue )
95+ . Parameter . Value ;
3896 Assert . AreEqual ( "id" , parameter . Name . Text ) ;
3997 }
4098
41- [ TestCase ( "orders/{id:alpha}" , new [ ] { "orders" , "{id:alpha}" } ) ]
42- public void TryParseWhenString ( string text , string [ ] expected )
99+ [ TestCase ( "orders/{id:alpha}" , new [ ] { "orders" , "{id:alpha}" } ) ]
100+ [ TestCase ( "orders/{id:alpha:minlength(1)}" , new [ ] { "orders" , "{id:alpha:minlength(1)}" } ) ]
101+ [ TestCase ( "orders/{id:minlength(1)}" , new [ ] { "orders" , "{id:minlength(1)}" } ) ]
102+ [ TestCase ( "orders/{id:maxlength(1)}" , new [ ] { "orders" , "{id:maxlength(1)}" } ) ]
103+ [ TestCase ( "orders/{id:length(1)}" , new [ ] { "orders" , "{id:length(1)}" } ) ]
104+ [ TestCase ( "orders/{id:length(1,2)}" , new [ ] { "orders" , "{id:length(1,2)}" } ) ]
105+ public void TryParseWhenStringParameter ( string text , string [ ] expected )
43106 {
44107 var syntaxTree = CSharpSyntaxTree . ParseText ( @"
45108namespace ValidCode
@@ -50,18 +113,19 @@ namespace ValidCode
50113 [ApiController]
51114 public class OrdersController : Controller
52115 {
53- [HttpGet(""orders/{id:alpha }"")]
116+ [HttpGet(""orders/{id}"")]
54117 public async Task<IActionResult> GetOrder(string id)
55118 {
56119 }
57120 }
58- }" . AssertReplace ( "api/ orders/{id}" , text ) ) ;
121+ }" . AssertReplace ( "orders/{id}" , text ) ) ;
59122 var literal = syntaxTree . FindLiteralExpression ( text ) ;
60123 Assert . AreEqual ( true , UrlTemplate . TryParse ( literal , out var template ) ) ;
61124 CollectionAssert . AreEqual ( expected , template . Path . Select ( x => x . Text . Text ) ) ;
62125
63126 // ReSharper disable once PossibleInvalidOperationException
64- var parameter = template . Path . Single ( x => x . Parameter . HasValue ) . Parameter . Value ;
127+ var parameter = template . Path . Single ( x => x . Parameter . HasValue )
128+ . Parameter . Value ;
65129 Assert . AreEqual ( "id" , parameter . Name . Text ) ;
66130 }
67131 }
0 commit comments