Wednesday, May 10, 2023

Re: testing newbie - help requested: app works, tests give errors

Hmm, when I remove the raise CommandError statement and replace it with self.stdout.write, everything works well.

This helps me to point further studies. Thx!
On Wednesday, May 10, 2023 at 2:33:18 PM UTC+2 Bob Aalsma wrote:
Ah, yes, thanks.

I hesitate to comment on "If I understood the error right." ;)

Umm, my problem here is that I think I'm using the exact same code "manually" without errors. 
I think I'm also using the same values for the manual and test runs.
So I don't understand the reason for the differences in output.

On Wednesday, May 10, 2023 at 2:18:33 PM UTC+2 Vishesh Mangla wrote:
If I understood the error right.

On Wed, May 10, 2023 at 5:47 PM Vishesh Mangla <manglav...@gmail.com> wrote:

On Wed, May 10, 2023 at 5:45 PM 'Bob Aalsma' via Django users <django...@googlegroups.com> 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, <manglav...@gmail.com> 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, <django...@googlegroups.com> 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 django-users...@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.

--
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...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/723ee45e-6b7f-4434-b2d8-64ecb3170ff2n%40googlegroups.com.

--
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+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/a48c02d7-68be-46b1-8651-a68d7e6add64n%40googlegroups.com.

No comments:

Post a Comment