Add test covering sending data
[bzrirker.git] / tests / testirker.py
1 # -*- coding: utf-8 -*-
2 # vim:fileencoding=utf-8 ai ts=4 sts=4 et sw=4
3 # Copyright 2012 Neil Muller
4 # GPL 2+ - see COPYING for details
5 from unittest import TestLoader
6 from SocketServer import TCPServer, StreamRequestHandler
7 import threading
8
9 from bzrlib import config
10 from bzrlib.bzrdir import BzrDir
11 from bzrlib.tests import TestCaseInTempDir
12 from bzrlib.plugins.bzrirker.irkerhook import IrkerSender
13
14
15 def test_suite():
16     return TestLoader().loadTestsFromName(__name__)
17
18 sample_config = ("[DEFAULT]\n"
19         "irker_project=bzrirker\n"
20         "irker_server=localhost\n"
21         "irker_port=6677\n"
22         "irker_channels=irc://chat.example.test/commits\n")
23
24 no_project_config = ("[DEFAULT]\n"
25         "irker_channels=irc://chat.example.test/commits\n")
26
27 colour_config = ("[DEFAULT]\n"
28         "irker_project=bzrirker\n"
29         "irker_colours=mIRC\n"
30         "irker_channels=irc://chat.example.test/commits\n")
31
32
33 class MyHandler(StreamRequestHandler):
34
35     def handle(self):
36         data = self.rfile.read()
37         self.server.data = data
38
39
40 class TestConfigured(TestCaseInTempDir):
41
42     def test_no_colours(self):
43         irker = self.get_irker()
44         self.assertEqual({
45             'bold': '', 'green': '', 'blue': '', 'red': '',
46             'yellow': '', 'brown': '', 'magenta': '', 'cyan': '',
47             'reset': ''}, irker.colours())
48
49     def test_colours(self):
50         irker = self.get_irker(colour_config)
51         self.assertEqual({
52             'bold': '\x02', 'green': '\x0303', 'blue': '\x0302',
53             'red': '\x0305', 'yellow': '\x0307', 'brown': '\x0305',
54             'magenta': '\x0306', 'cyan': '\x0310', 'reset': '\x0F'},
55             irker.colours())
56
57     def test_message(self):
58         irker = self.get_irker()
59         self.assertEqual(
60                 'bzrirker: Sample <john@example.test> work * 1 /  : foo bar ',
61                 irker._format())
62
63     def test_no_project(self):
64         irker = self.get_irker(no_project_config)
65         self.assertEqual(
66                 'No Project name set: Sample <john@example.test>'
67                 ' work * 1 /  : foo bar ',
68                 irker._format())
69
70     def test_message_colour(self):
71         irker = self.get_irker(colour_config)
72         self.assertEqual(
73                 '\x02bzrirker:\x0f \x0303Sample <john@example.test>\x0f'
74                 ' work * \x021\x0f /  \x02\x0f: foo bar ', irker._format())
75
76     def test_send(self):
77         irker = self.get_irker()
78         server = self.get_server()
79         irker.send()
80         while server.data is None:
81             pass
82         server.shutdown()
83         self.assertEqual(server.data,
84                 '{"to": ["irc://chat.example.test/commits"]'
85                 ', "privmsg": "bzrirker: Sample <john@example.test>'
86                 ' work * 1 /  : foo bar "}\n')
87
88     def get_irker(self, text=sample_config):
89         my_config = config.MemoryStack(text)
90         self.branch = BzrDir.create_branch_convenience('.')
91         tree = self.branch.bzrdir.open_workingtree()
92         tree.commit('foo bar\nfuzzy\nwuzzy', rev_id='A',
93                 allow_pointless=True,
94                 timestamp=1,
95                 timezone=0,
96                 committer="Sample <john@example.test>",
97                 )
98         irker = IrkerSender(self.branch, 'A', my_config)
99         # We're not calling send, so do the setup stuff here
100         irker._setup_revision_and_revno()
101         return irker
102
103     def get_server(self):
104         server = TCPServer(('localhost', 6677), MyHandler)
105         server.data = None
106         thread = threading.Thread(target=server.serve_forever)
107         thread.start()
108         return server