def test__add_disconnects_signal_if_manager_is_disabled(self): manager = SignalsManager() manager.disable() signal = self.make_Signal() manager.add(signal) self.assertThat(signal.connect, MockNotCalled()) self.assertThat(signal.disconnect, MockCalledOnceWith())
def test__can_watch_any_signal(self): django_signal = pick_django_signal() manager = SignalsManager() manager.watch( django_signal, sentinel.callback, sender=sentinel.sender, weak=sentinel.weak, dispatch_uid=sentinel.dispatch_uid, ) self.assertThat(manager._signals, HasLength(1)) [signal] = manager._signals self.assertThat( signal.connect, MatchesPartialCall( django_signal.connect, sentinel.callback, sender=sentinel.sender, weak=sentinel.weak, dispatch_uid=sentinel.dispatch_uid, ), ) self.assertThat( signal.disconnect, MatchesPartialCall( django_signal.disconnect, sentinel.callback, sender=sentinel.sender, dispatch_uid=sentinel.dispatch_uid, ), )
def test__can_watch_fields(self): connect_to_field_change = self.patch_autospec( signals_module, "connect_to_field_change") connect_to_field_change.return_value = ( sentinel.connect, sentinel.disconnect, ) manager = SignalsManager() manager.watch_fields(sentinel.callback, sentinel.model, sentinel.fields, sentinel.delete) self.assertThat( manager._signals, Equals({Signal(sentinel.connect, sentinel.disconnect)}), ) self.assertThat( connect_to_field_change, MockCalledOnceWith( sentinel.callback, sentinel.model, sentinel.fields, sentinel.delete, ), )
def test__remove_removes_the_signal(self): manager = SignalsManager() signal = self.make_Signal() manager.add(signal) manager.remove(signal) self.assertThat(manager._signals, HasLength(0)) self.assertThat(signal.connect, MockNotCalled()) self.assertThat(signal.disconnect, MockNotCalled())
def test__add_adds_the_signal(self): manager = SignalsManager() signal = self.make_Signal() self.assertThat(manager.add(signal), Is(signal)) self.assertThat(manager._signals, Equals({signal})) # The manager is in its "new" state, neither enabled nor disabled, so # the signal is not asked to connect or disconnect yet. self.assertThat(signal.connect, MockNotCalled()) self.assertThat(signal.disconnect, MockNotCalled())
def test__disable_disables_all_signals(self): manager = SignalsManager() signals = [self.make_Signal(), self.make_Signal()] for signal in signals: manager.add(signal) manager.disable() self.assertThat( signals, AllMatch( MatchesAll( AfterPreprocessing((lambda signal: signal.connect), MockNotCalled()), AfterPreprocessing((lambda signal: signal.disconnect), MockCalledOnceWith()), )))
def test__can_watch_config(self): callback = lambda: None config_name = factory.make_name("config") manager = SignalsManager() manager.watch_config(callback, config_name) self.assertThat(manager._signals, HasLength(1)) [signal] = manager._signals self.assertThat( signal.connect, MatchesPartialCall(Config.objects.config_changed_connect, config_name, callback)) self.assertThat( signal.disconnect, MatchesPartialCall(Config.objects.config_changed_disconnect, config_name, callback))
# Copyright 2019 Canonical Ltd. This software is licensed under the # GNU Affero General Public License version 3 (see the file LICENSE). """Respond to Subnet CIDR changes.""" __all__ = ["signals"] from django.db.models.signals import post_save from maasserver.enum import IPADDRESS_TYPE from maasserver.models import StaticIPAddress, Subnet from maasserver.utils.signals import SignalsManager signals = SignalsManager() def update_referenced_ip_addresses(subnet): """Updates the `StaticIPAddress`'s to ensure that they are linked to the correct subnet.""" # Remove the IP addresses that no longer fall with in the CIDR. remove_ips = StaticIPAddress.objects.filter( alloc_type=IPADDRESS_TYPE.USER_RESERVED, subnet_id=subnet.id) remove_ips = remove_ips.extra(where=["NOT(ip << %s)"], params=[subnet.cidr]) remove_ips.update(subnet=None) # Add the IP addresses that now fall into CIDR. add_ips = StaticIPAddress.objects.filter(subnet__isnull=True) add_ips = add_ips.extra(where=["ip << %s"], params=[subnet.cidr]) add_ips.update(subnet_id=subnet.id)