mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2025-07-22 08:11:09 +02:00
Optimized mode_reset test
This commit is contained in:
parent
14dde77134
commit
d9c4493e0d
@ -1,6 +1,5 @@
|
||||
import os
|
||||
import unittest
|
||||
import yaml
|
||||
|
||||
# Base directory for roles (adjust if needed)
|
||||
BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../roles'))
|
||||
@ -8,22 +7,20 @@ BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../roles'
|
||||
class TestModeResetIntegration(unittest.TestCase):
|
||||
"""
|
||||
Integration test to verify that when 'mode_reset' is used in any task file,
|
||||
the role provides a reset.yml and includes it correctly in main.yml,
|
||||
and that the include_tasks for reset.yml with the mode_reset condition appears only once.
|
||||
the role provides a *_reset.yml (or reset.yml) and includes it correctly in main.yml,
|
||||
and that the include_tasks for that file with the mode_reset condition appears only once.
|
||||
"""
|
||||
|
||||
def test_mode_reset_tasks(self):
|
||||
# Iterate through each role directory
|
||||
for role_name in os.listdir(BASE_DIR):
|
||||
with self.subTest(role=role_name):
|
||||
role_path = os.path.join(BASE_DIR, role_name)
|
||||
tasks_dir = os.path.join(role_path, 'tasks')
|
||||
|
||||
# Only consider directories with a tasks folder
|
||||
if not os.path.isdir(tasks_dir):
|
||||
self.skipTest(f"Role '{role_name}' has no tasks directory.")
|
||||
|
||||
# Simplified detection: check raw file content for 'mode_reset'
|
||||
# Look for 'mode_reset' in task files
|
||||
mode_reset_found = False
|
||||
for root, _, files in os.walk(tasks_dir):
|
||||
for fname in files:
|
||||
@ -31,25 +28,26 @@ class TestModeResetIntegration(unittest.TestCase):
|
||||
continue
|
||||
file_path = os.path.join(root, fname)
|
||||
with open(file_path, 'r', encoding='utf-8') as f:
|
||||
file_content = f.read()
|
||||
if 'mode_reset' in file_content:
|
||||
mode_reset_found = True
|
||||
break
|
||||
if 'mode_reset' in f.read():
|
||||
mode_reset_found = True
|
||||
break
|
||||
if mode_reset_found:
|
||||
break
|
||||
|
||||
# If no mode_reset usage, skip this role
|
||||
if not mode_reset_found:
|
||||
self.skipTest(f"Role '{role_name}': no mode_reset usage detected.")
|
||||
|
||||
# 1) Check reset.yml exists
|
||||
reset_yml = os.path.join(tasks_dir, 'reset.yml')
|
||||
# Check *_reset.yml exists
|
||||
reset_files = [
|
||||
fname for fname in os.listdir(tasks_dir)
|
||||
if fname.endswith('_reset.yml') or fname == 'reset.yml'
|
||||
]
|
||||
self.assertTrue(
|
||||
os.path.isfile(reset_yml),
|
||||
f"Role '{role_name}': 'mode_reset' used but tasks/reset.yml is missing."
|
||||
reset_files,
|
||||
f"Role '{role_name}': 'mode_reset' used but no *_reset.yml or reset.yml found in tasks/."
|
||||
)
|
||||
|
||||
# 2) Check inclusion in main.yml
|
||||
# Check main.yml exists
|
||||
main_yml = os.path.join(tasks_dir, 'main.yml')
|
||||
self.assertTrue(
|
||||
os.path.isfile(main_yml),
|
||||
@ -59,10 +57,22 @@ class TestModeResetIntegration(unittest.TestCase):
|
||||
with open(main_yml, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
include_line = 'include_tasks: reset.yml'
|
||||
# Match the actual reset file name used in include_tasks
|
||||
found_include = None
|
||||
for reset_file in reset_files:
|
||||
if f'include_tasks: {reset_file}' in content:
|
||||
found_include = reset_file
|
||||
break
|
||||
|
||||
self.assertIsNotNone(
|
||||
found_include,
|
||||
f"Role '{role_name}': tasks/main.yml must include one of {reset_files} with 'include_tasks'."
|
||||
)
|
||||
|
||||
# Check the inclusion has the correct when condition
|
||||
include_line = f'include_tasks: {found_include}'
|
||||
when_line = 'when: mode_reset | bool'
|
||||
|
||||
# Ensure the include and when lines are present
|
||||
self.assertIn(
|
||||
include_line,
|
||||
content,
|
||||
@ -73,17 +83,13 @@ class TestModeResetIntegration(unittest.TestCase):
|
||||
content,
|
||||
f"Role '{role_name}': tasks/main.yml missing '{when_line}'."
|
||||
)
|
||||
|
||||
# 3) Ensure the reset include with mode_reset appears only once
|
||||
include_count = content.count(include_line)
|
||||
when_count = content.count(when_line)
|
||||
self.assertEqual(
|
||||
include_count, 1,
|
||||
f"Role '{role_name}': 'include_tasks: reset.yml' must appear exactly once, found {include_count}."
|
||||
content.count(include_line), 1,
|
||||
f"Role '{role_name}': '{include_line}' must appear exactly once."
|
||||
)
|
||||
self.assertEqual(
|
||||
when_count, 1,
|
||||
f"Role '{role_name}': 'when: mode_reset | bool' must appear exactly once, found {when_count}."
|
||||
content.count(when_line), 1,
|
||||
f"Role '{role_name}': '{when_line}' must appear exactly once."
|
||||
)
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
Loading…
x
Reference in New Issue
Block a user