import json
import mock
from zerver.lib.test_classes import ZulipTestCase
from typing import Dict

class TestVideoCall(ZulipTestCase):
    def setUp(self) -> None:
        super().setUp()
        user_profile = self.example_user('hamlet')
        self.login_user(user_profile)

    def test_create_video_call_success(self) -> None:
        with mock.patch('zerver.lib.actions.request_zoom_video_call_url', return_value={'join_url': 'example.com'}):
            result = self.client_get("/json/calls/create")
            self.assert_json_success(result)
            self.assertEqual(200, result.status_code)
            content = result.json()
            self.assertEqual(content['zoom_url'], 'example.com')

    def test_create_video_call_failure(self) -> None:
        with mock.patch('zerver.lib.actions.request_zoom_video_call_url', return_value=None):
            result = self.client_get("/json/calls/create")
            self.assert_json_success(result)
            self.assertEqual(200, result.status_code)
            content = result.json()
            self.assertEqual(content['zoom_url'], '')

    def test_create_video_request_success(self) -> None:
        class MockResponse:
            def __init__(self) -> None:
                self.status_code = 200

            def json(self) -> Dict[str, str]:
                return {"join_url": "example.com"}

            def raise_for_status(self) -> None:
                return None

        with mock.patch('requests.post', return_value=MockResponse()):
            result = self.client_get("/json/calls/create")
            self.assert_json_success(result)

    def test_create_video_request_http_error(self) -> None:
        class MockResponse:
            def __init__(self) -> None:
                self.status_code = 401

            def raise_for_status(self) -> None:
                raise Exception("Invalid request!")

        with mock.patch('requests.post', return_value=MockResponse()):
            result = self.client_get("/json/calls/create")
            self.assert_json_success(result)
            result_dict = json.loads(result.content.decode('utf-8'))

            # TODO: Arguably this is the wrong result for errors, but
            # in any case we should test it.
            self.assertEqual(result_dict['zoom_url'], '')

    def test_create_video_request(self) -> None:
        with mock.patch('requests.post'):
            result = self.client_get("/json/calls/create")
            self.assert_json_success(result)
