from django.core.urlresolvers import reverse

from taiga.base.utils import json
from taiga.userstorage.serializers import StorageEntrySerializer
from taiga.userstorage.models import StorageEntry

from tests import factories as f
from tests.utils import helper_test_http_method
from tests.utils import helper_test_http_method_and_count
from tests.utils import disconnect_signals, reconnect_signals

import pytest
pytestmark = pytest.mark.django_db


def setup_module(module):
    disconnect_signals()


def teardown_module(module):
    reconnect_signals()


@pytest.fixture
def data():
    m = type("Models", (object,), {})

    m.user1 = f.UserFactory.create()
    m.user2 = f.UserFactory.create()

    m.storage_user1 = f.StorageEntryFactory(owner=m.user1)
    m.storage_user2 = f.StorageEntryFactory(owner=m.user2)
    m.storage2_user2 = f.StorageEntryFactory(owner=m.user2)

    return m


def test_storage_retrieve(client, data):
    url = reverse('user-storage-detail', kwargs={"key": data.storage_user1.key})

    users = [
        None,
        data.user1,
        data.user2,
    ]

    results = helper_test_http_method(client, 'get', url, None, users)
    assert results == [404, 200, 404]


def test_storage_update(client, data):
    url = reverse('user-storage-detail', kwargs={"key": data.storage_user1.key})

    users = [
        None,
        data.user1,
        data.user2,
    ]

    storage_data = StorageEntrySerializer(data.storage_user1).data
    storage_data["key"] = "test"
    storage_data = json.dumps(storage_data)
    results = helper_test_http_method(client, 'put', url, storage_data, users)
    assert results == [401, 200, 201]


def test_storage_delete(client, data):
    url = reverse('user-storage-detail', kwargs={"key": data.storage_user1.key})

    users = [
        None,
        data.user1,
        data.user2,
    ]

    results = helper_test_http_method(client, 'delete', url, None, users)
    assert results == [401, 204, 404]


def test_storage_list(client, data):
    url = reverse('user-storage-list')

    users = [
        None,
        data.user1,
        data.user2,
    ]

    results = helper_test_http_method_and_count(client, 'get', url, None, users)
    assert results == [(200, 0), (200, 1), (200, 2)]


def test_storage_create(client, data):
    url = reverse('user-storage-list')

    users = [
        None,
        data.user1,
        data.user2,
    ]

    create_data = json.dumps({
        "key": "test",
        "value": {"test": "test-value"},
    })
    results = helper_test_http_method(client, 'post', url, create_data, users, lambda: StorageEntry.objects.all().delete())
    assert results == [401, 201, 201]


def test_storage_patch(client, data):
    url = reverse('user-storage-detail', kwargs={"key": data.storage_user1.key})

    users = [
        None,
        data.user1,
        data.user2,
    ]

    patch_data = json.dumps({"value": {"test": "test-value"}})
    results = helper_test_http_method(client, 'patch', url, patch_data, users)
    assert results == [401, 200, 201]
