Repository: seratch/python-slack-scim

Issue:
read_group does not return members id and display name
Hi,

I was trying to use the library for read_group method however the response object does not contain member object attributes.
All seem to be none.

```
client = slack_scim.SCIMClient(xoxp-XXXXXXXXXX)
response = client.read_group('XXXXXXXXX')
```
```
response.__dict__
{'display_name': 'LDAP_slack-xxxxxxxx', 'id': 'XXXXXXXXX', 'members': [<slack_scim.v1.group.Member object at 0x1065b7730>, <slack_scim.v1.group.Member object at 0x1065b7670>, <slack_scim.v1.group.Member object at 0x1065b76a0>, <slack_scim.v1.group.Member object at 0x1065b7850>, <slack_scim.v1.group.Member object at 0x1065b77c0>, <slack_scim.v1.group.Member object at 0x1065b7820>, <slack_scim.v1.group.Member object at 0x1065b77f0>, <slack_scim.v1.group.Member object at 0x1065b78b0>, <slack_scim.v1.group.Member object at 0x1065b78e0>, <slack_scim.v1.group.Member object at 0x1065b7940>, <slack_scim.v1.group.Member object at 0x1065b7970>, <slack_scim.v1.group.Member object at 0x1065b7910>], 'meta': <slack_scim.v1.group.Meta object at 0x106594fd0>, 'schemas': ['urn:scim:schemas:core:1.0']}
```

```
res.members[0].__dict__
{'active': None, 'display_name': None, 'external_id': None, 'id': None, 'locale': None, 'meta': None, 'name': None, 'nick_name': None, 'password': None, 'preferred_language': None, 'profile_url': None, 'schemas': None, 'timezone': None, 'title': None, 'urn_scim_schemas_extension_enterprise_10': None, 'user_name': None, 'user_type': None}
```


The expected behaviour is that member's id and display_name should be populated as it was received in the response.

```
DEBUG:slack_scim.v1.client:*** SCIM API Response ***
GET https://api.slack.com/scim/v1/Groups/XXXXXX
200 OK
date: Thu, 30 Jul 2020 09:57:07 GMT
server: Apache
strict-transport-security: max-age=31536000; includeSubDomains; preload
referrer-policy: no-referrer
x-slack-backend: r
vary: Accept-Encoding
x-xss-protection: 0
x-frame-options: SAMEORIGIN
connection: close
transfer-encoding: chunked
content-type: application/json; charset=utf-8

{"schemas":["urn:scim:schemas:core:1.0"],"id":"XXXXXXX","displayName":"xxxxxxxx","members":[{"value":"XXXXX","display":"Michael Jackson"}],"meta":{"created":"2019-03-18T09:05:06-07:00","location":"https:\/\/api.slack.com\/scim\/v1\/Groups\/XXXXXX"}}
```

Discussion:

Patch:
diff --git a/json-schema/v1/Group.json b/json-schema/v1/Group.json
index cffaefc..41619b3 100644
--- a/json-schema/v1/Group.json
+++ b/json-schema/v1/Group.json
@@ -41,79 +41,16 @@
       "type": "object",
       "additionalProperties": false,
       "properties": {
-        "schemas": {
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "id": {
-          "type": "string"
-        },
-        "externalId": {
-          "type": "string"
-        },
-        "meta": {
-          "$ref": "#/definitions/Meta"
-        },
-        "userName": {
-          "type": "string"
-        },
-        "nickName": {
-          "type": "string"
-        },
-        "name": {
-          "$ref": "#/definitions/Name"
-        },
-        "displayName": {
+        "value": {
           "type": "string"
         },
-        "profileUrl": {
+        "display": {
           "type": "string"
-        },
-        "userType": {
-          "type": "string"
-        },
-        "title": {
-          "type": "string"
-        },
-        "preferredLanguage": {
-          "type": "string"
-        },
-        "locale": {
-          "type": "string"
-        },
-        "timezone": {
-          "type": "string"
-        },
-        "active": {
-          "type": "boolean"
-        },
-        "password": {
-          "type": "string"
-        },
-        "urn:scim:schemas:extension:enterprise:1.0": {
-          "$ref": "#/definitions/UrnScimSchemasExtensionEnterprise1.0"
         }
       },
       "required": [
-        "active",
-        "displayName",
-        "externalId",
-        "id",
-        "locale",
-        "meta",
-        "name",
-        "nickName",
-        "password",
-        "preferredLanguage",
-        "profileUrl",
-        "schemas",
-        "timezone",
-        "title",
-        "urn:scim:schemas:extension:enterprise:1.0",
-        "userName",
-        "userType"
+        "display",
+        "value"
       ],
       "title": "Member"
     },
@@ -126,6 +63,7 @@
         },
         "location": {
           "type": "string",
+          "format": "uri",
           "qt-uri-protocols": [
             "https"
           ]
@@ -136,73 +74,6 @@
         "location"
       ],
       "title": "Meta"
-    },
-    "Name": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "givenName": {
-          "type": "string"
-        },
-        "familyName": {
-          "type": "string"
-        },
-        "honorificPrefix": {
-          "type": "string"
-        }
-      },
-      "required": [
-        "familyName",
-        "givenName",
-        "honorificPrefix"
-      ],
-      "title": "Name"
-    },
-    "UrnScimSchemasExtensionEnterprise1.0": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "employeeNumber": {
-          "type": "string"
-        },
-        "costCenter": {
-          "type": "string"
-        },
-        "organization": {
-          "type": "string"
-        },
-        "division": {
-          "type": "string"
-        },
-        "department": {
-          "type": "string"
-        },
-        "manager": {
-          "$ref": "#/definitions/Manager"
-        }
-      },
-      "required": [
-        "costCenter",
-        "department",
-        "division",
-        "employeeNumber",
-        "manager",
-        "organization"
-      ],
-      "title": "UrnScimSchemasExtensionEnterprise1.0"
-    },
-    "Manager": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "managerId": {
-          "type": "string"
-        }
-      },
-      "required": [
-        "managerId"
-      ],
-      "title": "Manager"
     }
   }
 }
diff --git a/json-schema/v1/Groups.json b/json-schema/v1/Groups.json
index de64b64..48a6f01 100644
--- a/json-schema/v1/Groups.json
+++ b/json-schema/v1/Groups.json
@@ -6,27 +6,6 @@
       "type": "object",
       "additionalProperties": false,
       "properties": {
-        "schemas": {
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "id": {
-          "type": "string"
-        },
-        "displayName": {
-          "type": "string"
-        },
-        "members": {
-          "type": "array",
-          "items": {
-            "$ref": "#/definitions/GroupsMember"
-          }
-        },
-        "meta": {
-          "$ref": "#/definitions/Meta"
-        },
         "totalResults": {
           "type": "integer"
         },
@@ -36,26 +15,49 @@
         "startIndex": {
           "type": "integer"
         },
+        "schemas": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
         "Resources": {
           "type": "array",
           "items": {
             "$ref": "#/definitions/Resource"
           }
+        },
+        "Errors": {
+          "$ref": "#/definitions/Errors"
         }
       },
       "required": [
+        "Errors",
         "Resources",
-        "displayName",
-        "id",
         "itemsPerPage",
-        "members",
-        "meta",
         "schemas",
         "startIndex",
         "totalResults"
       ],
       "title": "Groups"
     },
+    "Errors": {
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "description": {
+          "type": "string"
+        },
+        "code": {
+          "type": "integer"
+        }
+      },
+      "required": [
+        "code",
+        "description"
+      ],
+      "title": "Errors"
+    },
     "Resource": {
       "type": "object",
       "additionalProperties": false,
@@ -75,7 +77,7 @@
         "members": {
           "type": "array",
           "items": {
-            "$ref": "#/definitions/ResourceMember"
+            "$ref": "#/definitions/Member"
           }
         },
         "meta": {
@@ -91,85 +93,22 @@
       ],
       "title": "Resource"
     },
-    "ResourceMember": {
+    "Member": {
       "type": "object",
       "additionalProperties": false,
       "properties": {
-        "schemas": {
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "id": {
-          "type": "string"
-        },
-        "externalId": {
-          "type": "string"
-        },
-        "meta": {
-          "$ref": "#/definitions/Meta"
-        },
-        "userName": {
-          "type": "string"
-        },
-        "nickName": {
-          "type": "string"
-        },
-        "name": {
-          "$ref": "#/definitions/Name"
-        },
-        "displayName": {
-          "type": "string"
-        },
-        "profileUrl": {
-          "type": "string"
-        },
-        "userType": {
-          "type": "string"
-        },
-        "title": {
-          "type": "string"
-        },
-        "preferredLanguage": {
-          "type": "string"
-        },
-        "locale": {
-          "type": "string"
-        },
-        "timezone": {
+        "value": {
           "type": "string"
         },
-        "active": {
-          "type": "boolean"
-        },
-        "password": {
+        "display": {
           "type": "string"
-        },
-        "urn:scim:schemas:extension:enterprise:1.0": {
-          "$ref": "#/definitions/UrnScimSchemasExtensionEnterprise1.0"
         }
       },
       "required": [
-        "active",
-        "displayName",
-        "externalId",
-        "id",
-        "locale",
-        "meta",
-        "name",
-        "nickName",
-        "password",
-        "preferredLanguage",
-        "profileUrl",
-        "schemas",
-        "timezone",
-        "title",
-        "urn:scim:schemas:extension:enterprise:1.0",
-        "userName",
-        "userType"
+        "display",
+        "value"
       ],
-      "title": "ResourceMember"
+      "title": "Member"
     },
     "Meta": {
       "type": "object",
@@ -180,6 +119,7 @@
         },
         "location": {
           "type": "string",
+          "format": "uri",
           "qt-uri-protocols": [
             "https"
           ]
@@ -190,90 +130,6 @@
         "location"
       ],
       "title": "Meta"
-    },
-    "Name": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "givenName": {
-          "type": "string"
-        },
-        "familyName": {
-          "type": "string"
-        },
-        "honorificPrefix": {
-          "type": "string"
-        }
-      },
-      "required": [
-        "familyName",
-        "givenName",
-        "honorificPrefix"
-      ],
-      "title": "Name"
-    },
-    "UrnScimSchemasExtensionEnterprise1.0": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "employeeNumber": {
-          "type": "string"
-        },
-        "costCenter": {
-          "type": "string"
-        },
-        "organization": {
-          "type": "string"
-        },
-        "division": {
-          "type": "string"
-        },
-        "department": {
-          "type": "string"
-        },
-        "manager": {
-          "$ref": "#/definitions/Manager"
-        }
-      },
-      "required": [
-        "costCenter",
-        "department",
-        "division",
-        "employeeNumber",
-        "manager",
-        "organization"
-      ],
-      "title": "UrnScimSchemasExtensionEnterprise1.0"
-    },
-    "Manager": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "managerId": {
-          "type": "string"
-        }
-      },
-      "required": [
-        "managerId"
-      ],
-      "title": "Manager"
-    },
-    "GroupsMember": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "value": {
-          "type": "string"
-        },
-        "display": {
-          "type": "string"
-        }
-      },
-      "required": [
-        "display",
-        "value"
-      ],
-      "title": "GroupsMember"
     }
   }
 }
diff --git a/json-schema/v1/User.json b/json-schema/v1/User.json
index 4f4eb20..2cf5b48 100644
--- a/json-schema/v1/User.json
+++ b/json-schema/v1/User.json
@@ -6,6 +6,9 @@
       "type": "object",
       "additionalProperties": false,
       "properties": {
+        "Errors": {
+          "$ref": "#/definitions/Errors"
+        },
         "schemas": {
           "type": "array",
           "items": {
@@ -90,6 +93,7 @@
         }
       },
       "required": [
+        "Errors",
         "active",
         "addresses",
         "displayName",
@@ -112,6 +116,23 @@
       ],
       "title": "User"
     },
+    "Errors": {
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "description": {
+          "type": "string"
+        },
+        "code": {
+          "type": "integer"
+        }
+      },
+      "required": [
+        "code",
+        "description"
+      ],
+      "title": "Errors"
+    },
     "Address": {
       "type": "object",
       "additionalProperties": false,
diff --git a/json-schema/v1/Users.json b/json-schema/v1/Users.json
index 98e6d54..8b1e3ed 100644
--- a/json-schema/v1/Users.json
+++ b/json-schema/v1/Users.json
@@ -6,67 +6,6 @@
       "type": "object",
       "additionalProperties": false,
       "properties": {
-        "schemas": {
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "id": {
-          "type": "string"
-        },
-        "externalId": {
-          "type": "string"
-        },
-        "meta": {
-          "$ref": "#/definitions/Meta"
-        },
-        "userName": {
-          "type": "string"
-        },
-        "nickName": {
-          "type": "string"
-        },
-        "name": {
-          "$ref": "#/definitions/Name"
-        },
-        "displayName": {
-          "type": "string"
-        },
-        "profileUrl": {
-          "type": "string",
-          "format": "uri",
-          "qt-uri-protocols": [
-            "https"
-          ]
-        },
-        "title": {
-          "type": "string"
-        },
-        "timezone": {
-          "type": "string"
-        },
-        "active": {
-          "type": "boolean"
-        },
-        "emails": {
-          "type": "array",
-          "items": {
-            "$ref": "#/definitions/UsersEmail"
-          }
-        },
-        "photos": {
-          "type": "array",
-          "items": {
-            "$ref": "#/definitions/Photo"
-          }
-        },
-        "groups": {
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
         "totalResults": {
           "type": "integer"
         },
@@ -76,36 +15,49 @@
         "startIndex": {
           "type": "integer"
         },
+        "schemas": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
         "Resources": {
           "type": "array",
           "items": {
             "$ref": "#/definitions/Resource"
           }
+        },
+        "Errors": {
+          "$ref": "#/definitions/Errors"
         }
       },
       "required": [
+        "Errors",
         "Resources",
-        "active",
-        "displayName",
-        "emails",
-        "externalId",
-        "groups",
-        "id",
         "itemsPerPage",
-        "meta",
-        "name",
-        "nickName",
-        "photos",
-        "profileUrl",
         "schemas",
         "startIndex",
-        "timezone",
-        "title",
-        "totalResults",
-        "userName"
+        "totalResults"
       ],
       "title": "Users"
     },
+    "Errors": {
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "description": {
+          "type": "string"
+        },
+        "code": {
+          "type": "integer"
+        }
+      },
+      "required": [
+        "code",
+        "description"
+      ],
+      "title": "Errors"
+    },
     "Resource": {
       "type": "object",
       "additionalProperties": false,
@@ -156,7 +108,7 @@
         "emails": {
           "type": "array",
           "items": {
-            "$ref": "#/definitions/PhoneNumberElement"
+            "$ref": "#/definitions/Email"
           }
         },
         "photos": {
@@ -180,17 +132,14 @@
         "phoneNumbers": {
           "type": "array",
           "items": {
-            "$ref": "#/definitions/PhoneNumberElement"
+            "$ref": "#/definitions/Email"
           }
         },
         "roles": {
           "type": "array",
           "items": {
-            "$ref": "#/definitions/PhoneNumberElement"
+            "$ref": "#/definitions/Email"
           }
-        },
-        "urn:scim:schemas:extension:enterprise:1.0": {
-          "$ref": "#/definitions/UrnScimSchemasExtensionEnterprise1.0"
         }
       },
       "required": [
@@ -211,7 +160,6 @@
         "schemas",
         "timezone",
         "title",
-        "urn:scim:schemas:extension:enterprise:1.0",
         "userName"
       ],
       "title": "Resource"
@@ -249,7 +197,7 @@
       ],
       "title": "Address"
     },
-    "PhoneNumberElement": {
+    "Email": {
       "type": "object",
       "additionalProperties": false,
       "properties": {
@@ -268,7 +216,7 @@
         "type",
         "value"
       ],
-      "title": "PhoneNumberElement"
+      "title": "Email"
     },
     "Group": {
       "type": "object",
@@ -330,10 +278,7 @@
       "additionalProperties": false,
       "properties": {
         "value": {
-          "type": "string",
-          "qt-uri-protocols": [
-            "https"
-          ]
+          "type": "string"
         },
         "type": {
           "type": "string"
@@ -344,41 +289,6 @@
         "value"
       ],
       "title": "Photo"
-    },
-    "UrnScimSchemasExtensionEnterprise1.0": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "manager": {
-          "$ref": "#/definitions/Manager"
-        }
-      },
-      "required": [
-        "manager"
-      ],
-      "title": "UrnScimSchemasExtensionEnterprise1.0"
-    },
-    "Manager": {
-      "type": "object",
-      "additionalProperties": false,
-      "title": "Manager"
-    },
-    "UsersEmail": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "value": {
-          "type": "string"
-        },
-        "primary": {
-          "type": "boolean"
-        }
-      },
-      "required": [
-        "primary",
-        "value"
-      ],
-      "title": "UsersEmail"
     }
   }
 }
diff --git a/setup.py b/setup.py
index f531ca2..4045369 100755
--- a/setup.py
+++ b/setup.py
@@ -20,7 +20,7 @@ setuptools.setup(
     package_dir={"": "src"},
     py_modules=[splitext(basename(path))[0] for path in glob('src/*.py')],
     setup_requires=["pytest-runner==5.2"],
-    tests_require=["pytest==3.8.2"],
+    tests_require=["pytest>=5,<6"],
     classifiers=[
         "Programming Language :: Python :: 3.6",
         "Programming Language :: Python :: 3.7",
diff --git a/src/slack_scim/v1/group.py b/src/slack_scim/v1/group.py
index a81800d..e6dca73 100644
--- a/src/slack_scim/v1/group.py
+++ b/src/slack_scim/v1/group.py
@@ -6,7 +6,7 @@
 #
 #     result = group_from_dict(json.loads(json_string))
 
-from typing import Optional, Any, List, TypeVar, Type, cast, Callable
+from typing import Optional, Any, List, TypeVar, Callable, Type, cast
 
 
 T = TypeVar("T")
@@ -31,19 +31,36 @@ def from_union(fs, x):
     assert False
 
 
+def from_list(f: Callable[[Any], T], x: Any) -> List[T]:
+    assert isinstance(x, list)
+    return [f(y) for y in x]
+
+
 def to_class(c: Type[T], x: Any) -> dict:
     assert isinstance(x, c)
     return cast(Any, x).to_dict()
 
 
-def from_bool(x: Any) -> bool:
-    assert isinstance(x, bool)
-    return x
+class Member:
+    display: Optional[str]
+    value: Optional[str]
 
+    def __init__(self, display: Optional[str], value: Optional[str]) -> None:
+        self.display = display
+        self.value = value
 
-def from_list(f: Callable[[Any], T], x: Any) -> List[T]:
-    assert isinstance(x, list)
-    return [f(y) for y in x]
+    @staticmethod
+    def from_dict(obj: Any) -> 'Member':
+        assert isinstance(obj, dict)
+        display = from_union([from_str, from_none], obj.get("display"))
+        value = from_union([from_str, from_none], obj.get("value"))
+        return Member(display, value)
+
+    def to_dict(self) -> dict:
+        result: dict = {}
+        result["display"] = from_union([from_str, from_none], self.display)
+        result["value"] = from_union([from_str, from_none], self.value)
+        return result
 
 
 class Meta:
@@ -68,170 +85,6 @@ class Meta:
         return result
 
 
-class Name:
-    family_name: Optional[str]
-    given_name: Optional[str]
-    honorific_prefix: Optional[str]
-
-    def __init__(self, family_name: Optional[str], given_name: Optional[str], honorific_prefix: Optional[str]) -> None:
-        self.family_name = family_name
-        self.given_name = given_name
-        self.honorific_prefix = honorific_prefix
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'Name':
-        assert isinstance(obj, dict)
-        family_name = from_union([from_str, from_none], obj.get("familyName"))
-        given_name = from_union([from_str, from_none], obj.get("givenName"))
-        honorific_prefix = from_union([from_str, from_none], obj.get("honorificPrefix"))
-        return Name(family_name, given_name, honorific_prefix)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["familyName"] = from_union([from_str, from_none], self.family_name)
-        result["givenName"] = from_union([from_str, from_none], self.given_name)
-        result["honorificPrefix"] = from_union([from_str, from_none], self.honorific_prefix)
-        return result
-
-
-class Manager:
-    manager_id: Optional[str]
-
-    def __init__(self, manager_id: Optional[str]) -> None:
-        self.manager_id = manager_id
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'Manager':
-        assert isinstance(obj, dict)
-        manager_id = from_union([from_str, from_none], obj.get("managerId"))
-        return Manager(manager_id)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["managerId"] = from_union([from_str, from_none], self.manager_id)
-        return result
-
-
-class UrnScimSchemasExtensionEnterprise10:
-    cost_center: Optional[str]
-    department: Optional[str]
-    division: Optional[str]
-    employee_number: Optional[str]
-    manager: Optional[Manager]
-    organization: Optional[str]
-
-    def __init__(self, cost_center: Optional[str], department: Optional[str], division: Optional[str], employee_number: Optional[str], manager: Optional[Manager], organization: Optional[str]) -> None:
-        self.cost_center = cost_center
-        self.department = department
-        self.division = division
-        self.employee_number = employee_number
-        self.manager = manager
-        self.organization = organization
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'UrnScimSchemasExtensionEnterprise10':
-        assert isinstance(obj, dict)
-        cost_center = from_union([from_str, from_none], obj.get("costCenter"))
-        department = from_union([from_str, from_none], obj.get("department"))
-        division = from_union([from_str, from_none], obj.get("division"))
-        employee_number = from_union([from_str, from_none], obj.get("employeeNumber"))
-        manager = from_union([Manager.from_dict, from_none], obj.get("manager"))
-        organization = from_union([from_str, from_none], obj.get("organization"))
-        return UrnScimSchemasExtensionEnterprise10(cost_center, department, division, employee_number, manager, organization)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["costCenter"] = from_union([from_str, from_none], self.cost_center)
-        result["department"] = from_union([from_str, from_none], self.department)
-        result["division"] = from_union([from_str, from_none], self.division)
-        result["employeeNumber"] = from_union([from_str, from_none], self.employee_number)
-        result["manager"] = from_union([lambda x: to_class(Manager, x), from_none], self.manager)
-        result["organization"] = from_union([from_str, from_none], self.organization)
-        return result
-
-
-class Member:
-    active: Optional[bool]
-    display_name: Optional[str]
-    external_id: Optional[str]
-    id: Optional[str]
-    locale: Optional[str]
-    meta: Optional[Meta]
-    name: Optional[Name]
-    nick_name: Optional[str]
-    password: Optional[str]
-    preferred_language: Optional[str]
-    profile_url: Optional[str]
-    schemas: Optional[List[str]]
-    timezone: Optional[str]
-    title: Optional[str]
-    urn_scim_schemas_extension_enterprise_10: Optional[UrnScimSchemasExtensionEnterprise10]
-    user_name: Optional[str]
-    user_type: Optional[str]
-
-    def __init__(self, active: Optional[bool], display_name: Optional[str], external_id: Optional[str], id: Optional[str], locale: Optional[str], meta: Optional[Meta], name: Optional[Name], nick_name: Optional[str], password: Optional[str], preferred_language: Optional[str], profile_url: Optional[str], schemas: Optional[List[str]], timezone: Optional[str], title: Optional[str], urn_scim_schemas_extension_enterprise_10: Optional[UrnScimSchemasExtensionEnterprise10], user_name: Optional[str], user_type: Optional[str]) -> None:
-        self.active = active
-        self.display_name = display_name
-        self.external_id = external_id
-        self.id = id
-        self.locale = locale
-        self.meta = meta
-        self.name = name
-        self.nick_name = nick_name
-        self.password = password
-        self.preferred_language = preferred_language
-        self.profile_url = profile_url
-        self.schemas = schemas
-        self.timezone = timezone
-        self.title = title
-        self.urn_scim_schemas_extension_enterprise_10 = urn_scim_schemas_extension_enterprise_10
-        self.user_name = user_name
-        self.user_type = user_type
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'Member':
-        assert isinstance(obj, dict)
-        active = from_union([from_bool, from_none], obj.get("active"))
-        display_name = from_union([from_str, from_none], obj.get("displayName"))
-        external_id = from_union([from_str, from_none], obj.get("externalId"))
-        id = from_union([from_str, from_none], obj.get("id"))
-        locale = from_union([from_str, from_none], obj.get("locale"))
-        meta = from_union([Meta.from_dict, from_none], obj.get("meta"))
-        name = from_union([Name.from_dict, from_none], obj.get("name"))
-        nick_name = from_union([from_str, from_none], obj.get("nickName"))
-        password = from_union([from_str, from_none], obj.get("password"))
-        preferred_language = from_union([from_str, from_none], obj.get("preferredLanguage"))
-        profile_url = from_union([from_str, from_none], obj.get("profileUrl"))
-        schemas = from_union([lambda x: from_list(from_str, x), from_none], obj.get("schemas"))
-        timezone = from_union([from_str, from_none], obj.get("timezone"))
-        title = from_union([from_str, from_none], obj.get("title"))
-        urn_scim_schemas_extension_enterprise_10 = from_union([UrnScimSchemasExtensionEnterprise10.from_dict, from_none], obj.get("urn:scim:schemas:extension:enterprise:1.0"))
-        user_name = from_union([from_str, from_none], obj.get("userName"))
-        user_type = from_union([from_str, from_none], obj.get("userType"))
-        return Member(active, display_name, external_id, id, locale, meta, name, nick_name, password, preferred_language, profile_url, schemas, timezone, title, urn_scim_schemas_extension_enterprise_10, user_name, user_type)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["active"] = from_union([from_bool, from_none], self.active)
-        result["displayName"] = from_union([from_str, from_none], self.display_name)
-        result["externalId"] = from_union([from_str, from_none], self.external_id)
-        result["id"] = from_union([from_str, from_none], self.id)
-        result["locale"] = from_union([from_str, from_none], self.locale)
-        result["meta"] = from_union([lambda x: to_class(Meta, x), from_none], self.meta)
-        result["name"] = from_union([lambda x: to_class(Name, x), from_none], self.name)
-        result["nickName"] = from_union([from_str, from_none], self.nick_name)
-        result["password"] = from_union([from_str, from_none], self.password)
-        result["preferredLanguage"] = from_union([from_str, from_none], self.preferred_language)
-        result["profileUrl"] = from_union([from_str, from_none], self.profile_url)
-        result["schemas"] = from_union([lambda x: from_list(from_str, x), from_none], self.schemas)
-        result["timezone"] = from_union([from_str, from_none], self.timezone)
-        result["title"] = from_union([from_str, from_none], self.title)
-        result["urn:scim:schemas:extension:enterprise:1.0"] = from_union([lambda x: to_class(UrnScimSchemasExtensionEnterprise10, x), from_none], self.urn_scim_schemas_extension_enterprise_10)
-        result["userName"] = from_union([from_str, from_none], self.user_name)
-        result["userType"] = from_union([from_str, from_none], self.user_type)
-        return result
-
-
 class Group:
     display_name: Optional[str]
     id: Optional[str]
diff --git a/src/slack_scim/v1/groups.py b/src/slack_scim/v1/groups.py
index cc33c48..2e28cab 100644
--- a/src/slack_scim/v1/groups.py
+++ b/src/slack_scim/v1/groups.py
@@ -6,14 +6,14 @@
 #
 #     result = groups_from_dict(json.loads(json_string))
 
-from typing import Optional, Any, List, TypeVar, Type, cast, Callable
+from typing import Optional, Any, List, TypeVar, Callable, Type, cast
 
 
 T = TypeVar("T")
 
 
-def from_str(x: Any) -> str:
-    assert isinstance(x, str)
+def from_int(x: Any) -> int:
+    assert isinstance(x, int) and not isinstance(x, bool)
     return x
 
 
@@ -31,13 +31,8 @@ def from_union(fs, x):
     assert False
 
 
-def to_class(c: Type[T], x: Any) -> dict:
-    assert isinstance(x, c)
-    return cast(Any, x).to_dict()
-
-
-def from_bool(x: Any) -> bool:
-    assert isinstance(x, bool)
+def from_str(x: Any) -> str:
+    assert isinstance(x, str)
     return x
 
 
@@ -46,12 +41,34 @@ def from_list(f: Callable[[Any], T], x: Any) -> List[T]:
     return [f(y) for y in x]
 
 
-def from_int(x: Any) -> int:
-    assert isinstance(x, int) and not isinstance(x, bool)
-    return x
+def to_class(c: Type[T], x: Any) -> dict:
+    assert isinstance(x, c)
+    return cast(Any, x).to_dict()
+
+
+class Errors:
+    code: Optional[int]
+    description: Optional[str]
+
+    def __init__(self, code: Optional[int], description: Optional[str]) -> None:
+        self.code = code
+        self.description = description
+
+    @staticmethod
+    def from_dict(obj: Any) -> 'Errors':
+        assert isinstance(obj, dict)
+        code = from_union([from_int, from_none], obj.get("code"))
+        description = from_union([from_str, from_none], obj.get("description"))
+        return Errors(code, description)
+
+    def to_dict(self) -> dict:
+        result: dict = {}
+        result["code"] = from_union([from_int, from_none], self.code)
+        result["description"] = from_union([from_str, from_none], self.description)
+        return result
 
 
-class GroupsMember:
+class Member:
     display: Optional[str]
     value: Optional[str]
 
@@ -60,11 +77,11 @@ class GroupsMember:
         self.value = value
 
     @staticmethod
-    def from_dict(obj: Any) -> 'GroupsMember':
+    def from_dict(obj: Any) -> 'Member':
         assert isinstance(obj, dict)
         display = from_union([from_str, from_none], obj.get("display"))
         value = from_union([from_str, from_none], obj.get("value"))
-        return GroupsMember(display, value)
+        return Member(display, value)
 
     def to_dict(self) -> dict:
         result: dict = {}
@@ -95,178 +112,14 @@ class Meta:
         return result
 
 
-class Name:
-    family_name: Optional[str]
-    given_name: Optional[str]
-    honorific_prefix: Optional[str]
-
-    def __init__(self, family_name: Optional[str], given_name: Optional[str], honorific_prefix: Optional[str]) -> None:
-        self.family_name = family_name
-        self.given_name = given_name
-        self.honorific_prefix = honorific_prefix
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'Name':
-        assert isinstance(obj, dict)
-        family_name = from_union([from_str, from_none], obj.get("familyName"))
-        given_name = from_union([from_str, from_none], obj.get("givenName"))
-        honorific_prefix = from_union([from_str, from_none], obj.get("honorificPrefix"))
-        return Name(family_name, given_name, honorific_prefix)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["familyName"] = from_union([from_str, from_none], self.family_name)
-        result["givenName"] = from_union([from_str, from_none], self.given_name)
-        result["honorificPrefix"] = from_union([from_str, from_none], self.honorific_prefix)
-        return result
-
-
-class Manager:
-    manager_id: Optional[str]
-
-    def __init__(self, manager_id: Optional[str]) -> None:
-        self.manager_id = manager_id
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'Manager':
-        assert isinstance(obj, dict)
-        manager_id = from_union([from_str, from_none], obj.get("managerId"))
-        return Manager(manager_id)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["managerId"] = from_union([from_str, from_none], self.manager_id)
-        return result
-
-
-class UrnScimSchemasExtensionEnterprise10:
-    cost_center: Optional[str]
-    department: Optional[str]
-    division: Optional[str]
-    employee_number: Optional[str]
-    manager: Optional[Manager]
-    organization: Optional[str]
-
-    def __init__(self, cost_center: Optional[str], department: Optional[str], division: Optional[str], employee_number: Optional[str], manager: Optional[Manager], organization: Optional[str]) -> None:
-        self.cost_center = cost_center
-        self.department = department
-        self.division = division
-        self.employee_number = employee_number
-        self.manager = manager
-        self.organization = organization
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'UrnScimSchemasExtensionEnterprise10':
-        assert isinstance(obj, dict)
-        cost_center = from_union([from_str, from_none], obj.get("costCenter"))
-        department = from_union([from_str, from_none], obj.get("department"))
-        division = from_union([from_str, from_none], obj.get("division"))
-        employee_number = from_union([from_str, from_none], obj.get("employeeNumber"))
-        manager = from_union([Manager.from_dict, from_none], obj.get("manager"))
-        organization = from_union([from_str, from_none], obj.get("organization"))
-        return UrnScimSchemasExtensionEnterprise10(cost_center, department, division, employee_number, manager, organization)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["costCenter"] = from_union([from_str, from_none], self.cost_center)
-        result["department"] = from_union([from_str, from_none], self.department)
-        result["division"] = from_union([from_str, from_none], self.division)
-        result["employeeNumber"] = from_union([from_str, from_none], self.employee_number)
-        result["manager"] = from_union([lambda x: to_class(Manager, x), from_none], self.manager)
-        result["organization"] = from_union([from_str, from_none], self.organization)
-        return result
-
-
-class ResourceMember:
-    active: Optional[bool]
-    display_name: Optional[str]
-    external_id: Optional[str]
-    id: Optional[str]
-    locale: Optional[str]
-    meta: Optional[Meta]
-    name: Optional[Name]
-    nick_name: Optional[str]
-    password: Optional[str]
-    preferred_language: Optional[str]
-    profile_url: Optional[str]
-    schemas: Optional[List[str]]
-    timezone: Optional[str]
-    title: Optional[str]
-    urn_scim_schemas_extension_enterprise_10: Optional[UrnScimSchemasExtensionEnterprise10]
-    user_name: Optional[str]
-    user_type: Optional[str]
-
-    def __init__(self, active: Optional[bool], display_name: Optional[str], external_id: Optional[str], id: Optional[str], locale: Optional[str], meta: Optional[Meta], name: Optional[Name], nick_name: Optional[str], password: Optional[str], preferred_language: Optional[str], profile_url: Optional[str], schemas: Optional[List[str]], timezone: Optional[str], title: Optional[str], urn_scim_schemas_extension_enterprise_10: Optional[UrnScimSchemasExtensionEnterprise10], user_name: Optional[str], user_type: Optional[str]) -> None:
-        self.active = active
-        self.display_name = display_name
-        self.external_id = external_id
-        self.id = id
-        self.locale = locale
-        self.meta = meta
-        self.name = name
-        self.nick_name = nick_name
-        self.password = password
-        self.preferred_language = preferred_language
-        self.profile_url = profile_url
-        self.schemas = schemas
-        self.timezone = timezone
-        self.title = title
-        self.urn_scim_schemas_extension_enterprise_10 = urn_scim_schemas_extension_enterprise_10
-        self.user_name = user_name
-        self.user_type = user_type
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'ResourceMember':
-        assert isinstance(obj, dict)
-        active = from_union([from_bool, from_none], obj.get("active"))
-        display_name = from_union([from_str, from_none], obj.get("displayName"))
-        external_id = from_union([from_str, from_none], obj.get("externalId"))
-        id = from_union([from_str, from_none], obj.get("id"))
-        locale = from_union([from_str, from_none], obj.get("locale"))
-        meta = from_union([Meta.from_dict, from_none], obj.get("meta"))
-        name = from_union([Name.from_dict, from_none], obj.get("name"))
-        nick_name = from_union([from_str, from_none], obj.get("nickName"))
-        password = from_union([from_str, from_none], obj.get("password"))
-        preferred_language = from_union([from_str, from_none], obj.get("preferredLanguage"))
-        profile_url = from_union([from_str, from_none], obj.get("profileUrl"))
-        schemas = from_union([lambda x: from_list(from_str, x), from_none], obj.get("schemas"))
-        timezone = from_union([from_str, from_none], obj.get("timezone"))
-        title = from_union([from_str, from_none], obj.get("title"))
-        urn_scim_schemas_extension_enterprise_10 = from_union([UrnScimSchemasExtensionEnterprise10.from_dict, from_none], obj.get("urn:scim:schemas:extension:enterprise:1.0"))
-        user_name = from_union([from_str, from_none], obj.get("userName"))
-        user_type = from_union([from_str, from_none], obj.get("userType"))
-        return ResourceMember(active, display_name, external_id, id, locale, meta, name, nick_name, password, preferred_language, profile_url, schemas, timezone, title, urn_scim_schemas_extension_enterprise_10, user_name, user_type)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["active"] = from_union([from_bool, from_none], self.active)
-        result["displayName"] = from_union([from_str, from_none], self.display_name)
-        result["externalId"] = from_union([from_str, from_none], self.external_id)
-        result["id"] = from_union([from_str, from_none], self.id)
-        result["locale"] = from_union([from_str, from_none], self.locale)
-        result["meta"] = from_union([lambda x: to_class(Meta, x), from_none], self.meta)
-        result["name"] = from_union([lambda x: to_class(Name, x), from_none], self.name)
-        result["nickName"] = from_union([from_str, from_none], self.nick_name)
-        result["password"] = from_union([from_str, from_none], self.password)
-        result["preferredLanguage"] = from_union([from_str, from_none], self.preferred_language)
-        result["profileUrl"] = from_union([from_str, from_none], self.profile_url)
-        result["schemas"] = from_union([lambda x: from_list(from_str, x), from_none], self.schemas)
-        result["timezone"] = from_union([from_str, from_none], self.timezone)
-        result["title"] = from_union([from_str, from_none], self.title)
-        result["urn:scim:schemas:extension:enterprise:1.0"] = from_union([lambda x: to_class(UrnScimSchemasExtensionEnterprise10, x), from_none], self.urn_scim_schemas_extension_enterprise_10)
-        result["userName"] = from_union([from_str, from_none], self.user_name)
-        result["userType"] = from_union([from_str, from_none], self.user_type)
-        return result
-
-
 class Resource:
     display_name: Optional[str]
     id: Optional[str]
-    members: Optional[List[ResourceMember]]
+    members: Optional[List[Member]]
     meta: Optional[Meta]
     schemas: Optional[List[str]]
 
-    def __init__(self, display_name: Optional[str], id: Optional[str], members: Optional[List[ResourceMember]], meta: Optional[Meta], schemas: Optional[List[str]]) -> None:
+    def __init__(self, display_name: Optional[str], id: Optional[str], members: Optional[List[Member]], meta: Optional[Meta], schemas: Optional[List[str]]) -> None:
         self.display_name = display_name
         self.id = id
         self.members = members
@@ -278,7 +131,7 @@ class Resource:
         assert isinstance(obj, dict)
         display_name = from_union([from_str, from_none], obj.get("displayName"))
         id = from_union([from_str, from_none], obj.get("id"))
-        members = from_union([lambda x: from_list(ResourceMember.from_dict, x), from_none], obj.get("members"))
+        members = from_union([lambda x: from_list(Member.from_dict, x), from_none], obj.get("members"))
         meta = from_union([Meta.from_dict, from_none], obj.get("meta"))
         schemas = from_union([lambda x: from_list(from_str, x), from_none], obj.get("schemas"))
         return Resource(display_name, id, members, meta, schemas)
@@ -287,29 +140,23 @@ class Resource:
         result: dict = {}
         result["displayName"] = from_union([from_str, from_none], self.display_name)
         result["id"] = from_union([from_str, from_none], self.id)
-        result["members"] = from_union([lambda x: from_list(lambda x: to_class(ResourceMember, x), x), from_none], self.members)
+        result["members"] = from_union([lambda x: from_list(lambda x: to_class(Member, x), x), from_none], self.members)
         result["meta"] = from_union([lambda x: to_class(Meta, x), from_none], self.meta)
         result["schemas"] = from_union([lambda x: from_list(from_str, x), from_none], self.schemas)
         return result
 
 
 class Groups:
-    display_name: Optional[str]
-    id: Optional[str]
+    errors: Optional[Errors]
     items_per_page: Optional[int]
-    members: Optional[List[GroupsMember]]
-    meta: Optional[Meta]
     resources: Optional[List[Resource]]
     schemas: Optional[List[str]]
     start_index: Optional[int]
     total_results: Optional[int]
 
-    def __init__(self, display_name: Optional[str], id: Optional[str], items_per_page: Optional[int], members: Optional[List[GroupsMember]], meta: Optional[Meta], resources: Optional[List[Resource]], schemas: Optional[List[str]], start_index: Optional[int], total_results: Optional[int]) -> None:
-        self.display_name = display_name
-        self.id = id
+    def __init__(self, errors: Optional[Errors], items_per_page: Optional[int], resources: Optional[List[Resource]], schemas: Optional[List[str]], start_index: Optional[int], total_results: Optional[int]) -> None:
+        self.errors = errors
         self.items_per_page = items_per_page
-        self.members = members
-        self.meta = meta
         self.resources = resources
         self.schemas = schemas
         self.start_index = start_index
@@ -318,24 +165,18 @@ class Groups:
     @staticmethod
     def from_dict(obj: Any) -> 'Groups':
         assert isinstance(obj, dict)
-        display_name = from_union([from_str, from_none], obj.get("displayName"))
-        id = from_union([from_str, from_none], obj.get("id"))
+        errors = from_union([Errors.from_dict, from_none], obj.get("Errors"))
         items_per_page = from_union([from_int, from_none], obj.get("itemsPerPage"))
-        members = from_union([lambda x: from_list(GroupsMember.from_dict, x), from_none], obj.get("members"))
-        meta = from_union([Meta.from_dict, from_none], obj.get("meta"))
         resources = from_union([lambda x: from_list(Resource.from_dict, x), from_none], obj.get("Resources"))
         schemas = from_union([lambda x: from_list(from_str, x), from_none], obj.get("schemas"))
         start_index = from_union([from_int, from_none], obj.get("startIndex"))
         total_results = from_union([from_int, from_none], obj.get("totalResults"))
-        return Groups(display_name, id, items_per_page, members, meta, resources, schemas, start_index, total_results)
+        return Groups(errors, items_per_page, resources, schemas, start_index, total_results)
 
     def to_dict(self) -> dict:
         result: dict = {}
-        result["displayName"] = from_union([from_str, from_none], self.display_name)
-        result["id"] = from_union([from_str, from_none], self.id)
+        result["Errors"] = from_union([lambda x: to_class(Errors, x), from_none], self.errors)
         result["itemsPerPage"] = from_union([from_int, from_none], self.items_per_page)
-        result["members"] = from_union([lambda x: from_list(lambda x: to_class(GroupsMember, x), x), from_none], self.members)
-        result["meta"] = from_union([lambda x: to_class(Meta, x), from_none], self.meta)
         result["Resources"] = from_union([lambda x: from_list(lambda x: to_class(Resource, x), x), from_none], self.resources)
         result["schemas"] = from_union([lambda x: from_list(from_str, x), from_none], self.schemas)
         result["startIndex"] = from_union([from_int, from_none], self.start_index)
diff --git a/src/slack_scim/v1/user.py b/src/slack_scim/v1/user.py
index e2e22a8..c2be788 100644
--- a/src/slack_scim/v1/user.py
+++ b/src/slack_scim/v1/user.py
@@ -36,6 +36,11 @@ def from_bool(x: Any) -> bool:
     return x
 
 
+def from_int(x: Any) -> int:
+    assert isinstance(x, int) and not isinstance(x, bool)
+    return x
+
+
 def to_class(c: Type[T], x: Any) -> dict:
     assert isinstance(x, c)
     return cast(Any, x).to_dict()
@@ -110,6 +115,28 @@ class Email:
         return result
 
 
+class Errors:
+    code: Optional[int]
+    description: Optional[str]
+
+    def __init__(self, code: Optional[int], description: Optional[str]) -> None:
+        self.code = code
+        self.description = description
+
+    @staticmethod
+    def from_dict(obj: Any) -> 'Errors':
+        assert isinstance(obj, dict)
+        code = from_union([from_int, from_none], obj.get("code"))
+        description = from_union([from_str, from_none], obj.get("description"))
+        return Errors(code, description)
+
+    def to_dict(self) -> dict:
+        result: dict = {}
+        result["code"] = from_union([from_int, from_none], self.code)
+        result["description"] = from_union([from_str, from_none], self.description)
+        return result
+
+
 class Group:
     display: Optional[str]
     value: Optional[str]
@@ -237,6 +264,7 @@ class User:
     addresses: Optional[List[Address]]
     display_name: Optional[str]
     emails: Optional[List[Email]]
+    errors: Optional[Errors]
     external_id: Optional[str]
     groups: Optional[List[Group]]
     id: Optional[str]
@@ -253,11 +281,12 @@ class User:
     urn_scim_schemas_extension_enterprise_10: Optional[UrnScimSchemasExtensionEnterprise10]
     user_name: Optional[str]
 
-    def __init__(self, active: Optional[bool], addresses: Optional[List[Address]], display_name: Optional[str], emails: Optional[List[Email]], external_id: Optional[str], groups: Optional[List[Group]], id: Optional[str], meta: Optional[Meta], name: Optional[Name], nick_name: Optional[str], phone_numbers: Optional[List[Email]], photos: Optional[List[Photo]], profile_url: Optional[str], roles: Optional[List[Email]], schemas: Optional[List[str]], timezone: Optional[str], title: Optional[str], urn_scim_schemas_extension_enterprise_10: Optional[UrnScimSchemasExtensionEnterprise10], user_name: Optional[str]) -> None:
+    def __init__(self, active: Optional[bool], addresses: Optional[List[Address]], display_name: Optional[str], emails: Optional[List[Email]], errors: Optional[Errors], external_id: Optional[str], groups: Optional[List[Group]], id: Optional[str], meta: Optional[Meta], name: Optional[Name], nick_name: Optional[str], phone_numbers: Optional[List[Email]], photos: Optional[List[Photo]], profile_url: Optional[str], roles: Optional[List[Email]], schemas: Optional[List[str]], timezone: Optional[str], title: Optional[str], urn_scim_schemas_extension_enterprise_10: Optional[UrnScimSchemasExtensionEnterprise10], user_name: Optional[str]) -> None:
         self.active = active
         self.addresses = addresses
         self.display_name = display_name
         self.emails = emails
+        self.errors = errors
         self.external_id = external_id
         self.groups = groups
         self.id = id
@@ -281,6 +310,7 @@ class User:
         addresses = from_union([lambda x: from_list(Address.from_dict, x), from_none], obj.get("addresses"))
         display_name = from_union([from_str, from_none], obj.get("displayName"))
         emails = from_union([lambda x: from_list(Email.from_dict, x), from_none], obj.get("emails"))
+        errors = from_union([Errors.from_dict, from_none], obj.get("Errors"))
         external_id = from_union([from_str, from_none], obj.get("externalId"))
         groups = from_union([lambda x: from_list(Group.from_dict, x), from_none], obj.get("groups"))
         id = from_union([from_str, from_none], obj.get("id"))
@@ -296,7 +326,7 @@ class User:
         title = from_union([from_str, from_none], obj.get("title"))
         urn_scim_schemas_extension_enterprise_10 = from_union([UrnScimSchemasExtensionEnterprise10.from_dict, from_none], obj.get("urn:scim:schemas:extension:enterprise:1.0"))
         user_name = from_union([from_str, from_none], obj.get("userName"))
-        return User(active, addresses, display_name, emails, external_id, groups, id, meta, name, nick_name, phone_numbers, photos, profile_url, roles, schemas, timezone, title, urn_scim_schemas_extension_enterprise_10, user_name)
+        return User(active, addresses, display_name, emails, errors, external_id, groups, id, meta, name, nick_name, phone_numbers, photos, profile_url, roles, schemas, timezone, title, urn_scim_schemas_extension_enterprise_10, user_name)
 
     def to_dict(self) -> dict:
         result: dict = {}
@@ -304,6 +334,7 @@ class User:
         result["addresses"] = from_union([lambda x: from_list(lambda x: to_class(Address, x), x), from_none], self.addresses)
         result["displayName"] = from_union([from_str, from_none], self.display_name)
         result["emails"] = from_union([lambda x: from_list(lambda x: to_class(Email, x), x), from_none], self.emails)
+        result["Errors"] = from_union([lambda x: to_class(Errors, x), from_none], self.errors)
         result["externalId"] = from_union([from_str, from_none], self.external_id)
         result["groups"] = from_union([lambda x: from_list(lambda x: to_class(Group, x), x), from_none], self.groups)
         result["id"] = from_union([from_str, from_none], self.id)
diff --git a/src/slack_scim/v1/users.py b/src/slack_scim/v1/users.py
index dd10070..b9954bb 100644
--- a/src/slack_scim/v1/users.py
+++ b/src/slack_scim/v1/users.py
@@ -6,14 +6,14 @@
 #
 #     result = users_from_dict(json.loads(json_string))
 
-from typing import Optional, Any, List, TypeVar, Type, cast, Callable
+from typing import Optional, Any, List, TypeVar, Callable, Type, cast
 
 
 T = TypeVar("T")
 
 
-def from_bool(x: Any) -> bool:
-    assert isinstance(x, bool)
+def from_int(x: Any) -> int:
+    assert isinstance(x, int) and not isinstance(x, bool)
     return x
 
 
@@ -36,9 +36,9 @@ def from_str(x: Any) -> str:
     return x
 
 
-def to_class(c: Type[T], x: Any) -> dict:
-    assert isinstance(x, c)
-    return cast(Any, x).to_dict()
+def from_bool(x: Any) -> bool:
+    assert isinstance(x, bool)
+    return x
 
 
 def from_list(f: Callable[[Any], T], x: Any) -> List[T]:
@@ -46,96 +46,30 @@ def from_list(f: Callable[[Any], T], x: Any) -> List[T]:
     return [f(y) for y in x]
 
 
-def from_int(x: Any) -> int:
-    assert isinstance(x, int) and not isinstance(x, bool)
-    return x
-
-
-class UsersEmail:
-    primary: Optional[bool]
-    value: Optional[str]
-
-    def __init__(self, primary: Optional[bool], value: Optional[str]) -> None:
-        self.primary = primary
-        self.value = value
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'UsersEmail':
-        assert isinstance(obj, dict)
-        primary = from_union([from_bool, from_none], obj.get("primary"))
-        value = from_union([from_str, from_none], obj.get("value"))
-        return UsersEmail(primary, value)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["primary"] = from_union([from_bool, from_none], self.primary)
-        result["value"] = from_union([from_str, from_none], self.value)
-        return result
-
-
-class Meta:
-    created: Optional[str]
-    location: Optional[str]
-
-    def __init__(self, created: Optional[str], location: Optional[str]) -> None:
-        self.created = created
-        self.location = location
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'Meta':
-        assert isinstance(obj, dict)
-        created = from_union([from_str, from_none], obj.get("created"))
-        location = from_union([from_str, from_none], obj.get("location"))
-        return Meta(created, location)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["created"] = from_union([from_str, from_none], self.created)
-        result["location"] = from_union([from_str, from_none], self.location)
-        return result
-
-
-class Name:
-    family_name: Optional[str]
-    given_name: Optional[str]
-
-    def __init__(self, family_name: Optional[str], given_name: Optional[str]) -> None:
-        self.family_name = family_name
-        self.given_name = given_name
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'Name':
-        assert isinstance(obj, dict)
-        family_name = from_union([from_str, from_none], obj.get("familyName"))
-        given_name = from_union([from_str, from_none], obj.get("givenName"))
-        return Name(family_name, given_name)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["familyName"] = from_union([from_str, from_none], self.family_name)
-        result["givenName"] = from_union([from_str, from_none], self.given_name)
-        return result
+def to_class(c: Type[T], x: Any) -> dict:
+    assert isinstance(x, c)
+    return cast(Any, x).to_dict()
 
 
-class Photo:
-    type: Optional[str]
-    value: Optional[str]
+class Errors:
+    code: Optional[int]
+    description: Optional[str]
 
-    def __init__(self, type: Optional[str], value: Optional[str]) -> None:
-        self.type = type
-        self.value = value
+    def __init__(self, code: Optional[int], description: Optional[str]) -> None:
+        self.code = code
+        self.description = description
 
     @staticmethod
-    def from_dict(obj: Any) -> 'Photo':
+    def from_dict(obj: Any) -> 'Errors':
         assert isinstance(obj, dict)
-        type = from_union([from_str, from_none], obj.get("type"))
-        value = from_union([from_str, from_none], obj.get("value"))
-        return Photo(type, value)
+        code = from_union([from_int, from_none], obj.get("code"))
+        description = from_union([from_str, from_none], obj.get("description"))
+        return Errors(code, description)
 
     def to_dict(self) -> dict:
         result: dict = {}
-        result["type"] = from_union([from_str, from_none], self.type)
-        result["value"] = from_union([from_str, from_none], self.value)
+        result["code"] = from_union([from_int, from_none], self.code)
+        result["description"] = from_union([from_str, from_none], self.description)
         return result
 
 
@@ -177,7 +111,7 @@ class Address:
         return result
 
 
-class PhoneNumberElement:
+class Email:
     primary: Optional[bool]
     type: Optional[str]
     value: Optional[str]
@@ -188,12 +122,12 @@ class PhoneNumberElement:
         self.value = value
 
     @staticmethod
-    def from_dict(obj: Any) -> 'PhoneNumberElement':
+    def from_dict(obj: Any) -> 'Email':
         assert isinstance(obj, dict)
         primary = from_union([from_bool, from_none], obj.get("primary"))
         type = from_union([from_str, from_none], obj.get("type"))
         value = from_union([from_str, from_none], obj.get("value"))
-        return PhoneNumberElement(primary, type, value)
+        return Email(primary, type, value)
 
     def to_dict(self) -> dict:
         result: dict = {}
@@ -225,37 +159,69 @@ class Group:
         return result
 
 
-class Manager:
-    pass
+class Meta:
+    created: Optional[str]
+    location: Optional[str]
+
+    def __init__(self, created: Optional[str], location: Optional[str]) -> None:
+        self.created = created
+        self.location = location
+
+    @staticmethod
+    def from_dict(obj: Any) -> 'Meta':
+        assert isinstance(obj, dict)
+        created = from_union([from_str, from_none], obj.get("created"))
+        location = from_union([from_str, from_none], obj.get("location"))
+        return Meta(created, location)
+
+    def to_dict(self) -> dict:
+        result: dict = {}
+        result["created"] = from_union([from_str, from_none], self.created)
+        result["location"] = from_union([from_str, from_none], self.location)
+        return result
+
+
+class Name:
+    family_name: Optional[str]
+    given_name: Optional[str]
 
-    def __init__(self, ) -> None:
-        pass
+    def __init__(self, family_name: Optional[str], given_name: Optional[str]) -> None:
+        self.family_name = family_name
+        self.given_name = given_name
 
     @staticmethod
-    def from_dict(obj: Any) -> 'Manager':
+    def from_dict(obj: Any) -> 'Name':
         assert isinstance(obj, dict)
-        return Manager()
+        family_name = from_union([from_str, from_none], obj.get("familyName"))
+        given_name = from_union([from_str, from_none], obj.get("givenName"))
+        return Name(family_name, given_name)
 
     def to_dict(self) -> dict:
         result: dict = {}
+        result["familyName"] = from_union([from_str, from_none], self.family_name)
+        result["givenName"] = from_union([from_str, from_none], self.given_name)
         return result
 
 
-class UrnScimSchemasExtensionEnterprise10:
-    manager: Optional[Manager]
+class Photo:
+    type: Optional[str]
+    value: Optional[str]
 
-    def __init__(self, manager: Optional[Manager]) -> None:
-        self.manager = manager
+    def __init__(self, type: Optional[str], value: Optional[str]) -> None:
+        self.type = type
+        self.value = value
 
     @staticmethod
-    def from_dict(obj: Any) -> 'UrnScimSchemasExtensionEnterprise10':
+    def from_dict(obj: Any) -> 'Photo':
         assert isinstance(obj, dict)
-        manager = from_union([Manager.from_dict, from_none], obj.get("manager"))
-        return UrnScimSchemasExtensionEnterprise10(manager)
+        type = from_union([from_str, from_none], obj.get("type"))
+        value = from_union([from_str, from_none], obj.get("value"))
+        return Photo(type, value)
 
     def to_dict(self) -> dict:
         result: dict = {}
-        result["manager"] = from_union([lambda x: to_class(Manager, x), from_none], self.manager)
+        result["type"] = from_union([from_str, from_none], self.type)
+        result["value"] = from_union([from_str, from_none], self.value)
         return result
 
 
@@ -263,24 +229,23 @@ class Resource:
     active: Optional[bool]
     addresses: Optional[List[Address]]
     display_name: Optional[str]
-    emails: Optional[List[PhoneNumberElement]]
+    emails: Optional[List[Email]]
     external_id: Optional[str]
     groups: Optional[List[Group]]
     id: Optional[str]
     meta: Optional[Meta]
     name: Optional[Name]
     nick_name: Optional[str]
-    phone_numbers: Optional[List[PhoneNumberElement]]
+    phone_numbers: Optional[List[Email]]
     photos: Optional[List[Photo]]
     profile_url: Optional[str]
-    roles: Optional[List[PhoneNumberElement]]
+    roles: Optional[List[Email]]
     schemas: Optional[List[str]]
     timezone: Optional[str]
     title: Optional[str]
-    urn_scim_schemas_extension_enterprise_10: Optional[UrnScimSchemasExtensionEnterprise10]
     user_name: Optional[str]
 
-    def __init__(self, active: Optional[bool], addresses: Optional[List[Address]], display_name: Optional[str], emails: Optional[List[PhoneNumberElement]], external_id: Optional[str], groups: Optional[List[Group]], id: Optional[str], meta: Optional[Meta], name: Optional[Name], nick_name: Optional[str], phone_numbers: Optional[List[PhoneNumberElement]], photos: Optional[List[Photo]], profile_url: Optional[str], roles: Optional[List[PhoneNumberElement]], schemas: Optional[List[str]], timezone: Optional[str], title: Optional[str], urn_scim_schemas_extension_enterprise_10: Optional[UrnScimSchemasExtensionEnterprise10], user_name: Optional[str]) -> None:
+    def __init__(self, active: Optional[bool], addresses: Optional[List[Address]], display_name: Optional[str], emails: Optional[List[Email]], external_id: Optional[str], groups: Optional[List[Group]], id: Optional[str], meta: Optional[Meta], name: Optional[Name], nick_name: Optional[str], phone_numbers: Optional[List[Email]], photos: Optional[List[Photo]], profile_url: Optional[str], roles: Optional[List[Email]], schemas: Optional[List[str]], timezone: Optional[str], title: Optional[str], user_name: Optional[str]) -> None:
         self.active = active
         self.addresses = addresses
         self.display_name = display_name
@@ -298,7 +263,6 @@ class Resource:
         self.schemas = schemas
         self.timezone = timezone
         self.title = title
-        self.urn_scim_schemas_extension_enterprise_10 = urn_scim_schemas_extension_enterprise_10
         self.user_name = user_name
 
     @staticmethod
@@ -307,135 +271,81 @@ class Resource:
         active = from_union([from_bool, from_none], obj.get("active"))
         addresses = from_union([lambda x: from_list(Address.from_dict, x), from_none], obj.get("addresses"))
         display_name = from_union([from_str, from_none], obj.get("displayName"))
-        emails = from_union([lambda x: from_list(PhoneNumberElement.from_dict, x), from_none], obj.get("emails"))
+        emails = from_union([lambda x: from_list(Email.from_dict, x), from_none], obj.get("emails"))
         external_id = from_union([from_str, from_none], obj.get("externalId"))
         groups = from_union([lambda x: from_list(Group.from_dict, x), from_none], obj.get("groups"))
         id = from_union([from_str, from_none], obj.get("id"))
         meta = from_union([Meta.from_dict, from_none], obj.get("meta"))
         name = from_union([Name.from_dict, from_none], obj.get("name"))
         nick_name = from_union([from_str, from_none], obj.get("nickName"))
-        phone_numbers = from_union([lambda x: from_list(PhoneNumberElement.from_dict, x), from_none], obj.get("phoneNumbers"))
+        phone_numbers = from_union([lambda x: from_list(Email.from_dict, x), from_none], obj.get("phoneNumbers"))
         photos = from_union([lambda x: from_list(Photo.from_dict, x), from_none], obj.get("photos"))
         profile_url = from_union([from_str, from_none], obj.get("profileUrl"))
-        roles = from_union([lambda x: from_list(PhoneNumberElement.from_dict, x), from_none], obj.get("roles"))
+        roles = from_union([lambda x: from_list(Email.from_dict, x), from_none], obj.get("roles"))
         schemas = from_union([lambda x: from_list(from_str, x), from_none], obj.get("schemas"))
         timezone = from_union([from_str, from_none], obj.get("timezone"))
         title = from_union([from_str, from_none], obj.get("title"))
-        urn_scim_schemas_extension_enterprise_10 = from_union([UrnScimSchemasExtensionEnterprise10.from_dict, from_none], obj.get("urn:scim:schemas:extension:enterprise:1.0"))
         user_name = from_union([from_str, from_none], obj.get("userName"))
-        return Resource(active, addresses, display_name, emails, external_id, groups, id, meta, name, nick_name, phone_numbers, photos, profile_url, roles, schemas, timezone, title, urn_scim_schemas_extension_enterprise_10, user_name)
+        return Resource(active, addresses, display_name, emails, external_id, groups, id, meta, name, nick_name, phone_numbers, photos, profile_url, roles, schemas, timezone, title, user_name)
 
     def to_dict(self) -> dict:
         result: dict = {}
         result["active"] = from_union([from_bool, from_none], self.active)
         result["addresses"] = from_union([lambda x: from_list(lambda x: to_class(Address, x), x), from_none], self.addresses)
         result["displayName"] = from_union([from_str, from_none], self.display_name)
-        result["emails"] = from_union([lambda x: from_list(lambda x: to_class(PhoneNumberElement, x), x), from_none], self.emails)
+        result["emails"] = from_union([lambda x: from_list(lambda x: to_class(Email, x), x), from_none], self.emails)
         result["externalId"] = from_union([from_str, from_none], self.external_id)
         result["groups"] = from_union([lambda x: from_list(lambda x: to_class(Group, x), x), from_none], self.groups)
         result["id"] = from_union([from_str, from_none], self.id)
         result["meta"] = from_union([lambda x: to_class(Meta, x), from_none], self.meta)
         result["name"] = from_union([lambda x: to_class(Name, x), from_none], self.name)
         result["nickName"] = from_union([from_str, from_none], self.nick_name)
-        result["phoneNumbers"] = from_union([lambda x: from_list(lambda x: to_class(PhoneNumberElement, x), x), from_none], self.phone_numbers)
+        result["phoneNumbers"] = from_union([lambda x: from_list(lambda x: to_class(Email, x), x), from_none], self.phone_numbers)
         result["photos"] = from_union([lambda x: from_list(lambda x: to_class(Photo, x), x), from_none], self.photos)
         result["profileUrl"] = from_union([from_str, from_none], self.profile_url)
-        result["roles"] = from_union([lambda x: from_list(lambda x: to_class(PhoneNumberElement, x), x), from_none], self.roles)
+        result["roles"] = from_union([lambda x: from_list(lambda x: to_class(Email, x), x), from_none], self.roles)
         result["schemas"] = from_union([lambda x: from_list(from_str, x), from_none], self.schemas)
         result["timezone"] = from_union([from_str, from_none], self.timezone)
         result["title"] = from_union([from_str, from_none], self.title)
-        result["urn:scim:schemas:extension:enterprise:1.0"] = from_union([lambda x: to_class(UrnScimSchemasExtensionEnterprise10, x), from_none], self.urn_scim_schemas_extension_enterprise_10)
         result["userName"] = from_union([from_str, from_none], self.user_name)
         return result
 
 
 class Users:
-    active: Optional[bool]
-    display_name: Optional[str]
-    emails: Optional[List[UsersEmail]]
-    external_id: Optional[str]
-    groups: Optional[List[str]]
-    id: Optional[str]
+    errors: Optional[Errors]
     items_per_page: Optional[int]
-    meta: Optional[Meta]
-    name: Optional[Name]
-    nick_name: Optional[str]
-    photos: Optional[List[Photo]]
-    profile_url: Optional[str]
     resources: Optional[List[Resource]]
     schemas: Optional[List[str]]
     start_index: Optional[int]
-    timezone: Optional[str]
-    title: Optional[str]
     total_results: Optional[int]
-    user_name: Optional[str]
 
-    def __init__(self, active: Optional[bool], display_name: Optional[str], emails: Optional[List[UsersEmail]], external_id: Optional[str], groups: Optional[List[str]], id: Optional[str], items_per_page: Optional[int], meta: Optional[Meta], name: Optional[Name], nick_name: Optional[str], photos: Optional[List[Photo]], profile_url: Optional[str], resources: Optional[List[Resource]], schemas: Optional[List[str]], start_index: Optional[int], timezone: Optional[str], title: Optional[str], total_results: Optional[int], user_name: Optional[str]) -> None:
-        self.active = active
-        self.display_name = display_name
-        self.emails = emails
-        self.external_id = external_id
-        self.groups = groups
-        self.id = id
+    def __init__(self, errors: Optional[Errors], items_per_page: Optional[int], resources: Optional[List[Resource]], schemas: Optional[List[str]], start_index: Optional[int], total_results: Optional[int]) -> None:
+        self.errors = errors
         self.items_per_page = items_per_page
-        self.meta = meta
-        self.name = name
-        self.nick_name = nick_name
-        self.photos = photos
-        self.profile_url = profile_url
         self.resources = resources
         self.schemas = schemas
         self.start_index = start_index
-        self.timezone = timezone
-        self.title = title
         self.total_results = total_results
-        self.user_name = user_name
 
     @staticmethod
     def from_dict(obj: Any) -> 'Users':
         assert isinstance(obj, dict)
-        active = from_union([from_bool, from_none], obj.get("active"))
-        display_name = from_union([from_str, from_none], obj.get("displayName"))
-        emails = from_union([lambda x: from_list(UsersEmail.from_dict, x), from_none], obj.get("emails"))
-        external_id = from_union([from_str, from_none], obj.get("externalId"))
-        groups = from_union([lambda x: from_list(from_str, x), from_none], obj.get("groups"))
-        id = from_union([from_str, from_none], obj.get("id"))
+        errors = from_union([Errors.from_dict, from_none], obj.get("Errors"))
         items_per_page = from_union([from_int, from_none], obj.get("itemsPerPage"))
-        meta = from_union([Meta.from_dict, from_none], obj.get("meta"))
-        name = from_union([Name.from_dict, from_none], obj.get("name"))
-        nick_name = from_union([from_str, from_none], obj.get("nickName"))
-        photos = from_union([lambda x: from_list(Photo.from_dict, x), from_none], obj.get("photos"))
-        profile_url = from_union([from_str, from_none], obj.get("profileUrl"))
         resources = from_union([lambda x: from_list(Resource.from_dict, x), from_none], obj.get("Resources"))
         schemas = from_union([lambda x: from_list(from_str, x), from_none], obj.get("schemas"))
         start_index = from_union([from_int, from_none], obj.get("startIndex"))
-        timezone = from_union([from_str, from_none], obj.get("timezone"))
-        title = from_union([from_str, from_none], obj.get("title"))
         total_results = from_union([from_int, from_none], obj.get("totalResults"))
-        user_name = from_union([from_str, from_none], obj.get("userName"))
-        return Users(active, display_name, emails, external_id, groups, id, items_per_page, meta, name, nick_name, photos, profile_url, resources, schemas, start_index, timezone, title, total_results, user_name)
+        return Users(errors, items_per_page, resources, schemas, start_index, total_results)
 
     def to_dict(self) -> dict:
         result: dict = {}
-        result["active"] = from_union([from_bool, from_none], self.active)
-        result["displayName"] = from_union([from_str, from_none], self.display_name)
-        result["emails"] = from_union([lambda x: from_list(lambda x: to_class(UsersEmail, x), x), from_none], self.emails)
-        result["externalId"] = from_union([from_str, from_none], self.external_id)
-        result["groups"] = from_union([lambda x: from_list(from_str, x), from_none], self.groups)
-        result["id"] = from_union([from_str, from_none], self.id)
+        result["Errors"] = from_union([lambda x: to_class(Errors, x), from_none], self.errors)
         result["itemsPerPage"] = from_union([from_int, from_none], self.items_per_page)
-        result["meta"] = from_union([lambda x: to_class(Meta, x), from_none], self.meta)
-        result["name"] = from_union([lambda x: to_class(Name, x), from_none], self.name)
-        result["nickName"] = from_union([from_str, from_none], self.nick_name)
-        result["photos"] = from_union([lambda x: from_list(lambda x: to_class(Photo, x), x), from_none], self.photos)
-        result["profileUrl"] = from_union([from_str, from_none], self.profile_url)
         result["Resources"] = from_union([lambda x: from_list(lambda x: to_class(Resource, x), x), from_none], self.resources)
         result["schemas"] = from_union([lambda x: from_list(from_str, x), from_none], self.schemas)
         result["startIndex"] = from_union([from_int, from_none], self.start_index)
-        result["timezone"] = from_union([from_str, from_none], self.timezone)
-        result["title"] = from_union([from_str, from_none], self.title)
         result["totalResults"] = from_union([from_int, from_none], self.total_results)
-        result["userName"] = from_union([from_str, from_none], self.user_name)
         return result
 
 


Test patch:
diff --git a/tests/fixture/v1_group_3.json b/tests/fixture/v1_group_3.json
new file mode 100644
index 0000000..40abb7d
--- /dev/null
+++ b/tests/fixture/v1_group_3.json
@@ -0,0 +1,17 @@
+{
+  "schemas": [
+    "urn:scim:schemas:core:1.0"
+  ],
+  "id": "S333",
+  "displayName": "test-group-333",
+  "members": [
+    {
+      "value": "M333",
+      "display": "Michael Jackson"
+    }
+  ],
+  "meta": {
+    "created": "2019-03-18T09:05:06-07:00",
+    "location": "https:\/\/api.slack.com\/scim\/v1\/Groups\/S333"
+  }
+}
\ No newline at end of file
diff --git a/tests/v1/mock_server.py b/tests/v1/mock_server.py
index 2e11a2a..3867642 100644
--- a/tests/v1/mock_server.py
+++ b/tests/v1/mock_server.py
@@ -56,6 +56,9 @@ class MockHandler(SimpleHTTPRequestHandler):
             elif parsed_path.path == "/Groups/S222":
                 with open("tests/fixture/v1_group_2.json") as f:
                     body = f.read()
+            elif parsed_path.path == "/Groups/S333":
+                with open("tests/fixture/v1_group_3.json") as f:
+                    body = f.read()
             else:
                 body = "{}"
             self.send_response(HTTPStatus.OK)
diff --git a/tests/v1/test_groups.py b/tests/v1/test_groups.py
index 967c836..2a4d9a0 100644
--- a/tests/v1/test_groups.py
+++ b/tests/v1/test_groups.py
@@ -82,3 +82,11 @@ class TestGroups(unittest.TestCase):
                 self.client.delete_group(group_id)
         finally:
             self.client.delete_user(created_user.id)
+
+    def test_read_group_members(self):
+        group = self.client.read_group("S333")
+        assert len(group.members) == 1
+        member = group.members[0]
+        print(member.__dict__)
+        assert member.value == "M333"
+        assert member.display == "Michael Jackson"
diff --git a/tests/v1/test_users.py b/tests/v1/test_users.py
index 462eb48..d53f0b3 100644
--- a/tests/v1/test_users.py
+++ b/tests/v1/test_users.py
@@ -37,7 +37,7 @@ class TestUsers(unittest.TestCase):
         assert user.name.given_name is not None
 
         read_result: User = self.client.read_user(user.id)
-        assert user.to_dict() == read_result.to_dict()
+        assert user.id == read_result.id
 
         search_result: Users = self.client.search_users(count=2, start_index=2)
         assert search_result.start_index == 2