コード例 #1
0
    def test_Process(self):
        """全体プロセスをチェック
        """
        with ExitStack() as stack:
            mocknslogin = stack.enter_context(
                patch("MediaDownloader.LSNicoSeiga.LSNicoSeiga.Login"))
            mocknslogin = self.__MakeLoginMock(mocknslogin)
            lsns_cont = LSNicoSeiga.LSNicoSeiga(self.email, self.password,
                                                self.TEST_BASE_PATH)

            mocknsdl = stack.enter_context(
                patch(
                    "MediaDownloader.LSNicoSeiga.LSNicoSeiga.DownloadIllusts"))
            mocknsdl.side_effect = [0, 1, -1]

            illust_id = 5360137
            url = "https://seiga.nicovideo.jp/seiga/im{}".format(illust_id)
            url_with_query = "https://seiga.nicovideo.jp/seiga/im{}?track=ranking".format(
                illust_id)
            res = lsns_cont.Process(url_with_query)
            self.assertEqual(0, res)

            res = lsns_cont.Process(url_with_query)
            self.assertEqual(0, res)

            res = lsns_cont.Process(url_with_query)
            self.assertEqual(-1, res)

            # クエリが除去されて呼び出しされていることを確認
            for c in mocknsdl.call_args_list:
                self.assertEqual(c.args[0], url)
                self.assertEqual(c.args[1], self.TEST_BASE_PATH)
コード例 #2
0
    def test_GetExtFromBytes(self):
        """バイナリデータ配列から拡張子を判別する機能をチェック
        """
        with ExitStack() as stack:
            mocknslogin = stack.enter_context(
                patch("MediaDownloader.LSNicoSeiga.LSNicoSeiga.Login"))
            mocknslogin = self.__MakeLoginMock(mocknslogin)
            lsns_cont = LSNicoSeiga.LSNicoSeiga(self.email, self.password,
                                                self.TEST_BASE_PATH)

            # 正常系
            # .jpg
            data = b"\xff\xd8\xff\xff\xff\xff\xff\xff"
            self.assertEqual(".jpg", lsns_cont.GetExtFromBytes(data))

            # .png
            data = b"\x89\x50\x4e\x47\x0d\x0a\x1a\x0a"
            self.assertEqual(".png", lsns_cont.GetExtFromBytes(data))

            # .gif
            data = b"\x47\x49\x46\x38\xff\xff\xff\xff"
            self.assertEqual(".gif", lsns_cont.GetExtFromBytes(data))

            # 異常系
            # 全く関係ないバイナリ
            data = b"\xff\xff\xff\xff\xff\xff\xff\xff"
            self.assertEqual(".invalid", lsns_cont.GetExtFromBytes(data))

            # 短いバイナリ
            data = b"\xff\xff\xff\xff"
            self.assertEqual(".invalid", lsns_cont.GetExtFromBytes(data))
コード例 #3
0
    def test_MakeSaveDirectoryPath(self):
        """保存先ディレクトリパスを生成する機能をチェック
        """
        with ExitStack() as stack:
            mocknslogin = stack.enter_context(
                patch("MediaDownloader.LSNicoSeiga.LSNicoSeiga.Login"))
            mocknslogin = self.__MakeLoginMock(mocknslogin)
            lsns_cont = LSNicoSeiga.LSNicoSeiga(self.email, self.password,
                                                self.TEST_BASE_PATH)

            # テスト対象illust_id
            illust_id = 5360137
            info = self.__GetIllustData(int(illust_id))

            author_name = info.get("author_name", "")
            author_id = info.get("author_id", -1)
            illust_name = info.get("illust_name", "")
            base_path = str(self.TBP)
            expect = self.TBP / "./{}({})/{}({})/".format(
                author_name, author_id, illust_name, illust_id)

            # 想定保存先ディレクトリが存在する場合は削除する
            if expect.is_dir():
                shutil.rmtree(expect)

            # 保存先ディレクトリが存在しない場合の実行
            actual = Path(
                lsns_cont.MakeSaveDirectoryPath(author_name, author_id,
                                                illust_name, illust_id,
                                                base_path))
            self.assertEqual(expect, actual)

            # 保存先ディレクトリを作成する
            actual.mkdir(parents=True, exist_ok=True)

            # 保存先ディレクトリが存在する場合の実行
            actual = Path(
                lsns_cont.MakeSaveDirectoryPath(author_name, author_id,
                                                illust_name, illust_id,
                                                base_path))
            self.assertEqual(expect, actual)

            # エラー値をチェック
            illust_id = -1
            info = self.__GetIllustData(int(illust_id))

            author_name = info.get("author_name", "")
            author_id = info.get("author_id", -1)
            illust_name = info.get("illust_name", "")
            base_path = str(self.TBP)
            expect = ""
            actual = lsns_cont.MakeSaveDirectoryPath(author_name, author_id,
                                                     illust_name, illust_id,
                                                     base_path)
            self.assertEqual(expect, actual)
コード例 #4
0
    def test_LSNicoSeiga(self):
        """静画ページ取得クラス初期状態チェック
        """
        with ExitStack() as stack:
            mocknslogin = stack.enter_context(
                patch("MediaDownloader.LSNicoSeiga.LSNicoSeiga.Login"))
            mocknslogin = self.__MakeLoginMock(mocknslogin)

            # 正常系
            lsns_cont = LSNicoSeiga.LSNicoSeiga(self.email, self.password,
                                                self.TEST_BASE_PATH)

            self.assertEqual(self.headers, lsns_cont.headers)
            self.assertIsNotNone(lsns_cont.session)
            self.assertTrue(lsns_cont.auth_success)
            self.assertEqual(self.TEST_BASE_PATH, lsns_cont.base_path)

            # 異常系
            lsns_cont = LSNicoSeiga.LSNicoSeiga("invalid email",
                                                "invalid password",
                                                self.TEST_BASE_PATH)
            self.assertIsNone(lsns_cont.session)
            self.assertFalse(lsns_cont.auth_success)
コード例 #5
0
    def test_Login(self):
        """セッション開始とログイン機能をチェック
        """
        with ExitStack() as stack:
            # モック置き換え
            mocksession = stack.enter_context(
                patch("MediaDownloader.LSNicoSeiga.requests.session"))
            mocksession.side_effect = self.__MakeSessionMock

            lsns_cont = LSNicoSeiga.LSNicoSeiga(self.email, self.password,
                                                self.TEST_BASE_PATH)
            self.assertEqual(self.headers, lsns_cont.headers)
            self.assertIsNotNone(lsns_cont.session)
            self.assertTrue(lsns_cont.auth_success)
            self.assertEqual(self.TEST_BASE_PATH, lsns_cont.base_path)
コード例 #6
0
    def test_DownloadIllusts(self):
        """ニコニコ静画作品ページURLからダウンロードする機能をチェック
        """
        with ExitStack() as stack:
            # モック置き換え
            mocknslogin = stack.enter_context(
                patch("MediaDownloader.LSNicoSeiga.LSNicoSeiga.Login"))
            mocknslogin = self.__MakeLoginMock(mocknslogin)
            lsns_cont = LSNicoSeiga.LSNicoSeiga(self.email, self.password,
                                                self.TEST_BASE_PATH)

            illust_id = 5360137
            info = self.__GetIllustData(illust_id)

            # テスト用ディレクトリが存在しているならば削除する
            # shutil.rmtree()で再帰的に全て削除する ※指定パス注意
            if self.TBP.is_dir():
                shutil.rmtree(self.TBP)

            illust_url = "https://seiga.nicovideo.jp/seiga/im{}".format(
                illust_id)
            res = lsns_cont.DownloadIllusts(illust_url, str(self.TBP))
            self.assertEqual(0, res)  # 初めてDLしたはずなので返り値は0

            author_name = info.get("author_name", "")
            author_id = info.get("author_id", -1)
            illust_name = info.get("illust_name", "")
            sd_path_str = "./{}({})/{}({})/".format(author_name, author_id,
                                                    illust_name, illust_id)
            save_directory_path = self.TBP / sd_path_str
            sd_path = Path(save_directory_path)

            # DL後のディレクトリ構成とファイルの存在チェック
            ext = ".jpg"
            name = "{}{}".format(sd_path.name, ext)
            self.assertTrue(self.TBP.is_dir())
            self.assertTrue(sd_path.parent.is_dir())
            self.assertTrue((sd_path.parent / name).is_file())

            # 2回目のDLをシミュレート
            illust_url = "https://seiga.nicovideo.jp/seiga/im{}".format(
                illust_id)
            res = lsns_cont.DownloadIllusts(illust_url, str(self.TBP))
            self.assertEqual(1, res)  # 2回目のDLなので返り値は1
コード例 #7
0
    def test_IsTargetUrl(self):
        """URLがニコニコ静画のURLかどうか判定する機能をチェック
        """
        with ExitStack() as stack:
            mocknslogin = stack.enter_context(
                patch("MediaDownloader.LSNicoSeiga.LSNicoSeiga.Login"))
            mocknslogin = self.__MakeLoginMock(mocknslogin)
            lsns_cont = LSNicoSeiga.LSNicoSeiga(self.email, self.password,
                                                self.TEST_BASE_PATH)

            # 正常系
            # 作品ページURL
            url_s = "https://seiga.nicovideo.jp/seiga/im5360137"
            self.assertEqual(True, lsns_cont.IsTargetUrl(url_s))

            # 作品ページURL(クエリつき)
            url_s = "https://seiga.nicovideo.jp/seiga/im5360137?track=ranking"
            self.assertEqual(True, lsns_cont.IsTargetUrl(url_s))

            # 異常系
            # 全く関係ないアドレス(Google)
            url_s = "https://www.google.co.jp/"
            self.assertEqual(False, lsns_cont.IsTargetUrl(url_s))

            # 全く関係ないアドレス(pixiv)
            url_s = "https://www.pixiv.net/artworks/24010650"
            self.assertEqual(False, lsns_cont.IsTargetUrl(url_s))

            # 漫画ページ
            url_s = "https://seiga.nicovideo.jp/watch/mg558273"
            self.assertEqual(False, lsns_cont.IsTargetUrl(url_s))

            # httpsでなくhttp
            url_s = "http://seiga.nicovideo.jp/seiga/im5360137"
            self.assertEqual(False, lsns_cont.IsTargetUrl(url_s))

            # 静画の別ページ
            url_s = "https://seiga.nicovideo.jp/illust/ranking/point/hourly?save=1"
            self.assertEqual(False, lsns_cont.IsTargetUrl(url_s))

            # プリフィックスエラー
            url_s = "ftp://seiga.nicovideo.jp/seiga/im5360137"
            self.assertEqual(False, lsns_cont.IsTargetUrl(url_s))
コード例 #8
0
    def test_GetSourceURL(self):
        """ニコニコ静画の画像直リンクを取得する機能をチェック
        """
        with ExitStack() as stack:
            mocknslogin = stack.enter_context(
                patch("MediaDownloader.LSNicoSeiga.LSNicoSeiga.Login"))
            mocknslogin = self.__MakeLoginMock(mocknslogin)
            lsns_cont = LSNicoSeiga.LSNicoSeiga(self.email, self.password,
                                                self.TEST_BASE_PATH)

            # 正常系
            illust_id = 5360137
            expect_info = self.__GetIllustData(illust_id)
            expect = expect_info["url"]
            actual = lsns_cont.GetSourceURL(illust_id)
            self.assertEqual(expect, actual)

            # 異常系
            illust_id = -1
            expect = ""
            actual = lsns_cont.GetSourceURL(illust_id)
            self.assertEqual(expect, actual)
コード例 #9
0
    def test_GetIllustInfo(self):
        """ニコニコ静画情報を取得する機能をチェック
        """
        with ExitStack() as stack:
            mocknslogin = stack.enter_context(
                patch("MediaDownloader.LSNicoSeiga.LSNicoSeiga.Login"))
            mocknslogin = self.__MakeLoginMock(mocknslogin)
            lsns_cont = LSNicoSeiga.LSNicoSeiga(self.email, self.password,
                                                self.TEST_BASE_PATH)

            # 正常系
            illust_id = 5360137
            expect_info = self.__GetIllustData(illust_id)
            expect = (int(expect_info["author_id"]),
                      expect_info["illust_name"])
            actual = lsns_cont.GetIllustInfo(illust_id)
            self.assertEqual(expect, actual)

            # 異常系
            illust_id = -1
            expect = (-1, "")
            actual = lsns_cont.GetIllustInfo(illust_id)
            self.assertEqual(expect, actual)
コード例 #10
0
    def test_GetIllustId(self):
        """ニコニコ静画作品ページURLからイラストIDを取得する機能をチェック
        """
        with ExitStack() as stack:
            mocknslogin = stack.enter_context(
                patch("MediaDownloader.LSNicoSeiga.LSNicoSeiga.Login"))
            mocknslogin = self.__MakeLoginMock(mocknslogin)
            lsns_cont = LSNicoSeiga.LSNicoSeiga(self.email, self.password,
                                                self.TEST_BASE_PATH)

            # 正常系
            r = "{:0>7}".format(random.randint(0, 9999999))
            # 作品ページURL
            url_s = "https://seiga.nicovideo.jp/seiga/im{}".format(r)
            expect = int(r)
            actual = lsns_cont.GetIllustId(url_s)
            self.assertEqual(expect, actual)

            # 異常系
            # 漫画ページ
            url_s = "https://seiga.nicovideo.jp/watch/mg{}".format(r)
            expect = -1
            actual = lsns_cont.GetIllustId(url_s)
            self.assertEqual(expect, actual)