Mock SharePoint connections to test services that work with SharePoint sites, lists, and items.
Note: If you're new to unit testing with Zato, check the tutorial first.
The service:
from zato.server.service import Service
class GetSuppliers(Service):
name = 'sharepoint.suppliers.get'
def handle(self):
conn = self.cloud.ms365.get('ms365.Sharepoint').conn
with conn.client() as client:
site = client.impl.sharepoint().get_site('sites/procurement')
sp_list = site.get_list_by_name('Suppliers')
items = sp_list.get_items()
self.response.payload = {
'suppliers': [{'name': item['Title'], 'status': item['Status']} for item in items]
}
The test:
from zato_testing import ServiceTestCase
from myapp.services import GetSuppliers
class TestGetSuppliers(ServiceTestCase):
def test_returns_suppliers(self):
# Configure responses for the method chain
self.set_response('ms365.Sharepoint.sharepoint.get_site', {'id': 'site-123'})
self.set_response('ms365.Sharepoint.sharepoint.get_site.get_list_by_name', {'id': 'list-456'})
self.set_response('ms365.Sharepoint.sharepoint.get_site.get_list_by_name.get_items', [
{'Title': 'Acme Corp', 'Status': 'Active'},
{'Title': 'Global Inc', 'Status': 'Active'},
{'Title': 'Local Ltd', 'Status': 'Inactive'}
])
service = self.invoke(GetSuppliers)
suppliers = service.response.payload['suppliers']
self.assertEqual(len(suppliers), 3)
self.assertEqual(suppliers[0]['name'], 'Acme Corp')
The service:
class CreateSupplier(Service):
name = 'sharepoint.supplier.create'
input = 'name', 'status'
def handle(self):
conn = self.cloud.ms365.get('ms365.Sharepoint').conn
with conn.client() as client:
site = client.impl.sharepoint().get_site('sites/procurement')
sp_list = site.get_list_by_name('Suppliers')
result = sp_list.create_list_item({
'Title': self.request.input.name,
'Status': self.request.input.status
})
self.response.payload = {'id': result['id'], 'created': True}
The test:
class TestCreateSupplier(ServiceTestCase):
def test_creates_supplier(self):
self.set_response('ms365.Sharepoint.sharepoint.get_site', {'id': 'site-123'})
self.set_response('ms365.Sharepoint.sharepoint.get_site.get_list_by_name', {'id': 'list-456'})
self.set_response(
'ms365.Sharepoint.sharepoint.get_site.get_list_by_name.create_list_item',
response={'id': 'item-789'},
request={'Title': 'New Supplier', 'Status': 'Active'}
)
service = self.invoke(CreateSupplier, name='New Supplier', status='Active')
self.assertEqual(service.response.payload['id'], 'item-789')
self.assertEqual(service.response.payload['created'], True)
The service:
class UpdateSupplier(Service):
name = 'sharepoint.supplier.update'
input = 'item_id', 'status'
def handle(self):
conn = self.cloud.ms365.get('ms365.Sharepoint').conn
with conn.client() as client:
site = client.impl.sharepoint().get_site('sites/procurement')
sp_list = site.get_list_by_name('Suppliers')
item = sp_list.get_item_by_id(self.request.input.item_id)
item.update_fields({'Status': self.request.input.status})
result = item.save_updates()
self.response.payload = {'updated': result}
The test:
class TestUpdateSupplier(ServiceTestCase):
def test_updates_supplier(self):
self.set_response('ms365.Sharepoint.sharepoint.get_site', {'id': 'site-123'})
self.set_response('ms365.Sharepoint.sharepoint.get_site.get_list_by_name', {'id': 'list-456'})
self.set_response('ms365.Sharepoint.sharepoint.get_site.get_list_by_name.get_item_by_id', {
'id': 'item-789',
'Title': 'Acme Corp'
})
self.set_response('ms365.Sharepoint.sharepoint.get_site.get_list_by_name.get_item_by_id.update_fields', None)
self.set_response('ms365.Sharepoint.sharepoint.get_site.get_list_by_name.get_item_by_id.save_updates', True)
service = self.invoke(UpdateSupplier, item_id='item-789', status='Inactive')
self.assertEqual(service.response.payload['updated'], True)
class TestGetColumns(ServiceTestCase):
def test_returns_columns(self):
self.set_response('ms365.Sharepoint.sharepoint.get_site', {'id': 'site-123'})
self.set_response('ms365.Sharepoint.sharepoint.get_site.get_list_by_name', {'id': 'list-456'})
self.set_response('ms365.Sharepoint.sharepoint.get_site.get_list_by_name.get_list_columns', [
{'name': 'Title', 'type': 'text'},
{'name': 'Status', 'type': 'choice'},
{'name': 'Amount', 'type': 'number'}
])
service = self.invoke(GetListColumns)
self.assertEqual(len(service.response.payload['columns']), 3)
class TestGetSubsites(ServiceTestCase):
def test_returns_subsites(self):
self.set_response('ms365.Sharepoint.sharepoint.get_site', {'id': 'site-123'})
self.set_response('ms365.Sharepoint.sharepoint.get_site.get_subsites', [
{'name': 'Subsite A', 'url': 'sites/main/subsite-a'},
{'name': 'Subsite B', 'url': 'sites/main/subsite-b'}
])
service = self.invoke(GetSubsites)
self.assertEqual(len(service.response.payload['subsites']), 2)