~ltrager/maas/lp1554636_2.0

« back to all changes in this revision

Viewing changes to src/maasserver/tests/test_messages.py

[r=allenap][bug=][author=rvb] Rabbit messaging.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright 2012 Canonical Ltd.  This software is licensed under the
 
2
# GNU Affero General Public License version 3 (see the file LICENSE).
 
3
 
 
4
"""Test maasserver messages."""
 
5
 
 
6
from __future__ import (
 
7
    print_function,
 
8
    unicode_literals,
 
9
    )
 
10
 
 
11
__metaclass__ = type
 
12
__all__ = []
 
13
 
 
14
import json
 
15
 
 
16
from maasserver.messages import (
 
17
    MaaSMessenger,
 
18
    MESSENGER_EVENT,
 
19
    MessengerBase,
 
20
    )
 
21
from maasserver.models import Node
 
22
from maasserver.testing.factory import factory
 
23
from maasserver.testing.testcase import TestModelTestCase
 
24
from maasserver.tests.models import MessagesTestModel
 
25
 
 
26
 
 
27
class FakeProducer:
 
28
    """A fake RabbitProducer that simply records published messages."""
 
29
 
 
30
    def __init__(self):
 
31
        self.messages = []
 
32
 
 
33
    def publish(self, message):
 
34
        self.messages.append(message)
 
35
 
 
36
 
 
37
class TestMessenger(MessengerBase):
 
38
 
 
39
    def create_msg(self, event_name, instance):
 
40
        return [event_name, instance]
 
41
 
 
42
 
 
43
class MessengerBaseTest(TestModelTestCase):
 
44
 
 
45
    app = 'maasserver.tests'
 
46
 
 
47
    def test_update_obj_publishes_message_if_created(self):
 
48
        producer = FakeProducer()
 
49
        messenger = TestMessenger(MessagesTestModel, producer)
 
50
        instance = factory.getRandomString()
 
51
        messenger.update_obj(MessagesTestModel, instance, True)
 
52
        self.assertEqual(
 
53
            [[MESSENGER_EVENT.CREATED, instance]], producer.messages)
 
54
 
 
55
    def test_update_obj_publishes_message_if_not_created(self):
 
56
        producer = FakeProducer()
 
57
        messenger = TestMessenger(MessagesTestModel, producer)
 
58
        instance = factory.getRandomString()
 
59
        messenger.update_obj(MessagesTestModel, instance, False)
 
60
        self.assertEqual(
 
61
            [[MESSENGER_EVENT.UPDATED, instance]], producer.messages)
 
62
 
 
63
    def test_delete_obj_publishes_message(self):
 
64
        producer = FakeProducer()
 
65
        messenger = TestMessenger(MessagesTestModel, producer)
 
66
        instance = factory.getRandomString()
 
67
        messenger.delete_obj(MessagesTestModel, instance)
 
68
        self.assertEqual(
 
69
            [[MESSENGER_EVENT.DELETED, instance]], producer.messages)
 
70
 
 
71
    def test_register_registers_update_signal(self):
 
72
        producer = FakeProducer()
 
73
        messenger = TestMessenger(MessagesTestModel, producer)
 
74
        obj = MessagesTestModel(name=factory.getRandomString())
 
75
        obj.save()
 
76
        messenger.register()
 
77
        obj.save()
 
78
        self.assertEqual(
 
79
            [[MESSENGER_EVENT.UPDATED, obj]], producer.messages)
 
80
 
 
81
    def test_register_registers_created_signal(self):
 
82
        producer = FakeProducer()
 
83
        messenger = TestMessenger(MessagesTestModel, producer)
 
84
        messenger.register()
 
85
        obj = MessagesTestModel(name=factory.getRandomString())
 
86
        obj.save()
 
87
        self.assertEqual(
 
88
            [[MESSENGER_EVENT.CREATED, obj]], producer.messages)
 
89
 
 
90
    def test_register_registers_delete_signal(self):
 
91
        obj = MessagesTestModel(name=factory.getRandomString())
 
92
        obj.save()
 
93
        producer = FakeProducer()
 
94
        messenger = TestMessenger(MessagesTestModel, producer)
 
95
        messenger.register()
 
96
        obj.delete()
 
97
        self.assertEqual(
 
98
            [[MESSENGER_EVENT.DELETED, obj]], producer.messages)
 
99
 
 
100
 
 
101
class MaaSMessengerTest(TestModelTestCase):
 
102
 
 
103
    app = 'maasserver.tests'
 
104
 
 
105
    def test_event_key(self):
 
106
        producer = FakeProducer()
 
107
        event_name = factory.getRandomString()
 
108
        obj = MessagesTestModel(name=factory.getRandomString())
 
109
        messenger = MaaSMessenger(MessagesTestModel, producer)
 
110
        self.assertEqual(
 
111
            '%s.%s' % ('MessagesTestModel', event_name),
 
112
            messenger.event_key(event_name, obj))
 
113
 
 
114
    def test_create_msg(self):
 
115
        producer = FakeProducer()
 
116
        messenger = MaaSMessenger(Node, producer)
 
117
        event_name = factory.getRandomString()
 
118
        obj_name = factory.getRandomString()
 
119
        obj = MessagesTestModel(name=obj_name)
 
120
        obj.save()
 
121
        msg = messenger.create_msg(event_name, obj)
 
122
        decoded_msg = json.loads(msg)
 
123
        self.assertItemsEqual(['instance', 'event_key'], list(decoded_msg))
 
124
        self.assertItemsEqual(
 
125
            ['id', 'name'], list(decoded_msg['instance']))
 
126
        self.assertEqual(
 
127
            obj_name, decoded_msg['instance']['name'])