diff --git a/tests/test_version_strings.py b/tests/test_version_strings.py new file mode 100644 index 00000000..dff89565 --- /dev/null +++ b/tests/test_version_strings.py @@ -0,0 +1,77 @@ +"""Tests that version strings can be produced reliably.""" + +import subprocess +import os +import re +import tempfile + +from hypothesis import strategies as st + +from openflexure_microscope_server import utilities + + +# This is the regex provided by https://semver.org/ +SEMVER_REGEX = re.compile( + r"^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)" + r"(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)" + r"(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?" + r"(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$" +) + +# Use hypothesis to generate random filenames +FILE_NAME_GEN = st.from_regex(r"[a-zA-Z_-]{5,20}\.[a-z]{1,5}", fullmatch=True) +# Use hypothesis to generate random data for files +FILE_Data_GEN = st.from_regex(r"[a-zA-Z_-]{5,20}\.[a-z]{1,5}", fullmatch=True) + + +def _git(command: str) -> str: + """Run a git command in a subprocess.""" + git_command = ["git"] + command.split() + # Use check=True so an error is raised if git has a problem. Only read STDOUT + result = subprocess.run(git_command, shell=True, check=True, capture_output=True) + return result.stdout.decode() + + +def test_reading_hash_from_git(): + """Use create a Git repo and check that hash can be read. + + The performs a series of directory and git operations, commented as they go. + """ + working_dir = os.getcwd() + try: + with tempfile.TemporaryDirectory() as tmpdir: + os.chdir(tmpdir) + git_dir = os.path.join(tmpdir, ".git") + # Git dir not created yet. Returns Undefined + assert utilities._get_hash_from_git_dir(git_dir) == "Undefined" + + # Intialised. Should still be undefined. + _git("init") + assert utilities._get_hash_from_git_dir(git_dir) == "Undefined" + + finally: + # Return to original working dir + os.chdir(working_dir) + + +def test_reading_version_from_toml(): + """Check version string can be read from this project's TOML file. + + As we only expect to ever read our own TOML file there is not a need to do + excessive testing on different generated TOML files. + """ + project_toml_path = os.path.join(utilities.REPO_DIR, "pyproject.toml") + ver_string = utilities._get_version_from_toml(project_toml_path) + # Check version does follow semantic versioning. + assert SEMVER_REGEX.match(ver_string) + # Explicit check + assert ver_string == "3.0.0-alpha1" + + +def test_error_reading_version_from_toml(): + """Check Undefined is returned if error reading TOML file.""" + # Just give it the wrong path. + project_toml_path = os.path.join(utilities.REPO_DIR, "pyppproject.toml") + ver_string = utilities._get_version_from_toml(project_toml_path) + # Explicit check + assert ver_string == "Undefined"