# (c) cavaliba.com - tests / data / exporter view - unreachable broker

from unittest.mock import patch

from django.test import TestCase, override_settings
from django.urls import reverse

import app_home.cache as cache
from app_data.models import DataTask
from tests import helper


@override_settings(CAVALIBA_AUTH_MODE="unittest")
class SubmitExportBrokerDownTest(TestCase):
    """.delay() raises when the broker is unreachable rather than queueing.
    Since every export goes through it now, that must not surface as a 500: the
    task is marked FAILED with the reason and the handle is still returned, so
    the progress modal shows the failure."""

    def setUp(self):
        cache.clear()
        helper.add_admin_user(login="unittest")
        helper.add_schema(
            classname="brokerdown",
            field_definition={
                "mystring": {"dataformat": "string", "displayname": "MyString"},
            },
        )
        helper.add_instance(classname="brokerdown", keyname="bd-01", fields={"mystring": "one"})

    def _post(self):
        data = {"schema": "brokerdown", "format": "csv", "columns": "*"}
        with patch("app_data.tasks.task_export.delay", side_effect=OSError("broker unreachable")):
            return self.client.post(reverse("app_data:data_exporter"), data)

    def test_export_reports_a_failed_task_instead_of_raising(self):
        response = self._post()

        self.assertEqual(response.status_code, 200)
        task = DataTask.objects.get(handle=response.context["task_handle"])
        self.assertEqual(task.state, "FAILED")
        self.assertIn("broker unreachable", task.output["error"])

    def test_no_result_file_is_attached(self):
        response = self._post()

        task = DataTask.objects.get(handle=response.context["task_handle"])
        self.assertFalse(task.attachment)

    def test_modal_shows_the_failure_and_its_reason(self):
        response = self._post()
        handle = response.context["task_handle"]

        progress = self.client.get(reverse("app_data:data_exporter_progress", args=[handle]))

        self.assertContains(progress, "Export failed")
        self.assertContains(progress, "broker unreachable")
        self.assertContains(progress, "Close")
        self.assertNotContains(progress, "Abort")
