Mock Planner connections to test services that work with plans, tasks, and buckets.
Note: If you're new to unit testing with Zato, check the tutorial first.
The service:
from zato.server.service import Service
class GetMyPlans(Service):
name = 'planner.plans.get'
def handle(self):
conn = self.cloud.ms365.get('ms365.Planner').conn
with conn.client() as client:
planner = client.impl.planner()
plans = planner.list_my_plans()
self.response.payload = {
'plans': [{'title': p['title'], 'id': p['id']} for p in plans]
}
The test:
from zato_testing import ServiceTestCase
from myapp.services import GetMyPlans
class TestGetMyPlans(ServiceTestCase):
def test_returns_plans(self):
self.set_response('ms365.Planner.planner', {'id': 'planner-123'})
self.set_response('ms365.Planner.planner.list_my_plans', [
{'title': 'Q1 Goals', 'id': 'plan-001'},
{'title': 'Product Launch', 'id': 'plan-002'},
{'title': 'Team Building', 'id': 'plan-003'}
])
service = self.invoke(GetMyPlans)
plans = service.response.payload['plans']
self.assertEqual(len(plans), 3)
self.assertEqual(plans[0]['title'], 'Q1 Goals')
class TestGetPlanTasks(ServiceTestCase):
def test_returns_tasks(self):
self.set_response('ms365.Planner.planner', {'id': 'planner-123'})
self.set_response('ms365.Planner.planner.get_plan', {'id': 'plan-001', 'title': 'Q1 Goals'})
self.set_response('ms365.Planner.planner.get_plan.list_tasks', [
{'title': 'Review budget', 'id': 'task-001', 'percent_complete': 100},
{'title': 'Hire new developer', 'id': 'task-002', 'percent_complete': 50},
{'title': 'Launch feature X', 'id': 'task-003', 'percent_complete': 0}
])
service = self.invoke(GetPlanTasks, plan_id='plan-001')
self.assertEqual(len(service.response.payload['tasks']), 3)
self.assertEqual(service.response.payload['tasks'][1]['percent_complete'], 50)
class TestCreateTask(ServiceTestCase):
def test_creates_task(self):
self.set_response('ms365.Planner.planner', {'id': 'planner-123'})
self.set_response('ms365.Planner.planner.get_plan', {'id': 'plan-001', 'title': 'Q1 Goals'})
self.set_response('ms365.Planner.planner.get_plan.create_task', {
'id': 'task-new-001',
'title': 'New Task'
})
service = self.invoke(CreatePlanTask,
plan_id='plan-001',
bucket_id='bucket-001',
title='New Task'
)
self.assertEqual(service.response.payload['created'], True)
self.assertEqual(service.response.payload['task_id'], 'task-new-001')
class TestGetPlanBuckets(ServiceTestCase):
def test_returns_buckets(self):
self.set_response('ms365.Planner.planner', {'id': 'planner-123'})
self.set_response('ms365.Planner.planner.get_plan', {'id': 'plan-001', 'title': 'Q1 Goals'})
self.set_response('ms365.Planner.planner.get_plan.list_buckets', [
{'name': 'To Do', 'id': 'bucket-001'},
{'name': 'In Progress', 'id': 'bucket-002'},
{'name': 'Done', 'id': 'bucket-003'}
])
service = self.invoke(GetPlanBuckets, plan_id='plan-001')
self.assertEqual(len(service.response.payload['buckets']), 3)
self.assertEqual(service.response.payload['buckets'][1]['name'], 'In Progress')
class TestUpdateTask(ServiceTestCase):
def test_updates_task(self):
self.set_response('ms365.Planner.planner', {'id': 'planner-123'})
self.set_response('ms365.Planner.planner.get_task', {
'id': 'task-001',
'title': 'Old Title',
'percent_complete': 0
})
self.set_response('ms365.Planner.planner.get_task.update', True)
service = self.invoke(UpdateTask,
task_id='task-001',
updates={'percent_complete': 100, 'title': 'Completed Task'}
)
self.assertEqual(service.response.payload['updated'], True)
class TestAssignTask(ServiceTestCase):
def test_assigns_task(self):
self.set_response('ms365.Planner.planner', {'id': 'planner-123'})
self.set_response('ms365.Planner.planner.get_task', {
'id': 'task-001',
'title': 'Task to Assign'
})
self.set_response('ms365.Planner.planner.get_task.assign', True)
service = self.invoke(AssignTask, task_id='task-001', user_id='user-001')
self.assertEqual(service.response.payload['assigned'], True)