Esempio n. 1
0
    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')
Esempio n. 2
0
    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')
Esempio n. 3
0
    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')
Esempio n. 4
0
    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
Esempio n. 5
0
    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')
Esempio n. 6
0
    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'),
        ])
Esempio n. 7
0
 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']})
Esempio n. 8
0
    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')
Esempio n. 9
0
    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')
        ])
Esempio n. 10
0
 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
Esempio n. 11
0
    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)
Esempio n. 12
0
    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)
Esempio n. 13
0
 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')
Esempio n. 14
0
 def test_key(self):
     c1 = relations.Conversation('rel', ['unit'], 'scope')
     self.assertEqual(c1.key, 'reactive.conversations.rel.scope')