# -*- coding: utf-8 -*-
from hapic import Hapic
from hapic.decorator import DECORATION_ATTRIBUTE_NAME
from tests.base import Base


class TestHapic(Base):
    def test_unit__decoration__ok__simple_function(self):
        hapic = Hapic()

        @hapic.with_api_doc()
        def controller_a():
            pass

        token = getattr(controller_a, DECORATION_ATTRIBUTE_NAME, None)
        assert token

        assert hapic.controllers
        assert 1 == len(hapic.controllers)
        reference = hapic.controllers[0].reference

        assert token == reference.token
        assert controller_a == reference.wrapper
        assert controller_a != reference.wrapped

    def test_unit__decoration__ok__method(self):
        hapic = Hapic()

        class MyControllers(object):
            @hapic.with_api_doc()
            def controller_a(self):
                pass

        my_controllers = MyControllers()
        class_method_token = getattr(
            MyControllers.controller_a,
            DECORATION_ATTRIBUTE_NAME,
            None,
        )
        assert class_method_token
        instance_method_token = getattr(
            my_controllers.controller_a,
            DECORATION_ATTRIBUTE_NAME,
            None,
        )
        assert instance_method_token

        assert hapic.controllers
        assert 1 == len(hapic.controllers)
        reference = hapic.controllers[0].reference

        assert class_method_token == reference.token
        assert instance_method_token == reference.token

        assert MyControllers.controller_a == reference.wrapper
        assert MyControllers.controller_a != reference.wrapped
        assert my_controllers.controller_a != reference.wrapper
        assert my_controllers.controller_a != reference.wrapped