Clean up user class. Implement start of unit testing framework for appdb.

Implement start of user class unit test.
This commit is contained in:
Chris Morgan
2006-06-27 03:59:16 +00:00
committed by WineHQ
parent c8e07f8ae7
commit 98ba61db03
7 changed files with 378 additions and 34 deletions

View File

@@ -114,17 +114,26 @@ function cmd_do_new()
$result = $user->create($aClean['ext_email'], $aClean['ext_password'], $aClean['ext_realname'], $aClean['CVSrelease'] );
if($result == true)
if($result == SUCCESS)
{
/* if we can log the user in, log them in automatically */
if($user->login($aClean['ext_email'], $aClean['ext_password']))
if($user->login($aClean['ext_email'], $aClean['ext_password']) == SUCCESS)
$_SESSION['current'] = $user;
addmsg("Account created! (".$aClean['ext_email'].")", "green");
redirect(apidb_fullurl());
}
else
else if($result == USER_CREATE_EXISTS)
{
addmsg("An account with this e-mail exists already.", "red");
retry("new", "Failed to create account");
} else if($result = USER_CREATE_FAILED)
{
addmsg("Error while creating a new user.", "red");
retry("new", "Failed to create account");
} else
{
addmsg("Unknown failure while creating new user. Please report this problem to appdb admins.", "red");
retry("new", "Failed to create account");
}
}
@@ -193,7 +202,7 @@ function cmd_do_login()
$user = new User();
$result = $user->login($aClean['ext_email'], $aClean['ext_password']);
if($result == true)
if($result == SUCCESS)
{
$_SESSION['current'] = $user;
addmsg("You are successfully logged in as '$user->sRealname'.", "green");

View File

@@ -6,6 +6,14 @@
require_once(BASE."include/version.php");
require_once(BASE."include/util.php");
define(SUCCESS, 0);
define(USER_CREATE_EXISTS, 1);
define(USER_CREATE_FAILED, 2);
define(USER_LOGIN_FAILED, 3);
define(USER_UPDATE_FAILED, 4);
define(USER_UPDATE_FAILED_EMAIL_EXISTS, 5); /* user updating to an email address that is already in use */
define(USER_UPDATE_FAILED_NOT_LOGGED_IN, 6); /* user::update() called but user not logged in */
/**
* User class for handling users
*/
@@ -65,32 +73,32 @@ class User {
{
// Update timestamp and clear the inactivity flag if it was set
query_appdb("UPDATE user_list SET stamp=NOW(), inactivity_warned='false' WHERE userid=".$this->iUserId);
return true;
return SUCCESS;
}
return false;
return USER_LOGIN_FAILED;
}
/*
* Creates a new user.
* returns true on success, false on failure
* returns SUCCESS on success, USER_CREATE_EXISTS if the user already exists
*/
function create($sEmail, $sPassword, $sRealname, $sWineRelease)
{
if(user_exists($sEmail))
{
addMsg("An account with this e-mail exists already.","red");
return false;
return USER_CREATE_EXISTS;
} else
{
$hResult = query_parameters("INSERT INTO user_list (realname, email, CVSrelease, password, stamp,".
"created) VALUES ('?', '?', '?', password('?'), ?, ?)",
$sRealname, $sEmail, $sWineRelease, $sPassword, "NOW()", "NOW()");
if(!$hResult) addMsg("Error while creating a new user.", "red");
if(!$hResult) return USER_CREATE_FAILED;
$retval = $this->login($sEmail, $sPassword);
$this->setPref("comments:mode", "threaded"); /* set the users default comments:mode to threaded */
if($retval == SUCCESS)
$this->setPref("comments:mode", "threaded"); /* set the users default comments:mode to threaded */
return $retval;
}
@@ -100,42 +108,55 @@ class User {
/**
* Update User Account;
*/
function update($sEmail = null, $sPassword = null, $sRealname = null, $sWineRelease = null)
function update()
{
if(!$this->isLoggedIn()) return false;
if(!$this->isLoggedIn()) return USER_UPDATE_FAILED_NOT_LOGGED_IN;
if ($sEmail)
/* create an instance of ourselves so we can see what has changed */
$oUser = new User($this->iUserId);
if($this->sEmail && ($this->sEmail != $oUser->sEmail))
{
if(user_exists($sEmail) && $sEmail != $this->sEmail)
/* make sure this email isn't already in use */
if(user_exists($this->sEmail))
{
addMsg("An account with this e-mail exists already.","red");
return false;
return USER_UPDATE_FAILED_EMAIL_EXISTS;
}
if (!query_appdb("UPDATE user_list SET email = '".addslashes($sEmail)."' WHERE userid = ".$this->iUserId))
return false;
$this->sEmail = $sEmail;
if (!query_appdb("UPDATE user_list SET email = '".addslashes($this->sEmail)."' WHERE userid = ".$this->iUserId))
return USER_UPDATE_FAILED;
}
if ($sPassword)
if ($this->sRealname && ($this->sRealname != $oUser->sRealname))
{
if (!query_appdb("UPDATE user_list SET password = password('$sPassword') WHERE userid = ".$this->iUserId))
return false;
if (!query_appdb("UPDATE user_list SET realname = '".addslashes($this->sRealname)."' WHERE userid = ".$this->iUserId))
return USER_UPDATE_FAILED;
}
if ($sRealname)
if ($this->sWineRelease && ($this->sWineRelease != $oUser->sWineRelease))
{
if (!query_appdb("UPDATE user_list SET realname = '".addslashes($sRealname)."' WHERE userid = ".$this->iUserId))
return false;
$this->sRealname = $sRealname;
if (!query_appdb("UPDATE user_list SET CVSrelease = '".addslashes($this->sWineRelease)."' WHERE userid = ".$this->iUserId))
return USER_UPDATE_FAILED;
}
return SUCCESS;
}
/**
* NOTE: we can't update the users password like we can update other
* fields such as their email or username because the password is hashed
* in the database so we can't keep the users password in a class member variable
* and use update() because we can't check if the password changed without hashing
* the newly supplied one
*/
function update_password($sPassword)
{
if($sPassword)
{
if (query_appdb("UPDATE user_list SET password = password('$sPassword') WHERE userid = ".$this->iUserId))
return true;
}
if ($sWineRelease)
{
if (!query_appdb("UPDATE user_list SET CVSrelease = '".addslashes($sWineRelease)."' WHERE userid = ".$this->iUserId))
return false;
$this->sWineRelease = $sWineRelease;
}
return true;
return false;
}

View File

@@ -111,6 +111,7 @@ if($_POST)
$oUser->setPref($arr[1], $value);
}
/* make sure the user enters the same password twice */
if ($aClean['ext_password'] == $aClean['ext_password2'])
{
$str_passwd = $aClean['ext_password'];
@@ -119,7 +120,20 @@ if($_POST)
{
addmsg("The Passwords you entered did not match.", "red");
}
if ($oUser->update($aClean['ext_email'], $str_passwd, $aClean['ext_realname'], $aClean['CVSrelease']))
/* update user data fields */
$oUser->sEmail = $aClean['ext_email'];
$oUser->sRealname = $aClean['ext_realname'];
$oUser->sWineRelease = $aClean['CVSrelease'];
/* if the password was empty in both cases then skip updating the users password */
if($str_passwd != "")
{
if(!$oUser->update_password($str_passwd))
addmsg("Failed to update password", "red");
}
if ($oUser->update() == SUCCESS)
{
addmsg("Preferences Updated", "green");
// we were managing an user, let's go back to the admin after updating tha admin status

3
unit_test/path.php Normal file
View File

@@ -0,0 +1,3 @@
<?php
define("BASE","../");
?>

1
unit_test/run_tests Executable file
View File

@@ -0,0 +1 @@
php -f run_tests.php

11
unit_test/run_tests.php Normal file
View File

@@ -0,0 +1,11 @@
<?php
/* Main test function. To add new tests include_once() */
/* your test file here */
/* TODO: test the rest of the classes we have */
include_once("test_user.php");
?>

285
unit_test/test_user.php Normal file
View File

@@ -0,0 +1,285 @@
<?php
/* unit tests for user class */
require_once("path.php");
require_once(BASE."include/incl.php");
require_once(BASE."include/user.php");
/* TODO: check permissions functions */
$test_email = "testemail@somesite.com";
$test_password = "password";
function test_start($sFunctionName)
{
echo $sFunctionName."() starting\n";
}
/* NOTE: test_user_login() relies on this function leaving the test user */
/* in the database */
function test_user_create()
{
test_start(__FUNCTION__);
global $test_email, $test_password;
$oUser = new User();
/* delete the user if they already exist */
if($oUser->login($test_email, $test_password) == SUCCESS)
{
$oUser->delete();
$oUser = new User();
}
/* create the user */
$retval = $oUser->create("testemail@somesite.com", "password", "Test user", "20051020");
if($retval != SUCCESS)
{
if($retval == USER_CREATE_EXISTS)
echo "The user already exists!\n";
else if($retval == USER_LOGIN_FAILED)
echo "User login failed!\n";
else
echo "ERROR: UNKNOWN ERROR!!\n";
return false;
}
/* try creating the user again, see that we get USER_CREATE_EXISTS */
$retval = $oUser->create("testemail@somesite.com", "password", "Test user", "20051020");
if($retval != USER_CREATE_EXISTS)
{
echo "Got '".$retval."' instead of USER_CREATE_EXISTS(".USER_CREATE_EXISTS.")\n";
return false;
}
return true;
}
/* NOTE: relies on test_create_user() being run first and leaving a user */
/* created in the db */
function test_user_login()
{
test_start(__FUNCTION__);
global $test_email, $test_password;
/* test that correct information results in a correct login */
$oUser = new User();
$retval = $oUser->login($test_email, $test_password);
if($retval != SUCCESS)
{
echo "Got '".$retval."' instead of SUCCESS(".SUCCESS.")\n";
return false;
}
/* test that incorrect user results in a login failed */
$oUser = new User();
$retval = $oUser->login("some nutty username", $testpassword);
if($retval != USER_LOGIN_FAILED)
{
echo "Got '".$retval."' instead of SUCCESS(".SUCCESS.")\n";
return false;
}
/* test that incorrect password results in a login failed */
$oUser = new User();
$retval = $oUser->login($test_email, "some password");
if($retval != USER_LOGIN_FAILED)
{
echo "Got '".$retval."' instead of SUCCESS(".SUCCESS.")\n";
return false;
}
return true;
}
function test_user_update_set_test($realname, $winerelease)
{
global $test_email, $test_password;
/* log the user in */
$oUser = new User();
$retval = $oUser->login($test_email, $test_password);
if($retval != SUCCESS)
{
echo "Got '".$retval."' instead of SUCCESS(".SUCCESS.")\n";
return false;
}
/* modify the users realname and wine release */
$oUser->sRealname = $realname;
$oUser->sWineRelease = $winerelease;
$oUser->update(); /* save the changes */
/* log the user in again */
$oUser = new User();
$retval = $oUser->login($test_email, $test_password);
if($retval != SUCCESS)
{
echo "Got '".$retval."' instead of SUCCESS(".SUCCESS.")\n";
return false;
}
/* make sure the realname and wine release match */
if($oUser->sRealname != $realname)
{
echo "Realname of '".$oUser->sRealname."' doesn't match expected realname of '".$realname."'\n";
return false;
}
if($oUser->sWineRelease != $winerelease)
{
echo "Wine release of '".$oUser->sWineRelease."' doesn't match expected wine release of '".$winerelease."'\n";
return false;
}
return true;
}
/* test that we can set values and call user::update() and have the values be saved */
function test_user_update()
{
test_start(__FUNCTION__);
global $test_email, $test_password;
if(!test_user_update_set_test("some bogus realname", "some crazy wine release"))
{
return false;
}
if(!test_user_update_set_test("some new bogus realname", "some new crazy wine release"))
{
return false;
}
return true;
}
function test_user_delete()
{
test_start(__FUNCTION__);
global $test_email, $test_password;
/* login the user */
$oUser = new User();
$retval = $oUser->login($test_email, $test_password);
if($retval != SUCCESS)
{
echo "Got '".$retval."' instead of SUCCESS(".SUCCESS.")\n";
return false;
}
/* delete the user */
$oUser->delete();
/* try to log in again */
$oUser = new User();
$retval = $oUser->login($test_email, $test_password);
if($retval != USER_LOGIN_FAILED)
{
echo "Got '".$retval."' instead of USER_LOGIN_FAILED(".USER_LOGIN_FAILED.")\n";
return false;
}
/* now create the user again and see that it is created successfully */
/* create the user */
$oUser = new User();
$retval = $oUser->create($test_email, $test_password, "Test user", "20051020");
if($retval != SUCCESS)
{
if($retval == USER_CREATE_EXISTS)
echo "The user already exists!\n";
else if($retval == USER_LOGIN_FAILED)
echo "User login failed!\n";
else
echo "ERROR: UNKNOWN ERROR!!\n";
return false;
}
return true;
}
function test_user_getpref_setpref()
{
test_start(__FUNCTION__);
global $test_email, $test_password;
/* login the user */
$oUser = new User();
$retval = $oUser->login($test_email, $test_password);
if($retval != SUCCESS)
{
echo "Got '".$retval."' instead of SUCCESS(".SUCCESS.")\n";
return false;
}
/* set a preference and retrieve it */
$pref_key = "testpreference";
$pref_value = "test value";
$oUser->setPref($pref_key, $pref_value);
$got_pref = $oUser->getPref($pref_key);
if($got_pref != $pref_value)
{
echo "Expected preference value of '".$pref_value."' got preference value of '".$got_pref."'\n";
return false;
}
return true;
}
/*************************/
/* Main testing routines */
if(!test_user_create())
echo "test_user_create() failed!\n";
else
echo "test_user_create() passed\n";
if(!test_user_login())
echo "test_user_login() failed!\n";
else
echo "test_user_login() passed\n";
if(!test_user_update())
echo "test_user_update() failed!\n";
else
echo "test_user_update() passed\n";
if(!test_user_delete())
echo "test_user_delete() failed!\n";
else
echo "test_user_delete() passed\n";
if(!test_user_getpref_setpref())
echo "test_user_getpref_setpref() failed!\n";
else
echo "test_user_getpref_setpref() passed\n";
/* TODO: the rest of the user member functions we don't currently test */
/* clean up the user we created during testing */
/* so the unit test leaves no trace that it ran */
$oUser = new User();
/* delete the user if they already exist */
if($oUser->login($test_email, $test_password) == SUCCESS)
{
$oUser->delete();
$oUser = new User();
}
?>