From 32be9a0fff19c2dd3d45ba5f58ce0c07b9068cb4 Mon Sep 17 00:00:00 2001
From: Phillip Smyth <phillip.smyth@codethink.co.uk>
Date: Thu, 22 Nov 2018 14:59:59 +0000
Subject: [PATCH] tests: build checkout and completions tests

buildcheckout.py: Add mandatory .bst suffix tests
completions.py: Add test for fail on invalid suffix
Added required files for testing
integration/source-determinism.py: renamed test elements to end with .bst
---
 tests/completions/completions.py            | 38 +++++++++++++++++++++
 tests/frontend/buildcheckout.py             | 25 ++++++++++++++
 tests/frontend/project/elements/target.foo  |  4 +++
 tests/frontend/project/elements/target2.bst |  7 ++++
 tests/integration/source-determinism.py     |  4 +--
 5 files changed, 76 insertions(+), 2 deletions(-)
 create mode 100644 tests/frontend/project/elements/target.foo
 create mode 100644 tests/frontend/project/elements/target2.bst

diff --git a/tests/completions/completions.py b/tests/completions/completions.py
index 7b63e67fe7..699d2ed472 100644
--- a/tests/completions/completions.py
+++ b/tests/completions/completions.py
@@ -66,6 +66,13 @@ PROJECT_ELEMENTS = [
     "target.bst"
 ]
 
+INVALID_ELEMENTS = [
+    "target.foo"
+    "target.bst.bar"
+]
+
+MIXED_ELEMENTS = PROJECT_ELEMENTS + INVALID_ELEMENTS
+
 
 def assert_completion(cli, cmd, word_idx, expected, cwd=None):
     result = cli.run(cwd=cwd, env={
@@ -85,6 +92,24 @@ def assert_completion(cli, cmd, word_idx, expected, cwd=None):
     assert words == expected
 
 
+def assert_completion_failed(cli, cmd, word_idx, expected, cwd=None):
+    result = cli.run(cwd=cwd, env={
+        '_BST_COMPLETION': 'complete',
+        'COMP_WORDS': cmd,
+        'COMP_CWORD': str(word_idx)
+    })
+    words = []
+    if result.output:
+        words = result.output.splitlines()
+
+    # The order is meaningless, bash will
+    # take the results and order it by its
+    # own little heuristics
+    words = sorted(words)
+    expected = sorted(expected)
+    assert words != expected
+
+
 @pytest.mark.parametrize("cmd,word_idx,expected", [
     ('bst', 0, []),
     ('bst ', 1, MAIN_COMMANDS),
@@ -226,6 +251,19 @@ def test_argument_element(datafiles, cli, project, cmd, word_idx, expected, subd
     assert_completion(cli, cmd, word_idx, expected, cwd=cwd)
 
 
+@pytest.mark.datafiles(DATA_DIR)
+@pytest.mark.parametrize("project,cmd,word_idx,expected,subdir", [
+
+    # When element has invalid suffix
+    ('project', 'bst --directory ../ show ', 4, [e + ' ' for e in MIXED_ELEMENTS], 'files')
+])
+def test_argument_element_invalid(datafiles, cli, project, cmd, word_idx, expected, subdir):
+    cwd = os.path.join(str(datafiles), project)
+    if subdir:
+        cwd = os.path.join(cwd, subdir)
+    assert_completion_failed(cli, cmd, word_idx, expected, cwd=cwd)
+
+
 @pytest.mark.parametrize("cmd,word_idx,expected", [
     ('bst he', 1, ['help ']),
     ('bst help ', 2, MAIN_COMMANDS),
diff --git a/tests/frontend/buildcheckout.py b/tests/frontend/buildcheckout.py
index 159af2d744..8266fa9513 100644
--- a/tests/frontend/buildcheckout.py
+++ b/tests/frontend/buildcheckout.py
@@ -60,6 +60,31 @@ def test_build_checkout(datafiles, cli, strict, hardlinks):
     assert os.path.exists(filename)
 
 
+@pytest.mark.datafiles(DATA_DIR)
+@pytest.mark.parametrize("strict,hardlinks", [
+    ("non-strict", "hardlinks"),
+])
+def test_build_invalid_suffix(datafiles, cli, strict, hardlinks):
+    project = os.path.join(datafiles.dirname, datafiles.basename)
+    checkout = os.path.join(cli.directory, 'checkout')
+
+    result = cli.run(project=project, args=strict_args(['build', 'target.foo'], strict))
+    result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.INVALID_DATA)
+
+
+@pytest.mark.datafiles(DATA_DIR)
+@pytest.mark.parametrize("strict,hardlinks", [
+    ("non-strict", "hardlinks"),
+])
+def test_build_invalid_suffix_dep(datafiles, cli, strict, hardlinks):
+    project = os.path.join(datafiles.dirname, datafiles.basename)
+    checkout = os.path.join(cli.directory, 'checkout')
+
+    # target2.bst depends on an element called target.foo
+    result = cli.run(project=project, args=strict_args(['build', 'target2.bst'], strict))
+    result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.INVALID_DATA)
+
+
 @pytest.mark.datafiles(DATA_DIR)
 @pytest.mark.parametrize("deps", [("run"), ("none")])
 def test_build_checkout_deps(datafiles, cli, deps):
diff --git a/tests/frontend/project/elements/target.foo b/tests/frontend/project/elements/target.foo
new file mode 100644
index 0000000000..d644c89ba9
--- /dev/null
+++ b/tests/frontend/project/elements/target.foo
@@ -0,0 +1,4 @@
+kind: stack
+description: |
+
+  Main stack target for the bst build test
diff --git a/tests/frontend/project/elements/target2.bst b/tests/frontend/project/elements/target2.bst
new file mode 100644
index 0000000000..259819f599
--- /dev/null
+++ b/tests/frontend/project/elements/target2.bst
@@ -0,0 +1,7 @@
+kind: stack
+description: |
+
+  Main stack target for the bst build test
+
+depends:
+- target.foo
diff --git a/tests/integration/source-determinism.py b/tests/integration/source-determinism.py
index a970c7dc9c..fa12593dfc 100644
--- a/tests/integration/source-determinism.py
+++ b/tests/integration/source-determinism.py
@@ -33,7 +33,7 @@ def create_test_directory(*path, mode=0o644):
 @pytest.mark.skipif(IS_LINUX and not HAVE_BWRAP, reason='Only available with bubblewrap on Linux')
 def test_deterministic_source_umask(cli, tmpdir, datafiles, kind, integration_cache):
     project = str(datafiles)
-    element_name = 'list'
+    element_name = 'list.bst'
     element_path = os.path.join(project, 'elements', element_name)
     repodir = os.path.join(str(tmpdir), 'repo')
     sourcedir = os.path.join(project, 'source')
@@ -108,7 +108,7 @@ def test_deterministic_source_local(cli, tmpdir, datafiles, integration_cache):
     """Only user rights should be considered for local source.
     """
     project = str(datafiles)
-    element_name = 'test'
+    element_name = 'test.bst'
     element_path = os.path.join(project, 'elements', element_name)
     sourcedir = os.path.join(project, 'source')
 
-- 
GitLab