# -*- coding: utf-8 -*-
from unittest import mock

from bthlabs_jsonrpc_core import exceptions
import pytest

from bthlabs_jsonrpc_django import executor


@pytest.fixture
def fake_can_call():
    return mock.Mock()


def test_init(rf, fake_can_call):
    # Given
    request = rf.get('/')

    # When
    result = executor.DjangoExecutor(request, fake_can_call)

    # Then
    assert result.request == request
    assert result.can_call == fake_can_call


def test_enrich_args(rf, fake_can_call):
    # Given
    request = rf.get('/')

    the_executor = executor.DjangoExecutor(request, fake_can_call)

    # When
    result = the_executor.enrich_args(['spam'])

    # Then
    assert result == [request, 'spam']


def test_before_call(rf, fake_can_call):
    # Given
    request = rf.get('/')

    the_executor = executor.DjangoExecutor(request, fake_can_call)

    # When
    the_executor.before_call('test', ['spam'], {'spam': True})

    # Then
    fake_can_call.assert_called_with(request, 'test', ['spam'], {'spam': True})


def test_before_call_access_denied(rf, fake_can_call):
    # Given
    fake_can_call.return_value = False

    request = rf.get('/')

    the_executor = executor.DjangoExecutor(request, fake_can_call)

    # When
    try:
        the_executor.before_call('test', ['spam'], {'spam': True})
    except Exception as exception:
        assert isinstance(exception, exceptions.JSONRPCAccessDeniedError)
    else:
        assert False, 'No exception raised?'