2010-04-28 10:34:12 +02:00
< ? php
2015-04-21 16:57:45 +02:00
/* Copyright ( C ) 2010 - 2015 Laurent Destailleur < eldy @ users . sourceforge . net >
2010-04-28 10:34:12 +02:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
2013-01-16 15:36:08 +01:00
* the Free Software Foundation ; either version 3 of the License , or
2010-04-28 10:34:12 +02:00
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2019-09-23 21:55:30 +02:00
* along with this program . If not , see < https :// www . gnu . org / licenses />.
* or see https :// www . gnu . org /
2010-04-28 10:34:12 +02:00
*/
/**
2010-08-16 01:19:46 +02:00
* \file test / phpunit / UserTest . php
2015-01-06 17:54:36 +01:00
* \ingroup test
2010-10-03 20:53:40 +02:00
* \brief PHPUnit test
2015-01-06 17:54:36 +01:00
* \remarks To run this script as CLI : phpunit filename . php
2010-04-28 10:34:12 +02:00
*/
global $conf , $user , $langs , $db ;
//define('TEST_DB_FORCE_TYPE','mysql'); // This is to force using mysql driver
2014-05-01 19:57:53 +02:00
//require_once 'PHPUnit/Autoload.php';
2010-08-16 01:19:46 +02:00
require_once dirname ( __FILE__ ) . '/../../htdocs/master.inc.php' ;
require_once dirname ( __FILE__ ) . '/../../htdocs/user/class/user.class.php' ;
2010-04-28 10:34:12 +02:00
2015-01-06 17:54:36 +01:00
if ( empty ( $user -> id )) {
2021-01-14 15:09:08 +01:00
print " Load permissions for admin user nb 1 \n " ;
$user -> fetch ( 1 );
$user -> getrights ();
2010-04-28 10:34:12 +02:00
}
2010-07-15 01:10:56 +02:00
$conf -> global -> MAIN_DISABLE_ALL_MAILS = 1 ;
2010-04-28 10:34:12 +02:00
/**
2011-09-23 14:21:00 +02:00
* Class for PHPUnit tests
2010-10-26 21:47:19 +02:00
*
2010-04-28 10:34:12 +02:00
* @ backupGlobals disabled
* @ backupStaticAttributes enabled
* @ remarks backupGlobals must be disabled to have db , conf , user and lang not erased .
*/
2019-07-05 21:28:27 +02:00
class UserTest extends PHPUnit\Framework\TestCase
2010-04-28 10:34:12 +02:00
{
2021-01-14 15:09:08 +01:00
protected $savconf ;
protected $savuser ;
protected $savlangs ;
protected $savdb ;
/**
* Constructor
* We save global variables into local variables
*
* @ return UserTest
*/
public function __construct ()
{
parent :: __construct ();
//$this->sharedFixture
global $conf , $user , $langs , $db ;
$this -> savconf = $conf ;
$this -> savuser = $user ;
$this -> savlangs = $langs ;
$this -> savdb = $db ;
print __METHOD__ . " db->type= " . $db -> type . " user->id= " . $user -> id ;
//print " - db ".$db->db;
print " \n " ;
}
/**
* setUpBeforeClass
*
* @ return void
*/
public static function setUpBeforeClass ()
{
global $conf , $user , $langs , $db ;
if ( ! empty ( $conf -> global -> MAIN_MODULE_LDAP )) {
2021-05-12 08:42:33 +02:00
print " \n " . __METHOD__ . " module LDAP must be disabled. \n " ; die ( 1 );
2021-01-14 15:09:08 +01:00
}
$db -> begin (); // This is to have all actions inside a transaction even if test launched without suite.
print __METHOD__ . " \n " ;
}
/**
* tearDownAfterClass
*
* @ return void
*/
public static function tearDownAfterClass ()
{
global $conf , $user , $langs , $db ;
$db -> rollback ();
print __METHOD__ . " \n " ;
}
/**
* Init phpunit tests
*
* @ return void
*/
protected function setUp ()
{
global $conf , $user , $langs , $db ;
$conf = $this -> savconf ;
$user = $this -> savuser ;
$langs = $this -> savlangs ;
$db = $this -> savdb ;
print __METHOD__ . " \n " ;
}
/**
* End phpunit tests
*
* @ return void
*/
protected function tearDown ()
{
print __METHOD__ . " \n " ;
}
/**
* testUserCreate
*
* @ return void
*/
public function testUserCreate ()
{
global $conf , $user , $langs , $db ;
$conf = $this -> savconf ;
$user = $this -> savuser ;
$langs = $this -> savlangs ;
$db = $this -> savdb ;
2022-01-24 12:43:42 +01:00
print __METHOD__ . " USER_PASSWORD_GENERATED= " . getDolGlobalString ( 'USER_PASSWORD_GENERATED' ) . " \n " ;
2021-01-14 15:09:08 +01:00
$localobject = new User ( $this -> savdb );
$localobject -> initAsSpecimen ();
$result = $localobject -> create ( $user );
2022-01-24 12:43:42 +01:00
$this -> assertLessThan ( $result , 0 , 'Creation of user has failed: ' . $localobject -> error );
2021-01-14 15:09:08 +01:00
print __METHOD__ . " result= " . $result . " \n " ;
return $result ;
}
/**
* testUserFetch
*
* @ param int $id Id of user
* @ return void
* @ depends testUserCreate
* The depends says test is run only if previous is ok
*/
public function testUserFetch ( $id )
{
global $conf , $user , $langs , $db ;
$conf = $this -> savconf ;
$user = $this -> savuser ;
$langs = $this -> savlangs ;
$db = $this -> savdb ;
$localobject = new User ( $this -> savdb );
$result = $localobject -> fetch ( $id );
$this -> assertLessThan ( $result , 0 );
print __METHOD__ . " id= " . $id . " result= " . $result . " \n " ;
return $localobject ;
}
/**
* testUserUpdate
*
2021-02-11 21:12:32 +01:00
* @ param User $localobject User
2021-01-14 15:09:08 +01:00
* @ return void
* @ depends testUserFetch
* The depends says test is run only if previous is ok
*/
public function testUserUpdate ( $localobject )
{
global $conf , $user , $langs , $db ;
$conf = $this -> savconf ;
$user = $this -> savuser ;
$langs = $this -> savlangs ;
$db = $this -> savdb ;
$this -> changeProperties ( $localobject );
$result = $localobject -> update ( $user );
print __METHOD__ . " id= " . $localobject -> id . " result= " . $result . " \n " ;
$this -> assertLessThan ( $result , 0 );
// Test everything are still same than specimen
$newlocalobject = new User ( $this -> savdb );
$newlocalobject -> initAsSpecimen ();
$this -> changeProperties ( $newlocalobject );
2022-04-28 22:28:32 +02:00
$this -> assertEquals ( $this -> objCompare ( $localobject , $newlocalobject , true , array ( 'id' , 'socid' , 'societe_id' , 'specimen' , 'note' , 'ref' , 'pass' , 'pass_indatabase' , 'pass_indatabase_crypted' , 'pass_temp' , 'datec' , 'datem' , 'datelastlogin' , 'datepreviouslogin' , 'iplastlogin' , 'ippreviouslogin' , 'trackid' )), array ()); // Actual, Expected
2021-01-14 15:09:08 +01:00
return $localobject ;
}
/**
* testUserDisable
*
2021-02-11 21:12:32 +01:00
* @ param User $localobject User
2021-01-14 15:09:08 +01:00
* @ return void
* @ depends testUserUpdate
* The depends says test is run only if previous is ok
*/
public function testUserDisable ( $localobject )
{
global $conf , $user , $langs , $db ;
$conf = $this -> savconf ;
$user = $this -> savuser ;
$langs = $this -> savlangs ;
$db = $this -> savdb ;
$result = $localobject -> setstatus ( 0 );
print __METHOD__ . " id= " . $localobject -> id . " result= " . $result . " \n " ;
$this -> assertLessThan ( $result , 0 );
return $localobject ;
}
/**
* testUserOther
*
2021-02-11 21:12:32 +01:00
* @ param User $localobject User
2021-01-14 15:09:08 +01:00
* @ return void
* @ depends testUserDisable
* The depends says test is run only if previous is ok
*/
public function testUserOther ( $localobject )
{
global $conf , $user , $langs , $db ;
$conf = $this -> savconf ;
$user = $this -> savuser ;
$langs = $this -> savlangs ;
$db = $this -> savdb ;
/* $result = $localobject -> setstatus ( 0 );
print __METHOD__ . " id= " . $localobject -> id . " result= " . $result . " \n " ;
$this -> assertLessThan ( $result , 0 );
*/
$localobject -> info ( $localobject -> id );
print __METHOD__ . " localobject->date_creation= " . $localobject -> date_creation . " \n " ;
$this -> assertNotEquals ( $localobject -> date_creation , '' );
2022-01-03 16:09:08 +01:00
return $localobject ;
}
2022-06-09 13:15:40 +02:00
/**
* testUserHasRight
2022-06-15 15:31:23 +02:00
* @ param User $localobject User
* @ return User $localobject User
* @ depends testUserOther
2022-06-09 13:29:02 +02:00
*/
2022-06-15 15:31:23 +02:00
public function testUserHasRight ( $localobject )
{
global $conf , $user , $langs , $db ;
$conf = $this -> savconf ;
$user = $this -> savuser ;
$langs = $this -> savlangs ;
$db = $this -> savdb ;
/* $result = $localobject -> setstatus ( 0 );
print __METHOD__ . " id= " . $localobject -> id . " result= " . $result . " \n " ;
$this -> assertLessThan ( $result , 0 );
*/
print __METHOD__ . " id= " . $localobject -> id . " \n " ;
//$this->assertNotEquals($user->date_creation, '');
2022-06-15 15:44:40 +02:00
$localobject -> addrights ( 0 , 'supplier_proposal' );
2022-06-15 15:31:23 +02:00
$this -> assertEquals ( $localobject -> hasRight ( 'member' , '' ), 0 );
$this -> assertEquals ( $localobject -> hasRight ( 'member' , 'member' ), 0 ); $this -> assertEquals ( $localobject -> hasRight ( 'product' , 'member' , 'read' ), 0 );
$this -> assertEquals ( $localobject -> hasRight ( 'member' , 'member' ), 0 ); $this -> assertEquals ( $localobject -> hasRight ( 'produit' , 'member' , 'read' ), 0 );
return $localobject ;
}
2022-06-09 13:20:59 +02:00
2022-01-03 16:09:08 +01:00
/**
* testUserSetPassword
*
* @ param User $localobject User
* @ return void
2022-06-15 15:31:23 +02:00
* @ depends testUserHasRight
2022-01-03 16:09:08 +01:00
* The depends says test is run only if previous is ok
*/
public function testUserSetPassword ( $localobject )
{
global $conf , $user , $langs , $db ;
$conf = $this -> savconf ;
$user = $this -> savuser ;
$langs = $this -> savlangs ;
$db = $this -> savdb ;
// Test the 'none' password generator
$conf -> global -> USER_PASSWORD_GENERATED = 'none' ;
$localobject -> error = '' ;
$result = $localobject -> setPassword ( $user , 'abcdef' );
print __METHOD__ . " set a small password with USER_PASSWORD_GENERATED = none \n " ;
print __METHOD__ . " localobject->error= " . $localobject -> error . " \n " ;
$this -> assertEquals ( 'abcdef' , $result );
// Test the 'standard' password generator
$conf -> global -> USER_PASSWORD_GENERATED = 'standard' ;
$localobject -> error = '' ;
2022-01-04 13:45:18 +01:00
$result = $localobject -> setPassword ( $user , '123456789AA' );
2022-01-03 16:09:08 +01:00
print __METHOD__ . " set a too small password with USER_PASSWORD_GENERATED = standard \n " ;
print __METHOD__ . " localobject->error= " . $localobject -> error . " \n " ;
$this -> assertEquals ( - 1 , $result , 'We must receive a negative error code (pass too small) and we did not here' );
// Test the 'perso' password generator
$conf -> global -> USER_PASSWORD_GENERATED = 'perso' ;
$conf -> global -> USER_PASSWORD_PATTERN = '12;2;2;2;3;1' ;
$localobject -> error = '' ;
2022-01-04 13:45:18 +01:00
$result = $localobject -> setPassword ( $user , '1234567892BB' );
2022-01-03 16:09:08 +01:00
print __METHOD__ . " set a too small password with USER_PASSWORD_GENERATED = perso \n " ;
print __METHOD__ . " localobject->error= " . $localobject -> error . " \n " ;
$this -> assertEquals ( - 1 , $result , 'We must receive a negative error code (pass too small) and we did not here' );
$localobject -> error = '' ;
$result = $localobject -> setPassword ( $user , '$*34567890AB' );
print __METHOD__ . " set a good password \n " ;
print __METHOD__ . " localobject->error= " . $localobject -> error . " \n " ;
$this -> assertEquals ( '$*34567890AB' , $result , 'We must get the password as it is valid (pass enough long) and we did not here' );
// Test uppercase : $chartofound = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$localobject -> error = '' ;
$result = $localobject -> setPassword ( $user , '$*123456789A' );
print __METHOD__ . " set a password without uppercase \n " ;
print __METHOD__ . " localobject->error= " . $localobject -> error . " \n " ;
$this -> assertEquals ( - 1 , $result , 'We must receive a negative error code (pass without enough uppercase) and we did not here' );
$localobject -> error = '' ;
2022-01-04 13:45:18 +01:00
$result = $localobject -> setPassword ( $user , '$*34567890CD' );
2022-01-03 16:09:08 +01:00
print __METHOD__ . " set a password with enough uppercase \n " ;
print __METHOD__ . " localobject->error= " . $localobject -> error . " \n " ;
2022-01-04 13:45:18 +01:00
$this -> assertEquals ( '$*34567890CD' , $result , 'We must get the password as it is valid (pass with enough uppercase) and we did not here' );
2022-01-03 16:09:08 +01:00
// Test digits : $chartofound = "!@#$%&*()_-+={}[]\\|:;'/";
$localobject -> error = '' ;
$result = $localobject -> setPassword ( $user , '$*ABCDEFGHIJ' );
print __METHOD__ . " set a password without digits \n " ;
print __METHOD__ . " localobject->error= " . $localobject -> error . " \n " ;
$this -> assertEquals ( - 1 , $result , 'We must receive a negative error code (pass without enough digits) and we did not here' );
$localobject -> error = '' ;
$result = $localobject -> setPassword ( $user , '$*12ABCDEFGH' );
print __METHOD__ . " set a password with enough digits \n " ;
print __METHOD__ . " localobject->error= " . $localobject -> error . " \n " ;
$this -> assertEquals ( '$*12ABCDEFGH' , $result , 'We must get the password as it is valid (pass with enough digits) and we did not here' );
// Test special chars : $chartofound = "!@#$%&*()_-+={}[]\\|:;'/";
$localobject -> error = '' ;
$result = $localobject -> setPassword ( $user , '1234567890AA' );
print __METHOD__ . " set a password without enough special chars \n " ;
print __METHOD__ . " localobject->error= " . $localobject -> error . " \n " ;
$this -> assertEquals ( - 1 , $result , 'We must receive a negative error code (pass without enough special chars) and we did not here' );
$localobject -> error = '' ;
$result = $localobject -> setPassword ( $user , '$*12345678AA' );
print __METHOD__ . " set a password with enough special chars \n " ;
print __METHOD__ . " localobject->error= " . $localobject -> error . " \n " ;
$this -> assertEquals ( '$*12345678AA' , $result , 'We must get the password as it is valid (pass with enough special chars) and we did not here' );
// Test consecutive chars
$localobject -> error = '' ;
$result = $localobject -> setPassword ( $user , '$*1111567890AA' );
print __METHOD__ . " set a password with too many consecutive chars \n " ;
print __METHOD__ . " localobject->error= " . $localobject -> error . " \n " ;
$this -> assertEquals ( - 1 , $result , 'We must receive a negative error code (pass has n consecutive similar chars) and we did not here' );
$localobject -> error = '' ;
$result = $localobject -> setPassword ( $user , '$*11145678AA' );
print __METHOD__ . " set a password with noo too much consecutive chars \n " ;
print __METHOD__ . " localobject->error= " . $localobject -> error . " \n " ;
$this -> assertEquals ( '$*11145678AA' , $result , 'We must get the password as it is valid (pass has not too much similar consecutive chars) and we did not here' );
2021-01-14 15:09:08 +01:00
return $localobject -> id ;
}
2022-01-03 16:09:08 +01:00
2021-01-14 15:09:08 +01:00
/**
* testUserDelete
*
2021-02-11 21:12:32 +01:00
* @ param int $id User id
2021-01-14 15:09:08 +01:00
* @ return void
2022-01-03 16:09:08 +01:00
* @ depends testUserSetPassword
2021-01-14 15:09:08 +01:00
* The depends says test is run only if previous is ok
*/
public function testUserDelete ( $id )
{
global $conf , $user , $langs , $db ;
$conf = $this -> savconf ;
$user = $this -> savuser ;
$langs = $this -> savlangs ;
$db = $this -> savdb ;
$localobject = new User ( $this -> savdb );
$result = $localobject -> fetch ( $id );
$result = $localobject -> delete ( $user );
print __METHOD__ . " id= " . $id . " result= " . $result . " \n " ;
$this -> assertLessThan ( $result , 0 );
return $result ;
}
/**
* testUserAddPermission
*
2021-02-11 21:12:32 +01:00
* @ param int $id User id
2021-01-14 15:09:08 +01:00
* @ return void
* @ depends testUserDelete
* The depends says test is run only if previous is ok
*/
public function testUserAddPermission ( $id )
{
global $conf , $user , $langs , $db ;
$conf = $this -> savconf ;
$user = $this -> savuser ;
$langs = $this -> savlangs ;
$db = $this -> savdb ;
$localobject = new User ( $this -> savdb );
$result = $localobject -> fetch ( 1 ); // Other tests use the user id 1
$result = $localobject -> addrights ( 0 , 'supplier_proposal' );
print __METHOD__ . " id= " . $id . " result= " . $result . " \n " ;
$this -> assertLessThan ( $result , 0 );
return $result ;
}
/**
* Edit an object to test updates
*
2021-02-11 21:12:32 +01:00
* @ param Object $localobject Object User
2021-01-14 15:09:08 +01:00
* @ return void
*/
public function changeProperties ( & $localobject )
{
$localobject -> note_private = 'New note after update' ;
}
/**
* Compare all public properties values of 2 objects
*
* @ param Object $oA Object operand 1
* @ param Object $oB Object operand 2
* @ param boolean $ignoretype False will not report diff if type of value differs
* @ param array $fieldstoignorearray Array of fields to ignore in diff
* @ return array Array with differences
*/
public function objCompare ( $oA , $oB , $ignoretype = true , $fieldstoignorearray = array ( 'id' ))
{
$retAr = array ();
if ( get_class ( $oA ) !== get_class ( $oB )) {
$retAr [] = " Supplied objects are not of same class. " ;
} else {
$oVarsA = get_object_vars ( $oA );
$oVarsB = get_object_vars ( $oB );
$aKeys = array_keys ( $oVarsA );
foreach ( $aKeys as $sKey ) {
if ( in_array ( $sKey , $fieldstoignorearray )) {
continue ;
}
if ( ! $ignoretype && ( $oVarsA [ $sKey ] !== $oVarsB [ $sKey ])) {
$retAr [] = $sKey . ' : ' . ( is_object ( $oVarsA [ $sKey ]) ? get_class ( $oVarsA [ $sKey ]) : $oVarsA [ $sKey ]) . ' <> ' . ( is_object ( $oVarsB [ $sKey ]) ? get_class ( $oVarsB [ $sKey ]) : $oVarsB [ $sKey ]);
}
if ( $ignoretype && ( $oVarsA [ $sKey ] != $oVarsB [ $sKey ])) {
$retAr [] = $sKey . ' : ' . ( is_object ( $oVarsA [ $sKey ]) ? get_class ( $oVarsA [ $sKey ]) : $oVarsA [ $sKey ]) . ' <> ' . ( is_object ( $oVarsB [ $sKey ]) ? get_class ( $oVarsB [ $sKey ]) : $oVarsB [ $sKey ]);
}
}
}
return $retAr ;
}
2010-04-28 10:34:12 +02:00
}