#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright (C) 2016-2017 Gauvain Pocentek # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program 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 Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . from __future__ import print_function from __future__ import absolute_import import argparse import os import tempfile try: from contextlib import redirect_stderr # noqa: H302 except ImportError: from contextlib import contextmanager # noqa: H302 import sys @contextmanager def redirect_stderr(new_target): old_target, sys.stderr = sys.stderr, new_target yield sys.stderr = old_target try: import unittest except ImportError: import unittest2 as unittest import six from gitlab import cli import gitlab.v4.cli class TestCLI(unittest.TestCase): def test_what_to_cls(self): self.assertEqual("Foo", cli.what_to_cls("foo")) self.assertEqual("FooBar", cli.what_to_cls("foo-bar")) def test_cls_to_what(self): class Class(object): pass class TestClass(object): pass self.assertEqual("test-class", cli.cls_to_what(TestClass)) self.assertEqual("class", cli.cls_to_what(Class)) def test_die(self): fl = six.StringIO() with redirect_stderr(fl): with self.assertRaises(SystemExit) as test: cli.die("foobar") self.assertEqual(fl.getvalue(), "foobar\n") self.assertEqual(test.exception.code, 1) def test_parse_value(self): ret = cli._parse_value("foobar") self.assertEqual(ret, "foobar") ret = cli._parse_value(True) self.assertEqual(ret, True) ret = cli._parse_value(1) self.assertEqual(ret, 1) ret = cli._parse_value(None) self.assertEqual(ret, None) fd, temp_path = tempfile.mkstemp() os.write(fd, b"content") os.close(fd) ret = cli._parse_value("@%s" % temp_path) self.assertEqual(ret, "content") os.unlink(temp_path) fl = six.StringIO() with redirect_stderr(fl): with self.assertRaises(SystemExit) as exc: cli._parse_value("@/thisfileprobablydoesntexist") self.assertEqual( fl.getvalue(), "[Errno 2] No such file or directory:" " '/thisfileprobablydoesntexist'\n", ) self.assertEqual(exc.exception.code, 1) def test_base_parser(self): parser = cli._get_base_parser() args = parser.parse_args( ["-v", "-g", "gl_id", "-c", "foo.cfg", "-c", "bar.cfg"] ) self.assertTrue(args.verbose) self.assertEqual(args.gitlab, "gl_id") self.assertEqual(args.config_file, ["foo.cfg", "bar.cfg"]) class TestV4CLI(unittest.TestCase): def test_parse_args(self): parser = cli._get_parser(gitlab.v4.cli) args = parser.parse_args(["project", "list"]) self.assertEqual(args.what, "project") self.assertEqual(args.whaction, "list") def test_parser(self): parser = cli._get_parser(gitlab.v4.cli) subparsers = None for action in parser._actions: if type(action) == argparse._SubParsersAction: subparsers = action break self.assertIsNotNone(subparsers) self.assertIn("project", subparsers.choices) user_subparsers = None for action in subparsers.choices["project"]._actions: if type(action) == argparse._SubParsersAction: user_subparsers = action break self.assertIsNotNone(user_subparsers) self.assertIn("list", user_subparsers.choices) self.assertIn("get", user_subparsers.choices) self.assertIn("delete", user_subparsers.choices) self.assertIn("update", user_subparsers.choices) self.assertIn("create", user_subparsers.choices) self.assertIn("archive", user_subparsers.choices) self.assertIn("unarchive", user_subparsers.choices) actions = user_subparsers.choices["create"]._option_string_actions self.assertFalse(actions["--description"].required) user_subparsers = None for action in subparsers.choices["group"]._actions: if type(action) == argparse._SubParsersAction: user_subparsers = action break actions = user_subparsers.choices["create"]._option_string_actions self.assertTrue(actions["--name"].required)