This commit is contained in:
2025-08-18 23:00:17 +03:00
parent 2cf87d86d2
commit f20d82a6c5
5 changed files with 447 additions and 4 deletions

View File

@@ -0,0 +1,168 @@
<?php
namespace goodboyalex\php_db_components_pack\tests\secret_not_in_git;
use BackedEnum;
use goodboyalex\php_components_pack\types\GUID;
/**
* Класс конвертации для моделей.
*
* @author Александр Бабаев
* @package freecms
* @version 0.1
* @since 0.1
*/
final class Converters
{
/**
* Преобразует GUID в строковое представление.
*
* @param GUID $guid GUID.
*
* @return string GUID в строковом представлении.
*/
public static function GUIDToString (GUID $guid): string
{
return $guid->ToString();
}
/**
* Преобразует строковое представление GUID в объект GUID.
*
* @param string $guid Строковое представление GUID.
*
* @return GUID Преобразует строковое представление GUID в объект GUID или GUID_EMPTY.
*/
public static function GUIDFromString (string $guid): GUID
{
return GUID::Parse($guid, true);
}
/**
* Проверяет равенство двух GUID.
*
* @param GUID $guid1 GUID 1.
* @param GUID $guid2 GUID 2.
*
* @return bool true, если GUID равны, false - иначе.
*/
public static function IsGUIDEqual (GUID $guid1, GUID $guid2): bool
{
return $guid1->IsEqualsTo($guid2);
}
/**
* Преобразует объект перечисления в значение.
*
* @param BackedEnum $enum Перечисление.
*
* @return int Значение перечисления.
*/
public static function BackedEnumToInt (BackedEnum $enum): int
{
return $enum->value;
}
/**
*
* @param int $value Значение перечисления.
*
* @return BackedEnum Перечисление.
*/
public static function BackedEnumFromInt (int $value): BackedEnum
{
return BackedEnum::tryFrom($value);
}
/**
* Сравнивает два значения перечисления.
*
* @param BackedEnum $enum1 Перечисление 1.
* @param BackedEnum $enum2 Перечисление 2.
*
* @return bool true, если значения равны, false - иначе.
*/
public static function IsBackedEnumEqual (BackedEnum $enum1, BackedEnum $enum2): bool
{
return $enum1->value === $enum2->value;
}
/**
* Преобразует логическое значение в целочисленное.
*
* @param bool $boolValue Значение.
*
* @return int Значение 0 или 1.
*/
public static function BoolToInt (bool $boolValue): int
{
return $boolValue ? 1 : 0;
}
/**
* Преобразует целочисленное значение в логическое.
*
* @param int $value Значение 0 или 1.
*
* @return bool Логическое значение.
*/
public static function BoolFromInt (int $value): bool
{
return $value > 0;
}
/**
* Сравнивает два логических значения.
*
* @param bool $bool1 Значение 1.
* @param bool $bool2 Значение 2.
*
* @return bool true, если значения равны, false - иначе.
*/
public static function IsBoolEqual (bool $bool1, bool $bool2): bool
{
return ($bool1 == true && $bool2 == true) || ($bool1 == false && $bool2 == false);
}
/**
* Преобразует массив в строку.
*
* @param array $array Массив.
*
* @return string Сериализованный массив.
*/
public static function ArrayToString (array $array): string
{
return serialize($array);
}
/**
* Преобразует строковое представление массива в массив.
*
* @param string $value Строковое представление массива.
*
* @return array Массив.
*/
public static function ArrayFromString (string $value): array
{
return unserialize($value);
}
/**
* Сравнивает два массива.
*
* @param array $array1 Массив 1.
* @param array $array2 Массив 2.
*
* @return bool true, если значения равны, false - иначе.
*/
public static function IsArrayEqual (array $array1, array $array2): bool
{
// Получаем разницу между массивами
$difference = array_diff($array1, $array2);
// Если разница пуста, значит массивы равны
return empty($difference);
}
}

View File

@@ -0,0 +1,121 @@
<?php
namespace goodboyalex\php_db_components_pack\tests\secret_not_in_git;
use Exception;
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\enums\DBDriver;
use goodboyalex\php_db_components_pack\models\DBConfig;
use PHPUnit\Framework\TestCase;
class DatabaseTest extends TestCase
{
public function testGetRow () {}
public function testInsertMany () {}
public function testUpdateMany () {}
public function testExecute () {}
public function testInsert ()
{
$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. Сперва удалите запись с логином account1 (можно использовать метод testDelete) / Record with login account1 already exists in table users. Delete record with login account1 first');
$model = new UserModel(
id: GUID::Generate(),
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']
);
$result = $db->Insert('users', $model);
$this->assertTrue($result !== false);
}
public function testQuery () {}
public function testQueryLast () {}
public function testCreateTable ()
{
$this->IncludeReq();
$db = $this->GetDatabase();
$db->CreateTable(
tableName: 'users',
dbItemClass: '\goodboyalex\php_db_components_pack\tests\secret_not_in_git\UserModel'
);
$this->assertTrue($db->IsTableExist('users'));
}
public function testQueryFirst () {}
public function testCount () {}
public function testGetCol () {}
public function testGetRows () {}
public function testIsTableExist () {}
public function testDropTable () {}
public function testGetValue () {}
public function testUpdate () {}
public function testIsExist () {}
public function testDelete () {}
private function IncludeReq (): void
{
require_once 'Converters.php';
require_once 'UserModel.php';
}
private function GetDatabase (): Database
{
$config = new DBConfig(
driver: DBDriver::MSSQL,
host: '46.172.4.201',
port: 17879,
name: 'php_db_components_test',
userName: "db_user",
password: 'hxcssuy:oI.CQ%.zbw=As$Lj7=]+nf'
);
$onException = fn (Exception $exception, bool $terminate)
=> $terminate
? die($exception->getMessage())
: print $exception->getMessage();
return new Database($config, $onException);
}
}

View File

@@ -0,0 +1,157 @@
<?php
namespace goodboyalex\php_db_components_pack\tests\secret_not_in_git;
use goodboyalex\php_components_pack\types\GUID;
use goodboyalex\php_db_components_pack\attributes\Compare;
use goodboyalex\php_db_components_pack\attributes\ConvertToDB;
use goodboyalex\php_db_components_pack\attributes\DataType;
use goodboyalex\php_db_components_pack\attributes\DefaultValue;
use goodboyalex\php_db_components_pack\attributes\FieldName;
use goodboyalex\php_db_components_pack\attributes\NotNull;
use goodboyalex\php_db_components_pack\attributes\PrimaryKey;
use goodboyalex\php_db_components_pack\enums\DBType;
use goodboyalex\php_db_components_pack\interfaces\IDBItem;
/**
* Модель информации о пользователе.
*
* Структура таблицы:
*
* -- id - string(36) - Уникальный идентификатор пользователя (индекс).
* -- login - varchar(50) - Имя пользователя.
* -- password - varchar(255) - Пароль пользователя.
* -- salt - varchar(36) - Ключ шифровки пароля.
* -- first_name - varchar(50) - Имя пользователя.
* -- middle_name - varchar(50) - Отчество пользователя.
* -- last_name - varchar(50) - Фамилия пользователя.
* -- email - varchar(100) - Электронная почта пользователя.
* -- email_verified - TinyInt - Статус подтверждения электронной почты.
* -- group - varchar(50) - Имя группы пользователя.
* -- date_created - bigint - Временной штамп даты создания пользователя.
* -- date_updated - bigint - Временной штамп даты обновления пользователя.
* -- data - LONGTEXT - NULL - Массив разных данных о пользователе.
*
* @author Александр Бабаев
* @package php_db_components_pack
* @version 1.0
* @since 1.0.2
*/
final class UserModel implements IDBItem
{
/**
* @var GUID $Id Идентификатор пользователя
*/
#[PrimaryKey, NotNull, DataType(DBType::STRING, 36), ConvertToDB(
fromType: ['\goodboyalex\php_db_components_pack\tests\secret_not_in_git\Converters', 'GUIDToString'],
toType: [
'\goodboyalex\php_db_components_pack\tests\secret_not_in_git\Converters', 'GUIDFromString'
]), Compare(['\goodboyalex\php_db_components_pack\tests\secret_not_in_git\Converters', 'IsGUIDEqual']),
FieldName('id'), DefaultValue(GUID_EMPTY)]
public GUID $Id;
/**
* @var string $Login Логин пользователя (на английском языке)
*/
#[NotNull, FieldName('login'), DataType(DBType::STRING, 50), DefaultValue("")]
public string $Login = "";
/**
* @var string $Password Пароль пользователя
*/
#[NotNull, FieldName('password'), DataType(DBType::STRING, 255), DefaultValue("")]
public string $Password = '';
/**
* @var string $Salt Кодовое слово для пароля (обычно Guid)
*/
#[NotNull, FieldName('salt'), DataType(DBType::STRING, 36), DefaultValue(GUID_EMPTY)]
public string $Salt = '';
/**
* @var string $FirstName Имя пользователя
*/
#[NotNull, FieldName('first_name'), DataType(DBType::STRING, 50), DefaultValue("")]
public string $FirstName = "";
/**
* @var string $MiddleName Отчество пользователя
*/
#[NotNull, FieldName('middle_name'), DataType(DBType::STRING, 50), DefaultValue("")]
public string $MiddleName = "";
/**
* @var string $LastName Фамилия пользователя
*/
#[NotNull, FieldName('last_name'), DataType(DBType::STRING, 50), DefaultValue("")]
public string $LastName = "";
/**
* @var string $Email Электронная почта пользователя
*/
#[NotNull, FieldName('email'), DataType(DBType::STRING, 100), DefaultValue("")]
public string $Email = "";
/**
* @var bool $IsEmailVerified Статус подтверждения электронной почты
*/
#[NotNull, FieldName('email_verified'), DataType(DBType::INT), ConvertToDB(
fromType: ['\goodboyalex\php_db_components_pack\tests\secret_not_in_git\Converters', 'BoolToInt'],
toType: ['\goodboyalex\php_db_components_pack\tests\secret_not_in_git\Converters', 'BoolFromInt']),
Compare([
'\goodboyalex\php_db_components_pack\tests\secret_not_in_git\Converters', 'IsBoolEqual'
]), DefaultValue(0)]
public bool $IsEmailVerified = false;
/**
* @var string $GroupName Имя группы пользователя
*/
#[NotNull, FieldName('group'), DataType(DBType::STRING, 50), DefaultValue('')]
public string $GroupName = '';
/**
* @var int $CreatedAt Штамп даты создания пользователя
*/
#[NotNull, FieldName('date_created'), DataType(DBType::INT), DefaultValue(0)]
public int $CreatedAt = 0;
/**
* @var int $ModifiedAt Штамп даты изменения пользователя
*/
#[NotNull, FieldName('date_updated'), DataType(DBType::INT), DefaultValue(0)]
public int $ModifiedAt = 0;
/**
* @var array $UserData Массив разных данных о пользователе
*/
#[NotNull, FieldName('data'), DataType(DBType::STRING, 0), ConvertToDB(
fromType: ['\goodboyalex\php_db_components_pack\tests\secret_not_in_git\Converters', 'ArrayToString'],
toType: ['\goodboyalex\php_db_components_pack\tests\secret_not_in_git\Converters', 'ArrayFromString']),
Compare([
'\goodboyalex\php_db_components_pack\tests\secret_not_in_git\Converters', 'IsArrayEqual'
]), DefaultValue("[]")]
public array $UserData = [];
/**
* Конструктор.
*/
public function __construct (GUID $id = new GUID(), string $login = "", string $password = "",
string $salt = "", string $firstName = "", string $middleName = "", string $lastName = "",
string $email = "", bool $isEmailVerified = false, string $groupName = "", int $createdAt = 0,
int $updatedAt = 0, array $userData = [])
{
$this->Id = $id;
$this->Login = $login;
$this->Password = $password;
$this->Salt = $salt;
$this->FirstName = $firstName;
$this->MiddleName = $middleName;
$this->LastName = $lastName;
$this->Email = $email;
$this->IsEmailVerified = $isEmailVerified;
$this->GroupName = $groupName;
$this->CreatedAt = $createdAt;
$this->ModifiedAt = $updatedAt;
$this->UserData = $userData;
}
}