Probably this would help: https://stackoverflow.com/questions/8609192/what-is-the-difference-between-null-true-and-blank-true-in-django
On Wed, May 10, 2023 at 5:45 PM 'Bob Aalsma' via Django users < [email protected]> wrote: > Sorry Vishesh, thanks for the quick answer but I have no idea what you > mean. > > On Wednesday, May 10, 2023 at 2:00:51 PM UTC+2 Vishesh Mangla wrote: > >> False or True check for yourself. >> >> On Wed, 10 May, 2023, 17:29 Vishesh Mangla, <[email protected]> wrote: >> >>> It looks like you are passing a null but null=False is not set >>> >>> On Wed, 10 May, 2023, 17:27 'Bob Aalsma' via Django users, < >>> [email protected]> wrote: >>> >>>> 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 [email protected]. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/django-users/1d0ce155-35e7-4049-88d4-80124c83dedcn%40googlegroups.com >>>> <https://groups.google.com/d/msgid/django-users/1d0ce155-35e7-4049-88d4-80124c83dedcn%40googlegroups.com?utm_medium=email&utm_source=footer> >>>> . >>>> >>> -- > 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 [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/django-users/723ee45e-6b7f-4434-b2d8-64ecb3170ff2n%40googlegroups.com > <https://groups.google.com/d/msgid/django-users/723ee45e-6b7f-4434-b2d8-64ecb3170ff2n%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- 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 [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CACaE8x7VR4Q1wB2mvvmA7-R3Vcgor%2Bnmk3i3AtdipTmoKkKmmg%40mail.gmail.com.

