|
11 | 11 | import gitlab.base
|
12 | 12 | from gitlab import cli
|
13 | 13 | from gitlab.exceptions import GitlabError
|
| 14 | +from gitlab.mixins import CreateMixin, UpdateMixin |
| 15 | +from gitlab.types import RequiredOptional |
14 | 16 | from gitlab.v4 import cli as v4_cli
|
15 | 17 |
|
16 | 18 |
|
@@ -157,6 +159,65 @@ def test_v4_parser():
|
157 | 159 | assert actions["--name"].required
|
158 | 160 |
|
159 | 161 |
|
| 162 | +def test_extend_parser(): |
| 163 | + class ExceptionArgParser(argparse.ArgumentParser): |
| 164 | + def error(self, message): |
| 165 | + "Raise error instead of exiting on invalid arguments, to make testing easier" |
| 166 | + raise ValueError(message) |
| 167 | + |
| 168 | + class Fake: |
| 169 | + _id_attr = None |
| 170 | + |
| 171 | + class FakeManager(gitlab.base.RESTManager, CreateMixin, UpdateMixin): |
| 172 | + _obj_cls = Fake |
| 173 | + _create_attrs = RequiredOptional( |
| 174 | + required=("create",), |
| 175 | + optional=("opt_create",), |
| 176 | + exclusive=("create_a", "create_b"), |
| 177 | + ) |
| 178 | + _update_attrs = RequiredOptional( |
| 179 | + required=("update",), |
| 180 | + optional=("opt_update",), |
| 181 | + exclusive=("update_a", "update_b"), |
| 182 | + ) |
| 183 | + |
| 184 | + parser = ExceptionArgParser() |
| 185 | + with mock.patch.dict( |
| 186 | + "gitlab.v4.objects.__dict__", {"FakeManager": FakeManager}, clear=True |
| 187 | + ): |
| 188 | + v4_cli.extend_parser(parser) |
| 189 | + |
| 190 | + assert parser.parse_args(["fake", "create", "--create", "1"]) |
| 191 | + assert parser.parse_args(["fake", "create", "--create", "1", "--opt-create", "1"]) |
| 192 | + assert parser.parse_args(["fake", "create", "--create", "1", "--create-a", "1"]) |
| 193 | + assert parser.parse_args(["fake", "create", "--create", "1", "--create-b", "1"]) |
| 194 | + |
| 195 | + with pytest.raises(ValueError): |
| 196 | + # missing required "create" |
| 197 | + parser.parse_args(["fake", "create", "--opt_create", "1"]) |
| 198 | + |
| 199 | + with pytest.raises(ValueError): |
| 200 | + # both exclusive options |
| 201 | + parser.parse_args( |
| 202 | + ["fake", "create", "--create", "1", "--create-a", "1", "--create-b", "1"] |
| 203 | + ) |
| 204 | + |
| 205 | + assert parser.parse_args(["fake", "update", "--update", "1"]) |
| 206 | + assert parser.parse_args(["fake", "update", "--update", "1", "--opt-update", "1"]) |
| 207 | + assert parser.parse_args(["fake", "update", "--update", "1", "--update-a", "1"]) |
| 208 | + assert parser.parse_args(["fake", "update", "--update", "1", "--update-b", "1"]) |
| 209 | + |
| 210 | + with pytest.raises(ValueError): |
| 211 | + # missing required "update" |
| 212 | + parser.parse_args(["fake", "update", "--opt_update", "1"]) |
| 213 | + |
| 214 | + with pytest.raises(ValueError): |
| 215 | + # both exclusive options |
| 216 | + parser.parse_args( |
| 217 | + ["fake", "update", "--update", "1", "--update-a", "1", "--update-b", "1"] |
| 218 | + ) |
| 219 | + |
| 220 | + |
160 | 221 | @pytest.mark.skipif(sys.version_info < (3, 8), reason="added in 3.8")
|
161 | 222 | def test_legacy_display_without_fields_warns(fake_object_no_id):
|
162 | 223 | printer = v4_cli.LegacyPrinter()
|
|
0 commit comments