1import pickle
2
3import pytest
4from praw.exceptions import ClientException
5from praw.models import Submission
6
7from ... import UnitTest
8
9
10class TestSubmission(UnitTest):
11    def test_equality(self):
12        submission1 = Submission(self.reddit, _data={"id": "dummy1", "n": 1})
13        submission2 = Submission(self.reddit, _data={"id": "Dummy1", "n": 2})
14        submission3 = Submission(self.reddit, _data={"id": "dummy3", "n": 2})
15        assert submission1 == submission1
16        assert submission2 == submission2
17        assert submission3 == submission3
18        assert submission1 == submission2
19        assert submission2 != submission3
20        assert submission1 != submission3
21        assert "dummy1" == submission1
22        assert submission2 == "dummy1"
23
24    def test_construct_failure(self):
25        message = "Exactly one of `id`, `url`, or `_data` must be provided."
26        with pytest.raises(TypeError) as excinfo:
27            Submission(self.reddit)
28        assert str(excinfo.value) == message
29
30        with pytest.raises(TypeError) as excinfo:
31            Submission(self.reddit, id="dummy", url="dummy")
32        assert str(excinfo.value) == message
33
34        with pytest.raises(TypeError) as excinfo:
35            Submission(self.reddit, "dummy", _data={"id": "dummy"})
36        assert str(excinfo.value) == message
37
38        with pytest.raises(TypeError) as excinfo:
39            Submission(self.reddit, url="dummy", _data={"id": "dummy"})
40        assert str(excinfo.value) == message
41
42        with pytest.raises(TypeError) as excinfo:
43            Submission(self.reddit, "dummy", "dummy", {"id": "dummy"})
44        assert str(excinfo.value) == message
45
46    def test_construct_from_url(self):
47        assert Submission(self.reddit, url="http://my.it/2gmzqe") == "2gmzqe"
48
49    def test_fullname(self):
50        submission = Submission(self.reddit, _data={"id": "dummy"})
51        assert submission.fullname == "t3_dummy"
52
53    def test_hash(self):
54        submission1 = Submission(self.reddit, _data={"id": "dummy1", "n": 1})
55        submission2 = Submission(self.reddit, _data={"id": "Dummy1", "n": 2})
56        submission3 = Submission(self.reddit, _data={"id": "dummy3", "n": 2})
57        assert hash(submission1) == hash(submission1)
58        assert hash(submission2) == hash(submission2)
59        assert hash(submission3) == hash(submission3)
60        assert hash(submission1) == hash(submission2)
61        assert hash(submission2) != hash(submission3)
62        assert hash(submission1) != hash(submission3)
63
64    def test_id_from_url(self):
65        urls = [
66            "http://my.it/2gmzqe",
67            "https://redd.it/2gmzqe",
68            "https://redd.it/2gmzqe/",
69            "http://reddit.com/comments/2gmzqe",
70            "https://www.reddit.com/r/redditdev/comments/2gmzqe/"
71            "praw_https_enabled_praw_testing_needed/",
72        ]
73        for url in urls:
74            assert Submission.id_from_url(url) == "2gmzqe", url
75
76    def test_id_from_url__invalid_urls(self):
77        urls = [
78            "",
79            "1",
80            "/",
81            "my.it/2gmzqe",
82            "http://my.it/_",
83            "https://redd.it/_/",
84            "http://reddit.com/comments/_/2gmzqe",
85            "https://reddit.com/r/wallpapers/",
86            "https://reddit.com/r/wallpapers",
87        ]
88        for url in urls:
89            with pytest.raises(ClientException):
90                Submission.id_from_url(url)
91
92    def test_pickle(self):
93        submission = Submission(self.reddit, _data={"id": "dummy"})
94        for level in range(pickle.HIGHEST_PROTOCOL + 1):
95            other = pickle.loads(pickle.dumps(submission, protocol=level))
96            assert submission == other
97
98    def test_repr(self):
99        submission = Submission(self.reddit, id="2gmzqe")
100        assert repr(submission) == "Submission(id='2gmzqe')"
101
102    def test_str(self):
103        submission = Submission(self.reddit, _data={"id": "dummy"})
104        assert str(submission) == "dummy"
105
106    def test_shortlink(self):
107        submission = Submission(self.reddit, _data={"id": "dummy"})
108        assert submission.shortlink == "https://redd.it/dummy"
109