from types import SimpleNamespace
from unittest import TestCase

from api.import_helpers import (
    objects_by_code_and_academic_term,
    objects_grouped_by_code,
)
from api.request_auth import validation_payload


class ImportHelperTests(TestCase):
    def test_duplicate_codes_remain_distinct_across_academic_terms(self):
        old_term_module = SimpleNamespace(id=10, code="FIN2014", academic_term_id=31)
        selected_term_module = SimpleNamespace(id=20, code="FIN2014", academic_term_id=43)

        by_term = objects_by_code_and_academic_term([old_term_module, selected_term_module])
        by_code = objects_grouped_by_code([old_term_module, selected_term_module])

        self.assertIs(by_term[("FIN2014", 31)], old_term_module)
        self.assertIs(by_term[("FIN2014", 43)], selected_term_module)
        self.assertEqual(by_code["FIN2014"], [old_term_module, selected_term_module])


class RequestAuthTests(TestCase):
    def test_multipart_auth_fields_fall_back_to_mayvins_headers(self):
        payload = validation_payload(
            {"import_file": object()},
            {"X-Mayvins-Timestamp": "123", "X-Mayvins-Signature": "signed"},
            "multipart/form-data; boundary=test",
        )

        self.assertEqual(payload["timestamp"], "123")
        self.assertEqual(payload["signature"], "signed")

    def test_multipart_body_auth_fields_take_precedence(self):
        payload = validation_payload(
            {"timestamp": "body-timestamp", "signature": "body-signature"},
            {
                "X-Mayvins-Timestamp": "header-timestamp",
                "X-Mayvins-Signature": "header-signature",
            },
            "multipart/form-data; boundary=test",
        )

        self.assertEqual(payload["timestamp"], "body-timestamp")
        self.assertEqual(payload["signature"], "body-signature")

    def test_json_payload_does_not_use_multipart_header_fallback(self):
        payload = validation_payload(
            {"value": 1},
            {"X-Mayvins-Timestamp": "123", "X-Mayvins-Signature": "signed"},
            "application/json",
        )

        self.assertNotIn("timestamp", payload)
        self.assertNotIn("signature", payload)
