summaryrefslogtreecommitdiffstats
path: root/gitlint/tests/rules/test_title_rules.py
diff options
context:
space:
mode:
Diffstat (limited to 'gitlint/tests/rules/test_title_rules.py')
-rw-r--r--gitlint/tests/rules/test_title_rules.py154
1 files changed, 154 insertions, 0 deletions
diff --git a/gitlint/tests/rules/test_title_rules.py b/gitlint/tests/rules/test_title_rules.py
new file mode 100644
index 0000000..07d2323
--- /dev/null
+++ b/gitlint/tests/rules/test_title_rules.py
@@ -0,0 +1,154 @@
+# -*- coding: utf-8 -*-
+from gitlint.tests.base import BaseTestCase
+from gitlint.rules import TitleMaxLength, TitleTrailingWhitespace, TitleHardTab, TitleMustNotContainWord, \
+ TitleTrailingPunctuation, TitleLeadingWhitespace, TitleRegexMatches, RuleViolation
+
+
+class TitleRuleTests(BaseTestCase):
+ def test_max_line_length(self):
+ rule = TitleMaxLength()
+
+ # assert no error
+ violation = rule.validate(u"å" * 72, None)
+ self.assertIsNone(violation)
+
+ # assert error on line length > 72
+ expected_violation = RuleViolation("T1", "Title exceeds max length (73>72)", u"å" * 73)
+ violations = rule.validate(u"å" * 73, None)
+ self.assertListEqual(violations, [expected_violation])
+
+ # set line length to 120, and check no violation on length 73
+ rule = TitleMaxLength({'line-length': 120})
+ violations = rule.validate(u"å" * 73, None)
+ self.assertIsNone(violations)
+
+ # assert raise on 121
+ expected_violation = RuleViolation("T1", "Title exceeds max length (121>120)", u"å" * 121)
+ violations = rule.validate(u"å" * 121, None)
+ self.assertListEqual(violations, [expected_violation])
+
+ def test_trailing_whitespace(self):
+ rule = TitleTrailingWhitespace()
+
+ # assert no error
+ violations = rule.validate(u"å", None)
+ self.assertIsNone(violations)
+
+ # trailing space
+ expected_violation = RuleViolation("T2", "Title has trailing whitespace", u"å ")
+ violations = rule.validate(u"å ", None)
+ self.assertListEqual(violations, [expected_violation])
+
+ # trailing tab
+ expected_violation = RuleViolation("T2", "Title has trailing whitespace", u"å\t")
+ violations = rule.validate(u"å\t", None)
+ self.assertListEqual(violations, [expected_violation])
+
+ def test_hard_tabs(self):
+ rule = TitleHardTab()
+
+ # assert no error
+ violations = rule.validate(u"This is å test", None)
+ self.assertIsNone(violations)
+
+ # contains hard tab
+ expected_violation = RuleViolation("T4", "Title contains hard tab characters (\\t)", u"This is å\ttest")
+ violations = rule.validate(u"This is å\ttest", None)
+ self.assertListEqual(violations, [expected_violation])
+
+ def test_trailing_punctuation(self):
+ rule = TitleTrailingPunctuation()
+
+ # assert no error
+ violations = rule.validate(u"This is å test", None)
+ self.assertIsNone(violations)
+
+ # assert errors for different punctuations
+ punctuation = u"?:!.,;"
+ for char in punctuation:
+ line = u"This is å test" + char # note that make sure to include some unicode!
+ gitcontext = self.gitcontext(line)
+ expected_violation = RuleViolation("T3", u"Title has trailing punctuation ({0})".format(char), line)
+ violations = rule.validate(line, gitcontext)
+ self.assertListEqual(violations, [expected_violation])
+
+ def test_title_must_not_contain_word(self):
+ rule = TitleMustNotContainWord()
+
+ # no violations
+ violations = rule.validate(u"This is å test", None)
+ self.assertIsNone(violations)
+
+ # no violation if WIP occurs inside a wor
+ violations = rule.validate(u"This is å wiping test", None)
+ self.assertIsNone(violations)
+
+ # match literally
+ violations = rule.validate(u"WIP This is å test", None)
+ expected_violation = RuleViolation("T5", "Title contains the word 'WIP' (case-insensitive)",
+ u"WIP This is å test")
+ self.assertListEqual(violations, [expected_violation])
+
+ # match case insensitive
+ violations = rule.validate(u"wip This is å test", None)
+ expected_violation = RuleViolation("T5", "Title contains the word 'WIP' (case-insensitive)",
+ u"wip This is å test")
+ self.assertListEqual(violations, [expected_violation])
+
+ # match if there is a colon after the word
+ violations = rule.validate(u"WIP:This is å test", None)
+ expected_violation = RuleViolation("T5", "Title contains the word 'WIP' (case-insensitive)",
+ u"WIP:This is å test")
+ self.assertListEqual(violations, [expected_violation])
+
+ # match multiple words
+ rule = TitleMustNotContainWord({'words': u"wip,test,å"})
+ violations = rule.validate(u"WIP:This is å test", None)
+ expected_violation = RuleViolation("T5", "Title contains the word 'wip' (case-insensitive)",
+ u"WIP:This is å test")
+ expected_violation2 = RuleViolation("T5", "Title contains the word 'test' (case-insensitive)",
+ u"WIP:This is å test")
+ expected_violation3 = RuleViolation("T5", u"Title contains the word 'å' (case-insensitive)",
+ u"WIP:This is å test")
+ self.assertListEqual(violations, [expected_violation, expected_violation2, expected_violation3])
+
+ def test_leading_whitespace(self):
+ rule = TitleLeadingWhitespace()
+
+ # assert no error
+ violations = rule.validate("a", None)
+ self.assertIsNone(violations)
+
+ # leading space
+ expected_violation = RuleViolation("T6", "Title has leading whitespace", " a")
+ violations = rule.validate(" a", None)
+ self.assertListEqual(violations, [expected_violation])
+
+ # leading tab
+ expected_violation = RuleViolation("T6", "Title has leading whitespace", "\ta")
+ violations = rule.validate("\ta", None)
+ self.assertListEqual(violations, [expected_violation])
+
+ # unicode test
+ expected_violation = RuleViolation("T6", "Title has leading whitespace", u" ☺")
+ violations = rule.validate(u" ☺", None)
+ self.assertListEqual(violations, [expected_violation])
+
+ def test_regex_matches(self):
+ commit = self.gitcommit(u"US1234: åbc\n")
+
+ # assert no violation on default regex (=everything allowed)
+ rule = TitleRegexMatches()
+ violations = rule.validate(commit.message.title, commit)
+ self.assertIsNone(violations)
+
+ # assert no violation on matching regex
+ rule = TitleRegexMatches({'regex': u"^US[0-9]*: å"})
+ violations = rule.validate(commit.message.title, commit)
+ self.assertIsNone(violations)
+
+ # assert violation when no matching regex
+ rule = TitleRegexMatches({'regex': u"^UÅ[0-9]*"})
+ violations = rule.validate(commit.message.title, commit)
+ expected_violation = RuleViolation("T7", u"Title does not match regex (^UÅ[0-9]*)", u"US1234: åbc")
+ self.assertListEqual(violations, [expected_violation])