def setUp(self): HOST = "0.0.0.0" PORT = 7777 self.server = HenStreamServer((HOST, PORT)) self.socket_a = SocketStub() self.socket_b = SocketStub() self.socket_c = SocketStub() self.address_a = ("localhost", 50000) self.address_b = ("localhost", 50001) self.address_c = ("localhost", 50002) self.client_a = Client(self.socket_a, "adam", self.address_a) self.client_b = Client(self.socket_b, "ben", self.address_b) self.client_c = Client(self.socket_c, "clemens", self.address_c) self.server.clients[self.client_a.address] = self.client_a self.server.clients[self.client_b.address] = self.client_b self.server.clients[self.client_c.address] = self.client_c
class ServerTest(unittest.TestCase): def setUp(self): HOST = "0.0.0.0" PORT = 7777 self.server = HenStreamServer((HOST, PORT)) self.socket_a = SocketStub() self.socket_b = SocketStub() self.socket_c = SocketStub() self.address_a = ("localhost", 50000) self.address_b = ("localhost", 50001) self.address_c = ("localhost", 50002) self.client_a = Client(self.socket_a, "adam", self.address_a) self.client_b = Client(self.socket_b, "ben", self.address_b) self.client_c = Client(self.socket_c, "clemens", self.address_c) self.server.clients[self.client_a.address] = self.client_a self.server.clients[self.client_b.address] = self.client_b self.server.clients[self.client_c.address] = self.client_c def test_read_input_should_return_client_input(self): # given line = "a line of text" socket = SocketStub([line]) # then self.assertEqual(line, self.server.read_input(socket)) def test_read_input_should_strip_output(self): # given line = "a line of text" socket = SocketStub(["\n"+ line + "\t\n"]) # then self.assertEqual(line, self.server.read_input(socket)) def test_read_input_should_return_none_if_client_is_assumed_disconnected(self): # given a socket that will return None socket = SocketStub([None]) # then self.assertIsNone(self.server.read_input(socket)) def test_quit_command_should_remove_client(self): # given socket = SocketStub() nick = "Nick" address = ("localhost", 50000) client = Client(socket, nick, address) self.server.clients[client.address] = client # when self.server.quit_command(client) # then self.assertFalse(client in self.server.clients) def test_parse_direct_message(self): # given Adam wants to send a direct message to Ben direct_message = "DM @ben Hello Ben!" # when recipients, message = self.server.parse_direct_message(direct_message) # then self.assertEqual(['ben'], recipients) self.assertEqual("Hello Ben!", message) def test_dm_command(self): # when self.server.dm_command(self.client_a, "DM @clemens Hello Clemens") #then expected_message = "<adam whispers>Hello Clemens" self.assertEqual(expected_message, self.client_c.socket.received_messages[0]) def test_get_list_message(self): # given clients have different statuses self.client_b.status = Status.AWAY self.client_c.status = Status.DND # when message = self.server.get_list_message() # then current statuses should be displayed expected_message = \ """3 users online ben AWAY clemens DND adam ONLINE """ self.assertEqual(expected_message, message) def test_list_command(self): # when self.server.list_command(self.client_a) # then expected_message = "3 users online\nben\tONLINE\nclemens\tONLINE\nadam\tONLINE\n" self.assertEqual(expected_message, self.client_a.socket.received_messages[0]) def test_help_command(self): # when self.server.help_command(self.client_a) # then self.assertEqual(HenStreamServer.HELP_MESSAGE.strip(), self.client_a.socket.received_messages[0].strip()) def test_away_command(self): # when a client Adam sets status "AWAY" self.server.away_command(self.client_a) # then all clients receive a "Adam is away" message expected_message = "adam is away\n" self.assertEqual(expected_message, self.client_a.socket.received_messages[0]) self.assertEqual(expected_message, self.client_b.socket.received_messages[0]) self.assertEqual(expected_message, self.client_c.socket.received_messages[0]) def test_dnd_command(self): # similar when a client Adam sets status "DND" self.server.dnd_command(self.client_a) # then all clients receive a "Adam wishes not be disturb" message expected_message = "adam wishes not to be disturb\n" self.assertEqual(expected_message, self.client_a.socket.received_messages[0]) self.assertEqual(expected_message, self.client_b.socket.received_messages[0]) self.assertEqual(expected_message, self.client_c.socket.received_messages[0]) def test_online_command(self): # similar when a client Adam sets status "ONLINE" self.server.online_command(self.client_a) # then all clients receive a "Adam is online" message expected_message = "adam is online\n" self.assertEqual(expected_message, self.client_a.socket.received_messages[0]) self.assertEqual(expected_message, self.client_b.socket.received_messages[0]) self.assertEqual(expected_message, self.client_c.socket.received_messages[0]) def test_say_command(self): # when adam says "Hi Guys!" message = "Hi guys!" self.server.say_command(self.client_a, message) # then ben and clemens receive "adam -Hi guys!" expected_message = "adam -" + message self.assertEqual(expected_message, self.client_b.socket.received_messages[0].strip()) self.assertEqual(expected_message, self.client_c.socket.received_messages[0].strip()) # ... but not adam self.assertEqual(0, len(self.client_a.socket.received_messages)) def test_say_noting(self): # when adam presses return on his keyboard message = "\n" self.server.say_command(self.client_a, message) # then ben and clemens receive "adam -Hi guys!" self.assertEqual(0, len(self.client_b.socket.received_messages)) self.assertEqual(0, len(self.client_c.socket.received_messages)) # ... but not adam self.assertEqual(0, len(self.client_a.socket.received_messages)) def test_is_loggedin(self): # given socket = SocketStub(["magnus", "qwerty"]) address = ("localhost", 50042) self.assertFalse(self.server.is_loggedin(address)) # when self.assertTrue(self.server.login_client(socket, address)) # then self.assertTrue(self.server.is_loggedin(address)) def test_login_twice(self): # given socket = SocketStub(["magnus", "qwerty"]) address = ("localhost", 50042) client = self.server.login_client(socket, address) duplicate_socket = SocketStub(["magnus", "qwerty"]) duplicate_address = ("localhost", 50043) self.server.login_client(duplicate_socket, duplicate_address) # then self.assertTrue(self.server.is_loggedin(duplicate_address)) self.assertFalse(self.server.is_loggedin(address)) self.assertEqual("\nYou have been suspended because your account is used somewhere else.\n", client.socket.received_messages[-1]) def test_login_client_with_a_non_registered_user(self): # given socket = SocketStub(["non_registered_user", "qwerty"]) address = ("localhost", 50042) # then self.assertFalse(self.server.login_client(socket, address)) self.assertFalse(self.server.is_loggedin(address)) def test_handle_quit(self): # given socket = SocketStub(["magnus", "qwerty", "quit"]) address = ("localhost", 50042) # when self.server.handle(socket, address) # then self.assertFalse(self.server.is_loggedin(address)) def test_handle_wrong_password(self): # given socket = SocketStub(["magnus", "foobar", "quit"]) address = ("localhost", 50042) # when self.server.handle(socket, address) # then self.assertFalse(self.server.is_loggedin(address))