import arrow
import pytest
import pytz
from faker import Faker

from calendar_utils.models import Calendar

pytestmark = pytest.mark.django_db

fake = Faker()


@pytest.mark.freeze_time("2020-02-02")
def test_calendar__update_source(sample, mocker, snapshot):
    m_get = mocker.patch(
        "calendar_utils.models.requests.get", return_value=mocker.Mock(text=sample)
    )
    url = "http://foo"

    cal = Calendar.objects.create(url=url)
    cal.update_source()

    m_get.assert_called_once_with(url)
    cal.refresh_from_db()
    assert cal.source == sample
    assert cal.last_update == arrow.get("2020-02-02").datetime
    snapshot.assert_match(cal.past_events)
    snapshot.assert_match(cal.future_events)


@pytest.mark.freeze_time("2020-03-30")
def test_calendar__update_source__unchanged_source(sample, mocker):
    m_get = mocker.patch(
        "calendar_utils.models.requests.get", return_value=mocker.Mock(text=sample)
    )
    url = "http://foo"

    cal = Calendar.objects.create(url=url, source=sample)
    cal.update_source()

    m_get.assert_called_once_with(url)
    cal.refresh_from_db()
    assert cal.source == sample
    assert cal.last_update == arrow.get("2020-03-30").datetime
    assert cal.past_events is None
    assert cal.future_events is None


def test_calendar__save_and_load_events():
    past_events = [
        {
            "begin": fake.date_time(tzinfo=pytz.UTC),
            "end": fake.date_time(tzinfo=pytz.UTC),
        },
        {
            "begin": fake.date_time(tzinfo=pytz.UTC),
            "end": fake.date_time(tzinfo=pytz.UTC),
        },
    ]
    future_events = [
        {
            "begin": fake.date_time(tzinfo=pytz.UTC),
            "end": fake.date_time(tzinfo=pytz.UTC),
        },
    ]

    cal = Calendar.objects.create(
        url=fake.url(), past_events=past_events, future_events=future_events
    )

    cal.refresh_from_db()
    assert cal.past_events == past_events
    assert cal.future_events == future_events


def test_calendar__save_and_load_events__no_values():
    cal = Calendar.objects.create(url=fake.url())

    cal.refresh_from_db()
    assert cal.past_events is None
    assert cal.future_events is None