Padají testy pro postgresql
- h4kuna
- Backer | 740
Ahoj,
prosím vás můžete mi někdo poradit proč mi padají testy pro nette/database ? Respektive
výsledky se zdají být dobré jen špatně seřazené v poli. Všechno to
jsou testy pro postgresql. Předpokládám že to bude nějakou konfigurací
postgresql, ale fakt nemám tušení.
OS: Ubuntu 14.04
postgresql: 9.4.10
php 5.6.29
Ukázka výstupu testů
_____ ___ ___ _____ ___ ___
|_ _/ __)( __/_ _/ __)| _ )
|_| \___ /___) |_| \___ |_|_\ v2.0.x
Note: Default interpreter is CLI since Tester v2.0. It used to be CGI.
PHP 5.6.29-1+deb.sury.org~trusty+1 (cli) | php -n -c /usr/share/nginx/html/nette-database/tests/php-unix.ini | 8 threads
ssss.........................................................F..............F................F...................................................F................................F......................................sF.F.............
-- FAILED: Nette\Database\Table: Fetch assoc. | Database/Table/Selection.fetchAssoc().phpt [dataprovider=postgresql|/usr/s...]
Failed: [4 => 'Dibi', 2 => 'JUSH', 3 => 'Nette', 1 => '1001 tipu a triku pro PHP'] should be
... [1 => '1001 tipu a triku pro PHP', 4 => 'Dibi', 2 => 'JUSH', 3 => 'Nette']
diff '/usr/share/nginx/html/nette-database/tests/Database/Table/output/Selection.fetchAssoc().[dataprovider=postgre].expected' '/usr/share/nginx/html/nette-database/tests/Database/Table/output/Selection.fetchAssoc().[dataprovider=postgre].actual'
in Database/Table/Selection.fetchAssoc().phpt(23) Tester\Assert::same()
in nette-database/tests/bootstrap.php(35) {closure}()
in Database/Table/Selection.fetchAssoc().phpt(24) test()
-- FAILED: Nette\Database\Table: Fetch pairs. | Database/Table/Selection.fetchPairs().phpt [dataprovider=postgresql|/usr/s...]
Failed: [4 => 'Dibi', 2 => 'JUSH', 3 => 'Nette', 1 => '1001 tipu a triku pro PHP'] should be
... [1 => '1001 tipu a triku pro PHP', 4 => 'Dibi', 2 => 'JUSH', 3 => 'Nette']
diff '/usr/share/nginx/html/nette-database/tests/Database/Table/output/Selection.fetchPairs().[dataprovider=postgre].expected' '/usr/share/nginx/html/nette-database/tests/Database/Table/output/Selection.fetchPairs().[dataprovider=postgre].actual'
in Database/Table/Selection.fetchPairs().phpt(22) Tester\Assert::same()
in nette-database/tests/bootstrap.php(35) {closure}()
in Database/Table/Selection.fetchPairs().phpt(23) test()
FAILURES! (234 tests, 7 failures, 5 skipped, 9.0 seconds)
Editoval h4kuna (9. 1. 2017 8:32)
- h4kuna
- Backer | 740
Jop měl jsi pravdu, je potřeba založit databázi
CREATE DATABASE nette_test WITH ENCODING 'UTF8' LC_COLLATE='POSIX' TEMPLATE=template0;
Nicméně mi padá ještě jeden test. Zatím jsem nehledal proč.
-- FAILED: Nette\Database\Connection::getInsertId() | tests/Database/Connection.getInsertId().postgre.phpt [dataprovider=postgresql|/usr/s...]
Failed: '0' should be equal to FALSE
Editoval h4kuna (9. 1. 2017 14:19)
- CZechBoY
- Člen | 3608
Ten insert id v postgresu je nějakej divnej :-)
Postgres nepoužívám, ale co jsem se dočetl tak PDO::lastInsertId() vrací
úplně jiný čísol než autoincrement na mysql, navíc musíš mít asi
sekvenci atd.
Nešlo by upravit knihovnu, aby dávala na konec insertu
RETURNING id
?
viz možnost 3 u prvního komentu http://stackoverflow.com/…-inserted-id
- h4kuna
- Backer | 740
Tak jsem dohledal mě to s php PHP_VERSION_ID = 50629 vrací ‚0‘ a porovnává na FALSE.
Dohledal jsem v changelogu php 5.6.26 změnu stejné jako pro php 7.0.11
Konzistence založení databáze, navrhnul jsem přidat do travis.yml
Editoval h4kuna (17. 1. 2017 9:55)
- h4kuna
- Backer | 740
Ona se struktura pro tento test tvoří v testu (TEMPORARY TABLE). Asi si úplně nerozumíme. Za mě to funguje přes ten getLastInsertId(). Je to závislý na PDO, ale jak tam to mají řešený nevím. Nicméně RETURNING je určitě spolehlivý dělal jsem s ním, když jsem používal dibi. Zatím není potřeba měnit. Respektive mě by se líbilo, kdyby NDT nějak returning podporoval. Protože jde využít pro update, delete.
Mažeš záznam
mysql
- SELECT aby jsi vybral data a použil z nich třeba jméno toho co bylo smazáno
- DELETE
postgresql jeden dotaz
- DELETE RETURNING
Ale velký úspory to nejsou takže to ani moc netrápí. Třeba když máš triggery tak pomocí returningu si můžeš vytáhnout hodnotu změněnou triggerem v mysql musíš udělat dotaz.
Editoval h4kuna (17. 1. 2017 10:56)