Skip to content
Draft
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
19 changes: 1 addition & 18 deletions packages/wp-mysql-proxy/src/Adapter/class-sqlite-adapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,24 +9,7 @@
use WP_SQLite_Driver;
use WP_MySQL_Proxy\MySQL_Protocol;

define( 'SQLITE_DRIVER_PATH', __DIR__ . '/../../../..' );

require_once SQLITE_DRIVER_PATH . '/version.php';
require_once SQLITE_DRIVER_PATH . '/wp-includes/parser/class-wp-parser-grammar.php';
require_once SQLITE_DRIVER_PATH . '/wp-includes/parser/class-wp-parser.php';
require_once SQLITE_DRIVER_PATH . '/wp-includes/parser/class-wp-parser-node.php';
require_once SQLITE_DRIVER_PATH . '/wp-includes/parser/class-wp-parser-token.php';
require_once SQLITE_DRIVER_PATH . '/wp-includes/mysql/class-wp-mysql-token.php';
require_once SQLITE_DRIVER_PATH . '/wp-includes/mysql/class-wp-mysql-lexer.php';
require_once SQLITE_DRIVER_PATH . '/wp-includes/mysql/class-wp-mysql-parser.php';
require_once SQLITE_DRIVER_PATH . '/wp-includes/sqlite/class-wp-sqlite-pdo-user-defined-functions.php';
require_once SQLITE_DRIVER_PATH . '/wp-includes/sqlite-ast/class-wp-sqlite-connection.php';
require_once SQLITE_DRIVER_PATH . '/wp-includes/sqlite-ast/class-wp-sqlite-configurator.php';
require_once SQLITE_DRIVER_PATH . '/wp-includes/sqlite-ast/class-wp-sqlite-driver.php';
require_once SQLITE_DRIVER_PATH . '/wp-includes/sqlite-ast/class-wp-sqlite-driver-exception.php';
require_once SQLITE_DRIVER_PATH . '/wp-includes/sqlite-ast/class-wp-sqlite-information-schema-builder.php';
require_once SQLITE_DRIVER_PATH . '/wp-includes/sqlite-ast/class-wp-sqlite-information-schema-exception.php';
require_once SQLITE_DRIVER_PATH . '/wp-includes/sqlite-ast/class-wp-sqlite-information-schema-reconstructor.php';
require_once __DIR__ . '/../../../../wp-pdo-mysql-on-sqlite.php';

class SQLite_Adapter implements Adapter {
/** @var WP_SQLite_Driver */
Expand Down
63 changes: 63 additions & 0 deletions tests/WP_MySQL_On_SQLite_PDO_API_Tests.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<?php

use PHPUnit\Framework\TestCase;

class WP_PDO_MySQL_On_SQLite_PDO_API_Tests extends TestCase {
/** @var WP_PDO_MySQL_On_SQLite */
private $driver;

public function setUp(): void {
$this->driver = new WP_PDO_MySQL_On_SQLite( 'mysql-on-sqlite:path=:memory:;dbname=WordPress;' );
}

public function test_connection(): void {
$driver = new WP_PDO_MySQL_On_SQLite( 'mysql-on-sqlite:path=:memory:;dbname=WordPress;' );
$this->assertInstanceOf( PDO::class, $driver );
}

public function test_query(): void {
$result = $this->driver->query( 'SELECT 1' );
$this->assertInstanceOf( PDOStatement::class, $result );
$this->assertEquals( 1, $result->fetchColumn() );
}

public function test_begin_transaction(): void {
$result = $this->driver->beginTransaction();
$this->assertTrue( $result );
}

public function test_begin_transaction_already_active(): void {
$this->driver->beginTransaction();

$this->expectException( PDOException::class );
$this->expectExceptionMessage( 'There is already an active transaction' );
$this->expectExceptionCode( 0 );
$this->driver->beginTransaction();
}

public function test_commit(): void {
$this->driver->beginTransaction();
$result = $this->driver->commit();
$this->assertTrue( $result );
}

public function test_commit_no_active_transaction(): void {
$this->expectException( PDOException::class );
$this->expectExceptionMessage( 'There is no active transaction' );
$this->expectExceptionCode( 0 );
$this->driver->commit();
}

public function test_rollback(): void {
$this->driver->beginTransaction();
$result = $this->driver->rollBack();
$this->assertTrue( $result );
}

public function test_rollback_no_active_transaction(): void {
$this->expectException( PDOException::class );
$this->expectExceptionMessage( 'There is no active transaction' );
$this->expectExceptionCode( 0 );
$this->driver->rollBack();
}
}
100 changes: 7 additions & 93 deletions tests/WP_SQLite_Driver_Tests.php
Original file line number Diff line number Diff line change
Expand Up @@ -2490,89 +2490,6 @@ public function testStartTransactionCommand() {
$this->assertCount( 0, $this->engine->get_query_results() );
}

public function testNestedTransactionWork() {
$this->assertQuery( 'BEGIN' );
$this->assertQuery( "INSERT INTO _options (option_name) VALUES ('first');" );
$this->assertQuery( 'START TRANSACTION' );
$this->assertQuery( "INSERT INTO _options (option_name) VALUES ('second');" );
$this->assertQuery( 'START TRANSACTION' );
$this->assertQuery( "INSERT INTO _options (option_name) VALUES ('third');" );
$this->assertQuery( 'SELECT * FROM _options;' );
$this->assertCount( 3, $this->engine->get_query_results() );

$this->assertQuery( 'ROLLBACK' );
$this->assertQuery( 'SELECT * FROM _options;' );
$this->assertCount( 2, $this->engine->get_query_results() );

$this->assertQuery( 'ROLLBACK' );
$this->assertQuery( 'SELECT * FROM _options;' );
$this->assertCount( 1, $this->engine->get_query_results() );

$this->assertQuery( 'COMMIT' );
$this->assertQuery( 'SELECT * FROM _options;' );
$this->assertCount( 1, $this->engine->get_query_results() );
}

public function testNestedTransactionWorkComplexModify() {
$this->assertQuery( 'BEGIN' );
// Create a complex ALTER Table query where the first
// column is added successfully, but the second fails.
// Behind the scenes, this single MySQL query is split
// into multiple SQLite queries – some of them will
// succeed, some will fail.
$error = '';
try {
$this->engine->query(
'
ALTER TABLE _options
ADD COLUMN test varchar(20),
ADD COLUMN test varchar(20)
'
);
} catch ( Throwable $e ) {
$error = $e->getMessage();
}
$this->assertStringContainsString( "Duplicate column name 'test'", $error );

// Commit the transaction.
$this->assertQuery( 'COMMIT' );

// Confirm the entire query failed atomically and no column was
// added to the table.
$this->assertQuery( 'DESCRIBE _options;' );
$fields = $this->engine->get_query_results();

$this->assertEquals(
array(
(object) array(
'Field' => 'ID',
'Type' => 'int',
'Null' => 'NO',
'Key' => 'PRI',
'Default' => null,
'Extra' => 'auto_increment',
),
(object) array(
'Field' => 'option_name',
'Type' => 'text',
'Null' => 'NO',
'Key' => '',
'Default' => '',
'Extra' => '',
),
(object) array(
'Field' => 'option_value',
'Type' => 'text',
'Null' => 'NO',
'Key' => '',
'Default' => '',
'Extra' => '',
),
),
$fields
);
}

public function testCount() {
$this->assertQuery( "INSERT INTO _options (option_name) VALUES ('first');" );
$this->assertQuery( "INSERT INTO _options (option_name) VALUES ('second');" );
Expand Down Expand Up @@ -3301,18 +3218,18 @@ public function testCreateTemporaryTableIfNotExists(): void {
}

public function testTranslatesComplexDelete() {
$this->sqlite->query(
$this->assertQuery(
"CREATE TABLE wptests_dummy (
ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
ID INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
user_login TEXT NOT NULL default '',
option_name TEXT NOT NULL default '',
option_value TEXT NOT NULL default ''
);"
);
$this->sqlite->query(
$this->assertQuery(
"INSERT INTO wptests_dummy (user_login, option_name, option_value) VALUES ('admin', '_transient_timeout_test', '1675963960');"
);
$this->sqlite->query(
$this->assertQuery(
"INSERT INTO wptests_dummy (user_login, option_name, option_value) VALUES ('admin', '_transient_test', '1675963960');"
);

Expand All @@ -3322,10 +3239,7 @@ public function testTranslatesComplexDelete() {
AND a.option_name NOT LIKE '\_transient\_timeout_%'
AND b.option_name = CONCAT( '_transient_timeout_', SUBSTRING( a.option_name, 12 ) );"
);
$this->assertEquals(
2,
$result
);
$this->assertEquals( 2, $result );
}

public function testTranslatesDoubleAlterTable() {
Expand Down Expand Up @@ -3404,11 +3318,11 @@ public function testTranslatesUtf8Insert() {

public function testTranslatesRandom() {
$this->assertIsNumeric(
$this->sqlite->query( 'SELECT RAND() AS rand' )->fetchColumn()
$this->assertQuery( 'SELECT RAND() AS rand' )[0]->rand
);

$this->assertIsNumeric(
$this->sqlite->query( 'SELECT RAND(5) AS rand' )->fetchColumn()
$this->assertQuery( 'SELECT RAND(5) AS rand' )[0]->rand
);
}

Expand Down
2 changes: 1 addition & 1 deletion tests/WP_SQLite_Information_Schema_Reconstructor_Tests.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public function setUp(): void {
);

$builder = new WP_SQLite_Information_Schema_Builder(
WP_SQLite_Driver::RESERVED_PREFIX,
WP_PDO_MySQL_On_SQLite::RESERVED_PREFIX,
$this->engine->get_connection()
);

Expand Down
16 changes: 1 addition & 15 deletions tests/bootstrap.php
Original file line number Diff line number Diff line change
@@ -1,26 +1,12 @@
<?php

require_once __DIR__ . '/wp-sqlite-schema.php';
require_once __DIR__ . '/../version.php';
require_once __DIR__ . '/../wp-includes/parser/class-wp-parser-grammar.php';
require_once __DIR__ . '/../wp-includes/parser/class-wp-parser.php';
require_once __DIR__ . '/../wp-includes/parser/class-wp-parser-node.php';
require_once __DIR__ . '/../wp-includes/parser/class-wp-parser-token.php';
require_once __DIR__ . '/../wp-includes/mysql/class-wp-mysql-token.php';
require_once __DIR__ . '/../wp-includes/mysql/class-wp-mysql-lexer.php';
require_once __DIR__ . '/../wp-includes/mysql/class-wp-mysql-parser.php';
require_once __DIR__ . '/../wp-pdo-mysql-on-sqlite.php';
require_once __DIR__ . '/../wp-includes/sqlite/class-wp-sqlite-query-rewriter.php';
require_once __DIR__ . '/../wp-includes/sqlite/class-wp-sqlite-lexer.php';
require_once __DIR__ . '/../wp-includes/sqlite/class-wp-sqlite-token.php';
require_once __DIR__ . '/../wp-includes/sqlite/class-wp-sqlite-pdo-user-defined-functions.php';
require_once __DIR__ . '/../wp-includes/sqlite/class-wp-sqlite-translator.php';
require_once __DIR__ . '/../wp-includes/sqlite-ast/class-wp-sqlite-connection.php';
require_once __DIR__ . '/../wp-includes/sqlite-ast/class-wp-sqlite-configurator.php';
require_once __DIR__ . '/../wp-includes/sqlite-ast/class-wp-sqlite-driver.php';
require_once __DIR__ . '/../wp-includes/sqlite-ast/class-wp-sqlite-driver-exception.php';
require_once __DIR__ . '/../wp-includes/sqlite-ast/class-wp-sqlite-information-schema-builder.php';
require_once __DIR__ . '/../wp-includes/sqlite-ast/class-wp-sqlite-information-schema-exception.php';
require_once __DIR__ . '/../wp-includes/sqlite-ast/class-wp-sqlite-information-schema-reconstructor.php';

// Configure the test environment.
error_reporting( E_ALL );
Expand Down
16 changes: 1 addition & 15 deletions tests/tools/dump-sqlite-query.php
Original file line number Diff line number Diff line change
@@ -1,20 +1,6 @@
<?php

require_once __DIR__ . '/../../wp-includes/parser/class-wp-parser.php';
require_once __DIR__ . '/../../wp-includes/parser/class-wp-parser-grammar.php';
require_once __DIR__ . '/../../wp-includes/parser/class-wp-parser-node.php';
require_once __DIR__ . '/../../wp-includes/parser/class-wp-parser-token.php';
require_once __DIR__ . '/../../wp-includes/mysql/class-wp-mysql-lexer.php';
require_once __DIR__ . '/../../wp-includes/mysql/class-wp-mysql-token.php';
require_once __DIR__ . '/../../wp-includes/mysql/class-wp-mysql-parser.php';
require_once __DIR__ . '/../../wp-includes/sqlite/class-wp-sqlite-pdo-user-defined-functions.php';
require_once __DIR__ . '/../../wp-includes/sqlite-ast/class-wp-sqlite-connection.php';
require_once __DIR__ . '/../../wp-includes/sqlite-ast/class-wp-sqlite-configurator.php';
require_once __DIR__ . '/../../wp-includes/sqlite-ast/class-wp-sqlite-driver.php';
require_once __DIR__ . '/../../wp-includes/sqlite-ast/class-wp-sqlite-driver-exception.php';
require_once __DIR__ . '/../../wp-includes/sqlite-ast/class-wp-sqlite-information-schema-builder.php';
require_once __DIR__ . '/../../wp-includes/sqlite-ast/class-wp-sqlite-information-schema-exception.php';
require_once __DIR__ . '/../../wp-includes/sqlite-ast/class-wp-sqlite-information-schema-reconstructor.php';
require_once __DIR__ . '/../../wp-pdo-mysql-on-sqlite.php';

$driver = new WP_SQLite_Driver(
new WP_SQLite_Connection( array( 'path' => ':memory:' ) ),
Expand Down
Loading
Loading