From 628665d918a8a57bc8a7efd255f35cd5f21c3e9f Mon Sep 17 00:00:00 2001 From: David Brownell Date: Sat, 2 Mar 2024 12:12:15 -0500 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20[+feature]=20Added=20semantic=5Fver?= =?UTF-8?q?sion=5Fstring=20and=20additional=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/AutoGitSemVer/EntryPoint.py | 2 +- src/AutoGitSemVer/Lib.py | 7 +- tests/EntryPoint_UnitTest.py | 148 ++++++++++++++++++++++++++++++++ tests/Lib_UnitTest.py | 125 ++++++++++++++------------- 4 files changed, 221 insertions(+), 61 deletions(-) create mode 100644 tests/EntryPoint_UnitTest.py diff --git a/src/AutoGitSemVer/EntryPoint.py b/src/AutoGitSemVer/EntryPoint.py index 372b40e..ea3f715 100644 --- a/src/AutoGitSemVer/EntryPoint.py +++ b/src/AutoGitSemVer/EntryPoint.py @@ -151,7 +151,7 @@ def PostprocessQuietData( sys.stdout.write(sink.getvalue()) else: assert result is not None - sys.stdout.write(str(result.semantic_version)) + sys.stdout.write(result.semantic_version_string) # ---------------------------------------------------------------------- diff --git a/src/AutoGitSemVer/Lib.py b/src/AutoGitSemVer/Lib.py index 0363316..55dab1b 100644 --- a/src/AutoGitSemVer/Lib.py +++ b/src/AutoGitSemVer/Lib.py @@ -91,6 +91,7 @@ class GetSemanticVersionResult: configuration_filename: Optional[Path] semantic_version: SemVer + semantic_version_string: str # ---------------------------------------------------------------------- @@ -462,9 +463,11 @@ def GetBranchName() -> str: build=None if no_metadata else tuple(metadata), ) - calculate_dm.WriteLine(str(semver)) + semver_string = f"{configuration.version_prefix}{semver}" - return GetSemanticVersionResult(configuration.filename, semver) + calculate_dm.WriteLine(semver_string) + + return GetSemanticVersionResult(configuration.filename, semver, semver_string) # ---------------------------------------------------------------------- diff --git a/tests/EntryPoint_UnitTest.py b/tests/EntryPoint_UnitTest.py new file mode 100644 index 0000000..79c5562 --- /dev/null +++ b/tests/EntryPoint_UnitTest.py @@ -0,0 +1,148 @@ +# ---------------------------------------------------------------------- +# | +# | EntryPoint_UnitTest.py +# | +# | David Brownell +# | 2024-03-02 11:38:32 +# | +# ---------------------------------------------------------------------- +# | +# | Copyright David Brownell 2024 +# | Distributed under the MIT License. +# | +# ---------------------------------------------------------------------- +# """Unit tests for EntryPoint.py.""" + +from pathlib import Path +from typing import Any, Mapping +from unittest.mock import MagicMock as Mock, patch + +from typer.testing import CliRunner + +from AutoGitSemVer import GenerateStyle, GetSemanticVersionResult +from AutoGitSemVer.EntryPoint import app + + +# ---------------------------------------------------------------------- +def test_Default(): + output, args, kwargs = _Execute() + + assert len(args) == 2 + assert args[1] == Path.cwd() + + assert len(kwargs) == 5 + assert kwargs["prerelease_name"] is None + assert kwargs["include_branch_name_when_necessary"] is True + assert kwargs["no_prefix"] is False + assert kwargs["no_metadata"] is False + assert kwargs["style"] == GenerateStyle.Standard + + +# ---------------------------------------------------------------------- +def test_CustomPath(): + custom_path = Path(__file__).parent.parent + + output, args, kwargs = _Execute(str(custom_path)) + + assert len(args) == 2 + assert args[1] == custom_path + + +# ---------------------------------------------------------------------- +def test_NonBoolArgs(): + output, args, kwargs = _Execute( + "--prerelease-name", + "prerelease_name", + "--style", + "AllPrerelease", + ) + + assert len(args) == 2 + assert args[1] == Path.cwd() + + assert len(kwargs) == 5 + assert kwargs["prerelease_name"] == "prerelease_name" + assert kwargs["include_branch_name_when_necessary"] is True + assert kwargs["no_prefix"] is False + assert kwargs["no_metadata"] is False + assert kwargs["style"] == GenerateStyle.AllPrerelease + + +# ---------------------------------------------------------------------- +def test_BoolIncludeBranchNameWhenNecessary(): + output, args, kwargs = _Execute( + "--no-branch-name", + ) + + assert len(kwargs) == 5 + assert kwargs["prerelease_name"] is None + assert kwargs["include_branch_name_when_necessary"] is False + assert kwargs["no_prefix"] is False + assert kwargs["no_metadata"] is False + assert kwargs["style"] == GenerateStyle.Standard + + +# ---------------------------------------------------------------------- +def test_BoolNoPrefix(): + output, args, kwargs = _Execute( + "--no-prefix", + ) + + assert len(kwargs) == 5 + assert kwargs["prerelease_name"] is None + assert kwargs["include_branch_name_when_necessary"] is True + assert kwargs["no_prefix"] is True + assert kwargs["no_metadata"] is False + assert kwargs["style"] == GenerateStyle.Standard + + +# ---------------------------------------------------------------------- +def test_BoolNoMetadata(): + output, args, kwargs = _Execute( + "--no-metadata", + ) + + assert len(kwargs) == 5 + assert kwargs["prerelease_name"] is None + assert kwargs["include_branch_name_when_necessary"] is True + assert kwargs["no_prefix"] is False + assert kwargs["no_metadata"] is True + assert kwargs["style"] == GenerateStyle.Standard + + +# ---------------------------------------------------------------------- +def test_Quiet(): + output, args, kwargs = _Execute() + assert output != "1.2.3" + + output, args, kwargs = _Execute("--quiet") + assert output == "1.2.3" + + +# ---------------------------------------------------------------------- +def test_Version(): + output, args, kwargs = _Execute("--version") + assert output.startswith("autogitsemver v") + + assert not args + assert not kwargs + + +# ---------------------------------------------------------------------- +# ---------------------------------------------------------------------- +# ---------------------------------------------------------------------- +def _Execute( + *args, +) -> tuple[str, tuple[Any, ...], Mapping[str, Any]]: + with patch( + "AutoGitSemVer.EntryPoint.GetSemanticVersion", + return_value=GetSemanticVersionResult(None, Mock(), "1.2.3"), + ) as mock: + result = CliRunner().invoke(app, list(args)) + assert result.exit_code == 0 + + if not mock.call_args_list: + return result.output, (), {} + + assert len(mock.call_args_list) == 1 + return result.output, mock.call_args_list[0].args, mock.call_args_list[0].kwargs diff --git a/tests/Lib_UnitTest.py b/tests/Lib_UnitTest.py index 9c90d87..1a4f15d 100644 --- a/tests/Lib_UnitTest.py +++ b/tests/Lib_UnitTest.py @@ -262,18 +262,18 @@ def test_Empty(self): result, semver = _GetSemanticVersionImpl([]) assert result == 0 - assert semver.major == 0 - assert semver.minor == 1 - assert semver.patch == 0 + assert semver.semantic_version.major == 0 + assert semver.semantic_version.minor == 1 + assert semver.semantic_version.patch == 0 # ---------------------------------------------------------------------- def test_Single(self): result, semver = _GetSemanticVersionImpl([_CreateCommitInfo("Commit 1")]) assert result == 0 - assert semver.major == 0 - assert semver.minor == 1 - assert semver.patch == 0 + assert semver.semantic_version.major == 0 + assert semver.semantic_version.minor == 1 + assert semver.semantic_version.patch == 0 # ---------------------------------------------------------------------- def test_Multiple(self): @@ -286,9 +286,9 @@ def test_Multiple(self): result, semver = _GetSemanticVersionImpl(commits) assert result == 0 - assert semver.major == 0 - assert semver.minor == 1 - assert semver.patch == len(commits) - 1 + assert semver.semantic_version.major == 0 + assert semver.semantic_version.minor == 1 + assert semver.semantic_version.patch == len(commits) - 1 # ---------------------------------------------------------------------- def test_BumpMinor(self): @@ -302,9 +302,9 @@ def test_BumpMinor(self): ) assert result == 0 - assert semver.major == 0 - assert semver.minor == 1 - assert semver.patch == 1 + assert semver.semantic_version.major == 0 + assert semver.semantic_version.minor == 1 + assert semver.semantic_version.patch == 1 # ---------------------------------------------------------------------- def test_BumpMajor(self): @@ -320,9 +320,9 @@ def test_BumpMajor(self): ) assert result == 0 - assert semver.major == 1 - assert semver.minor == 1 - assert semver.patch == 1 + assert semver.semantic_version.major == 1 + assert semver.semantic_version.minor == 1 + assert semver.semantic_version.patch == 1 # ---------------------------------------------------------------------- def test_Feature(self): @@ -335,9 +335,9 @@ def test_Feature(self): ) assert result == 0 - assert semver.major == 0 - assert semver.minor == 3 - assert semver.patch == 0 + assert semver.semantic_version.major == 0 + assert semver.semantic_version.minor == 3 + assert semver.semantic_version.patch == 0 # ---------------------------------------------------------------------- def test_WithTag(self): @@ -351,9 +351,9 @@ def test_WithTag(self): ) assert result == 0 - assert semver.major == 2 - assert semver.minor == 0 - assert semver.patch == 0 + assert semver.semantic_version.major == 2 + assert semver.semantic_version.minor == 0 + assert semver.semantic_version.patch == 0 # ---------------------------------------------------------------------- def test_WithTag2(self): @@ -365,19 +365,22 @@ def test_WithTag2(self): ) assert result == 0 - assert semver.major == 1 - assert semver.minor == 2 - assert semver.patch == 4 + assert semver.semantic_version.major == 1 + assert semver.semantic_version.minor == 2 + assert semver.semantic_version.patch == 4 # ---------------------------------------------------------------------- def test_PrereleaseName(self): result, semver = _GetSemanticVersionImpl([], prerelease_name="MyPrereleaseName") assert result == 0 - assert semver.major == 0 - assert semver.minor == 1 - assert semver.patch == 0 - assert semver.prerelease and semver.prerelease[0] == "MyPrereleaseName" + assert semver.semantic_version.major == 0 + assert semver.semantic_version.minor == 1 + assert semver.semantic_version.patch == 0 + assert ( + semver.semantic_version.prerelease + and semver.semantic_version.prerelease[0] == "MyPrereleaseName" + ) # ---------------------------------------------------------------------- def test_IgnoredChanges(self): @@ -394,9 +397,9 @@ def test_IgnoredChanges(self): ) assert result == 0 - assert semver.major == 0 - assert semver.minor == 1 - assert semver.patch == 2 + assert semver.semantic_version.major == 0 + assert semver.semantic_version.minor == 1 + assert semver.semantic_version.patch == 2 # ---------------------------------------------------------------------- def test_Styles(self): @@ -408,15 +411,18 @@ def test_Styles(self): ) assert result == 0 - assert semver.major == 0 - assert semver.minor == 1 - assert semver.patch == 0 + assert semver.semantic_version.major == 0 + assert semver.semantic_version.minor == 1 + assert semver.semantic_version.patch == 0 - assert semver.prerelease is not None and len(semver.prerelease) >= 1 - standard_prerelease = semver.prerelease + assert ( + semver.semantic_version.prerelease is not None + and len(semver.semantic_version.prerelease) >= 1 + ) + standard_prerelease = semver.semantic_version.prerelease - assert semver.build is not None and len(semver.build) >= 1 - standard_build = semver.build + assert semver.semantic_version.build is not None and len(semver.semantic_version.build) >= 1 + standard_build = semver.semantic_version.build # AllPrerelease result, semver = _GetSemanticVersionImpl( @@ -426,14 +432,15 @@ def test_Styles(self): ) assert result == 0 - assert semver.major == 0 - assert semver.minor == 1 - assert semver.patch == 0 + assert semver.semantic_version.major == 0 + assert semver.semantic_version.minor == 1 + assert semver.semantic_version.patch == 0 - assert semver.prerelease is not None and ( - len(semver.prerelease) == len(standard_prerelease) + len(standard_build) + assert semver.semantic_version.prerelease is not None and ( + len(semver.semantic_version.prerelease) + == len(standard_prerelease) + len(standard_build) ) - assert semver.build == () + assert semver.semantic_version.build == () # AllMetadata result, semver = _GetSemanticVersionImpl( @@ -443,13 +450,13 @@ def test_Styles(self): ) assert result == 0 - assert semver.major == 0 - assert semver.minor == 1 - assert semver.patch == 0 + assert semver.semantic_version.major == 0 + assert semver.semantic_version.minor == 1 + assert semver.semantic_version.patch == 0 - assert semver.prerelease == () - assert semver.build is not None and ( - len(semver.build) == len(standard_prerelease) + len(standard_build) + assert semver.semantic_version.prerelease == () + assert semver.semantic_version.build is not None and ( + len(semver.semantic_version.build) == len(standard_prerelease) + len(standard_build) ) # ---------------------------------------------------------------------- @@ -481,16 +488,18 @@ def CustomCommitDeltaExtractor( ) assert result == 0 - assert semver.major == 1000 - assert semver.minor == 100 - assert semver.patch == 10 + assert semver.semantic_version.major == 1000 + assert semver.semantic_version.minor == 100 + assert semver.semantic_version.patch == 10 assert ( - semver.prerelease is None or "bumped_major" not in semver.prerelease + semver.semantic_version.prerelease is None + or "bumped_major" not in semver.semantic_version.prerelease ) # prerelease is wiped when a new version is encountered assert ( - semver.prerelease is None or "bumped_minor" not in semver.prerelease + semver.semantic_version.prerelease is None + or "bumped_minor" not in semver.semantic_version.prerelease ) # prerelease is wiped when a new version is encountered - assert semver.build and "bumped_patch" in semver.build + assert semver.semantic_version.build and "bumped_patch" in semver.semantic_version.build # ---------------------------------------------------------------------- @@ -517,11 +526,11 @@ def _GetSemanticVersionImpl( *, working_dir: Path = Path.cwd(), **kwargs, -) -> tuple[int, SemVer]: +) -> tuple[int, GetSemanticVersionResult]: with patch("AutoGitSemVer.Lib.EnumCommits", return_value=commits): sink = StringIO() with DoneManager.Create(sink, "_GetSemanticVersionImpl...") as dm: result = GetSemanticVersion(dm, working_dir, **kwargs) - return dm.result, result.semantic_version + return dm.result, result