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 \In
E864
MemoryUser ;
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 )));
65
+ }
66
+
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 )));
57
78
}
58
79
59
- public function testResolve ()
80
+ public function testResolveSucceedsWithNullableAttribute ()
60
81
{
61
82
$ user = new InMemoryUser ('username ' , 'password ' );
62
83
$ token = new UsernamePasswordToken ($ user , 'provider ' );
63
84
$ tokenStorage = new TokenStorage ();
64
85
$ tokenStorage ->setToken ($ token );
65
86
66
87
$ resolver = new UserValueResolver ($ tokenStorage );
67
- $ metadata = new ArgumentMetadata ('foo ' , UserInterface::class, false , false , null );
88
+ $ metadata = $ this ->createMock (ArgumentMetadata::class);
89
+ $ metadata = new ArgumentMetadata ('foo ' , null , false , false , null , false , [new CurrentUser ()]);
68
90
69
91
$ this ->assertTrue ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
70
92
$ this ->assertSame ([$ user ], iterator_to_array ($ resolver ->resolve (Request::create ('/ ' ), $ metadata )));
71
93
}
72
94
73
- public function testResolveWithAttribute ()
95
+ public function testResolveSucceedsWithTypedAttribute ()
74
96
{
75
97
$ user = new InMemoryUser ('username ' , 'password ' );
76
98
$ token = new UsernamePasswordToken ($ user , 'provider ' );
@@ -79,20 +101,50 @@ public function testResolveWithAttribute()
79
101
80
102
$ resolver = new UserValueResolver ($ tokenStorage );
81
103
$ metadata = $ this ->createMock (ArgumentMetadata::class);
82
- $ metadata = new ArgumentMetadata ('foo ' , null , false , false , null , false , [new CurrentUser ()]);
104
+ $ metadata = new ArgumentMetadata ('foo ' , InMemoryUser::class , false , false , null , false , [new CurrentUser ()]);
83
105
84
106
$ this ->assertTrue ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
85
107
$ this ->assertSame ([$ user ], iterator_to_array ($ resolver ->resolve (Request::create ('/ ' ), $ metadata )));
86
108
}
87
109
88
- public function testResolveWithAttributeAndNoUser ()
110
+ public function testResolveThrowsAccessDeniedWithWrongUserClass ()
89
111
{
112
+ $ user = $ this ->createMock (UserInterface::class);
113
+ $ token = new UsernamePasswordToken ($ user , 'provider ' );
90
114
$ tokenStorage = new TokenStorage ();
115
+ $ tokenStorage ->setToken ($ token );
91
116
92
117
$ resolver = new UserValueResolver ($ tokenStorage );
93
- $ metadata = new ArgumentMetadata ('foo ' , null , false , false , null , false , [new CurrentUser ()]);
118
+ $ metadata = new ArgumentMetadata ('foo ' , InMemoryUser::class , false , false , null , false , [new CurrentUser ()]);
94
119
95
- $ this ->assertFalse ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
120
+ $ this ->assertTrue ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
121
+ $ this ->expectException (AccessDeniedException::class);
122
+ $ 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.$/ ' );
123
+ iterator_to_array ($ resolver ->resolve (Request::create ('/ ' ), $ metadata ));
124
+ }
125
+
126
+ public function testResolveThrowsAccessDeniedWithAttributeAndNoUser ()
127
+ {
128
+ $ tokenStorage = new TokenStorage ();
129
+
130
+ $ resolver = new UserValueResolver ($ tokenStorage );
131
+ $ metadata = new ArgumentMetadata ('foo ' , UserInterface::class, false , false , null , false , [new CurrentUser ()]);
132
+
133
+ $ this ->assertTrue ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
134
+ $ this ->expectException (AccessDeniedException::class);
135
+ $ 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. ' );
136
+ iterator_to_array ($ resolver ->resolve (Request::create ('/ ' ), $ metadata ));
137
+ }
138
+
139
+ public function testResolveThrowsAcessDeniedWithNoToken ()
140
+ {
141
+ $ tokenStorage = new TokenStorage ();
142
+ $ resolver = new UserValueResolver ($ tokenStorage );
143
+ $ metadata = new ArgumentMetadata ('foo ' , UserInterface::class, false , false , null );
144
+
145
+ $ this ->assertTrue ($ resolver ->supports (Request::create ('/ ' ), $ metadata ));
146
+ $ this ->expectException (AccessDeniedException::class);
147
+ iterator_to_array ($ resolver ->resolve (Request::create ('/ ' ), $ metadata ));
96
148
}
97
149
98
150
public function testIntegration ()
0 commit comments