def test_add_existing_adds_existing_chats(self, mock_add_chat_log):
        self._sut = EveChatLogDirectoryMonitor("path")

        calls = [call('chat_one.txt', self._chat_info['chat_one.txt']['path']),
                 call('chat_two.txt', self._chat_info['chat_two.txt']['path'])]

        mock_add_chat_log.assert_has_calls(calls, any_order=True)
    def test_add_chat_log_calls_remove_first(self, mock_remove_chat_log):
        self._sut = EveChatLogDirectoryMonitor("path")

        mock_remove_chat_log.reset_mock()

        self._sut.add_chat_log("boom_chat", "path")

        mock_remove_chat_log.assert_called_once_with("boom_chat")
    def test_add_chat_log_creates_new_chat_reader_with_path(self):
        self._sut = EveChatLogDirectoryMonitor("path")

        self._mock_eve_chat_log_reader.reset_mock()

        self._sut.add_chat_log("boom_chat", "super-sweet-path")

        self._mock_eve_chat_log_reader.assert_called_once_with('super-sweet-path')
    def test_add_chat_log_registers_chat_reader_entry(self):
        self._sut = EveChatLogDirectoryMonitor("path")

        self._mock_eve_chat_log_reader.reset_mock()

        self._sut.add_chat_log("boom_chat", "super-sweet-path")

        self.assertTrue("boom_chat" in self._sut.chats)
    def test_read_messages_reads_from_added_chat(self):
        self._mock_eve_chat_log_reader().read_messages.return_value = "MSGS"
        self._sut = EveChatLogDirectoryMonitor("path")

        result = self._sut.read_messages("chat_one.txt")

        self._mock_eve_chat_log_reader().read_messages.assert_has_calls([call()])
        self.assertEqual("MSGS", result)
    def test_init(self, mock_add_log_files, mock_add_file_observer):
        self._sut = EveChatLogDirectoryMonitor("path")

        self.assertEqual("path", self._sut.path)
        self.assertIsNone(self._sut.watchdog_observer)
        self.assertIsNotNone(self._sut.chats)
        self.assertEqual(0, len(self._sut.chats))

        mock_add_log_files.assert_called_once()
        mock_add_file_observer.assert_called_once()
    def test_on_create_does_nothing_for_directory_events(self):
        self._sut = EveChatLogDirectoryMonitor("path")

        event = MagicMock()
        event.is_directory = True

        self._mock_os.path.split.reset_mock()

        self._sut.on_create(event)

        self.assertFalse(self._mock_os.path.split.called)
    def test_on_create_adds_the_proper_chat_and_path(self, mock_add_chat_log):
        self._sut = EveChatLogDirectoryMonitor("path")

        event = MagicMock()
        event.is_directory = False
        event.src_path = "some_chat_20150101_240101.txt"

        self._patcher_os.stop()
        mock_add_chat_log.reset_mock()

        self._sut.on_create(event)

        self._patcher_os.start()

        mock_add_chat_log.assert_called_once_with("some_chat", event.src_path)
 def test_add_file_observer_raises_exception_on_double_call(self):
     self._sut = EveChatLogDirectoryMonitor("path")
     self.assertRaises(ObserverAlreadyAdded, self._sut._add_file_observer)
class TestEveChatLogDirectoryMonitor(TestCase):

    def setUp(self):
        self._sut = None
        self._patcher_os = patch('py_eve_chat_mon.chat_directory.os')
        self._mock_os = self._patcher_os.start()

        self._mock_os.path.exists.return_value = True
        self._mock_os.path.isdir.return_value = True

        self._patch_watchdog = patch('py_eve_chat_mon.chat_directory.Observer')
        self._mock_watch_dog = self._patch_watchdog.start()

        self._patch_dir_change_event_handler = patch('py_eve_chat_mon.chat_directory.DirChangeEventHandler')
        self._mock_dir_change_event_handler = self._patch_dir_change_event_handler.start()

        self._chat_info = {'chat_one.txt': {'path':  'chat_one_path.txt'},
                           'chat_two.txt': {'path': 'chat_two_path.txt'}}

        self._patch_get_existing_chats = patch('py_eve_chat_mon.chat_directory.get_existing_logs')
        self._mock_get_existing_chats = self._patch_get_existing_chats.start()
        self._mock_get_existing_chats.return_value = self._chat_info

        self._patch_eve_chat_log_reader = patch('py_eve_chat_mon.chat_directory.EveChatLogReader')
        self._mock_eve_chat_log_reader = self._patch_eve_chat_log_reader.start()

    def tearDown(self):
        self._patcher_os.stop()
        self._patch_watchdog.stop()
        self._patch_dir_change_event_handler.stop()
        self._patch_get_existing_chats.stop()
        self._patch_eve_chat_log_reader.stop()

    def test_init_invalid_path_raises_exception(self):
        self._sut = EveChatLogDirectoryMonitor("path")
        self._patcher_os.stop()
        self.assertRaises(InvalidChatDirectory, EveChatLogDirectoryMonitor, INVALID_PATH)
        self._patcher_os.start()

    def test_init_file_path_raises_exception(self):
        self._sut = EveChatLogDirectoryMonitor("path")
        self._patcher_os.stop()
        self.assertRaises(InvalidChatDirectory, EveChatLogDirectoryMonitor, FILE_PATH)
        self._patcher_os.start()

    @patch('py_eve_chat_mon.chat_directory.EveChatLogDirectoryMonitor._add_file_observer')
    @patch('py_eve_chat_mon.chat_directory.EveChatLogDirectoryMonitor._add_existing_log_files')
    def test_init(self, mock_add_log_files, mock_add_file_observer):
        self._sut = EveChatLogDirectoryMonitor("path")

        self.assertEqual("path", self._sut.path)
        self.assertIsNone(self._sut.watchdog_observer)
        self.assertIsNotNone(self._sut.chats)
        self.assertEqual(0, len(self._sut.chats))

        mock_add_log_files.assert_called_once()
        mock_add_file_observer.assert_called_once()

    def test_add_file_observer_raises_exception_on_double_call(self):
        self._sut = EveChatLogDirectoryMonitor("path")
        self.assertRaises(ObserverAlreadyAdded, self._sut._add_file_observer)

    def test_add_file_observer_creates_dir_event_handler_with_proper_call_backs(self):
        self._sut = EveChatLogDirectoryMonitor("path")
        self._mock_dir_change_event_handler.assert_called_with(self._sut.on_create, self._sut.on_delete)

    def test_add_file_observer_creates_observer(self):
        self._sut = EveChatLogDirectoryMonitor("path")
        self._mock_watch_dog.assert_called_once()

    def test_add_file_observer_sets_watchdog_observer(self):
        self._sut = EveChatLogDirectoryMonitor("path")
        self.assertEqual(self._mock_watch_dog(), self._sut.watchdog_observer)

    def test_add_file_observer_schedulers_observer(self):
        self._sut = EveChatLogDirectoryMonitor("path")
        self._mock_watch_dog().schedule.assert_called_with(self._mock_dir_change_event_handler(),
                                                           self._sut.path,
                                                           recursive=False)

    def test_add_existing_get_existing_chats(self):
        self._sut = EveChatLogDirectoryMonitor("path")
        self._mock_get_existing_chats.assert_called_once_with(self._sut.path)

    @patch('py_eve_chat_mon.chat_directory.EveChatLogDirectoryMonitor.add_chat_log')
    def test_add_existing_adds_existing_chats(self, mock_add_chat_log):
        self._sut = EveChatLogDirectoryMonitor("path")

        calls = [call('chat_one.txt', self._chat_info['chat_one.txt']['path']),
                 call('chat_two.txt', self._chat_info['chat_two.txt']['path'])]

        mock_add_chat_log.assert_has_calls(calls, any_order=True)

    def test_read_messages_reads_from_added_chat(self):
        self._mock_eve_chat_log_reader().read_messages.return_value = "MSGS"
        self._sut = EveChatLogDirectoryMonitor("path")

        result = self._sut.read_messages("chat_one.txt")

        self._mock_eve_chat_log_reader().read_messages.assert_has_calls([call()])
        self.assertEqual("MSGS", result)

    def test_read_messages_returns_none_for_non_added_chat(self):
        self._sut = EveChatLogDirectoryMonitor("path")

        result = self._sut.read_messages("fake_chat_name")

        self.assertIsNone(result)

    def test_remove_chat_log_calls_destroy_on_chat_reader(self):
        self._sut = EveChatLogDirectoryMonitor("path")

        self._sut.remove_chat_log("chat_one.txt")

        self._mock_eve_chat_log_reader().destroy.assert_called_once()

    def test_remove_chat_log_removes_chat_reader_entry(self):
        self._sut = EveChatLogDirectoryMonitor("path")

        self._sut.remove_chat_log("chat_one.txt")

        self.assertTrue("chat_one.txt" not in self._sut.chats)

    @patch('py_eve_chat_mon.chat_directory.EveChatLogDirectoryMonitor.remove_chat_log')
    def test_add_chat_log_calls_remove_first(self, mock_remove_chat_log):
        self._sut = EveChatLogDirectoryMonitor("path")

        mock_remove_chat_log.reset_mock()

        self._sut.add_chat_log("boom_chat", "path")

        mock_remove_chat_log.assert_called_once_with("boom_chat")

    def test_add_chat_log_creates_new_chat_reader_with_path(self):
        self._sut = EveChatLogDirectoryMonitor("path")

        self._mock_eve_chat_log_reader.reset_mock()

        self._sut.add_chat_log("boom_chat", "super-sweet-path")

        self._mock_eve_chat_log_reader.assert_called_once_with('super-sweet-path')

    def test_add_chat_log_registers_chat_reader_entry(self):
        self._sut = EveChatLogDirectoryMonitor("path")

        self._mock_eve_chat_log_reader.reset_mock()

        self._sut.add_chat_log("boom_chat", "super-sweet-path")

        self.assertTrue("boom_chat" in self._sut.chats)

    def test_on_delete_does_nothing_for_directory_events(self):
        self._sut = EveChatLogDirectoryMonitor("path")

        event = MagicMock()
        event.is_directory = True

        self._mock_os.path.split.reset_mock()

        self._sut.on_delete(event)

        self.assertFalse(self._mock_os.path.split.called)

    @patch('py_eve_chat_mon.chat_directory.EveChatLogDirectoryMonitor.remove_chat_log')
    def test_on_delete_removes_the_proper_chat(self, mock_remove_chat_log):
        self._sut = EveChatLogDirectoryMonitor("path")

        event = MagicMock()
        event.is_directory = False
        event.src_path = "some_chat_20150101_240101.txt"

        self._patcher_os.stop()
        mock_remove_chat_log.reset_mock()

        self._sut.on_delete(event)

        self._patcher_os.start()

        mock_remove_chat_log.assert_called_once_with("some_chat")

    def test_on_create_does_nothing_for_directory_events(self):
        self._sut = EveChatLogDirectoryMonitor("path")

        event = MagicMock()
        event.is_directory = True

        self._mock_os.path.split.reset_mock()

        self._sut.on_create(event)

        self.assertFalse(self._mock_os.path.split.called)

    @patch('py_eve_chat_mon.chat_directory.EveChatLogDirectoryMonitor.add_chat_log')
    def test_on_create_adds_the_proper_chat_and_path(self, mock_add_chat_log):
        self._sut = EveChatLogDirectoryMonitor("path")

        event = MagicMock()
        event.is_directory = False
        event.src_path = "some_chat_20150101_240101.txt"

        self._patcher_os.stop()
        mock_add_chat_log.reset_mock()

        self._sut.on_create(event)

        self._patcher_os.start()

        mock_add_chat_log.assert_called_once_with("some_chat", event.src_path)
 def test_add_file_observer_creates_observer(self):
     self._sut = EveChatLogDirectoryMonitor("path")
     self._mock_watch_dog.assert_called_once()
 def test_add_file_observer_creates_dir_event_handler_with_proper_call_backs(self):
     self._sut = EveChatLogDirectoryMonitor("path")
     self._mock_dir_change_event_handler.assert_called_with(self._sut.on_create, self._sut.on_delete)
    def test_remove_chat_log_removes_chat_reader_entry(self):
        self._sut = EveChatLogDirectoryMonitor("path")

        self._sut.remove_chat_log("chat_one.txt")

        self.assertTrue("chat_one.txt" not in self._sut.chats)
 def test_add_file_observer_sets_watchdog_observer(self):
     self._sut = EveChatLogDirectoryMonitor("path")
     self.assertEqual(self._mock_watch_dog(), self._sut.watchdog_observer)
    def test_remove_chat_log_calls_destroy_on_chat_reader(self):
        self._sut = EveChatLogDirectoryMonitor("path")

        self._sut.remove_chat_log("chat_one.txt")

        self._mock_eve_chat_log_reader().destroy.assert_called_once()
    def test_read_messages_returns_none_for_non_added_chat(self):
        self._sut = EveChatLogDirectoryMonitor("path")

        result = self._sut.read_messages("fake_chat_name")

        self.assertIsNone(result)
 def test_add_file_observer_schedulers_observer(self):
     self._sut = EveChatLogDirectoryMonitor("path")
     self._mock_watch_dog().schedule.assert_called_with(self._mock_dir_change_event_handler(),
                                                        self._sut.path,
                                                        recursive=False)
 def test_init_file_path_raises_exception(self):
     self._sut = EveChatLogDirectoryMonitor("path")
     self._patcher_os.stop()
     self.assertRaises(InvalidChatDirectory, EveChatLogDirectoryMonitor, FILE_PATH)
     self._patcher_os.start()
 def test_add_existing_get_existing_chats(self):
     self._sut = EveChatLogDirectoryMonitor("path")
     self._mock_get_existing_chats.assert_called_once_with(self._sut.path)