# Testing Directory

Directory mocks - users, groups, managers and direct reports.

Mock Directory connections to test services that work with users, groups, and organization data.

**Note:** If you're new to unit testing with Zato, check the [tutorial](https://zato.io/docs/api-testing/tutorial.html) first.

## Getting current user {#getting-current-user}

**The service**:

```python
from zato.server.service import Service

class GetCurrentUser(Service):
    name = 'directory.user.current'

    def handle(self):
        conn = self.microsoft.cloud['ms365.Directory']

        directory = conn.directory()
        user = directory.get_current_user()

        self.response.payload = {
            'display_name': user['display_name'],
            'email': user['mail'],
            'job_title': user['job_title']
        }
```

**The test**:

```python
from zato_testing import ServiceTestCase
from myapp.services import GetCurrentUser

class TestGetCurrentUser(ServiceTestCase):

    def test_returns_current_user(self):

        self.set_response('ms365.Directory.directory', {'id': 'dir-123'})
        self.set_response('ms365.Directory.directory.get_current_user', {
            'display_name': 'John Doe',
            'mail': 'john.doe@example.com',
            'job_title': 'Software Engineer'
        })

        service = self.invoke(GetCurrentUser)

        self.assertEqual(service.response.payload['display_name'], 'John Doe')
        self.assertEqual(service.response.payload['email'], 'john.doe@example.com')
```

## Getting user by email {#getting-user-by-email}

```python
class TestGetUserByEmail(ServiceTestCase):

    def test_returns_user(self):

        self.set_response('ms365.Directory.directory', {'id': 'dir-123'})
        self.set_response('ms365.Directory.directory.get_user', {
            'id': 'user-001',
            'display_name': 'Jane Smith',
            'mail': 'jane.smith@example.com',
            'department': 'Engineering'
        })

        service = self.invoke(GetUserByEmail, email='jane.smith@example.com')

        self.assertEqual(service.response.payload['id'], 'user-001')
        self.assertEqual(service.response.payload['department'], 'Engineering')
```

## Listing users {#listing-users}

```python
class TestGetUsers(ServiceTestCase):

    def test_returns_users(self):

        self.set_response('ms365.Directory.directory', {'id': 'dir-123'})
        self.set_response('ms365.Directory.directory.get_users', [
            {'display_name': 'User One', 'mail': 'user1@example.com'},
            {'display_name': 'User Two', 'mail': 'user2@example.com'},
            {'display_name': 'User Three', 'mail': 'user3@example.com'}
        ])

        service = self.invoke(GetUsers, limit=50)

        self.assertEqual(len(service.response.payload['users']), 3)
```

## Getting user groups {#getting-user-groups}

```python
class TestGetUserGroups(ServiceTestCase):

    def test_returns_groups(self):

        self.set_response('ms365.Directory.directory', {'id': 'dir-123'})
        self.set_response('ms365.Directory.directory.get_user', {
            'id': 'user-001',
            'display_name': 'John Doe'
        })
        self.set_response('ms365.Directory.directory.get_user.get_member_of', [
            {'display_name': 'Engineering', 'id': 'group-001'},
            {'display_name': 'All Employees', 'id': 'group-002'},
            {'display_name': 'Project Alpha', 'id': 'group-003'}
        ])

        service = self.invoke(GetUserGroups, user_id='user-001')

        groups = service.response.payload['groups']
        self.assertEqual(len(groups), 3)
        self.assertEqual(groups[0]['name'], 'Engineering')
```

## Getting user manager {#getting-user-manager}

```python
class TestGetUserManager(ServiceTestCase):

    def test_returns_manager(self):

        self.set_response('ms365.Directory.directory', {'id': 'dir-123'})
        self.set_response('ms365.Directory.directory.get_user', {
            'id': 'user-001',
            'display_name': 'John Doe'
        })
        self.set_response('ms365.Directory.directory.get_user.get_manager', {
            'display_name': 'Sarah Manager',
            'mail': 'sarah.manager@example.com'
        })

        service = self.invoke(GetUserManager, user_id='user-001')

        self.assertEqual(service.response.payload['manager_name'], 'Sarah Manager')
```

## Getting direct reports {#getting-direct-reports}

```python
class TestGetDirectReports(ServiceTestCase):

    def test_returns_direct_reports(self):

        self.set_response('ms365.Directory.directory', {'id': 'dir-123'})
        self.set_response('ms365.Directory.directory.get_user', {
            'id': 'manager-001',
            'display_name': 'Sarah Manager'
        })
        self.set_response('ms365.Directory.directory.get_user.get_direct_reports', [
            {'display_name': 'Report One', 'mail': 'report1@example.com'},
            {'display_name': 'Report Two', 'mail': 'report2@example.com'}
        ])

        service = self.invoke(GetUserDirectReports, user_id='manager-001')

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

## Learn more {#learn-more}

- [API testing](https://zato.io/docs/api-testing/) - Tests in plain English, run against real or mocked connections
- [API testing tutorial](https://zato.io/docs/api-testing/tutorial.html) - A complete test suite, from the first scenario to the report
- [Testing REST connections](https://zato.io/docs/api-testing/rest.html) - Mock outgoing REST calls and assert on what your service sent
- [Testing SQL connections](https://zato.io/docs/api-testing/sql.html) - Mock database queries and the rows they return
- [Testing LDAP connections](https://zato.io/docs/api-testing/ldap.html) - Mock directory lookups and the entries they find
- [Testing Microsoft 365](https://zato.io/docs/api-testing/ms365/) - Mock mailboxes, calendars, SharePoint, Teams and the rest
- [Testing service invocations](https://zato.io/docs/api-testing/services.html) - Services that call other services, with the callees mocked
- [Testing Jira connections](https://zato.io/docs/api-testing/jira.html) - Mock Jira API calls and the issues they return
- [Tests in CI/CD](https://zato.io/docs/api-testing/ci-cd.html) - Running the suite in a pipeline and reading its output
