import json
import uuid

import pytest
from jsonschema import ValidationError

from app.schema_validation import validate
from app.service.service_callback_api_schema import (
    update_service_callback_api_schema,
)


def test_service_callback_api_schema_validates():
    under_test = {
        "url": "https://some_url.for_service",
        "bearer_token": "something_ten_chars",
        "updated_by_id": str(uuid.uuid4()),
    }

    validated = validate(under_test, update_service_callback_api_schema)
    assert validated == under_test


@pytest.mark.parametrize("url", ["not a url", "https not a url", "http://valid.com"])
def test_service_callback_api_schema_errors_for_url_not_valid_url(url):
    under_test = {"url": url, "bearer_token": "something_ten_chars", "updated_by_id": str(uuid.uuid4())}

    with pytest.raises(ValidationError) as e:
        validate(under_test, update_service_callback_api_schema)
    errors = json.loads(str(e.value)).get("errors")
    assert len(errors) == 1
    assert errors[0]["message"] == "url is not a valid https url"


def test_service_callback_api_schema_bearer_token_under_ten_char():
    under_test = {"url": "https://some_url.for_service", "bearer_token": "shorty", "updated_by_id": str(uuid.uuid4())}

    with pytest.raises(ValidationError) as e:
        validate(under_test, update_service_callback_api_schema)
    errors = json.loads(str(e.value)).get("errors")
    assert len(errors) == 1
    assert errors[0]["message"] == "bearer_token shorty is too short"
