mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-08-14 01:54:21 -07:00
Move modules and module_utils unit tests to correct place (#81)
* Move modules and module_utils unit tests to correct place. * Update ignore.txt * Fix imports. * Fix typos. * Fix more typos.
This commit is contained in:
parent
ab3c2120fb
commit
be191cce6c
1170 changed files with 732 additions and 751 deletions
0
tests/unit/plugins/modules/source_control/__init__.py
Normal file
0
tests/unit/plugins/modules/source_control/__init__.py
Normal file
|
@ -0,0 +1,337 @@
|
|||
from ansible_collections.community.general.plugins.module_utils.source_control.bitbucket import BitbucketHelper
|
||||
from ansible_collections.community.general.plugins.modules.source_control.bitbucket import bitbucket_access_key
|
||||
from ansible_collections.community.general.tests.unit.compat import unittest
|
||||
from ansible_collections.community.general.tests.unit.compat.mock import patch
|
||||
from ansible_collections.community.general.tests.unit.plugins.modules.utils import AnsibleFailJson, AnsibleExitJson, ModuleTestCase, set_module_args
|
||||
|
||||
|
||||
class TestBucketAccessKeyModule(ModuleTestCase):
|
||||
def setUp(self):
|
||||
super(TestBucketAccessKeyModule, self).setUp()
|
||||
self.module = bitbucket_access_key
|
||||
|
||||
def test_missing_key_with_present_state(self):
|
||||
with self.assertRaises(AnsibleFailJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'label': 'key name',
|
||||
'state': 'present',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(exec_info.exception.args[0]['msg'], self.module.error_messages['required_key'])
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_access_key, 'get_existing_deploy_key', return_value=None)
|
||||
def test_create_deploy_key(self, *args):
|
||||
with patch.object(self.module, 'create_deploy_key') as create_deploy_key_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'key': 'public_key',
|
||||
'label': 'key name',
|
||||
'state': 'present',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(create_deploy_key_mock.call_count, 1)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_access_key, 'get_existing_deploy_key', return_value=None)
|
||||
def test_create_deploy_key_check_mode(self, *args):
|
||||
with patch.object(self.module, 'create_deploy_key') as create_deploy_key_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'key': 'public_key',
|
||||
'label': 'key name',
|
||||
'state': 'present',
|
||||
'_ansible_check_mode': True,
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(create_deploy_key_mock.call_count, 0)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_access_key, 'get_existing_deploy_key', return_value={
|
||||
"id": 123,
|
||||
"label": "mykey",
|
||||
"created_on": "2019-03-23T10:15:21.517377+00:00",
|
||||
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAADA...AdkTg7HGqL3rlaDrEcWfL7Lu6TnhBdq5",
|
||||
"type": "deploy_key",
|
||||
"comment": "",
|
||||
"last_used": None,
|
||||
"repository": {
|
||||
"links": {
|
||||
"self": {
|
||||
"href": "https://api.bitbucket.org/2.0/repositories/mleu/test"
|
||||
},
|
||||
"html": {
|
||||
"href": "https://bitbucket.org/mleu/test"
|
||||
},
|
||||
"avatar": {
|
||||
"href": "..."
|
||||
}
|
||||
},
|
||||
"type": "repository",
|
||||
"name": "test",
|
||||
"full_name": "mleu/test",
|
||||
"uuid": "{85d08b4e-571d-44e9-a507-fa476535aa98}"
|
||||
},
|
||||
"links": {
|
||||
"self": {
|
||||
"href": "https://api.bitbucket.org/2.0/repositories/mleu/test/deploy-keys/123"
|
||||
}
|
||||
},
|
||||
})
|
||||
def test_update_deploy_key(self, *args):
|
||||
with patch.object(self.module, 'delete_deploy_key') as delete_deploy_key_mock:
|
||||
with patch.object(self.module, 'create_deploy_key') as create_deploy_key_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'key': 'new public key',
|
||||
'label': 'mykey',
|
||||
'state': 'present',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(delete_deploy_key_mock.call_count, 1)
|
||||
self.assertEqual(create_deploy_key_mock.call_count, 1)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_access_key, 'get_existing_deploy_key', return_value={
|
||||
"id": 123,
|
||||
"label": "mykey",
|
||||
"created_on": "2019-03-23T10:15:21.517377+00:00",
|
||||
"key": "new public key",
|
||||
"type": "deploy_key",
|
||||
"comment": "",
|
||||
"last_used": None,
|
||||
"repository": {
|
||||
"links": {
|
||||
"self": {
|
||||
"href": "https://api.bitbucket.org/2.0/repositories/mleu/test"
|
||||
},
|
||||
"html": {
|
||||
"href": "https://bitbucket.org/mleu/test"
|
||||
},
|
||||
"avatar": {
|
||||
"href": "..."
|
||||
}
|
||||
},
|
||||
"type": "repository",
|
||||
"name": "test",
|
||||
"full_name": "mleu/test",
|
||||
"uuid": "{85d08b4e-571d-44e9-a507-fa476535aa98}"
|
||||
},
|
||||
"links": {
|
||||
"self": {
|
||||
"href": "https://api.bitbucket.org/2.0/repositories/mleu/test/deploy-keys/123"
|
||||
}
|
||||
},
|
||||
})
|
||||
def test_dont_update_same_value(self, *args):
|
||||
with patch.object(self.module, 'delete_deploy_key') as delete_deploy_key_mock:
|
||||
with patch.object(self.module, 'create_deploy_key') as create_deploy_key_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'key': 'new public key',
|
||||
'label': 'mykey',
|
||||
'state': 'present',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(delete_deploy_key_mock.call_count, 0)
|
||||
self.assertEqual(create_deploy_key_mock.call_count, 0)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], False)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_access_key, 'get_existing_deploy_key', return_value={
|
||||
"id": 123,
|
||||
"label": "mykey",
|
||||
"created_on": "2019-03-23T10:15:21.517377+00:00",
|
||||
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAADA...AdkTg7HGqL3rlaDrEcWfL7Lu6TnhBdq5",
|
||||
"type": "deploy_key",
|
||||
"comment": "",
|
||||
"last_used": None,
|
||||
"repository": {
|
||||
"links": {
|
||||
"self": {
|
||||
"href": "https://api.bitbucket.org/2.0/repositories/mleu/test"
|
||||
},
|
||||
"html": {
|
||||
"href": "https://bitbucket.org/mleu/test"
|
||||
},
|
||||
"avatar": {
|
||||
"href": "..."
|
||||
}
|
||||
},
|
||||
"type": "repository",
|
||||
"name": "test",
|
||||
"full_name": "mleu/test",
|
||||
"uuid": "{85d08b4e-571d-44e9-a507-fa476535aa98}"
|
||||
},
|
||||
"links": {
|
||||
"self": {
|
||||
"href": "https://api.bitbucket.org/2.0/repositories/mleu/test/deploy-keys/123"
|
||||
}
|
||||
},
|
||||
})
|
||||
def test_update_deploy_key_check_mode(self, *args):
|
||||
with patch.object(self.module, 'delete_deploy_key') as delete_deploy_key_mock:
|
||||
with patch.object(self.module, 'create_deploy_key') as create_deploy_key_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'key': 'new public key',
|
||||
'label': 'mykey',
|
||||
'state': 'present',
|
||||
'_ansible_check_mode': True,
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(delete_deploy_key_mock.call_count, 0)
|
||||
self.assertEqual(create_deploy_key_mock.call_count, 0)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_access_key, 'get_existing_deploy_key', return_value={
|
||||
"id": 123,
|
||||
"label": "mykey",
|
||||
"created_on": "2019-03-23T10:15:21.517377+00:00",
|
||||
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAADA...AdkTg7HGqL3rlaDrEcWfL7Lu6TnhBdq5",
|
||||
"type": "deploy_key",
|
||||
"comment": "",
|
||||
"last_used": None,
|
||||
"repository": {
|
||||
"links": {
|
||||
"self": {
|
||||
"href": "https://api.bitbucket.org/2.0/repositories/mleu/test"
|
||||
},
|
||||
"html": {
|
||||
"href": "https://bitbucket.org/mleu/test"
|
||||
},
|
||||
"avatar": {
|
||||
"href": "..."
|
||||
}
|
||||
},
|
||||
"type": "repository",
|
||||
"name": "test",
|
||||
"full_name": "mleu/test",
|
||||
"uuid": "{85d08b4e-571d-44e9-a507-fa476535aa98}"
|
||||
},
|
||||
"links": {
|
||||
"self": {
|
||||
"href": "https://api.bitbucket.org/2.0/repositories/mleu/test/deploy-keys/123"
|
||||
}
|
||||
},
|
||||
})
|
||||
def test_delete_deploy_key(self, *args):
|
||||
with patch.object(self.module, 'delete_deploy_key') as delete_deploy_key_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'label': 'mykey',
|
||||
'state': 'absent',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(delete_deploy_key_mock.call_count, 1)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_access_key, 'get_existing_deploy_key', return_value=None)
|
||||
def test_delete_absent_deploy_key(self, *args):
|
||||
with patch.object(self.module, 'delete_deploy_key') as delete_deploy_key_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'label': 'mykey',
|
||||
'state': 'absent',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(delete_deploy_key_mock.call_count, 0)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], False)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_access_key, 'get_existing_deploy_key', return_value={
|
||||
"id": 123,
|
||||
"label": "mykey",
|
||||
"created_on": "2019-03-23T10:15:21.517377+00:00",
|
||||
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAADA...AdkTg7HGqL3rlaDrEcWfL7Lu6TnhBdq5",
|
||||
"type": "deploy_key",
|
||||
"comment": "",
|
||||
"last_used": None,
|
||||
"repository": {
|
||||
"links": {
|
||||
"self": {
|
||||
"href": "https://api.bitbucket.org/2.0/repositories/mleu/test"
|
||||
},
|
||||
"html": {
|
||||
"href": "https://bitbucket.org/mleu/test"
|
||||
},
|
||||
"avatar": {
|
||||
"href": "..."
|
||||
}
|
||||
},
|
||||
"type": "repository",
|
||||
"name": "test",
|
||||
"full_name": "mleu/test",
|
||||
"uuid": "{85d08b4e-571d-44e9-a507-fa476535aa98}"
|
||||
},
|
||||
"links": {
|
||||
"self": {
|
||||
"href": "https://api.bitbucket.org/2.0/repositories/mleu/test/deploy-keys/123"
|
||||
}
|
||||
},
|
||||
})
|
||||
def test_delete_deploy_key_check_mode(self, *args):
|
||||
with patch.object(self.module, 'delete_deploy_key') as delete_deploy_key_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'label': 'mykey',
|
||||
'state': 'absent',
|
||||
'_ansible_check_mode': True,
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(delete_deploy_key_mock.call_count, 0)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
|
@ -0,0 +1,192 @@
|
|||
from ansible_collections.community.general.plugins.module_utils.source_control.bitbucket import BitbucketHelper
|
||||
from ansible_collections.community.general.plugins.modules.source_control.bitbucket import bitbucket_pipeline_key_pair
|
||||
from ansible_collections.community.general.tests.unit.compat import unittest
|
||||
from ansible_collections.community.general.tests.unit.compat.mock import patch
|
||||
from ansible_collections.community.general.tests.unit.plugins.modules.utils import AnsibleFailJson, AnsibleExitJson, ModuleTestCase, set_module_args
|
||||
|
||||
|
||||
class TestBucketPipelineKeyPairModule(ModuleTestCase):
|
||||
def setUp(self):
|
||||
super(TestBucketPipelineKeyPairModule, self).setUp()
|
||||
self.module = bitbucket_pipeline_key_pair
|
||||
|
||||
def test_missing_keys_with_present_state(self):
|
||||
with self.assertRaises(AnsibleFailJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'state': 'present',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(exec_info.exception.args[0]['msg'], self.module.error_messages['required_keys'])
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_key_pair, 'get_existing_ssh_key_pair', return_value=None)
|
||||
def test_create_keys(self, *args):
|
||||
with patch.object(self.module, 'update_ssh_key_pair') as update_ssh_key_pair_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'public_key': 'public',
|
||||
'private_key': 'PRIVATE',
|
||||
'state': 'present',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(update_ssh_key_pair_mock.call_count, 1)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_key_pair, 'get_existing_ssh_key_pair', return_value=None)
|
||||
def test_create_keys_check_mode(self, *args):
|
||||
with patch.object(self.module, 'update_ssh_key_pair') as update_ssh_key_pair_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'public_key': 'public',
|
||||
'private_key': 'PRIVATE',
|
||||
'state': 'present',
|
||||
'_ansible_check_mode': True,
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(update_ssh_key_pair_mock.call_count, 0)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_key_pair, 'get_existing_ssh_key_pair', return_value={
|
||||
'public_key': 'unknown',
|
||||
'type': 'pipeline_ssh_key_pair',
|
||||
})
|
||||
def test_update_keys(self, *args):
|
||||
with patch.object(self.module, 'update_ssh_key_pair') as update_ssh_key_pair_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'public_key': 'public',
|
||||
'private_key': 'PRIVATE',
|
||||
'state': 'present',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(update_ssh_key_pair_mock.call_count, 1)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_key_pair, 'get_existing_ssh_key_pair', return_value={
|
||||
'public_key': 'public',
|
||||
'type': 'pipeline_ssh_key_pair',
|
||||
})
|
||||
def test_dont_update_same_key(self, *args):
|
||||
with patch.object(self.module, 'update_ssh_key_pair') as update_ssh_key_pair_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'public_key': 'public',
|
||||
'private_key': 'PRIVATE',
|
||||
'state': 'present',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(update_ssh_key_pair_mock.call_count, 0)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], False)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_key_pair, 'get_existing_ssh_key_pair', return_value={
|
||||
'public_key': 'unknown',
|
||||
'type': 'pipeline_ssh_key_pair',
|
||||
})
|
||||
def test_update_keys_check_mode(self, *args):
|
||||
with patch.object(self.module, 'update_ssh_key_pair') as update_ssh_key_pair_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'public_key': 'public',
|
||||
'private_key': 'PRIVATE',
|
||||
'state': 'present',
|
||||
'_ansible_check_mode': True,
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(update_ssh_key_pair_mock.call_count, 0)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_key_pair, 'get_existing_ssh_key_pair', return_value={
|
||||
'public_key': 'public',
|
||||
'type': 'pipeline_ssh_key_pair',
|
||||
})
|
||||
def test_delete_keys(self, *args):
|
||||
with patch.object(self.module, 'delete_ssh_key_pair') as delete_ssh_key_pair_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'state': 'absent',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(delete_ssh_key_pair_mock.call_count, 1)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_key_pair, 'get_existing_ssh_key_pair', return_value=None)
|
||||
def test_delete_absent_keys(self, *args):
|
||||
with patch.object(self.module, 'delete_ssh_key_pair') as delete_ssh_key_pair_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'state': 'absent',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(delete_ssh_key_pair_mock.call_count, 0)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], False)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_key_pair, 'get_existing_ssh_key_pair', return_value={
|
||||
'public_key': 'public',
|
||||
'type': 'pipeline_ssh_key_pair',
|
||||
})
|
||||
def test_delete_keys_check_mode(self, *args):
|
||||
with patch.object(self.module, 'delete_ssh_key_pair') as delete_ssh_key_pair_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'state': 'absent',
|
||||
'_ansible_check_mode': True,
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(delete_ssh_key_pair_mock.call_count, 0)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
|
@ -0,0 +1,187 @@
|
|||
import pytest
|
||||
|
||||
from ansible_collections.community.general.plugins.module_utils.source_control.bitbucket import BitbucketHelper
|
||||
from ansible_collections.community.general.plugins.modules.source_control.bitbucket import bitbucket_pipeline_known_host
|
||||
from ansible_collections.community.general.plugins.modules.source_control.bitbucket.bitbucket_pipeline_known_host import HAS_PARAMIKO
|
||||
from ansible_collections.community.general.tests.unit.compat import unittest
|
||||
from ansible_collections.community.general.tests.unit.compat.mock import patch
|
||||
from ansible_collections.community.general.tests.unit.plugins.modules.utils import AnsibleExitJson, ModuleTestCase, set_module_args
|
||||
|
||||
|
||||
class TestBucketPipelineKnownHostModule(ModuleTestCase):
|
||||
def setUp(self):
|
||||
super(TestBucketPipelineKnownHostModule, self).setUp()
|
||||
self.module = bitbucket_pipeline_known_host
|
||||
|
||||
@pytest.mark.skipif(not HAS_PARAMIKO, reason='paramiko must be installed to test key creation')
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_known_host, 'get_existing_known_host', return_value=None)
|
||||
def test_create_known_host(self, *args):
|
||||
with patch.object(self.module, 'create_known_host') as create_known_host_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'name': 'bitbucket.org',
|
||||
'state': 'present',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(create_known_host_mock.call_count, 1)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(BitbucketHelper, 'request', return_value=(dict(status=201), dict()))
|
||||
@patch.object(bitbucket_pipeline_known_host, 'get_existing_known_host', return_value=None)
|
||||
def test_create_known_host_with_key(self, *args):
|
||||
with patch.object(self.module, 'get_host_key') as get_host_key_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'name': 'bitbucket.org',
|
||||
'key': 'ssh-rsa public',
|
||||
'state': 'present',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(get_host_key_mock.call_count, 0)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
@pytest.mark.skipif(not HAS_PARAMIKO, reason='paramiko must be installed to test key creation')
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_known_host, 'get_existing_known_host', return_value={
|
||||
'type': 'pipeline_known_host',
|
||||
'uuid': '{21cc0590-bebe-4fae-8baf-03722704119a7}',
|
||||
'hostname': 'bitbucket.org',
|
||||
'public_key': {
|
||||
'type': 'pipeline_ssh_public_key',
|
||||
'md5_fingerprint': 'md5:97:8c:1b:f2:6f:14:6b:4b:3b:ec:aa:46:46:74:7c:40',
|
||||
'sha256_fingerprint': 'SHA256:zzXQOXSFBEiUtuE8AikoYKwbHaxvSc0ojez9YXaGp1A',
|
||||
'key_type': 'ssh-rsa',
|
||||
'key': 'AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kN...seeFVBoGqzHM9yXw=='
|
||||
}
|
||||
})
|
||||
def test_dont_create_same_value(self, *args):
|
||||
with patch.object(self.module, 'create_known_host') as create_known_host_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'name': 'bitbucket.org',
|
||||
'state': 'present',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(create_known_host_mock.call_count, 0)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], False)
|
||||
|
||||
@pytest.mark.skipif(not HAS_PARAMIKO, reason='paramiko must be installed to test key creation')
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_known_host, 'get_existing_known_host', return_value=None)
|
||||
def test_create_known_host_check_mode(self, *args):
|
||||
with patch.object(self.module, 'create_known_host') as create_known_host_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'name': 'bitbucket.org',
|
||||
'state': 'present',
|
||||
'_ansible_check_mode': True,
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(create_known_host_mock.call_count, 0)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
@pytest.mark.skipif(not HAS_PARAMIKO, reason='paramiko must be installed to test key creation')
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_known_host, 'get_existing_known_host', return_value={
|
||||
'type': 'pipeline_known_host',
|
||||
'uuid': '{21cc0590-bebe-4fae-8baf-03722704119a7}',
|
||||
'hostname': 'bitbucket.org',
|
||||
'public_key': {
|
||||
'type': 'pipeline_ssh_public_key',
|
||||
'md5_fingerprint': 'md5:97:8c:1b:f2:6f:14:6b:4b:3b:ec:aa:46:46:74:7c:40',
|
||||
'sha256_fingerprint': 'SHA256:zzXQOXSFBEiUtuE8AikoYKwbHaxvSc0ojez9YXaGp1A',
|
||||
'key_type': 'ssh-rsa',
|
||||
'key': 'AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kN...seeFVBoGqzHM9yXw=='
|
||||
}
|
||||
})
|
||||
def test_delete_known_host(self, *args):
|
||||
with patch.object(self.module, 'delete_known_host') as delete_known_host_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'name': 'bitbucket.org',
|
||||
'state': 'absent',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(delete_known_host_mock.call_count, 1)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
@pytest.mark.skipif(not HAS_PARAMIKO, reason='paramiko must be installed to test key creation')
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_known_host, 'get_existing_known_host', return_value=None)
|
||||
def test_delete_absent_known_host(self, *args):
|
||||
with patch.object(self.module, 'delete_known_host') as delete_known_host_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'name': 'bitbucket.org',
|
||||
'state': 'absent',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(delete_known_host_mock.call_count, 0)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], False)
|
||||
|
||||
@pytest.mark.skipif(not HAS_PARAMIKO, reason='paramiko must be installed to test key creation')
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_known_host, 'get_existing_known_host', return_value={
|
||||
'type': 'pipeline_known_host',
|
||||
'uuid': '{21cc0590-bebe-4fae-8baf-03722704119a7}',
|
||||
'hostname': 'bitbucket.org',
|
||||
'public_key': {
|
||||
'type': 'pipeline_ssh_public_key',
|
||||
'md5_fingerprint': 'md5:97:8c:1b:f2:6f:14:6b:4b:3b:ec:aa:46:46:74:7c:40',
|
||||
'sha256_fingerprint': 'SHA256:zzXQOXSFBEiUtuE8AikoYKwbHaxvSc0ojez9YXaGp1A',
|
||||
'key_type': 'ssh-rsa',
|
||||
'key': 'AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kN...seeFVBoGqzHM9yXw=='
|
||||
}
|
||||
})
|
||||
def test_delete_known_host_check_mode(self, *args):
|
||||
with patch.object(self.module, 'delete_known_host') as delete_known_host_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'name': 'bitbucket.org',
|
||||
'state': 'absent',
|
||||
'_ansible_check_mode': True,
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(delete_known_host_mock.call_count, 0)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
|
@ -0,0 +1,290 @@
|
|||
from ansible_collections.community.general.plugins.module_utils.source_control.bitbucket import BitbucketHelper
|
||||
from ansible_collections.community.general.plugins.modules.source_control.bitbucket import bitbucket_pipeline_variable
|
||||
from ansible_collections.community.general.tests.unit.compat import unittest
|
||||
from ansible_collections.community.general.tests.unit.compat.mock import patch
|
||||
from ansible_collections.community.general.tests.unit.plugins.modules.utils import AnsibleFailJson, AnsibleExitJson, ModuleTestCase, set_module_args
|
||||
|
||||
|
||||
class TestBucketPipelineVariableModule(ModuleTestCase):
|
||||
def setUp(self):
|
||||
super(TestBucketPipelineVariableModule, self).setUp()
|
||||
self.module = bitbucket_pipeline_variable
|
||||
|
||||
def test_without_required_parameters(self):
|
||||
with self.assertRaises(AnsibleFailJson) as exec_info:
|
||||
set_module_args({
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'name': 'PIPELINE_VAR_NAME',
|
||||
'state': 'absent',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(exec_info.exception.args[0]['msg'], BitbucketHelper.error_messages['required_client_id'])
|
||||
|
||||
def test_missing_value_with_present_state(self):
|
||||
with self.assertRaises(AnsibleFailJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'name': 'PIPELINE_VAR_NAME',
|
||||
'state': 'present',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(exec_info.exception.args[0]['msg'], self.module.error_messages['required_value'])
|
||||
|
||||
@patch.dict('os.environ', {
|
||||
'BITBUCKET_CLIENT_ID': 'ABC',
|
||||
'BITBUCKET_CLIENT_SECRET': 'XXX',
|
||||
})
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_variable, 'get_existing_pipeline_variable', return_value=None)
|
||||
def test_env_vars_params(self, *args):
|
||||
with self.assertRaises(AnsibleExitJson):
|
||||
set_module_args({
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'name': 'PIPELINE_VAR_NAME',
|
||||
'state': 'absent',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_variable, 'get_existing_pipeline_variable', return_value=None)
|
||||
def test_create_variable(self, *args):
|
||||
with patch.object(self.module, 'create_pipeline_variable') as create_pipeline_variable_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'name': 'PIPELINE_VAR_NAME',
|
||||
'value': '42',
|
||||
'state': 'present',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(create_pipeline_variable_mock.call_count, 1)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_variable, 'get_existing_pipeline_variable', return_value=None)
|
||||
def test_create_variable_check_mode(self, *args):
|
||||
with patch.object(self.module, 'create_pipeline_variable') as create_pipeline_variable_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'name': 'PIPELINE_VAR_NAME',
|
||||
'value': '42',
|
||||
'state': 'present',
|
||||
'_ansible_check_mode': True,
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(create_pipeline_variable_mock.call_count, 0)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_variable, 'get_existing_pipeline_variable', return_value={
|
||||
'name': 'PIPELINE_VAR_NAME',
|
||||
'value': 'Im alive',
|
||||
'type': 'pipeline_variable',
|
||||
'secured': False,
|
||||
'uuid': '{9ddb0507-439a-495a- 99f3 - 564f15138127}'
|
||||
})
|
||||
def test_update_variable(self, *args):
|
||||
with patch.object(self.module, 'update_pipeline_variable') as update_pipeline_variable_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'name': 'PIPELINE_VAR_NAME',
|
||||
'value': '42',
|
||||
'state': 'present',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(update_pipeline_variable_mock.call_count, 1)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_variable, 'get_existing_pipeline_variable', return_value={
|
||||
'name': 'PIPELINE_VAR_NAME',
|
||||
'type': 'pipeline_variable',
|
||||
'secured': True,
|
||||
'uuid': '{9ddb0507-439a-495a- 99f3 - 564f15138127}'
|
||||
})
|
||||
def test_update_secured_variable(self, *args):
|
||||
with patch.object(self.module, 'update_pipeline_variable') as update_pipeline_variable_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'name': 'PIPELINE_VAR_NAME',
|
||||
'value': '42',
|
||||
'secured': True,
|
||||
'state': 'present',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(update_pipeline_variable_mock.call_count, 1)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_variable, 'get_existing_pipeline_variable', return_value={
|
||||
'name': 'PIPELINE_VAR_NAME',
|
||||
'value': '42',
|
||||
'type': 'pipeline_variable',
|
||||
'secured': False,
|
||||
'uuid': '{9ddb0507-439a-495a- 99f3 - 564f15138127}'
|
||||
})
|
||||
def test_update_secured_state(self, *args):
|
||||
with patch.object(self.module, 'update_pipeline_variable') as update_pipeline_variable_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'name': 'PIPELINE_VAR_NAME',
|
||||
'value': '42',
|
||||
'secured': True,
|
||||
'state': 'present',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(update_pipeline_variable_mock.call_count, 1)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_variable, 'get_existing_pipeline_variable', return_value={
|
||||
'name': 'PIPELINE_VAR_NAME',
|
||||
'value': '42',
|
||||
'type': 'pipeline_variable',
|
||||
'secured': False,
|
||||
'uuid': '{9ddb0507-439a-495a- 99f3 - 564f15138127}'
|
||||
})
|
||||
def test_dont_update_same_value(self, *args):
|
||||
with patch.object(self.module, 'update_pipeline_variable') as update_pipeline_variable_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'name': 'PIPELINE_VAR_NAME',
|
||||
'value': '42',
|
||||
'state': 'present',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(update_pipeline_variable_mock.call_count, 0)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], False)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_variable, 'get_existing_pipeline_variable', return_value={
|
||||
'name': 'PIPELINE_VAR_NAME',
|
||||
'value': 'Im alive',
|
||||
'type': 'pipeline_variable',
|
||||
'secured': False,
|
||||
'uuid': '{9ddb0507-439a-495a- 99f3 - 564f15138127}'
|
||||
})
|
||||
def test_update_variable_check_mode(self, *args):
|
||||
with patch.object(self.module, 'update_pipeline_variable') as update_pipeline_variable_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'name': 'PIPELINE_VAR_NAME',
|
||||
'value': '42',
|
||||
'state': 'present',
|
||||
'_ansible_check_mode': True,
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(update_pipeline_variable_mock.call_count, 0)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_variable, 'get_existing_pipeline_variable', return_value={
|
||||
'name': 'PIPELINE_VAR_NAME',
|
||||
'value': 'Im alive',
|
||||
'type': 'pipeline_variable',
|
||||
'secured': False,
|
||||
'uuid': '{9ddb0507-439a-495a- 99f3 - 564f15138127}'
|
||||
})
|
||||
def test_delete_variable(self, *args):
|
||||
with patch.object(self.module, 'delete_pipeline_variable') as delete_pipeline_variable_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'name': 'PIPELINE_VAR_NAME',
|
||||
'state': 'absent',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(delete_pipeline_variable_mock.call_count, 1)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_variable, 'get_existing_pipeline_variable', return_value=None)
|
||||
def test_delete_absent_variable(self, *args):
|
||||
with patch.object(self.module, 'delete_pipeline_variable') as delete_pipeline_variable_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'name': 'PIPELINE_VAR_NAME',
|
||||
'state': 'absent',
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(delete_pipeline_variable_mock.call_count, 0)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], False)
|
||||
|
||||
@patch.object(BitbucketHelper, 'fetch_access_token', return_value='token')
|
||||
@patch.object(bitbucket_pipeline_variable, 'get_existing_pipeline_variable', return_value={
|
||||
'name': 'PIPELINE_VAR_NAME',
|
||||
'value': 'Im alive',
|
||||
'type': 'pipeline_variable',
|
||||
'secured': False,
|
||||
'uuid': '{9ddb0507-439a-495a- 99f3 - 564f15138127}'
|
||||
})
|
||||
def test_delete_variable_check_mode(self, *args):
|
||||
with patch.object(self.module, 'delete_pipeline_variable') as delete_pipeline_variable_mock:
|
||||
with self.assertRaises(AnsibleExitJson) as exec_info:
|
||||
set_module_args({
|
||||
'client_id': 'ABC',
|
||||
'client_secret': 'XXX',
|
||||
'username': 'name',
|
||||
'repository': 'repo',
|
||||
'name': 'PIPELINE_VAR_NAME',
|
||||
'state': 'absent',
|
||||
'_ansible_check_mode': True,
|
||||
})
|
||||
self.module.main()
|
||||
|
||||
self.assertEqual(delete_pipeline_variable_mock.call_count, 0)
|
||||
self.assertEqual(exec_info.exception.args[0]['changed'], True)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
580
tests/unit/plugins/modules/source_control/gitlab/gitlab.py
Normal file
580
tests/unit/plugins/modules/source_control/gitlab/gitlab.py
Normal file
|
@ -0,0 +1,580 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright: (c) 2019, Guillaume Martinez (lunik@tiwabbit.fr)
|
||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
import sys
|
||||
|
||||
from httmock import response # noqa
|
||||
from httmock import urlmatch # noqa
|
||||
|
||||
from ansible_collections.community.general.tests.unit.compat import unittest
|
||||
|
||||
from gitlab import Gitlab
|
||||
|
||||
|
||||
class FakeAnsibleModule(object):
|
||||
def __init__(self):
|
||||
self.check_mode = False
|
||||
|
||||
def fail_json(self, **args):
|
||||
pass
|
||||
|
||||
def exit_json(self, **args):
|
||||
pass
|
||||
|
||||
|
||||
class GitlabModuleTestCase(unittest.TestCase):
|
||||
def setUp(self):
|
||||
unitest_python_version_check_requirement(self)
|
||||
|
||||
self.mock_module = FakeAnsibleModule()
|
||||
|
||||
self.gitlab_instance = Gitlab("http://localhost", private_token="private_token", api_version=4)
|
||||
|
||||
|
||||
# Python 2.7+ is needed for python-gitlab
|
||||
GITLAB_MINIMUM_PYTHON_VERSION = (2, 7)
|
||||
|
||||
|
||||
# Verify if the current Python version is higher than GITLAB_MINIMUM_PYTHON_VERSION
|
||||
def python_version_match_requirement():
|
||||
return sys.version_info >= GITLAB_MINIMUM_PYTHON_VERSION
|
||||
|
||||
|
||||
# Skip unittest test case if python version don't match requirement
|
||||
def unitest_python_version_check_requirement(unittest_testcase):
|
||||
if not python_version_match_requirement():
|
||||
unittest_testcase.skipTest("Python %s+ is needed for python-gitlab" % ",".join(map(str, GITLAB_MINIMUM_PYTHON_VERSION)))
|
||||
|
||||
|
||||
'''
|
||||
USER API
|
||||
'''
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/users", method="get")
|
||||
def resp_find_user(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('[{"id": 1, "username": "john_smith", "name": "John Smith", "state": "active",'
|
||||
'"avatar_url": "http://localhost:3000/uploads/user/avatar/1/cd8.jpeg",'
|
||||
'"web_url": "http://localhost:3000/john_smith"}, {"id": 2,'
|
||||
'"username": "jack_smith", "name": "Jack Smith", "state": "blocked",'
|
||||
'"avatar_url": "http://gravatar.com/../e32131cd8.jpeg",'
|
||||
'"web_url": "http://localhost:3000/jack_smith"}]')
|
||||
content = content.encode("utf-8")
|
||||
return response(200, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/users", method="post")
|
||||
def resp_create_user(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{"id": 1, "username": "john_smith", "name": "John Smith", "state": "active",'
|
||||
'"avatar_url": "http://localhost:3000/uploads/user/avatar/1/cd8.jpeg",'
|
||||
'"web_url": "http://localhost:3000/john_smith","created_at": "2012-05-23T08:00:58Z",'
|
||||
'"bio": null, "location": null, "public_email": "john@example.com", "skype": "",'
|
||||
'"linkedin": "", "twitter": "", "website_url": "", "organization": ""}')
|
||||
content = content.encode("utf-8")
|
||||
return response(201, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/users/1", method="get")
|
||||
def resp_get_user(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{"id": 1, "username": "john_smith", "name": "John Smith",'
|
||||
'"state": "active",'
|
||||
'"avatar_url": "http://localhost:3000/uploads/user/avatar/1/cd8.jpeg",'
|
||||
'"web_url": "http://localhost:3000/john_smith",'
|
||||
'"created_at": "2012-05-23T08:00:58Z", "bio": null, "location": null,'
|
||||
'"public_email": "john@example.com", "skype": "", "linkedin": "",'
|
||||
'"twitter": "", "website_url": "", "organization": "", "is_admin": false}')
|
||||
content = content.encode("utf-8")
|
||||
return response(200, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/users/1", method="get")
|
||||
def resp_get_missing_user(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{}')
|
||||
content = content.encode("utf-8")
|
||||
return response(404, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/users/1", method="delete")
|
||||
def resp_delete_user(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{}')
|
||||
content = content.encode("utf-8")
|
||||
return response(204, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/users/1", method="delete")
|
||||
def resp_delete_missing_user(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{}')
|
||||
content = content.encode("utf-8")
|
||||
return response(404, content, headers, None, 5, request)
|
||||
|
||||
|
||||
'''
|
||||
USER SSHKEY API
|
||||
'''
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/users/1/keys", method="get")
|
||||
def resp_get_user_keys(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('[{"id": 1, "title": "Public key",'
|
||||
'"key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596'
|
||||
'k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQa'
|
||||
'SeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=",'
|
||||
'"created_at": "2014-08-01T14:47:39.080Z"},{"id": 3,'
|
||||
'"title": "Another Public key",'
|
||||
'"key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596'
|
||||
'k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaS'
|
||||
'eP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=",'
|
||||
'"created_at": "2014-08-01T14:47:39.080Z"}]')
|
||||
content = content.encode("utf-8")
|
||||
return response(200, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/users/1/keys", method="post")
|
||||
def resp_create_user_keys(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{"id": 1, "title": "Private key",'
|
||||
'"key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDA1YotVDm2mAyk2tPt4E7AHm01sS6JZmcUdRuSuA5z'
|
||||
'szUJzYPPUSRAX3BCgTqLqYx//UuVncK7YqLVSbbwjKR2Ez5lISgCnVfLVEXzwhv+xawxKWmI7hJ5S0tOv6MJ+Ixy'
|
||||
'Ta4xcKwJTwB86z22n9fVOQeJTR2dSOH1WJrf0PvRk+KVNY2jTiGHTi9AIjLnyD/jWRpOgtdfkLRc8EzAWrWlgNmH'
|
||||
'2WOKBw6za0az6XoG75obUdFVdW3qcD0xc809OHLi7FDf+E7U4wiZJCFuUizMeXyuK/SkaE1aee4Qp5R4dxTR4TP9'
|
||||
'M1XAYkf+kF0W9srZ+mhF069XD/zhUPJsvwEF",'
|
||||
'"created_at": "2014-08-01T14:47:39.080Z"}')
|
||||
content = content.encode("utf-8")
|
||||
return response(201, content, headers, None, 5, request)
|
||||
|
||||
|
||||
'''
|
||||
GROUP API
|
||||
'''
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/groups", method="get")
|
||||
def resp_find_group(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('[{"id": 1, "name": "Foobar Group", "path": "foo-bar",'
|
||||
'"description": "An interesting group", "visibility": "public",'
|
||||
'"lfs_enabled": true, "avatar_url": "http://localhost:3000/uploads/group/avatar/1/foo.jpg",'
|
||||
'"web_url": "http://localhost:3000/groups/foo-bar", "request_access_enabled": false,'
|
||||
'"full_name": "Foobar Group", "full_path": "foo-bar",'
|
||||
'"file_template_project_id": 1, "parent_id": null, "projects": []}, {"id": 2, "name": "BarFoo Group", "path": "bar-foor",'
|
||||
'"description": "An interesting group", "visibility": "public",'
|
||||
'"lfs_enabled": true, "avatar_url": "http://localhost:3000/uploads/group/avatar/2/bar.jpg",'
|
||||
'"web_url": "http://localhost:3000/groups/bar-foo", "request_access_enabled": false,'
|
||||
'"full_name": "BarFoo Group", "full_path": "bar-foo",'
|
||||
'"file_template_project_id": 1, "parent_id": null, "projects": []}]')
|
||||
content = content.encode("utf-8")
|
||||
return response(200, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/groups/1", method="get")
|
||||
def resp_get_group(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{"id": 1, "name": "Foobar Group", "path": "foo-bar",'
|
||||
'"description": "An interesting group", "visibility": "public",'
|
||||
'"lfs_enabled": true, "avatar_url": "http://localhost:3000/uploads/group/avatar/1/foo.jpg",'
|
||||
'"web_url": "http://localhost:3000/groups/foo-bar", "request_access_enabled": false,'
|
||||
'"full_name": "Foobar Group", "full_path": "foo-bar",'
|
||||
'"file_template_project_id": 1, "parent_id": null, "projects": [{"id": 1,"description": null, "default_branch": "master",'
|
||||
'"ssh_url_to_repo": "git@example.com:diaspora/diaspora-client.git",'
|
||||
'"http_url_to_repo": "http://example.com/diaspora/diaspora-client.git",'
|
||||
'"web_url": "http://example.com/diaspora/diaspora-client",'
|
||||
'"readme_url": "http://example.com/diaspora/diaspora-client/blob/master/README.md",'
|
||||
'"tag_list": ["example","disapora client"],"name": "Diaspora Client",'
|
||||
'"name_with_namespace": "Diaspora / Diaspora Client","path": "diaspora-client",'
|
||||
'"path_with_namespace": "diaspora/diaspora-client","created_at": "2013-09-30T13:46:02Z",'
|
||||
'"last_activity_at": "2013-09-30T13:46:02Z","forks_count": 0,'
|
||||
'"avatar_url": "http://example.com/uploads/project/avatar/4/uploads/avatar.png",'
|
||||
'"star_count": 0}]}')
|
||||
content = content.encode("utf-8")
|
||||
return response(200, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/groups/1", method="get")
|
||||
def resp_get_missing_group(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{}')
|
||||
content = content.encode("utf-8")
|
||||
return response(404, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/groups", method="post")
|
||||
def resp_create_group(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{"id": 1, "name": "Foobar Group", "path": "foo-bar",'
|
||||
'"description": "An interesting group", "visibility": "public",'
|
||||
'"lfs_enabled": true, "avatar_url": "http://localhost:3000/uploads/group/avatar/1/foo.jpg",'
|
||||
'"web_url": "http://localhost:3000/groups/foo-bar", "request_access_enabled": false,'
|
||||
'"full_name": "Foobar Group", "full_path": "foo-bar",'
|
||||
'"file_template_project_id": 1, "parent_id": null}')
|
||||
content = content.encode("utf-8")
|
||||
return response(200, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/groups", method="post")
|
||||
def resp_create_subgroup(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{"id": 2, "name": "BarFoo Group", "path": "bar-foor",'
|
||||
'"description": "An interesting group", "visibility": "public",'
|
||||
'"lfs_enabled": true, "avatar_url": "http://localhost:3000/uploads/group/avatar/2/bar.jpg",'
|
||||
'"web_url": "http://localhost:3000/groups/foo-bar/bar-foo", "request_access_enabled": false,'
|
||||
'"full_name": "BarFoo Group", "full_path": "foo-bar/bar-foo",'
|
||||
'"file_template_project_id": 1, "parent_id": 1}')
|
||||
content = content.encode("utf-8")
|
||||
return response(200, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/users/1", method="delete")
|
||||
def resp_delete_group(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{}')
|
||||
content = content.encode("utf-8")
|
||||
return response(204, content, headers, None, 5, request)
|
||||
|
||||
|
||||
'''
|
||||
GROUP MEMBER API
|
||||
'''
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/groups/1/members/1", method="get")
|
||||
def resp_get_member(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{"id": 1, "username": "raymond_smith", "name": "Raymond Smith", "state": "active",'
|
||||
'"avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",'
|
||||
'"web_url": "http://192.168.1.8:3000/root", "expires_at": "2012-10-22T14:13:35Z", "access_level": 30}')
|
||||
content = content.encode("utf-8")
|
||||
return response(200, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/groups/1/members", method="get")
|
||||
def resp_find_member(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('[{"id": 1, "username": "raymond_smith", "name": "Raymond Smith", "state": "active",'
|
||||
'"avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",'
|
||||
'"web_url": "http://192.168.1.8:3000/root", "expires_at": "2012-10-22T14:13:35Z", "access_level": 30},{'
|
||||
'"id": 2, "username": "john_doe", "name": "John Doe","state": "active",'
|
||||
'"avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",'
|
||||
'"web_url": "http://192.168.1.8:3000/root","expires_at": "2012-10-22T14:13:35Z",'
|
||||
'"access_level": 30}]')
|
||||
content = content.encode("utf-8")
|
||||
return response(200, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/groups/1/members", method="post")
|
||||
def resp_add_member(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{"id": 1, "username": "raymond_smith", "name": "Raymond Smith",'
|
||||
'"state": "active",'
|
||||
'"avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",'
|
||||
'"web_url": "http://192.168.1.8:3000/root", "expires_at": "2012-10-22T14:13:35Z",'
|
||||
'"access_level": 30}')
|
||||
content = content.encode("utf-8")
|
||||
return response(200, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/groups/1/members/1", method="put")
|
||||
def resp_update_member(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{"id": 1, "username": "raymond_smith", "name": "Raymond Smith",'
|
||||
'"state": "active",'
|
||||
'"avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",'
|
||||
'"web_url": "http://192.168.1.8:3000/root", "expires_at": "2012-10-22T14:13:35Z",'
|
||||
'"access_level": 10}')
|
||||
content = content.encode("utf-8")
|
||||
return response(200, content, headers, None, 5, request)
|
||||
|
||||
|
||||
'''
|
||||
DEPLOY KEY API
|
||||
'''
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/projects/1/deploy_keys", method="get")
|
||||
def resp_find_project_deploy_key(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('[{"id": 1,"title": "Public key",'
|
||||
'"key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxc'
|
||||
'KDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=",'
|
||||
'"created_at": "2013-10-02T10:12:29Z"},{"id": 3,"title": "Another Public key",'
|
||||
'"key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxc'
|
||||
'KDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=",'
|
||||
'"created_at": "2013-10-02T11:12:29Z"}]')
|
||||
content = content.encode("utf-8")
|
||||
return response(200, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/projects/1/deploy_keys/1", method="get")
|
||||
def resp_get_project_deploy_key(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{"id": 1,"title": "Public key",'
|
||||
'"key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxc'
|
||||
'KDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=",'
|
||||
'"created_at": "2013-10-02T10:12:29Z"}')
|
||||
content = content.encode("utf-8")
|
||||
return response(200, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/projects/1/deploy_keys", method="post")
|
||||
def resp_create_project_deploy_key(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{"id": 1,"title": "Public key",'
|
||||
'"key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxc'
|
||||
'KDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=",'
|
||||
'"created_at": "2013-10-02T10:12:29Z"}')
|
||||
content = content.encode("utf-8")
|
||||
return response(201, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/projects/1/deploy_keys/1", method="delete")
|
||||
def resp_delete_project_deploy_key(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{}')
|
||||
content = content.encode("utf-8")
|
||||
return response(204, content, headers, None, 5, request)
|
||||
|
||||
|
||||
'''
|
||||
PROJECT API
|
||||
'''
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/projects", method="get")
|
||||
def resp_find_project(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('[{"id": 1,"description": null, "default_branch": "master",'
|
||||
'"ssh_url_to_repo": "git@example.com:diaspora/diaspora-client.git",'
|
||||
'"http_url_to_repo": "http://example.com/diaspora/diaspora-client.git",'
|
||||
'"web_url": "http://example.com/diaspora/diaspora-client",'
|
||||
'"readme_url": "http://example.com/diaspora/diaspora-client/blob/master/README.md",'
|
||||
'"tag_list": ["example","disapora client"],"name": "Diaspora Client",'
|
||||
'"name_with_namespace": "Diaspora / Diaspora Client","path": "diaspora-client",'
|
||||
'"path_with_namespace": "diaspora/diaspora-client","created_at": "2013-09-30T13:46:02Z",'
|
||||
'"last_activity_at": "2013-09-30T13:46:02Z","forks_count": 0,'
|
||||
'"avatar_url": "http://example.com/uploads/project/avatar/4/uploads/avatar.png",'
|
||||
'"star_count": 0}]')
|
||||
content = content.encode("utf-8")
|
||||
return response(200, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/projects/1", method="get")
|
||||
def resp_get_project(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{"id": 1,"description": null, "default_branch": "master",'
|
||||
'"ssh_url_to_repo": "git@example.com:diaspora/diaspora-client.git",'
|
||||
'"http_url_to_repo": "http://example.com/diaspora/diaspora-client.git",'
|
||||
'"web_url": "http://example.com/diaspora/diaspora-client",'
|
||||
'"readme_url": "http://example.com/diaspora/diaspora-client/blob/master/README.md",'
|
||||
'"tag_list": ["example","disapora client"],"name": "Diaspora Client",'
|
||||
'"name_with_namespace": "Diaspora / Diaspora Client","path": "diaspora-client",'
|
||||
'"path_with_namespace": "diaspora/diaspora-client","created_at": "2013-09-30T13:46:02Z",'
|
||||
'"last_activity_at": "2013-09-30T13:46:02Z","forks_count": 0,'
|
||||
'"avatar_url": "http://example.com/uploads/project/avatar/4/uploads/avatar.png",'
|
||||
'"star_count": 0}')
|
||||
content = content.encode("utf-8")
|
||||
return response(200, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/projects/foo-bar%2Fdiaspora-client", method="get")
|
||||
def resp_get_project_by_name(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{"id": 1,"description": null, "default_branch": "master",'
|
||||
'"ssh_url_to_repo": "git@example.com:diaspora/diaspora-client.git",'
|
||||
'"http_url_to_repo": "http://example.com/diaspora/diaspora-client.git",'
|
||||
'"web_url": "http://example.com/diaspora/diaspora-client",'
|
||||
'"readme_url": "http://example.com/diaspora/diaspora-client/blob/master/README.md",'
|
||||
'"tag_list": ["example","disapora client"],"name": "Diaspora Client",'
|
||||
'"name_with_namespace": "Diaspora / Diaspora Client","path": "diaspora-client",'
|
||||
'"path_with_namespace": "diaspora/diaspora-client","created_at": "2013-09-30T13:46:02Z",'
|
||||
'"last_activity_at": "2013-09-30T13:46:02Z","forks_count": 0,'
|
||||
'"avatar_url": "http://example.com/uploads/project/avatar/4/uploads/avatar.png",'
|
||||
'"star_count": 0}')
|
||||
content = content.encode("utf-8")
|
||||
return response(200, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/groups/1/projects", method="get")
|
||||
def resp_find_group_project(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('[{"id": 1,"description": null, "default_branch": "master",'
|
||||
'"ssh_url_to_repo": "git@example.com:diaspora/diaspora-client.git",'
|
||||
'"http_url_to_repo": "http://example.com/diaspora/diaspora-client.git",'
|
||||
'"web_url": "http://example.com/diaspora/diaspora-client",'
|
||||
'"readme_url": "http://example.com/diaspora/diaspora-client/blob/master/README.md",'
|
||||
'"tag_list": ["example","disapora client"],"name": "Diaspora Client",'
|
||||
'"name_with_namespace": "Diaspora / Diaspora Client","path": "diaspora-client",'
|
||||
'"path_with_namespace": "diaspora/diaspora-client","created_at": "2013-09-30T13:46:02Z",'
|
||||
'"last_activity_at": "2013-09-30T13:46:02Z","forks_count": 0,'
|
||||
'"avatar_url": "http://example.com/uploads/project/avatar/4/uploads/avatar.png",'
|
||||
'"star_count": 0}]')
|
||||
content = content.encode("utf-8")
|
||||
return response(200, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/groups/1/projects/1", method="get")
|
||||
def resp_get_group_project(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{"id": 1,"description": null, "default_branch": "master",'
|
||||
'"ssh_url_to_repo": "git@example.com:diaspora/diaspora-client.git",'
|
||||
'"http_url_to_repo": "http://example.com/diaspora/diaspora-client.git",'
|
||||
'"web_url": "http://example.com/diaspora/diaspora-client",'
|
||||
'"readme_url": "http://example.com/diaspora/diaspora-client/blob/master/README.md",'
|
||||
'"tag_list": ["example","disapora client"],"name": "Diaspora Client",'
|
||||
'"name_with_namespace": "Diaspora / Diaspora Client","path": "diaspora-client",'
|
||||
'"path_with_namespace": "diaspora/diaspora-client","created_at": "2013-09-30T13:46:02Z",'
|
||||
'"last_activity_at": "2013-09-30T13:46:02Z","forks_count": 0,'
|
||||
'"avatar_url": "http://example.com/uploads/project/avatar/4/uploads/avatar.png",'
|
||||
'"star_count": 0}')
|
||||
content = content.encode("utf-8")
|
||||
return response(200, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/projects", method="post")
|
||||
def resp_create_project(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{"id": 1,"description": null, "default_branch": "master",'
|
||||
'"ssh_url_to_repo": "git@example.com:diaspora/diaspora-client.git",'
|
||||
'"http_url_to_repo": "http://example.com/diaspora/diaspora-client.git",'
|
||||
'"web_url": "http://example.com/diaspora/diaspora-client",'
|
||||
'"readme_url": "http://example.com/diaspora/diaspora-client/blob/master/README.md",'
|
||||
'"tag_list": ["example","disapora client"],"name": "Diaspora Client",'
|
||||
'"name_with_namespace": "Diaspora / Diaspora Client","path": "diaspora-client",'
|
||||
'"path_with_namespace": "diaspora/diaspora-client","created_at": "2013-09-30T13:46:02Z",'
|
||||
'"last_activity_at": "2013-09-30T13:46:02Z","forks_count": 0,'
|
||||
'"avatar_url": "http://example.com/uploads/project/avatar/4/uploads/avatar.png",'
|
||||
'"star_count": 0}')
|
||||
content = content.encode("utf-8")
|
||||
return response(201, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/projects/1", method="delete")
|
||||
def resp_delete_project(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{}')
|
||||
content = content.encode("utf-8")
|
||||
|
||||
return response(204, content, headers, None, 5, request)
|
||||
|
||||
|
||||
'''
|
||||
HOOK API
|
||||
'''
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/projects/1/hooks", method="get")
|
||||
def resp_find_project_hook(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('[{"id": 1,"url": "http://example.com/hook","project_id": 3,'
|
||||
'"push_events": true,"push_events_branch_filter": "","issues_events": true,'
|
||||
'"confidential_issues_events": true,"merge_requests_events": true,'
|
||||
'"tag_push_events": true,"note_events": true,"job_events": true,'
|
||||
'"pipeline_events": true,"wiki_page_events": true,"enable_ssl_verification": true,'
|
||||
'"created_at": "2012-10-12T17:04:47Z"}]')
|
||||
content = content.encode("utf-8")
|
||||
return response(200, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/projects/1/hooks/1", method="get")
|
||||
def resp_get_project_hook(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{"id": 1,"url": "http://example.com/hook","project_id": 3,'
|
||||
'"push_events": true,"push_events_branch_filter": "","issues_events": true,'
|
||||
'"confidential_issues_events": true,"merge_requests_events": true,'
|
||||
'"tag_push_events": true,"note_events": true,"job_events": true,'
|
||||
'"pipeline_events": true,"wiki_page_events": true,"enable_ssl_verification": true,'
|
||||
'"created_at": "2012-10-12T17:04:47Z"}')
|
||||
content = content.encode("utf-8")
|
||||
return response(200, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/projects/1/hooks", method="post")
|
||||
def resp_create_project_hook(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{"id": 1,"url": "http://example.com/hook","project_id": 3,'
|
||||
'"push_events": true,"push_events_branch_filter": "","issues_events": true,'
|
||||
'"confidential_issues_events": true,"merge_requests_events": true,'
|
||||
'"tag_push_events": true,"note_events": true,"job_events": true,'
|
||||
'"pipeline_events": true,"wiki_page_events": true,"enable_ssl_verification": true,'
|
||||
'"created_at": "2012-10-12T17:04:47Z"}')
|
||||
content = content.encode("utf-8")
|
||||
return response(201, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/projects/1/hooks/1", method="delete")
|
||||
def resp_delete_project_hook(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{}')
|
||||
content = content.encode("utf-8")
|
||||
return response(204, content, headers, None, 5, request)
|
||||
|
||||
|
||||
'''
|
||||
RUNNER API
|
||||
'''
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/runners/all", method="get")
|
||||
def resp_find_runners_all(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('[{"active": true,"description": "test-1-20150125","id": 1,'
|
||||
'"is_shared": false,"ip_address": "127.0.0.1","name": null,'
|
||||
'"online": true,"status": "online"},{"active": true,'
|
||||
'"description": "test-2-20150125","id": 2,"ip_address": "127.0.0.1",'
|
||||
'"is_shared": false,"name": null,"online": false,"status": "offline"}]')
|
||||
content = content.encode("utf-8")
|
||||
return response(200, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/runners", method="get")
|
||||
def resp_find_runners_list(url, request):
|
||||
headers = {'content-type': 'application/json',
|
||||
"X-Page": 1,
|
||||
"X-Next-Page": 2,
|
||||
"X-Per-Page": 1,
|
||||
"X-Total-Pages": 1,
|
||||
"X-Total": 2}
|
||||
content = ('[{"active": true,"description": "test-1-20150125","id": 1,'
|
||||
'"is_shared": false,"ip_address": "127.0.0.1","name": null,'
|
||||
'"online": true,"status": "online"},{"active": true,'
|
||||
'"description": "test-2-20150125","id": 2,"ip_address": "127.0.0.1",'
|
||||
'"is_shared": false,"name": null,"online": false,"status": "offline"}]')
|
||||
content = content.encode("utf-8")
|
||||
return response(200, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/runners/1", method="get")
|
||||
def resp_get_runner(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{"active": true,"description": "test-1-20150125","id": 1,'
|
||||
'"is_shared": false,"ip_address": "127.0.0.1","name": null,'
|
||||
'"online": true,"status": "online"}')
|
||||
content = content.encode("utf-8")
|
||||
return response(200, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/runners", method="post")
|
||||
def resp_create_runner(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{"active": true,"description": "test-1-20150125","id": 1,'
|
||||
'"is_shared": false,"ip_address": "127.0.0.1","name": null,'
|
||||
'"online": true,"status": "online"}')
|
||||
content = content.encode("utf-8")
|
||||
return response(201, content, headers, None, 5, request)
|
||||
|
||||
|
||||
@urlmatch(scheme="http", netloc="localhost", path="/api/v4/runners/1", method="delete")
|
||||
def resp_delete_runner(url, request):
|
||||
headers = {'content-type': 'application/json'}
|
||||
content = ('{}')
|
||||
content = content.encode("utf-8")
|
||||
return response(204, content, headers, None, 5, request)
|
|
@ -0,0 +1,107 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright: (c) 2019, Guillaume Martinez (lunik@tiwabbit.fr)
|
||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
import pytest
|
||||
|
||||
from ansible_collections.community.general.plugins.modules.source_control.gitlab.gitlab_deploy_key import GitLabDeployKey
|
||||
|
||||
|
||||
def _dummy(x):
|
||||
"""Dummy function. Only used as a placeholder for toplevel definitions when the test is going
|
||||
to be skipped anyway"""
|
||||
return x
|
||||
|
||||
|
||||
pytestmark = []
|
||||
try:
|
||||
from .gitlab import (GitlabModuleTestCase,
|
||||
python_version_match_requirement,
|
||||
resp_get_project, resp_find_project_deploy_key,
|
||||
resp_create_project_deploy_key, resp_delete_project_deploy_key)
|
||||
|
||||
# GitLab module requirements
|
||||
if python_version_match_requirement():
|
||||
from gitlab.v4.objects import ProjectKey
|
||||
except ImportError:
|
||||
pytestmark.append(pytest.mark.skip("Could not load gitlab module required for testing"))
|
||||
# Need to set these to something so that we don't fail when parsing
|
||||
GitlabModuleTestCase = object
|
||||
resp_get_project = _dummy
|
||||
resp_find_project_deploy_key = _dummy
|
||||
resp_create_project_deploy_key = _dummy
|
||||
resp_delete_project_deploy_key = _dummy
|
||||
|
||||
# Unit tests requirements
|
||||
try:
|
||||
from httmock import with_httmock # noqa
|
||||
except ImportError:
|
||||
pytestmark.append(pytest.mark.skip("Could not load httmock module required for testing"))
|
||||
with_httmock = _dummy
|
||||
|
||||
|
||||
class TestGitlabDeployKey(GitlabModuleTestCase):
|
||||
def setUp(self):
|
||||
super(TestGitlabDeployKey, self).setUp()
|
||||
|
||||
self.moduleUtil = GitLabDeployKey(module=self.mock_module, gitlab_instance=self.gitlab_instance)
|
||||
|
||||
@with_httmock(resp_get_project)
|
||||
@with_httmock(resp_find_project_deploy_key)
|
||||
def test_deploy_key_exist(self):
|
||||
project = self.gitlab_instance.projects.get(1)
|
||||
|
||||
rvalue = self.moduleUtil.existsDeployKey(project, "Public key")
|
||||
|
||||
self.assertEqual(rvalue, True)
|
||||
|
||||
rvalue = self.moduleUtil.existsDeployKey(project, "Private key")
|
||||
|
||||
self.assertEqual(rvalue, False)
|
||||
|
||||
@with_httmock(resp_get_project)
|
||||
@with_httmock(resp_create_project_deploy_key)
|
||||
def test_create_deploy_key(self):
|
||||
project = self.gitlab_instance.projects.get(1)
|
||||
|
||||
deploy_key = self.moduleUtil.createDeployKey(project, {"title": "Public key",
|
||||
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM"
|
||||
"4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxc"
|
||||
"KDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfD"
|
||||
"zpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0="})
|
||||
|
||||
self.assertEqual(type(deploy_key), ProjectKey)
|
||||
self.assertEqual(deploy_key.title, "Public key")
|
||||
|
||||
@with_httmock(resp_get_project)
|
||||
@with_httmock(resp_find_project_deploy_key)
|
||||
@with_httmock(resp_create_project_deploy_key)
|
||||
def test_update_deploy_key(self):
|
||||
project = self.gitlab_instance.projects.get(1)
|
||||
deployKey = self.moduleUtil.findDeployKey(project, "Public key")
|
||||
|
||||
changed, newDeploy_key = self.moduleUtil.updateDeployKey(deployKey, {"title": "Private key"})
|
||||
|
||||
self.assertEqual(changed, True)
|
||||
self.assertEqual(type(newDeploy_key), ProjectKey)
|
||||
self.assertEqual(newDeploy_key.title, "Private key")
|
||||
|
||||
changed, newDeploy_key = self.moduleUtil.updateDeployKey(deployKey, {"title": "Private key"})
|
||||
|
||||
self.assertEqual(changed, False)
|
||||
self.assertEqual(newDeploy_key.title, "Private key")
|
||||
|
||||
@with_httmock(resp_get_project)
|
||||
@with_httmock(resp_find_project_deploy_key)
|
||||
@with_httmock(resp_delete_project_deploy_key)
|
||||
def test_delete_deploy_key(self):
|
||||
project = self.gitlab_instance.projects.get(1)
|
||||
|
||||
self.moduleUtil.existsDeployKey(project, "Public key")
|
||||
|
||||
rvalue = self.moduleUtil.deleteDeployKey()
|
||||
|
||||
self.assertEqual(rvalue, None)
|
|
@ -0,0 +1,108 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright: (c) 2019, Guillaume Martinez (lunik@tiwabbit.fr)
|
||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
import pytest
|
||||
|
||||
from ansible_collections.community.general.plugins.modules.source_control.gitlab.gitlab_group import GitLabGroup
|
||||
|
||||
|
||||
def _dummy(x):
|
||||
"""Dummy function. Only used as a placeholder for toplevel definitions when the test is going
|
||||
to be skipped anyway"""
|
||||
return x
|
||||
|
||||
|
||||
pytestmark = []
|
||||
try:
|
||||
from .gitlab import (GitlabModuleTestCase,
|
||||
python_version_match_requirement,
|
||||
resp_get_group, resp_get_missing_group, resp_create_group,
|
||||
resp_create_subgroup, resp_delete_group, resp_find_group_project)
|
||||
|
||||
# GitLab module requirements
|
||||
if python_version_match_requirement():
|
||||
from gitlab.v4.objects import Group
|
||||
except ImportError:
|
||||
pytestmark.append(pytest.mark.skip("Could not load gitlab module required for testing"))
|
||||
# Need to set these to something so that we don't fail when parsing
|
||||
GitlabModuleTestCase = object
|
||||
resp_get_group = _dummy
|
||||
resp_get_missing_group = _dummy
|
||||
resp_create_group = _dummy
|
||||
resp_create_subgroup = _dummy
|
||||
resp_delete_group = _dummy
|
||||
resp_find_group_project = _dummy
|
||||
|
||||
# Unit tests requirements
|
||||
try:
|
||||
from httmock import with_httmock # noqa
|
||||
except ImportError:
|
||||
pytestmark.append(pytest.mark.skip("Could not load httmock module required for testing"))
|
||||
with_httmock = _dummy
|
||||
|
||||
|
||||
class TestGitlabGroup(GitlabModuleTestCase):
|
||||
def setUp(self):
|
||||
super(TestGitlabGroup, self).setUp()
|
||||
|
||||
self.moduleUtil = GitLabGroup(module=self.mock_module, gitlab_instance=self.gitlab_instance)
|
||||
|
||||
@with_httmock(resp_get_group)
|
||||
def test_exist_group(self):
|
||||
rvalue = self.moduleUtil.existsGroup(1)
|
||||
|
||||
self.assertEqual(rvalue, True)
|
||||
|
||||
@with_httmock(resp_get_missing_group)
|
||||
def test_exist_group(self):
|
||||
rvalue = self.moduleUtil.existsGroup(1)
|
||||
|
||||
self.assertEqual(rvalue, False)
|
||||
|
||||
@with_httmock(resp_create_group)
|
||||
def test_create_group(self):
|
||||
group = self.moduleUtil.createGroup({'name': "Foobar Group", 'path': "foo-bar"})
|
||||
|
||||
self.assertEqual(type(group), Group)
|
||||
self.assertEqual(group.name, "Foobar Group")
|
||||
self.assertEqual(group.path, "foo-bar")
|
||||
self.assertEqual(group.id, 1)
|
||||
|
||||
@with_httmock(resp_create_subgroup)
|
||||
def test_create_subgroup(self):
|
||||
group = self.moduleUtil.createGroup({'name': "BarFoo Group", 'path': "bar-foo", "parent_id": 1})
|
||||
|
||||
self.assertEqual(type(group), Group)
|
||||
self.assertEqual(group.name, "BarFoo Group")
|
||||
self.assertEqual(group.full_path, "foo-bar/bar-foo")
|
||||
self.assertEqual(group.id, 2)
|
||||
self.assertEqual(group.parent_id, 1)
|
||||
|
||||
@with_httmock(resp_get_group)
|
||||
def test_update_group(self):
|
||||
group = self.gitlab_instance.groups.get(1)
|
||||
changed, newGroup = self.moduleUtil.updateGroup(group, {'name': "BarFoo Group", "visibility": "private"})
|
||||
|
||||
self.assertEqual(changed, True)
|
||||
self.assertEqual(newGroup.name, "BarFoo Group")
|
||||
self.assertEqual(newGroup.visibility, "private")
|
||||
|
||||
changed, newGroup = self.moduleUtil.updateGroup(group, {'name': "BarFoo Group"})
|
||||
|
||||
self.assertEqual(changed, False)
|
||||
|
||||
@with_httmock(resp_get_group)
|
||||
@with_httmock(resp_find_group_project)
|
||||
@with_httmock(resp_delete_group)
|
||||
def test_delete_group(self):
|
||||
self.moduleUtil.existsGroup(1)
|
||||
|
||||
print(self.moduleUtil.groupObject.projects)
|
||||
|
||||
rvalue = self.moduleUtil.deleteGroup()
|
||||
|
||||
self.assertEqual(rvalue, None)
|
|
@ -0,0 +1,101 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright: (c) 2019, Guillaume Martinez (lunik@tiwabbit.fr)
|
||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
|
||||
from __future__ import absolute_import
|
||||
import pytest
|
||||
|
||||
from ansible_collections.community.general.plugins.modules.source_control.gitlab.gitlab_hook import GitLabHook
|
||||
|
||||
|
||||
def _dummy(x):
|
||||
"""Dummy function. Only used as a placeholder for toplevel definitions when the test is going
|
||||
to be skipped anyway"""
|
||||
return x
|
||||
|
||||
|
||||
pytestmark = []
|
||||
try:
|
||||
from .gitlab import (GitlabModuleTestCase,
|
||||
python_version_match_requirement,
|
||||
resp_get_project, resp_find_project_hook,
|
||||
resp_create_project_hook, resp_delete_project_hook)
|
||||
|
||||
# GitLab module requirements
|
||||
if python_version_match_requirement():
|
||||
from gitlab.v4.objects import ProjectHook
|
||||
except ImportError:
|
||||
pytestmark.append(pytest.mark.skip("Could not load gitlab module required for testing"))
|
||||
# Need to set these to something so that we don't fail when parsing
|
||||
GitlabModuleTestCase = object
|
||||
resp_get_project = _dummy
|
||||
resp_find_project_hook = _dummy
|
||||
resp_create_project_hook = _dummy
|
||||
resp_delete_project_hook = _dummy
|
||||
|
||||
# Unit tests requirements
|
||||
try:
|
||||
from httmock import with_httmock # noqa
|
||||
except ImportError:
|
||||
pytestmark.append(pytest.mark.skip("Could not load httmock module required for testing"))
|
||||
with_httmock = _dummy
|
||||
|
||||
|
||||
class TestGitlabHook(GitlabModuleTestCase):
|
||||
def setUp(self):
|
||||
super(TestGitlabHook, self).setUp()
|
||||
|
||||
self.moduleUtil = GitLabHook(module=self.mock_module, gitlab_instance=self.gitlab_instance)
|
||||
|
||||
@with_httmock(resp_get_project)
|
||||
@with_httmock(resp_find_project_hook)
|
||||
def test_hook_exist(self):
|
||||
project = self.gitlab_instance.projects.get(1)
|
||||
|
||||
rvalue = self.moduleUtil.existsHook(project, "http://example.com/hook")
|
||||
|
||||
self.assertEqual(rvalue, True)
|
||||
|
||||
rvalue = self.moduleUtil.existsHook(project, "http://gitlab.com/hook")
|
||||
|
||||
self.assertEqual(rvalue, False)
|
||||
|
||||
@with_httmock(resp_get_project)
|
||||
@with_httmock(resp_create_project_hook)
|
||||
def test_create_hook(self):
|
||||
project = self.gitlab_instance.projects.get(1)
|
||||
|
||||
hook = self.moduleUtil.createHook(project, {"url": "http://example.com/hook"})
|
||||
|
||||
self.assertEqual(type(hook), ProjectHook)
|
||||
self.assertEqual(hook.url, "http://example.com/hook")
|
||||
|
||||
@with_httmock(resp_get_project)
|
||||
@with_httmock(resp_find_project_hook)
|
||||
def test_update_hook(self):
|
||||
project = self.gitlab_instance.projects.get(1)
|
||||
hook = self.moduleUtil.findHook(project, "http://example.com/hook")
|
||||
|
||||
changed, newHook = self.moduleUtil.updateHook(hook, {"url": "http://gitlab.com/hook"})
|
||||
|
||||
self.assertEqual(changed, True)
|
||||
self.assertEqual(type(newHook), ProjectHook)
|
||||
self.assertEqual(newHook.url, "http://gitlab.com/hook")
|
||||
|
||||
changed, newHook = self.moduleUtil.updateHook(hook, {"url": "http://gitlab.com/hook"})
|
||||
|
||||
self.assertEqual(changed, False)
|
||||
self.assertEqual(newHook.url, "http://gitlab.com/hook")
|
||||
|
||||
@with_httmock(resp_get_project)
|
||||
@with_httmock(resp_find_project_hook)
|
||||
@with_httmock(resp_delete_project_hook)
|
||||
def test_delete_hook(self):
|
||||
project = self.gitlab_instance.projects.get(1)
|
||||
|
||||
self.moduleUtil.existsHook(project, "http://example.com/hook")
|
||||
|
||||
rvalue = self.moduleUtil.deleteHook()
|
||||
|
||||
self.assertEqual(rvalue, None)
|
|
@ -0,0 +1,103 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright: (c) 2019, Guillaume Martinez (lunik@tiwabbit.fr)
|
||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
import pytest
|
||||
|
||||
from ansible_collections.community.general.plugins.modules.source_control.gitlab.gitlab_project import GitLabProject
|
||||
|
||||
|
||||
def _dummy(x):
|
||||
"""Dummy function. Only used as a placeholder for toplevel definitions when the test is going
|
||||
to be skipped anyway"""
|
||||
return x
|
||||
|
||||
|
||||
pytestmark = []
|
||||
try:
|
||||
from .gitlab import (GitlabModuleTestCase,
|
||||
python_version_match_requirement,
|
||||
resp_get_group, resp_get_project_by_name, resp_create_project,
|
||||
resp_get_project, resp_delete_project, resp_get_user)
|
||||
|
||||
# GitLab module requirements
|
||||
if python_version_match_requirement():
|
||||
from gitlab.v4.objects import Project
|
||||
except ImportError:
|
||||
pytestmark.append(pytest.mark.skip("Could not load gitlab module required for testing"))
|
||||
# Need to set these to something so that we don't fail when parsing
|
||||
GitlabModuleTestCase = object
|
||||
resp_get_group = _dummy
|
||||
resp_get_project_by_name = _dummy
|
||||
resp_create_project = _dummy
|
||||
resp_get_project = _dummy
|
||||
resp_delete_project = _dummy
|
||||
resp_get_user = _dummy
|
||||
|
||||
# Unit tests requirements
|
||||
try:
|
||||
from httmock import with_httmock # noqa
|
||||
except ImportError:
|
||||
pytestmark.append(pytest.mark.skip("Could not load httmock module required for testing"))
|
||||
with_httmock = _dummy
|
||||
|
||||
|
||||
class TestGitlabProject(GitlabModuleTestCase):
|
||||
@with_httmock(resp_get_user)
|
||||
def setUp(self):
|
||||
super(TestGitlabProject, self).setUp()
|
||||
|
||||
self.gitlab_instance.user = self.gitlab_instance.users.get(1)
|
||||
self.moduleUtil = GitLabProject(module=self.mock_module, gitlab_instance=self.gitlab_instance)
|
||||
|
||||
@with_httmock(resp_get_group)
|
||||
@with_httmock(resp_get_project_by_name)
|
||||
def test_project_exist(self):
|
||||
group = self.gitlab_instance.groups.get(1)
|
||||
|
||||
rvalue = self.moduleUtil.existsProject(group, "diaspora-client")
|
||||
|
||||
self.assertEqual(rvalue, True)
|
||||
|
||||
rvalue = self.moduleUtil.existsProject(group, "missing-project")
|
||||
|
||||
self.assertEqual(rvalue, False)
|
||||
|
||||
@with_httmock(resp_get_group)
|
||||
@with_httmock(resp_create_project)
|
||||
def test_create_project(self):
|
||||
group = self.gitlab_instance.groups.get(1)
|
||||
project = self.moduleUtil.createProject(group, {"name": "Diaspora Client", "path": "diaspora-client", "namespace_id": group.id})
|
||||
|
||||
self.assertEqual(type(project), Project)
|
||||
self.assertEqual(project.name, "Diaspora Client")
|
||||
|
||||
@with_httmock(resp_get_project)
|
||||
def test_update_project(self):
|
||||
project = self.gitlab_instance.projects.get(1)
|
||||
|
||||
changed, newProject = self.moduleUtil.updateProject(project, {"name": "New Name"})
|
||||
|
||||
self.assertEqual(changed, True)
|
||||
self.assertEqual(type(newProject), Project)
|
||||
self.assertEqual(newProject.name, "New Name")
|
||||
|
||||
changed, newProject = self.moduleUtil.updateProject(project, {"name": "New Name"})
|
||||
|
||||
self.assertEqual(changed, False)
|
||||
self.assertEqual(newProject.name, "New Name")
|
||||
|
||||
@with_httmock(resp_get_group)
|
||||
@with_httmock(resp_get_project_by_name)
|
||||
@with_httmock(resp_delete_project)
|
||||
def test_delete_project(self):
|
||||
group = self.gitlab_instance.groups.get(1)
|
||||
|
||||
self.moduleUtil.existsProject(group, "diaspora-client")
|
||||
|
||||
rvalue = self.moduleUtil.deleteProject()
|
||||
|
||||
self.assertEqual(rvalue, None)
|
|
@ -0,0 +1,94 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright: (c) 2019, Guillaume Martinez (lunik@tiwabbit.fr)
|
||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
import pytest
|
||||
|
||||
from ansible_collections.community.general.plugins.modules.source_control.gitlab.gitlab_runner import GitLabRunner
|
||||
|
||||
|
||||
def _dummy(x):
|
||||
"""Dummy function. Only used as a placeholder for toplevel definitions when the test is going
|
||||
to be skipped anyway"""
|
||||
return x
|
||||
|
||||
|
||||
pytestmark = []
|
||||
try:
|
||||
from .gitlab import (GitlabModuleTestCase,
|
||||
python_version_match_requirement,
|
||||
resp_find_runners_list, resp_get_runner,
|
||||
resp_create_runner, resp_delete_runner)
|
||||
|
||||
# GitLab module requirements
|
||||
if python_version_match_requirement():
|
||||
from gitlab.v4.objects import Runner
|
||||
except ImportError:
|
||||
pytestmark.append(pytest.mark.skip("Could not load gitlab module required for testing"))
|
||||
# Need to set these to something so that we don't fail when parsing
|
||||
GitlabModuleTestCase = object
|
||||
resp_find_runners_list = _dummy
|
||||
resp_get_runner = _dummy
|
||||
resp_create_runner = _dummy
|
||||
resp_delete_runner = _dummy
|
||||
|
||||
# Unit tests requirements
|
||||
try:
|
||||
from httmock import with_httmock # noqa
|
||||
except ImportError:
|
||||
pytestmark.append(pytest.mark.skip("Could not load httmock module required for testing"))
|
||||
with_httmock = _dummy
|
||||
|
||||
|
||||
class TestGitlabRunner(GitlabModuleTestCase):
|
||||
def setUp(self):
|
||||
super(TestGitlabRunner, self).setUp()
|
||||
|
||||
self.moduleUtil = GitLabRunner(module=self.mock_module, gitlab_instance=self.gitlab_instance)
|
||||
|
||||
@with_httmock(resp_find_runners_list)
|
||||
@with_httmock(resp_get_runner)
|
||||
def test_runner_exist(self):
|
||||
rvalue = self.moduleUtil.existsRunner("test-1-20150125")
|
||||
|
||||
self.assertEqual(rvalue, True)
|
||||
|
||||
rvalue = self.moduleUtil.existsRunner("test-3-00000000")
|
||||
|
||||
self.assertEqual(rvalue, False)
|
||||
|
||||
@with_httmock(resp_create_runner)
|
||||
def test_create_runner(self):
|
||||
runner = self.moduleUtil.createRunner({"token": "token", "description": "test-1-20150125"})
|
||||
|
||||
self.assertEqual(type(runner), Runner)
|
||||
self.assertEqual(runner.description, "test-1-20150125")
|
||||
|
||||
@with_httmock(resp_find_runners_list)
|
||||
@with_httmock(resp_get_runner)
|
||||
def test_update_runner(self):
|
||||
runner = self.moduleUtil.findRunner("test-1-20150125")
|
||||
|
||||
changed, newRunner = self.moduleUtil.updateRunner(runner, {"description": "Runner description"})
|
||||
|
||||
self.assertEqual(changed, True)
|
||||
self.assertEqual(type(newRunner), Runner)
|
||||
self.assertEqual(newRunner.description, "Runner description")
|
||||
|
||||
changed, newRunner = self.moduleUtil.updateRunner(runner, {"description": "Runner description"})
|
||||
|
||||
self.assertEqual(changed, False)
|
||||
self.assertEqual(newRunner.description, "Runner description")
|
||||
|
||||
@with_httmock(resp_find_runners_list)
|
||||
@with_httmock(resp_get_runner)
|
||||
@with_httmock(resp_delete_runner)
|
||||
def test_delete_runner(self):
|
||||
self.moduleUtil.existsRunner("test-1-20150125")
|
||||
|
||||
rvalue = self.moduleUtil.deleteRunner()
|
||||
|
||||
self.assertEqual(rvalue, None)
|
|
@ -0,0 +1,163 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright: (c) 2019, Guillaume Martinez (lunik@tiwabbit.fr)
|
||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
import pytest
|
||||
|
||||
from ansible_collections.community.general.plugins.modules.source_control.gitlab.gitlab_user import GitLabUser
|
||||
|
||||
|
||||
def _dummy(x):
|
||||
"""Dummy function. Only used as a placeholder for toplevel definitions when the test is going
|
||||
to be skipped anyway"""
|
||||
return x
|
||||
|
||||
|
||||
pytestmark = []
|
||||
try:
|
||||
from .gitlab import (GitlabModuleTestCase,
|
||||
python_version_match_requirement,
|
||||
resp_find_user, resp_get_user, resp_get_user_keys,
|
||||
resp_create_user_keys, resp_create_user, resp_delete_user,
|
||||
resp_get_member, resp_get_group, resp_add_member,
|
||||
resp_update_member, resp_get_member)
|
||||
|
||||
# GitLab module requirements
|
||||
if python_version_match_requirement():
|
||||
from gitlab.v4.objects import User
|
||||
except ImportError:
|
||||
pytestmark.append(pytest.mark.skip("Could not load gitlab module required for testing"))
|
||||
# Need to set these to something so that we don't fail when parsing
|
||||
GitlabModuleTestCase = object
|
||||
resp_find_user = _dummy
|
||||
resp_get_user = _dummy
|
||||
resp_get_user_keys = _dummy
|
||||
resp_create_user_keys = _dummy
|
||||
resp_create_user = _dummy
|
||||
resp_delete_user = _dummy
|
||||
resp_get_member = _dummy
|
||||
resp_get_group = _dummy
|
||||
resp_add_member = _dummy
|
||||
resp_update_member = _dummy
|
||||
resp_get_member = _dummy
|
||||
|
||||
# Unit tests requirements
|
||||
try:
|
||||
from httmock import with_httmock # noqa
|
||||
except ImportError:
|
||||
pytestmark.append(pytest.mark.skip("Could not load httmock module required for testing"))
|
||||
with_httmock = _dummy
|
||||
|
||||
|
||||
class TestGitlabUser(GitlabModuleTestCase):
|
||||
def setUp(self):
|
||||
super(TestGitlabUser, self).setUp()
|
||||
|
||||
self.moduleUtil = GitLabUser(module=self.mock_module, gitlab_instance=self.gitlab_instance)
|
||||
|
||||
@with_httmock(resp_find_user)
|
||||
def test_exist_user(self):
|
||||
rvalue = self.moduleUtil.existsUser("john_smith")
|
||||
|
||||
self.assertEqual(rvalue, True)
|
||||
|
||||
rvalue = self.moduleUtil.existsUser("paul_smith")
|
||||
|
||||
self.assertEqual(rvalue, False)
|
||||
|
||||
@with_httmock(resp_find_user)
|
||||
def test_find_user(self):
|
||||
user = self.moduleUtil.findUser("john_smith")
|
||||
|
||||
self.assertEqual(type(user), User)
|
||||
self.assertEqual(user.name, "John Smith")
|
||||
self.assertEqual(user.id, 1)
|
||||
|
||||
@with_httmock(resp_create_user)
|
||||
def test_create_user(self):
|
||||
user = self.moduleUtil.createUser({'email': 'john@example.com', 'password': 's3cur3s3cr3T',
|
||||
'username': 'john_smith', 'name': 'John Smith'})
|
||||
self.assertEqual(type(user), User)
|
||||
self.assertEqual(user.name, "John Smith")
|
||||
self.assertEqual(user.id, 1)
|
||||
|
||||
@with_httmock(resp_get_user)
|
||||
def test_update_user(self):
|
||||
user = self.gitlab_instance.users.get(1)
|
||||
changed, newUser = self.moduleUtil.updateUser(user, {'name': "Jack Smith", "is_admin": "true"})
|
||||
|
||||
self.assertEqual(changed, True)
|
||||
self.assertEqual(newUser.name, "Jack Smith")
|
||||
self.assertEqual(newUser.is_admin, "true")
|
||||
|
||||
changed, newUser = self.moduleUtil.updateUser(user, {'name': "Jack Smith"})
|
||||
|
||||
self.assertEqual(changed, False)
|
||||
|
||||
@with_httmock(resp_find_user)
|
||||
@with_httmock(resp_delete_user)
|
||||
def test_delete_user(self):
|
||||
self.moduleUtil.existsUser("john_smith")
|
||||
rvalue = self.moduleUtil.deleteUser()
|
||||
|
||||
self.assertEqual(rvalue, None)
|
||||
|
||||
@with_httmock(resp_get_user)
|
||||
@with_httmock(resp_get_user_keys)
|
||||
def test_sshkey_exist(self):
|
||||
user = self.gitlab_instance.users.get(1)
|
||||
|
||||
exist = self.moduleUtil.sshKeyExists(user, "Public key")
|
||||
self.assertEqual(exist, True)
|
||||
|
||||
notExist = self.moduleUtil.sshKeyExists(user, "Private key")
|
||||
self.assertEqual(notExist, False)
|
||||
|
||||
@with_httmock(resp_get_user)
|
||||
@with_httmock(resp_create_user_keys)
|
||||
@with_httmock(resp_get_user_keys)
|
||||
def test_create_sshkey(self):
|
||||
user = self.gitlab_instance.users.get(1)
|
||||
|
||||
rvalue = self.moduleUtil.addSshKeyToUser(user, {
|
||||
'name': "Public key",
|
||||
'file': "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJe"
|
||||
"jgt4596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4"
|
||||
"soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0="})
|
||||
self.assertEqual(rvalue, False)
|
||||
|
||||
rvalue = self.moduleUtil.addSshKeyToUser(user, {
|
||||
'name': "Private key",
|
||||
'file': "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDA1YotVDm2mAyk2tPt4E7AHm01sS6JZmcU"
|
||||
"dRuSuA5zszUJzYPPUSRAX3BCgTqLqYx//UuVncK7YqLVSbbwjKR2Ez5lISgCnVfLVEXzwhv+"
|
||||
"xawxKWmI7hJ5S0tOv6MJ+IxyTa4xcKwJTwB86z22n9fVOQeJTR2dSOH1WJrf0PvRk+KVNY2j"
|
||||
"TiGHTi9AIjLnyD/jWRpOgtdfkLRc8EzAWrWlgNmH2WOKBw6za0az6XoG75obUdFVdW3qcD0x"
|
||||
"c809OHLi7FDf+E7U4wiZJCFuUizMeXyuK/SkaE1aee4Qp5R4dxTR4TP9M1XAYkf+kF0W9srZ+mhF069XD/zhUPJsvwEF"})
|
||||
self.assertEqual(rvalue, True)
|
||||
|
||||
@with_httmock(resp_get_group)
|
||||
@with_httmock(resp_get_member)
|
||||
def test_find_member(self):
|
||||
group = self.gitlab_instance.groups.get(1)
|
||||
|
||||
user = self.moduleUtil.findMember(group, 1)
|
||||
self.assertEqual(user.username, "raymond_smith")
|
||||
|
||||
@with_httmock(resp_get_user)
|
||||
@with_httmock(resp_get_group)
|
||||
@with_httmock(resp_get_group)
|
||||
@with_httmock(resp_get_member)
|
||||
@with_httmock(resp_add_member)
|
||||
@with_httmock(resp_update_member)
|
||||
def test_assign_user_to_group(self):
|
||||
group = self.gitlab_instance.groups.get(1)
|
||||
user = self.gitlab_instance.users.get(1)
|
||||
|
||||
rvalue = self.moduleUtil.assignUserToGroup(user, group.id, "developer")
|
||||
self.assertEqual(rvalue, False)
|
||||
|
||||
rvalue = self.moduleUtil.assignUserToGroup(user, group.id, "guest")
|
||||
self.assertEqual(rvalue, True)
|
Loading…
Add table
Add a link
Reference in a new issue