Files @ 8eef1ef7f731
Branch filter:

Location: gimmecert/tests/test_decorators.py

branko
GC-11: Implemented decorator mechanism for registering subcommands:

- Added decorator that will register the provided functions.
- Added a simple interface function for fetching list of such
registered functions.
# -*- coding: utf-8 -*-
#
# Copyright (C) 2018 Branko Majic
#
# This file is part of Gimmecert.
#
# Gimmecert 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.
#
# Gimmecert 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
# Gimmecert.  If not, see <http://www.gnu.org/licenses/>.
#


import collections

import gimmecert.decorators

import pytest


def test_get_subcommand_parser_setup_functions_returns_list():

    registered_functions = gimmecert.decorators.get_subcommand_parser_setup_functions()

    assert isinstance(registered_functions, collections.Iterable)


def test_subcommand_parser_decorator_registers_function():

    @gimmecert.decorators.subcommand_parser
    def myfunction1(parser, subparsers):
        pass

    @gimmecert.decorators.subcommand_parser
    def myfunction2(parser, subparsers):
        pass

    registered_functions = gimmecert.decorators.get_subcommand_parser_setup_functions()

    assert registered_functions == [myfunction1, myfunction2]


def test_subcommand_parser_decorator_ensures_function_has_correct_signature():

    with pytest.raises(gimmecert.decorators.SetupSubcommandParserInvalidSignature):

        @gimmecert.decorators.subcommand_parser
        def invalid_signature_no_arguments():
            pass

    with pytest.raises(gimmecert.decorators.SetupSubcommandParserInvalidSignature):

        @gimmecert.decorators.subcommand_parser
        def invalid_signature_too_many_arguments(parser, subparsers, extra):
            pass