Exemplo n.º 1
0
 def setUp(self):
     with mock.patch.object(SpecchioEventHandler,
                            "init_gitignore") as _init_gitignore:
         _init_gitignore.return_value = True
         self.handler = SpecchioEventHandler(src_path="/a/",
                                             dst_ssh="user@host",
                                             dst_path="/b/a/")
     self.handler.init_gitignore = mock.Mock()
     self.handler.gitignore_dict = {
         "/a/.gitignore": {
             1: [],
             2: [re.compile(fnmatch.translate("1.py"))],
             3: [
                 re.compile(fnmatch.translate("test.py")),
                 re.compile(fnmatch.translate("t_folder/"))
             ]
         }
     }
     self.handler.gitignore_list = ["/a/"]
Exemplo n.º 2
0
 def test_specchio_init_with_init_remote(self):
     with mock.patch.object(SpecchioEventHandler,
                            "init_gitignore") as _init_gitignore:
         with mock.patch.object(SpecchioEventHandler,
                                "init_remote") as _init_remote:
             _init_gitignore.return_value = True
             _init_remote.return_value = True
             SpecchioEventHandler(src_path="/a/",
                                  dst_ssh="user@host",
                                  dst_path="/b/a/",
                                  is_init_remote=True)
             _init_remote.assert_called_once_with()
Exemplo n.º 3
0
 def setUp(self):
     SpecchioEventHandler.init_gitignore = mock.Mock()
     SpecchioEventHandler.init_gitignore.return_value = True
     self.handler = SpecchioEventHandler(
         src_path="/a/",
         dst_ssh="user@host",
         dst_path="/b/a/"
     )
     self.handler.gitignore_dict = {
         "/a/.gitignore": {
             1: [],
             2: [re.compile(fnmatch.translate("1.py"))],
             3: [re.compile(fnmatch.translate("test.py"))]
         }
     }
     self.handler.gitignore_list = ["/a/"]
Exemplo n.º 4
0
def main():
    """Main function for specchio

    Example: specchio test/ user@host:test/

    :return: None
    """
    init_logger()
    _popen_str = os.popen("whereis ssh").read().strip()
    if _popen_str == "" or _popen_str == "ssh:":
        return logger.error("Specchio need `ssh`, "
                            "but there is no `ssh` in the system")
    _popen_str = os.popen("whereis rsync").read().strip()
    if _popen_str == "" or _popen_str == "rsync:":
        return logger.error("Specchio need `rsync`, "
                            "but there is no `rsync` in the system")
    if len(sys.argv) >= 3:
        src_path = sys.argv[-2].strip()
        dst_ssh, dst_path = sys.argv[-1].strip().split(":")
        option_valid = all((option in GENERAL_OPTIONS)
                           for option in sys.argv[1:-2])
        if option_valid:
            logger.info("Initialize Specchio")
            is_init_remote = "--init-remote" in sys.argv[1:-2]
            event_handler = SpecchioEventHandler(
                src_path=src_path, dst_ssh=dst_ssh, dst_path=dst_path,
                is_init_remote=is_init_remote
            )
            observer = Observer()
            observer.schedule(event_handler, src_path, recursive=True)
            observer.start()
            try:
                while True:
                    time.sleep(1)
            except KeyboardInterrupt:
                observer.stop()
            observer.join()
            logger.info("Specchio stopped, have a nice day :)")
        else:
            print(MANUAL)
    else:
        print(MANUAL)
Exemplo n.º 5
0
 def test_init_gitignore(self, _get_all_re, _walk_get_gitignore):
     _walk_get_gitignore.return_value = ["/a/.gitignore"]
     _get_all_re.return_value = {
         "/a/.gitignore": {
             1: [],
             2: [re.compile(fnmatch.translate("1.py"))],
             3: [re.compile(fnmatch.translate("test.py"))]
         }
     }
     handler = SpecchioEventHandler(src_path="/a/",
                                    dst_ssh="user@host",
                                    dst_path="/b/a/")
     _walk_get_gitignore.called_once_with("/a/")
     self.assertEqual(handler.gitignore_list, ["/a/"])
     self.assertEqual(
         handler.gitignore_dict, {
             "/a/.gitignore": {
                 1: [],
                 2: [re.compile(fnmatch.translate("1.py"))],
                 3: [re.compile(fnmatch.translate("test.py"))]
             }
         })
Exemplo n.º 6
0
class SpecchioEventHandlerTest(TestCase):

    def setUp(self):
        with mock.patch.object(
            SpecchioEventHandler, "init_gitignore"
        ) as init_gitignore:
            init_gitignore.return_value = True
            self.handler = SpecchioEventHandler(
                src_path="/a/",
                dst_ssh="user@host",
                dst_path="/b/a/"
            )
        self.handler.init_gitignore = mock.Mock()
        self.handler.gitignore_dict = {
            "/a/.gitignore": {
                1: [],
                2: [re.compile(fnmatch.translate("1.py"))],
                3: [re.compile(fnmatch.translate("test.py"))]
            }
        }
        self.handler.gitignore_list = ["/a/"]

    def is_ignore_git_folder_test(self):
        _file_or_dir_path = mock.Mock("/a/")
        _file_or_dir_path.startswith.return_value = True
        result = self.handler.is_ignore(_file_or_dir_path)
        self.assertEqual(result, True)
        _file_or_dir_path.startswith.called_once_with(self.handler.git_path)

    @mock.patch("specchio.handlers.dfs_get_gitignore")
    @mock.patch("specchio.handlers.get_all_re")
    def init_gitignore_test(self, _get_all_re, _dfs_get_gitignore):
        _dfs_get_gitignore.return_value = ["/a/.gitignore"]
        _get_all_re.return_value = {
            "/a/.gitignore": {
                1: [],
                2: [re.compile(fnmatch.translate("1.py"))],
                3: [re.compile(fnmatch.translate("test.py"))]
            }
        }
        handler = SpecchioEventHandler(
            src_path="/a/",
            dst_ssh="user@host",
            dst_path="/b/a/"
        )
        _dfs_get_gitignore.called_once_with("/a/")
        self.assertEqual(handler.gitignore_list, ["/a/"])
        self.assertEqual(handler.gitignore_dict, {
            "/a/.gitignore": {
                1: [],
                2: [re.compile(fnmatch.translate("1.py"))],
                3: [re.compile(fnmatch.translate("test.py"))]
            }
        })

    @mock.patch("specchio.handlers.os")
    @mock.patch("specchio.handlers.remote_create_folder")
    def on_created_folder_test(self, _remote_create_folder, _os):
        _remote_create_folder.return_value = True
        _os.path.abspath.return_value = "/a/test1.py"
        _os.path.join.return_value = "/b/a/test1.py"
        _event = DirCreatedEvent(src_path="/a/test1.py")
        self.handler.on_created(_event)
        _remote_create_folder.assert_called_once_with(
            dst_ssh=self.handler.dst_ssh,
            dst_path="/b/a/test1.py"
        )

    @mock.patch("specchio.handlers.remote_create_folder")
    @mock.patch("specchio.handlers.rsync")
    @mock.patch("specchio.handlers.os")
    def on_created_file_test(self, _os, _rsync,
                             _remote_create_folder):
        with mock.patch.object(
                self.handler,
                "update_gitignore"
        ) as _update_gitignore:
            _os.path.abspath.return_value = "/a/.gitignore"
            _rsync.return_value = True
            _update_gitignore.return_value = True
            _remote_create_folder.return_value = True
            _os.path.join.return_value = "/b/a/.gitignore"
            _event = FileCreatedEvent(src_path="/a/.gitignore")
            self.handler.on_created(_event)
            _remote_create_folder.assert_called_once_with(
                dst_ssh=self.handler.dst_ssh,
                dst_path="/b/a/"
            )
            _rsync.assert_called_once_with(dst_ssh=self.handler.dst_ssh,
                                           dst_path="/b/a/.gitignore",
                                           src_path="/a/.gitignore")
            _update_gitignore.assert_called_once_with("/a/.gitignore")

    @mock.patch("specchio.handlers.os")
    @mock.patch("specchio.handlers.remote_create_folder")
    def on_created_ignore_test(self, _remote_create_folder, _os):
        _remote_create_folder.return_value = True
        _os.path.abspath.return_value = "/a/test.py"
        _event = DirCreatedEvent(src_path="/a/test.py")
        self.handler.on_created(_event)
        self.assertEqual(_remote_create_folder.call_count, 0)

    @mock.patch("specchio.handlers.os")
    @mock.patch("specchio.handlers.remote_create_folder")
    @mock.patch("specchio.handlers.rsync")
    def on_modified_test(self, _rsync, _remote_create_folder, _os):
        with mock.patch.object(
                self.handler,
                "update_gitignore"
        ) as _update_gitignore:
            _rsync.return_value = True
            _remote_create_folder.return_value = True
            _os.path.abspath.return_value = "/a/.gitignore"
            _os.path.join.return_value = "/b/a/.gitignore"
            _update_gitignore.return_value = True
            _event = FileModifiedEvent(src_path="/a/.gitignore")
            self.handler.on_modified(_event)
            _rsync.assert_called_once_with(
                dst_ssh=self.handler.dst_ssh,
                src_path="/a/.gitignore",
                dst_path="/b/a/.gitignore"
            )
            _remote_create_folder.assert_called_once_with(
                dst_ssh=self.handler.dst_ssh,
                dst_path="/b/a/"
            )
            _update_gitignore.assert_called_once_with(
                "/a/.gitignore"
            )

    @mock.patch("specchio.handlers.os")
    @mock.patch("specchio.handlers.remote_create_folder")
    @mock.patch("specchio.handlers.rsync")
    def on_modifited_ignore_test(self, _rsync, _remote_create_folder, _os):
        _rsync.return_value = True
        _remote_create_folder.return_value = True
        _os.path.abspath.return_value = "/a/test.py"
        _event = FileModifiedEvent(src_path="/a/test.py")
        self.handler.on_modified(_event)
        self.assertEqual(_remote_create_folder.call_count, 0)
        self.assertEqual(_rsync.call_count, 0)

    @mock.patch("specchio.handlers.get_all_re")
    def update_gitignore_test(self, _get_all_re):
        _get_all_re.return_value = {
            "/a/b/.gitignore": {
                1: [],
                2: [],
                3: []
            }
        }
        _handler_gitignore_list = list(self.handler.gitignore_list)
        _handler_gitignore_dict = dict(self.handler.gitignore_dict)
        self.handler.update_gitignore("/a/b/.gitignore")
        self.assertEqual(
            self.handler.gitignore_list,
            ["/a/b/", "/a/"]
        )
        self.assertEqual(
            self.handler.gitignore_dict,
            {
                "/a/.gitignore": {
                    1: [],
                    2: [re.compile(fnmatch.translate("1.py"))],
                    3: [re.compile(fnmatch.translate("test.py"))]
                },
                "/a/b/.gitignore": {
                    1: [],
                    2: [],
                    3: []
                }
            }
        )
        self.handler.gitignore_list = _handler_gitignore_list
        self.handler.gitignore_dict = _handler_gitignore_dict

    def del_gitignore_test(self):
        _handler_gitignore_list = list(self.handler.gitignore_list)
        _handler_gitignore_dict = dict(self.handler.gitignore_dict)
        self.handler.del_gitignore("/a/.gitignore")
        self.assertEqual(
            self.handler.gitignore_list,
            []
        )
        self.assertEqual(
            self.handler.gitignore_dict,
            {}
        )
        self.handler.gitignore_list = _handler_gitignore_list
        self.handler.gitignore_dict = _handler_gitignore_dict

    @mock.patch("specchio.handlers.os")
    @mock.patch("specchio.handlers.remote_rm")
    def on_deleted_test(self, _remote_rm, _os):
        with mock.patch.object(
            self.handler,
            "del_gitignore"
        ) as _del_gitignore:
            _os.path.abspath.return_value = "/a/.gitignore"
            _os.path.join.return_value = "/b/a/.gitignore"
            _remote_rm.return_value = True
            _del_gitignore.return_value = True
            _event = FileDeletedEvent(src_path="/a/.gitignore")
            self.handler.on_deleted(_event)
            _os.path.abspath.assert_called_once_with("/a/.gitignore")
            _os.path.join.assert_called_once_with(
                "/b/a/",
                ".gitignore"
            )
            _remote_rm.assert_called_once_with(
                dst_ssh=self.handler.dst_ssh,
                dst_path="/b/a/.gitignore"
            )
            _del_gitignore.assert_called_once_with("/a/.gitignore")

    @mock.patch("specchio.handlers.os")
    @mock.patch("specchio.handlers.remote_rm")
    def on_delete_ignore_test(self, _remote_rm, _os):
        _os.path.abspath.return_value = "/a/test.py"
        _event = FileDeletedEvent(src_path="/a/test.py")
        self.handler.on_deleted(_event)
        _os.path.abspath.assert_called_once_with(
            "/a/test.py"
        )
        self.assertEqual(_os.path.join.call_count, 0)

    @mock.patch("specchio.handlers.os")
    @mock.patch("specchio.handlers.remote_mv")
    def on_moved_test(self, _mv, _os):
        _mv.return_value = True
        _os.path.abspath.side_effect = ["/a/1.py", "/a/2.py"]
        _os.path.join.side_effect = ["/b/a/1.py", "/b/a/2.py"]
        _event = FileMovedEvent(src_path="/a/1.py", dest_path="/a/2.py")
        self.handler.on_moved(_event)
        _mv.assert_called_once_with(
            dst_ssh=self.handler.dst_ssh,
            src_path="/b/a/1.py",
            dst_path="/b/a/2.py"
        )

    @mock.patch("specchio.handlers.os")
    @mock.patch("specchio.handlers.remote_rm")
    @mock.patch("specchio.handlers.remote_create_folder")
    @mock.patch("specchio.handlers.remote_mv")
    @mock.patch("specchio.handlers.rsync")
    def on_moved_all_ignore_test(self, _rsync, _mv, _create_folder, _rm, _os):
        _mv.return_value = True
        _create_folder.return_value = True
        _rm.return_value = True
        _rsync.return_value = True
        _os.path.abspath.side_effect = ["/a/test.py", "/a/test.py"]
        _os.path.join.side_effect = ["/b/a/test.py", "/b/a/test.py"]
        _event = FileMovedEvent(src_path="/a/test.py", dest_path="/a/test.py")
        self.handler.on_moved(_event)
        self.assertEqual(_mv.call_count, 0)
        self.assertEqual(_rm.call_count, 0)
        self.assertEqual(_create_folder.call_count, 0)
        self.assertEqual(_rsync.call_count, 0)

    @mock.patch("specchio.handlers.os")
    @mock.patch("specchio.handlers.remote_create_folder")
    @mock.patch("specchio.handlers.rsync")
    def on_moved_src_ignore_test(self, _rsync, _create_folder, _os):
        _create_folder.return_value = True
        _rsync.return_value = True
        _os.path.abspath.side_effect = ["/a/test.py", "/a/1.py"]
        _os.path.join.side_effect = ["/b/a/test.py", "/b/a/1.py"]
        _event = FileMovedEvent(src_path="test.py", dest_path="/a/1.py")
        self.handler.on_moved(_event)
        _create_folder.assert_called_once_with(
            dst_ssh=self.handler.dst_ssh,
            dst_path="/b/a/"
        )
        _rsync.assert_called_once_with(
            dst_ssh=self.handler.dst_ssh,
            src_path="/a/1.py",
            dst_path="/b/a/1.py"
        )

    @mock.patch("specchio.handlers.os")
    @mock.patch("specchio.handlers.remote_rm")
    def on_moved_dst_ignore_test(self, _rm, _os):
        _rm.return_value = True
        _os.path.abspath.side_effect = ["/a/1.py", "/a/test.py"]
        _os.path.join.side_effect = ["/b/a/1.py", "/b/a/test.py"]
        _event = FileMovedEvent(src_path="1.py", dest_path="/a/test.py")
        self.handler.on_moved(_event)
        _rm.assert_called_once_with(
            dst_ssh=self.handler.dst_ssh,
            dst_path="/b/a/1.py"
        )
Exemplo n.º 7
0
class SpecchioEventHandlerTest(TestCase):
    def setUp(self):
        with mock.patch.object(SpecchioEventHandler,
                               "init_gitignore") as _init_gitignore:
            _init_gitignore.return_value = True
            self.handler = SpecchioEventHandler(src_path="/a/",
                                                dst_ssh="user@host",
                                                dst_path="/b/a/")
        self.handler.init_gitignore = mock.Mock()
        self.handler.gitignore_dict = {
            "/a/.gitignore": {
                1: [],
                2: [re.compile(fnmatch.translate("1.py"))],
                3: [
                    re.compile(fnmatch.translate("test.py")),
                    re.compile(fnmatch.translate("t_folder/"))
                ]
            }
        }
        self.handler.gitignore_list = ["/a/"]

    def test_specchio_init_with_init_remote(self):
        with mock.patch.object(SpecchioEventHandler,
                               "init_gitignore") as _init_gitignore:
            with mock.patch.object(SpecchioEventHandler,
                                   "init_remote") as _init_remote:
                _init_gitignore.return_value = True
                _init_remote.return_value = True
                SpecchioEventHandler(src_path="/a/",
                                     dst_ssh="user@host",
                                     dst_path="/b/a/",
                                     is_init_remote=True)
                _init_remote.assert_called_once_with()

    def test_is_ignore_git_folder(self):
        _file_or_dir_path = mock.Mock("/a/")
        _file_or_dir_path.endswith.return_value = True
        _file_or_dir_path.startswith.return_value = True
        result = self.handler.is_ignore(_file_or_dir_path, True)
        self.assertEqual(result, True)
        _file_or_dir_path.startswith.called_once_with(self.handler.git_path)

    @mock.patch("specchio.handlers.walk_get_gitignore")
    @mock.patch("specchio.handlers.get_all_re")
    def test_init_gitignore(self, _get_all_re, _walk_get_gitignore):
        _walk_get_gitignore.return_value = ["/a/.gitignore"]
        _get_all_re.return_value = {
            "/a/.gitignore": {
                1: [],
                2: [re.compile(fnmatch.translate("1.py"))],
                3: [re.compile(fnmatch.translate("test.py"))]
            }
        }
        handler = SpecchioEventHandler(src_path="/a/",
                                       dst_ssh="user@host",
                                       dst_path="/b/a/")
        _walk_get_gitignore.called_once_with("/a/")
        self.assertEqual(handler.gitignore_list, ["/a/"])
        self.assertEqual(
            handler.gitignore_dict, {
                "/a/.gitignore": {
                    1: [],
                    2: [re.compile(fnmatch.translate("1.py"))],
                    3: [re.compile(fnmatch.translate("test.py"))]
                }
            })

    @mock.patch("specchio.handlers.os")
    @mock.patch("specchio.handlers.remote_create_folder")
    def test_on_created_folder(self, _remote_create_folder, _os):
        _remote_create_folder.return_value = True
        _os.path.abspath.return_value = "/a/test1.py"
        _os.path.join.return_value = "/b/a/test1.py"
        _event = DirCreatedEvent(src_path="/a/test1.py")
        self.handler.on_created(_event)
        _remote_create_folder.assert_called_once_with(
            dst_ssh=self.handler.dst_ssh, dst_path="/b/a/test1.py")

    @mock.patch("specchio.handlers.remote_create_folder")
    @mock.patch("specchio.handlers.rsync")
    @mock.patch("specchio.handlers.os")
    def test_on_created_file(self, _os, _rsync, _remote_create_folder):
        with mock.patch.object(self.handler,
                               "update_gitignore") as _update_gitignore:
            _os.path.abspath.return_value = "/a/.gitignore"
            _rsync.return_value = True
            _update_gitignore.return_value = True
            _remote_create_folder.return_value = True
            _os.path.join.return_value = "/b/a/.gitignore"
            _event = FileCreatedEvent(src_path="/a/.gitignore")
            self.handler.on_created(_event)
            _remote_create_folder.assert_called_once_with(
                dst_ssh=self.handler.dst_ssh, dst_path="/b/a/")
            _rsync.assert_called_once_with(dst_ssh=self.handler.dst_ssh,
                                           dst_path="/b/a/.gitignore",
                                           src_path="/a/.gitignore")
            _update_gitignore.assert_called_once_with("/a/.gitignore")

    @mock.patch("specchio.handlers.os")
    @mock.patch("specchio.handlers.remote_create_folder")
    def test_on_created_ignore(self, _remote_create_folder, _os):
        _remote_create_folder.return_value = True
        _os.path.abspath.return_value = "/a/test.py"
        _event = FileCreatedEvent(src_path="/a/test.py")
        self.handler.on_created(_event)
        self.assertEqual(_remote_create_folder.call_count, 0)

    @mock.patch("specchio.handlers.os")
    @mock.patch("specchio.handlers.remote_create_folder")
    @mock.patch("specchio.handlers.rsync")
    def test_on_modified(self, _rsync, _remote_create_folder, _os):
        with mock.patch.object(self.handler,
                               "update_gitignore") as _update_gitignore:
            _rsync.return_value = True
            _remote_create_folder.return_value = True
            _os.path.abspath.return_value = "/a/.gitignore"
            _os.path.join.return_value = "/b/a/.gitignore"
            _update_gitignore.return_value = True
            _event = FileModifiedEvent(src_path="/a/.gitignore")
            self.handler.on_modified(_event)
            _rsync.assert_called_once_with(dst_ssh=self.handler.dst_ssh,
                                           src_path="/a/.gitignore",
                                           dst_path="/b/a/.gitignore")
            _remote_create_folder.assert_called_once_with(
                dst_ssh=self.handler.dst_ssh, dst_path="/b/a/")
            _update_gitignore.assert_called_once_with("/a/.gitignore")

    @mock.patch("specchio.handlers.os")
    @mock.patch("specchio.handlers.remote_create_folder")
    @mock.patch("specchio.handlers.rsync")
    def test_on_modifited_ignore(self, _rsync, _remote_create_folder, _os):
        _rsync.return_value = True
        _remote_create_folder.return_value = True
        _os.path.abspath.return_value = "/a/test.py"
        _event = FileModifiedEvent(src_path="/a/test.py")
        self.handler.on_modified(_event)
        self.assertEqual(_remote_create_folder.call_count, 0)
        self.assertEqual(_rsync.call_count, 0)

    @mock.patch("specchio.handlers.get_all_re")
    def test_update_gitignore(self, _get_all_re):
        _get_all_re.return_value = {"/a/b/.gitignore": {1: [], 2: [], 3: []}}
        _handler_gitignore_list = list(self.handler.gitignore_list)
        _handler_gitignore_dict = dict(self.handler.gitignore_dict)
        self.handler.update_gitignore("/a/b/.gitignore")
        self.assertEqual(self.handler.gitignore_list, ["/a/b/", "/a/"])
        self.assertEqual(
            self.handler.gitignore_dict, {
                "/a/.gitignore": {
                    1: [],
                    2: [re.compile(fnmatch.translate("1.py"))],
                    3: [
                        re.compile(fnmatch.translate("test.py")),
                        re.compile(fnmatch.translate("t_folder/"))
                    ]
                },
                "/a/b/.gitignore": {
                    1: [],
                    2: [],
                    3: []
                }
            })
        self.handler.gitignore_list = _handler_gitignore_list
        self.handler.gitignore_dict = _handler_gitignore_dict

    def test_del_gitignore(self):
        _handler_gitignore_list = list(self.handler.gitignore_list)
        _handler_gitignore_dict = dict(self.handler.gitignore_dict)
        self.handler.del_gitignore("/a/.gitignore")
        self.assertEqual(self.handler.gitignore_list, [])
        self.assertEqual(self.handler.gitignore_dict, {})
        self.handler.gitignore_list = _handler_gitignore_list
        self.handler.gitignore_dict = _handler_gitignore_dict

    @mock.patch("specchio.handlers.os")
    @mock.patch("specchio.handlers.remote_rm")
    def test_on_deleted(self, _remote_rm, _os):
        with mock.patch.object(self.handler,
                               "del_gitignore") as _del_gitignore:
            _os.path.abspath.return_value = "/a/.gitignore"
            _os.path.join.return_value = "/b/a/.gitignore"
            _remote_rm.return_value = True
            _del_gitignore.return_value = True
            _event = FileDeletedEvent(src_path="/a/.gitignore")
            self.handler.on_deleted(_event)
            _os.path.abspath.assert_called_once_with("/a/.gitignore")
            _os.path.join.assert_called_once_with("/b/a/", ".gitignore")
            _remote_rm.assert_called_once_with(dst_ssh=self.handler.dst_ssh,
                                               dst_path="/b/a/.gitignore")
            _del_gitignore.assert_called_once_with("/a/.gitignore")

    @mock.patch("specchio.handlers.os")
    def test_on_delete_ignore(self, _os):
        _os.path.abspath.return_value = "/a/test.py"
        _event = FileDeletedEvent(src_path="/a/test.py")
        self.handler.on_deleted(_event)
        _os.path.abspath.assert_called_once_with("/a/test.py")
        self.assertEqual(_os.path.join.call_count, 0)

    @mock.patch("specchio.handlers.os")
    @mock.patch("specchio.handlers.remote_mv")
    def test_on_moved(self, _mv, _os):
        _mv.return_value = True
        _os.path.abspath.side_effect = ["/a/1.py", "/a/2.py"]
        _os.path.join.side_effect = ["/b/a/1.py", "/b/a/2.py"]
        _event = FileMovedEvent(src_path="/a/1.py", dest_path="/a/2.py")
        self.handler.on_moved(_event)
        _mv.assert_called_once_with(dst_ssh=self.handler.dst_ssh,
                                    src_path="/b/a/1.py",
                                    dst_path="/b/a/2.py")

    @mock.patch("specchio.handlers.os")
    @mock.patch("specchio.handlers.remote_rm")
    @mock.patch("specchio.handlers.remote_create_folder")
    @mock.patch("specchio.handlers.remote_mv")
    @mock.patch("specchio.handlers.rsync")
    def test_on_moved_all_ignore(self, _rsync, _mv, _create_folder, _rm, _os):
        _mv.return_value = True
        _create_folder.return_value = True
        _rm.return_value = True
        _rsync.return_value = True
        _os.path.abspath.side_effect = ["/a/test.py", "/a/test.py"]
        _os.path.join.side_effect = ["/b/a/test.py", "/b/a/test.py"]
        _event = FileMovedEvent(src_path="/a/test.py", dest_path="/a/test.py")
        self.handler.on_moved(_event)
        self.assertEqual(_mv.call_count, 0)
        self.assertEqual(_rm.call_count, 0)
        self.assertEqual(_create_folder.call_count, 0)
        self.assertEqual(_rsync.call_count, 0)

    @mock.patch("specchio.handlers.os")
    @mock.patch("specchio.handlers.remote_create_folder")
    @mock.patch("specchio.handlers.rsync")
    def test_on_moved_src_ignore(self, _rsync, _create_folder, _os):
        _create_folder.return_value = True
        _rsync.return_value = True
        _os.path.abspath.side_effect = ["/a/test.py", "/a/1.py"]
        _os.path.join.side_effect = ["/b/a/test.py", "/b/a/1.py"]
        _event = FileMovedEvent(src_path="test.py", dest_path="/a/1.py")
        self.handler.on_moved(_event)
        _create_folder.assert_called_once_with(dst_ssh=self.handler.dst_ssh,
                                               dst_path="/b/a/")
        _rsync.assert_called_once_with(dst_ssh=self.handler.dst_ssh,
                                       src_path="/a/1.py",
                                       dst_path="/b/a/1.py")

    @mock.patch("specchio.handlers.os")
    @mock.patch("specchio.handlers.remote_rm")
    def test_on_moved_dst_ignore(self, _rm, _os):
        _rm.return_value = True
        _os.path.abspath.side_effect = ["/a/1.py", "/a/test.py"]
        _os.path.join.side_effect = ["/b/a/1.py", "/b/a/test.py"]
        _event = FileMovedEvent(src_path="1.py", dest_path="/a/test.py")
        self.handler.on_moved(_event)
        _rm.assert_called_once_with(dst_ssh=self.handler.dst_ssh,
                                    dst_path="/b/a/1.py")

    @mock.patch("specchio.handlers.os")
    @mock.patch("specchio.handlers.rsync_multi")
    def test_init_remote(self, _rsync_multi, _os):
        _os.walk.return_value = [["/a/", [], ["1.py", "2.py"]],
                                 ["/a/t_folder/", [], []]]
        _os.path.abspath.side_effect = [
            "/a", "/a/1.py", "/a/2.py", "/a/t_folder"
        ]
        _os.path.join.side_effect = ["/a/1.py", "/a/2.py"]
        _rsync_multi.return_value = True
        with mock.patch.object(self.handler, "is_ignore") as _is_ignore:
            _is_ignore.side_effect = [False, True, False, True]
            self.handler.init_remote()
        _rsync_multi.assert_called_once_with(dst_ssh=self.handler.dst_ssh,
                                             folder_path=self.handler.src_path,
                                             src_paths=["2.py"],
                                             dst_path=self.handler.dst_path)