Schedule a demo

Testing Tasks

Mock Tasks connections to test services that work with ToDo lists and tasks.

Note: If you're new to unit testing with Zato, check the tutorial first.

Getting task lists

The service:

from zato.server.service import Service

class GetTaskLists(Service):
    name = 'tasks.lists.get'

    def handle(self):
        conn = self.cloud.ms365.get('ms365.Tasks').conn

        with conn.client() as client:
            todo = client.impl.tasks()
            task_lists = todo.get_folders()

        self.response.payload = {
            'lists': [{'name': tl['name'], 'id': tl['id']} for tl in task_lists]
        }

The test:

from zato_testing import ServiceTestCase
from myapp.services import GetTaskLists

class TestGetTaskLists(ServiceTestCase):

    def test_returns_task_lists(self):

        self.set_response('ms365.Tasks.tasks', {'id': 'tasks-123'})
        self.set_response('ms365.Tasks.tasks.get_folders', [
            {'name': 'Tasks', 'id': 'list-001'},
            {'name': 'Shopping', 'id': 'list-002'},
            {'name': 'Work', 'id': 'list-003'}
        ])

        service = self.invoke(GetTaskLists)

        lists = service.response.payload['lists']
        self.assertEqual(len(lists), 3)
        self.assertEqual(lists[0]['name'], 'Tasks')

Getting tasks

class TestGetTasks(ServiceTestCase):

    def test_returns_tasks_from_default_list(self):

        self.set_response('ms365.Tasks.tasks', {'id': 'tasks-123'})
        self.set_response('ms365.Tasks.tasks.get_default_folder', {'id': 'list-001', 'name': 'Tasks'})
        self.set_response('ms365.Tasks.tasks.get_default_folder.get_tasks', [
            {'title': 'Buy groceries', 'id': 'task-001', 'status': 'notStarted'},
            {'title': 'Call dentist', 'id': 'task-002', 'status': 'inProgress'},
            {'title': 'Pay bills', 'id': 'task-003', 'status': 'completed'}
        ])

        service = self.invoke(GetTasks)

        self.assertEqual(len(service.response.payload['tasks']), 3)
        self.assertEqual(service.response.payload['tasks'][1]['status'], 'inProgress')

    def test_returns_tasks_from_specific_list(self):

        self.set_response('ms365.Tasks.tasks', {'id': 'tasks-123'})
        self.set_response('ms365.Tasks.tasks.get_folder', {'id': 'list-002', 'name': 'Work'})
        self.set_response('ms365.Tasks.tasks.get_folder.get_tasks', [
            {'title': 'Review PR', 'id': 'task-101', 'status': 'notStarted'},
            {'title': 'Write docs', 'id': 'task-102', 'status': 'notStarted'}
        ])

        service = self.invoke(GetTasks, list_id='list-002')

        self.assertEqual(len(service.response.payload['tasks']), 2)

Creating tasks

class TestCreateTask(ServiceTestCase):

    def test_creates_task(self):

        self.set_response('ms365.Tasks.tasks', {'id': 'tasks-123'})
        self.set_response('ms365.Tasks.tasks.get_default_folder', {'id': 'list-001', 'name': 'Tasks'})
        self.set_response('ms365.Tasks.tasks.get_default_folder.new_task', {
            'object_id': 'task-new-001',
            'title': None,
            'due': None
        })
        self.set_response('ms365.Tasks.tasks.get_default_folder.new_task.save', True)

        service = self.invoke(CreateTask,
            title='New Important Task',
            due_date='2024-03-25'
        )

        self.assertEqual(service.response.payload['created'], True)
        self.assertEqual(service.response.payload['task_id'], 'task-new-001')

Completing tasks

class TestCompleteTask(ServiceTestCase):

    def test_completes_task(self):

        self.set_response('ms365.Tasks.tasks', {'id': 'tasks-123'})
        self.set_response('ms365.Tasks.tasks.get_default_folder', {'id': 'list-001', 'name': 'Tasks'})
        self.set_response('ms365.Tasks.tasks.get_default_folder.get_task', {
            'id': 'task-001',
            'title': 'Task to Complete'
        })
        self.set_response('ms365.Tasks.tasks.get_default_folder.get_task.mark_completed', None)
        self.set_response('ms365.Tasks.tasks.get_default_folder.get_task.save', True)

        service = self.invoke(CompleteTask, task_id='task-001')

        self.assertEqual(service.response.payload['completed'], True)

Deleting tasks

class TestDeleteTask(ServiceTestCase):

    def test_deletes_task(self):

        self.set_response('ms365.Tasks.tasks', {'id': 'tasks-123'})
        self.set_response('ms365.Tasks.tasks.get_default_folder', {'id': 'list-001', 'name': 'Tasks'})
        self.set_response('ms365.Tasks.tasks.get_default_folder.get_task', {
            'id': 'task-001',
            'title': 'Task to Delete'
        })
        self.set_response('ms365.Tasks.tasks.get_default_folder.get_task.delete', True)

        service = self.invoke(DeleteTask, task_id='task-001')

        self.assertEqual(service.response.payload['deleted'], True)

Creating task lists

class TestCreateTaskList(ServiceTestCase):

    def test_creates_task_list(self):

        self.set_response('ms365.Tasks.tasks', {'id': 'tasks-123'})
        self.set_response('ms365.Tasks.tasks.new_folder', {
            'id': 'list-new-001',
            'name': 'New List'
        })

        service = self.invoke(CreateTaskList, name='New List')

        self.assertEqual(service.response.payload['created'], True)
        self.assertEqual(service.response.payload['list_id'], 'list-new-001')

See also