Padají testy pro postgresql

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
h4kuna
Backer | 740
+
0
-

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)

CZechBoY
Člen | 3608
+
+1
-

Hází to číselný hodnoty až za písmenný. Tzn. nějakej špatnej charset?

Jinak ty testy mi připadaj hodně MySQL-only tak bych se asi moc nezatěžoval failama na PostgreSQL, potažmo ostatníma db.

Editoval CZechBoY (9. 1. 2017 10:55)

h4kuna
Backer | 740
+
0
-

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
+
0
-

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
+
0
-

Ano returning je určitě bezpečný. Neumím odpovědět jestli půjde nějak lehce nette/database přepsat na to aby dělal returning.

CZechBoY
Člen | 3608
+
0
-

Jak si přepsal ty create table? Dal si místo auto_incrementu serial?

h4kuna
Backer | 740
+
0
-

Nic jsem nepřepisoval. Změnil jsem zatím jenom ten collate.

h4kuna
Backer | 740
+
+1
-

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

PR

Konzistence založení databáze, navrhnul jsem přidat do travis.yml

Editoval h4kuna (17. 1. 2017 9:55)

h4kuna
Backer | 740
+
0
-

@CZechBoY v testu je chování bez auto incrementu (typ serial) na tom to padalo, pak už to funguje jak má.

CZechBoY
Člen | 3608
+
0
-

Takže je potřeba změny ta struktura? By asi chtělo mít ty struktury v testech pro každou db zvlášť.

h4kuna
Backer | 740
+
0
-

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)