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)
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))
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)
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)
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)
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
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))
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)
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)
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)