Skip to content

Commit df64b2c

Browse files
prilrclaude
andcommitted
CLOS-2882: Fix mocks in cl-mysql tests, split mismatch case into own file
The CLOS-2882 regression tests were failing 5/6 at runtime because _patch_env did not mock get_source_major_version, which is called from construct_repomap_data() in the common clmysql library. The get_target_major_version mock was also scoped to the wrong import site, so construct_repomap_data picked up the unpatched binding from leapp.libraries.common.clmysql. Move shared setup into a tests/conftest.py with patch_env and make_cl_mysql_repofile fixtures (imports deferred inside fixture bodies because Leapp injects the actor context during pytest collection). Split TestMismatchInhibitor into test_clmysql_mismatch.py since it covers a different feature (Governor/RPM type mismatch from CLOS-3833 follow-up) than the CLOS-2882 disabled-repos regression. All 6 tests now pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent afbdd03 commit df64b2c

3 files changed

Lines changed: 159 additions & 115 deletions

File tree

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
"""Shared fixtures for clmysqlrepositorysetup actor tests.
2+
3+
Leapp injects the actor context during pytest collection, so the actor's
4+
private modules (leapp.libraries.common.clmysql, ...) are not importable at
5+
conftest import time. Imports therefore live inside the fixture bodies.
6+
"""
7+
8+
import pytest
9+
10+
11+
_MARIADB106_META_BASEURL = "http://repo.cloudlinux.com/other/cl$releasever/mysqlmeta/cl-mariadb-10.6/x86_64/"
12+
_MYSQLCLIENT_BASEURL = "http://repo.cloudlinux.com/other/cl$releasever/mysqlmeta/mysqlclient/x86_64/"
13+
14+
15+
@pytest.fixture
16+
def patch_env(monkeypatch):
17+
"""
18+
Return a callable that patches clmysql_cloudlinux dependencies.
19+
20+
Defaults to a healthy mariadb106 OK detection targeting CL9. Pass
21+
``clmysql_result`` to exercise a different status (e.g. MISMATCH), or
22+
override ``clmysql_type`` / ``target_major`` / ``source_major`` to vary the
23+
scenario.
24+
"""
25+
from leapp import reporting
26+
from leapp.libraries.common.clmysql import ClMysqlTypeResult, ClMysqlTypeStatus
27+
from leapp.libraries.common.testutils import (
28+
create_report_mocked,
29+
logger_mocked,
30+
produce_mocked,
31+
)
32+
from leapp.libraries.stdlib import api
33+
34+
def _apply(clmysql_result=None, clmysql_type="mariadb106", target_major="9", source_major="8"):
35+
if clmysql_result is None:
36+
clmysql_result = ClMysqlTypeResult(
37+
status=ClMysqlTypeStatus.OK,
38+
governor_type=clmysql_type,
39+
pkg_type=clmysql_type,
40+
)
41+
monkeypatch.setattr(
42+
"leapp.libraries.actor.clmysql_cloudlinux.get_clmysql_type",
43+
lambda: clmysql_result,
44+
)
45+
monkeypatch.setattr(
46+
"leapp.libraries.actor.clmysql_cloudlinux.get_target_major_version",
47+
lambda: target_major,
48+
)
49+
monkeypatch.setattr(
50+
"leapp.libraries.common.clmysql.get_target_major_version",
51+
lambda: target_major,
52+
)
53+
monkeypatch.setattr(
54+
"leapp.libraries.common.clmysql.get_source_major_version",
55+
lambda: source_major,
56+
)
57+
monkeypatch.setattr(
58+
"leapp.libraries.actor.clmysql_cloudlinux.create_leapp_repofile_copy",
59+
lambda *a, **kw: "/tmp/cl-mysql-leapp.repo",
60+
)
61+
monkeypatch.setattr(api, "produce", produce_mocked())
62+
monkeypatch.setattr(api, "current_logger", logger_mocked())
63+
monkeypatch.setattr(reporting, "create_report", create_report_mocked())
64+
65+
return _apply
66+
67+
68+
@pytest.fixture
69+
def make_cl_mysql_repofile():
70+
"""Return a factory that builds a Governor-style cl-mysql.repo RepositoryFile."""
71+
from leapp.models import RepositoryData, RepositoryFile
72+
73+
def _make(cl_mysql_meta_enabled=True, mysqlclient_enabled=False):
74+
return RepositoryFile(
75+
file="cl-mysql.repo",
76+
data=[
77+
RepositoryData(
78+
repoid="cl-mysql-meta",
79+
name="cl-mysql",
80+
baseurl=_MARIADB106_META_BASEURL,
81+
enabled=cl_mysql_meta_enabled,
82+
),
83+
RepositoryData(
84+
repoid="mysqclient",
85+
name="mysqlclient",
86+
baseurl=_MYSQLCLIENT_BASEURL,
87+
enabled=mysqlclient_enabled,
88+
),
89+
],
90+
)
91+
92+
return _make

repos/system_upgrade/cloudlinux/actors/clmysqlrepositorysetup/tests/test_clmysql_cloudlinux.py

Lines changed: 35 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -10,67 +10,9 @@
1010
cache, which causes:
1111
Error: Problems in request: missing groups or modules: mariadb:cl-MariaDB106
1212
"""
13-
import pytest
1413

15-
from leapp import reporting
1614
from leapp.libraries.actor.clmysql_cloudlinux import clmysql_process
1715
from leapp.libraries.actor.clmysqlrepositorysetup import MySqlRepositorySetupLibrary
18-
from leapp.libraries.common.clmysql import ClMysqlTypeResult, ClMysqlTypeStatus
19-
from leapp.libraries.common.testutils import create_report_mocked, logger_mocked, produce_mocked
20-
from leapp.libraries.stdlib import api
21-
from leapp.models import CustomTargetRepository, CustomTargetRepositoryFile, RepositoryData, RepositoryFile
22-
23-
24-
_MARIADB106_META_BASEURL = (
25-
"http://repo.cloudlinux.com/other/cl$releasever/mysqlmeta/cl-mariadb-10.6/x86_64/"
26-
)
27-
_MYSQLCLIENT_BASEURL = (
28-
"http://repo.cloudlinux.com/other/cl$releasever/mysqlmeta/mysqlclient/x86_64/"
29-
)
30-
31-
32-
def _make_cl_mysql_repofile(cl_mysql_meta_enabled=True, mysqlclient_enabled=False):
33-
"""Return a RepositoryFile that mimics a Governor-written cl-mysql.repo."""
34-
return RepositoryFile(
35-
file="cl-mysql.repo",
36-
data=[
37-
RepositoryData(
38-
repoid="cl-mysql-meta",
39-
name="cl-mysql",
40-
baseurl=_MARIADB106_META_BASEURL,
41-
enabled=cl_mysql_meta_enabled,
42-
),
43-
RepositoryData(
44-
repoid="mysqclient",
45-
name="mysqlclient",
46-
baseurl=_MYSQLCLIENT_BASEURL,
47-
enabled=mysqlclient_enabled,
48-
),
49-
],
50-
)
51-
52-
53-
def _patch_env(monkeypatch, clmysql_type="mariadb106", target_major="9"):
54-
"""Patch all external dependencies of clmysql_cloudlinux."""
55-
monkeypatch.setattr(
56-
"leapp.libraries.actor.clmysql_cloudlinux.get_clmysql_type",
57-
lambda: ClMysqlTypeResult(
58-
status=ClMysqlTypeStatus.OK,
59-
governor_type=clmysql_type,
60-
pkg_type=clmysql_type,
61-
),
62-
)
63-
monkeypatch.setattr(
64-
"leapp.libraries.actor.clmysql_cloudlinux.get_target_major_version",
65-
lambda: target_major,
66-
)
67-
monkeypatch.setattr(
68-
"leapp.libraries.actor.clmysql_cloudlinux.create_leapp_repofile_copy",
69-
lambda *a, **kw: "/tmp/cl-mysql-leapp.repo",
70-
)
71-
monkeypatch.setattr(api, "produce", produce_mocked())
72-
monkeypatch.setattr(api, "current_logger", logger_mocked())
73-
monkeypatch.setattr(reporting, "create_report", create_report_mocked())
7416

7517

7618
class TestDisabledReposForceEnabled:
@@ -79,96 +21,74 @@ class TestDisabledReposForceEnabled:
7921
target userspace for the module stream to be resolvable.
8022
"""
8123

82-
def test_both_repos_disabled_still_in_target(self, monkeypatch):
24+
def test_both_repos_disabled_still_in_target(self, patch_env, make_cl_mysql_repofile):
8325
"""Disabled cl-mysql-meta and mysqclient repos must both be force-enabled."""
84-
_patch_env(monkeypatch)
26+
patch_env()
8527

8628
lib = MySqlRepositorySetupLibrary()
87-
clmysql_process(lib, "cl-mysql", _make_cl_mysql_repofile(
88-
cl_mysql_meta_enabled=False, mysqlclient_enabled=False
89-
))
29+
clmysql_process(
30+
lib,
31+
"cl-mysql",
32+
make_cl_mysql_repofile(cl_mysql_meta_enabled=False, mysqlclient_enabled=False),
33+
)
9034

9135
repoids = {msg.repoid for msg in lib.custom_repo_msgs}
9236
assert "cl-mysql-meta-9" in repoids
9337
assert "mysqclient-9" in repoids
9438

95-
def test_target_repos_enabled_true(self, monkeypatch):
39+
def test_target_repos_enabled_true(self, patch_env, make_cl_mysql_repofile):
9640
"""Target repo messages must have enabled=True regardless of source state."""
97-
_patch_env(monkeypatch)
41+
patch_env()
9842

9943
lib = MySqlRepositorySetupLibrary()
100-
clmysql_process(lib, "cl-mysql", _make_cl_mysql_repofile(
101-
cl_mysql_meta_enabled=False, mysqlclient_enabled=False
102-
))
44+
clmysql_process(
45+
lib,
46+
"cl-mysql",
47+
make_cl_mysql_repofile(cl_mysql_meta_enabled=False, mysqlclient_enabled=False),
48+
)
10349

10450
for msg in lib.custom_repo_msgs:
10551
assert msg.enabled, "target repo {} must be enabled=True".format(msg.repoid)
10652

107-
def test_cloudlinux_type_always_registered(self, monkeypatch):
53+
def test_cloudlinux_type_always_registered(self, patch_env, make_cl_mysql_repofile):
10854
"""'cloudlinux' must be added to mysql_types even when all repos are disabled."""
109-
_patch_env(monkeypatch)
55+
patch_env()
11056

11157
lib = MySqlRepositorySetupLibrary()
112-
clmysql_process(lib, "cl-mysql", _make_cl_mysql_repofile(
113-
cl_mysql_meta_enabled=False, mysqlclient_enabled=False
114-
))
58+
clmysql_process(
59+
lib,
60+
"cl-mysql",
61+
make_cl_mysql_repofile(cl_mysql_meta_enabled=False, mysqlclient_enabled=False),
62+
)
11563

11664
assert "cloudlinux" in lib.mysql_types
11765

118-
def test_releasever_substituted_in_target_baseurl(self, monkeypatch):
66+
def test_releasever_substituted_in_target_baseurl(self, patch_env, make_cl_mysql_repofile):
11967
"""Target repo baseurls must have $releasever replaced with the target major version."""
120-
_patch_env(monkeypatch, target_major="9")
68+
patch_env(target_major="9")
12169

12270
lib = MySqlRepositorySetupLibrary()
123-
clmysql_process(lib, "cl-mysql", _make_cl_mysql_repofile(
124-
cl_mysql_meta_enabled=False, mysqlclient_enabled=False
125-
))
71+
clmysql_process(
72+
lib,
73+
"cl-mysql",
74+
make_cl_mysql_repofile(cl_mysql_meta_enabled=False, mysqlclient_enabled=False),
75+
)
12676

12777
for msg in lib.custom_repo_msgs:
12878
assert "$releasever" not in msg.baseurl
12979
assert "/cl9/" in msg.baseurl
13080

131-
def test_enabled_repos_also_pass_through(self, monkeypatch):
81+
def test_enabled_repos_also_pass_through(self, patch_env, make_cl_mysql_repofile):
13282
"""Normal case: enabled cl-mysql-meta still appears in target repos."""
133-
_patch_env(monkeypatch)
83+
patch_env()
13484

13585
lib = MySqlRepositorySetupLibrary()
136-
clmysql_process(lib, "cl-mysql", _make_cl_mysql_repofile(
137-
cl_mysql_meta_enabled=True, mysqlclient_enabled=False
138-
))
86+
clmysql_process(
87+
lib,
88+
"cl-mysql",
89+
make_cl_mysql_repofile(cl_mysql_meta_enabled=True, mysqlclient_enabled=False),
90+
)
13991

14092
repoids = {msg.repoid for msg in lib.custom_repo_msgs}
14193
assert "cl-mysql-meta-9" in repoids
14294
assert "cloudlinux" in lib.mysql_types
143-
144-
145-
class TestMismatchInhibitor:
146-
"""Governor/RPM type mismatch must create an inhibitor and skip repo setup."""
147-
148-
def test_mismatch_inhibits_and_adds_no_repos(self, monkeypatch):
149-
monkeypatch.setattr(
150-
"leapp.libraries.actor.clmysql_cloudlinux.get_clmysql_type",
151-
lambda: ClMysqlTypeResult(
152-
status=ClMysqlTypeStatus.MISMATCH,
153-
governor_type="mariadb106",
154-
pkg_type="mysql80",
155-
),
156-
)
157-
monkeypatch.setattr(
158-
"leapp.libraries.actor.clmysql_cloudlinux.get_target_major_version",
159-
lambda: "9",
160-
)
161-
monkeypatch.setattr(
162-
"leapp.libraries.actor.clmysql_cloudlinux.create_leapp_repofile_copy",
163-
lambda *a, **kw: "/tmp/cl-mysql-leapp.repo",
164-
)
165-
monkeypatch.setattr(api, "produce", produce_mocked())
166-
monkeypatch.setattr(api, "current_logger", logger_mocked())
167-
monkeypatch.setattr(reporting, "create_report", create_report_mocked())
168-
169-
lib = MySqlRepositorySetupLibrary()
170-
clmysql_process(lib, "cl-mysql", _make_cl_mysql_repofile())
171-
172-
assert "cloudlinux" not in lib.mysql_types
173-
assert lib.custom_repo_msgs == []
174-
assert reporting.create_report.called == 1
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
"""
2+
Tests for the Governor/RPM mismatch inhibitor in clmysql_cloudlinux.
3+
4+
When MySQL Governor's recorded type does not match the installed mysqld
5+
binary, the handler must inhibit the upgrade and not register any target
6+
repos (a wrong module stream would otherwise be enabled).
7+
"""
8+
9+
from leapp import reporting
10+
from leapp.libraries.actor.clmysql_cloudlinux import clmysql_process
11+
from leapp.libraries.actor.clmysqlrepositorysetup import MySqlRepositorySetupLibrary
12+
from leapp.libraries.common.clmysql import ClMysqlTypeResult, ClMysqlTypeStatus
13+
14+
15+
class TestMismatchInhibitor:
16+
"""Governor/RPM type mismatch must create an inhibitor and skip repo setup."""
17+
18+
def test_mismatch_inhibits_and_adds_no_repos(self, patch_env, make_cl_mysql_repofile):
19+
patch_env(
20+
clmysql_result=ClMysqlTypeResult(
21+
status=ClMysqlTypeStatus.MISMATCH,
22+
governor_type="mariadb106",
23+
pkg_type="mysql80",
24+
)
25+
)
26+
27+
lib = MySqlRepositorySetupLibrary()
28+
clmysql_process(lib, "cl-mysql", make_cl_mysql_repofile())
29+
30+
assert "cloudlinux" not in lib.mysql_types
31+
assert lib.custom_repo_msgs == []
32+
assert reporting.create_report.called == 1

0 commit comments

Comments
 (0)