#34111: Use sqlparse to format SQL in tests failures with debug flag
-------------------------------------+-------------------------------------
               Reporter:  Paolo      |          Owner:  nobody
  Melchiorre                         |
                   Type:  New        |         Status:  new
  feature                            |
              Component:  Testing    |        Version:  4.1
  framework                          |       Keywords:  sqlparse, sql,
               Severity:  Normal     |  format, test
           Triage Stage:             |      Has patch:  0
  Unreviewed                         |
    Needs documentation:  0          |    Needs tests:  0
Patch needs improvement:  0          |  Easy pickings:  0
                  UI/UX:  0          |
-------------------------------------+-------------------------------------
 Running test with `--debug` flag that generate errors print unformatted
 SQL code that need to be formatted to read it properly and figuring out
 what's not working.

 sqlparse is already a dependency so can be very useful to format that SQL
 code in the traceback with it.

 Example of test failure that generate unformatted SQL code:


 {{{
 $ ./runtests.py --settings=postgres --timing --parallel=1
 aggregation.tests.AggregateTestCase.test_aggregation_exists_multivalued_outeref
 --debug-sql
 Testing against Django installed in '/home/paulox/Projects/django/django'
 Found 1 test(s).
 Creating test database for alias 'default'...
 System check identified no issues (0 silenced).
 E
 ======================================================================
 ERROR: test_aggregation_exists_multivalued_outeref
 (aggregation.tests.AggregateTestCase)
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "/home/paulox/Projects/django/django/db/backends/utils.py", line
 89, in _execute
     return self.cursor.execute(sql, params)
   File "/home/paulox/.virtualenvs/django/lib/python3.10/site-
 packages/psycopg/cursor.py", line 725, in execute
     raise ex.with_traceback(None)
 psycopg.errors.GroupingError: subquery uses ungrouped column
 "aggregation_book.publisher_id" from outer query
 LINE 1: ... "aggregation_book" U0 WHERE U0."publisher_id" = ("aggregati...
                                                              ^

 The above exception was the direct cause of the following exception:

 Traceback (most recent call last):
   File "/home/paulox/Projects/django/tests/aggregation/tests.py", line
 1667, in test_aggregation_exists_multivalued_outeref
     self.assertCountEqual(
   File "/usr/lib/python3.10/unittest/case.py", line 1188, in
 assertCountEqual
     first_seq, second_seq = list(first), list(second)
   File "/home/paulox/Projects/django/django/db/models/query.py", line 394,
 in __iter__
     self._fetch_all()
   File "/home/paulox/Projects/django/django/db/models/query.py", line
 1876, in _fetch_all
     self._result_cache = list(self._iterable_class(self))
   File "/home/paulox/Projects/django/django/db/models/query.py", line 87,
 in __iter__
     results = compiler.execute_sql(
   File "/home/paulox/Projects/django/django/db/models/sql/compiler.py",
 line 1518, in execute_sql
     cursor.execute(sql, params)
   File "/home/paulox/Projects/django/django/db/backends/utils.py", line
 103, in execute
     return super().execute(sql, params)
   File "/home/paulox/Projects/django/django/db/backends/utils.py", line
 67, in execute
     return self._execute_with_wrappers(
   File "/home/paulox/Projects/django/django/db/backends/utils.py", line
 80, in _execute_with_wrappers
     return executor(sql, params, many, context)
   File "/home/paulox/Projects/django/django/db/backends/utils.py", line
 84, in _execute
     with self.db.wrap_database_errors:
   File "/home/paulox/Projects/django/django/db/utils.py", line 91, in
 __exit__
     raise dj_exc_value.with_traceback(traceback) from exc_value
   File "/home/paulox/Projects/django/django/db/backends/utils.py", line
 89, in _execute
     return self.cursor.execute(sql, params)
   File "/home/paulox/.virtualenvs/django/lib/python3.10/site-
 packages/psycopg/cursor.py", line 725, in execute
     raise ex.with_traceback(None)
 django.db.utils.ProgrammingError: subquery uses ungrouped column
 "aggregation_book.publisher_id" from outer query
 LINE 1: ... "aggregation_book" U0 WHERE U0."publisher_id" = ("aggregati...
                                                              ^

 ----------------------------------------------------------------------
 (0.000) SELECT "aggregation_publisher"."id",
 "aggregation_publisher"."name", "aggregation_publisher"."num_awards",
 "aggregation_publisher"."duration", EXISTS(SELECT 1 AS "a" FROM
 "aggregation_book" U0 WHERE U0."publisher_id" =
 ("aggregation_book"."publisher_id") LIMIT 1) AS "books_exists",
 COUNT("aggregation_book"."id") AS "books_count" FROM
 "aggregation_publisher" LEFT OUTER JOIN "aggregation_book" ON
 ("aggregation_publisher"."id" = "aggregation_book"."publisher_id") GROUP
 BY "aggregation_publisher"."id", EXISTS(SELECT 1 AS "a" FROM
 "aggregation_book" U0 WHERE U0."publisher_id" =
 ("aggregation_book"."publisher_id") LIMIT 1); args=(1, 1); alias=default

 ----------------------------------------------------------------------
 Ran 1 test in 0.040s

 FAILED (errors=1)
 Destroying test database for alias 'default'...
 Total database setup took 1.077s
   Creating 'default' took 1.077s
 Total database teardown took 0.073s
 Total run took 1.303s
 }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/34111>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/01070183f740feef-f66eb16c-c117-45e3-8784-5bced02f479c-000000%40eu-central-1.amazonses.com.

Reply via email to