@@ -85,6 +85,77 @@ def test_deleted_again(self, settings):
8585 assert hasattr (settings , 'SECRET_KEY' )
8686 assert hasattr (real_settings , 'SECRET_KEY' )
8787
88+ def test_signals (self , settings ):
89+ result = []
90+
91+ def assert_signal (signal , sender , setting , value , enter ):
92+ result .append ((setting , value , enter ))
93+
94+ from django .test .signals import setting_changed
95+ setting_changed .connect (assert_signal )
96+
97+ result = []
98+ settings .SECRET_KEY = 'change 1'
99+ settings .SECRET_KEY = 'change 2'
100+ assert result == [
101+ ('SECRET_KEY' , 'change 1' , True ),
102+ ('SECRET_KEY' , 'change 2' , True ),
103+ ]
104+
105+ result = []
106+ settings .FOOBAR = 'abc123'
107+ assert sorted (result ) == [
108+ ('FOOBAR' , 'abc123' , True ),
109+ ]
110+
111+ def test_modification_signal (self , django_testdir ):
112+ django_testdir .create_test_module ("""
113+ import pytest
114+
115+ from django.conf import settings
116+ from django.test.signals import setting_changed
117+
118+
119+ @pytest.fixture(autouse=True, scope='session')
120+ def settings_change_printer():
121+ def receiver(sender, **kwargs):
122+ fmt_dict = {'actual_value': getattr(settings, kwargs['setting'],
123+ '<<does not exist>>')}
124+ fmt_dict.update(kwargs)
125+
126+ print('Setting changed: '
127+ 'enter=%(enter)s,setting=%(setting)s,'
128+ 'value=%(value)s,actual_value=%(actual_value)s'
129+ % fmt_dict)
130+
131+ setting_changed.connect(receiver, weak=False)
132+
133+
134+ def test_set(settings):
135+ settings.SECRET_KEY = 'change 1'
136+ settings.SECRET_KEY = 'change 2'
137+
138+
139+ def test_set_non_existent(settings):
140+ settings.FOOBAR = 'abc123'
141+ """ )
142+
143+ result = django_testdir .runpytest_subprocess ('--tb=short' , '-v' , '-s' )
144+
145+ # test_set
146+ result .stdout .fnmatch_lines ([
147+ '*Setting changed: enter=True,setting=SECRET_KEY,value=change 1*' ,
148+ '*Setting changed: enter=True,setting=SECRET_KEY,value=change 2*' ,
149+ '*Setting changed: enter=False,setting=SECRET_KEY,value=change 1*' ,
150+ '*Setting changed: enter=False,setting=SECRET_KEY,value=foobar*' ,
151+ ])
152+
153+ result .stdout .fnmatch_lines ([
154+ '*Setting changed: enter=True,setting=FOOBAR,value=abc123*' ,
155+ ('*Setting changed: enter=False,setting=FOOBAR,value=None,'
156+ 'actual_value=<<does not exist>>*' ),
157+ ])
158+
88159
89160class TestLiveServer :
90161 def test_url (self , live_server ):
0 commit comments