Files
php_db_components_pack/tests/classes/DatabaseTest.php
2025-08-20 21:19:52 +03:00

310 lines
13 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace goodboyalex\php_db_components_pack\tests\classes;
use Exception;
use goodboyalex\php_components_pack\classes\ObjectArray;
use goodboyalex\php_components_pack\types\GUID;
use goodboyalex\php_db_components_pack\classes\ConditionBuilder;
use goodboyalex\php_db_components_pack\classes\Database;
use goodboyalex\php_db_components_pack\models\DBConfig;
use goodboyalex\php_db_components_pack\tests\data\UserModel;
use PHPUnit\Framework\TestCase;
class DatabaseTest extends TestCase
{
/**
* Тестирование базы данных.
*
* ВНИМАТЕЛЬНО ПРОЧТИТЕ, ПЕРЕД ВЫПОЛНЕНИЕМ ТЕСТА.
*
* Подготовка к тесту:
*
* - создайте тестовую базу данных;
* - создайте пользователя и его пароль;
* - сделайте его создателем с правами управления созданной в п. 1 БД;
* - в корне папки "tests" создайте файл "database_config.php";
* - убедитесь, что он добавлен в .gitignore и НИКАКИМ ОБРАЗОМ НЕ ПОПАДЁТ В РЕПОЗИТАРИЙ (это
* скомпрометирует вшу БД!);
* - в этом файле задайте переменной $testConfig класс настроек с необходимыми настройками или можете
* воспользоваться файлом "database_config_sample.php", переименовав его в "database_config.php".
*
* @return void
*/
public function testDatabase ()
{
/**
* Подключаем настройки базы данных.
*
* @var DBConfig $testConfig Конфигурация СУБД.
*/
require_once "../database_config.php";
// Подключаем данные
require_once '../data/Converters.php';
require_once '../data/UserModel.php';
// Задаём действие при ошибке
$onException = fn (Exception $exception, bool $terminate)
=> $terminate
? die($exception->getMessage())
: print $exception->getMessage();
// Подключаем базу данных
$db = new Database($testConfig, $onException);
/* ТЕСТ 1: Создание таблицы */
// Задаём имя таблицы
$tableName = 'users';
// Создаю таблицу
$db->CreateTable(
tableName: $tableName,
dbItemClass: '\goodboyalex\php_db_components_pack\tests\data\UserModel'
);
// Проверяю создание
$this->assertTrue($db->IsTableExist($tableName));
/* 2. Добавление данных */
/* 2.1. Модели */
// Модель 1
$model1 = new UserModel(
id: GUID::Parse('8b5dab25-4445-436c-8f25-0f5352cb8500', true),
login: "account1",
password: "password1",
salt: GUID_EMPTY,
firstName: "firstName1",
middleName: "middleName1",
lastName: "lastName1",
email: "email1@ya.ru",
isEmailVerified: false,
groupName: "default",
createdAt: time(),
updatedAt: 0,
userData: ['key1' => 'value1', 'key2' => 'value2']
);
// Модель 2
$model2 = new UserModel(
id: GUID::Parse('3552914c-9ffc-4c73-8946-97c40b0d81b5'),
login: "account2",
password: "password2",
salt: GUID_EMPTY,
firstName: "firstName2",
middleName: "middleName2",
lastName: "lastName2",
email: "email2@ya.ru",
isEmailVerified: false,
groupName: "default",
createdAt: time(),
updatedAt: 0,
userData: ['key1' => 'value3', 'key2' => 4]
);
// Модель 3
$model3 = new UserModel(
id: GUID::Parse('73828df6-89a3-4feb-ae9a-ef79d0e67cb0'),
login: "account3",
password: "password3",
salt: GUID_EMPTY,
firstName: "firstName3",
middleName: "middleName3",
lastName: "lastName3",
email: "email3@ya.ru",
isEmailVerified: true,
groupName: "default1",
createdAt: time(),
updatedAt: time(),
userData: ['key1' => 1, 'key2' => 2]
);
// Модель 4
$model4 = new UserModel(
id: GUID::Parse('df39f53f-faff-42cf-bf00-f5855c3e11ec'),
login: "account4",
password: "password4",
salt: GUID_EMPTY,
firstName: "firstName4",
middleName: "middleName4",
lastName: "lastName4",
email: "email4@ya.ru",
isEmailVerified: true,
groupName: "default1",
createdAt: time(),
updatedAt: time(),
userData: ['key1' => 3, 'key2' => '2']
);
/* 2.2. Добавление 1 элемента */
// Вставляю $model1
$result = $db->Insert($tableName, $model1);
// Проверяю, успешно ли прошло
$this->assertTrue($result !== false);
// - и совпадает ли идентификатор
$this->assertTrue($model1->Id->IsEqualsTo($result));
/* 2.3. Добавление более 1 элемента */
// Массив ожидаемых результатов
$expectedResult = [
GUID::Parse('3552914c-9ffc-4c73-8946-97c40b0d81b5'),
GUID::Parse('73828df6-89a3-4feb-ae9a-ef79d0e67cb0'),
GUID::Parse('df39f53f-faff-42cf-bf00-f5855c3e11ec')
];
// Вставляю несколько
$result = $db->InsertMany($tableName, $model2, $model3, $model4);
// Убеждаюсь, что вставка успешна
$this->assertTrue($result !== false);
// - и все идентификаторы совпадают
$this->assertEqualsCanonicalizing($expectedResult, $result);
/* 3. Получение данных. */
/* 3.1. Получение одной записи. */
/**
* Получаю запись.
*
* @var false|UserModel $model Модель записи.
*/
$model = $db->GetRow(
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'))
);
/* 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'
);
// Убеждаюсь, что записи получены
$this->assertTrue($models !== false);
// - и запись с логином account2 находится в списке
$this->assertTrue($models->IsExist(fn (UserModel $model) => $model->Login == 'account2'));
/* 3.3. Получение колонки. */
// Получаю колонку id
$models = $db->GetCol(
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);
/* 3.4. Получение значения. */
// Получаю значение id
$id = $db->GetValue(
table: $tableName,
column: 'id',
where: new ConditionBuilder()->WhereEquals('login', 'account2')
);
// Убеждаюсь, что значение получено и оно совпадает с ожидаемым
$this->assertEquals("3552914c-9ffc-4c73-8946-97c40b0d81b5", $id);
/* 4. Обновление данных. */
/* 4.1. Обновление одной записи. */
// Обновляю запись model1
$model1->Email = 'account1@yandex.ru';
// Обновляю запись
$result = $db->Update($tableName, $model);
// Убеждаюсь, что запись обновлена
$this->assertTrue($result);
/* 4.2. Обновление нескольких записей. */
// Обновляю записи
$model2->Email = 'account2@yandex.ru';
$model2->IsEmailVerified = true;
$model3->Email = 'account3@yandex.ru';
$model3->IsEmailVerified = true;
$model4->Email = 'account4@yandex.ru';
$model4->IsEmailVerified = true;
// Обновляю записи
$result = $db->UpdateMany($tableName, $model1, $model2, $model3);
// Убеждаюсь, что записи обновлены
$this->assertTrue($result);
/* 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);
/* 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);
// - и таблица не существует
$this->assertFalse($db->IsTableExist($tableName));
/* КОНЕЦ ТЕСТА */
}
}