diff --git a/operations/tests/test_worker.py b/operations/tests/test_worker.py index 44338a54..4c7ed476 100644 --- a/operations/tests/test_worker.py +++ b/operations/tests/test_worker.py @@ -13,6 +13,8 @@ from django.contrib.auth import get_user_model from django.db import OperationalError, connection from django.test import TransactionTestCase +from appsettings.models import AppSettings +from appsettings.settings import app_settings from operations import jobs from operations.models import Claim, Operation, WorkerLease from operations.tests import fakes @@ -63,6 +65,18 @@ class WorkerTestCase(TransactionTestCase): self.assertTrue(wait_for(lambda: state(op) == Operation.SUCCEEDED)) self.assertFalse(Claim.objects.exists()) + def test_a_job_sees_the_settings_page_values(self): + # the worker has no settings middleware: it loads the values itself + AppSettings.objects.create(name="t", key="TEST_WORKER_VALUE", value="42", choices="") + if hasattr(app_settings, "TEST_WORKER_VALUE"): + del app_settings.TEST_WORKER_VALUE + op = self.submit("test.noop", {}, "key-00000009") + with patch.object(fakes.NoopKind, "run", lambda kind, op, ctx: {"value": app_settings.TEST_WORKER_VALUE}): + self.start() + self.assertTrue(wait_for(lambda: state(op) in Operation.TERMINAL)) + op.refresh_from_db() + self.assertEqual((op.state, op.result), (Operation.SUCCEEDED, {"value": "42"}), op.error) + def test_an_error_before_effects_fails_the_job(self): op = self.submit("test.scripted", {"fail_before": True}, "key-00000001") self.start() diff --git a/operations/worker.py b/operations/worker.py index c0130984..49ce5429 100644 --- a/operations/worker.py +++ b/operations/worker.py @@ -21,6 +21,8 @@ from django.db import close_old_connections from django.utils import timezone from django.utils.translation import gettext_noop +from appsettings.settings import get_settings + from . import claims, jobs, utils from .models import Claim, LeaseLost, Operation, acquire, fenced, renew @@ -272,6 +274,7 @@ def execute(worker, op_id): op = Operation.objects.get(pk=op_id) kind = jobs.get_kind(op.kind) ctx = jobs.Context(op, worker) + get_settings() # the Settings page values; only requests load them otherwise (middleware) try: with claims.adopted(op): kind.precheck(op, ctx)