Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion src/Query/Table/AlterTableQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,21 @@
namespace Gt\SqlBuilder\Query\Table;

use Gt\SqlBuilder\Query\SqlQuery;
use Gt\SqlBuilder\SqlBuilderException;

abstract class AlterTableQuery extends SqlQuery {
public function __toString():string {
$alterOptions = $this->alterOptions();
if(empty($alterOptions)) {
throw new SqlBuilderException(
"AlterTableQuery requires at least one alter option"
);
}

return $this->processClauseList([
self::PRE_QUERY_COMMENT => $this->preQuery(),
"alter table" => $this->alterTable(),
"alter options" => $this->alterOptions(),
"alter options" => $alterOptions,
self::POST_QUERY_COMMENT => $this->postQuery(),
]);
}
Expand Down
10 changes: 9 additions & 1 deletion src/Query/Table/CreateTableQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,21 @@
namespace Gt\SqlBuilder\Query\Table;

use Gt\SqlBuilder\Query\SqlQuery;
use Gt\SqlBuilder\SqlBuilderException;

abstract class CreateTableQuery extends SqlQuery {
public function __toString():string {
$createDefinition = $this->createDefinition();
if(empty($createDefinition)) {
throw new SqlBuilderException(
"CreateTableQuery requires at least one create definition"
);
}

return $this->processClauseList([
self::PRE_QUERY_COMMENT => $this->preQuery(),
"create table" => $this->createTable(),
"create definition" => $this->createDefinition(),
"create definition" => $createDefinition,
self::POST_QUERY_COMMENT => $this->postQuery(),
]);
}
Expand Down
55 changes: 54 additions & 1 deletion test/phpunit/Query/Table/AlterTableQueryTest.php
Original file line number Diff line number Diff line change
@@ -1,13 +1,66 @@
<?php
namespace Gt\SqlBuilder\Test\Query\Table;

use Gt\SqlBuilder\Query\SqlQuery;
use Gt\SqlBuilder\SqlBuilderException;
use Gt\SqlBuilder\Test\Helper\Query\Table\AlterTableExample;
use Gt\SqlBuilder\Test\QueryTestCase;

class AlterTableQueryTest extends QueryTestCase {
public function testAlterTableSimple() {
public function testAlterTableSimple():void {
$sut = new AlterTableExample();
$sql = self::normalise($sut);
self::assertSame("alter table student add column telephone int after dob, add column email varchar(256) after id", $sql);
}

public function testAlterTableWithoutOptionsThrowsException():void {
$sut = new class extends AlterTableExample {
public function alterOptions():array {
return [];
}
};

self::expectException(SqlBuilderException::class);
self::expectExceptionMessage(
"AlterTableQuery requires at least one alter option"
);
$sut->__toString();
}

public function testAlterTableWithPreAndPostQueryComments():void {
$sut = new class extends AlterTableExample {
public function preQuery():string {
return "/* before */";
}

public function postQuery():string {
return "/* after */";
}
};

self::assertSame(
"/* preQuery */ /* before */ alter table student add column telephone int after dob, add column email varchar(256) after id/* postQuery */ /* after */",
self::normalise($sut)
);
}

public function testAlterTableAllowsSqlQueryOptions():void {
$sut = new class extends AlterTableExample {
public function alterOptions():array {
return [
"add column telephone int after dob",
new class extends SqlQuery {
public function __toString():string {
return "drop column email";
}
},
];
}
};

self::assertSame(
"alter table student add column telephone int after dob, drop column email",
self::normalise($sut)
);
}
}
55 changes: 54 additions & 1 deletion test/phpunit/Query/Table/CreateTableQueryTest.php
Original file line number Diff line number Diff line change
@@ -1,13 +1,66 @@
<?php
namespace Gt\SqlBuilder\Test\Query\Table;

use Gt\SqlBuilder\Query\SqlQuery;
use Gt\SqlBuilder\SqlBuilderException;
use Gt\SqlBuilder\Test\Helper\Query\Table\CreateTableExample;
use Gt\SqlBuilder\Test\QueryTestCase;

class CreateTableQueryTest extends QueryTestCase {
public function testCreateTableSimple() {
public function testCreateTableSimple():void {
$sut = new CreateTableExample();
$sql = self::normalise($sut);
self::assertSame("create table student (id varchar(32) not null, first_name varchar(32), last_name varchar(32), dob date, primary key(id))", $sql);
}

public function testCreateTableWithoutDefinitionThrowsException():void {
$sut = new class extends CreateTableExample {
public function createDefinition():array {
return [];
}
};

self::expectException(SqlBuilderException::class);
self::expectExceptionMessage(
"CreateTableQuery requires at least one create definition"
);
$sut->__toString();
}

public function testCreateTableWithPreAndPostQueryComments():void {
$sut = new class extends CreateTableExample {
public function preQuery():string {
return "/* before */";
}

public function postQuery():string {
return "/* after */";
}
};

self::assertSame(
"/* preQuery */ /* before */ create table student (id varchar(32) not null, first_name varchar(32), last_name varchar(32), dob date, primary key(id))/* postQuery */ /* after */",
self::normalise($sut)
);
}

public function testCreateTableAllowsSqlQueryDefinitions():void {
$sut = new class extends CreateTableExample {
public function createDefinition():array {
return [
"id int not null",
new class extends SqlQuery {
public function __toString():string {
return "primary key(id)";
}
},
];
}
};

self::assertSame(
"create table student (id int not null, primary key(id))",
self::normalise($sut)
);
}
}
49 changes: 48 additions & 1 deletion test/phpunit/Query/Table/DropTableQueryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,56 @@
use Gt\SqlBuilder\Test\QueryTestCase;

class DropTableQueryTest extends QueryTestCase {
public function testDropTableSimple() {
public function testDropTableSimple():void {
$sut = new DropTableExample();
$sql = self::normalise($sut);
self::assertSame("drop table student", $sql);
}

public function testDropTableAllowsIfExistsClause():void {
$sut = new class extends DropTableExample {
public function dropTable():string {
return "if exists student";
}
};

self::assertSame(
"drop table if exists student",
self::normalise($sut)
);
}

public function testDropTableWithPreAndPostQueryComments():void {
$sut = new class extends DropTableExample {
public function preQuery():string {
return "/* before */";
}

public function postQuery():string {
return "/* after */";
}
};

self::assertSame(
"/* preQuery */ /* before */ drop table student /* postQuery */ /* after */",
self::normalise($sut)
);
}

public function testDropTableWithoutTableNameOmitsClauseAndOnlyRendersComments():void {
$sut = new class extends DropTableExample {
public function dropTable():string {
return "";
}

public function preQuery():string {
return "/* before */";
}
};

self::assertSame(
"/* preQuery */ /* before */",
self::normalise($sut)
);
}
}
Loading