Skip to content

Commit

Permalink
SC_Query setOrder() と setLimit() の有効範囲を揃える #1116
Browse files Browse the repository at this point in the history
- 共通部分 (SC_*) テスト追加
- 先日追加した SC_DB_DBFactory*Test はメンテが煩雑なので抽象化した。
  • Loading branch information
seasoftjapan committed Jan 10, 2025
1 parent 0ac03af commit 5c7b412
Show file tree
Hide file tree
Showing 5 changed files with 199 additions and 26 deletions.
124 changes: 123 additions & 1 deletion tests/class/SC_Query_Test.php
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ protected function dropTestTable()
return;
}

protected function setTestData($column1, $column2, $column3)
protected function setTestData($column1 = null, $column2 = null, $column3 = null)
{
$fields_values = [$column1, $column2, $column3];
$sql = 'INSERT INTO test_table (column1, column2, column3) VALUES (?, ?, ?)';
Expand All @@ -329,4 +329,126 @@ protected function setTestData($column1, $column2, $column3)

return $result;
}

/**
* SC_Query::setLimit() のテストケース.
*/
public function testSetLimit()
{
$this->createTestTable();
$this->setTestData(1);
$this->setTestData(2);
$this->setTestData(3);

$this->expected = [1, 2];
$this->actual = $this->objQuery
->setOrder('column1')
->setLimit(2)
->getCol('column1', 'test_table')
;
$this->verify();
}

/**
* SC_Query::setLimitOffset() のテストケース.
*/
public function testSetLimitOffset()
{
$this->createTestTable();
$this->setTestData(1);
$this->setTestData(2);
$this->setTestData(3);
$this->setTestData(4);

$this->expected = [2, 3];
$this->actual = $this->objQuery
->setOrder('column1')
->setLimitOffset(2, 1)
->getCol('column1', 'test_table')
;
$this->verify();
}

/**
* SC_Query::setLimit() SC_Query::setOffset() 併用のテストケース.
*/
public function testSetLimitAndSetOffset()
{
$this->createTestTable();
$this->setTestData(1);
$this->setTestData(2);
$this->setTestData(3);
$this->setTestData(4);

$this->expected = [2, 3];
$this->actual = $this->objQuery
->setOrder('column1')
->setLimit(2)
->setOffset(1)
->getCol('column1', 'test_table')
;
$this->verify();
}

/**
* SC_Query::setOffset() のテストケース.
*/
public function testSetOffset()
{
$this->createTestTable();
$this->setTestData(1);
$this->setTestData(2);
$this->setTestData(3);

$this->expected = [2, 3];
$this->actual = $this->objQuery
->setOrder('column1')
->setOffset(1)
->getCol('column1', 'test_table')
;
$this->verify();
}

/**
* SC_Query::getSql() 経由で SC_Query::resetAdditionalClauses() が呼ばれていることを確認する。
*/
public function testResetAdditionalClausesViaGetSql()
{
$this->objQuery
->setGroupBy('column1')
->setOrder('column1')
->setLimit(2)
->setOffset(1)
;

// 最初はプロパティを確認する。
// getSql() 実行前
$this->assertNotEmpty($this->objQuery->groupby);
$this->assertNotEmpty($this->objQuery->order);
$this->assertNotNull($this->objQuery->limit);
$this->assertNotNull($this->objQuery->offset);

$sql1 = $this->objQuery->getSql('*');

// getSql() 実行後
$this->assertEmpty($this->objQuery->groupby);
$this->assertEmpty($this->objQuery->order);
$this->assertNull($this->objQuery->limit);
$this->assertNull($this->objQuery->offset);

$sql2 = $this->objQuery->getSql('*');

// SQL を確認する。
// getSql() 実行前
$this->assertStringContainsString(' GROUP BY ', $sql1);
$this->assertStringContainsString(' ORDER BY ', $sql1);
$this->assertStringContainsString(' LIMIT ', $sql1);
$this->assertStringContainsString(' OFFSET ', $sql1);

// getSql() 実行後
$this->assertStringNotContainsString(' GROUP BY ', $sql2);
$this->assertStringNotContainsString(' ORDER BY ', $sql2);
$this->assertStringNotContainsString(' LIMIT ', $sql2);
$this->assertStringNotContainsString(' OFFSET ', $sql2);
}
}
22 changes: 9 additions & 13 deletions tests/class/db/SC_DB_DBFactoryTest.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
<?php

class SC_DB_DBFactoryTest extends Common_TestCase
/**
* SC_DB_DBFactoryTest のテストクラス
*
* このクラスでは生成パターン (Factory) に関するテストを行う。
* MDBS 機能面に対応したテストは、基本的なケース (即ち SC_DB_DBFactory に関するもの) を SC_DB_DBFactoryTestAbstract に記述し (継承によりこの Test クラスでも実行される)、MDBS 毎に差がある部分を SC_DB_DBFactory_*Test に記述する。
* @author Seasoft 塚田将久 (新規作成)
*/
class SC_DB_DBFactoryTest extends SC_DB_DBFactoryTestAbstract
{
/**
* @var SC_DB_DBFactory_PGSQL
Expand All @@ -24,7 +30,7 @@ class SC_DB_DBFactoryTest extends Common_TestCase

protected function setUp(): void
{
parent::setUp();
Common_TestCase::setUp();
$this->dbFactoryPgsql = SC_DB_DBFactory_Ex::getInstance('pgsql');
$this->dbFactoryMysql = SC_DB_DBFactory_Ex::getInstance('mysql');
$this->dbFactoryMysqli = SC_DB_DBFactory_Ex::getInstance('mysqli');
Expand Down Expand Up @@ -66,14 +72,4 @@ public function testGetInstanceUknown()
$this->assertNotInstanceOf('SC_DB_DBFactory_PGSQL', $this->dbFactory);
$this->assertNotInstanceOf('SC_DB_DBFactory_PGSQL_Ex', $this->dbFactory);
}

public function testGetTransactionIsolationLevel()
{
$this->assertEquals(SC_DB_DBFactory_Ex::ISOLATION_LEVEL_READ_COMMITTED, $this->dbFactory->getTransactionIsolationLevel());
}

public function testIsSkipDeleteIfNotExists()
{
$this->assertFalse($this->dbFactory->isSkipDeleteIfNotExists());
}
}
45 changes: 45 additions & 0 deletions tests/class/db/SC_DB_DBFactoryTestAbstract.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php

class SC_DB_DBFactoryTestAbstract extends Common_TestCase
{
/**
* @var SC_DB_DBFactory
*/
protected $dbFactory;

protected function setUp(): void
{
parent::setUp();
$this->dbFactory = SC_DB_DBFactory_Ex::getInstance();
}

public function testGetTransactionIsolationLevel()
{
$this->assertEquals(SC_DB_DBFactory_Ex::ISOLATION_LEVEL_READ_COMMITTED, $this->dbFactory->getTransactionIsolationLevel());
}

public function testIsSkipDeleteIfNotExists()
{
$this->assertFalse($this->dbFactory->isSkipDeleteIfNotExists());
}

public function testAddLimitOffset()
{
$sql_base = 'SELECT foo FROM bar ORDER BY boo';

$this->assertSame(
"{$sql_base} LIMIT 2",
$this->dbFactory->addLimitOffset($sql_base, 2)
);

$this->assertSame(
"{$sql_base} OFFSET 3",
$this->dbFactory->addLimitOffset($sql_base, null, 3)
);

$this->assertSame(
"{$sql_base} LIMIT 2 OFFSET 3",
$this->dbFactory->addLimitOffset($sql_base, 2, 3)
);
}
}
22 changes: 21 additions & 1 deletion tests/class/db/dbfactory/SC_DB_DBFactory_MYSQLTest.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php

class SC_DB_DBFactory_MYSQLTest extends Common_TestCase
class SC_DB_DBFactory_MYSQLTest extends SC_DB_DBFactoryTestAbstract
{
/**
* @var SC_DB_DBFactory_MYSQL
Expand All @@ -27,4 +27,24 @@ public function testIsSkipDeleteIfNotExists()
{
$this->assertTrue($this->dbFactory->isSkipDeleteIfNotExists());
}

public function testAddLimitOffset()
{
$sql_base = 'SELECT foo FROM bar ORDER BY boo';

$this->assertSame(
"{$sql_base} LIMIT 2",
$this->dbFactory->addLimitOffset($sql_base, 2)
);

$this->assertSame(
"{$sql_base} LIMIT 18446744073709551615 OFFSET 3",
$this->dbFactory->addLimitOffset($sql_base, null, 3)
);

$this->assertSame(
"{$sql_base} LIMIT 2 OFFSET 3",
$this->dbFactory->addLimitOffset($sql_base, 2, 3)
);
}
}
12 changes: 1 addition & 11 deletions tests/class/db/dbfactory/SC_DB_DBFactory_PGSQLTest.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php

class SC_DB_DBFactory_PGSQLTest extends Common_TestCase
class SC_DB_DBFactory_PGSQLTest extends SC_DB_DBFactoryTestAbstract
{
/**
* @var SC_DB_DBFactory_PGSQL
Expand All @@ -17,14 +17,4 @@ public function testGetInstance()
{
$this->assertInstanceOf('SC_DB_DBFactory_PGSQL_Ex', $this->dbFactory);
}

public function testGetTransactionIsolationLevel()
{
$this->assertEquals(SC_DB_DBFactory_Ex::ISOLATION_LEVEL_READ_COMMITTED, $this->dbFactory->getTransactionIsolationLevel());
}

public function testIsSkipDeleteIfNotExists()
{
$this->assertFalse($this->dbFactory->isSkipDeleteIfNotExists());
}
}

0 comments on commit 5c7b412

Please sign in to comment.