
Pathlib is only available in python 3.6, this patch allow to run lower version of python with pathlib2. Change-Id: I36c3560815624eb3f4bc3d427d9549d73c449198
259 lines
11 KiB
Python
259 lines
11 KiB
Python
# Copyright 2021 Red Hat, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
#
|
|
|
|
try:
|
|
from unittest import mock
|
|
except ImportError:
|
|
import mock
|
|
|
|
# @matbu backward compatibility for stable/train
|
|
try:
|
|
from pathlib import PosixPath
|
|
PATHLIB = 'pathlib'
|
|
except ImportError:
|
|
from pathlib2 import PosixPath
|
|
PATHLIB = 'pathlib2'
|
|
|
|
from unittest import TestCase
|
|
|
|
from validations_libs import constants
|
|
from validations_libs.community.init_validation import \
|
|
CommunityValidation as cv
|
|
from validations_libs.tests import fakes
|
|
|
|
|
|
class TestCommunityValidation(TestCase):
|
|
|
|
def setUp(self):
|
|
super(TestCommunityValidation, self).setUp()
|
|
|
|
def test_role_name_underscored(self):
|
|
validation_name = "my_new_validation"
|
|
co_val = cv(validation_name)
|
|
role_name = co_val.role_name
|
|
self.assertEqual(role_name, validation_name)
|
|
|
|
def test_role_name_with_underscores_and_dashes(self):
|
|
validation_name = "my_new-validation"
|
|
co_val = cv(validation_name)
|
|
self.assertEqual(co_val.role_name, "my_new_validation")
|
|
|
|
def test_role_name_with_dashes_only(self):
|
|
validation_name = "my-new-validation"
|
|
co_val = cv(validation_name)
|
|
self.assertEqual(co_val.role_name,
|
|
"my_new_validation")
|
|
|
|
def test_role_name_compliant(self):
|
|
validation_name = "my_new_validation"
|
|
co_val = cv(validation_name)
|
|
self.assertTrue(co_val.is_role_name_compliant)
|
|
|
|
def test_role_name_not_compliant(self):
|
|
validation_name = "123_my_new-validation"
|
|
co_val = cv(validation_name)
|
|
self.assertFalse(co_val.is_role_name_compliant)
|
|
|
|
def test_role_basedir(self):
|
|
validation_name = "my_new-validation"
|
|
co_val = cv(validation_name)
|
|
self.assertEqual(co_val.role_basedir,
|
|
constants.COMMUNITY_ROLES_DIR)
|
|
|
|
def test_playbook_name_with_underscores(self):
|
|
validation_name = "my_new_validation"
|
|
co_val = cv(validation_name)
|
|
self.assertEqual(co_val.playbook_name,
|
|
"my-new-validation.yaml")
|
|
|
|
def test_playbook_name_with_underscores_and_dashes(self):
|
|
validation_name = "my_new-validation"
|
|
co_val = cv(validation_name)
|
|
self.assertEqual(co_val.playbook_name,
|
|
"my-new-validation.yaml")
|
|
|
|
def test_playbook_basedir(self):
|
|
validation_name = "my_new-validation"
|
|
co_val = cv(validation_name)
|
|
self.assertEqual(co_val.playbook_basedir,
|
|
constants.COMMUNITY_PLAYBOOKS_DIR)
|
|
|
|
@mock.patch('{}.Path.iterdir'.format(PATHLIB),
|
|
return_value=fakes.FAKE_ROLES_ITERDIR2)
|
|
@mock.patch('{}.Path.is_dir'.format(PATHLIB))
|
|
@mock.patch('{}.Path.exists'.format(PATHLIB), side_effect=[False, True])
|
|
def test_role_already_exists_in_comval(self,
|
|
mock_play_path_exists,
|
|
mock_path_is_dir,
|
|
mock_path_iterdir):
|
|
validation_name = "my-val"
|
|
co_val = cv(validation_name)
|
|
self.assertTrue(co_val.is_role_exists())
|
|
|
|
@mock.patch('{}.Path.iterdir'.format(PATHLIB),
|
|
return_value=fakes.FAKE_ROLES_ITERDIR1)
|
|
@mock.patch('{}.Path.is_dir'.format(PATHLIB))
|
|
@mock.patch('{}.Path.exists'.format(PATHLIB), side_effect=[True, False])
|
|
def test_role_already_exists_in_non_comval(self,
|
|
mock_play_path_exists,
|
|
mock_path_is_dir,
|
|
mock_path_iterdir):
|
|
validation_name = "my-val"
|
|
co_val = cv(validation_name)
|
|
self.assertTrue(co_val.is_role_exists())
|
|
|
|
@mock.patch('{}.Path.iterdir'.format(PATHLIB),
|
|
return_value=fakes.FAKE_ROLES_ITERDIR2)
|
|
@mock.patch('{}.Path.is_dir'.format(PATHLIB))
|
|
@mock.patch('{}.Path.exists'.format(PATHLIB), side_effect=[True, False])
|
|
def test_role_not_exists(self,
|
|
mock_path_exists,
|
|
mock_path_is_dir,
|
|
mock_path_iterdir):
|
|
validation_name = "my-val"
|
|
co_val = cv(validation_name)
|
|
self.assertFalse(co_val.is_role_exists())
|
|
|
|
@mock.patch('{}.Path.iterdir'.format(PATHLIB),
|
|
return_value=fakes.FAKE_PLAYBOOKS_ITERDIR1)
|
|
@mock.patch('{}.Path.is_file'.format(PATHLIB))
|
|
@mock.patch('{}.Path.exists'.format(PATHLIB), side_effect=[True, False])
|
|
def test_playbook_already_exists_in_non_comval(self,
|
|
mock_path_exists,
|
|
mock_path_is_file,
|
|
mock_path_iterdir):
|
|
validation_name = "my_val"
|
|
co_val = cv(validation_name)
|
|
self.assertTrue(co_val.is_playbook_exists())
|
|
|
|
@mock.patch('{}.Path.iterdir'.format(PATHLIB),
|
|
return_value=fakes.FAKE_PLAYBOOKS_ITERDIR2)
|
|
@mock.patch('{}.Path.is_file'.format(PATHLIB))
|
|
@mock.patch('{}.Path.exists'.format(PATHLIB), side_effect=[False, True])
|
|
def test_playbook_already_exists_in_comval(self,
|
|
mock_path_exists,
|
|
mock_path_is_file,
|
|
mock_path_iterdir):
|
|
validation_name = "my_val"
|
|
co_val = cv(validation_name)
|
|
self.assertTrue(co_val.is_playbook_exists())
|
|
|
|
@mock.patch('{}.Path.iterdir'.format(PATHLIB),
|
|
return_value=fakes.FAKE_PLAYBOOKS_ITERDIR2)
|
|
@mock.patch('{}.Path.is_file'.format(PATHLIB))
|
|
@mock.patch('{}.Path.exists'.format(PATHLIB), side_effect=[True, False])
|
|
def test_playbook_not_exists(self,
|
|
mock_path_exists,
|
|
mock_path_is_file,
|
|
mock_path_iterdir):
|
|
validation_name = "my_val"
|
|
co_val = cv(validation_name)
|
|
self.assertFalse(co_val.is_playbook_exists())
|
|
|
|
def test_execute_with_role_name_not_compliant(self):
|
|
validation_name = "3_my-val"
|
|
co_val = cv(validation_name)
|
|
self.assertRaises(RuntimeError, co_val.execute)
|
|
|
|
@mock.patch('validations_libs.community.init_validation.CommunityValidation.create_playbook')
|
|
@mock.patch('validations_libs.utils.run_command_and_log',
|
|
return_value=0)
|
|
@mock.patch('validations_libs.community.init_validation.CommunityValidation.role_basedir',
|
|
return_value=PosixPath("/foo/bar/roles"))
|
|
@mock.patch('validations_libs.community.init_validation.LOG',
|
|
autospec=True)
|
|
def test_exec_new_role_with_galaxy(self,
|
|
mock_log,
|
|
mock_role_basedir,
|
|
mock_run,
|
|
mock_create_playbook):
|
|
validation_name = "my_val"
|
|
cmd = ['ansible-galaxy', 'init', '-v',
|
|
'--offline', validation_name,
|
|
'--init-path', mock_role_basedir]
|
|
co_val = cv(validation_name)
|
|
co_val.execute()
|
|
mock_run.assert_called_once_with(mock_log, cmd)
|
|
|
|
@mock.patch('validations_libs.community.init_validation.CommunityValidation.create_playbook')
|
|
@mock.patch('validations_libs.utils.run_command_and_log',
|
|
return_value=1)
|
|
@mock.patch('validations_libs.community.init_validation.CommunityValidation.role_basedir',
|
|
return_value=PosixPath("/foo/bar/roles"))
|
|
@mock.patch('validations_libs.community.init_validation.LOG',
|
|
autospec=True)
|
|
def test_exec_new_role_with_galaxy_and_error(self,
|
|
mock_log,
|
|
mock_role_basedir,
|
|
mock_run,
|
|
mock_create_playbook):
|
|
validation_name = "my_val"
|
|
cmd = ['ansible-galaxy', 'init', '-v',
|
|
'--offline', validation_name,
|
|
'--init-path', mock_role_basedir]
|
|
co_val = cv(validation_name)
|
|
self.assertRaises(RuntimeError, co_val.execute)
|
|
|
|
@mock.patch(
|
|
'validations_libs.community.init_validation.CommunityValidation.create_playbook',
|
|
side_effect=PermissionError)
|
|
@mock.patch('validations_libs.utils.run_command_and_log',
|
|
return_value=0)
|
|
@mock.patch('validations_libs.community.init_validation.CommunityValidation.role_basedir',
|
|
return_value=PosixPath("/foo/bar/roles"))
|
|
@mock.patch('validations_libs.community.init_validation.LOG',
|
|
autospec=True)
|
|
def test_validation_init_create_playbook_with_issue(self,
|
|
mock_log,
|
|
mock_role_basedir,
|
|
mock_run,
|
|
mock_create_playbook):
|
|
validation_name = "foo_bar"
|
|
cmd = ['ansible-galaxy', 'init', '-v',
|
|
'--offline', validation_name,
|
|
'--init-path', mock_role_basedir]
|
|
co_val = cv(validation_name)
|
|
self.assertRaises(RuntimeError, co_val.execute)
|
|
|
|
@mock.patch('builtins.open')
|
|
@mock.patch('validations_libs.community.init_validation.CommunityValidation.playbook_path',
|
|
return_value='/foo/bar/playbooks/my-val.yaml')
|
|
@mock.patch('validations_libs.utils.run_command_and_log',
|
|
return_value=0)
|
|
@mock.patch('validations_libs.community.init_validation.CommunityValidation.role_basedir',
|
|
return_value=PosixPath("/foo/bar/roles"))
|
|
@mock.patch('validations_libs.community.init_validation.LOG',
|
|
autospec=True)
|
|
def test_validation_init_create_playbook(self,
|
|
mock_log,
|
|
mock_role_basedir,
|
|
mock_run,
|
|
mock_playbook_path,
|
|
mock_open):
|
|
validation_name = "my_val"
|
|
co_val = cv(validation_name)
|
|
co_val.execute()
|
|
|
|
self.assertIn(
|
|
mock.call(mock_playbook_path, 'w'),
|
|
mock_open.mock_calls
|
|
)
|
|
self.assertIn(
|
|
mock.call().__enter__().write(
|
|
fakes.FAKE_PLAYBOOK_TEMPLATE
|
|
),
|
|
mock_open.mock_calls
|
|
)
|