Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion praw/models/reddit/emoji.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
from praw.const import API_PATH
from praw.exceptions import ClientException
from praw.models.reddit.base import RedditBase
from prawcore.exceptions import ServerError
from requests.exceptions import HTTPError

if TYPE_CHECKING:
import praw
Expand Down Expand Up @@ -220,7 +222,10 @@ def add(

with file.open("rb") as image:
response = self._reddit._core._requestor._http.post(upload_url, data=upload_data, files={"file": image})
response.raise_for_status()
try:
response.raise_for_status()
except HTTPError as err:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you call this error please here and in the other locations.

raise ServerError(response=err.response) from None

data = {
"mod_flair_only": mod_flair_only,
Expand Down
5 changes: 4 additions & 1 deletion praw/models/reddit/subreddit.py
Original file line number Diff line number Diff line change
Expand Up @@ -1547,7 +1547,10 @@ def _upload_style_asset(self, *, image_path: str, image_type: str) -> str:
response = self.subreddit._reddit._core._requestor._http.post(
upload_url, data=upload_data, files={"file": image}
)
response.raise_for_status()
try:
response.raise_for_status()
except HTTPError as err:
raise ServerError(response=err.response) from None

return f"{upload_url}/{upload_data['key']}"

Expand Down
7 changes: 6 additions & 1 deletion praw/models/reddit/widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
from praw.models.base import PRAWBase
from praw.models.list.base import BaseList
from praw.util.cache import cachedproperty
from prawcore.exceptions import ServerError
from requests.exceptions import HTTPError

if TYPE_CHECKING:
import praw.models
Expand Down Expand Up @@ -1833,6 +1835,9 @@ def upload_image(self, file_path: str) -> str:

with file.open("rb") as image:
response = self._reddit._core._requestor._http.post(upload_url, data=upload_data, files={"file": image})
response.raise_for_status()
try:
response.raise_for_status()
except HTTPError as err:
raise ServerError(response=err.response) from None

return f"{upload_url}/{upload_data['key']}"
33 changes: 33 additions & 0 deletions tests/unit/models/reddit/test_emoji.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import pickle
from unittest import mock

import pytest

Expand Down Expand Up @@ -68,6 +69,38 @@ def test_update(self, reddit):
emoji.update()
assert str(excinfo.value) == "At least one attribute must be provided"

@mock.patch("praw.models.reddit.emoji.Path.open", new_callable=mock.mock_open)
def test_add_emoji_500(self, _mock_open, reddit):
from prawcore.exceptions import ServerError
from requests.exceptions import HTTPError

http_response = mock.Mock()
http_response.status_code = 500

response = mock.Mock()
response.ok = True
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this line necessary?

response.raise_for_status = mock.Mock(
side_effect=HTTPError(response=http_response)
)

subreddit = reddit.subreddit("test")

lease_response = {
"s3UploadLease": {
"action": "",
"fields": [
{"name": "key", "value": "value"},
],
}
}

post_mock = mock.Mock(side_effect=[lease_response, None])

with mock.patch.object(subreddit._reddit, "post", post_mock):
subreddit._reddit._core._requestor._http.post = mock.Mock(return_value=response)
with pytest.raises(ServerError):
subreddit.emoji.add(name="emoji", image_path="/dev/null")


class TestSubredditEmoji(UnitTest):
def test_repr(self, reddit):
Expand Down
31 changes: 31 additions & 0 deletions tests/unit/models/reddit/test_subreddit.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,37 @@ def test_media_upload_500(self, _mock_post, connection_mock, mock_method, reddit
with pytest.raises(ServerError):
reddit.subreddit("test").submit_image("Test", "/dev/null")

@mock.patch("praw.models.reddit.subreddit.Path.open", new_callable=mock.mock_open)
def test_upload_style_asset_500(self, _mock_open, reddit):
from prawcore.exceptions import ServerError
from requests.exceptions import HTTPError

http_response = mock.Mock()
http_response.status_code = 500

response = mock.Mock()
response.ok = True
response.raise_for_status = mock.Mock(
side_effect=HTTPError(response=http_response)
)

subreddit = reddit.subreddit("test")
stylesheet = subreddit.stylesheet

lease_response = {
"s3UploadLease": {
"action": "",
"fields": [
{"name": "key", "value": "value"},
],
}
}

with mock.patch.object(subreddit._reddit, "post", return_value=lease_response):
subreddit._reddit._core._requestor._http.post = mock.Mock(return_value=response)
with pytest.raises(ServerError):
stylesheet._upload_style_asset(image_path="/dev/null", image_type="banner")

def test_notes_delete__invalid_args(self, reddit):
with pytest.raises(TypeError) as excinfo:
reddit.subreddit("SubTestBot1").mod.notes.delete(note_id="111")
Expand Down
34 changes: 34 additions & 0 deletions tests/unit/models/reddit/test_widgets.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from json import dumps
from unittest import mock

import pytest
from pytest import raises
Expand Down Expand Up @@ -81,3 +82,36 @@ def test_widget_mod(self, reddit):
widget = Widget(reddit, {})
assert isinstance(widget.mod, WidgetModeration)
assert widget.mod.widget == widget


class TestSubredditWidgetsModeration(UnitTest):
@mock.patch("praw.models.reddit.widgets.Path.open", new_callable=mock.mock_open)
def test_upload_image_500(self, _mock_open, reddit):
from prawcore.exceptions import ServerError
from requests.exceptions import HTTPError

http_response = mock.Mock()
http_response.status_code = 500

response = mock.Mock()
response.ok = True
response.raise_for_status = mock.Mock(
side_effect=HTTPError(response=http_response)
)

subreddit = reddit.subreddit("test")
widgets_mod = subreddit.widgets.mod

lease_response = {
"s3UploadLease": {
"action": "",
"fields": [
{"name": "key", "value": "value"},
],
}
}

with mock.patch.object(widgets_mod._reddit, "post", return_value=lease_response):
widgets_mod._reddit._core._requestor._http.post = mock.Mock(return_value=response)
with pytest.raises(ServerError):
widgets_mod.upload_image("/dev/null")
Loading