# -*- coding: utf-8 -*-
# Copyright (C) 2012-2015 by the Free Software Foundation, Inc.
#
# This file is part of Postorius.
#
# Postorius is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
# Postorius is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along with
# Postorius.  If not, see <http://www.gnu.org/licenses/>.
from django.test import TestCase

from postorius.forms import (ListNew,
    UserPreferences, DomainNew, ListSubscribe, ChangeSubscriptionForm)


class UserPreferencesTest(TestCase):

    def test_form_fields_valid(self):
        form = UserPreferences({
            'acknowledge_posts': 'True',
            'hide_address': 'True',
            'receive_list_copy': 'False',
            'receive_own_postings': 'False',
        })
        self.assertTrue(form.is_valid())

class DomainNewTest(TestCase):

    def test_form_fields_webhost(self):
        form = DomainNew({
            'mail_host': 'mailman.most-desirable.org',
            'web_host': 'http://mailman.most-desirable.org',
            'description': 'The Most Desirable organization',
            'contact_address': 'contact@mailman.most-desirable.org',
        })
        self.assertTrue(form.is_valid())

    def test_form_fields_webhost_invalid(self):
        form = DomainNew({
            'mail_host': 'mailman.most-desirable.org',
            'web_host': 'most-desirable',
            'description': 'The Most Desirable organization',
            'contact_address': 'contact@mailman.most-desirable.org',
        })
        self.assertFalse(form.is_valid())


class ListSubscribeTest(TestCase):
    def test_subscribe_works(self):
        user_emails = ['someone@example.com']
        form = ListSubscribe(user_emails, {
            'email' : 'someone@example.com',
            'display_name' : 'Someone',
        })
        self.assertTrue(form.is_valid())


    def test_subscribe_fails(self):
        user_emails = ['someone@example.com']
        form = ListSubscribe(user_emails, {
            'email' : 'notaemail',
            'display_name' : 'Someone',
        })
        self.assertFalse(form.is_valid())

    def test_subscribe_validates_email(self):
        user_emails = ['something']
        form = ListSubscribe(user_emails, {
            'email' : 'something',
            'display_name' : 'Someone',
        })
        self.assertFalse(form.is_valid())

class ChangeSubscriptionTest(TestCase):
    def test_subscription_changes_only_to_user_addresses(self):
        user_emails = ['one@example.com', 'two@example.com']
        form = ChangeSubscriptionForm(user_emails,
                                      {'email': 'abcd@d.com'})
        self.assertFalse(form.is_valid())

    def test_subscription_works(self):
        user_emails = ['one@example.com', 'two@example.com']
        form = ChangeSubscriptionForm(user_emails,
                                      {'email': 'two@example.com'})
        self.assertTrue(form.is_valid())


class ListNewTest(TestCase):

    def test_form_fields_list(self):
        form = ListNew({
            'listname': 'xyz',
            'mail_host': 'mailman.most-desirable.org',
            'list_owner': 'contact@mailman.most-desirable.org',
            'advertise': 'abcd',
            'description': 'The Most Desirable organization',
        })
        self.assertTrue(form.is_valid)

    def test_form_fields_list_invalid(self):
        form = ListNew({
             'listname': 'xy#z',
             'mail_host': 'mailman.most-desirable.org',
             'list_owner': 'mailman.most-desirable.org',
             'advertise': 'abcd',
             'description': 'The Most Desirable organization',
        })
        self.assertFalse(form.is_valid())
