summaryrefslogtreecommitdiffstats
path: root/gitlint/tests/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'gitlint/tests/contrib')
-rw-r--r--gitlint/tests/contrib/__init__.py0
-rw-r--r--gitlint/tests/contrib/test_contrib_rules.py72
-rw-r--r--gitlint/tests/contrib/test_conventional_commit.py47
-rw-r--r--gitlint/tests/contrib/test_signedoff_by.py32
4 files changed, 151 insertions, 0 deletions
diff --git a/gitlint/tests/contrib/__init__.py b/gitlint/tests/contrib/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/gitlint/tests/contrib/__init__.py
diff --git a/gitlint/tests/contrib/test_contrib_rules.py b/gitlint/tests/contrib/test_contrib_rules.py
new file mode 100644
index 0000000..3fa4048
--- /dev/null
+++ b/gitlint/tests/contrib/test_contrib_rules.py
@@ -0,0 +1,72 @@
+# -*- coding: utf-8 -*-
+import os
+
+from gitlint.tests.base import BaseTestCase
+from gitlint.contrib import rules as contrib_rules
+from gitlint.tests import contrib as contrib_tests
+from gitlint import rule_finder, rules
+
+from gitlint.utils import ustr
+
+
+class ContribRuleTests(BaseTestCase):
+
+ CONTRIB_DIR = os.path.dirname(os.path.realpath(contrib_rules.__file__))
+
+ def test_contrib_tests_exist(self):
+ """ Tests that every contrib rule file has an associated test file.
+ While this doesn't guarantee that every contrib rule has associated tests (as we don't check the content
+ of the tests file), it's a good leading indicator. """
+
+ contrib_tests_dir = os.path.dirname(os.path.realpath(contrib_tests.__file__))
+ contrib_test_files = os.listdir(contrib_tests_dir)
+
+ # Find all python files in the contrib dir and assert there's a corresponding test file
+ for filename in os.listdir(self.CONTRIB_DIR):
+ if filename.endswith(".py") and filename not in ["__init__.py"]:
+ expected_test_file = ustr(u"test_" + filename)
+ error_msg = u"Every Contrib Rule must have associated tests. " + \
+ "Expected test file {0} not found.".format(os.path.join(contrib_tests_dir,
+ expected_test_file))
+ self.assertIn(expected_test_file, contrib_test_files, error_msg)
+
+ def test_contrib_rule_naming_conventions(self):
+ """ Tests that contrib rules follow certain naming conventions.
+ We can test for this at test time (and not during runtime like rule_finder.assert_valid_rule_class does)
+ because these are contrib rules: once they're part of gitlint they can't change unless they pass this test
+ again.
+ """
+ rule_classes = rule_finder.find_rule_classes(self.CONTRIB_DIR)
+
+ for clazz in rule_classes:
+ # Contrib rule names start with "contrib-"
+ self.assertTrue(clazz.name.startswith("contrib-"))
+
+ # Contrib line rules id's start with "CL"
+ if issubclass(clazz, rules.LineRule):
+ if clazz.target == rules.CommitMessageTitle:
+ self.assertTrue(clazz.id.startswith("CT"))
+ elif clazz.target == rules.CommitMessageBody:
+ self.assertTrue(clazz.id.startswith("CB"))
+
+ def test_contrib_rule_uniqueness(self):
+ """ Tests that all contrib rules have unique identifiers.
+ We can test for this at test time (and not during runtime like rule_finder.assert_valid_rule_class does)
+ because these are contrib rules: once they're part of gitlint they can't change unless they pass this test
+ again.
+ """
+ rule_classes = rule_finder.find_rule_classes(self.CONTRIB_DIR)
+
+ # Not very efficient way of checking uniqueness, but it works :-)
+ class_names = [rule_class.name for rule_class in rule_classes]
+ class_ids = [rule_class.id for rule_class in rule_classes]
+ self.assertEqual(len(set(class_names)), len(class_names))
+ self.assertEqual(len(set(class_ids)), len(class_ids))
+
+ def test_contrib_rule_instantiated(self):
+ """ Tests that all contrib rules can be instantiated without errors. """
+ rule_classes = rule_finder.find_rule_classes(self.CONTRIB_DIR)
+
+ # No exceptions = what we want :-)
+ for rule_class in rule_classes:
+ rule_class()
diff --git a/gitlint/tests/contrib/test_conventional_commit.py b/gitlint/tests/contrib/test_conventional_commit.py
new file mode 100644
index 0000000..ea808fd
--- /dev/null
+++ b/gitlint/tests/contrib/test_conventional_commit.py
@@ -0,0 +1,47 @@
+
+# -*- coding: utf-8 -*-
+from gitlint.tests.base import BaseTestCase
+from gitlint.rules import RuleViolation
+from gitlint.contrib.rules.conventional_commit import ConventionalCommit
+from gitlint.config import LintConfig
+
+
+class ContribConventionalCommitTests(BaseTestCase):
+
+ def test_enable(self):
+ # Test that rule can be enabled in config
+ for rule_ref in ['CT1', 'contrib-title-conventional-commits']:
+ config = LintConfig()
+ config.contrib = [rule_ref]
+ self.assertIn(ConventionalCommit(), config.rules)
+
+ def test_conventional_commits(self):
+ rule = ConventionalCommit()
+
+ # No violations when using a correct type and format
+ for type in ["fix", "feat", "chore", "docs", "style", "refactor", "perf", "test", "revert"]:
+ violations = rule.validate(type + u": föo", None)
+ self.assertListEqual([], violations)
+
+ # assert violation on wrong type
+ expected_violation = RuleViolation("CT1", "Title does not start with one of fix, feat, chore, docs,"
+ " style, refactor, perf, test, revert", u"bår: foo")
+ violations = rule.validate(u"bår: foo", None)
+ self.assertListEqual([expected_violation], violations)
+
+ # assert violation on wrong format
+ expected_violation = RuleViolation("CT1", "Title does not follow ConventionalCommits.org format "
+ "'type(optional-scope): description'", u"fix föo")
+ violations = rule.validate(u"fix föo", None)
+ self.assertListEqual([expected_violation], violations)
+
+ # assert no violation when adding new type
+ rule = ConventionalCommit({'types': [u"föo", u"bär"]})
+ for typ in [u"föo", u"bär"]:
+ violations = rule.validate(typ + u": hür dur", None)
+ self.assertListEqual([], violations)
+
+ # assert violation when using incorrect type when types have been reconfigured
+ violations = rule.validate(u"fix: hür dur", None)
+ expected_violation = RuleViolation("CT1", u"Title does not start with one of föo, bär", u"fix: hür dur")
+ self.assertListEqual([expected_violation], violations)
diff --git a/gitlint/tests/contrib/test_signedoff_by.py b/gitlint/tests/contrib/test_signedoff_by.py
new file mode 100644
index 0000000..934aec5
--- /dev/null
+++ b/gitlint/tests/contrib/test_signedoff_by.py
@@ -0,0 +1,32 @@
+
+# -*- coding: utf-8 -*-
+from gitlint.tests.base import BaseTestCase
+from gitlint.rules import RuleViolation
+from gitlint.contrib.rules.signedoff_by import SignedOffBy
+
+from gitlint.config import LintConfig
+
+
+class ContribSignedOffByTests(BaseTestCase):
+
+ def test_enable(self):
+ # Test that rule can be enabled in config
+ for rule_ref in ['CC1', 'contrib-body-requires-signed-off-by']:
+ config = LintConfig()
+ config.contrib = [rule_ref]
+ self.assertIn(SignedOffBy(), config.rules)
+
+ def test_signedoff_by(self):
+ # No violations when 'Signed-Off-By' line is present
+ rule = SignedOffBy()
+ violations = rule.validate(self.gitcommit(u"Föobar\n\nMy Body\nSigned-Off-By: John Smith"))
+ self.assertListEqual([], violations)
+
+ # Assert violation when no 'Signed-Off-By' line is present
+ violations = rule.validate(self.gitcommit(u"Föobar\n\nMy Body"))
+ expected_violation = RuleViolation("CC1", "Body does not contain a 'Signed-Off-By' line", line_nr=1)
+ self.assertListEqual(violations, [expected_violation])
+
+ # Assert violation when no 'Signed-Off-By' in title but not in body
+ violations = rule.validate(self.gitcommit(u"Signed-Off-By\n\nFöobar"))
+ self.assertListEqual(violations, [expected_violation])