20250820 1.0.2

This commit is contained in:
2025-08-20 21:19:52 +03:00
parent 95aa7d9411
commit 2d9fceb0d6

View File

@@ -13,23 +13,26 @@
class DatabaseTest extends TestCase
{
/**
* Тестирование базы данных.
*
* ВНИМАТЕЛЬНО ПРОЧТИТЕ, ПЕРЕД ВЫПОЛНЕНИЕМ ТЕСТА.
*
* Подготовка к тесту:
*
* - создайте тестовую базу данных;
* - создайте пользователя и его пароль;
* - сделайте его создателем с правами управления созданной в п. 1 БД;
* - в корне папки "tests" создайте файл "database_config.php";
* - убедитесь, что он добавлен в .gitignore и НИКАКИМ ОБРАЗОМ НЕ ПОПАДЁТ В РЕПОЗИТАРИЙ (это
* скомпрометирует вшу БД!);
* - в этом файле задайте переменной $testConfig класс настроек с необходимыми настройками или можете
* воспользоваться файлом "database_config_sample.php", переименовав его в "database_config.php".
*
* @return void
*/
public function testDatabase ()
{
/**
* ВНИМАТЕЛЬНО ПРОЧТИТЕ, ПЕРЕД ВЫПОЛНЕНИЕМ ТЕСТА.
*
* Подготовка к тесту:
*
* - создайте тестовую базу данных;
* - создайте пользователя и его пароль;
* - сделайте его создателем с правами управления созданной в п. 1 БД;
* - в корне папки "tests" создайте файл "database_config.php";
* - убедитесь, что он добавлен в .gitignore и НИКАКИМ ОБРАЗОМ НЕ ПОПАДЁТ В РЕПОЗИТАРИЙ (это
* скомпрометирует вшу БД!);
* - в этом файле задайте переменной $testConfig класс настроек с необходимыми настройками или можете
* воспользоваться файлом "database_config_sample.php", переименовав его в "database_config.php".
*/
/**
* Подключаем настройки базы данных.
*
@@ -155,254 +158,153 @@
];
// Вставляю несколько
$result = $db->InsertMany('users', $model2, $model3, $model4);
$result = $db->InsertMany($tableName, $model2, $model3, $model4);
// Убеждаюсь, что вставка успешна
$this->assertTrue($result !== false);
// - и все идентификаторы совпадают
$this->assertEqualsCanonicalizing($expectedResult, $result);
}
public function testGetRow ()
{
$this->IncludeReq();
$db = $this->GetDatabase();
if (!$db->IsTableExist('users'))
die('Таблица не существует. Сперва запустите тест testCreateTable / Table does not exist. Run testCreateTable first');
if (!$db->IsExist(
table: 'users',
where: new ConditionBuilder()->WhereEquals('login', 'account1')
))
die('Записи с логином account1 не существует в таблице users / Record with login account1 is not exists in table users');
/* 3. Получение данных. */
/* 3.1. Получение одной записи. */
/**
* @var false|UserModel $model
* Получаю запись.
*
* @var false|UserModel $model Модель записи.
*/
$model = $db->GetRow(
table: 'users',
table: $tableName,
where: new ConditionBuilder()->WhereEquals('login', 'account1'),
className: '\goodboyalex\php_db_components_pack\tests\data\UserModel'
);
// Убеждаюсь, что запись получена
$this->assertTrue($model !== false);
// - совпадает ли логин
$this->assertEquals('account1', $model->Login);
// - и совпадает ли идентификатор
$this->assertEquals(
'account1', $model->Id->IsEqualsTo(GUID::Parse('8b5dab25-4445-436c-8f25-0f5352cb8500'))
);
}
public function testGetCol ()
{
$this->IncludeReq();
$db = $this->GetDatabase();
/* 3.2. Получение нескольких записей. */
/**
* Получаю записи.
*
* @var false|ObjectArray $model Набор моделей записей.
*/
$models = $db->GetRows(
table: $tableName,
where: new ConditionBuilder()->WhereNotEquals('login', 'account1'),
className: '\goodboyalex\php_db_components_pack\tests\data\UserModel'
);
if (!$db->IsTableExist('users'))
die('Таблица не существует. Сперва запустите тест testCreateTable / Table does not exist. Run testCreateTable first');
if (!$db->IsExist(
table: 'users',
where: new ConditionBuilder()
->WhereEquals('login', 'account2')
->Or()
->WhereEquals('login', 'account3')
->Or()
->WhereEquals('login', 'account4')
))
die('Записи с логином account1 не существует в таблице users / Record with login account1 is not exists in table users');
// Убеждаюсь, что записи получены
$this->assertTrue($models !== false);
// - и запись с логином account2 находится в списке
$this->assertTrue($models->IsExist(fn (UserModel $model) => $model->Login == 'account2'));
/* 3.3. Получение колонки. */
// Получаю колонку id
$models = $db->GetCol(
table: 'users',
table: $tableName,
column: 'id',
where: new ConditionBuilder()->WhereNotEquals('login', 'account1')
);
// Убеждаюсь, что колонка получена
$this->assertTrue($models !== false);
// - собираю ожидаемый результат
$expected = [
"3552914c-9ffc-4c73-8946-97c40b0d81b5",
"73828df6-89a3-4feb-ae9a-ef79d0e67cb0",
"df39f53f-faff-42cf-bf00-f5855c3e11ec"
];
// - и совпадает ли результат с ожидаемым
$this->assertEqualsCanonicalizing($expected, $models);
}
public function testGetRows ()
{
$this->IncludeReq();
$db = $this->GetDatabase();
if (!$db->IsTableExist('users'))
die('Таблица не существует. Сперва запустите тест testCreateTable / Table does not exist. Run testCreateTable first');
if (!$db->IsExist(
table: 'users',
where: new ConditionBuilder()
->WhereEquals('login', 'account2')
->Or()
->WhereEquals('login', 'account3')
->Or()
->WhereEquals('login', 'account4')
))
die('Записи с логином account1 не существует в таблице users / Record with login account1 is not exists in table users');
/**
* @var false|ObjectArray $model
*/
$models = $db->GetRows(
table: 'users',
where: new ConditionBuilder()->WhereNotEquals('login', 'account1'),
className: '\goodboyalex\php_db_components_pack\tests\data\UserModel'
);
$this->assertTrue($models !== false);
$this->assertTrue($models->IsExist(fn (UserModel $model) => $model->Login == 'account2'));
}
public function testDropTable ()
{
$this->IncludeReq();
$db = $this->GetDatabase();
$result = $db->DropTable('users');
$this->assertTrue($result);
}
public function testGetValue ()
{
$this->IncludeReq();
$db = $this->GetDatabase();
if (!$db->IsTableExist('users'))
die('Таблица не существует. Сперва запустите тест testCreateTable / Table does not exist. Run testCreateTable first');
if (!$db->IsExist(
table: 'users',
where: new ConditionBuilder()
->WhereEquals('login', 'account2')
->Or()
->WhereEquals('login', 'account3')
->Or()
->WhereEquals('login', 'account4')
))
die('Записи с логином account1 не существует в таблице users / Record with login account1 is not exists in table users');
/* 3.4. Получение значения. */
// Получаю значение id
$id = $db->GetValue(
table: 'users',
table: $tableName,
column: 'id',
where: new ConditionBuilder()->WhereEquals('login', 'account2')
);
// Убеждаюсь, что значение получено и оно совпадает с ожидаемым
$this->assertEquals("3552914c-9ffc-4c73-8946-97c40b0d81b5", $id);
}
public function testUpdate ()
{
$this->IncludeReq();
$db = $this->GetDatabase();
/* 4. Обновление данных. */
/* 4.1. Обновление одной записи. */
// Обновляю запись model1
$model1->Email = 'account1@yandex.ru';
if (!$db->IsTableExist('users'))
die('Таблица не существует. Сперва запустите тест testCreateTable / Table does not exist. Run testCreateTable first');
if (!$db->IsExist(
table: 'users',
where: new ConditionBuilder()->WhereEquals('login', 'account1')
))
die('Запись с логином account1 не существует в таблице users. Сперва удалите запись с логином account1 (можно использовать метод testDelete) / Record with login account1 already exists in table users. Delete record with login account1 first');
$model = $db->GetRow(
'users',
where: new ConditionBuilder()->WhereEquals('login', 'account1'),
className: '\goodboyalex\php_db_components_pack\tests\data\UserModel'
);
$this->assertTrue($model !== false);
$model->Email = 'account1@yandex.ru';
$result = $db->Update('users', $model);
// Обновляю запись
$result = $db->Update($tableName, $model);
// Убеждаюсь, что запись обновлена
$this->assertTrue($result);
}
public function testUpdateMany ()
{
$this->IncludeReq();
$db = $this->GetDatabase();
$model1 = $db->GetRow(
'users',
where: new ConditionBuilder()->WhereEquals('login', 'account2'),
className: '\goodboyalex\php_db_components_pack\tests\data\UserModel'
);
$this->assertTrue($model1 !== false);
$model1->Email = 'account2@yandex.ru';
$model1->IsEmailVerified = true;
$model2 = $db->GetRow(
'users',
where: new ConditionBuilder()->WhereEquals('login', 'account3'),
className: '\goodboyalex\php_db_components_pack\tests\data\UserModel'
);
$this->assertTrue($model2 !== false);
$model2->Email = 'account3@yandex.ru';
/* 4.2. Обновление нескольких записей. */
// Обновляю записи
$model2->Email = 'account2@yandex.ru';
$model2->IsEmailVerified = true;
$model3 = $db->GetRow(
'users',
where: new ConditionBuilder()->WhereEquals('login', 'account4'),
className: '\goodboyalex\php_db_components_pack\tests\data\UserModel'
);
$this->assertTrue($model3 !== false);
$model3->Email = 'account4@yandex.ru';
$model3->Email = 'account3@yandex.ru';
$model3->IsEmailVerified = true;
$model4->Email = 'account4@yandex.ru';
$model4->IsEmailVerified = true;
$result = $db->UpdateMany('users', $model1, $model2, $model3);
$this->assertTrue($result);
}
public function testDelete ()
{
$this->IncludeReq();
$db = $this->GetDatabase();
$result = $db->Delete('users', new ConditionBuilder()->WhereEquals('email_verified', 0));
// Обновляю записи
$result = $db->UpdateMany($tableName, $model1, $model2, $model3);
// Убеждаюсь, что записи обновлены
$this->assertTrue($result);
$count = $db->Count('users');
/* 5. Удаление данных. */
/* 5.1. Удаление одной записи. */
// Удаляю запись
$result = $db->Delete($tableName, new ConditionBuilder()->WhereEquals('email_verified', 0));
// Убеждаюсь, что запись удалена
$this->assertTrue($result);
// - и количество записей в таблице
$count = $db->Count($tableName);
// - равно 3
$this->assertEquals(3, $count);
$result = $db->Delete('users');
/* 5.2. Удаление нескольких записей. */
// Удаляю записи
$result = $db->Delete($tableName);
// Убеждаюсь, что записи удалены
$this->assertTrue($result);
// - и количество записей в таблице
$count = $db->Count($tableName);
// - равно 0
$this->assertEquals(0, $count);
/* 6. Удаление таблицы. */
// Удаляю таблицу
$result = $db->DropTable($tableName);
// Убеждаюсь, что таблица удалена
$this->assertTrue($result);
$count = $db->Count('users');
$this->assertEquals(0, $count);
// - и таблица не существует
$this->assertFalse($db->IsTableExist($tableName));
/* КОНЕЦ ТЕСТА */
}
private function IncludeReq (): void {}
private function GetDatabase (): Database {}
}