nur-sery/tests/db/sqlite/SqliteStorageTest.php

152 lines
4.5 KiB
PHP
Raw Normal View History

2024-05-18 13:09:01 +04:00
<?php
namespace nur\sery\db\sqlite;
2024-05-20 10:46:18 +04:00
use nulib\tests\TestCase;
2024-06-05 14:03:42 +04:00
use nur\sery\cl;
2024-05-20 10:46:18 +04:00
use nur\sery\db\Capacitor;
2024-05-20 09:24:47 +04:00
use nur\sery\db\CapacitorChannel;
2024-05-18 13:09:01 +04:00
class SqliteStorageTest extends TestCase {
function _testChargeStrings(SqliteStorage $storage, ?string $channel) {
$storage->reset($channel);
$storage->charge($channel, "first");
$storage->charge($channel, "second");
$storage->charge($channel, "third");
2024-06-05 14:03:42 +04:00
$items = cl::all($storage->discharge($channel, false));
2024-05-18 13:09:01 +04:00
self::assertSame(["first", "second", "third"], $items);
}
2024-05-20 10:46:18 +04:00
function _testChargeArrays(SqliteStorage $storage, ?string $channel) {
$storage->reset($channel);
$storage->charge($channel, ["id" => 10, "name" => "first"]);
$storage->charge($channel, ["name" => "second", "id" => 20]);
$storage->charge($channel, ["name" => "third", "id" => "30"]);
2024-05-18 13:09:01 +04:00
}
function testChargeStrings() {
$storage = new SqliteStorage(__DIR__.'/capacitor.db');
$this->_testChargeStrings($storage, null);
$storage->close();
2024-05-18 13:09:01 +04:00
}
function testChargeArrays() {
$storage = new SqliteStorage(__DIR__.'/capacitor.db');
$storage->addChannel(new class extends CapacitorChannel {
2024-05-20 09:24:47 +04:00
const NAME = "arrays";
2024-06-05 14:03:42 +04:00
const COLUMN_DEFINITIONS = ["id" => "integer"];
function getItemValues($item): ?array {
2024-05-20 09:24:47 +04:00
return ["id" => $item["id"] ?? null];
2024-05-18 13:09:01 +04:00
}
2024-05-20 09:24:47 +04:00
});
2024-05-18 13:09:01 +04:00
$this->_testChargeStrings($storage, "strings");
$this->_testChargeArrays($storage, "arrays");
$storage->close();
2024-05-18 13:09:01 +04:00
}
2024-05-19 11:19:00 +04:00
function testEach() {
$storage = new SqliteStorage(__DIR__.'/capacitor.db');
$capacitor = new Capacitor($storage, new class extends CapacitorChannel {
2024-05-20 09:24:47 +04:00
const NAME = "each";
2024-06-05 14:03:42 +04:00
const COLUMN_DEFINITIONS = [
"age" => "integer",
"done" => "integer default 0",
];
2024-05-20 10:46:18 +04:00
2024-06-05 14:03:42 +04:00
function getItemValues($item): ?array {
2024-05-19 11:19:00 +04:00
return [
"age" => $item["age"],
];
}
2024-05-20 09:24:47 +04:00
});
2024-05-19 11:19:00 +04:00
2024-05-20 10:46:18 +04:00
$capacitor->reset();
$capacitor->charge(["name" => "first", "age" => 5]);
$capacitor->charge(["name" => "second", "age" => 10]);
$capacitor->charge(["name" => "third", "age" => 15]);
$capacitor->charge(["name" => "fourth", "age" => 20]);
2024-05-19 11:19:00 +04:00
$setDone = function ($item, $row, $suffix=null) {
$updates = ["done" => 1];
if ($suffix !== null) {
$item["name"] .= $suffix;
2024-05-24 17:40:31 +04:00
$updates["item"] = $item;
2024-05-19 11:19:00 +04:00
}
return $updates;
};
2024-05-20 10:46:18 +04:00
$capacitor->each(["age" => [">", 10]], $setDone, ["++"]);
$capacitor->each(["done" => 0], $setDone, null);
2024-06-07 16:12:55 +04:00
Txx(cl::all($capacitor->discharge(false)));
2024-05-20 10:46:18 +04:00
$capacitor->close();
self::assertTrue(true);
}
function testPrimayKey() {
$storage = new SqliteStorage(__DIR__.'/capacitor.db');
$capacitor = new Capacitor($storage, new class extends CapacitorChannel {
2024-05-20 10:46:18 +04:00
const NAME = "pk";
2024-06-05 14:03:42 +04:00
const COLUMN_DEFINITIONS = [
"id_" => "varchar primary key",
"done" => "integer default 0",
];
2024-05-20 10:46:18 +04:00
2024-06-05 14:03:42 +04:00
function getItemValues($item): ?array {
2024-05-20 10:46:18 +04:00
return [
2024-05-24 17:40:31 +04:00
"id_" => $item["numero"],
2024-05-20 10:46:18 +04:00
];
}
});
$capacitor->charge(["numero" => "a", "name" => "first", "age" => 5]);
$capacitor->charge(["numero" => "b", "name" => "second", "age" => 10]);
$capacitor->charge(["numero" => "c", "name" => "third", "age" => 15]);
$capacitor->charge(["numero" => "d", "name" => "fourth", "age" => 20]);
sleep(2);
$capacitor->charge(["numero" => "b", "name" => "second", "age" => 100]);
$capacitor->charge(["numero" => "d", "name" => "fourth", "age" => 200]);
2024-05-19 11:19:00 +04:00
$capacitor->close();
self::assertTrue(true);
}
2024-06-07 16:12:55 +04:00
function testSum() {
$storage = new SqliteStorage(__DIR__.'/capacitor.db');
$capacitor = new Capacitor($storage, new class extends CapacitorChannel {
const NAME = "sum";
const COLUMN_DEFINITIONS = [
"a__" => "varchar",
"b__" => "varchar",
"b__sum_" => self::SUM_DEFINITION,
];
function getItemValues($item): ?array {
return [
"a" => $item["a"],
"b" => $item["b"],
];
}
});
$capacitor->reset();
$capacitor->charge(["a" => null, "b" => null]);
$capacitor->charge(["a" => "first", "b" => "second"]);
Txx("=== all");
/** @var Sqlite $sqlite */
$sqlite = $capacitor->getStorage()->db();
Txx(cl::all($sqlite->all([
"select",
"from" => $capacitor->getChannel()->getTableName(),
])));
Txx("=== each");
$capacitor->each(null, function ($item, $values) {
Txx($values);
});
$capacitor->close();
self::assertTrue(true);
}
2024-05-18 13:09:01 +04:00
}