1+ // Copyright (c) .NET Foundation. All rights reserved.
2+ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+ using System ;
5+ using System . Collections . Generic ;
6+ using System . Linq ;
7+ using System . Linq . Expressions ;
8+ using System . Reflection ;
9+ using NuGet . Server . DataServices ;
10+ using Xunit ;
11+
12+ namespace NuGet . Server . Tests
13+ {
14+ public class IgnoreCaseForPackageIdInterceptorTest
15+ {
16+ private static readonly MemberInfo _idMember = typeof ( ODataPackage ) . GetProperty ( "Id" ) ;
17+ private static readonly Expression < Func < string , string , int > > _ordinalIgnoreCaseComparer = ( a , b ) => StringComparer . OrdinalIgnoreCase . Compare ( a , b ) ;
18+
19+ public static IEnumerable < object [ ] > TheoryData
20+ {
21+ get
22+ {
23+ return new [ ]
24+ {
25+ new object [ ]
26+ {
27+ Expression . MakeBinary (
28+ ExpressionType . Equal ,
29+ Expression . Constant ( "NEWTONSOFT.JSON" ) ,
30+ Expression . MakeMemberAccess ( Expression . Parameter ( typeof ( ODataPackage ) ) , _idMember ) ) ,
31+
32+ Expression . MakeBinary (
33+ ExpressionType . Equal ,
34+ Expression . Invoke ( _ordinalIgnoreCaseComparer ,
35+ Expression . MakeMemberAccess ( Expression . Parameter ( typeof ( ODataPackage ) ) , _idMember ) ,
36+ Expression . Constant ( "NEWTONSOFT.JSON" )
37+ ) ,
38+ Expression . Constant ( 0 ) )
39+ } ,
40+
41+ new object [ ]
42+ {
43+ Expression . MakeBinary (
44+ ExpressionType . Equal ,
45+ Expression . MakeMemberAccess ( Expression . Parameter ( typeof ( ODataPackage ) ) , _idMember ) ,
46+ Expression . Constant ( "NEWTONSOFT.JSON" ) ) ,
47+
48+ Expression . MakeBinary (
49+ ExpressionType . Equal ,
50+ Expression . Invoke ( _ordinalIgnoreCaseComparer ,
51+ Expression . MakeMemberAccess ( Expression . Parameter ( typeof ( ODataPackage ) ) , _idMember ) ,
52+ Expression . Constant ( "NEWTONSOFT.JSON" )
53+ ) ,
54+ Expression . Constant ( 0 ) )
55+ }
56+ } ;
57+ }
58+ }
59+
60+ [ Theory ]
61+ [ MemberData ( "TheoryData" ) ]
62+ public void RewritesIdComparisonToIgnoreCaseComparison ( Expression originalExpression , Expression expectedExpression )
63+ {
64+ // Arrange
65+ var interceptor = new IgnoreCaseForPackageIdInterceptor ( ) ;
66+
67+ // Act
68+ var rewrittenExpression = interceptor . Visit ( originalExpression ) ;
69+
70+ // Assert
71+ Assert . Equal ( rewrittenExpression . ToString ( ) , expectedExpression . ToString ( ) ) ;
72+ }
73+
74+ [ Fact ]
75+ public void FindsPackagesIgnoringCase ( )
76+ {
77+ // Arrange
78+ var data = new List < ODataPackage > ( ) ;
79+ data . Add ( new ODataPackage { Id = "foo" } ) ;
80+ data . Add ( new ODataPackage { Id = "BAR" } ) ;
81+ data . Add ( new ODataPackage { Id = "bAz" } ) ;
82+
83+ var queryable = data . AsQueryable ( ) . InterceptWith ( new IgnoreCaseForPackageIdInterceptor ( ) ) ;
84+
85+ // Act
86+ var result1 = queryable . FirstOrDefault ( p => p . Id == "foo" ) ;
87+ var result2 = queryable . FirstOrDefault ( p => p . Id == "FOO" ) ;
88+ var result3 = queryable . FirstOrDefault ( p => p . Id == "Foo" ) ;
89+
90+ var result4 = queryable . FirstOrDefault ( p => p . Id == "bar" ) ;
91+ var result5 = queryable . FirstOrDefault ( p => p . Id == "BAR" ) ;
92+ var result6 = queryable . FirstOrDefault ( p => p . Id == "baR" ) ;
93+
94+ var result7 = queryable . FirstOrDefault ( p => p . Id == "baz" ) ;
95+ var result8 = queryable . FirstOrDefault ( p => p . Id == "BAZ" ) ;
96+ var result9 = queryable . FirstOrDefault ( p => p . Id == "bAz" ) ;
97+
98+ // Assert
99+ Assert . Equal ( result1 . Id , data [ 0 ] . Id ) ;
100+ Assert . Equal ( result2 . Id , data [ 0 ] . Id ) ;
101+ Assert . Equal ( result3 . Id , data [ 0 ] . Id ) ;
102+
103+ Assert . Equal ( result4 . Id , data [ 1 ] . Id ) ;
104+ Assert . Equal ( result5 . Id , data [ 1 ] . Id ) ;
105+ Assert . Equal ( result6 . Id , data [ 1 ] . Id ) ;
106+
107+ Assert . Equal ( result7 . Id , data [ 2 ] . Id ) ;
108+ Assert . Equal ( result8 . Id , data [ 2 ] . Id ) ;
109+ Assert . Equal ( result9 . Id , data [ 2 ] . Id ) ;
110+ }
111+ }
112+ }
0 commit comments