from datetime import timedelta

from django.test import TestCase
from django.utils import timezone

from misago.conf import settings
from misago.readtracker.dates import get_cutoff_date, is_date_tracked


class MockUser(object):
    is_authenticated = True

    def __init__(self):
        self.joined_on = timezone.now()


class MockAnonymousUser(object):
    is_authenticated = False


class ReadTrackerDatesTests(TestCase):
    def test_get_cutoff_date_no_user(self):
        """get_cutoff_date utility works without user argument"""
        valid_cutoff_date = timezone.now() - timedelta(days=settings.MISAGO_READTRACKER_CUTOFF)
        returned_cutoff_date = get_cutoff_date()

        self.assertTrue(returned_cutoff_date > valid_cutoff_date)

    def test_get_cutoff_date_user(self):
        """get_cutoff_date utility works with user argument"""
        user = MockUser()

        valid_cutoff_date = timezone.now() - timedelta(days=settings.MISAGO_READTRACKER_CUTOFF)
        returned_cutoff_date = get_cutoff_date(user)

        self.assertTrue(returned_cutoff_date > valid_cutoff_date)
        self.assertEqual(returned_cutoff_date, user.joined_on)

    def test_get_cutoff_date_user(self):
        """passing anonymous user to get_cutoff_date has no effect"""
        user = MockAnonymousUser()

        valid_cutoff_date = timezone.now() - timedelta(days=settings.MISAGO_READTRACKER_CUTOFF)
        returned_cutoff_date = get_cutoff_date(user)

        self.assertTrue(returned_cutoff_date > valid_cutoff_date)

    def test_is_date_tracked(self):
        """is_date_tracked validates dates"""
        self.assertFalse(is_date_tracked(None, MockUser()))

        past_date = timezone.now() - timedelta(minutes=10)
        self.assertFalse(is_date_tracked(past_date, MockUser()))

        future_date = timezone.now() + timedelta(minutes=10)
        self.assertTrue(is_date_tracked(future_date, MockUser()))