Files @ 3ddbe2a5f406
Branch filter:

Location: gimmecert/tests/test_decorators.py

branko
GC-47: Add support for Python 3.13:

- Simplify the option presence checks in functional tests to avoid
having to deal with differences in output between Python 3.13 and
older versions (similar checks are already in place for things like
key specification anyway). For more details, see this commit:

https://github.com/python/cpython/commit/c4a2e8a2c5188c3288d57b80852e92c83f46f6f3
# -*- coding: utf-8 -*-
#
# Copyright (C) 2018, 2020, 2024, 2025 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.abc

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.abc.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 myfunction1 in registered_functions
    assert myfunction2 in registered_functions


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