2018-11-04 17:06:30 +00:00
< ? php
/** @ license MIT
* Copyright 2017 J . King , Dustin Wilson et al .
* See LICENSE and AUTHORS files for details */
declare ( strict_types = 1 );
namespace JKingWeb\Arsse\TestCase\User ;
use JKingWeb\Arsse\Arsse ;
use JKingWeb\Arsse\Database ;
use JKingWeb\Arsse\User\Driver as DriverInterface ;
use JKingWeb\Arsse\User\Internal\Driver ;
/** @covers \JKingWeb\Arsse\User\Internal\Driver */
class TestInternal extends \JKingWeb\Arsse\Test\AbstractTest {
2019-10-16 18:42:43 +00:00
public function setUp () : void {
2018-11-23 15:01:17 +00:00
self :: clearData ();
2018-11-23 00:55:54 +00:00
self :: setConf ();
2018-11-04 17:06:30 +00:00
// create a mock database interface
2019-09-05 14:03:32 +00:00
Arsse :: $db = \Phake :: mock ( Database :: class );
2019-09-05 14:13:17 +00:00
\Phake :: when ( Arsse :: $db ) -> begin -> thenReturn ( \Phake :: mock ( \JKingWeb\Arsse\Db\Transaction :: class ));
2018-11-04 17:06:30 +00:00
}
public function testConstruct () {
$this -> assertInstanceOf ( DriverInterface :: class , new Driver );
}
public function testFetchDriverName () {
$this -> assertTrue ( strlen ( Driver :: driverName ()) > 0 );
}
2018-12-05 22:28:11 +00:00
/**
* @ dataProvider provideAuthentication
2018-11-04 17:06:30 +00:00
* @ group slow
*/
2019-03-24 18:42:23 +00:00
public function testAuthenticateAUser ( bool $authorized , string $user , $password , bool $exp ) {
2018-11-04 17:06:30 +00:00
if ( $authorized ) {
2019-09-05 14:03:32 +00:00
\Phake :: when ( Arsse :: $db ) -> userPasswordGet ( " john.doe@example.com " ) -> thenReturn ( '$2y$10$1zbqRJhxM8uUjeSBPp4IhO90xrqK0XjEh9Z16iIYEFRV4U.zeAFom' ); // hash of "secret"
\Phake :: when ( Arsse :: $db ) -> userPasswordGet ( " jane.doe@example.com " ) -> thenReturn ( '$2y$10$bK1ljXfTSyc2D.NYvT.Eq..OpehLRXVbglW.23ihVuyhgwJCd.7Im' ); // hash of "superman"
\Phake :: when ( Arsse :: $db ) -> userPasswordGet ( " owen.hardy@example.com " ) -> thenReturn ( " " );
\Phake :: when ( Arsse :: $db ) -> userPasswordGet ( " kira.nerys@example.com " ) -> thenThrow ( new \JKingWeb\Arsse\User\Exception ( " doesNotExist " ));
\Phake :: when ( Arsse :: $db ) -> userPasswordGet ( " 007@example.com " ) -> thenReturn ( null );
2018-11-04 17:06:30 +00:00
} else {
2019-09-05 14:03:32 +00:00
\Phake :: when ( Arsse :: $db ) -> userPasswordGet -> thenThrow ( new \JKingWeb\Arsse\User\ExceptionAuthz ( " notAuthorized " ));
2018-11-04 17:06:30 +00:00
}
$this -> assertSame ( $exp , ( new Driver ) -> auth ( $user , $password ));
}
2019-10-16 18:42:43 +00:00
public function provideAuthentication () : iterable {
2018-11-04 17:06:30 +00:00
$john = " john.doe@example.com " ;
$jane = " jane.doe@example.com " ;
$owen = " owen.hardy@example.com " ;
$kira = " kira.nerys@example.com " ;
2019-03-24 18:42:23 +00:00
$bond = " 007@example.com " ;
2018-11-04 17:06:30 +00:00
return [
2019-03-24 18:42:23 +00:00
[ false , $john , " secret " , false ],
[ false , $jane , " superman " , false ],
[ false , $owen , " " , false ],
[ false , $kira , " ashalla " , false ],
[ false , $bond , " " , false ],
[ true , $john , " secret " , true ],
[ true , $jane , " superman " , true ],
[ true , $owen , " " , true ],
[ true , $kira , " ashalla " , false ],
[ true , $john , " top secret " , false ],
[ true , $jane , " clark kent " , false ],
[ true , $owen , " watchmaker " , false ],
[ true , $kira , " singha " , false ],
[ true , $john , " " , false ],
[ true , $jane , " " , false ],
[ true , $kira , " " , false ],
[ true , $bond , " for England " , false ],
[ true , $bond , " " , false ],
2018-11-04 17:06:30 +00:00
];
}
public function testAuthorizeAnAction () {
2019-09-05 14:03:32 +00:00
\Phake :: verifyNoFurtherInteraction ( Arsse :: $db );
2018-11-04 17:06:30 +00:00
$this -> assertTrue (( new Driver ) -> authorize ( " someone " , " something " ));
}
public function testListUsers () {
$john = " john.doe@example.com " ;
$jane = " jane.doe@example.com " ;
2019-09-05 14:03:32 +00:00
\Phake :: when ( Arsse :: $db ) -> userList -> thenReturn ([ $john , $jane ]) -> thenReturn ([ $jane , $john ]);
2018-11-04 17:06:30 +00:00
$driver = new Driver ;
$this -> assertSame ([ $john , $jane ], $driver -> userList ());
$this -> assertSame ([ $jane , $john ], $driver -> userList ());
2019-09-05 14:03:32 +00:00
\Phake :: verify ( Arsse :: $db , \Phake :: times ( 2 )) -> userList ;
2018-11-04 17:06:30 +00:00
}
public function testCheckThatAUserExists () {
$john = " john.doe@example.com " ;
$jane = " jane.doe@example.com " ;
2019-09-05 14:03:32 +00:00
\Phake :: when ( Arsse :: $db ) -> userExists ( $john ) -> thenReturn ( true );
\Phake :: when ( Arsse :: $db ) -> userExists ( $jane ) -> thenReturn ( false );
2018-11-04 17:06:30 +00:00
$driver = new Driver ;
$this -> assertTrue ( $driver -> userExists ( $john ));
2019-09-05 14:03:32 +00:00
\Phake :: verify ( Arsse :: $db ) -> userExists ( $john );
2018-11-04 17:06:30 +00:00
$this -> assertFalse ( $driver -> userExists ( $jane ));
2019-09-05 14:03:32 +00:00
\Phake :: verify ( Arsse :: $db ) -> userExists ( $jane );
2018-11-04 17:06:30 +00:00
}
public function testAddAUser () {
$john = " john.doe@example.com " ;
2019-09-05 14:03:32 +00:00
\Phake :: when ( Arsse :: $db ) -> userAdd -> thenReturnCallback ( function ( $user , $pass ) {
2018-11-04 17:06:30 +00:00
return $pass ;
});
$driver = new Driver ;
$this -> assertNull ( $driver -> userAdd ( $john ));
$this -> assertNull ( $driver -> userAdd ( $john , null ));
$this -> assertSame ( " secret " , $driver -> userAdd ( $john , " secret " ));
2019-09-05 14:03:32 +00:00
\Phake :: verify ( Arsse :: $db ) -> userAdd ( $john , " secret " );
\Phake :: verify ( Arsse :: $db ) -> userAdd ;
2018-11-04 17:06:30 +00:00
}
public function testRemoveAUser () {
$john = " john.doe@example.com " ;
2019-09-05 14:03:32 +00:00
\Phake :: when ( Arsse :: $db ) -> userRemove -> thenReturn ( true ) -> thenThrow ( new \JKingWeb\Arsse\User\Exception ( " doesNotExist " ));
2018-11-04 17:06:30 +00:00
$driver = new Driver ;
$this -> assertTrue ( $driver -> userRemove ( $john ));
2019-09-05 14:03:32 +00:00
\Phake :: verify ( Arsse :: $db , \Phake :: times ( 1 )) -> userRemove ( $john );
2018-11-04 17:06:30 +00:00
$this -> assertException ( " doesNotExist " , " User " );
try {
$this -> assertFalse ( $driver -> userRemove ( $john ));
} finally {
2019-09-05 14:03:32 +00:00
\Phake :: verify ( Arsse :: $db , \Phake :: times ( 2 )) -> userRemove ( $john );
2018-11-04 17:06:30 +00:00
}
}
public function testSetAPassword () {
$john = " john.doe@example.com " ;
2019-09-05 14:03:32 +00:00
\Phake :: verifyNoFurtherInteraction ( Arsse :: $db );
2018-11-04 17:06:30 +00:00
$this -> assertSame ( " superman " , ( new Driver ) -> userPasswordSet ( $john , " superman " ));
$this -> assertSame ( null , ( new Driver ) -> userPasswordSet ( $john , null ));
}
2019-03-24 18:42:23 +00:00
public function testUnsetAPassword () {
$drv = \Phake :: partialMock ( Driver :: class );
\Phake :: when ( $drv ) -> userExists -> thenReturn ( true );
2019-09-05 14:03:32 +00:00
\Phake :: verifyNoFurtherInteraction ( Arsse :: $db );
2019-03-24 18:42:23 +00:00
$this -> assertTrue ( $drv -> userPasswordUnset ( " john.doe@example.com " ));
}
public function testUnsetAPasswordForAMssingUser () {
$drv = \Phake :: partialMock ( Driver :: class );
\Phake :: when ( $drv ) -> userExists -> thenReturn ( false );
2019-09-05 14:03:32 +00:00
\Phake :: verifyNoFurtherInteraction ( Arsse :: $db );
2019-03-24 18:42:23 +00:00
$this -> assertException ( " doesNotExist " , " User " );
$drv -> userPasswordUnset ( " john.doe@example.com " );
}
2018-11-04 17:06:30 +00:00
}