Skip to content

Commit

Permalink
Re-raise ModuleNotFoundError unless for guessed task (#8660)
Browse files Browse the repository at this point in the history
* Modifies integration test to catch actual bad imports.

* Only return none when guessed task-module missing.

* Cleans up test.

* Adds assertion text.
  • Loading branch information
johnjameswhitman committed Nov 22, 2023
1 parent 3ba50e4 commit 9bcc6a9
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 4 deletions.
2 changes: 1 addition & 1 deletion celery/loaders/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ def find_related_module(package, related_name):
except ModuleNotFoundError as e:
import_exc_name = getattr(e, 'name', None)
# If candidate does not exist, then return None.
if import_exc_name and module_name.startswith(import_exc_name):
if import_exc_name and module_name == import_exc_name:
return

# Otherwise, raise because error probably originated from a nested import.
Expand Down
22 changes: 19 additions & 3 deletions t/integration/test_loader.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import pytest

from celery import shared_task


Expand All @@ -7,10 +9,10 @@ def dummy_task(x, y):


class test_loader:
def test_autodiscovery(self, manager):
def test_autodiscovery__when_packages_exist(self, manager):
# Arrange
expected_package_name, _, module_name = __name__.rpartition('.')
unexpected_package_name = 'nonexistent.package.name'
unexpected_package_name = 'datetime.datetime'

# Act
manager.app.autodiscover_tasks([expected_package_name, unexpected_package_name], module_name, force=True)
Expand All @@ -19,4 +21,18 @@ def test_autodiscovery(self, manager):
assert f'{expected_package_name}.{module_name}.dummy_task' in manager.app.tasks
assert not any(
task.startswith(unexpected_package_name) for task in manager.app.tasks
)
), 'Expected datetime.datetime to neither have test_loader module nor define a Celery task.'

def test_autodiscovery__when_packages_do_not_exist(self, manager):
# Arrange
existent_package_name, _, module_name = __name__.rpartition('.')
nonexistent_package_name = 'nonexistent.package.name'

# Act
with pytest.raises(ModuleNotFoundError) as exc:
manager.app.autodiscover_tasks(
[existent_package_name, nonexistent_package_name], module_name, force=True
)

# Assert
assert nonexistent_package_name.startswith(exc.value.name), 'Expected to fail on importing "nonexistent"'

0 comments on commit 9bcc6a9

Please sign in to comment.