def test_relation_ids(self, relation_ids): relation_ids.return_value = ['rel:1', 'rel:2'] c1 = relations.Conversation('rel:0', [], 'scope') self.assertEqual(c1.relation_ids, ['rel:0']) assert not relation_ids.called c2 = relations.Conversation('rel', [], relations.scopes.GLOBAL) self.assertEqual(c2.relation_ids, ['rel:1', 'rel:2']) relation_ids.assert_called_once_with('rel')
def test_init(self, hookenv): hookenv.relation_type.return_value = 'relation_type' hookenv.remote_unit.return_value = 'remote_unit' c1 = relations.Conversation() self.assertEqual(c1.relation_name, 'relation_type') self.assertEqual(c1.units, set(['remote_unit'])) self.assertEqual(c1.scope, 'remote_unit') c2 = relations.Conversation('rel', ['unit'], 'scope') self.assertEqual(c2.relation_name, 'rel') self.assertEqual(c2.units, set(['unit'])) self.assertEqual(c2.scope, 'scope')
def test_get_remote(self, related_units, relation_get): conv = relations.Conversation('rel', ['srv1/0', 'srv2/0', 'srv2/1'], 'scope') # set on at least one remote related_units.side_effect = [['srv1/0', 'srv1/1'], ['srv2/1']] relation_get.side_effect = [None, 'value'] self.assertEqual(conv.get_remote('key', 'default'), 'value') self.assertEqual( related_units.call_args_list, [mock.call('rel:1'), mock.call('rel:2')]) self.assertEqual(relation_get.call_args_list, [ mock.call('key', 'srv1/0', 'rel:1'), mock.call('key', 'srv2/1', 'rel:2'), ]) # not set on any remote related_units.side_effect = [[], ['srv2/0']] relation_get.side_effect = [None] self.assertEqual(conv.get_remote('key', 'default'), 'default') # no matching units related_units.side_effect = [['srv1/1'], []] relation_get.side_effect = AssertionError( 'relation_get should not be called') self.assertEqual(conv.get_remote('key', 'default'), 'default')
def test_set_remote(self, relation_set): conv = relations.Conversation('rel', ['service/0', 'service/1'], 'scope') conv.set_remote('foo', 'bar') self.assertEqual(relation_set.call_args_list, [ mock.call('rel:1', {'foo': 'bar'}), mock.call('rel:2', {'foo': 'bar'}), ]) relation_set.reset_mock() conv.set_remote(data={'foo': 'bar'}) self.assertEqual(relation_set.call_args_list, [ mock.call('rel:1', {'foo': 'bar'}), mock.call('rel:2', {'foo': 'bar'}), ]) relation_set.reset_mock() conv.set_remote(foo='bar') self.assertEqual(relation_set.call_args_list, [ mock.call('rel:1', {'foo': 'bar'}), mock.call('rel:2', {'foo': 'bar'}), ]) relation_set.reset_mock() conv.set_remote('foo', 'bof', {'foo': 'bar'}, foo='qux') self.assertEqual(relation_set.call_args_list, [ mock.call('rel:1', {'foo': 'qux'}), mock.call('rel:2', {'foo': 'qux'}), ]) relation_set.reset_mock() conv.set_remote() assert not relation_set.called
def test_remove_state(self, get_state, set_state, remove_state): conv = relations.Conversation('rel', ['service/0', 'service/1'], 'scope') get_state.side_effect = [ None, { 'conversations': ['foo', 'reactive.conversations.rel.scope'] }, { 'conversations': ['reactive.conversations.rel.scope'] }, ] conv.remove_state('{relation_name}.bar') get_state.assert_called_once_with('rel.bar') assert not set_state.called assert not remove_state.called conv.remove_state('{relation_name}.bar') set_state.assert_called_once_with('rel.bar', {'conversations': ['foo']}) assert not remove_state.called set_state.reset_mock() conv.remove_state('{relation_name}.bar') assert not set_state.called remove_state.assert_called_once_with('rel.bar')
def test_relation_ids(self, relation_ids, remote_service_name): relation_ids.return_value = ['rel:1', 'rel:2', 'rel:3'] remote_service_name.side_effect = ['foo', 'bar', 'foo'] c1 = relations.Conversation('rel', ['foo/1', 'qux/1', 'foo/2'], 'scope') self.assertEqual(c1.relation_ids, ['rel:1', 'rel:3']) self.assertEqual(remote_service_name.call_args_list, [ mock.call('rel:1'), mock.call('rel:2'), mock.call('rel:3'), ]) relation_ids.assert_called_once_with('rel') # test cache remote_service_name.reset_mock() remote_service_name.side_effect = ['foo', 'bar', 'foo'] relation_ids.return_value = ['rel:4', 'rel:5', 'rel:6'] self.assertEqual(c1.relation_ids, ['rel:1', 'rel:3']) assert not remote_service_name.called hookenv.cache.clear() self.assertEqual(c1.relation_ids, ['rel:4', 'rel:6']) self.assertEqual(remote_service_name.call_args_list, [ mock.call('rel:4'), mock.call('rel:5'), mock.call('rel:6'), ])
def test_set_state(self, get_flag_value, set_flag): conv = relations.Conversation('rel', ['service/0', 'service/1'], 'scope') get_flag_value.return_value = {'conversations': ['foo']} conv.set_state('{relation_name}.bar') set_flag.assert_called_once_with('rel.bar', {'conversations': ['foo', 'reactive.conversations.rel.scope']}) get_flag_value.assert_called_once_with('rel.bar', {'relation': 'rel', 'conversations': []}) conv.set_state('{relation_name}.bar') self.assertEqual(set_flag.call_count, 2) set_flag.assert_called_with('rel.bar', {'conversations': ['foo', 'reactive.conversations.rel.scope']})
def test_is_state(self, get_flag_value): conv = relations.Conversation('rel', ['service/0', 'service/1'], 'scope') get_flag_value.side_effect = [ None, {'conversations': ['foo']}, {'conversations': ['reactive.conversations.rel.scope']}, ] assert not conv.is_state('{relation_name}.bar') assert not conv.is_state('{relation_name}.bar') assert conv.is_state('{relation_name}.bar')
def test_get_remote_departed(self, related_units, relation_get): conv = relations.Conversation('rel', ['srv1/0', 'srv2/0'], 'scope') related_units.side_effect = [['srv1/0'], ['srv2/0']] relation_get.side_effect = [None, 'value'] self.assertEqual(conv.get_remote('key', 'default'), 'value') self.assertEqual( related_units.call_args_list, [mock.call('rel:1'), mock.call('rel:2')]) self.assertEqual(relation_get.call_args_list, [ mock.call('key', 'srv1/0', 'rel:1'), mock.call('key', 'srv2/0', 'rel:2') ])
def test_set_local(self, kv): conv = relations.Conversation('rel', ['srv1/0', 'srv2/0', 'srv2/1'], 'scope') conv.set_local('foo', 'bar') conv.set_local(data={'foo': 'bar'}) conv.set_local(foo='bar') conv.set_local('foo', 'bof', data={'foo': 'bar'}, foo='qux') self.assertEqual(kv().update.call_args_list, [ mock.call({'foo': 'bar'}, prefix='reactive.conversations.rel.scope.local-data.'), mock.call({'foo': 'bar'}, prefix='reactive.conversations.rel.scope.local-data.'), mock.call({'foo': 'bar'}, prefix='reactive.conversations.rel.scope.local-data.'), mock.call({'foo': 'qux'}, prefix='reactive.conversations.rel.scope.local-data.'), ]) kv().update.reset_mock() conv.set_local() assert not kv().update.called
def test_toggle_state(self): conv = relations.Conversation('rel', ['service/0', 'service/1'], 'scope') conv.is_state = mock.Mock(side_effect=[True, False]) conv.set_state = mock.Mock() conv.remove_state = mock.Mock() conv.toggle_state('foo') self.assertEqual(conv.remove_state.call_count, 1) conv.toggle_state('foo', None) self.assertEqual(conv.remove_state.call_count, 2) conv.toggle_state('foo') self.assertEqual(conv.set_state.call_count, 1) conv.toggle_state('foo', True) self.assertEqual(conv.set_state.call_count, 2) conv.toggle_state('foo', False) self.assertEqual(conv.remove_state.call_count, 3)
def test_depart(self, hookenv, unitdata): hookenv.remote_unit.return_value = 'service/0' conv = relations.Conversation('rel', ['service/0', 'service/1'], 'scope') conv.depart() self.assertEqual(conv.units, {'service/1'}, 'scope') unitdata.kv().set.assert_called_with(conv.key, { 'namespace': 'rel', 'units': ['service/1'], 'scope': 'scope', }) assert not unitdata.kv().unset.called unitdata.kv().set.reset_mock() hookenv.remote_unit.return_value = 'service/1' conv.depart() assert not unitdata.kv().set.called unitdata.kv().unset.assert_called_with(conv.key)
def test_get_local(self, kv): conv = relations.Conversation('rel', ['srv1/0', 'srv2/0', 'srv2/1'], 'scope') conv.get_local('foo', 'default') kv().get.assert_called_once_with( 'reactive.conversations.rel.scope.local-data.foo', 'default')
def test_key(self): c1 = relations.Conversation('rel', ['unit'], 'scope') self.assertEqual(c1.key, 'reactive.conversations.rel.scope')