mirror of
https://github.com/GothenburgBitFactory/timewarrior.git
synced 2025-06-26 10:54:28 +02:00
#9 TI-1: Add testsuite
- Simple test for each undoable interval command - Refactored assertions
This commit is contained in:
parent
cd7755bc6c
commit
9d29a14d64
3 changed files with 418 additions and 29 deletions
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import unittest
|
import unittest
|
||||||
|
import datetime
|
||||||
|
|
||||||
class BaseTestCase(unittest.TestCase):
|
class BaseTestCase(unittest.TestCase):
|
||||||
def tap(self, out):
|
def tap(self, out):
|
||||||
|
@ -17,8 +17,8 @@ class TestCase(BaseTestCase):
|
||||||
expectedStart=None,
|
expectedStart=None,
|
||||||
expectedTags=None,
|
expectedTags=None,
|
||||||
description="interval"):
|
description="interval"):
|
||||||
self.assertTrue("start" in interval, "{} does not contain a start date".format(description))
|
self.assertKeyExists(interval, "start", description, "{} does not contain a start date")
|
||||||
self.assertFalse("end" in interval, "{} does contain an end date".format(description))
|
self.assertKeyNotExists(interval, "end", description, "{} does contain an end date")
|
||||||
|
|
||||||
return self.assertInterval(interval,
|
return self.assertInterval(interval,
|
||||||
expectedStart=expectedStart,
|
expectedStart=expectedStart,
|
||||||
|
@ -31,8 +31,8 @@ class TestCase(BaseTestCase):
|
||||||
expectedEnd=None,
|
expectedEnd=None,
|
||||||
expectedTags=None,
|
expectedTags=None,
|
||||||
description="interval"):
|
description="interval"):
|
||||||
self.assertTrue("start" in interval, "{} does not contain a start date".format(description))
|
self.assertKeyExists(interval, "start", description, "{} does not contain a start date")
|
||||||
self.assertTrue("end" in interval, "{} does not contain an end date".format(description))
|
self.assertKeyExists(interval, "end", description, "{} does not contain an end date")
|
||||||
|
|
||||||
return self.assertInterval(interval,
|
return self.assertInterval(interval,
|
||||||
expectedStart=expectedStart,
|
expectedStart=expectedStart,
|
||||||
|
@ -46,29 +46,39 @@ class TestCase(BaseTestCase):
|
||||||
expectedTags=None,
|
expectedTags=None,
|
||||||
description="interval"):
|
description="interval"):
|
||||||
if expectedStart:
|
if expectedStart:
|
||||||
self.assertEqual(
|
self.assertIntervalTimestamp(interval, "start", expectedStart, description)
|
||||||
interval["start"],
|
|
||||||
expectedStart,
|
|
||||||
"start time of {} does not match (expected: {}, actual: {})".format(description,
|
|
||||||
expectedStart,
|
|
||||||
interval["start"]))
|
|
||||||
|
|
||||||
if expectedEnd:
|
if expectedEnd:
|
||||||
self.assertEqual(
|
self.assertIntervalTimestamp(interval, "end", expectedEnd, description)
|
||||||
interval["end"],
|
|
||||||
expectedEnd,
|
|
||||||
"end time of {} does not match (expected: {}, actual: {})".format(description,
|
|
||||||
expectedEnd,
|
|
||||||
interval["end"]))
|
|
||||||
|
|
||||||
if expectedTags:
|
if expectedTags:
|
||||||
self.assertTrue("tags" in interval)
|
self.assertKeyExists(interval, "tags", description, "{} does not contain tags")
|
||||||
self.assertEqual(
|
self.assertIntervalValue(interval,
|
||||||
interval["tags"],
|
"tags",
|
||||||
expectedTags,
|
expectedTags,
|
||||||
"tags of {} do not match (expected: {}, actual: {})". format(description,
|
description,
|
||||||
expectedTags,
|
"{} of {} do not match (expected: {}, actual: {})")
|
||||||
interval["tags"]))
|
|
||||||
|
|
||||||
|
def assertKeyExists(self, interval, key, description, message):
|
||||||
|
self.assertTrue(key in interval, message.format(description))
|
||||||
|
|
||||||
|
def assertKeyNotExists(self, interval, key, description, message):
|
||||||
|
self.assertFalse(key in interval, message.format(description))
|
||||||
|
|
||||||
|
def assertIntervalTimestamp(self, interval, key, expected, description):
|
||||||
|
if isinstance(expected, datetime.datetime):
|
||||||
|
expected = "{:%Y%m%dT%H%M%SZ}".format(expected)
|
||||||
|
|
||||||
|
self.assertIntervalValue(interval,
|
||||||
|
key,
|
||||||
|
expected,
|
||||||
|
description,
|
||||||
|
"{} time of {} does not match (expected: {}, actual: {})")
|
||||||
|
|
||||||
|
def assertIntervalValue(self, interval, key, expected, description, message):
|
||||||
|
actual = interval[key]
|
||||||
|
self.assertEqual(actual,
|
||||||
|
expected,
|
||||||
|
message.format(key, description, expected, actual))
|
||||||
|
|
||||||
# vim: ai sts=4 et sw=4
|
# vim: ai sts=4 et sw=4
|
||||||
|
|
|
@ -92,12 +92,11 @@ class Timew(object):
|
||||||
return f.readlines()
|
return f.readlines()
|
||||||
|
|
||||||
def export(self, export_filter=None):
|
def export(self, export_filter=None):
|
||||||
"""Run "task export", return JSON array of exported intervals."""
|
"""Run "timew export", return JSON array of exported intervals."""
|
||||||
if export_filter is None:
|
if export_filter is None:
|
||||||
export_filter = ""
|
export_filter = ""
|
||||||
|
|
||||||
code, out, err = self.runSuccess("{0} export"
|
code, out, err = self.runSuccess("{0} export".format(export_filter))
|
||||||
"".format(export_filter))
|
|
||||||
|
|
||||||
return json.loads(out)
|
return json.loads(out)
|
||||||
|
|
||||||
|
@ -112,8 +111,7 @@ class Timew(object):
|
||||||
|
|
||||||
return args
|
return args
|
||||||
|
|
||||||
def runSuccess(self, args="", input=None, merge_streams=False,
|
def runSuccess(self, args="", input=None, merge_streams=False, timeout=5):
|
||||||
timeout=5):
|
|
||||||
"""Invoke timew with given arguments and fail if exit code != 0
|
"""Invoke timew with given arguments and fail if exit code != 0
|
||||||
|
|
||||||
Use runError if you want exit_code to be tested automatically and
|
Use runError if you want exit_code to be tested automatically and
|
||||||
|
|
381
test/undo.t
381
test/undo.t
|
@ -43,6 +43,387 @@ class TestUndo(TestCase):
|
||||||
"""Executed before each test in the class"""
|
"""Executed before each test in the class"""
|
||||||
self.t = Timew()
|
self.t = Timew()
|
||||||
|
|
||||||
|
def test_undo_cancel(self):
|
||||||
|
"""Test undo of command 'cancel'"""
|
||||||
|
one_hour_before_utc = datetime.now().utcnow() - timedelta(hours=1)
|
||||||
|
|
||||||
|
self.t("start {:%Y%m%dT%H%M%SZ} foo".format(one_hour_before_utc))
|
||||||
|
self.t("cancel")
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 0, msg="Expected 0 interval before, got {}".format(len(j)))
|
||||||
|
|
||||||
|
self.t("undo")
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 1, msg="Expected 1 interval afterwards, got {}".format(len(j)))
|
||||||
|
self.assertOpenInterval(j[0],
|
||||||
|
expectedStart=one_hour_before_utc,
|
||||||
|
expectedTags=["foo"])
|
||||||
|
|
||||||
|
def test_undo_continue(self):
|
||||||
|
"""Test undo of command 'continue'"""
|
||||||
|
now_utc = datetime.now().utcnow()
|
||||||
|
one_hour_before_utc = now_utc - timedelta(hours=1)
|
||||||
|
two_hours_before_utc = now_utc - timedelta(hours=2)
|
||||||
|
|
||||||
|
self.t("track {:%Y%m%dT%H%M%SZ} - {:%Y%m%dT%H%M%SZ} foo".format(two_hours_before_utc, one_hour_before_utc))
|
||||||
|
self.t("continue @1 {:%Y%m%dT%H%M%SZ}".format(now_utc))
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 2, msg="Expected 2 interval before, got {}".format(len(j)))
|
||||||
|
self.assertClosedInterval(j[0],
|
||||||
|
expectedStart=two_hours_before_utc,
|
||||||
|
expectedEnd=one_hour_before_utc,
|
||||||
|
expectedTags=["foo"])
|
||||||
|
self.assertOpenInterval(j[1],
|
||||||
|
expectedStart=now_utc,
|
||||||
|
expectedTags=["foo"])
|
||||||
|
|
||||||
|
self.t("undo")
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 1, msg="Expected 1 interval afterwards, got {}".format(len(j)))
|
||||||
|
self.assertClosedInterval(j[0],
|
||||||
|
expectedStart=two_hours_before_utc,
|
||||||
|
expectedEnd=one_hour_before_utc,
|
||||||
|
expectedTags=["foo"])
|
||||||
|
|
||||||
|
def test_undo_delete(self):
|
||||||
|
"""Test undo of command 'delete'"""
|
||||||
|
now_utc = datetime.now().utcnow()
|
||||||
|
one_hour_before_utc = now_utc - timedelta(hours=1)
|
||||||
|
two_hours_before_utc = now_utc - timedelta(hours=2)
|
||||||
|
|
||||||
|
self.t("track {:%Y%m%dT%H%M%SZ} - {:%Y%m%dT%H%M%SZ} foo".format(two_hours_before_utc, one_hour_before_utc))
|
||||||
|
self.t("delete @1")
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 0, msg="Expected 0 intervals before, got {}".format(len(j)))
|
||||||
|
|
||||||
|
self.t("undo")
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 1, msg="Expected 1 interval afterwards, got {}".format(len(j)))
|
||||||
|
self.assertClosedInterval(j[0],
|
||||||
|
expectedStart=two_hours_before_utc,
|
||||||
|
expectedEnd=one_hour_before_utc,
|
||||||
|
expectedTags=["foo"])
|
||||||
|
|
||||||
|
# def test_undo_fill(self):
|
||||||
|
# """Test undo of command 'fill 'Not yet implemented
|
||||||
|
# self.t("track {:%Y%m%dT%H%M%SZ} - {:%Y%m%dT%H%M%SZ} foo bar")
|
||||||
|
# self.t("untag @1 bar")
|
||||||
|
#
|
||||||
|
# j = self.t.export()
|
||||||
|
# self.assertEqual(len(j), 1, msg="Expected 1 interval before, got {}".format(len(j)))
|
||||||
|
# self.assertClosedInterval(j[0],
|
||||||
|
# expectedStart="20180101T060000",
|
||||||
|
# expectedEnd="20180101T070000",
|
||||||
|
# expectedTags=["foo"])
|
||||||
|
#
|
||||||
|
# self.t("undo")
|
||||||
|
#
|
||||||
|
# j = self.t.export()
|
||||||
|
# self.assertEqual(len(j), 1, msg="Expected 1 interval afterwards, got {}".format(len(j)))
|
||||||
|
# self.assertClosedInterval(j[0],
|
||||||
|
# expectedStart="20180101T060000",
|
||||||
|
# expectedEnd="20180101T070000",
|
||||||
|
# expectedTags=["foo bar"])
|
||||||
|
|
||||||
|
def test_undo_join(self):
|
||||||
|
"""Test undo of command 'join'"""
|
||||||
|
now_utc = datetime.now().utcnow()
|
||||||
|
one_hour_before_utc = now_utc - timedelta(hours=1)
|
||||||
|
two_hours_before_utc = now_utc - timedelta(hours=2)
|
||||||
|
three_hours_before_utc = now_utc - timedelta(hours=3)
|
||||||
|
four_hours_before_utc = now_utc - timedelta(hours=4)
|
||||||
|
|
||||||
|
self.t("track {:%Y%m%dT%H%M%SZ} - {:%Y%m%dT%H%M%SZ} bar".format(four_hours_before_utc, three_hours_before_utc))
|
||||||
|
self.t("track {:%Y%m%dT%H%M%SZ} - {:%Y%m%dT%H%M%SZ} foo".format(two_hours_before_utc, one_hour_before_utc))
|
||||||
|
self.t("join @1 @2")
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 1, msg="Expected 1 interval before, got {}".format(len(j)))
|
||||||
|
self.assertClosedInterval(j[0],
|
||||||
|
expectedStart=four_hours_before_utc,
|
||||||
|
expectedEnd=one_hour_before_utc,
|
||||||
|
expectedTags=["bar"],
|
||||||
|
description="joined interval")
|
||||||
|
|
||||||
|
self.t("undo")
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 2, msg="Expected 2 interval afterwards, got {}".format(len(j)))
|
||||||
|
self.assertClosedInterval(j[0],
|
||||||
|
expectedStart=four_hours_before_utc,
|
||||||
|
expectedEnd=three_hours_before_utc,
|
||||||
|
expectedTags=["bar"],
|
||||||
|
description="first interval")
|
||||||
|
self.assertClosedInterval(j[1],
|
||||||
|
expectedStart=two_hours_before_utc,
|
||||||
|
expectedEnd=one_hour_before_utc,
|
||||||
|
expectedTags=["foo"],
|
||||||
|
description="second interval")
|
||||||
|
|
||||||
|
def test_undo_lengthen(self):
|
||||||
|
"""Test undo of command 'lengthen'"""
|
||||||
|
now_utc = datetime.now().utcnow()
|
||||||
|
one_hour_before_utc = now_utc - timedelta(hours=1)
|
||||||
|
two_hours_before_utc = now_utc - timedelta(hours=2)
|
||||||
|
three_hours_before_utc = now_utc - timedelta(hours=3)
|
||||||
|
|
||||||
|
self.t("track {:%Y%m%dT%H%M%SZ} - {:%Y%m%dT%H%M%SZ} foo".format(three_hours_before_utc, two_hours_before_utc))
|
||||||
|
self.t("lengthen @1 1h")
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 1, msg="Expected 1 interval before, got {}".format(len(j)))
|
||||||
|
self.assertClosedInterval(j[0],
|
||||||
|
expectedStart=three_hours_before_utc,
|
||||||
|
expectedEnd=one_hour_before_utc,
|
||||||
|
expectedTags=["foo"])
|
||||||
|
|
||||||
|
self.t("undo")
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 1, msg="Expected 1 interval afterwards, got {}".format(len(j)))
|
||||||
|
self.assertClosedInterval(j[0],
|
||||||
|
expectedStart=three_hours_before_utc,
|
||||||
|
expectedEnd=two_hours_before_utc,
|
||||||
|
expectedTags=["foo"])
|
||||||
|
|
||||||
|
def test_undo_move(self):
|
||||||
|
"""Test undo of command 'move'"""
|
||||||
|
now_utc = datetime.now().utcnow()
|
||||||
|
one_hour_before_utc = now_utc - timedelta(hours=1)
|
||||||
|
two_hours_before_utc = now_utc - timedelta(hours=2)
|
||||||
|
three_hours_before_utc = now_utc - timedelta(hours=3)
|
||||||
|
|
||||||
|
self.t("track {:%Y%m%dT%H%M%SZ} - {:%Y%m%dT%H%M%SZ} foo".format(two_hours_before_utc, one_hour_before_utc))
|
||||||
|
self.t("move @1 {:%Y%m%dT%H%M%SZ}".format(three_hours_before_utc))
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 1, msg="Expected 1 interval before, got {}".format(len(j)))
|
||||||
|
self.assertClosedInterval(j[0],
|
||||||
|
expectedStart=three_hours_before_utc,
|
||||||
|
expectedEnd=two_hours_before_utc,
|
||||||
|
expectedTags=["foo"])
|
||||||
|
|
||||||
|
self.t("undo")
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 1, msg="Expected 1 interval afterwards, got {}".format(len(j)))
|
||||||
|
self.assertClosedInterval(j[0],
|
||||||
|
expectedStart=two_hours_before_utc,
|
||||||
|
expectedEnd=one_hour_before_utc,
|
||||||
|
expectedTags=["foo"])
|
||||||
|
|
||||||
|
def test_undo_resize(self):
|
||||||
|
"""Test undo of command 'resize'"""
|
||||||
|
now_utc = datetime.now().utcnow()
|
||||||
|
one_hour_before_utc = now_utc - timedelta(hours=1)
|
||||||
|
two_hours_before_utc = now_utc - timedelta(hours=2)
|
||||||
|
three_hours_before_utc = now_utc - timedelta(hours=3)
|
||||||
|
|
||||||
|
self.t("track {:%Y%m%dT%H%M%SZ} - {:%Y%m%dT%H%M%SZ} foo".format(three_hours_before_utc, one_hour_before_utc))
|
||||||
|
self.t("resize @1 1h")
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 1, msg="Expected 1 interval before, got {}".format(len(j)))
|
||||||
|
self.assertClosedInterval(j[0],
|
||||||
|
expectedStart=three_hours_before_utc,
|
||||||
|
expectedEnd=two_hours_before_utc,
|
||||||
|
expectedTags=["foo"])
|
||||||
|
|
||||||
|
self.t("undo")
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 1, msg="Expected 1 interval afterwards, got {}".format(len(j)))
|
||||||
|
self.assertClosedInterval(j[0],
|
||||||
|
expectedStart=three_hours_before_utc,
|
||||||
|
expectedEnd=one_hour_before_utc,
|
||||||
|
expectedTags=["foo"])
|
||||||
|
|
||||||
|
def test_undo_shorten(self):
|
||||||
|
"""Test undo of command 'shorten'"""
|
||||||
|
now_utc = datetime.now().utcnow()
|
||||||
|
one_hour_before_utc = now_utc - timedelta(hours=1)
|
||||||
|
two_hours_before_utc = now_utc - timedelta(hours=2)
|
||||||
|
three_hours_before_utc = now_utc - timedelta(hours=3)
|
||||||
|
|
||||||
|
self.t("track {:%Y%m%dT%H%M%SZ} - {:%Y%m%dT%H%M%SZ} foo".format(three_hours_before_utc, one_hour_before_utc))
|
||||||
|
self.t("shorten @1 1h")
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 1, msg="Expected 1 interval before, got {}".format(len(j)))
|
||||||
|
self.assertClosedInterval(j[0],
|
||||||
|
expectedStart=three_hours_before_utc,
|
||||||
|
expectedEnd=two_hours_before_utc,
|
||||||
|
expectedTags=["foo"])
|
||||||
|
|
||||||
|
self.t("undo")
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 1, msg="Expected 1 interval afterwards, got {}".format(len(j)))
|
||||||
|
self.assertClosedInterval(j[0],
|
||||||
|
expectedStart=three_hours_before_utc,
|
||||||
|
expectedEnd=one_hour_before_utc,
|
||||||
|
expectedTags=["foo"])
|
||||||
|
|
||||||
|
def test_undo_split(self):
|
||||||
|
"""Test undo of command 'split'"""
|
||||||
|
now_utc = datetime.now().utcnow()
|
||||||
|
one_hour_before_utc = now_utc - timedelta(hours=1)
|
||||||
|
two_hours_before_utc = now_utc - timedelta(hours=2)
|
||||||
|
three_hours_before_utc = now_utc - timedelta(hours=3)
|
||||||
|
|
||||||
|
self.t("track {:%Y%m%dT%H%M%SZ} - {:%Y%m%dT%H%M%SZ} foo".format(three_hours_before_utc, one_hour_before_utc))
|
||||||
|
self.t("split @1")
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 2, msg="Expected 2 intervals before, got {}".format(len(j)))
|
||||||
|
self.assertClosedInterval(j[0],
|
||||||
|
expectedStart=three_hours_before_utc,
|
||||||
|
expectedEnd=two_hours_before_utc,
|
||||||
|
expectedTags=["foo"])
|
||||||
|
self.assertClosedInterval(j[1],
|
||||||
|
expectedStart=two_hours_before_utc,
|
||||||
|
expectedEnd=one_hour_before_utc,
|
||||||
|
expectedTags=["foo"])
|
||||||
|
|
||||||
|
self.t("undo")
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 1, msg="Expected 1 interval afterwards, got {}".format(len(j)))
|
||||||
|
self.assertClosedInterval(j[0],
|
||||||
|
expectedStart=three_hours_before_utc,
|
||||||
|
expectedEnd=one_hour_before_utc,
|
||||||
|
expectedTags=["foo"])
|
||||||
|
|
||||||
|
def test_undo_start(self):
|
||||||
|
"""Test undo of command 'start'"""
|
||||||
|
now_utc = datetime.now().utcnow()
|
||||||
|
one_hour_before_utc = now_utc - timedelta(hours=1)
|
||||||
|
two_hours_before_utc = now_utc - timedelta(hours=2)
|
||||||
|
three_hours_before_utc = now_utc - timedelta(hours=3)
|
||||||
|
|
||||||
|
self.t("start {:%Y%m%dT%H%M%SZ} foo".format(one_hour_before_utc))
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 1, msg="Expected 1 interval before, got {}".format(len(j)))
|
||||||
|
self.assertOpenInterval(j[0],
|
||||||
|
expectedStart=one_hour_before_utc,
|
||||||
|
expectedTags=["foo"])
|
||||||
|
|
||||||
|
self.t("undo")
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 0, msg="Expected 1 interval afterwards, got {}".format(len(j)))
|
||||||
|
|
||||||
|
def test_undo_stop(self):
|
||||||
|
"""Test undo of command 'stop'"""
|
||||||
|
now_utc = datetime.now().utcnow()
|
||||||
|
one_hour_before_utc = now_utc - timedelta(hours=1)
|
||||||
|
|
||||||
|
self.t("start {:%Y%m%dT%H%M%SZ} foo".format(one_hour_before_utc))
|
||||||
|
self.t("stop {:%Y%m%dT%H%M%SZ}".format(now_utc))
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 1, msg="Expected 1 interval before, got {}".format(len(j)))
|
||||||
|
self.assertClosedInterval(j[0],
|
||||||
|
expectedStart=one_hour_before_utc,
|
||||||
|
expectedEnd=now_utc,
|
||||||
|
expectedTags=["foo"])
|
||||||
|
|
||||||
|
self.t("undo")
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 1, msg="Expected 1 interval afterwards, got {}".format(len(j)))
|
||||||
|
self.assertOpenInterval(j[0],
|
||||||
|
expectedStart=one_hour_before_utc,
|
||||||
|
expectedTags=["foo"])
|
||||||
|
|
||||||
|
def test_undo_tag(self):
|
||||||
|
"""Test undo of command 'tag'"""
|
||||||
|
now_utc = datetime.now().utcnow()
|
||||||
|
one_hour_before_utc = now_utc - timedelta(hours=1)
|
||||||
|
two_hours_before_utc = now_utc - timedelta(hours=2)
|
||||||
|
|
||||||
|
self.t("track {:%Y%m%dT%H%M%SZ} - {:%Y%m%dT%H%M%SZ} foo".format(two_hours_before_utc, one_hour_before_utc))
|
||||||
|
self.t("tag @1 bar")
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 1, msg="Expected 1 interval before, got {}".format(len(j)))
|
||||||
|
self.assertClosedInterval(j[0],
|
||||||
|
expectedStart=two_hours_before_utc,
|
||||||
|
expectedEnd=one_hour_before_utc,
|
||||||
|
expectedTags=["bar", "foo"])
|
||||||
|
|
||||||
|
self.t("undo")
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 1, msg="Expected 1 interval afterwards, got {}".format(len(j)))
|
||||||
|
self.assertClosedInterval(j[0],
|
||||||
|
expectedStart=two_hours_before_utc,
|
||||||
|
expectedEnd=one_hour_before_utc,
|
||||||
|
expectedTags=["foo"])
|
||||||
|
|
||||||
|
def test_undo_track(self):
|
||||||
|
"""Test undo of command 'track'"""
|
||||||
|
now_utc = datetime.now().utcnow()
|
||||||
|
one_hour_before_utc = now_utc - timedelta(hours=1)
|
||||||
|
two_hours_before_utc = now_utc - timedelta(hours=2)
|
||||||
|
three_hours_before_utc = now_utc - timedelta(hours=3)
|
||||||
|
four_hours_before_utc = now_utc - timedelta(hours=4)
|
||||||
|
|
||||||
|
self.t("track {:%Y%m%dT%H%M%SZ} - {:%Y%m%dT%H%M%SZ} foo".format(four_hours_before_utc, three_hours_before_utc))
|
||||||
|
self.t("track {:%Y%m%dT%H%M%SZ} - {:%Y%m%dT%H%M%SZ} bar".format(two_hours_before_utc, one_hour_before_utc))
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 2, msg="Expected 2 intervals before, got {}".format(len(j)))
|
||||||
|
self.assertClosedInterval(j[0],
|
||||||
|
expectedStart=four_hours_before_utc,
|
||||||
|
expectedEnd=three_hours_before_utc,
|
||||||
|
expectedTags=["foo"])
|
||||||
|
self.assertClosedInterval(j[1],
|
||||||
|
expectedStart=two_hours_before_utc,
|
||||||
|
expectedEnd=one_hour_before_utc,
|
||||||
|
expectedTags=["bar"])
|
||||||
|
|
||||||
|
self.t("undo")
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 1, msg="Expected 1 interval afterwards, got {}".format(len(j)))
|
||||||
|
self.assertClosedInterval(j[0],
|
||||||
|
expectedStart=four_hours_before_utc,
|
||||||
|
expectedEnd=three_hours_before_utc,
|
||||||
|
expectedTags=["foo"])
|
||||||
|
|
||||||
|
def test_undo_untag(self):
|
||||||
|
"""Test undo of command 'untag'"""
|
||||||
|
now_utc = datetime.now().utcnow()
|
||||||
|
one_hour_before_utc = now_utc - timedelta(hours=1)
|
||||||
|
two_hours_before_utc = now_utc - timedelta(hours=2)
|
||||||
|
|
||||||
|
self.t("track {:%Y%m%dT%H%M%SZ} - {:%Y%m%dT%H%M%SZ} foo bar".format(two_hours_before_utc, one_hour_before_utc))
|
||||||
|
self.t("untag @1 bar")
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 1, msg="Expected 1 interval before, got {}".format(len(j)))
|
||||||
|
self.assertClosedInterval(j[0],
|
||||||
|
expectedStart=two_hours_before_utc,
|
||||||
|
expectedEnd=one_hour_before_utc,
|
||||||
|
expectedTags=["foo"])
|
||||||
|
|
||||||
|
self.t("undo")
|
||||||
|
|
||||||
|
j = self.t.export()
|
||||||
|
self.assertEqual(len(j), 1, msg="Expected 1 interval afterwards, got {}".format(len(j)))
|
||||||
|
self.assertClosedInterval(j[0],
|
||||||
|
expectedStart=two_hours_before_utc,
|
||||||
|
expectedEnd=one_hour_before_utc,
|
||||||
|
expectedTags=["bar", "foo"])
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
from simpletap import TAPTestRunner
|
from simpletap import TAPTestRunner
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue