16
16
use Symfony \Component \HttpKernel \Controller \ArgumentResolver ;
17
17
use Symfony \Component \HttpKernel \Controller \ArgumentResolver \DefaultValueResolver ;
18
18
use Symfony \Component \HttpKernel \ControllerMetadata \ArgumentMetadata ;
19
+ use Symfony \Component \Security \Core \Authentication \Token \NullToken ;
19
20
use Symfony \Component \Security \Core \Authentication \Token \Storage \TokenStorage ;
20
21
use Symfony \Component \Security \Core \Authentication \Token \UsernamePasswordToken ;
22
+ use Symfony \Component \Security \Core \Exception \AccessDeniedException ;
21
23
use Symfony \Component \Security \Core \User \InMemoryUser ;
22
24
use Symfony \Component \Security \Core \User \UserInterface ;
23
25
use Symfony \Component \Security \Http \Attribute \CurrentUser ;
24
26
use Symfony \Component \Security \Http \Controller \UserValueResolver ;
25
27
26
28
class UserValueResolverTest extends TestCase
27
29
{
28
- public function testResolveNoToken ()
30
+ public function testSupportsFailsWithNoType ()
29
31
{
30
32
$ tokenStorage = new TokenStorage ();
31
33
$ resolver = new UserValueResolver ($ tokenStorage );
32
- $ metadata = new ArgumentMetadata ('foo ' , UserInterface::class , false , false , null );
34
+ $ metadata = new ArgumentMetadata ('foo ' , null , false , false , null );
33
35
34
36
$ this ->assertFalse ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
35
37
}
36
38
37
- public function testResolveNoUser ()
39
+ public function testSupportsFailsWhenDefaultValAndNoUser ()
38
40
{
39
- $ mock = $ this ->createMock (UserInterface::class);
40
- $ token = new UsernamePasswordToken (new InMemoryUser ('username ' , 'password ' ), 'provider ' );
41
41
$ tokenStorage = new TokenStorage ();
42
- $ tokenStorage ->setToken ($ token );
43
-
44
42
$ resolver = new UserValueResolver ($ tokenStorage );
45
- $ metadata = new ArgumentMetadata ('foo ' , \get_class ( $ mock ) , false , false , null );
43
+ $ metadata = new ArgumentMetadata ('foo ' , UserInterface::class , false , true , new InMemoryUser ( ' username ' , ' password ' ) );
46
44
47
45
$ this ->assertFalse ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
48
46
}
49
47
50
- public function testResolveWrongType ()
48
+ public function testResolveSucceedsWithUserInterface ()
51
49
{
50
+ $ user = new InMemoryUser ('username ' , 'password ' );
51
+ $ token = new UsernamePasswordToken ($ user , 'provider ' );
52
52
$ tokenStorage = new TokenStorage ();
53
+ $ tokenStorage ->setToken ($ token );
54
+
53
55
$ resolver = new UserValueResolver ($ tokenStorage );
54
- $ metadata = new ArgumentMetadata ('foo ' , null , false , false , null );
56
+ $ metadata = new ArgumentMetadata ('foo ' , UserInterface::class , false , false , null );
55
57
56
- $ this ->assertFalse ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
58
+ $ this ->assertTrue ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
59
+ $ this ->assertSame ([$ user ], iterator_to_array ($ resolver ->resolve (Request::create ('/ ' ), $ metadata )));
57
60
}
58
61
59
- public function testResolve ()
62
+ public function testResolveSucceedsWithSubclassType ()
60
63
{
61
64
$ user = new InMemoryUser ('username ' , 'password ' );
62
65
$ token = new UsernamePasswordToken ($ user , 'provider ' );
63
66
$ tokenStorage = new TokenStorage ();
64
67
$ tokenStorage ->setToken ($ token );
65
68
66
69
$ resolver = new UserValueResolver ($ tokenStorage );
67
- $ metadata = new ArgumentMetadata ('foo ' , UserInterface ::class, false , false , null );
70
+ $ metadata = new ArgumentMetadata ('foo ' , InMemoryUser ::class, false , false , null , false , [ new CurrentUser ()] );
68
71
69
72
$ this ->assertTrue ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
70
73
$ this ->assertSame ([$ user ], iterator_to_array ($ resolver ->resolve (Request::create ('/ ' ), $ metadata )));
71
74
}
72
75
73
- public function testResolveWithAttribute ()
76
+ public function testResolveSucceedsWithNullableParamAndNoUser ()
77
+ {
78
+ $ token = new NullToken ();
79
+ $ tokenStorage = new TokenStorage ();
80
+ $ tokenStorage ->setToken ($ token );
81
+
82
+ $ resolver = new UserValueResolver ($ tokenStorage );
83
+ $ metadata = new ArgumentMetadata ('foo ' , InMemoryUser::class, false , false , null , true , [new CurrentUser ()]);
84
+
85
+ $ this ->assertTrue ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
86
+ $ this ->assertSame ([null ], iterator_to_array ($ resolver ->resolve (Request::create ('/ ' ), $ metadata )));
87
+ }
88
+
89
+ public function testResolveSucceedsWithNullableAttribute ()
74
90
{
75
91
$ user = new InMemoryUser ('username ' , 'password ' );
76
92
$ token = new UsernamePasswordToken ($ user , 'provider ' );
@@ -85,14 +101,59 @@ public function testResolveWithAttribute()
85
101
$ this ->assertSame ([$ user ], iterator_to_array ($ resolver ->resolve (Request::create ('/ ' ), $ metadata )));
86
102
}
87
103
88
- public function testResolveWithAttributeAndNoUser ()
104
+ public function testResolveSucceedsWithTypedAttribute ()
89
105
{
106
+ $ user = new InMemoryUser ('username ' , 'password ' );
107
+ $ token = new UsernamePasswordToken ($ user , 'provider ' );
90
108
$ tokenStorage = new TokenStorage ();
109
+ $ tokenStorage ->setToken ($ token );
91
110
92
111
$ resolver = new UserValueResolver ($ tokenStorage );
93
- $ metadata = new ArgumentMetadata ('foo ' , null , false , false , null , false , [new CurrentUser ()]);
112
+ $ metadata = $ this ->createMock (ArgumentMetadata::class);
113
+ $ metadata = new ArgumentMetadata ('foo ' , InMemoryUser::class, false , false , null , false , [new CurrentUser ()]);
94
114
95
- $ this ->assertFalse ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
115
+ $ this ->assertTrue ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
116
+ $ this ->assertSame ([$ user ], iterator_to_array ($ resolver ->resolve (Request::create ('/ ' ), $ metadata )));
117
+ }
118
+
119
+ public function testResolveThrowsAccessDeniedWithWrongUserClass ()
120
+ {
121
+ $ user = $ this ->createMock (UserInterface::class);
122
+ $ token = new UsernamePasswordToken ($ user , 'provider ' );
123
+ $ tokenStorage = new TokenStorage ();
124
+ $ tokenStorage ->setToken ($ token );
125
+
126
+ $ resolver = new UserValueResolver ($ tokenStorage );
127
+ $ metadata = new ArgumentMetadata ('foo ' , InMemoryUser::class, false , false , null , false , [new CurrentUser ()]);
128
+
129
+ $ this ->assertTrue ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
130
+ $ this ->expectException (AccessDeniedException::class);
131
+ $ this ->expectExceptionMessageMatches ('/^The logged-in user is an instance of "Mock_UserInterface[^"]+" and an user of type "Symfony \\\\Component \\\\Security \\\\Core \\\\User \\\\InMemoryUser" is expected.$/ ' );
132
+ iterator_to_array ($ resolver ->resolve (Request::create ('/ ' ), $ metadata ));
133
+ }
134
+
135
+ public function testResolveThrowsAccessDeniedWithAttributeAndNoUser ()
136
+ {
137
+ $ tokenStorage = new TokenStorage ();
138
+
139
+ $ resolver = new UserValueResolver ($ tokenStorage );
140
+ $ metadata = new ArgumentMetadata ('foo ' , UserInterface::class, false , false , null , false , [new CurrentUser ()]);
141
+
142
+ $ this ->assertTrue ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
143
+ $ this ->expectException (AccessDeniedException::class);
144
+ $ this ->expectExceptionMessage ('There is no logged-in user to pass to $foo, make the argument nullable if you want to allow anonymous access to the action. ' );
145
+ iterator_to_array ($ resolver ->resolve (Request::create ('/ ' ), $ metadata ));
146
+ }
147
+
148
+ public function testResolveThrowsAcessDeniedWithNoToken ()
149
+ {
150
+ $ tokenStorage = new TokenStorage ();
151
+ $ resolver = new UserValueResolver ($ tokenStorage );
152
+ $ metadata = new ArgumentMetadata ('foo ' , UserInterface::class, false , false , null );
153
+
154
+ $ this ->assertTrue ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
155
+ $ this ->expectException (AccessDeniedException::class);
156
+ iterator_to_array ($ resolver ->resolve (Request::create ('/ ' ), $ metadata ));
96
157
}
97
158
98
159
public function testIntegration ()
0 commit comments