Test: Drop default confirmation:off and correct tests accordingly

This commit is contained in:
Renato Alves 2015-07-28 17:00:04 +01:00
parent 1ad8aa9aec
commit fe23510c51
24 changed files with 68 additions and 46 deletions

View file

@ -49,10 +49,8 @@ class Task(object):
self.reset_env() self.reset_env()
# Cannot call self.config until confirmation is disabled
with open(self.taskrc, 'w') as rc: with open(self.taskrc, 'w') as rc:
rc.write("data.location={0}\n" rc.write("data.location={0}\n"
"confirmation=no\n"
"hooks=off\n" "hooks=off\n"
"".format(self.datadir)) "".format(self.datadir))
@ -137,7 +135,7 @@ class Task(object):
""" """
# Add -- to avoid misinterpretation of - in things like UUIDs # Add -- to avoid misinterpretation of - in things like UUIDs
cmd = (self.taskw, "config", "--", var, value) cmd = (self.taskw, "config", "--", var, value)
return run_cmd_wait(cmd, env=self.env) return run_cmd_wait(cmd, env=self.env, input="y\n")
@property @property
def taskrc_content(self): def taskrc_content(self):

View file

@ -154,7 +154,7 @@ class TestProject(TestBashCompletionBase):
code, out, err = self.t("add this task should be number 2 and stay number 2") code, out, err = self.t("add this task should be number 2 and stay number 2")
self.assertIn("Created task 2", out) self.assertIn("Created task 2", out)
code, out, err = self.t("1 delete") code, out, err = self.t("1 delete", input="y\n")
self.assertIn("Deleted 1 task", out) self.assertIn("Deleted 1 task", out)
with tasksh(self.t): with tasksh(self.t):

View file

@ -45,7 +45,7 @@ class TestBug954(TestCase):
def test_deletion_by_uuid(self): def test_deletion_by_uuid(self):
"""Verify deletion using extant UUID""" """Verify deletion using extant UUID"""
code, out, err = self.t("_get 1.uuid") code, out, err = self.t("_get 1.uuid")
code, out, err = self.t(out.strip() + " delete") code, out, err = self.t(out.strip() + " delete", input="y\n")
self.assertIn("Deleting task 1 'foo'", out) self.assertIn("Deleting task 1 'foo'", out)
def test_deletion_by_missing_uuid(self): def test_deletion_by_missing_uuid(self):

View file

@ -46,7 +46,7 @@ class TestSummaryPercentage(TestCase):
self.t("add project:A two") self.t("add project:A two")
self.t("add project:A three") self.t("add project:A three")
self.t("1 done") self.t("1 done")
self.t("2 delete") self.t("2 delete", input="y\n")
code, out, err = self.t("summary") code, out, err = self.t("summary")
self.assertIn(" 50%", out) self.assertIn(" 50%", out)

View file

@ -44,7 +44,7 @@ class TestBurndownCommand(TestCase):
cls.t("add two") cls.t("add two")
cls.t("2 start") cls.t("2 start")
cls.t("add three") cls.t("add three")
cls.t("3 delete") cls.t("3 delete", input="y\n")
cls.t("add four") cls.t("add four")
cls.t("4 start") cls.t("4 start")
cls.t("4 done") cls.t("4 done")

View file

@ -191,7 +191,7 @@ class TestStatusFormats(TestCase):
cls.t("add zero") cls.t("add zero")
cls.t("add one") cls.t("add one")
cls.t("2 delete") cls.t("2 delete", input="y\n")
cls.t("log two") cls.t("log two")
cls.t("add three due:eom recur:weekly") cls.t("add three due:eom recur:weekly")
cls.t("add four wait:eom") cls.t("add four wait:eom")

View file

@ -47,7 +47,7 @@ class TestCompleted(TestCase):
self.t("add two") self.t("add two")
self.t("add three") self.t("add three")
self.t("1 done") self.t("1 done")
self.t("2 delete") self.t("2 delete", input="y\n")
code, out, err = self.t("completed") code, out, err = self.t("completed")
self.assertIn('one', out) self.assertIn('one', out)

View file

@ -41,6 +41,19 @@ class ContextManagementTest(TestCase):
def setUp(self): def setUp(self):
self.t = Task() self.t = Task()
self.t.config("confirmation", "off")
def test_context_define_confirmation(self):
"""With confirmation active, prompt if context filter matches no tasks"""
self.t.config("confirmation", "on")
code, out, err = self.t.runError('context define work project:Work', timeout=0.2)
self.assertIn("The filter 'project:Work' matches 0 pending tasks.", out)
self.assertNotIn("Context 'work' defined.", out)
# Assert the config contains context definition
self.assertNotIn('context.work=project:Work\n', self.t.taskrc_content)
def test_context_define(self): def test_context_define(self):
"""Test simple context definition.""" """Test simple context definition."""
code, out, err = self.t('context define work project:Work') code, out, err = self.t('context define work project:Work')
@ -274,6 +287,8 @@ class ContextEvaluationTest(TestCase):
def setUp(self): def setUp(self):
self.t = Task() self.t = Task()
self.t.config("confirmation", "off")
# Setup contexts # Setup contexts
self.t('context define work project:Work') self.t('context define work project:Work')
self.t('context define home +home') self.t('context define home +home')

View file

@ -44,7 +44,7 @@ class TestCount(TestCase):
cls.t("add one") cls.t("add one")
cls.t("log two") cls.t("log two")
cls.t("add three") cls.t("add three")
cls.t("1 delete") cls.t("1 delete", input="y\n")
def test_count_unfiltered(self): def test_count_unfiltered(self):
code, out, err = self.t("count") code, out, err = self.t("count")

View file

@ -46,7 +46,7 @@ class TestDelete(TestCase):
code, out, err = self.t("_get 1.uuid") code, out, err = self.t("_get 1.uuid")
uuid = out.strip() uuid = out.strip()
self.t("1 delete") self.t("1 delete", input="y\n")
self.t.runError("list") # GC/handleRecurrence self.t.runError("list") # GC/handleRecurrence
code, out, err = self.t("_get 1.status") code, out, err = self.t("_get 1.status")
self.assertEqual("\n", out) self.assertEqual("\n", out)
@ -54,7 +54,7 @@ class TestDelete(TestCase):
code, out, err = self.t("_get %s.status" % uuid) code, out, err = self.t("_get %s.status" % uuid)
self.assertIn("deleted\n", out) self.assertIn("deleted\n", out)
self.t("undo") self.t("undo", input="y\n")
code, out, err = self.t("_get 1.status") code, out, err = self.t("_get 1.status")
self.assertIn("pending\n", out) self.assertIn("pending\n", out)
code, out, err = self.t("_get %s.status" % uuid) code, out, err = self.t("_get %s.status" % uuid)
@ -63,7 +63,7 @@ class TestDelete(TestCase):
def test_delete_en_passant(self): def test_delete_en_passant(self):
"""Verify that en-passant works with delete""" """Verify that en-passant works with delete"""
self.t("add foo") self.t("add foo")
code, out, err = self.t("1 delete project:work") code, out, err = self.t("1 delete project:work", input="y\n")
self.assertIn("Deleted 1 task.", out) self.assertIn("Deleted 1 task.", out)
code, out, err = self.t("all rc.verbose:nothing") code, out, err = self.t("all rc.verbose:nothing")
@ -80,7 +80,7 @@ class TestDelete(TestCase):
self.t("all") # GC/handleRecurrence self.t("all") # GC/handleRecurrence
code, out, err = self.t("%s delete" % uuid) code, out, err = self.t("%s delete" % uuid, input="y\n")
self.assertIn("Deleted 1 task.", out) self.assertIn("Deleted 1 task.", out)
code, out, err = self.t("_get %s.status" % uuid) code, out, err = self.t("_get %s.status" % uuid)
@ -90,7 +90,7 @@ class TestDelete(TestCase):
"""Delete prompt with closed STDIN causes infinite loop and floods stdout (single)""" """Delete prompt with closed STDIN causes infinite loop and floods stdout (single)"""
self.t("add foo1") self.t("add foo1")
self._validate_prompt_loop() self._validate_prompt_loop(input="y\n")
def test_delete_bulk_prompt_loop(self): def test_delete_bulk_prompt_loop(self):
"""Delete prompt with closed STDIN causes infinite loop and floods stdout (bulk)""" """Delete prompt with closed STDIN causes infinite loop and floods stdout (bulk)"""
@ -99,12 +99,12 @@ class TestDelete(TestCase):
self.t("add foo2") self.t("add foo2")
self.t("add foo3") self.t("add foo3")
self._validate_prompt_loop() self._validate_prompt_loop(input="y\n")
def _validate_prompt_loop(self): def _validate_prompt_loop(self, input=""):
"""Helper method to check if task flooded stream on closed STDIN""" """Helper method to check if task flooded stream on closed STDIN"""
try: try:
code, out, err = self.t("/foo[1-3]/ delete", input="", timeout=0.2) code, out, err = self.t("/foo[1-3]/ delete", input=input, timeout=0.2)
except CommandError as e: except CommandError as e:
# If delete fails with a timeout, don't fail the test immediately # If delete fails with a timeout, don't fail the test immediately
code, out, err = e.code, e.out, e.err code, out, err = e.code, e.out, e.err

View file

@ -164,8 +164,9 @@ class TestDependencies(TestCase):
# 3 <-- 4 Deleting 4 requires no repair # 3 <-- 4 Deleting 4 requires no repair
# 3 # 3
code, out, err = self.t("4 delete") code, out, err = self.t("4 delete", input="y\n")
self.assertNotIn("Would you like the dependency chain fixed?", out) self.assertNotIn("Would you like the dependency chain fixed?", out)
self.assertIn("Deleted 1 task", out)
@unittest.expectedFailure @unittest.expectedFailure
def test_id_range_dep(self): def test_id_range_dep(self):

View file

@ -84,6 +84,8 @@ class TestEnpassant(BaseTestEnpassant):
def setUp(self): def setUp(self):
super(TestEnpassant, self).setUp() super(TestEnpassant, self).setUp()
self.t.config("confirmation", "off")
self.t("add one") self.t("add one")
self.t("add two") self.t("add two")
self.t("add three") self.t("add three")

View file

@ -58,7 +58,7 @@ class TestFeature725(TestCase):
self.assertIn("Unblocked", out) self.assertIn("Unblocked", out)
# 1 does unblock 4. # 1 does unblock 4.
code, out, er = self.t("1 delete") code, out, er = self.t("1 delete", input="y\n")
self.assertIn("Unblocked", out) self.assertIn("Unblocked", out)

View file

@ -139,7 +139,7 @@ class TestImport(TestCase):
def test_import_update(self): def test_import_update(self):
"""Update existing tasks""" """Update existing tasks"""
self.t("import", input=self.data1) self.t("import", input=self.data1)
self.t("a1111111-a111-a111-a111-a11111111111 delete") self.t("a1111111-a111-a111-a111-a11111111111 delete", input="y\n")
self.t("next") # Run GC self.t("next") # Run GC
_t = sorted(self.t.export(), key=lambda t: t["uuid"]) _t = sorted(self.t.export(), key=lambda t: t["uuid"])

View file

@ -49,7 +49,7 @@ class TestProjects(TestCase):
self.t("add project:A 1") self.t("add project:A 1")
self.t("add project:B 2") self.t("add project:B 2")
self.t("add project:B 3") self.t("add project:B 3")
self.t("3 delete") self.t("3 delete", input="y\n")
code, out, err = self.t("project:B projects") code, out, err = self.t("project:B projects")
expected = "1 project \(1 task\)" expected = "1 project \(1 task\)"
@ -78,7 +78,7 @@ class TestProjects(TestCase):
self.assertRegexpMatches(err, self.STATUS.format("foo", "25%", self.assertRegexpMatches(err, self.STATUS.format("foo", "25%",
"3 of 4 tasks")) "3 of 4 tasks"))
code, out, err = self.t("2 delete") code, out, err = self.t("2 delete", input="y\n")
self.assertRegexpMatches(err, self.STATUS.format("foo", "33%", self.assertRegexpMatches(err, self.STATUS.format("foo", "33%",
"2 of 3 tasks")) "2 of 3 tasks"))
@ -156,7 +156,7 @@ class TestProjects(TestCase):
"""Verify _projects helper list projects""" """Verify _projects helper list projects"""
self.t("add project:A one") self.t("add project:A one")
self.t("add project:B two") self.t("add project:B two")
self.t("2 delete") self.t("2 delete", input="y\n")
self.t("log project:C three") self.t("log project:C three")
self.t("list") self.t("list")
@ -170,6 +170,7 @@ class TestProjects(TestCase):
self.assertIn("B", out) self.assertIn("B", out)
self.assertIn("C", out) self.assertIn("C", out)
class TestBug299(TestCase): class TestBug299(TestCase):
def setUp(self): def setUp(self):
self.t = Task() self.t = Task()
@ -245,6 +246,7 @@ class TestBug605(TestCase):
code, out, err = self.t("2 done") code, out, err = self.t("2 done")
self.assertIn("is 100% complete", err) self.assertIn("is 100% complete", err)
class TestBug906(TestCase): class TestBug906(TestCase):
def setUp(self): def setUp(self):
self.t = Task() self.t = Task()
@ -278,6 +280,7 @@ class TestBug906(TestCase):
self.assertNotIn("one", out) self.assertNotIn("one", out)
self.assertIn("two", out) self.assertIn("two", out)
class TestBug856(TestCase): class TestBug856(TestCase):
def setUp(self): def setUp(self):
self.t = Task() self.t = Task()
@ -302,6 +305,7 @@ class TestBug856(TestCase):
self.assertIn("floating", out) self.assertIn("floating", out)
self.assertNotIn("assigned", out) self.assertNotIn("assigned", out)
class TestBug1511(TestCase): class TestBug1511(TestCase):
def setUp(self): def setUp(self):
self.t = Task() self.t = Task()
@ -317,6 +321,7 @@ class TestBug1511(TestCase):
self.assertIn("one", out) self.assertIn("one", out)
self.assertNotIn("zero", out) self.assertNotIn("zero", out)
class TestBug1455(TestCase): class TestBug1455(TestCase):
def setUp(self): def setUp(self):
self.t = Task() self.t = Task()

View file

@ -194,7 +194,7 @@ class TestRecurrenceTasks(TestCase):
self.assertEqual("complex3\n", out) self.assertEqual("complex3\n", out)
# Delete a child task, do not propagate. # Delete a child task, do not propagate.
code, out, err = self.t("3 delete", input="n\n") code, out, err = self.t("3 delete", input="y\n")
self.assertIn("Deleted 1 task.", out) self.assertIn("Deleted 1 task.", out)
# Delete a child task, propagate. # Delete a child task, propagate.
@ -229,7 +229,7 @@ class TestDeletionRecurrence(TestCase):
"""Delete a parent with child tasks""" """Delete a parent with child tasks"""
self.t("add one due:eom recur:daily") self.t("add one due:eom recur:daily")
self.t("list") # GC/handleRecurrence self.t("list") # GC/handleRecurrence
code, out, err = self.t("1 delete", input="y\n") code, out, err = self.t("1 delete", input="y\ny\n")
self.assertIn("Deleted 2 tasks.", out) self.assertIn("Deleted 2 tasks.", out)
code, out, err = self.t.runError("list") code, out, err = self.t.runError("list")
@ -242,7 +242,7 @@ class TestDeletionRecurrence(TestCase):
code, out, err = self.t("list rc.verbose:nothing") # GC/handleRecurrence code, out, err = self.t("list rc.verbose:nothing") # GC/handleRecurrence
self.assertEqual(out.count("one"), 5) self.assertEqual(out.count("one"), 5)
code, out, err = self.t("2 delete", input="y\n") code, out, err = self.t("2 delete", input="y\ny\n")
self.assertIn("Deleted 5 tasks.", out) self.assertIn("Deleted 5 tasks.", out)
@ -312,7 +312,6 @@ class TestBug955(TestCase):
def setUp(self): def setUp(self):
self.t = Task() self.t = Task()
@unittest.expectedFailure
def test_no_prompt_for_parent_on_child_delete(self): def test_no_prompt_for_parent_on_child_delete(self):
"""Deleting a child of a recurring task doesn't prompt for parent deletion """Deleting a child of a recurring task doesn't prompt for parent deletion
@ -322,13 +321,7 @@ class TestBug955(TestCase):
code, out, err = self.t("ls") code, out, err = self.t("ls")
self.assertRegexpMatches(out, re.compile("^2 tasks", re.MULTILINE)) self.assertRegexpMatches(out, re.compile("^2 tasks", re.MULTILINE))
# NOTE: Test fails here due to some strange handling of STDIN in task code, out, err = self.t("2 delete", input="n\ny\n")
# "y\nn\n" actually behaves as "y\ny\n" so both tasks are deleted
# in the shell 'printf "y\nn\n" | task 2 delete' works as expected.
# Yet replacing the task binary with something like "hexdump", all
# bytes received via STDIN are identical in python vs shell.
# NOTE: This may be related to delete.t test_delete_bulk_prompt_loop
code, out, err = self.t("2 delete", input="y\nn\n")
self.assertIn("Deleting task 2", out) self.assertIn("Deleting task 2", out)
self.assertIn("Deleted 1 task", out) self.assertIn("Deleted 1 task", out)

View file

@ -50,7 +50,7 @@ class TestSequences(TestCase):
def test_sequence_delete(self): def test_sequence_delete(self):
"""Test sequences in delete""" """Test sequences in delete"""
self.t("1,2 delete") self.t("1,2 delete", input="y\ny\n")
code, out, err = self.t("_get 1.status 2.status") code, out, err = self.t("_get 1.status 2.status")
self.assertEqual("deleted deleted\n", out) self.assertEqual("deleted deleted\n", out)

View file

@ -110,7 +110,7 @@ class TestActiveTaskHandling(TestCase):
def test_start_deleted(self): def test_start_deleted(self):
"""Deleted task set to pending by start""" """Deleted task set to pending by start"""
self.t("+one delete") self.t("+one delete", input="y\n")
self.t("+one start") self.t("+one start")
tl = self.t.export() tl = self.t.export()
self.assertEqual(tl[0]["status"], "pending") self.assertEqual(tl[0]["status"], "pending")

View file

@ -44,7 +44,7 @@ class TestStatisticsCommand(TestCase):
"""Verify stats records task states""" """Verify stats records task states"""
self.t("add one") self.t("add one")
self.t("add two") self.t("add two")
self.t("2 delete") self.t("2 delete", input="y\n")
self.t("log three") self.t("log three")
code, out, err = self.t("stats") code, out, err = self.t("stats")

View file

@ -74,6 +74,7 @@ class TestTags(TestCase):
code, out, err = self.t("1 modify -missing") code, out, err = self.t("1 modify -missing")
self.assertIn("Modified 0 tasks", out) self.assertIn("Modified 0 tasks", out)
class TestVirtualTags(TestCase): class TestVirtualTags(TestCase):
@classmethod @classmethod
def setUpClass(cls): def setUpClass(cls):
@ -82,7 +83,7 @@ class TestVirtualTags(TestCase):
cls.t.config("verbose", "nothing") cls.t.config("verbose", "nothing")
cls.t("log completed") cls.t("log completed")
cls.t("add deleted") cls.t("add deleted")
cls.t("1 delete") cls.t("1 delete", input="y\n")
cls.t("add minimal") cls.t("add minimal")
cls.t("add maximal +tag pro:PRO pri:H due:yesterday") cls.t("add maximal +tag pro:PRO pri:H due:yesterday")
cls.t("3 start") cls.t("3 start")

View file

@ -153,7 +153,7 @@ class TestBug1379(TestCase):
self.t.config("color.deleted", "") self.t.config("color.deleted", "")
self.t("add Delete") self.t("add Delete")
self.t("1 delete") self.t("1 delete", input="y\n")
code, out, err = self.t("all +DELETED") code, out, err = self.t("all +DELETED")
self.assertRegexpMatches(out, self.RED + r".*Delete.*" + self.CLEAR) self.assertRegexpMatches(out, self.RED + r".*Delete.*" + self.CLEAR)

View file

@ -42,7 +42,14 @@ class TestBug1475(TestCase):
def test_config_unmolested(self): def test_config_unmolested(self):
"""Verify that a config value is not borked by lex/eval""" """Verify that a config value is not borked by lex/eval"""
self.t("config name one/two/three") self.t.config("name", "one/two/three")
code, out, err = self.t("_get rc.name")
self.assertEqual("one/two/three\n", out)
def test_config_unmolested_2(self):
"""Verify that a config value is not borked by lex/eval - literal"""
self.t("config name one/two/three", input="y\n")
code, out, err = self.t("_get rc.name") code, out, err = self.t("_get rc.name")
self.assertEqual("one/two/three\n", out) self.assertEqual("one/two/three\n", out)

View file

@ -45,7 +45,7 @@ class TestUndo(TestCase):
self.t('add one') self.t('add one')
code, out, err = self.t('_get 1.status') code, out, err = self.t('_get 1.status')
self.assertEqual(out.strip(), 'pending') self.assertEqual(out.strip(), 'pending')
self.t('undo') self.t('undo', input="y\n")
code, out, err = self.t('_get 1.status') code, out, err = self.t('_get 1.status')
self.assertEqual(out.strip(), '') self.assertEqual(out.strip(), '')
@ -57,7 +57,7 @@ class TestUndo(TestCase):
self.t('1 done') self.t('1 done')
code, out, err = self.t('_get 1.status') code, out, err = self.t('_get 1.status')
self.assertEqual(out.strip(), 'completed') self.assertEqual(out.strip(), 'completed')
self.t('undo') self.t('undo', input="y\n")
code, out, err = self.t('_get 1.status') code, out, err = self.t('_get 1.status')
self.assertEqual(out.strip(), 'pending') self.assertEqual(out.strip(), 'pending')

View file

@ -46,7 +46,7 @@ class TestUnique(TestCase):
self.t("add two project:A") self.t("add two project:A")
self.t("add three project:B") self.t("add three project:B")
self.t("add four project:C") self.t("add four project:C")
self.t("4 delete") self.t("4 delete", input="y\n")
self.t("log five project:D") self.t("log five project:D")
code, out, err = self.t("_unique project") code, out, err = self.t("_unique project")