Skip to content

Commit ae4e2ed

Browse files
committed
add unit tests
1 parent 3893d52 commit ae4e2ed

File tree

3 files changed

+198
-25
lines changed

3 files changed

+198
-25
lines changed

phpunit.xml.dist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<phpunit bootstrap="./tests/bootstrap.php"
33
colors="true"
4-
backupGlobals="false"
4+
backupGlobals="true"
55
backupStaticProperties="false"
66
processIsolation="false"
77
cacheDirectory=".phpunit.cache"

src/WebUser.php

Lines changed: 43 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,27 @@
66
use CWebUser;
77

88
/**
9-
* WebUser extends the standard Yii class {@see \CWebUser}, providing handlers for the following events:
9+
* WebUser extends the standard Yii class {@see \CWebUser}, providing handlers for the authentication flow events.
1010
*
11-
* - {@see onAfterRestore} - raises after user data restoration;
12-
* - {@see onBeforeLogin} - raises before user logs in;
13-
* - {@see onAfterLogin} - raises after user successfully logged in;
14-
* - {@see onBeforeLogout} - raises before user logs out;
15-
* - {@see onAfterLogout} - raises after user successfully logged out;
11+
* Application configuration example:
12+
*
13+
* ```php
14+
* return [
15+
* 'components' => [
16+
* 'user' => [
17+
* 'class' => yii1tech\web\user\WebUser::class,
18+
* ],
19+
* // ...
20+
* ],
21+
* // ...
22+
* ];
23+
* ```
24+
*
25+
* @property callable|\CList $onAfterRestore raises after user data restoration.
26+
* @property callable|\CList $onBeforeLogin raises before user logs in.
27+
* @property callable|\CList $onAfterLogin raises after user successfully logged in.
28+
* @property callable|\CList $onBeforeLogout raises before user logs out.
29+
* @property callable|\CList $onAfterLogout raises after user successfully logged out.
1630
*
1731
* @author Paul Klimov <[email protected]>
1832
* @since 1.0
@@ -26,7 +40,9 @@ public function init()
2640
{
2741
parent::init();
2842

29-
$this->afterRestore();
43+
if (!$this->getIsGuest()) {
44+
$this->afterRestore();
45+
}
3046
}
3147

3248
/**
@@ -58,18 +74,19 @@ public function onAfterRestore($event): void
5874
*/
5975
protected function beforeLogin($id, $states, $fromCookie)
6076
{
61-
$allowLogin = true;
62-
63-
if ($this->hasEventHandler('onBeforeLogin')) {
64-
$this->onBeforeLogin(new CEvent($this, [
65-
'allowLogin' => &$allowLogin,
66-
'id' => $id,
67-
'states' => $states,
68-
'fromCookie' => $fromCookie,
69-
]));
77+
if (!$this->hasEventHandler('onBeforeLogin')) {
78+
return true;
7079
}
7180

72-
return $allowLogin;
81+
$event = new CEvent($this, [
82+
'allowLogin' => true,
83+
'id' => $id,
84+
'states' => $states,
85+
'fromCookie' => $fromCookie,
86+
]);
87+
$this->onBeforeLogin($event);
88+
89+
return $event->params['allowLogin'];
7390
}
7491

7592
/**
@@ -107,15 +124,17 @@ public function onAfterLogin($event): void
107124
*/
108125
protected function beforeLogout()
109126
{
110-
$allowLogout = true;
111-
112-
if ($this->hasEventHandler('onBeforeLogout')) {
113-
$this->onBeforeLogout(new CEvent($this, [
114-
'allowLogout' => &$allowLogout,
115-
]));
127+
if (!$this->hasEventHandler('onBeforeLogout')) {
128+
return true;
116129
}
117130

118-
return $allowLogout;
131+
$event = new CEvent($this, [
132+
'allowLogout' => true,
133+
]);
134+
135+
$this->onBeforeLogout($event);
136+
137+
return $event->params['allowLogout'];
119138
}
120139

121140
/**

tests/WebUserTest.php

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
<?php
2+
3+
namespace yii1tech\web\user\test;
4+
5+
use CEvent;
6+
use CUserIdentity;
7+
use Yii;
8+
use yii1tech\web\user\WebUser;
9+
10+
class WebUserTest extends TestCase
11+
{
12+
protected function createWebUser(): WebUser
13+
{
14+
return Yii::createComponent([
15+
'class' => WebUser::class,
16+
'stateKeyPrefix' => '',
17+
]);
18+
}
19+
20+
public function testBeforeLoginEvent(): void
21+
{
22+
$webUser = $this->createWebUser();
23+
24+
$event = null;
25+
$webUser->onBeforeLogin = function (CEvent $raisedEvent) use (&$event) {
26+
$event = $raisedEvent;
27+
};
28+
29+
$identity = new CUserIdentity('username', 'password');
30+
$identity->setPersistentStates(['foo' => 'bar']);
31+
32+
$webUser->login($identity);
33+
34+
$this->assertFalse($webUser->getIsGuest());
35+
36+
$this->assertTrue($event instanceof CEvent);
37+
$this->assertEquals(true, $event->params['allowLogin']);
38+
$this->assertEquals(false, $event->params['fromCookie']);
39+
$this->assertEquals($identity->getId(), $event->params['id']);
40+
$this->assertEquals($identity->getPersistentStates(), $event->params['states']);
41+
}
42+
43+
/**
44+
* @depends testBeforeLoginEvent
45+
*/
46+
public function testBeforeLoginEventBlocksLogin(): void
47+
{
48+
$webUser = $this->createWebUser();
49+
50+
$webUser->onBeforeLogin = function (CEvent $event) {
51+
$event->params['allowLogin'] = false;
52+
};
53+
54+
$identity = new CUserIdentity('username', 'password');
55+
56+
$webUser->login($identity);
57+
58+
$this->assertTrue($webUser->getIsGuest());
59+
}
60+
61+
public function testAfterLoginEvent(): void
62+
{
63+
$webUser = $this->createWebUser();
64+
65+
$event = null;
66+
$webUser->onAfterLogin = function (CEvent $raisedEvent) use (&$event) {
67+
$event = $raisedEvent;
68+
};
69+
70+
$identity = new CUserIdentity('username', 'password');
71+
72+
$webUser->login($identity);
73+
74+
$this->assertFalse($webUser->getIsGuest());
75+
76+
$this->assertTrue($event instanceof CEvent);
77+
$this->assertEquals(false, $event->params['fromCookie']);
78+
}
79+
80+
public function testBeforeLogoutEvent(): void
81+
{
82+
$webUser = $this->createWebUser();
83+
84+
$event = null;
85+
$webUser->onBeforeLogout = function (CEvent $raisedEvent) use (&$event) {
86+
$event = $raisedEvent;
87+
};
88+
89+
$identity = new CUserIdentity('username', 'password');
90+
91+
$webUser->login($identity);
92+
$webUser->logout();
93+
94+
$this->assertTrue($webUser->getIsGuest());
95+
96+
$this->assertTrue($event instanceof CEvent);
97+
$this->assertEquals(true, $event->params['allowLogout']);
98+
}
99+
100+
/**
101+
* @depends testBeforeLogoutEvent
102+
*/
103+
public function testBeforeLogoutEventBlocksLogout(): void
104+
{
105+
$webUser = $this->createWebUser();
106+
107+
$webUser->onBeforeLogout = function (CEvent $event) {
108+
$event->params['allowLogout'] = false;
109+
};
110+
111+
$identity = new CUserIdentity('username', 'password');
112+
113+
$webUser->login($identity);
114+
$webUser->logout();
115+
116+
$this->assertFalse($webUser->getIsGuest());
117+
}
118+
119+
public function testAfterLogoutEvent(): void
120+
{
121+
$webUser = $this->createWebUser();
122+
123+
$event = null;
124+
$webUser->onAfterLogout = function (CEvent $raisedEvent) use (&$event) {
125+
$event = $raisedEvent;
126+
};
127+
128+
$identity = new CUserIdentity('username', 'password');
129+
130+
$webUser->login($identity);
131+
$webUser->logout();
132+
133+
$this->assertTrue($webUser->getIsGuest());
134+
135+
$this->assertTrue($event instanceof CEvent);
136+
}
137+
138+
public function testAfterRestoreEvent(): void
139+
{
140+
$webUser = $this->createWebUser();
141+
142+
$event = null;
143+
$webUser->onAfterRestore = function (CEvent $raisedEvent) use (&$event) {
144+
$event = $raisedEvent;
145+
};
146+
147+
$_SESSION['__id'] = 'username';
148+
$_SESSION['__name'] = 'username';
149+
150+
$webUser->init();
151+
152+
$this->assertTrue($event instanceof CEvent);
153+
}
154+
}

0 commit comments

Comments
 (0)