Status system reworked
This commit is contained in:
1 parent
33567db5a3
commit
a29ba6e4d2
18 files changed
+326
-345
No files matched your search
+87
-129
@@ -115,13 +115,16 @@ class OrderingTests(Base):
|
||||
for account in ("A", "B", "C"):
|
||||
self.db.add_account(account)
|
||||
self.db.add_task("task-" + account, account)
|
||||
self.db.set_account_wait("A", "6pm")
|
||||
self.db.set_account_wait("B", "2pm")
|
||||
self.db.set_account_wait("C", "4pm")
|
||||
self.db.set_task_status("task-A", "wait 6pm")
|
||||
self.db.set_task_status("task-B", "wait 2pm")
|
||||
self.db.set_task_status("task-C", "wait 4pm")
|
||||
self.assertEqual([t.name for t in self.db.tasks()], ["task-B", "task-C", "task-A"])
|
||||
self.at(17) # B and C are over now: Limit reset first, ordered by when they ended
|
||||
self.assertEqual([t.status_label for t in self.db.tasks()], ["Limit reset", "Limit reset", "Wait 18:00"])
|
||||
self.assertEqual([t.name for t in self.db.tasks()], ["task-B", "task-C", "task-A"])
|
||||
self.db.add_account("Z") # any change saves what time did: same order afterwards
|
||||
self.assertEqual([t.name for t in self.db.tasks()], ["task-B", "task-C", "task-A"])
|
||||
self.assertEqual(self.db.task("task-B").stored_status, lls.Status.LIMIT_RESET)
|
||||
|
||||
def test_accounts_most_free_first(self):
|
||||
for account in ("Busy1", "Taken1", "Free1", "Free2", "Busy2"):
|
||||
@@ -150,40 +153,81 @@ class WaitTests(Base):
|
||||
self.db.add_task("a-done", "A", "done")
|
||||
self.db.add_task("b-prompt", "B")
|
||||
|
||||
def test_wait_belongs_to_the_account(self):
|
||||
self.db.set_account_wait("A", "4:30pm")
|
||||
self.assertEqual(self.statuses(), {"a-testing": "Wait 16:30", "a-prompt": "Wait 16:30",
|
||||
def test_only_tasks_set_to_wait_wait(self):
|
||||
self.db.set_task_status("a-prompt", "wait 4:30pm")
|
||||
self.assertEqual(self.statuses(), {"a-testing": "Testing (account-waiting)", "a-prompt": "Wait 16:30",
|
||||
"a-done": "Done", "b-prompt": "Prompt"})
|
||||
self.assertEqual(self.db.task("a-testing").stored_status, lls.Status.TESTING) # kept underneath
|
||||
self.assertEqual(self.db.task("a-testing").until, NOON.replace(hour=16, minute=30).astimezone())
|
||||
account = self.db.account("A")
|
||||
self.assertEqual((account.level, account.wait_state), (lls.Level.BUSY, lls.WaitState.WAITING))
|
||||
self.assertEqual(self.db.task("a-prompt").until, NOON.replace(hour=16, minute=30).astimezone())
|
||||
|
||||
self.at(17) # the wait is over -> Limit reset until cleared
|
||||
self.assertEqual(self.db.task("a-prompt").status, lls.Status.LIMIT_RESET)
|
||||
self.assertEqual(self.db.account("A").wait_state, lls.WaitState.LIMIT_RESET)
|
||||
def test_prompt_and_testing_show_as_they_are_with_a_note(self):
|
||||
self.db.set_account_wait("A", "6pm") # nothing is set to wait
|
||||
testing = self.db.task("a-testing")
|
||||
self.assertEqual((testing.status, testing.status_label, testing.account_waiting),
|
||||
(lls.Status.TESTING, "Testing (account-waiting)", True))
|
||||
prompt = self.db.task("a-prompt")
|
||||
self.assertEqual((prompt.status, prompt.status_label), (lls.Status.PROMPT, "Prompt (account-waiting)"))
|
||||
self.assertEqual(self.db.task("a-done").status_label, "Done") # no note on other statuses
|
||||
self.assertFalse(self.db.task("b-prompt").account_waiting) # another account
|
||||
account = self.db.account("A")
|
||||
self.assertEqual((account.level, account.wait_listed), (lls.Level.BUSY, True))
|
||||
|
||||
self.db.set_task_status("a-testing", "testing") # setting it again changes nothing
|
||||
self.assertEqual(self.db.task("a-testing").status_label, "Testing (account-waiting)")
|
||||
self.assertEqual(self.db.messages, ["Task 'a-testing' set to Testing."])
|
||||
|
||||
def test_the_account_stops_waiting_by_itself_and_waiting_tasks_become_limit_reset(self):
|
||||
self.db.add_task("w1", "A", "wait 4pm")
|
||||
self.db.add_task("w2", "A", "wait") # joins the running wait
|
||||
self.assertEqual(self.db.task("w2").status_label, "Wait 16:00")
|
||||
self.at(17) # the time has passed
|
||||
self.assertEqual(self.statuses()["w1"], "Limit reset")
|
||||
self.assertEqual(self.statuses()["w2"], "Limit reset")
|
||||
self.assertEqual(self.statuses()["a-testing"], "Testing") # no note any more
|
||||
self.assertEqual(self.statuses()["a-prompt"], "Prompt")
|
||||
account = self.db.account("A")
|
||||
self.assertEqual((account.wait_state, account.wait_until), (lls.WaitState.NONE, None))
|
||||
self.assertEqual(account.tasks[:2], ("w1", "w2")) # Limit reset keeps it Busy
|
||||
|
||||
self.db.add_account("Z") # a change saves what time did
|
||||
self.assertEqual(self.db.task("w1").stored_status, lls.Status.LIMIT_RESET)
|
||||
self.db.set_task_status("w1", "testing") # handled: leaves Limit reset
|
||||
self.assertEqual(self.db.task("w1").status_label, "Testing")
|
||||
self.assertEqual(self.db.task("w2").status_label, "Limit reset")
|
||||
|
||||
def test_a_new_wait_leaves_limit_reset_tasks_alone(self):
|
||||
self.db.add_task("w1", "A", "wait 1pm")
|
||||
self.at(14)
|
||||
self.db.add_task("w2", "A", "wait 8pm") # the account hit its limit again
|
||||
self.assertEqual(self.statuses()["w1"], "Limit reset")
|
||||
self.assertEqual(self.statuses()["w2"], "Wait 20:00")
|
||||
self.assertEqual(self.db.account("A").wait_state, lls.WaitState.WAITING)
|
||||
|
||||
def test_unwait_ends_the_wait_now(self):
|
||||
self.db.add_task("w1", "A", "wait 6pm")
|
||||
self.assertTrue(self.db.clear_account_wait("A"))
|
||||
self.assertFalse(self.db.clear_account_wait("A"))
|
||||
self.assertEqual(self.db.task("a-testing").status, lls.Status.TESTING)
|
||||
self.assertEqual(self.db.task("a-prompt").status, lls.Status.PROMPT)
|
||||
self.assertIn("1 task now Limit reset", self.db.messages[0])
|
||||
self.assertEqual(self.statuses()["w1"], "Limit reset")
|
||||
self.assertEqual(self.db.account("A").wait_state, lls.WaitState.NONE)
|
||||
self.assertEqual(self.db.task("a-testing").status_label, "Testing")
|
||||
self.assertFalse(self.db.clear_account_wait("A")) # it was not waiting any more
|
||||
|
||||
def test_changing_the_account_wait_moves_waiting_tasks(self):
|
||||
self.db.add_task("w1", "A", "wait 4pm")
|
||||
self.db.set_account_wait("A", "7pm")
|
||||
self.assertEqual(self.statuses()["w1"], "Wait 19:00")
|
||||
|
||||
def test_time_in_the_past_means_tomorrow(self):
|
||||
self.db.set_account_wait("A", "9am") # it is noon
|
||||
self.db.set_account_wait("A", "9am") # it is noon
|
||||
until = self.db.account("A").wait_until
|
||||
self.assertEqual((until.day, until.hour), (16, 9))
|
||||
self.assertEqual(self.db.account("A").wait_state, lls.WaitState.WAITING)
|
||||
|
||||
def test_set_wait_with_datetime_and_seconds(self):
|
||||
self.db.set_account_wait("A", NOON.replace(hour=15))
|
||||
self.assertEqual(self.db.task("a-prompt").status_label, "Wait 15:00")
|
||||
self.assertEqual(self.db.account("A").wait_until, NOON.replace(hour=15).astimezone())
|
||||
self.db.set_account_wait("A", int(NOON.replace(hour=20).timestamp()))
|
||||
self.assertEqual(self.db.task("a-prompt").status_label, "Wait 20:00")
|
||||
|
||||
def test_task_wait_sets_the_account_wait(self):
|
||||
self.db.set_task_status("b-prompt", "wait 3pm")
|
||||
self.assertEqual(self.db.account("B").wait_state, lls.WaitState.WAITING)
|
||||
self.assertEqual(self.db.task("b-prompt").status_label, "Wait 15:00")
|
||||
self.assertEqual(self.db.account("A").wait_until, NOON.replace(hour=20).astimezone())
|
||||
|
||||
def test_wait_without_time_only_while_account_is_waiting(self):
|
||||
with self.assertRaises(lls.InvalidArgument):
|
||||
@@ -194,122 +238,36 @@ class WaitTests(Base):
|
||||
with self.assertRaises(lls.InvalidArgument):
|
||||
self.db.set_task_status("loose", "wait")
|
||||
self.db.set_account_wait("B", "4pm")
|
||||
self.db.add_task("follower", "B", "wait") # fine now
|
||||
self.db.add_task("follower", "B", "wait") # fine now
|
||||
self.assertEqual(self.db.task("follower").status_label, "Wait 16:00")
|
||||
self.at(17) # over: a time is required again
|
||||
self.db.set_task_status("b-prompt", "wait")
|
||||
self.assertEqual(self.db.task("b-prompt").status_label, "Wait 16:00")
|
||||
self.at(17) # over: a time is required again
|
||||
with self.assertRaises(lls.InvalidArgument):
|
||||
self.db.set_task_status("b-prompt", "wait")
|
||||
self.db.add_task("late", "B", "wait")
|
||||
|
||||
def test_explicit_testing_or_prompt_clears_a_finished_wait(self):
|
||||
self.db.set_account_wait("A", "1pm")
|
||||
self.at(14)
|
||||
self.assertEqual(self.db.task("a-prompt").status, lls.Status.LIMIT_RESET)
|
||||
self.db.add_task("implicit", "A") # no status given: nothing cleared
|
||||
self.assertEqual(self.db.account("A").wait_state, lls.WaitState.LIMIT_RESET)
|
||||
self.db.set_task_status("a-testing", "uploading") # not an "in use" status
|
||||
self.assertEqual(self.db.account("A").wait_state, lls.WaitState.LIMIT_RESET)
|
||||
self.db.add_task("resumed", "A", "testing") # explicit: the account is in use again
|
||||
self.assertTrue(any("back in use" in m for m in self.db.messages))
|
||||
self.assertEqual(self.db.account("A").wait_state, lls.WaitState.NONE) # (queries keep the messages)
|
||||
self.assertEqual(self.db.task("resumed").status, lls.Status.TESTING)
|
||||
self.assertEqual(self.db.task("a-prompt").status, lls.Status.PROMPT)
|
||||
self.assertTrue(any("back in use" in m for m in self.db.messages))
|
||||
def test_a_task_without_an_account_keeps_its_own_wait(self):
|
||||
self.db.add_task("loose", None, "wait 4pm")
|
||||
self.assertEqual(self.db.task("loose").status_label, "Wait 16:00")
|
||||
self.at(17)
|
||||
self.assertEqual(self.db.task("loose").status_label, "Limit reset")
|
||||
|
||||
def test_explicit_testing_or_prompt_shows_that_status_while_waiting(self):
|
||||
self.db.set_account_wait("A", "6pm")
|
||||
self.db.set_task_status("a-testing", "testing") # explicit
|
||||
task = self.db.task("a-testing")
|
||||
self.assertEqual((task.status, task.status_label, task.overrides_wait), (lls.Status.TESTING, "Testing", True))
|
||||
self.assertTrue(any("ignores it" in m for m in self.db.messages))
|
||||
|
||||
self.db.set_task_status("a-prompt", "prompt")
|
||||
self.assertEqual(self.db.task("a-prompt").status_label, "Prompt")
|
||||
self.db.add_task("n1", "A", "testing")
|
||||
self.assertEqual(self.db.task("n1").status, lls.Status.TESTING)
|
||||
self.db.add_task("n2", "A") # no status given: follows the wait
|
||||
self.assertEqual(self.db.task("n2").status, lls.Status.WAIT)
|
||||
self.assertFalse(self.db.task("n2").overrides_wait)
|
||||
|
||||
# the account itself is still waiting, nothing was cleared
|
||||
self.assertEqual(self.db.account("A").wait_state, lls.WaitState.WAITING)
|
||||
|
||||
def test_other_tasks_keep_waiting_and_wait_makes_a_task_follow_again(self):
|
||||
self.db.set_account_wait("A", "6pm")
|
||||
self.db.add_task("a-other", "A")
|
||||
self.db.set_task_status("a-testing", "testing")
|
||||
self.assertEqual(self.db.task("a-other").status, lls.Status.WAIT)
|
||||
self.assertEqual(self.db.task("a-prompt").status, lls.Status.WAIT)
|
||||
|
||||
self.db.set_task_status("a-testing", "wait") # no time: follow the running wait again
|
||||
task = self.db.task("a-testing")
|
||||
self.assertEqual((task.status, task.overrides_wait), (lls.Status.WAIT, False))
|
||||
self.assertIn("now follows account 'A'", self.db.messages[0])
|
||||
|
||||
def test_a_new_wait_applies_to_every_task_again(self):
|
||||
self.db.set_account_wait("A", "6pm")
|
||||
self.db.set_task_status("a-testing", "testing")
|
||||
self.db.set_account_wait("A", "7pm") # the account hit its limit again
|
||||
task = self.db.task("a-testing")
|
||||
self.assertEqual((task.status_label, task.overrides_wait), ("Wait 19:00", False))
|
||||
|
||||
def test_unwait_clears_the_overrides_too(self):
|
||||
self.db.set_account_wait("A", "6pm")
|
||||
self.db.set_task_status("a-testing", "testing")
|
||||
self.assertTrue(self.db.clear_account_wait("A"))
|
||||
self.assertFalse(self.db.task("a-testing").overrides_wait)
|
||||
self.db.set_account_wait("A", "8pm")
|
||||
self.assertEqual(self.db.task("a-testing").status_label, "Wait 20:00")
|
||||
|
||||
def test_an_override_survives_the_wait_ending(self):
|
||||
self.db.set_account_wait("A", "1pm")
|
||||
self.at(12, 30)
|
||||
self.db.set_task_status("a-testing", "testing") # pinned while the wait runs
|
||||
self.at(14) # the wait is over
|
||||
self.assertEqual(self.db.task("a-testing").status, lls.Status.TESTING)
|
||||
self.assertEqual(self.db.task("a-prompt").status, lls.Status.LIMIT_RESET)
|
||||
self.assertEqual(self.db.account("A").wait_state, lls.WaitState.LIMIT_RESET)
|
||||
# resuming another task after the reset clears the finished wait for everyone
|
||||
self.db.set_task_status("a-prompt", "prompt")
|
||||
self.assertEqual(self.db.account("A").wait_state, lls.WaitState.NONE)
|
||||
self.assertEqual(self.db.task("a-testing").status, lls.Status.TESTING)
|
||||
self.assertEqual(self.db.task("a-prompt").status, lls.Status.PROMPT)
|
||||
|
||||
def test_the_override_ends_when_the_status_changes_or_the_task_moves(self):
|
||||
self.db.set_account_wait("A", "6pm")
|
||||
self.db.set_task_status("a-testing", "testing")
|
||||
self.db.set_task_status("a-testing", "uploading")
|
||||
self.assertFalse(self.db.task("a-testing").overrides_wait)
|
||||
self.db.set_task_status("a-testing", "testing")
|
||||
self.assertTrue(self.db.task("a-testing").overrides_wait)
|
||||
self.db.set_task_account("a-testing", "B") # B is not waiting
|
||||
task = self.db.task("a-testing")
|
||||
self.assertEqual((task.account, task.status, task.overrides_wait), ("B", lls.Status.TESTING, False))
|
||||
|
||||
def test_a_wait_no_task_shows_when_every_task_ignores_it(self):
|
||||
self.db.set_account_wait("A", "6pm")
|
||||
self.db.set_task_status("a-testing", "testing")
|
||||
self.db.set_task_status("a-prompt", "prompt") # a-done is Done
|
||||
def test_deleting_the_waiting_tasks_keeps_the_account_waiting(self):
|
||||
self.db.add_task("w1", "A", "wait 4pm")
|
||||
self.db.delete_task("w1")
|
||||
account = self.db.account("A")
|
||||
self.assertEqual((account.level, account.wait_state, account.wait_listed),
|
||||
(lls.Level.BUSY, lls.WaitState.WAITING, True))
|
||||
self.assertEqual(self.db.task("a-prompt").status_label, "Prompt (account-waiting)")
|
||||
|
||||
def test_overrides_are_saved(self):
|
||||
self.db.set_account_wait("A", "6pm")
|
||||
self.db.set_task_status("a-testing", "testing")
|
||||
self.db.save()
|
||||
with lls.Database(self.path) as other:
|
||||
other.set_clock(NOON)
|
||||
self.assertTrue(other.task("a-testing").overrides_wait)
|
||||
self.assertEqual(other.task("a-prompt").status, lls.Status.WAIT)
|
||||
|
||||
def test_account_wait_nothing_shows(self):
|
||||
def test_account_wait_with_no_waiting_tasks(self):
|
||||
self.db.add_account("Empty")
|
||||
self.db.set_account_wait("Empty", "5pm")
|
||||
account = self.db.account("Empty")
|
||||
self.assertEqual((account.level, account.wait_listed, account.tasks), (lls.Level.BUSY, True, ()))
|
||||
self.db.add_task("only-done", "Empty", "done")
|
||||
self.assertTrue(self.db.account("Empty").wait_listed)
|
||||
self.assertEqual(self.db.account("Empty").tasks, ())
|
||||
self.at(18) # over: nothing left to show
|
||||
account = self.db.account("Empty")
|
||||
self.assertEqual((account.level, account.wait_state), (lls.Level.FREE, lls.WaitState.NONE))
|
||||
|
||||
def test_messages(self):
|
||||
self.db.set_account_wait("A", "4:30pm")
|
||||
@@ -317,7 +275,7 @@ class WaitTests(Base):
|
||||
self.assertIn("waits until 16:30", self.db.messages[0])
|
||||
with self.assertRaises(lls.NotFound):
|
||||
self.db.delete_task("zzz")
|
||||
self.assertEqual(self.db.messages, []) # a failed call leaves no notes
|
||||
self.assertEqual(self.db.messages, []) # a failed call leaves no notes
|
||||
|
||||
|
||||
class NotesAndPersistenceTests(Base):
|
||||
@@ -338,7 +296,7 @@ class NotesAndPersistenceTests(Base):
|
||||
self.db.add_account("A")
|
||||
self.db.add_task("t", "A", "testing")
|
||||
self.db.set_task_notes("t", "one\ntwo")
|
||||
self.db.set_account_wait("A", "11pm")
|
||||
self.db.set_task_status("t", "wait 11pm")
|
||||
self.assertTrue(self.db.dirty)
|
||||
self.db.save()
|
||||
self.assertFalse(self.db.dirty)
|
||||
|
||||
Reference in new issue
Block a user