Files

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

212 lines
6.5 KiB
Python
Raw Permalink Normal View History

2016-04-08 17:31:00 -04:00
import sys
2014-04-04 22:37:17 -07:00
import unittest
2019-10-06 12:04:51 -04:00
2021-12-18 14:41:33 -05:00
from unittest import mock
2014-04-04 22:37:17 -07:00
from pydiscourse import client
2018-10-29 18:02:58 -04:00
2016-04-08 17:31:00 -04:00
if sys.version_info < (3,):
2018-10-29 18:02:58 -04:00
2016-04-08 17:31:00 -04:00
def b(x):
return x
2018-10-29 18:02:58 -04:00
2016-04-08 17:31:00 -04:00
else:
import codecs
2018-10-29 18:02:58 -04:00
2016-04-08 17:31:00 -04:00
def b(x):
return codecs.latin_1_encode(x)[0]
2014-04-04 22:37:17 -07:00
2014-04-29 14:27:47 -07:00
def prepare_response(request):
# we need to mocked response to look a little more real
request.return_value = mock.MagicMock(
headers={"content-type": "application/json; charset=utf-8"}
)
2014-04-04 22:37:17 -07:00
class ClientBaseTestCase(unittest.TestCase):
2016-04-07 22:47:12 -04:00
"""
"""
2014-04-04 22:37:17 -07:00
def setUp(self):
2016-04-08 17:31:00 -04:00
self.host = "http://testhost"
2014-04-04 22:37:17 -07:00
self.api_username = "testuser"
self.api_key = "testkey"
self.client = client.DiscourseClient(self.host, self.api_username, self.api_key)
def assertRequestCalled(self, request, verb, url, **params):
self.assertTrue(request.called)
args, kwargs = request.call_args
self.assertEqual(args[0], verb)
self.assertEqual(args[1], self.host + url)
2019-12-04 16:16:57 -05:00
headers = kwargs["headers"]
self.assertEqual(headers.pop("Api-Username"), self.api_username)
self.assertEqual(headers.pop("Api-Key"), self.api_key)
2016-09-08 14:38:22 -04:00
if verb == "GET":
2019-12-04 16:16:57 -05:00
self.assertEqual(kwargs["params"], params)
2014-04-04 22:37:17 -07:00
2016-04-08 17:31:00 -04:00
class TestClientRequests(ClientBaseTestCase):
"""
Tests for common request handling
"""
@mock.patch("pydiscourse.client.requests")
def test_empty_content_http_ok(self, mocked_requests):
"""Empty content should not raise error
Critical to test against *bytestrings* rather than unicode
"""
mocked_response = mock.MagicMock()
mocked_response.content = b(" ")
mocked_response.status_code = 200
mocked_response.headers = {"content-type": "text/plain; charset=utf-8"}
assert "content-type" in mocked_response.headers
mocked_requests.request = mock.MagicMock()
mocked_requests.request.return_value = mocked_response
resp = self.client._request("GET", "/users/admin/1/unsuspend", {})
self.assertIsNone(resp)
2014-04-04 22:37:17 -07:00
@mock.patch("requests.request")
class TestUser(ClientBaseTestCase):
def test_user(self, request):
2014-04-29 14:27:47 -07:00
prepare_response(request)
2014-04-04 22:37:17 -07:00
self.client.user("someuser")
self.assertRequestCalled(request, "GET", "/users/someuser.json")
def test_create_user(self, request):
2014-04-29 14:27:47 -07:00
prepare_response(request)
2014-04-21 16:57:13 -04:00
self.client.create_user(
"Test User", "testuser", "test@example.com", "notapassword"
)
self.assertEqual(request.call_count, 2)
2018-10-29 18:02:58 -04:00
2014-04-21 16:57:13 -04:00
# XXX incomplete
2014-04-04 22:37:17 -07:00
def test_update_email(self, request):
2014-04-29 14:27:47 -07:00
prepare_response(request)
2014-04-04 22:37:17 -07:00
email = "test@example.com"
self.client.update_email("someuser", email)
self.assertRequestCalled(
request, "PUT", "/users/someuser/preferences/email", email=email
)
def test_update_user(self, request):
2014-04-29 14:27:47 -07:00
prepare_response(request)
2014-04-04 22:37:17 -07:00
self.client.update_user("someuser", a="a", b="b")
self.assertRequestCalled(request, "PUT", "/users/someuser", a="a", b="b")
def test_update_username(self, request):
2014-04-29 14:27:47 -07:00
prepare_response(request)
2014-04-04 22:37:17 -07:00
self.client.update_username("someuser", "newname")
2016-04-07 22:47:12 -04:00
self.assertRequestCalled(
request, "PUT", "/users/someuser/preferences/username", username="newname"
)
2016-04-07 22:47:12 -04:00
def test_by_external_id(self, request):
prepare_response(request)
self.client.by_external_id(123)
self.assertRequestCalled(request, "GET", "/users/by-external/123")
2014-04-04 22:37:17 -07:00
def test_suspend_user(self, request):
prepare_response(request)
self.client.suspend(123, 1, "Testing")
self.assertRequestCalled(
request, "PUT", "/admin/users/123/suspend", duration=1, reason="Testing"
)
def test_unsuspend_user(self, request):
prepare_response(request)
2016-04-08 13:47:43 -04:00
self.client.unsuspend(123)
self.assertRequestCalled(request, "PUT", "/admin/users/123/unsuspend")
2016-06-10 11:46:56 -03:00
def test_user_bagdes(self, request):
prepare_response(request)
self.client.user_badges("username")
self.assertRequestCalled(
request, "GET", "/user-badges/{}.json".format("username")
2018-10-29 18:02:58 -04:00
)
2016-06-10 11:46:56 -03:00
2014-04-04 22:37:17 -07:00
@mock.patch("requests.request")
class TestTopics(ClientBaseTestCase):
def test_hot_topics(self, request):
2014-04-29 14:27:47 -07:00
prepare_response(request)
2014-04-04 22:37:17 -07:00
self.client.hot_topics()
self.assertRequestCalled(request, "GET", "/hot.json")
def test_latest_topics(self, request):
2014-04-29 14:27:47 -07:00
prepare_response(request)
2014-04-04 22:37:17 -07:00
self.client.latest_topics()
self.assertRequestCalled(request, "GET", "/latest.json")
def test_new_topics(self, request):
2014-04-29 14:27:47 -07:00
prepare_response(request)
2014-04-04 22:37:17 -07:00
self.client.new_topics()
self.assertRequestCalled(request, "GET", "/new.json")
def test_topic(self, request):
2014-04-29 14:27:47 -07:00
prepare_response(request)
2015-04-22 10:51:39 -07:00
self.client.topic("some-test-slug", 22)
self.assertRequestCalled(request, "GET", "/t/some-test-slug/22.json")
2014-04-04 22:37:17 -07:00
def test_topics_by(self, request):
2014-04-29 14:27:47 -07:00
prepare_response(request)
2014-04-04 22:37:17 -07:00
r = self.client.topics_by("someuser")
self.assertRequestCalled(request, "GET", "/topics/created-by/someuser.json")
self.assertEqual(r, request().json()["topic_list"]["topics"])
def invite_user_to_topic(self, request):
2014-04-29 14:27:47 -07:00
prepare_response(request)
2014-04-04 22:37:17 -07:00
email = "test@example.com"
self.client.invite_user_to_topic(email, 22)
self.assertRequestCalled(
request, "POST", "/t/22/invite.json", email=email, topic_id=22
)
2019-04-21 13:52:14 -04:00
@mock.patch("pydiscourse.client.requests.request")
2014-04-04 22:37:17 -07:00
class MiscellaneousTests(ClientBaseTestCase):
def test_search(self, request):
2014-04-29 14:27:47 -07:00
prepare_response(request)
2014-04-04 22:37:17 -07:00
self.client.search("needle")
self.assertRequestCalled(request, "GET", "/search.json", term="needle")
def test_categories(self, request):
2014-04-29 14:27:47 -07:00
prepare_response(request)
2014-04-04 22:37:17 -07:00
r = self.client.categories()
self.assertRequestCalled(request, "GET", "/categories.json")
self.assertEqual(r, request().json()["category_list"]["categories"])
2016-04-07 22:47:12 -04:00
2014-12-19 01:22:13 +01:00
def test_users(self, request):
prepare_response(request)
2016-04-07 22:47:12 -04:00
self.client.users()
2014-12-19 01:22:13 +01:00
self.assertRequestCalled(request, "GET", "/admin/users/list/active.json")
2016-06-10 10:59:03 -03:00
def test_badges(self, request):
prepare_response(request)
self.client.badges()
self.assertRequestCalled(request, "GET", "/admin/badges.json")
def test_grant_badge_to(self, request):
prepare_response(request)
self.client.grant_badge_to("username", 1)
2016-09-08 14:38:22 -04:00
self.assertRequestCalled(
request, "POST", "/user_badges", username="username", badge_id=1
)