from flask import url_for

from lib.tests import ViewTestMixin, assert_status_with_message
from snakeeyes.blueprints.user.models import User


class TestDashboard(ViewTestMixin):
    def test_dashboard_page(self):
        self.login()
        response = self.client.get(url_for('admin.dashboard'))

        assert bytes('User'.encode('utf-8')) in response.data


class TestUsers(ViewTestMixin):
    def test_index_page(self):
        """ Index renders successfully. """
        self.login()
        response = self.client.get(url_for('admin.users'))

        assert response.status_code == 200

    def test_edit_page(self):
        """ Edit page renders successfully. """
        self.login()
        response = self.client.get(url_for('admin.users_edit', id=1))

        assert_status_with_message(200, response, 'admin@local.host')

    def test_edit_resource(self):
        """ Edit this resource successfully. """
        params = {
            'role': 'admin',
            'username': 'foo',
            'active': True
        }

        self.login()
        response = self.client.post(url_for('admin.users_edit', id=1),
                                    data=params, follow_redirects=True)

        assert_status_with_message(200, response,
                                   'User has been saved successfully.')

    def test_bulk_delete_nothing(self):
        """ Last admin account should not get deleted. """
        old_count = User.query.count()
        params = {
            'bulk_ids': [1],
            'scope': 'all_selected_items'
        }

        self.login()
        response = self.client.post(url_for('admin.users_bulk_delete'),
                                    data=params, follow_redirects=True)

        assert_status_with_message(200, response,
                                   '0 user(s) were scheduled to be deleted.')

        new_count = User.query.count()
        assert old_count == new_count

    def test_cancel_subscription(self, subscriptions, mock_stripe):
        """ User subscription gets cancelled. """
        user = User.find_by_identity('subscriber@local.host')
        params = {
            'id': user.id
        }

        self.login()
        response = self.client.post(url_for('admin.users_cancel_subscription'),
                                    data=params, follow_redirects=True)

        assert_status_with_message(200, response,
                                   'Subscription has been cancelled for Subby')
        assert user.cancelled_subscription_on is not None


class TestCoupon(ViewTestMixin):
    def test_index_page(self):
        """ Index renders successfully. """
        self.login()
        response = self.client.get(url_for('admin.coupons'))

        assert response.status_code == 200

    def test_new_page(self, coupons):
        """ New page renders successfully. """
        self.login()
        response = self.client.get(url_for('admin.coupons_new'))

        assert response.status_code == 200

    def test_new_resource(self, mock_stripe):
        """ Edit this resource successfully. """
        params = {
            'code': '1337',
            'duration': 'repeating',
            'percent_off': 5,
            'amount_off': None,
            'currency': 'usd',
            'redeem_by': None,
            'max_redemptions': 10,
            'duration_in_months': 5,
        }

        self.login()
        response = self.client.post(url_for('admin.coupons_new'),
                                    data=params, follow_redirects=True)

        assert_status_with_message(200, response,
                                   'Coupon has been created successfully.')

    def test_bulk_delete(self, coupons, mock_stripe):
        """ Resource gets bulk deleted. """
        params = {
            'bulk_ids': [1, 2, 3],
            'scope': 'all_selected_items'
        }

        self.login()
        response = self.client.post(url_for('admin.coupons_bulk_delete'),
                                    data=params, follow_redirects=True)

        assert_status_with_message(200, response,
                                   '{0} coupons(s)'
                                   ' were scheduled to be deleted.'.format(3))
