# coding=utf-8 import time from datetime import datetime from tests import fixtures from tsgrain_controller import task_queue, util, models def test_task(): task = models.Task(models.Source.MANUAL, 1, 10) assert task.serialize() == { 'source': 'MANUAL', 'zone_id': 1, 'duration': 10, 'remaining': 10 } assert task.serialize_rpc() == { 'source': 'MANUAL', 'zone_id': 1, 'duration': 10, 'datetime_started': None, 'datetime_finished': None } def test_task_started(mocker): mocker.patch('tsgrain_controller.util.datetime_now', return_value=datetime(2022, 1, 10, 6, 0)) task = models.Task(models.Source.MANUAL, 1, 10) task.start() assert task.serialize() == { 'source': 'MANUAL', 'zone_id': 1, 'duration': 10, 'remaining': 10 } assert task.serialize_rpc() == { 'source': 'MANUAL', 'zone_id': 1, 'duration': 10, 'datetime_started': datetime(2022, 1, 10, 6, 0), 'datetime_finished': datetime(2022, 1, 10, 6, 0, 10) } def test_add_tasks(): app = fixtures.TestingApp() q = task_queue.TaskQueue(app) task1 = models.Task(models.Source.MANUAL, 1, 10) task1b = models.Task(models.Source.SCHEDULE, 1, 5) task1c = models.Task(models.Source.MANUAL, 1, 5) assert q.enqueue(task1) assert q.enqueue(task1b) assert not q.enqueue(task1c) def test_queue_runner(): app = fixtures.TestingApp() q = task_queue.TaskQueue(app) task1 = models.Task(models.Source.MANUAL, 1, 1) task2 = models.Task(models.Source.MANUAL, 2, 5) task3 = models.Task(models.Source.SCHEDULE, 2, 10) assert q.enqueue(task1) assert q.enqueue(task2) assert q.enqueue(task3) q.start() time.sleep(0.9) q.stop() assert util.to_json(q) == \ '[{"source": "MANUAL", "zone_id": 2, "duration": 5, "remaining": 4}, \ {"source": "SCHEDULE", "zone_id": 2, "duration": 10, "remaining": 10}]'