17
17
use Symfony \Component \HttpKernel \Controller \ArgumentResolver \DefaultValueResolver ;
18
18
use Symfony \Component \HttpKernel \ControllerMetadata \ArgumentMetadata ;
19
19
use Symfony \Component \Security \Core \Authentication \Token \Storage \TokenStorage ;
20
+ use Symfony \Component \Security \Core \Authentication \Token \NullToken ;
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 testResolveSucceedsWithUserInterface ()
38
40
{
39
- $ mock = $ this -> createMock (UserInterface::class );
40
- $ token = new UsernamePasswordToken (new InMemoryUser ( ' username ' , ' password ' ) , 'provider ' );
41
+ $ user = new InMemoryUser ( ' username ' , ' password ' );
42
+ $ token = new UsernamePasswordToken ($ user , 'provider ' );
41
43
$ tokenStorage = new TokenStorage ();
42
44
$ tokenStorage ->setToken ($ token );
43
45
44
46
$ resolver = new UserValueResolver ($ tokenStorage );
45
- $ metadata = new ArgumentMetadata ('foo ' , \get_class ( $ mock ) , false , false , null );
47
+ $ metadata = new ArgumentMetadata ('foo ' , UserInterface::class , false , false , null );
46
48
47
- $ this ->assertFalse ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
49
+ $ this ->assertTrue ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
50
+ $ this ->assertSame ([$ user ], iterator_to_array ($ resolver ->resolve (Request::create ('/ ' ), $ metadata )));
48
51
}
49
52
50
- public function testResolveWrongType ()
53
+ public function testResolveSucceedsWithSubclassType ()
51
54
{
55
+ $ user = new InMemoryUser ('username ' , 'password ' );
56
+ $ token = new UsernamePasswordToken ($ user , 'provider ' );
52
57
$ tokenStorage = new TokenStorage ();
58
+ $ tokenStorage ->setToken ($ token );
59
+
53
60
$ resolver = new UserValueResolver ($ tokenStorage );
54
- $ metadata = new ArgumentMetadata ('foo ' , null , false , false , null );
61
+ $ metadata = new ArgumentMetadata ('foo ' , InMemoryUser::class , false , false , null , false , [ new CurrentUser ()] );
55
62
56
- $ this ->assertFalse ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
63
+ $ this ->assertTrue ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
64
+ $ this ->assertSame ([$ user ], iterator_to_array ($ resolver ->resolve (Request::create ('/ ' ), $ metadata )));
57
65
}
58
66
59
- public function testResolve ()
67
+ public function testResolveSucceedsWithNullableParamAndNoUser ()
68
+ {
69
+ $ token = new NullToken ();
70
+ $ tokenStorage = new TokenStorage ();
71
+ $ tokenStorage ->setToken ($ token );
72
+
73
+ $ resolver = new UserValueResolver ($ tokenStorage );
74
+ $ metadata = new ArgumentMetadata ('foo ' , InMemoryUser::class, false , false , null , true , [new CurrentUser ()]);
75
+
76
+ $ this ->assertTrue ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
77
+ $ this ->assertSame ([null ], iterator_to_array ($ resolver ->resolve (Request::create ('/ ' ), $ metadata )));
78
+ }
79
+ public function testResolveSucceedsWithNullableAttribute ()
60
80
{
61
81
$ user = new InMemoryUser ('username ' , 'password ' );
62
82
$ token = new UsernamePasswordToken ($ user , 'provider ' );
63
83
$ tokenStorage = new TokenStorage ();
64
84
$ tokenStorage ->setToken ($ token );
65
85
66
86
$ resolver = new UserValueResolver ($ tokenStorage );
67
- $ metadata = new ArgumentMetadata ('foo ' , UserInterface::class, false , false , null );
87
+ $ metadata = $ this ->createMock (ArgumentMetadata::class);
88
+ $ metadata = new ArgumentMetadata ('foo ' , null , false , false , null , false , [new CurrentUser ()]);
68
89
69
90
$ this ->assertTrue ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
70
91
$ this ->assertSame ([$ user ], iterator_to_array ($ resolver ->resolve (Request::create ('/ ' ), $ metadata )));
71
92
}
72
93
73
- public function testResolveWithAttribute ()
94
+ public function testResolveSucceedsWithTypedAttribute ()
74
95
{
75
96
$ user = new InMemoryUser ('username ' , 'password ' );
76
97
$ token = new UsernamePasswordToken ($ user , 'provider ' );
@@ -79,20 +100,50 @@ public function testResolveWithAttribute()
79
100
80
101
$ resolver = new UserValueResolver ($ tokenStorage );
81
102
$ metadata = $ this ->createMock (ArgumentMetadata::class);
82
- $ metadata = new ArgumentMetadata ('foo ' , null , false , false , null , false , [new CurrentUser ()]);
103
+ $ metadata = new ArgumentMetadata ('foo ' , InMemoryUser::class , false , false , null , false , [new CurrentUser ()]);
83
104
84
105
$ this ->assertTrue ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
85
106
$ this ->assertSame ([$ user ], iterator_to_array ($ resolver ->resolve (Request::create ('/ ' ), $ metadata )));
86
107
}
87
108
88
- public function testResolveWithAttributeAndNoUser ()
109
+ public function testResolveThrowsAccessDeniedWithWrongUserClass ()
89
110
{
111
+ $ user = $ this ->createMock (UserInterface::class);;
112
+ $ token = new UsernamePasswordToken ($ user , 'provider ' );
90
113
$ tokenStorage = new TokenStorage ();
114
+ $ tokenStorage ->setToken ($ token );
91
115
92
116
$ resolver = new UserValueResolver ($ tokenStorage );
93
- $ metadata = new ArgumentMetadata ('foo ' , null , false , false , null , false , [new CurrentUser ()]);
117
+ $ metadata = new ArgumentMetadata ('foo ' , InMemoryUser::class , false , false , null , false , [new CurrentUser ()]);
94
118
95
- $ this ->assertFalse ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
119
+ $ this ->assertTrue ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
120
+ $ this ->expectException (AccessDeniedException::class);
121
+ $ 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.$/ ' );
122
+ iterator_to_array ($ resolver ->resolve (Request::create ('/ ' ), $ metadata ));
123
+ }
124
+
125
+ public function testResolveThrowsAccessDeniedWithAttributeAndNoUser ()
126
+ {
127
+ $ tokenStorage = new TokenStorage ();
128
+
129
+ $ resolver = new UserValueResolver ($ tokenStorage );
130
+ $ metadata = new ArgumentMetadata ('foo ' , UserInterface::class, false , false , null , false , [new CurrentUser ()]);
131
+
132
+ $ this ->assertTrue ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
133
+ $ this ->expectException (AccessDeniedException::class);
134
+ $ 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. ' );
135
+ iterator_to_array ($ resolver ->resolve (Request::create ('/ ' ), $ metadata ));
136
+ }
137
+
138
+ public function testResolveThrowsAcessDeniedWithNoToken ()
139
+ {
140
+ $ tokenStorage = new TokenStorage ();
141
+ $ resolver = new UserValueResolver ($ tokenStorage );
142
+ $ metadata = new ArgumentMetadata ('foo ' , UserInterface::class, false , false , null );
143
+
144
+ $ this ->assertTrue ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
145
+ $ this ->expectException (AccessDeniedException::class);
146
+ iterator_to_array ($ resolver ->resolve (Request::create ('/ ' ), $ metadata ));
96
147
}
97
148
98
149
public function testIntegration ()
0 commit comments