MT#33006 tracker: mantis command helper

Change-Id: If7d0bcea2f349662c4fee60b0e3244f4abb89a9a
pull/9/head
Victor Seva 3 years ago
parent 35ee83fa95
commit bb3cac6f9d

@ -14,6 +14,7 @@
# with this program. If not, see <http://www.gnu.org/licenses/>.
import filecmp
from difflib import unified_diff
from io import StringIO
from pathlib import Path
@ -32,3 +33,19 @@ def check_output(output_file, test_file):
for line in diff:
print(line, end="")
assert filecmp.cmp(output_file, test_file)
def check_stdoutput(stdout: StringIO, test_file: Path):
assert test_file.exists()
flag = False
with open(test_file) as test:
diff = unified_diff(
stdout.getvalue().splitlines(),
test.readlines(),
fromfile="stdout",
tofile=str(test_file.absolute()),
)
for line in diff:
flag = True
print(line, end="")
assert not flag

@ -0,0 +1,63 @@
# Copyright (C) 2022 The Sipwise Team - http://sipwise.com
#
# This program 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.
#
# 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 General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
from django.core.management.base import BaseCommand
from django.core.management.base import CommandError
from tracker.utils import mantis_get_issue
from tracker.utils import mantis_get_issue_id
from tracker.utils import mantis_get_target_releases
from tracker.utils import mantis_set_release_target
class Command(BaseCommand):
help = "mantis API helper"
def add_arguments(self, parser):
parser.add_argument(
"command",
choices=["get-issue", "set-target-release", "get-target-release"],
)
parser.add_argument("--mantis-id", type=int)
parser.add_argument("--value", type=str)
parser.add_argument("--force", action="store_true", default=False)
def get_mantis_id(self, **options):
if options["mantis_id"] is None:
raise CommandError("--mantis-id missing")
return options["mantis_id"]
def handle(self, *args, **options):
if options["command"] == "get-issue":
mantis_id = self.get_mantis_id(**options)
issue = mantis_get_issue(mantis_id)
self.stdout.write(f"{issue}")
elif options["command"] == "get-target-release":
mantis_id = self.get_mantis_id(**options)
issue = mantis_get_issue(mantis_id)
releases = mantis_get_target_releases(issue)
self.stdout.write(f"{releases}")
elif options["command"] == "set-target-release":
mantis_id = self.get_mantis_id(**options)
if options["value"] is None:
raise CommandError("--value missing")
res = mantis_set_release_target(
mantis_id, options["value"], options["force"]
)
if res:
issue = mantis_get_issue_id(res.json(), mantis_id)
releases = mantis_get_target_releases(issue)
self.stdout.write(f"{releases}")
else:
self.stdout.write("value already in target_release")

@ -13,19 +13,30 @@
# You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
from io import StringIO
from unittest.mock import call
from unittest.mock import patch
from django.conf import settings
from django.core.management import call_command
from django.core.management.base import CommandError
from django.test import TestCase
from .test_utils import FakeResponse
from .test_utils import FakeResponseFile
from .test_utils import set_target_release_value
from tracker import utils
from tracker.conf import MapperType
from tracker.exceptions import IssueNotFound
from tracker.models import TrackerMapper
FIXTURES_PATH = settings.BASE_DIR.joinpath("tracker", "fixtures")
DB_FILE = FIXTURES_PATH.joinpath("mapper.db")
MANTIS_ISSUE_JSON = FIXTURES_PATH.joinpath("mantis_issue.json")
MANTIS_ISSUE_ID = 36018
ISSUE_URL = "https://support.local/api/rest/issues/36018"
class createFakeBuildReleaseTest(TestCase):
class mapperImportTest(TestCase):
fixtures = ["test_models"]
def test_ok(self):
@ -38,3 +49,72 @@ class createFakeBuildReleaseTest(TestCase):
self.assertEqual(val, 10)
val = qs.filter(mapper_type=MapperType.TASK).count()
self.assertEqual(val, 10)
class mantisTest(TestCase):
def setUp(self):
self.out = StringIO()
def test_get_issue_ko(self):
with self.assertRaises(CommandError):
call_command("mantis", stdout=self.out)
@patch(
"tracker.utils.mantis_query",
return_value=FakeResponseFile(MANTIS_ISSUE_JSON),
)
def test_get_issue_wrong_id(self, mq):
wrong_id = 36017
with self.assertRaises(IssueNotFound):
call_command(
"mantis", "get-issue", "--mantis-id", wrong_id, stdout=self.out
)
calls = [
call("GET", f"https://support.local/api/rest/issues/{wrong_id}")
]
mq.assert_has_calls(calls)
@patch(
"tracker.utils.mantis_query",
return_value=FakeResponseFile(MANTIS_ISSUE_JSON),
)
def test_get_issue(self, mq):
call_command(
"mantis",
"get-issue",
"--mantis-id",
MANTIS_ISSUE_ID,
stdout=self.out,
)
calls = [
call(
"GET",
ISSUE_URL,
)
]
mq.assert_has_calls(calls)
@patch("tracker.utils.mantis_query")
def test_get_target_release(self, mq):
fake_issue_patched = utils.mantis_get_issue_id(
FakeResponseFile(MANTIS_ISSUE_JSON).json(), MANTIS_ISSUE_ID
)
fake_issues = {"issues": [fake_issue_patched]}
set_target_release_value(fake_issue_patched, "mr10.1,mr10.1.1")
mq.configure_mock(return_value=FakeResponse(fake_issues))
call_command(
"mantis",
"get-target-release",
"--mantis-id",
MANTIS_ISSUE_ID,
stdout=self.out,
)
calls = [
call(
"GET",
ISSUE_URL,
)
]
mq.assert_has_calls(calls)
mq.assert_called_once_with("GET", ISSUE_URL)
self.assertRegex(self.out.getvalue(), "[mr10.1, ,r10.1.1]")

Loading…
Cancel
Save