from ...conf.test import override_dynamic_settings
from ..datadownloads import request_user_data_download
from ..test import AuthenticatedUserTestCase


class UserRequestDataDownload(AuthenticatedUserTestCase):
    def setUp(self):
        super().setUp()
        self.link = "/api/users/%s/request-data-download/" % self.user.pk

    def test_request_other_user_download_anonymous(self):
        """requests to api fails if user is anonymous"""
        self.logout_user()

        response = self.client.post(self.link)
        self.assertEqual(response.status_code, 403)
        self.assertEqual(
            response.json(), {"detail": "This action is not available to guests."}
        )

    def test_request_other_user_download(self):
        """requests to api fails if user tries to access other user"""
        other_user = self.get_superuser()
        link = "/api/users/%s/request-data-download/" % other_user.pk

        response = self.client.post(link)
        self.assertEqual(response.status_code, 403)
        self.assertEqual(
            response.json(),
            {"detail": "You can't request data downloads for other users."},
        )

    @override_dynamic_settings(allow_data_downloads=False)
    def test_request_download_disabled(self):
        """request to api fails if own data downloads are disabled"""
        response = self.client.post(self.link)
        self.assertEqual(response.status_code, 403)
        self.assertEqual(response.json(), {"detail": "You can't download your data."})

    def test_request_download_in_progress(self):
        """request to api fails if user has already requested data download"""
        request_user_data_download(self.user)

        response = self.client.post(self.link)
        self.assertEqual(response.status_code, 403)
        self.assertEqual(
            response.json(),
            {
                "detail": (
                    "You can't have more than one data download request at a single time."
                )
            },
        )

    def test_request_download(self):
        """request to api succeeds"""
        response = self.client.post(self.link)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.json(), {"detail": "ok"})

        self.assertTrue(self.user.datadownload_set.exists())