Merge "tests: Add more Pegleg CLI site tests"
This commit is contained in:
commit
5ec8b05232
|
@ -41,6 +41,17 @@ def is_connected():
|
||||||
@pytest.mark.skipif(
|
@pytest.mark.skipif(
|
||||||
not is_connected(), reason='git clone requires network connectivity.')
|
not is_connected(), reason='git clone requires network connectivity.')
|
||||||
class BaseCLIActionTest(object):
|
class BaseCLIActionTest(object):
|
||||||
|
"""Tests end-to-end flows for all Pegleg CLI actions, with minimal mocking.
|
||||||
|
|
||||||
|
General pattern should be to include exactly one test that uses a remote
|
||||||
|
repo URL and as many other tests that are required that use a local repo
|
||||||
|
path for runtime optimization.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# TODO(felipemonteiro): Need tests that validate repository overrides. Also
|
||||||
|
# need to write tests that use a site-defintion.yaml with repositories key.
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def setup_class(cls):
|
def setup_class(cls):
|
||||||
cls.runner = CliRunner()
|
cls.runner = CliRunner()
|
||||||
|
@ -189,6 +200,135 @@ class TestSiteCliActions(BaseCLIActionTest):
|
||||||
# output warnings.
|
# output warnings.
|
||||||
assert result.output
|
assert result.output
|
||||||
|
|
||||||
|
### List tests ###
|
||||||
|
|
||||||
|
def test_list_sites_using_remote_repo_url(self):
|
||||||
|
"""Validates list action using remote repo URL."""
|
||||||
|
# Scenario:
|
||||||
|
#
|
||||||
|
# 1) List sites (should clone repo automatically)
|
||||||
|
|
||||||
|
repo_url = 'https://github.com/openstack/%s@%s' % (self.repo_name,
|
||||||
|
self.repo_rev)
|
||||||
|
|
||||||
|
# NOTE(felipemonteiro): Pegleg currently doesn't dump a table to stdout
|
||||||
|
# for this CLI call so mock out the csv DictWriter to determine output.
|
||||||
|
with mock.patch('pegleg.engine.site.csv.DictWriter') as mock_writer:
|
||||||
|
result = self.runner.invoke(cli.site, ['-r', repo_url, 'list'])
|
||||||
|
|
||||||
|
assert result.exit_code == 0
|
||||||
|
m_writer = mock_writer.return_value
|
||||||
|
m_writer.writerow.assert_called_once_with({
|
||||||
|
'site_type': 'foundry',
|
||||||
|
'site_name': self.site_name
|
||||||
|
})
|
||||||
|
|
||||||
|
def test_list_sites_using_local_path(self):
|
||||||
|
"""Validates list action using local repo path."""
|
||||||
|
# Scenario:
|
||||||
|
#
|
||||||
|
# 1) List sites (should skip clone repo)
|
||||||
|
|
||||||
|
repo_path = self.treasuremap_path
|
||||||
|
|
||||||
|
# NOTE(felipemonteiro): Pegleg currently doesn't dump a table to stdout
|
||||||
|
# for this CLI call so mock out the csv DictWriter to determine output.
|
||||||
|
with mock.patch('pegleg.engine.site.csv.DictWriter') as mock_writer:
|
||||||
|
result = self.runner.invoke(cli.site, ['-r', repo_path, 'list'])
|
||||||
|
|
||||||
|
assert result.exit_code == 0
|
||||||
|
m_writer = mock_writer.return_value
|
||||||
|
m_writer.writerow.assert_called_once_with({
|
||||||
|
'site_type': 'foundry',
|
||||||
|
'site_name': self.site_name
|
||||||
|
})
|
||||||
|
|
||||||
|
### Show tests ###
|
||||||
|
|
||||||
|
def test_show_site_using_remote_repo_url(self):
|
||||||
|
"""Validates show action using remote repo URL."""
|
||||||
|
# Scenario:
|
||||||
|
#
|
||||||
|
# 1) Show site (should clone repo automatically)
|
||||||
|
|
||||||
|
repo_url = 'https://github.com/openstack/%s@%s' % (self.repo_name,
|
||||||
|
self.repo_rev)
|
||||||
|
|
||||||
|
with mock.patch('pegleg.engine.site.json') as mock_json:
|
||||||
|
result = self.runner.invoke(
|
||||||
|
cli.site, ['-r', repo_url, 'show', self.site_name])
|
||||||
|
|
||||||
|
assert result.exit_code == 0
|
||||||
|
assert mock_json.dump.called
|
||||||
|
mock_calls = mock_json.dump.mock_calls
|
||||||
|
assert mock_calls[0][1][0] == {
|
||||||
|
'files': mock.ANY,
|
||||||
|
'site_type': 'foundry',
|
||||||
|
'site_name': self.site_name
|
||||||
|
}
|
||||||
|
|
||||||
|
def test_show_site_using_local_path(self):
|
||||||
|
"""Validates show action using local repo path."""
|
||||||
|
# Scenario:
|
||||||
|
#
|
||||||
|
# 1) Show site (should skip clone repo)
|
||||||
|
|
||||||
|
repo_path = self.treasuremap_path
|
||||||
|
with mock.patch('pegleg.engine.site.json') as mock_json:
|
||||||
|
result = self.runner.invoke(
|
||||||
|
cli.site, ['-r', repo_path, 'show', self.site_name])
|
||||||
|
|
||||||
|
assert result.exit_code == 0
|
||||||
|
assert mock_json.dump.called
|
||||||
|
mock_calls = mock_json.dump.mock_calls
|
||||||
|
assert mock_calls[0][1][0] == {
|
||||||
|
'files': mock.ANY,
|
||||||
|
'site_type': 'foundry',
|
||||||
|
'site_name': self.site_name
|
||||||
|
}
|
||||||
|
|
||||||
|
### Render tests ###
|
||||||
|
|
||||||
|
def test_render_site_using_remote_repo_url(self):
|
||||||
|
"""Validates render action using remote repo URL."""
|
||||||
|
# Scenario:
|
||||||
|
#
|
||||||
|
# 1) Mock out Deckhand render (so we can ignore P005 issues)
|
||||||
|
# 2) Render site (should clone repo automatically)
|
||||||
|
|
||||||
|
repo_url = 'https://github.com/openstack/%s@%s' % (self.repo_name,
|
||||||
|
self.repo_rev)
|
||||||
|
|
||||||
|
render_command = ['-r', repo_url, 'render', self.site_name]
|
||||||
|
|
||||||
|
with mock.patch('pegleg.engine.site.yaml') as mock_yaml:
|
||||||
|
with mock.patch(
|
||||||
|
'pegleg.engine.site.util.deckhand') as mock_deckhand:
|
||||||
|
mock_deckhand.deckhand_render.return_value = ([], [])
|
||||||
|
result = self.runner.invoke(cli.site, render_command)
|
||||||
|
|
||||||
|
assert result.exit_code == 0
|
||||||
|
mock_yaml.dump_all.assert_called_once()
|
||||||
|
|
||||||
|
def test_render_site_using_local_path(self):
|
||||||
|
"""Validates render action using local repo path."""
|
||||||
|
# Scenario:
|
||||||
|
#
|
||||||
|
# 1) Mock out Deckhand render (so we can ignore P005 issues)
|
||||||
|
# 2) Render site (should skip clone repo)
|
||||||
|
|
||||||
|
repo_path = self.treasuremap_path
|
||||||
|
render_command = ['-r', repo_path, 'render', self.site_name]
|
||||||
|
|
||||||
|
with mock.patch('pegleg.engine.site.yaml') as mock_yaml:
|
||||||
|
with mock.patch(
|
||||||
|
'pegleg.engine.site.util.deckhand') as mock_deckhand:
|
||||||
|
mock_deckhand.deckhand_render.return_value = ([], [])
|
||||||
|
result = self.runner.invoke(cli.site, render_command)
|
||||||
|
|
||||||
|
assert result.exit_code == 0
|
||||||
|
mock_yaml.dump_all.assert_called_once()
|
||||||
|
|
||||||
|
|
||||||
class TestRepoCliActions(BaseCLIActionTest):
|
class TestRepoCliActions(BaseCLIActionTest):
|
||||||
"""Tests repo-level CLI actions."""
|
"""Tests repo-level CLI actions."""
|
||||||
|
|
Loading…
Reference in New Issue