Skip to content
Merged
13 changes: 7 additions & 6 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,15 @@
],
"minimum-stability": "dev",
"require": {
"php": ">=8.0",
"blitz-php/traits": "^1"
"php": "^8.2",
"ext-pdo": "*",
"blitz-php/traits": "^1.7"
},
"require-dev": {
"blitz-php/coding-standard": "^1.3",
"blitz-php/framework": "^0.12.2",
"kahlan/kahlan": "^5.2",
"phpstan/phpstan": "^1.4.7"
"blitz-php/coding-standard": "^1.5",
"blitz-php/framework": "^1.0.0-rc",
"kahlan/kahlan": "^6.1.0",
"phpstan/phpstan": "^2.1.36"
},
"autoload": {
"psr-4": {
Expand Down
31 changes: 13 additions & 18 deletions spec/Builder/Alias.spec.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,59 +11,54 @@

it(": Alias simple", function() {
$builder = $this->builder->from('jobs j');
expect($builder->sql())->toBe('SELECT * FROM jobs As j');
expect($builder->sql())->toBe('SELECT * FROM jobs AS j');

$builder = $this->builder->from('jobs As j');
expect($builder->sql())->toBe('SELECT * FROM jobs As j');
$builder = $this->builder->from('jobs AS j');
expect($builder->sql())->toBe('SELECT * FROM jobs AS j');
});

it(": Prise en charge des tableau d'alias", function() {
$builder = $this->builder->from(['jobs j', 'users u']);
expect($builder->sql())->toBe('SELECT * FROM jobs As j, users As u');
expect($builder->sql())->toBe('SELECT * FROM jobs AS j, users AS u');

$builder = $this->builder->from(['jobs j', 'users as u']);
expect($builder->sql())->toBe('SELECT * FROM jobs As j, users As u');
expect($builder->sql())->toBe('SELECT * FROM jobs AS j, users AS u');
});

it(": Prise en charge de chaine d'alias", function() {
$builder = $this->builder->from('jobs j, users u');
expect($builder->sql())->toBe('SELECT * FROM jobs As j, users As u');
expect($builder->sql())->toBe('SELECT * FROM jobs AS j, users AS u');

$builder = $this->builder->from('jobs j, users AS u');
expect($builder->sql())->toBe('SELECT * FROM jobs As j, users As u');
});
expect($builder->sql())->toBe('SELECT * FROM jobs AS j, users AS u');

it(": Prise en charge de chaine d'alias", function() {
$builder = $this->builder->from('jobs j, users u');
expect($builder->sql())->toBe('SELECT * FROM jobs As j, users As u');

$builder = $this->builder->from('jobs j, users AS u');
expect($builder->sql())->toBe('SELECT * FROM jobs As j, users As u');
$builder = $this->builder->from('jobs as j, users u');
expect($builder->sql())->toBe('SELECT * FROM jobs AS j, users AS u');
});

it(": Alias 'Join' avec un nom de table court", function() {
$this->builder->db()->setPrefix('db_');

$builder = $this->builder->from('jobs')->join('users as u', ['u.id' => 'jobs.id']);
expect($builder->sql())->toMatch('/^SELECT \* FROM db_jobs As jobs_(?:[a-z0-9]+) INNER JOIN db_users As u ON u\.id = jobs_(?:[a-z0-9]+)\.id$/');
expect($builder->sql())->toBe('SELECT * FROM db_jobs INNER JOIN db_users AS u ON u.id = db_jobs.id');
});

it(": Alias 'Join' avec un nom de table long", function() {
$this->builder->db()->setPrefix('db_');

$builder = $this->builder->from('jobs')->join('users as u', ['users.id' => 'jobs.id']);
expect($builder->sql())->toMatch('/^SELECT \* FROM db_jobs As jobs_(?:[a-z0-9]+) INNER JOIN db_users As u ON u\.id = jobs_(?:[a-z0-9]+)\.id$/');
expect($builder->sql())->toBe('SELECT * FROM db_jobs INNER JOIN db_users AS u ON u.id = db_jobs.id');
});

it(": Alias simple 'Like' avec le préfixe DB", function() {
$this->builder->db()->setPrefix('db_');

$builder = $this->builder->from('jobs j')->like('j.name', 'veloper');
expect($builder->sql())->toBe('SELECT * FROM db_jobs As j WHERE j.name LIKE \'%veloper%\'');
expect($builder->sql())->toBe('SELECT * FROM db_jobs AS j WHERE j.name LIKE \'%veloper%\'');
});

it(": Alias simple avec le préfixe table", function() {
$builder = $this->builder->from('articles a')->select('articles.user_id as user')->where('articles.id', 1);
expect($builder->sql())->toBe('SELECT a.user_id As user FROM articles As a WHERE a.id = 1');
expect($builder->sql())->toBe('SELECT a.user_id AS user FROM articles AS a WHERE a.id = 1');
});
});
2 changes: 1 addition & 1 deletion spec/Builder/Base.spec.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@
it(": Séléction distincte", function() {
$builder = $this->builder->select('country')->distinct()->from('users u');

expect($builder->sql())->toBe('SELECT DISTINCT country FROM users As u');
expect($builder->sql())->toBe('SELECT DISTINCT country FROM users AS u');
});
});
15 changes: 9 additions & 6 deletions spec/Builder/Count.spec.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,37 +12,40 @@
it(": Nombre de ligne", function() {
$builder = $this->builder->testMode()->from('jobs j');

expect($builder->count())->toBe('SELECT COUNT(*) As num_rows FROM jobs As j');
expect($builder->count())->toBe('SELECT COUNT(*) AS count_value FROM jobs AS j');
});

it(": Nombre de ligne avec condition", function() {
$builder = $this->builder->testMode()->from('jobs j')->where('id >', 3);

expect($builder->count())->toBe('SELECT COUNT(*) As num_rows FROM jobs As j WHERE id > 3');
expect($builder->count())->toBe('SELECT COUNT(*) AS count_value FROM jobs AS j WHERE id > 3');
});

it(": Nombre de ligne avec regroupement", function() {
$builder = $this->builder->testMode()->from('jobs j')->where('id >', 3)->groupBy('id');

expect($builder->count())->toBe('SELECT COUNT(*) As num_rows FROM ( SELECT * FROM jobs As j WHERE id > 3 GROUP BY id ) BLITZ_count_all_results');
expect($builder->bindings->getValues())->toBe([3]);
expect($builder->count())->toBe('SELECT COUNT(*) AS count_value FROM (SELECT * FROM jobs AS j WHERE id > ? GROUP BY id) AS count_table');
});

it(": Compter tous les résultats avec GroupBy et le prefixe de la base de données", function() {
$this->builder->db()->setPrefix('db_');
$builder = $this->builder->testMode()->select('j.*')->from('jobs j')->where('id >', 3)->groupBy('id');

expect($builder->count())->toMatch('/^SELECT COUNT\(\*\) As num_rows FROM \( SELECT j_(?:[a-z0-9]+)\.\* FROM db_jobs As j_(?:[a-z0-9]+) WHERE id > 3 GROUP BY id \) BLITZ_count_all_results$/');
expect($builder->bindings->getValues())->toBe([3]);
expect($builder->count())->toBe('SELECT COUNT(*) AS count_value FROM (SELECT j.* FROM db_jobs AS j WHERE id > ? GROUP BY id) AS count_table');
});

it(": Compter tous les résultats avec GroupBy et Having", function() {
$builder = $this->builder->testMode()->from('jobs j')->where('id >', 3)->groupBy('id')->having('1=1');

expect($builder->count())->toBe('SELECT COUNT(*) As num_rows FROM ( SELECT * FROM jobs As j WHERE id > 3 GROUP BY id HAVING 1=1 ) BLITZ_count_all_results');
expect($builder->bindings->getValues())->toBe([3, 1]);
expect($builder->count())->toBe('SELECT COUNT(*) AS count_value FROM (SELECT * FROM jobs AS j WHERE id > ? GROUP BY id HAVING 1 = ?) AS count_table');
});

it(": Compter tous les résultats avec Having uniquement", function() {
$builder = $this->builder->testMode()->from('jobs j')->where('id >', 3)->having('1=1');

expect($builder->count())->toBe('SELECT COUNT(*) As num_rows FROM jobs As j WHERE id > 3 HAVING 1=1');
expect($builder->count())->toBe('SELECT COUNT(*) AS count_value FROM jobs AS j WHERE id > 3 HAVING 1 = 1');
});
});
19 changes: 12 additions & 7 deletions spec/Builder/Delete.spec.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,17 @@
use BlitzPHP\Database\Exceptions\DatabaseException;
use BlitzPHP\Database\Spec\Mock\MockConnection;

use function Kahlan\expect;

describe("Database / Query Builder : Suppression", function() {

beforeEach(function() {
$this->builder = new BaseBuilder(new MockConnection([]));
});

it(": Vérification de la présence d'une table", function() {
$builder = $this->builder->testMode();
xit(": Vérification de la présence d'une table", function() {
$builder = $this->builder->testMode()->delete();
dd($builder);
expect(function() use ($builder) {
$builder->delete();
})->toThrow(new DatabaseException("Table is not defined."));
Expand All @@ -24,24 +27,26 @@

it(": Suppression conditionnée", function() {
$builder = $this->builder->testMode()->from('jobs');
expect($builder->delete(['id' => 1]))->toBe('DELETE FROM jobs WHERE id = 1');
expect($builder->delete(['id' => 1]))->toBe('DELETE FROM jobs WHERE id = ?');

$builder = $this->builder->testMode()->from('jobs')->where(['id' => 1]);
expect($builder->delete())->toBe('DELETE FROM jobs WHERE id = 1');
expect($builder->bindings->getValues())->toBe([1]);
expect($builder->delete())->toBe('DELETE FROM jobs WHERE id = ?');
});

it(": Suppression avec alias de table", function() {
// Retrait des alias (explicite) pour les requetes de suppression
$builder = $this->builder->testMode()->from('jobs As j');
expect($builder->delete(['id' => 1]))->toBe('DELETE FROM jobs WHERE id = 1');
expect($builder->delete(['id' => 1]))->toBe('DELETE FROM jobs WHERE id = ?');

// Retrait des alias (implicite) pour les requetes de suppression
$builder = $this->builder->testMode()->from('jobs j');
expect($builder->delete(['id' => 1]))->toBe('DELETE FROM jobs WHERE id = 1');
expect($builder->delete(['id' => 1]))->toBe('DELETE FROM jobs WHERE id = ?');
});

it(": Suppression avec limite", function() {
$builder = $this->builder->testMode()->from('jobs')->where('id', 1)->limit(10);
expect($builder->delete())->toBe('DELETE FROM jobs WHERE id = 1 LIMIT 10');
expect($builder->bindings->getValues())->toBe([1]);
expect($builder->delete())->toBe('DELETE FROM jobs WHERE id = ? LIMIT 10');
});
});
18 changes: 9 additions & 9 deletions spec/Builder/From.spec.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,48 +12,48 @@
it(": Table simple", function() {
$builder = $this->builder->from('jobs');

expect($builder->sql())->toMatch('/^SELECT \* FROM jobs As jobs_(?:[a-z0-9]+)$/');
expect($builder->sql())->toBe('SELECT * FROM jobs');
});

it(": Appel multiple de la méthode `from`", function() {
$builder = $this->builder->from('jobs')->from('users u');

expect($builder->sql())->toMatch('/^SELECT \* FROM jobs As jobs_(?:[a-z0-9]+), users As u$/');
expect($builder->sql())->toBe('SELECT * FROM jobs, users AS u');
});

it(": Utilisation d'un tableau de tables", function() {
$builder = $this->builder->from(['jobs', 'users u']);
expect($builder->sql())->toMatch('/^SELECT \* FROM jobs As jobs_(?:[a-z0-9]+), users As u$/');
expect($builder->sql())->toBe('SELECT * FROM jobs, users AS u');
});

it(": Réinitialisation de la table", function() {
$builder = $this->builder->from('jobs')->from('users u', true);

expect($builder->sql())->toMatch('/^SELECT \* FROM users As u$/');
expect($builder->sql())->toBe('SELECT * FROM users AS u');
});

it(": Réinitialisations", function() {
$builder = $this->builder->from(['jobs j', 'roles r']);
expect($builder->sql())->toBe('SELECT * FROM jobs As j, roles As r');
expect($builder->sql())->toBe('SELECT * FROM jobs AS j, roles AS r');

$builder = $this->builder->from(null, true);
expect($builder->sql())->toBe('SELECT *');

$builder = $this->builder->from('jobs j');
expect($builder->sql())->toBe('SELECT * FROM jobs As j');
expect($builder->sql())->toBe('SELECT * FROM jobs AS j');
});

it(": Sous requetes", function() {
$subquery = (clone $this->builder)->from('users u');
$builder = $this->builder->fromSubquery($subquery, 'alias');
expect($builder->sql())->toBe('SELECT * FROM (SELECT * FROM users As u) alias');
expect($builder->sql())->toBe('SELECT * FROM (SELECT * FROM users AS u) AS alias');

$subquery = (clone $this->builder)->from('users u')->select('id, name');
$builder = $this->builder->fromSubquery($subquery, 'users_1');
expect($builder->sql())->toBe('SELECT * FROM (SELECT id, name FROM users As u) users_1');
expect($builder->sql())->toBe('SELECT * FROM (SELECT id, name FROM users AS u) AS users_1');

$subquery = (clone $this->builder)->from('users u');
$builder = $this->builder->fromSubquery($subquery, 'alias')->from('some_table st');
expect($builder->sql())->toBe('SELECT * FROM (SELECT * FROM users As u) alias, some_table As st');
expect($builder->sql())->toBe('SELECT * FROM (SELECT * FROM users AS u) AS alias, some_table AS st');
});
});
Loading