async def test_config_file_custom_name(self): async with MangadexClient.from_config( self.file_path, section_name="asyncdex_custom_name") as client: assert not client.anonymous_mode assert client.username assert client.password assert client.refresh_token assert not client.session_token
async def test_not_anonymous_refresh_token(self): client = MangadexClient(refresh_token="Test") assert not client.anonymous_mode assert not client.username assert not client.password assert client.refresh_token assert not client.session_token await client.close()
async def test_auto_renew_login(self, username, password): async with MangadexClient(username=username, password=password) as client: await client.user.fetch() client.session_token = "blah" client.refresh_token = "blah" await client.user.fetch_user() assert client.session_token != "blah" assert client.refresh_token != "blah"
async def test_auto_expire_session_token(self, username, password): async with MangadexClient(username=username, password=password) as client: await client.login() client._session_token_acquired = datetime(2000, 1, 1) assert not client.session_token await client.get_session_token() assert client.session_token assert client._session_token_acquired != datetime(2000, 1, 1)
async def test_init_env_var_refresh_token_only(self, monkeypatch): monkeypatch.delenv("asyncdex_username", raising=False) monkeypatch.delenv("asyncdex_password", raising=False) monkeypatch.setenv("asyncdex_refresh_token", "test") async with MangadexClient.from_environment_variables() as client: assert not client.anonymous_mode assert not client.username assert not client.password assert client.refresh_token assert not client.session_token
async def test_anonymous_option(self): client = MangadexClient(username="******", password="******", refresh_token="Test", anonymous=True) assert client.anonymous_mode assert not client.username assert not client.password assert not client.refresh_token assert not client.session_token await client.close()
async def test_message_response_json_context(self): async with MangadexClient() as client: r = await client.request("get", routes["ping"]) with pytest.raises(HTTPException) as exc: raise HTTPException( "GET", routes["ping"], response=r, json={"errors": [{"title": "Test", "detail": "This is a test.", "context": {"test": 1}}]}, ) assert str(exc.value) == "HTTP 200: Test: This is a test. ({'test': 1})"
async def test_init_env_var_alternate_names(self, monkeypatch): monkeypatch.setenv("au", "test") monkeypatch.setenv("ap", "test") monkeypatch.setenv("art", "test") async with MangadexClient.from_environment_variables( username_variable_name="au", password_variable_name="ap", refresh_token_variable_name="art") as client: assert not client.anonymous_mode assert client.username assert client.password assert client.refresh_token assert not client.session_token
async def test_auto_session_token(self, refresh_token): async with MangadexClient(refresh_token=refresh_token) as client: await client.ping() assert client.session_token assert client.user.id != "client-user" assert client.user.permissions == [ "user.list", "manga.view", "chapter.view", "author.view", "scanlation_group.view", "cover.view", "manga.list", "chapter.list", "author.list", "scanlation_group.list", "cover.list", ]
async def test_login_username_password(self, username, password): async with MangadexClient() as client: await client.login(username, password) assert client.session_token assert client.user.id != "client-user" assert client.user.permissions == [ "user.list", "manga.view", "chapter.view", "author.view", "scanlation_group.view", "cover.view", "manga.list", "chapter.list", "author.list", "scanlation_group.list", "cover.list", ]
async def test_refresh_token_from_username_and_password( self, username, password): async with MangadexClient(username=username, password=password) as client: await client.login() assert client.session_token assert client.user.id != "client-user" assert client.user.permissions == [ "user.list", "manga.view", "chapter.view", "author.view", "scanlation_group.view", "cover.view", "manga.list", "chapter.list", "author.list", "scanlation_group.list", "cover.list", ] client.session_token = None assert not client.session_token await client.get_session_token() assert client.session_token
async def test_message_response(self): async with MangadexClient() as client: with pytest.raises(HTTPException) as exc: await client.request("GET", "/fakepath" * 1000) assert ( str(exc.value) == "HTTP 414: HTTP Error on GET for " "https://api.mangadex.org/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath/fakepath" "/fakepath" "/fakepath/fakepath/fakepath." )
async def test_login_no_creds(self): async with MangadexClient() as client: with pytest.raises(Unauthorized): await client.login()
async def test_unauthorized_exception(self): async with MangadexClient() as client: with pytest.raises(Unauthorized): client.raise_exception_if_not_authenticated("GET", "TEST")
async def test_repr(self): async with MangadexClient(username="******", password="******") as client: assert repr( client) == "MangadexClient(anonymous=False, username='******')"
async def test_login_no_creds_refresh_token(self, refresh_token): async with MangadexClient(refresh_token=refresh_token) as client: with pytest.raises(Unauthorized): await client.login()
def test_username_and_password(self): with pytest.raises(ValueError): MangadexClient(username="******") with pytest.raises(ValueError): MangadexClient(password="******")
async def test_get_manga(self): async with MangadexClient() as client: manga = client.get_manga("Test") assert isinstance(manga, Manga)
async def test_get_author(self): async with MangadexClient() as client: author = client.get_author("Test") assert isinstance(author, Author)
async def test_get_chapter(self): async with MangadexClient() as client: chapter = client.get_chapter("Test") assert isinstance(chapter, Chapter)
async def test_login_username_or_password(self): async with MangadexClient() as client: with pytest.raises(ValueError): await client.login(username="******") with pytest.raises(ValueError): await client.login(password="******")
async def test_get_group(self): async with MangadexClient() as client: group = client.get_group("Test") assert isinstance(group, Group)