1
1
Fork 0
mirror of https://code.mensbeam.com/MensBeam/Arsse.git synced 2024-12-23 05:44:53 +00:00

Fix most test failures

MySQL is still being stubborn. It may be a type-conversion issue.
This commit is contained in:
J. King 2022-06-04 20:16:22 -04:00
parent 51ce4ae92b
commit 2822864a85
3 changed files with 27 additions and 4 deletions

View file

@ -165,7 +165,7 @@ class Driver extends \JKingWeb\Arsse\Db\AbstractDriver {
$drv->report_mode = \MYSQLI_REPORT_OFF; $drv->report_mode = \MYSQLI_REPORT_OFF;
$this->db = mysqli_init(); $this->db = mysqli_init();
$this->db->options(\MYSQLI_SET_CHARSET_NAME, "utf8mb4"); $this->db->options(\MYSQLI_SET_CHARSET_NAME, "utf8mb4");
$this->db->options(\MYSQLI_OPT_INT_AND_FLOAT_NATIVE, false); $this->db->options(\MYSQLI_OPT_INT_AND_FLOAT_NATIVE, true);
$this->db->options(\MYSQLI_OPT_CONNECT_TIMEOUT, ceil(Arsse::$conf->dbTimeoutConnect)); $this->db->options(\MYSQLI_OPT_CONNECT_TIMEOUT, ceil(Arsse::$conf->dbTimeoutConnect));
@$this->db->real_connect($host, $user, $password, $db, $port, $socket); @$this->db->real_connect($host, $user, $password, $db, $port, $socket);
if ($this->db->connect_errno) { if ($this->db->connect_errno) {

View file

@ -415,9 +415,11 @@ abstract class AbstractTest extends \PHPUnit\Framework\TestCase {
foreach ($info['rows'] as $r) { foreach ($info['rows'] as $r) {
$row = []; $row = [];
foreach ($r as $c => $v) { foreach ($r as $c => $v) {
// store any date values for later comparison
if ($types[$c] === "datetime") { if ($types[$c] === "datetime") {
$dates[] = $v; $dates[] = $v;
} }
// serialize to CSV, null being represented by no value
if ($v === null) { if ($v === null) {
$row[] = ""; $row[] = "";
} elseif (static::$stringOutput || is_string($v)) { } elseif (static::$stringOutput || is_string($v)) {
@ -435,9 +437,11 @@ abstract class AbstractTest extends \PHPUnit\Framework\TestCase {
$data = $drv->prepare("SELECT $cols from $table")->run()->getAll(); $data = $drv->prepare("SELECT $cols from $table")->run()->getAll();
$types = $info['columns']; $types = $info['columns'];
$act = []; $act = [];
$extra = [];
foreach ($data as $r) { foreach ($data as $r) {
$row = []; $row = [];
foreach ($r as $c => $v) { foreach ($r as $c => $v) {
// account for dates which might be off by one second
if ($types[$c] === "datetime") { if ($types[$c] === "datetime") {
if (array_search($v, $dates, true) === false) { if (array_search($v, $dates, true) === false) {
$v = Date::transform(Date::sub("PT1S", $v), "sql"); $v = Date::transform(Date::sub("PT1S", $v), "sql");
@ -457,8 +461,27 @@ abstract class AbstractTest extends \PHPUnit\Framework\TestCase {
$row[] = (string) $v; $row[] = (string) $v;
} }
} }
$act[] = implode(",", $row); $row = implode(",", $row);
// now search for the actual output row in the expected output
$found = array_keys($exp, $row, true);
foreach ($found as $k) {
if(!isset($act[$k])) {
$act[$k] = $row;
// skip to the next row
continue 2;
} }
}
// if the row was not found, add it to a buffer which will be added to the actual output once all found rows are processed
$extra[] = $row;
}
// add any unfound rows to the end of the actual array
$base = sizeof($exp) + 1;
foreach ($extra as $k => $v) {
$act[$base + $k] = $v;
}
// sort the actual output by keys
ksort($act);
// finally perform the comparison to be shown to the tester
$this->assertSame($exp, $act, "Actual table $table does not match expectations"); $this->assertSame($exp, $act, "Actual table $table does not match expectations");
} }
} }

View file

@ -16,7 +16,7 @@ trait MySQL {
protected static $dbResultClass = \JKingWeb\Arsse\Db\MySQL\Result::class; protected static $dbResultClass = \JKingWeb\Arsse\Db\MySQL\Result::class;
protected static $dbStatementClass = \JKingWeb\Arsse\Db\MySQL\Statement::class; protected static $dbStatementClass = \JKingWeb\Arsse\Db\MySQL\Statement::class;
protected static $dbDriverClass = \JKingWeb\Arsse\Db\MySQL\Driver::class; protected static $dbDriverClass = \JKingWeb\Arsse\Db\MySQL\Driver::class;
protected static $stringOutput = true; protected static $stringOutput = false;
public static function dbInterface() { public static function dbInterface() {
if (!class_exists("mysqli")) { if (!class_exists("mysqli")) {
@ -25,7 +25,7 @@ trait MySQL {
$drv = new \mysqli_driver; $drv = new \mysqli_driver;
$drv->report_mode = \MYSQLI_REPORT_OFF; $drv->report_mode = \MYSQLI_REPORT_OFF;
$d = mysqli_init(); $d = mysqli_init();
$d->options(\MYSQLI_OPT_INT_AND_FLOAT_NATIVE, false); $d->options(\MYSQLI_OPT_INT_AND_FLOAT_NATIVE, true);
$d->options(\MYSQLI_SET_CHARSET_NAME, "utf8mb4"); $d->options(\MYSQLI_SET_CHARSET_NAME, "utf8mb4");
@$d->real_connect(Arsse::$conf->dbMySQLHost, Arsse::$conf->dbMySQLUser, Arsse::$conf->dbMySQLPass, Arsse::$conf->dbMySQLDb, Arsse::$conf->dbMySQLPort); @$d->real_connect(Arsse::$conf->dbMySQLHost, Arsse::$conf->dbMySQLUser, Arsse::$conf->dbMySQLPass, Arsse::$conf->dbMySQLDb, Arsse::$conf->dbMySQLPort);
if ($d->connect_errno) { if ($d->connect_errno) {