b34edfe
From 2bd726d20f3e5d1502a2191d0d263d0b6132982b Mon Sep 17 00:00:00 2001
b34edfe
From: =?UTF-8?q?Ond=C5=99ej=20Nosek?= <onosek@redhat.com>
b34edfe
Date: Thu, 12 Oct 2023 01:40:36 +0200
b48b289
Subject: [PATCH] Unittests for "Undo rpmautospec processing"
b34edfe
MIME-Version: 1.0
b34edfe
Content-Type: text/plain; charset=UTF-8
b34edfe
Content-Transfer-Encoding: 8bit
b34edfe
b34edfe
Merges: https://pagure.io/rpkg/pull-request/699
b34edfe
Signed-off-by: Ondřej Nosek <onosek@redhat.com>
b34edfe
---
b34edfe
 Jenkinsfile                                   |  2 +-
b34edfe
 jenkins_test.dockerfile                       |  3 +-
b34edfe
 pyrpkg/utils.py                               |  6 +--
b34edfe
 tests/fixtures/docpkg/docpkg-rpmautospec.spec | 53 +++++++++++++++++++
b34edfe
 tests/test_cli.py                             | 40 +++++++-------
b34edfe
 tests/test_utils.py                           | 36 ++++++++++++-
b34edfe
 6 files changed, 116 insertions(+), 24 deletions(-)
b34edfe
 create mode 100644 tests/fixtures/docpkg/docpkg-rpmautospec.spec
b34edfe
b48b289
diff --git a/Jenkinsfile b/Jenkinsfile
b48b289
index 7b6742f..e6d6394 100644
b48b289
--- a/Jenkinsfile
b48b289
+++ b/Jenkinsfile
b48b289
@@ -50,7 +50,7 @@ git fetch proposed
b48b289
 git checkout "origin/$params.BRANCH_TO"
b48b289
 git merge --no-ff "proposed/$params.BRANCH" -m "Merge PR"
b48b289
 
b48b289
-podman run --rm -v .:/src:Z quay.io/exd-guild-source-tools/rpkg-test:latest tox -e py36,py39,flake8,bandit --workdir /tmp/tox ${TOX_POSARGS}
b48b289
+podman run --rm -v .:/src:Z quay.io/exd-guild-source-tools/rpkg-test:latest tox -e py36,py39,py311,flake8,bandit --workdir /tmp/tox ${TOX_POSARGS}
b48b289
 # disabled py27 environment for now; keep just flake8 for Python 2
b48b289
 podman run --rm -v .:/src:Z quay.io/exd-guild-source-tools/rpkg-test-py2:latest tox -e flake8python2 --workdir /tmp/tox ${TOX_POSARGS}
b48b289
                         """
b48b289
diff --git a/jenkins_test.dockerfile b/jenkins_test.dockerfile
b48b289
index df8762e..d217a55 100644
b48b289
--- a/jenkins_test.dockerfile
b48b289
+++ b/jenkins_test.dockerfile
b48b289
@@ -1,4 +1,4 @@
b48b289
-FROM fedora:37
b48b289
+FROM fedora:38
b48b289
 LABEL \
b48b289
     name="rpkg test" \
b48b289
     description="Run tests using tox with Python 3" \
b48b289
@@ -9,6 +9,7 @@ RUN dnf -y update && dnf -y install \
b48b289
         python3-devel \
b48b289
         python3-openidc-client \
b48b289
         python3-libmodulemd \
b48b289
+        python3-rpmautospec \
b48b289
         python3-setuptools \
b48b289
         rpmlint \
b48b289
         rpm-build \
b34edfe
diff --git a/pyrpkg/utils.py b/pyrpkg/utils.py
b34edfe
index f3c8b25..fc01c7d 100644
b34edfe
--- a/pyrpkg/utils.py
b34edfe
+++ b/pyrpkg/utils.py
b34edfe
@@ -104,7 +104,7 @@ def log_result(log_func, result, level=0, indent=2):
b34edfe
     elif isinstance(result, dict):
b34edfe
         for key, value in result.items():
b34edfe
             _log_value(log_func, key, level, indent, ':')
b34edfe
-            log_result(log_func, value, level+1)
b34edfe
+            log_result(log_func, value, level + 1)
b34edfe
     else:
b34edfe
         _log_value(log_func, result, level, indent)
b34edfe
 
b34edfe
@@ -348,9 +348,9 @@ def _replace_lines(lines, startline, endline, replacement_lines=None, strip_endl
b34edfe
     else:
b34edfe
         # rpmautospec adds an empty line after the end
b34edfe
         # we want to remove it, but only if it is actually empty
b34edfe
-        if strip_endline and lines[end+1] == "\n":
b34edfe
+        if strip_endline and lines[end + 1] == "\n":
b34edfe
             end += 1
b34edfe
-        lines = lines[:start] + replacement_lines + lines[end+1:]
b34edfe
+        lines = lines[:start] + replacement_lines + lines[end + 1:]
b34edfe
         return lines, True
b34edfe
 
b34edfe
 
b34edfe
diff --git a/tests/fixtures/docpkg/docpkg-rpmautospec.spec b/tests/fixtures/docpkg/docpkg-rpmautospec.spec
b34edfe
new file mode 100644
b34edfe
index 0000000..5974b57
b34edfe
--- /dev/null
b34edfe
+++ b/tests/fixtures/docpkg/docpkg-rpmautospec.spec
b34edfe
@@ -0,0 +1,53 @@
b34edfe
+## START: Set by rpmautospec
b34edfe
+## (rpmautospec version 0.3.5)
b34edfe
+## RPMAUTOSPEC: autorelease, autochangelog
b34edfe
+%define autorelease(e:s:pb:n) %{?-p:0.}%{lua:
b34edfe
+    release_number = 8;
b34edfe
+    base_release_number = tonumber(rpm.expand("%{?-b*}%{!?-b:1}"));
b34edfe
+    print(release_number + base_release_number - 1);
b34edfe
+}%{?-e:.%{-e*}}%{?-s:.%{-s*}}%{!?-n:%{?dist}}
b34edfe
+## END: Set by rpmautospec
b34edfe
+
b34edfe
+# autogenerated specfile
b34edfe
+Summary: Dummy summary
b34edfe
+Name: docpkg-rpmautospec
b34edfe
+Version: 0.2
b34edfe
+Release: 1%{dist}
b34edfe
+License: GPL
b34edfe
+Group: Applications/Productivity
b34edfe
+
b34edfe
+BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
b34edfe
+Source0: hello-world.txt
b34edfe
+Source1: docpkg.tar.gz
b34edfe
+Source2: source-without-extension
b34edfe
+# added empty dir just to test import srpm `fedpkg import`. It should skip the dir.
b34edfe
+Source3: EMPTY_DIR
b34edfe
+
b34edfe
+%description
b34edfe
+This is a dummy description.
b34edfe
+
b34edfe
+%prep
b34edfe
+cp %{SOURCE0} .
b34edfe
+
b34edfe
+%build
b34edfe
+
b34edfe
+%clean
b34edfe
+rm -rf $$RPM_BUILD_ROOT
b34edfe
+%install
b34edfe
+rm -rf $RPM_BUILD_ROOT
b34edfe
+mkdir $RPM_BUILD_ROOT
b34edfe
+mkdir -p $RPM_BUILD_ROOT/usr/share/doc
b34edfe
+cp %{SOURCE0} $RPM_BUILD_ROOT/usr/share/doc/hello-world.txt
b34edfe
+
b34edfe
+%files
b34edfe
+%doc "/usr/share/doc/hello-world.txt"
b34edfe
+
b34edfe
+%changelog
b34edfe
+## START: Generated by rpmautospec
b34edfe
+* Sun Jan  1 2006 tester <tester@example.com> - 0.2-1
b34edfe
+- - New release 0.2-1
b34edfe
+
b34edfe
+* Sun Jan  1 2006 John Doe <jdoe@example.com> - 0.2-1
b34edfe
+- Initial version
b34edfe
+
b34edfe
+## END: Generated by rpmautospec
b34edfe
diff --git a/tests/test_cli.py b/tests/test_cli.py
b34edfe
index f2e68df..3d90f36 100644
b34edfe
--- a/tests/test_cli.py
b34edfe
+++ b/tests/test_cli.py
b34edfe
@@ -1706,10 +1706,10 @@ class TestFailureImportSrpm(CliTestCase):
b34edfe
 class TestImportSrpm(LookasideCacheMock, CliTestCase):
b34edfe
 
b34edfe
     @staticmethod
b34edfe
-    def build_srpm(srcrpmdir):
b34edfe
+    def build_srpm(srcrpmdir, specfile_name='docpkg.spec'):
b34edfe
         """Build a fake SRPM used by this test case"""
b34edfe
         docpkg_dir = os.path.join(fixtures_dir, 'docpkg')
b34edfe
-        specfile = os.path.join(docpkg_dir, 'docpkg.spec')
b34edfe
+        specfile = os.path.join(docpkg_dir, specfile_name)
b34edfe
         rpmbuild = [
b34edfe
             'rpmbuild', '-bs',
b34edfe
             '--define', '_topdir {0}'.format(srcrpmdir),
b34edfe
@@ -1735,6 +1735,9 @@ class TestImportSrpm(LookasideCacheMock, CliTestCase):
b34edfe
 
b34edfe
         self.srcrpmdir = tempfile.mkdtemp(prefix='test-import-srpm-topdir-')
b34edfe
         self.srpm_file = TestImportSrpm.build_srpm(self.srcrpmdir)
b34edfe
+        self.srpm_file_rpmautospec = TestImportSrpm.build_srpm(
b34edfe
+            self.srcrpmdir,
b34edfe
+            specfile_name='docpkg-rpmautospec.spec')
b34edfe
 
b34edfe
         self.chaos_repo = tempfile.mkdtemp(prefix='rpkg-tests-chaos-repo-')
b34edfe
         cmds = (
b34edfe
@@ -1827,40 +1830,29 @@ class TestImportSrpm(LookasideCacheMock, CliTestCase):
b34edfe
         self.assertFilesExist(['package.rpmlintrc'], search_dir=self.chaos_repo)
b34edfe
         self.assertFilesNotExist(['the_file_is_not_in_reserved.yaml'], search_dir=self.chaos_repo)
b34edfe
 
b34edfe
-    @patch('pyrpkg.spec_file_processed_by_rpmautospec')
b34edfe
-    def test_import_srpm_not_processed_by_rpmautospec(self, rpmautospec_processed):
b34edfe
+    def test_import_srpm_not_processed_by_rpmautospec(self):
b34edfe
         cli_cmd = ['rpkg', '--path', self.chaos_repo, '--name', 'docpkg',
b34edfe
                    'import', '--skip-diffs', self.srpm_file]
b34edfe
 
b34edfe
-        rpmautospec_processed.return_value = False
b34edfe
         with patch('sys.argv', new=cli_cmd):
b34edfe
             cli = self.new_cli()
b34edfe
             with patch('pyrpkg.lookaside.CGILookasideCache.upload', self.lookasidecache_upload):
b34edfe
                 cli.import_srpm()  # no exception should be raised
b34edfe
-            rpmautospec_processed.assert_called_once()
b34edfe
 
b34edfe
-    @patch('pyrpkg.spec_file_processed_by_rpmautospec')
b34edfe
-    def test_import_srpm_processed_by_rpmautospec(self, rpmautospec_processed):
b34edfe
+    def test_import_srpm_processed_by_rpmautospec(self):
b34edfe
         cli_cmd = ['rpkg', '--path', self.chaos_repo, '--name', 'docpkg',
b34edfe
-                   'import', '--skip-diffs', self.srpm_file]
b34edfe
+                   'import', '--skip-diffs', self.srpm_file_rpmautospec]
b34edfe
 
b34edfe
-        rpmautospec_processed.return_value = True
b34edfe
         with patch('sys.argv', new=cli_cmd):
b34edfe
             cli = self.new_cli()
b34edfe
             with patch('pyrpkg.lookaside.CGILookasideCache.upload', self.lookasidecache_upload):
b34edfe
-                six.assertRaisesRegex(
b34edfe
-                    self,
b34edfe
-                    rpkgError,
b34edfe
-                    'SRPM was processed by rpmautospec',
b34edfe
-                    cli.import_srpm)
b34edfe
-            rpmautospec_processed.assert_called_once()
b34edfe
+                cli.import_srpm()
b34edfe
 
b34edfe
-    @patch('pyrpkg.spec_file_processed_by_rpmautospec')
b34edfe
+    @patch('pyrpkg.spec_file_undo_rpmautospec')
b34edfe
     def test_import_srpm_processed_by_rpmautospec_allowed(self, rpmautospec_processed):
b34edfe
         cli_cmd = ['rpkg', '--path', self.chaos_repo, '--name', 'docpkg',
b34edfe
                    'import', '--skip-diffs', self.srpm_file]
b34edfe
 
b34edfe
-        rpmautospec_processed.return_value = True
b34edfe
         with patch('sys.argv', new=cli_cmd):
b34edfe
             cli = self.new_cli()
b34edfe
             cli.cmd.allow_pre_generated_srpm = True
b34edfe
@@ -1868,6 +1860,18 @@ class TestImportSrpm(LookasideCacheMock, CliTestCase):
b34edfe
                 cli.import_srpm()  # no exception should be raised
b34edfe
             rpmautospec_processed.assert_not_called()
b34edfe
 
b34edfe
+    @patch('pyrpkg.spec_file_undo_rpmautospec')
b34edfe
+    def test_import_srpm_processed_by_rpmautospec_not_allowed(self, rpmautospec_processed):
b34edfe
+        cli_cmd = ['rpkg', '--path', self.chaos_repo, '--name', 'docpkg',
b34edfe
+                   'import', '--skip-diffs', self.srpm_file]
b34edfe
+
b34edfe
+        with patch('sys.argv', new=cli_cmd):
b34edfe
+            cli = self.new_cli()
b34edfe
+            cli.cmd.allow_pre_generated_srpm = False  # or None
b34edfe
+            with patch('pyrpkg.lookaside.CGILookasideCache.upload', self.lookasidecache_upload):
b34edfe
+                cli.import_srpm()  # no exception should be raised
b34edfe
+            rpmautospec_processed.assert_called_once()
b34edfe
+
b34edfe
 
b34edfe
 class TestMockbuild(CliTestCase):
b34edfe
     """Test mockbuild command"""
b34edfe
diff --git a/tests/test_utils.py b/tests/test_utils.py
b34edfe
index 34188c5..0cd62d8 100644
b34edfe
--- a/tests/test_utils.py
b34edfe
+++ b/tests/test_utils.py
b34edfe
@@ -1,15 +1,22 @@
b34edfe
 import os
b34edfe
+import shutil
b34edfe
 import tempfile
b34edfe
 import unittest
b34edfe
 import warnings
b34edfe
 
b34edfe
+try:
b34edfe
+    import rpmautospec
b34edfe
+except ImportError:
b34edfe
+    rpmautospec = None
b34edfe
+
b34edfe
 try:
b34edfe
     from unittest import mock
b34edfe
 except ImportError:
b34edfe
     import mock
b34edfe
 
b34edfe
 from pyrpkg.utils import (cached_property, is_file_in_directory,
b34edfe
-                          is_file_tracked, log_result, warn_deprecated)
b34edfe
+                          is_file_tracked, log_result,
b34edfe
+                          spec_file_undo_rpmautospec, warn_deprecated)
b34edfe
 
b34edfe
 from utils import CommandTestCase
b34edfe
 
b34edfe
@@ -287,3 +294,30 @@ class FileTrackedTestCase(CommandTestCase):
b34edfe
                 self.repo_path
b34edfe
             )
b34edfe
         )
b34edfe
+
b34edfe
+
b34edfe
+@unittest.skipIf(
b34edfe
+    rpmautospec is None,
b34edfe
+    "Skip test on releases where rpmautospec is not available (RHEL)")
b34edfe
+class SpecFileUndoRpmautospec(CommandTestCase):
b34edfe
+    def test_remove_autospec_from_specfile(self):
b34edfe
+        fixtures_dir = os.path.join(os.path.dirname(__file__), "fixtures", "docpkg")
b34edfe
+
b34edfe
+        specfile_without_rpmautospec = os.path.join(fixtures_dir, "docpkg.spec")
b34edfe
+        specfile_without_rpmautospec_copy = os.path.join(self.repo_path, "docpkg.spec")
b34edfe
+        shutil.copy2(specfile_without_rpmautospec, specfile_without_rpmautospec_copy)
b34edfe
+        self.assertFalse(rpmautospec.specfile_uses_rpmautospec(specfile_without_rpmautospec_copy))
b34edfe
+        self.assertFalse(spec_file_undo_rpmautospec(specfile_without_rpmautospec_copy))
b34edfe
+        self.assertFalse(rpmautospec.specfile_uses_rpmautospec(specfile_without_rpmautospec_copy))
b34edfe
+        os.remove(specfile_without_rpmautospec_copy)
b34edfe
+
b34edfe
+        specfile_with_rpmautospec = os.path.join(fixtures_dir, "docpkg-rpmautospec.spec")
b34edfe
+        specfile_with_rpmautospec_copy = os.path.join(self.repo_path, "docpkg-rpmautospec.spec")
b34edfe
+        shutil.copy2(specfile_with_rpmautospec, specfile_with_rpmautospec_copy)
b34edfe
+        # returns True if the specfile was modified
b34edfe
+        self.assertTrue(spec_file_undo_rpmautospec(specfile_with_rpmautospec_copy))
b34edfe
+        self.assertFalse(rpmautospec.specfile_uses_rpmautospec(
b34edfe
+            specfile_with_rpmautospec_copy, check_autochangelog=False, check_autorelease=True))
b34edfe
+        self.assertTrue(rpmautospec.specfile_uses_rpmautospec(
b34edfe
+            specfile_with_rpmautospec_copy, check_autochangelog=True, check_autorelease=False))
b34edfe
+        os.remove(specfile_with_rpmautospec_copy)
b34edfe
-- 
b48b289
2.43.0
b34edfe