I'm trying to test a django-admin command and don't understand why the tests give errors on the code while the code works as expected.
I'm under the impression that the *raise CommandError* is ignored by the test, but don't understand why this would be. Please help. Running the code shows: (.venv) werker@Werkers-Mac-mini domain_reader % python3 manage.py populate_source 0 *CommandError: Alleen hele getallen > 0 toegestaan* (.venv) werker@Werkers-Mac-mini domain_reader % python3 manage.py populate_source 1 *Teksten zijn gegenereerd voor tekstlengte 1* (.venv) werker@Werkers-Mac-mini domain_reader % python3 manage.py populate_source 1 *CommandError: Teksten voor nummer 1 zijn al eerder gegenereerd* (.venv) werker@Werkers-Mac-mini domain_reader % python3 manage.py populate_source 7 *CommandError: Opgegeven sleutel 7 niet gevonden* Running the tests shows (.venv) werker@Werkers-Mac-mini domain_reader % python3 manage.py test tests.test_sources_app_command_populate Found 3 test(s). Creating test database for alias 'default'... System check identified no issues (0 silenced). EEE ====================================================================== ERROR: test_command_output_been_there (tests.test_sources_app_command_populate.PopulateSourceTests.test_command_output_been_there) Test for failure: in_use = True. ---------------------------------------------------------------------- Traceback (most recent call last): File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/utils.py", line 89, in _execute return self.cursor.execute(sql, params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/sqlite3/base.py", line 328, in execute return super().execute(query, params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ sqlite3.IntegrityError: NOT NULL constraint failed: domain_sources_app_characternumber.number_of_combinations The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/Users/werker/Projects/domain_reader/tests/test_sources_app_command_populate.py", line 30, in test_command_output_been_there thingy.save() File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/base.py", line 814, in save self.save_base( File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/base.py", line 877, in save_base updated = self._save_table( ^^^^^^^^^^^^^^^^^ File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/base.py", line 1020, in _save_table results = self._do_insert( ^^^^^^^^^^^^^^^^ File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/base.py", line 1061, in _do_insert return manager._insert( ^^^^^^^^^^^^^^^^ File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/manager.py", line 87, in manager_method return getattr(self.get_queryset(), name)(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/query.py", line 1805, in _insert return query.get_compiler(using=using).execute_sql(returning_fields) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/sql/compiler.py", line 1820, in execute_sql cursor.execute(sql, params) File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/utils.py", line 67, in execute return self._execute_with_wrappers( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/utils.py", line 80, in _execute_with_wrappers return executor(sql, params, many, context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/utils.py", line 84, in _execute with self.db.wrap_database_errors: File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/utils.py", line 91, in __exit__ raise dj_exc_value.with_traceback(traceback) from exc_value File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/utils.py", line 89, in _execute return self.cursor.execute(sql, params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/sqlite3/base.py", line 328, in execute return super().execute(query, params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ django.db.utils.IntegrityError: NOT NULL constraint failed: domain_sources_app_characternumber.number_of_combinations ====================================================================== ERROR: test_command_output_small (tests.test_sources_app_command_populate.PopulateSourceTests.test_command_output_small) Test for failure with value '0'. ---------------------------------------------------------------------- Traceback (most recent call last): File "/Users/werker/Projects/domain_reader/tests/test_sources_app_command_populate.py", line 20, in test_command_output_small call_command("populate_source", 0, stdout=out) File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/core/management/__init__.py", line 194, in call_command return command.execute(*args, **defaults) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/core/management/base.py", line 458, in execute output = self.handle(*args, **options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/werker/Projects/domain_reader/domain_sources_app/management/commands/populate_source.py", line 36, in handle raise CommandError('Alleen hele getallen > 0 toegestaan') django.core.management.base.CommandError: Alleen hele getallen > 0 toegestaan ====================================================================== ERROR: test_command_output_success (tests.test_sources_app_command_populate.PopulateSourceTests.test_command_output_success) Test for success: in_use = False. ---------------------------------------------------------------------- Traceback (most recent call last): File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/utils.py", line 89, in _execute return self.cursor.execute(sql, params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/sqlite3/base.py", line 328, in execute return super().execute(query, params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ sqlite3.IntegrityError: NOT NULL constraint failed: domain_sources_app_characternumber.number_of_combinations The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/Users/werker/Projects/domain_reader/tests/test_sources_app_command_populate.py", line 48, in test_command_output_success thingy.save() File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/base.py", line 814, in save self.save_base( File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/base.py", line 877, in save_base updated = self._save_table( ^^^^^^^^^^^^^^^^^ File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/base.py", line 1020, in _save_table results = self._do_insert( ^^^^^^^^^^^^^^^^ File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/base.py", line 1061, in _do_insert return manager._insert( ^^^^^^^^^^^^^^^^ File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/manager.py", line 87, in manager_method return getattr(self.get_queryset(), name)(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/query.py", line 1805, in _insert return query.get_compiler(using=using).execute_sql(returning_fields) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/sql/compiler.py", line 1820, in execute_sql cursor.execute(sql, params) File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/utils.py", line 67, in execute return self._execute_with_wrappers( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/utils.py", line 80, in _execute_with_wrappers return executor(sql, params, many, context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/utils.py", line 84, in _execute with self.db.wrap_database_errors: File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/utils.py", line 91, in __exit__ raise dj_exc_value.with_traceback(traceback) from exc_value File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/utils.py", line 89, in _execute return self.cursor.execute(sql, params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/sqlite3/base.py", line 328, in execute return super().execute(query, params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ django.db.utils.IntegrityError: NOT NULL constraint failed: domain_sources_app_characternumber.number_of_combinations ---------------------------------------------------------------------- Ran 3 tests in 0.008s FAILED (errors=3) Destroying test database for alias 'default'... Code for test: from io import StringIO from django.core.management import call_command from django.test import TestCase from domain_sources_app.models import CharacterNumber class PopulateSourceTests(TestCase): """Testcases for Django-admin command populate_source.""" def test_command_output_small(self): """Test for failure with value '0'.""" out = StringIO() call_command("populate_source", 0, stdout=out) self.assertIn("Alleen hele getallen > 0 toegestaan", out.getvalue()) def test_command_output_been_there(self): """Test for failure: in_use = True.""" thingy = CharacterNumber( number_of_characters=1, in_use=True, ) thingy.save() out = StringIO() call_command( "populate_source", 1, stdout=out, ) self.assertIn("Teksten voor nummer 1 zijn al \ eerder gegenereerd", out.getvalue()) def test_command_output_success(self): """Test for success: in_use = False.""" thingy = CharacterNumber( number_of_characters=1, in_use=False, ) thingy.save() out = StringIO() call_command( "populate_source", 1, stdout=out, ) self.assertIn("Teksten gegenereerd voor nummer 1", out.getvalue()) Code for the command: from django.core.management.base import BaseCommand from django.core.management.base import CommandError from domain_sources_app.models import CharacterNumber from domain_sources_app.generate_domain_strings import generate_domain_strings class Command(BaseCommand): """Populate Result with inital strings of a certain length. Args: BaseCommand (_type_): _description_ Raises: CommandError: _description_ """ help = "Genereert de te onderzoeken combinaties bij de opgegeven lengte" def add_arguments(self, parser): parser.add_argument("character_number_ids", nargs="+", type=int) def handle(self, *args, **options): for character_number_id in options["character_number_ids"]: if character_number_id < 1: raise CommandError('Alleen hele getallen > 0 toegestaan') else: try: thingy = CharacterNumber.objects.get( pk=character_number_id ) except CharacterNumber.DoesNotExist: raise CommandError( f'Opgegeven sleutel {character_number_id} \ niet gevonden') if not thingy.in_use: # generate for this number: generate_domain_strings(character_number_id) # register use of CharacterNumber thingy.in_use = True thingy.save() self.stdout.write( self.style.SUCCESS( f'Teksten zijn gegenereerd voor \ tekstlengte {character_number_id}' ) ) else: raise CommandError( f'Teksten voor nummer {character_number_id} zijn al \ eerder gegenereerd' ) Thanks, Bob -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/1d0ce155-35e7-4049-88d4-80124c83dedcn%40googlegroups.com.