This commit is contained in:
api-team-automation[bot] 2026-07-30 15:39:00 +00:00 committed by GitHub
commit 97395a186e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
369 changed files with 200347 additions and 345 deletions

View File

@ -126,9 +126,17 @@ src/thousandeyes_sdk/administrative/models/validation_error.py
src/thousandeyes_sdk/administrative/models/validation_error_item.py src/thousandeyes_sdk/administrative/models/validation_error_item.py
src/thousandeyes_sdk/administrative/py.typed src/thousandeyes_sdk/administrative/py.typed
test/__init__.py test/__init__.py
test/conftest.py
test/integration_test_utils.py
test/mock_manifest.py
test/test_account_groups_api.py test/test_account_groups_api.py
test/test_account_groups_api_integration.py
test/test_permissions_api.py test/test_permissions_api.py
test/test_permissions_api_integration.py
test/test_roles_api.py test/test_roles_api.py
test/test_roles_api_integration.py
test/test_user_events_api.py test/test_user_events_api.py
test/test_user_events_api_integration.py
test/test_users_api.py test/test_users_api.py
test/test_users_api_integration.py
test/test_utils.py test/test_utils.py

View File

@ -12,7 +12,7 @@ This API provides the following operations to manage your organization:
This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
- API version: 7.0.96 - API version: 7.0.97
- Generator version: 7.6.0 - Generator version: 7.6.0
- Build package: com.thousandeyes.api.codegen.ThousandeyesPythonGenerator - Build package: com.thousandeyes.api.codegen.ThousandeyesPythonGenerator
@ -85,8 +85,8 @@ configuration = thousandeyes_sdk.core.Configuration(
with thousandeyes_sdk.core.ApiClient(configuration) as api_client: with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.administrative.AccountGroupsApi(api_client) api_instance = thousandeyes_sdk.administrative.AccountGroupsApi(api_client)
account_group_request = thousandeyes_sdk.administrative.AccountGroupRequest() # AccountGroupRequest | account_group_request = # AccountGroupRequest |
expand = [thousandeyes_sdk.administrative.ExpandAccountGroupOptions()] # List[ExpandAccountGroupOptions] | Optional parameter that specifies whether or not account group related resources should be expanded. By default, no expansion takes place if the query parameter is not passed. For example, to expand the `users` resource, pass the `?expand=user` query. (optional) expand = # List[ExpandAccountGroupOptions] | Optional parameter that specifies whether or not account group related resources should be expanded. By default, no expansion takes place if the query parameter is not passed. For example, to expand the `users` resource, pass the `?expand=user` query. (optional)
try: try:
# Create account group # Create account group

View File

@ -50,8 +50,8 @@ configuration = thousandeyes_sdk.core.Configuration(
with thousandeyes_sdk.core.ApiClient(configuration) as api_client: with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.administrative.AccountGroupsApi(api_client) api_instance = thousandeyes_sdk.administrative.AccountGroupsApi(api_client)
account_group_request = thousandeyes_sdk.administrative.AccountGroupRequest() # AccountGroupRequest | account_group_request = # AccountGroupRequest |
expand = [thousandeyes_sdk.administrative.ExpandAccountGroupOptions()] # List[ExpandAccountGroupOptions] | Optional parameter that specifies whether or not account group related resources should be expanded. By default, no expansion takes place if the query parameter is not passed. For example, to expand the `users` resource, pass the `?expand=user` query. (optional) expand = # List[ExpandAccountGroupOptions] | Optional parameter that specifies whether or not account group related resources should be expanded. By default, no expansion takes place if the query parameter is not passed. For example, to expand the `users` resource, pass the `?expand=user` query. (optional)
try: try:
# Create account group # Create account group
@ -219,7 +219,7 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.administrative.AccountGroupsApi(api_client) api_instance = thousandeyes_sdk.administrative.AccountGroupsApi(api_client)
id = '1234' # str | Identifier for the account group. id = '1234' # str | Identifier for the account group.
expand = [thousandeyes_sdk.administrative.ExpandAccountGroupOptions()] # List[ExpandAccountGroupOptions] | Optional parameter that specifies whether or not account group related resources should be expanded. By default, no expansion takes place if the query parameter is not passed. For example, to expand the `users` resource, pass the `?expand=user` query. (optional) expand = # List[ExpandAccountGroupOptions] | Optional parameter that specifies whether or not account group related resources should be expanded. By default, no expansion takes place if the query parameter is not passed. For example, to expand the `users` resource, pass the `?expand=user` query. (optional)
try: try:
# Retrieve account group # Retrieve account group
@ -387,8 +387,8 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.administrative.AccountGroupsApi(api_client) api_instance = thousandeyes_sdk.administrative.AccountGroupsApi(api_client)
id = '1234' # str | Identifier for the account group. id = '1234' # str | Identifier for the account group.
account_group_request = thousandeyes_sdk.administrative.AccountGroupRequest() # AccountGroupRequest | account_group_request = # AccountGroupRequest |
expand = [thousandeyes_sdk.administrative.ExpandAccountGroupOptions()] # List[ExpandAccountGroupOptions] | Optional parameter that specifies whether or not account group related resources should be expanded. By default, no expansion takes place if the query parameter is not passed. For example, to expand the `users` resource, pass the `?expand=user` query. (optional) expand = # List[ExpandAccountGroupOptions] | Optional parameter that specifies whether or not account group related resources should be expanded. By default, no expansion takes place if the query parameter is not passed. For example, to expand the `users` resource, pass the `?expand=user` query. (optional)
try: try:
# Update account group # Update account group

View File

@ -49,7 +49,7 @@ configuration = thousandeyes_sdk.core.Configuration(
with thousandeyes_sdk.core.ApiClient(configuration) as api_client: with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.administrative.RolesApi(api_client) api_instance = thousandeyes_sdk.administrative.RolesApi(api_client)
role_request_body = thousandeyes_sdk.administrative.RoleRequestBody() # RoleRequestBody | role_request_body = # RoleRequestBody |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:
@ -390,7 +390,7 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.administrative.RolesApi(api_client) api_instance = thousandeyes_sdk.administrative.RolesApi(api_client)
id = '23' # str | The ID of the desired role. id = '23' # str | The ID of the desired role.
role_request_body = thousandeyes_sdk.administrative.RoleRequestBody() # RoleRequestBody | role_request_body = # RoleRequestBody |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:

View File

@ -50,7 +50,7 @@ configuration = thousandeyes_sdk.core.Configuration(
with thousandeyes_sdk.core.ApiClient(configuration) as api_client: with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.administrative.UsersApi(api_client) api_instance = thousandeyes_sdk.administrative.UsersApi(api_client)
user_request = thousandeyes_sdk.administrative.UserRequest() # UserRequest | user_request = # UserRequest |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:
@ -471,7 +471,7 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.administrative.UsersApi(api_client) api_instance = thousandeyes_sdk.administrative.UsersApi(api_client)
id = '1234' # str | Identifier for the user. id = '1234' # str | Identifier for the user.
user_request = thousandeyes_sdk.administrative.UserRequest() # UserRequest | user_request = # UserRequest |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:

View File

@ -0,0 +1,7 @@
import sys
from pathlib import Path
_repo_root = Path(__file__).resolve().parents[2]
_core_test_support = _repo_root / "thousandeyes-sdk-core" / "test"
if str(_core_test_support) not in sys.path:
sys.path.insert(0, str(_core_test_support))

View File

@ -0,0 +1,37 @@
# coding: utf-8
"""
Administrative API
Manage users, accounts, and account groups in the ThousandEyes platform using the Administrative API. This API provides the following operations to manage your organization: * `/account-groups`: Account groups are used to divide an organization into different sections. These operations can be used to create, retrieve, update and delete account groups. * `/users`: Create, retrieve, update and delete users within an organization. * `/roles`: Create, retrieve and update roles for the current user. * `/permissions`: Retrieve all assignable permissions. Used in the context of modifying roles. * `/audit-user-events`: Retrieve all activity log events. For more information about the administrative models, see [Account Management](https://docs.thousandeyes.com/product-documentation/user-management).
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import unittest
from thousandeyes_sdk.core.api_client import ApiClient
from thousandeyes_sdk.core.configuration import Configuration
from sdk_test_support.mock_server import ERROR_STATUS_HEADER, OPERATION_ID_HEADER, MockApiServer
from .mock_manifest import OPERATION_MANIFEST
class IntegrationTestBase(unittest.TestCase):
def setUp(self) -> None:
self.server = MockApiServer(OPERATION_MANIFEST)
self.server.start()
configuration = Configuration(host=self.server.base_url, access_token="test-token")
self.api_client = ApiClient(configuration=configuration)
def tearDown(self) -> None:
self.server.stop()
def te_headers(self, operation_id: str, error_status=None):
headers = {OPERATION_ID_HEADER: operation_id}
if error_status is not None:
headers[ERROR_STATUS_HEADER] = error_status
return headers

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,233 @@
# coding: utf-8
"""
Administrative API
Manage users, accounts, and account groups in the ThousandEyes platform using the Administrative API. This API provides the following operations to manage your organization: * `/account-groups`: Account groups are used to divide an organization into different sections. These operations can be used to create, retrieve, update and delete account groups. * `/users`: Create, retrieve, update and delete users within an organization. * `/roles`: Create, retrieve and update roles for the current user. * `/permissions`: Retrieve all assignable permissions. Used in the context of modifying roles. * `/audit-user-events`: Retrieve all activity log events. For more information about the administrative models, see [Account Management](https://docs.thousandeyes.com/product-documentation/user-management).
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import json
import unittest
import thousandeyes_sdk.administrative.models
from thousandeyes_sdk.core.exceptions import ApiException
from thousandeyes_sdk.administrative.api.permissions_api import PermissionsApi
from .integration_test_utils import IntegrationTestBase
from .test_utils import assert_constructed_model_matches_example_json
class TestPermissionsApiIntegration(IntegrationTestBase):
"""PermissionsApi integration test stubs"""
def setUp(self) -> None:
super().setUp()
self.api = PermissionsApi(self.api_client)
def test_get_permissions_happy_path(self) -> None:
"""Integration test for get_permissions success path"""
aid = '1234'
response_body_json = """
{
"_links" : {
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
},
"permissions" : [ {
"label" : "View reports",
"permissionId" : "1",
"isManagementPermission" : true,
"permission" : "REPORT_READ"
}, {
"label" : "View snapshots",
"permissionId" : "51",
"isManagementPermission" : false,
"permission" : "REPORT_SNAPSHOTS_READ"
} ]
}
"""
expected_response = json.loads(response_body_json)
response = self.api.get_permissions(
aid=aid,
_headers=self.te_headers("get_permissions"),
)
assert_constructed_model_matches_example_json(response, expected_response)
def test_get_permissions_error_400(self) -> None:
"""Integration test for get_permissions error path (HTTP 400)"""
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"errors" : [ {
"code" : "code",
"field" : "field",
"message" : "message"
}, {
"code" : "code",
"field" : "field",
"message" : "message"
} ],
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(400)
) as context:
self.api.get_permissions(
aid=aid,
_headers=self.te_headers("get_permissions", error_status="400"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_permissions_error_401(self) -> None:
"""Integration test for get_permissions error path (HTTP 401)"""
aid = '1234'
error_body_json = """
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(401)
) as context:
self.api.get_permissions(
aid=aid,
_headers=self.te_headers("get_permissions", error_status="401"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_permissions_error_403(self) -> None:
"""Integration test for get_permissions error path (HTTP 403)"""
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 6
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(403)
) as context:
self.api.get_permissions(
aid=aid,
_headers=self.te_headers("get_permissions", error_status="403"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_permissions_error_404(self) -> None:
"""Integration test for get_permissions error path (HTTP 404)"""
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 6
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(404)
) as context:
self.api.get_permissions(
aid=aid,
_headers=self.te_headers("get_permissions", error_status="404"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_permissions_error_429(self) -> None:
"""Integration test for get_permissions error path (HTTP 429)"""
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 6
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(429)
) as context:
self.api.get_permissions(
aid=aid,
_headers=self.te_headers("get_permissions", error_status="429"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_permissions_error_500(self) -> None:
"""Integration test for get_permissions error path (HTTP 500)"""
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 6
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(500)
) as context:
self.api.get_permissions(
aid=aid,
_headers=self.te_headers("get_permissions", error_status="500"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
if __name__ == '__main__':
unittest.main()

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,373 @@
# coding: utf-8
"""
Administrative API
Manage users, accounts, and account groups in the ThousandEyes platform using the Administrative API. This API provides the following operations to manage your organization: * `/account-groups`: Account groups are used to divide an organization into different sections. These operations can be used to create, retrieve, update and delete account groups. * `/users`: Create, retrieve, update and delete users within an organization. * `/roles`: Create, retrieve and update roles for the current user. * `/permissions`: Retrieve all assignable permissions. Used in the context of modifying roles. * `/audit-user-events`: Retrieve all activity log events. For more information about the administrative models, see [Account Management](https://docs.thousandeyes.com/product-documentation/user-management).
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import json
import unittest
import thousandeyes_sdk.administrative.models
from thousandeyes_sdk.core.exceptions import ApiException
from thousandeyes_sdk.administrative.api.user_events_api import UserEventsApi
from .integration_test_utils import IntegrationTestBase
from .test_utils import assert_constructed_model_matches_example_json
class TestUserEventsApiIntegration(IntegrationTestBase):
"""UserEventsApi integration test stubs"""
def setUp(self) -> None:
super().setUp()
self.api = UserEventsApi(self.api_client)
def test_get_user_events_happy_path(self) -> None:
"""Integration test for get_user_events success path"""
aid = '1234'
use_all_permitted_aids = False
window = '12h'
start_date = '2022-07-17T22:00:54Z'
end_date = '2022-07-18T22:00:54Z'
cursor = 'cursor_example'
response_body_json = """
{
"endDate" : "2022-07-18T22:00:54Z",
"_links" : {
"next" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
},
"previous" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
},
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
},
"auditEvents" : [ {
"accountGroupName" : "API Sandbox",
"aid" : "1234",
"date" : "2020-07-17T21:54:54Z",
"event" : "Report created.",
"ipAddress" : "99.128.0.0/11",
"uid" : "1234",
"user" : "API Sandbox User (noreply@thousandeyes.com)",
"resources" : [ {
"name" : "My New report",
"type" : "reportTitle"
}, {
"name" : "Other Report",
"type" : "testName"
} ]
}, {
"accountGroupName" : "API Sandbox",
"aid" : "1234",
"date" : "2020-07-17T22:00:54Z",
"event" : "Login failed.",
"ipAddress" : "99.128.0.0/11",
"uid" : "1234",
"user" : "API Sandbox User (noreply@thousandeyes.com)"
} ],
"startDate" : "2022-07-17T22:00:54Z"
}
"""
expected_response = json.loads(response_body_json)
response = self.api.get_user_events(
aid=aid,
use_all_permitted_aids=use_all_permitted_aids,
window=window,
start_date=start_date,
end_date=end_date,
cursor=cursor,
_headers=self.te_headers("get_user_events"),
)
assert_constructed_model_matches_example_json(response, expected_response)
def test_get_user_events_error_400(self) -> None:
"""Integration test for get_user_events error path (HTTP 400)"""
aid = '1234'
use_all_permitted_aids = False
window = '12h'
start_date = '2022-07-17T22:00:54Z'
end_date = '2022-07-18T22:00:54Z'
cursor = 'cursor_example'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"errors" : [ {
"code" : "code",
"field" : "field",
"message" : "message"
}, {
"code" : "code",
"field" : "field",
"message" : "message"
} ],
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(400)
) as context:
self.api.get_user_events(
aid=aid,
use_all_permitted_aids=use_all_permitted_aids,
window=window,
start_date=start_date,
end_date=end_date,
cursor=cursor,
_headers=self.te_headers("get_user_events", error_status="400"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_user_events_error_401(self) -> None:
"""Integration test for get_user_events error path (HTTP 401)"""
aid = '1234'
use_all_permitted_aids = False
window = '12h'
start_date = '2022-07-17T22:00:54Z'
end_date = '2022-07-18T22:00:54Z'
cursor = 'cursor_example'
error_body_json = """
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(401)
) as context:
self.api.get_user_events(
aid=aid,
use_all_permitted_aids=use_all_permitted_aids,
window=window,
start_date=start_date,
end_date=end_date,
cursor=cursor,
_headers=self.te_headers("get_user_events", error_status="401"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_user_events_error_403(self) -> None:
"""Integration test for get_user_events error path (HTTP 403)"""
aid = '1234'
use_all_permitted_aids = False
window = '12h'
start_date = '2022-07-17T22:00:54Z'
end_date = '2022-07-18T22:00:54Z'
cursor = 'cursor_example'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 6
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(403)
) as context:
self.api.get_user_events(
aid=aid,
use_all_permitted_aids=use_all_permitted_aids,
window=window,
start_date=start_date,
end_date=end_date,
cursor=cursor,
_headers=self.te_headers("get_user_events", error_status="403"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_user_events_error_404(self) -> None:
"""Integration test for get_user_events error path (HTTP 404)"""
aid = '1234'
use_all_permitted_aids = False
window = '12h'
start_date = '2022-07-17T22:00:54Z'
end_date = '2022-07-18T22:00:54Z'
cursor = 'cursor_example'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 6
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(404)
) as context:
self.api.get_user_events(
aid=aid,
use_all_permitted_aids=use_all_permitted_aids,
window=window,
start_date=start_date,
end_date=end_date,
cursor=cursor,
_headers=self.te_headers("get_user_events", error_status="404"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_user_events_error_429(self) -> None:
"""Integration test for get_user_events error path (HTTP 429)"""
aid = '1234'
use_all_permitted_aids = False
window = '12h'
start_date = '2022-07-17T22:00:54Z'
end_date = '2022-07-18T22:00:54Z'
cursor = 'cursor_example'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 6
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(429)
) as context:
self.api.get_user_events(
aid=aid,
use_all_permitted_aids=use_all_permitted_aids,
window=window,
start_date=start_date,
end_date=end_date,
cursor=cursor,
_headers=self.te_headers("get_user_events", error_status="429"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_user_events_error_500(self) -> None:
"""Integration test for get_user_events error path (HTTP 500)"""
aid = '1234'
use_all_permitted_aids = False
window = '12h'
start_date = '2022-07-17T22:00:54Z'
end_date = '2022-07-18T22:00:54Z'
cursor = 'cursor_example'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 6
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(500)
) as context:
self.api.get_user_events(
aid=aid,
use_all_permitted_aids=use_all_permitted_aids,
window=window,
start_date=start_date,
end_date=end_date,
cursor=cursor,
_headers=self.te_headers("get_user_events", error_status="500"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
if __name__ == '__main__':
unittest.main()

File diff suppressed because it is too large Load Diff

View File

@ -2,15 +2,36 @@
import json import json
import unittest import unittest
from typing import Any
from pydantic import BaseModel from pydantic import BaseModel
def _project_onto_constructed(expected: Any, constructed: Any) -> Any:
"""Keep only example fields that appear in the constructed model output."""
if isinstance(constructed, dict):
if not isinstance(expected, dict):
return expected
return {
key: _project_onto_constructed(expected.get(key), value)
for key, value in constructed.items()
}
if isinstance(constructed, list):
if not isinstance(expected, list):
return expected
return [
_project_onto_constructed(expected[index], value)
for index, value in enumerate(constructed)
]
return expected
def assert_constructed_model_matches_example_json(model: BaseModel, loaded_json: dict): def assert_constructed_model_matches_example_json(model: BaseModel, loaded_json: dict):
test_case = unittest.TestCase() test_case = unittest.TestCase()
test_case.maxDiff = None test_case.maxDiff = None
test_case.assertIsNotNone(model) test_case.assertIsNotNone(model)
constructed_json = json.loads(model.to_json()) constructed_json = json.loads(model.to_json())
sorted_loaded_json = json.dumps(loaded_json, sort_keys=True) projected_loaded_json = _project_onto_constructed(loaded_json, constructed_json)
sorted_loaded_json = json.dumps(projected_loaded_json, sort_keys=True)
sorted_constructed_json = json.dumps(constructed_json, sort_keys=True) sorted_constructed_json = json.dumps(constructed_json, sort_keys=True)
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json) test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)

View File

@ -140,10 +140,19 @@ src/thousandeyes_sdk/agents/models/validation_error.py
src/thousandeyes_sdk/agents/models/validation_error_item.py src/thousandeyes_sdk/agents/models/validation_error_item.py
src/thousandeyes_sdk/agents/py.typed src/thousandeyes_sdk/agents/py.typed
test/__init__.py test/__init__.py
test/conftest.py
test/integration_test_utils.py
test/mock_manifest.py
test/test_agent_proxies_api.py test/test_agent_proxies_api.py
test/test_agent_proxies_api_integration.py
test/test_cloud_and_enterprise_agent_notification_rules_api.py test/test_cloud_and_enterprise_agent_notification_rules_api.py
test/test_cloud_and_enterprise_agent_notification_rules_api_integration.py
test/test_cloud_and_enterprise_agents_api.py test/test_cloud_and_enterprise_agents_api.py
test/test_cloud_and_enterprise_agents_api_integration.py
test/test_enterprise_agent_cluster_api.py test/test_enterprise_agent_cluster_api.py
test/test_enterprise_agent_cluster_api_integration.py
test/test_local_problems_api.py test/test_local_problems_api.py
test/test_local_problems_api_integration.py
test/test_tests_assignment_on_agents_api.py test/test_tests_assignment_on_agents_api.py
test/test_tests_assignment_on_agents_api_integration.py
test/test_utils.py test/test_utils.py

View File

@ -5,7 +5,7 @@ Manage Cloud and Enterprise Agents available to your account in ThousandEyes.
This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
- API version: 7.0.96 - API version: 7.0.97
- Generator version: 7.6.0 - Generator version: 7.6.0
- Build package: com.thousandeyes.api.codegen.ThousandeyesPythonGenerator - Build package: com.thousandeyes.api.codegen.ThousandeyesPythonGenerator

View File

@ -134,7 +134,7 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
api_instance = thousandeyes_sdk.agents.CloudAndEnterpriseAgentsApi(api_client) api_instance = thousandeyes_sdk.agents.CloudAndEnterpriseAgentsApi(api_client)
agent_id = '281474976710706' # str | Unique ID for the agent. agent_id = '281474976710706' # str | Unique ID for the agent.
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
expand = [thousandeyes_sdk.agents.AgentDetailsExpand()] # List[AgentDetailsExpand] | Optional parameter, off by default. Indicates which agent sub-resource to expand. For example, if you wish to expand the `clusterMembers` sub-resource, pass the `?expand=cluster-member` query. (optional) expand = # List[AgentDetailsExpand] | Optional parameter, off by default. Indicates which agent sub-resource to expand. For example, if you wish to expand the `clusterMembers` sub-resource, pass the `?expand=cluster-member` query. (optional)
try: try:
# Retrieve Cloud and Enterprise Agent # Retrieve Cloud and Enterprise Agent
@ -224,8 +224,8 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.agents.CloudAndEnterpriseAgentsApi(api_client) api_instance = thousandeyes_sdk.agents.CloudAndEnterpriseAgentsApi(api_client)
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
expand = [thousandeyes_sdk.agents.AgentListExpand()] # List[AgentListExpand] | Optional parameter, off by default. Indicates which agent sub-resource to expand. For example, if you wish to expand the `clusterMembers` sub-resource, pass the `?expand=cluster-member` query. (optional) expand = # List[AgentListExpand] | Optional parameter, off by default. Indicates which agent sub-resource to expand. For example, if you wish to expand the `clusterMembers` sub-resource, pass the `?expand=cluster-member` query. (optional)
agent_types = [thousandeyes_sdk.agents.CloudEnterpriseAgentType()] # List[CloudEnterpriseAgentType] | Specifies the type of agent to request. (optional) agent_types = # List[CloudEnterpriseAgentType] | Specifies the type of agent to request. (optional)
labels = ['[\"myCustomLabeledAgent\"]'] # List[str] | Specifies the labels of the agents to request. (optional) labels = ['[\"myCustomLabeledAgent\"]'] # List[str] | Specifies the labels of the agents to request. (optional)
tag_keys = ['tag_keys_example'] # List[str] | Specifies which tag keys to request from the agents. (optional) tag_keys = ['tag_keys_example'] # List[str] | Specifies which tag keys to request from the agents. (optional)
@ -319,9 +319,9 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.agents.CloudAndEnterpriseAgentsApi(api_client) api_instance = thousandeyes_sdk.agents.CloudAndEnterpriseAgentsApi(api_client)
agent_id = '281474976710706' # str | Unique ID for the agent. agent_id = '281474976710706' # str | Unique ID for the agent.
agent_request = thousandeyes_sdk.agents.AgentRequest() # AgentRequest | agent_request = # AgentRequest |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
expand = [thousandeyes_sdk.agents.AgentDetailsExpand()] # List[AgentDetailsExpand] | Optional parameter, off by default. Indicates which agent sub-resource to expand. For example, if you wish to expand the `clusterMembers` sub-resource, pass the `?expand=cluster-member` query. (optional) expand = # List[AgentDetailsExpand] | Optional parameter, off by default. Indicates which agent sub-resource to expand. For example, if you wish to expand the `clusterMembers` sub-resource, pass the `?expand=cluster-member` query. (optional)
try: try:
# Update Enterprise Agent # Update Enterprise Agent

View File

@ -48,9 +48,9 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.agents.EnterpriseAgentClusterApi(api_client) api_instance = thousandeyes_sdk.agents.EnterpriseAgentClusterApi(api_client)
agent_id = '281474976710706' # str | Unique ID for the Enterprise Agent cluster to add new agents to. agent_id = '281474976710706' # str | Unique ID for the Enterprise Agent cluster to add new agents to.
agent_cluster_assign_request = thousandeyes_sdk.agents.AgentClusterAssignRequest() # AgentClusterAssignRequest | agent_cluster_assign_request = # AgentClusterAssignRequest |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
expand = [thousandeyes_sdk.agents.AgentDetailsExpand()] # List[AgentDetailsExpand] | Optional parameter, off by default. Indicates which agent sub-resource to expand. For example, if you wish to expand the `clusterMembers` sub-resource, pass the `?expand=cluster-member` query. (optional) expand = # List[AgentDetailsExpand] | Optional parameter, off by default. Indicates which agent sub-resource to expand. For example, if you wish to expand the `clusterMembers` sub-resource, pass the `?expand=cluster-member` query. (optional)
try: try:
# Add member to Enterprise Agent cluster # Add member to Enterprise Agent cluster
@ -142,9 +142,9 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.agents.EnterpriseAgentClusterApi(api_client) api_instance = thousandeyes_sdk.agents.EnterpriseAgentClusterApi(api_client)
agent_id = '281474976710706' # str | Unique ID for the Enterprise Agent cluster to remove agents from. agent_id = '281474976710706' # str | Unique ID for the Enterprise Agent cluster to remove agents from.
agent_cluster_unassign_request = thousandeyes_sdk.agents.AgentClusterUnassignRequest() # AgentClusterUnassignRequest | agent_cluster_unassign_request = # AgentClusterUnassignRequest |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
expand = [thousandeyes_sdk.agents.AgentDetailsExpand()] # List[AgentDetailsExpand] | Optional parameter, off by default. Indicates which agent sub-resource to expand. For example, if you wish to expand the `clusterMembers` sub-resource, pass the `?expand=cluster-member` query. (optional) expand = # List[AgentDetailsExpand] | Optional parameter, off by default. Indicates which agent sub-resource to expand. For example, if you wish to expand the `clusterMembers` sub-resource, pass the `?expand=cluster-member` query. (optional)
try: try:
# Remove member from Enterprise Agent cluster # Remove member from Enterprise Agent cluster

View File

@ -48,7 +48,7 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.agents.TestsAssignmentOnAgentsApi(api_client) api_instance = thousandeyes_sdk.agents.TestsAssignmentOnAgentsApi(api_client)
agent_id = '281474976710706' # str | Unique ID for the Enterprise Agent cluster to add new agents to. agent_id = '281474976710706' # str | Unique ID for the Enterprise Agent cluster to add new agents to.
agent_tests_assign_request = thousandeyes_sdk.agents.AgentTestsAssignRequest() # AgentTestsAssignRequest | agent_tests_assign_request = # AgentTestsAssignRequest |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:
@ -139,7 +139,7 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.agents.TestsAssignmentOnAgentsApi(api_client) api_instance = thousandeyes_sdk.agents.TestsAssignmentOnAgentsApi(api_client)
agent_id = '281474976710706' # str | Unique ID for the Enterprise Agent cluster to add new agents to. agent_id = '281474976710706' # str | Unique ID for the Enterprise Agent cluster to add new agents to.
agent_tests_assign_request = thousandeyes_sdk.agents.AgentTestsAssignRequest() # AgentTestsAssignRequest | agent_tests_assign_request = # AgentTestsAssignRequest |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:
@ -230,7 +230,7 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.agents.TestsAssignmentOnAgentsApi(api_client) api_instance = thousandeyes_sdk.agents.TestsAssignmentOnAgentsApi(api_client)
agent_id = '281474976710706' # str | Unique ID for the Enterprise Agent cluster to add new agents to. agent_id = '281474976710706' # str | Unique ID for the Enterprise Agent cluster to add new agents to.
agent_tests_assign_request = thousandeyes_sdk.agents.AgentTestsAssignRequest() # AgentTestsAssignRequest | agent_tests_assign_request = # AgentTestsAssignRequest |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:

View File

@ -0,0 +1,7 @@
import sys
from pathlib import Path
_repo_root = Path(__file__).resolve().parents[2]
_core_test_support = _repo_root / "thousandeyes-sdk-core" / "test"
if str(_core_test_support) not in sys.path:
sys.path.insert(0, str(_core_test_support))

View File

@ -0,0 +1,37 @@
# coding: utf-8
"""
Agents API
## Overview Manage Cloud and Enterprise Agents available to your account in ThousandEyes.
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import unittest
from thousandeyes_sdk.core.api_client import ApiClient
from thousandeyes_sdk.core.configuration import Configuration
from sdk_test_support.mock_server import ERROR_STATUS_HEADER, OPERATION_ID_HEADER, MockApiServer
from .mock_manifest import OPERATION_MANIFEST
class IntegrationTestBase(unittest.TestCase):
def setUp(self) -> None:
self.server = MockApiServer(OPERATION_MANIFEST)
self.server.start()
configuration = Configuration(host=self.server.base_url, access_token="test-token")
self.api_client = ApiClient(configuration=configuration)
def tearDown(self) -> None:
self.server.stop()
def te_headers(self, operation_id: str, error_status=None):
headers = {OPERATION_ID_HEADER: operation_id}
if error_status is not None:
headers[ERROR_STATUS_HEADER] = error_status
return headers

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,238 @@
# coding: utf-8
"""
Agents API
## Overview Manage Cloud and Enterprise Agents available to your account in ThousandEyes.
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import json
import unittest
import thousandeyes_sdk.agents.models
from thousandeyes_sdk.core.exceptions import ApiException
from thousandeyes_sdk.agents.api.agent_proxies_api import AgentProxiesApi
from .integration_test_utils import IntegrationTestBase
from .test_utils import assert_constructed_model_matches_example_json
class TestAgentProxiesApiIntegration(IntegrationTestBase):
"""AgentProxiesApi integration test stubs"""
def setUp(self) -> None:
super().setUp()
self.api = AgentProxiesApi(self.api_client)
def test_get_agents_proxies_happy_path(self) -> None:
"""Integration test for get_agents_proxies success path"""
aid = '1234'
response_body_json = """
{
"_links" : {
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
},
"agentProxies" : [ {
"password" : "**********",
"isLocalConfigured" : true,
"name" : "Test Proxy - Auth Type - BASIC",
"location" : "proxy.thousandeyes.com:3128",
"lastModified" : "2022-07-17T22:00:54Z",
"authType" : "basic",
"type" : "static",
"aid" : "1234",
"bypassList" : [ "10.0.0.0/16", "*.thousandeyes.com" ],
"user" : "user1",
"proxyId" : "281474976710706"
}, {
"password" : "**********",
"isLocalConfigured" : true,
"name" : "Test Proxy - Auth Type - BASIC",
"location" : "proxy.thousandeyes.com:3128",
"lastModified" : "2022-07-17T22:00:54Z",
"authType" : "basic",
"type" : "static",
"aid" : "1234",
"bypassList" : [ "10.0.0.0/16", "*.thousandeyes.com" ],
"user" : "user1",
"proxyId" : "281474976710706"
} ]
}
"""
expected_response = json.loads(response_body_json)
response = self.api.get_agents_proxies(
aid=aid,
_headers=self.te_headers("get_agents_proxies"),
)
assert_constructed_model_matches_example_json(response, expected_response)
def test_get_agents_proxies_error_401(self) -> None:
"""Integration test for get_agents_proxies error path (HTTP 401)"""
aid = '1234'
error_body_json = """
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(401)
) as context:
self.api.get_agents_proxies(
aid=aid,
_headers=self.te_headers("get_agents_proxies", error_status="401"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_agents_proxies_error_403(self) -> None:
"""Integration test for get_agents_proxies error path (HTTP 403)"""
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(403)
) as context:
self.api.get_agents_proxies(
aid=aid,
_headers=self.te_headers("get_agents_proxies", error_status="403"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_agents_proxies_error_404(self) -> None:
"""Integration test for get_agents_proxies error path (HTTP 404)"""
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(404)
) as context:
self.api.get_agents_proxies(
aid=aid,
_headers=self.te_headers("get_agents_proxies", error_status="404"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_agents_proxies_error_429(self) -> None:
"""Integration test for get_agents_proxies error path (HTTP 429)"""
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(429)
) as context:
self.api.get_agents_proxies(
aid=aid,
_headers=self.te_headers("get_agents_proxies", error_status="429"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_agents_proxies_error_500(self) -> None:
"""Integration test for get_agents_proxies error path (HTTP 500)"""
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(500)
) as context:
self.api.get_agents_proxies(
aid=aid,
_headers=self.te_headers("get_agents_proxies", error_status="500"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_agents_proxies_error_502(self) -> None:
"""Integration test for get_agents_proxies error path (HTTP 502)"""
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(502)
) as context:
self.api.get_agents_proxies(
aid=aid,
_headers=self.te_headers("get_agents_proxies", error_status="502"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
if __name__ == '__main__':
unittest.main()

View File

@ -0,0 +1,517 @@
# coding: utf-8
"""
Agents API
## Overview Manage Cloud and Enterprise Agents available to your account in ThousandEyes.
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import json
import unittest
import thousandeyes_sdk.agents.models
from thousandeyes_sdk.core.exceptions import ApiException
from thousandeyes_sdk.agents.api.cloud_and_enterprise_agent_notification_rules_api import CloudAndEnterpriseAgentNotificationRulesApi
from .integration_test_utils import IntegrationTestBase
from .test_utils import assert_constructed_model_matches_example_json
class TestCloudAndEnterpriseAgentNotificationRulesApiIntegration(IntegrationTestBase):
"""CloudAndEnterpriseAgentNotificationRulesApi integration test stubs"""
def setUp(self) -> None:
super().setUp()
self.api = CloudAndEnterpriseAgentNotificationRulesApi(self.api_client)
def test_get_agents_notification_rule_happy_path(self) -> None:
"""Integration test for get_agents_notification_rule success path"""
notification_rule_id = '281474976710706'
aid = '1234'
response_body_json = """
{
"isDefault" : false,
"expression" : "((lastContact >= 30 min))",
"_links" : {
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
},
"ruleName" : "Default Agent Offline Notification",
"ruleId" : "281474976710706",
"notifications" : {
"thirdParty" : [ {
"integrationType" : "slack",
"integrationName" : "integrationSlack1",
"authToken" : "0VqDYEpidpHVAK397x8PBsmZ",
"channel" : "#slackChannel",
"integrationId" : "wb-78",
"authMethod" : "Basic",
"authUser" : "user123",
"target" : "https://hooks.slack.com/services/asd/0VqDYEpidpHVAK397x8PBsmZ"
}, {
"integrationType" : "slack",
"integrationName" : "integrationSlack1",
"authToken" : "0VqDYEpidpHVAK397x8PBsmZ",
"channel" : "#slackChannel",
"integrationId" : "wb-78",
"authMethod" : "Basic",
"authUser" : "user123",
"target" : "https://hooks.slack.com/services/asd/0VqDYEpidpHVAK397x8PBsmZ"
} ],
"webhook" : [ {
"integrationType" : "slack",
"integrationName" : "integrationSlack1",
"authToken" : "0VqDYEpidpHVAK397x8PBsmZ",
"channel" : "#slackChannel",
"integrationId" : "wb-78",
"authMethod" : "Basic",
"authUser" : "user123",
"target" : "https://hooks.slack.com/services/asd/0VqDYEpidpHVAK397x8PBsmZ"
}, {
"integrationType" : "slack",
"integrationName" : "integrationSlack1",
"authToken" : "0VqDYEpidpHVAK397x8PBsmZ",
"channel" : "#slackChannel",
"integrationId" : "wb-78",
"authMethod" : "Basic",
"authUser" : "user123",
"target" : "https://hooks.slack.com/services/asd/0VqDYEpidpHVAK397x8PBsmZ"
} ],
"email" : {
"recipients" : [ "user1@thousandeyes.com", "user2@cisco.com" ],
"message" : "This test is failing, check as soon as possible."
}
},
"notifyOnClear" : true,
"agents" : [ {
"agentId" : "281474976710706",
"agentType" : "enterprise-cluster",
"prefix" : "99.128.0.0/11",
"coordinates" : {
"latitude" : 37.77493,
"longitude" : -122.41942
},
"agentName" : "thousandeyes-stg-va-254",
"networkProviderInfo" : {
"asn" : 7018,
"name" : "AT&T Services, Inc.",
"type" : "isp"
},
"countryId" : "US",
"enabled" : true,
"network" : "AT&T Services, Inc. (AS 7018)",
"publicIpAddresses" : [ "192.168.1.78", "f9b2:3a21:f25c:d300:03f4:586d:f8d6:4e1c" ],
"ipAddresses" : [ "99.139.65.220", "9bbd:8a0a:a257:5876:288b:6cb2:3f36:64ce" ],
"location" : "San Francisco Bay Area",
"verifySslCertificates" : true
}, {
"agentId" : "281474976710706",
"agentType" : "enterprise-cluster",
"prefix" : "99.128.0.0/11",
"coordinates" : {
"latitude" : 37.77493,
"longitude" : -122.41942
},
"agentName" : "thousandeyes-stg-va-254",
"networkProviderInfo" : {
"asn" : 7018,
"name" : "AT&T Services, Inc.",
"type" : "isp"
},
"countryId" : "US",
"enabled" : true,
"network" : "AT&T Services, Inc. (AS 7018)",
"publicIpAddresses" : [ "192.168.1.78", "f9b2:3a21:f25c:d300:03f4:586d:f8d6:4e1c" ],
"ipAddresses" : [ "99.139.65.220", "9bbd:8a0a:a257:5876:288b:6cb2:3f36:64ce" ],
"location" : "San Francisco Bay Area",
"verifySslCertificates" : true
} ]
}
"""
expected_response = json.loads(response_body_json)
response = self.api.get_agents_notification_rule(
notification_rule_id=notification_rule_id,
aid=aid,
_headers=self.te_headers("get_agents_notification_rule"),
)
assert_constructed_model_matches_example_json(response, expected_response)
def test_get_agents_notification_rule_error_401(self) -> None:
"""Integration test for get_agents_notification_rule error path (HTTP 401)"""
notification_rule_id = '281474976710706'
aid = '1234'
error_body_json = """
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(401)
) as context:
self.api.get_agents_notification_rule(
notification_rule_id=notification_rule_id,
aid=aid,
_headers=self.te_headers("get_agents_notification_rule", error_status="401"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_agents_notification_rule_error_403(self) -> None:
"""Integration test for get_agents_notification_rule error path (HTTP 403)"""
notification_rule_id = '281474976710706'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(403)
) as context:
self.api.get_agents_notification_rule(
notification_rule_id=notification_rule_id,
aid=aid,
_headers=self.te_headers("get_agents_notification_rule", error_status="403"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_agents_notification_rule_error_404(self) -> None:
"""Integration test for get_agents_notification_rule error path (HTTP 404)"""
notification_rule_id = '281474976710706'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(404)
) as context:
self.api.get_agents_notification_rule(
notification_rule_id=notification_rule_id,
aid=aid,
_headers=self.te_headers("get_agents_notification_rule", error_status="404"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_agents_notification_rule_error_429(self) -> None:
"""Integration test for get_agents_notification_rule error path (HTTP 429)"""
notification_rule_id = '281474976710706'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(429)
) as context:
self.api.get_agents_notification_rule(
notification_rule_id=notification_rule_id,
aid=aid,
_headers=self.te_headers("get_agents_notification_rule", error_status="429"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_agents_notification_rule_error_500(self) -> None:
"""Integration test for get_agents_notification_rule error path (HTTP 500)"""
notification_rule_id = '281474976710706'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(500)
) as context:
self.api.get_agents_notification_rule(
notification_rule_id=notification_rule_id,
aid=aid,
_headers=self.te_headers("get_agents_notification_rule", error_status="500"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_agents_notification_rule_error_502(self) -> None:
"""Integration test for get_agents_notification_rule error path (HTTP 502)"""
notification_rule_id = '281474976710706'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(502)
) as context:
self.api.get_agents_notification_rule(
notification_rule_id=notification_rule_id,
aid=aid,
_headers=self.te_headers("get_agents_notification_rule", error_status="502"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_agents_notification_rules_happy_path(self) -> None:
"""Integration test for get_agents_notification_rules success path"""
aid = '1234'
response_body_json = """
{
"agentAlertRules" : [ {
"ruleId" : "281474976710706",
"ruleName" : "Default Agent Offline Notification",
"expression" : "((lastContact >= 30 min))",
"notifyOnClear" : true,
"isDefault" : false
}, {
"ruleId" : "281474976710709",
"ruleName" : "Test Rule",
"expression" : "((lastContact >= 40 min))",
"notifyOnClear" : true,
"isDefault" : true
} ],
"_links" : {
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
}
}
"""
expected_response = json.loads(response_body_json)
response = self.api.get_agents_notification_rules(
aid=aid,
_headers=self.te_headers("get_agents_notification_rules"),
)
assert_constructed_model_matches_example_json(response, expected_response)
def test_get_agents_notification_rules_error_401(self) -> None:
"""Integration test for get_agents_notification_rules error path (HTTP 401)"""
aid = '1234'
error_body_json = """
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(401)
) as context:
self.api.get_agents_notification_rules(
aid=aid,
_headers=self.te_headers("get_agents_notification_rules", error_status="401"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_agents_notification_rules_error_403(self) -> None:
"""Integration test for get_agents_notification_rules error path (HTTP 403)"""
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(403)
) as context:
self.api.get_agents_notification_rules(
aid=aid,
_headers=self.te_headers("get_agents_notification_rules", error_status="403"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_agents_notification_rules_error_404(self) -> None:
"""Integration test for get_agents_notification_rules error path (HTTP 404)"""
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(404)
) as context:
self.api.get_agents_notification_rules(
aid=aid,
_headers=self.te_headers("get_agents_notification_rules", error_status="404"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_agents_notification_rules_error_429(self) -> None:
"""Integration test for get_agents_notification_rules error path (HTTP 429)"""
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(429)
) as context:
self.api.get_agents_notification_rules(
aid=aid,
_headers=self.te_headers("get_agents_notification_rules", error_status="429"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_agents_notification_rules_error_500(self) -> None:
"""Integration test for get_agents_notification_rules error path (HTTP 500)"""
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(500)
) as context:
self.api.get_agents_notification_rules(
aid=aid,
_headers=self.te_headers("get_agents_notification_rules", error_status="500"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_agents_notification_rules_error_502(self) -> None:
"""Integration test for get_agents_notification_rules error path (HTTP 502)"""
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(502)
) as context:
self.api.get_agents_notification_rules(
aid=aid,
_headers=self.te_headers("get_agents_notification_rules", error_status="502"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
if __name__ == '__main__':
unittest.main()

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,809 @@
# coding: utf-8
"""
Agents API
## Overview Manage Cloud and Enterprise Agents available to your account in ThousandEyes.
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import json
import unittest
import thousandeyes_sdk.agents.models
from thousandeyes_sdk.core.exceptions import ApiException
from thousandeyes_sdk.agents.api.enterprise_agent_cluster_api import EnterpriseAgentClusterApi
from .integration_test_utils import IntegrationTestBase
from .test_utils import assert_constructed_model_matches_example_json
class TestEnterpriseAgentClusterApiIntegration(IntegrationTestBase):
"""EnterpriseAgentClusterApi integration test stubs"""
def setUp(self) -> None:
super().setUp()
self.api = EnterpriseAgentClusterApi(self.api_client)
def test_assign_agent_to_cluster_happy_path(self) -> None:
"""Integration test for assign_agent_to_cluster success path"""
request_body_json = """
{
"agents" : [ "281474976710706" ]
}
"""
agent_cluster_assign_request = thousandeyes_sdk.agents.models.AgentClusterAssignRequest.from_json(request_body_json)
agent_id = '281474976710706'
aid = '1234'
response_body_json = """
{
"agentId" : "281474976710706",
"agentType" : "cloud",
"_links" : {
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
},
"prefix" : "99.128.0.0/11",
"coordinates" : {
"latitude" : 37.77493,
"longitude" : -122.41942
},
"agentName" : "thousandeyes-stg-va-254",
"networkProviderInfo" : {
"asn" : 7018,
"name" : "AT&T Services, Inc.",
"type" : "isp"
},
"countryId" : "US",
"enabled" : true,
"network" : "AT&T Services, Inc. (AS 7018)",
"labels" : [ {
"labelId" : "11",
"name" : "Label name"
}, {
"labelId" : "11",
"name" : "Label name"
} ],
"tags" : [ {
"id" : "5aeab5d5-0d34-4d44-a7ac-fb440185295c",
"value" : "San Francisco",
"key" : "Location"
}, {
"id" : "5aeab5d5-0d34-4d44-a7ac-fb440185295c",
"value" : "San Francisco",
"key" : "Location"
} ],
"tests" : [ {
"_links" : {
"testResults" : [ {
"href" : "https://api.thousandeyes.com/v7/test-results/281474976710706/network"
}, {
"href" : "https://api.thousandeyes.com/v7/test-results/281474976710706/path-vis"
} ],
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
},
"liveShare" : false,
"savedEvent" : true,
"description" : "ThousandEyes Test",
"type" : "agent-to-server",
"enabled" : true,
"createdDate" : "2022-07-17T22:00:54Z",
"createdBy" : "user@user.com",
"modifiedDate" : "2022-07-17T22:00:54Z",
"interval" : 60,
"modifiedBy" : "user@user.com",
"testId" : "281474976710706",
"alertsEnabled" : true,
"testName" : "ThousandEyes Test"
}, {
"_links" : {
"testResults" : [ {
"href" : "https://api.thousandeyes.com/v7/test-results/281474976710706/network"
}, {
"href" : "https://api.thousandeyes.com/v7/test-results/281474976710706/path-vis"
} ],
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
},
"liveShare" : false,
"savedEvent" : true,
"description" : "ThousandEyes Test",
"type" : "agent-to-server",
"enabled" : true,
"createdDate" : "2022-07-17T22:00:54Z",
"createdBy" : "user@user.com",
"modifiedDate" : "2022-07-17T22:00:54Z",
"interval" : 60,
"modifiedBy" : "user@user.com",
"testId" : "281474976710706",
"alertsEnabled" : true,
"testName" : "ThousandEyes Test"
} ],
"publicIpAddresses" : [ "192.168.1.78", "f9b2:3a21:f25c:d300:03f4:586d:f8d6:4e1c" ],
"ipAddresses" : [ "99.139.65.220", "9bbd:8a0a:a257:5876:288b:6cb2:3f36:64ce" ],
"location" : "San Francisco Bay Area",
"verifySslCertificates" : true
}
"""
expected_response = json.loads(response_body_json)
response = self.api.assign_agent_to_cluster(
agent_id=agent_id,
agent_cluster_assign_request=agent_cluster_assign_request,
aid=aid,
_headers=self.te_headers("assign_agent_to_cluster"),
)
assert_constructed_model_matches_example_json(response, expected_response)
def test_assign_agent_to_cluster_error_400(self) -> None:
"""Integration test for assign_agent_to_cluster error path (HTTP 400)"""
request_body_json = """
{
"agents" : [ "281474976710706" ]
}
"""
agent_cluster_assign_request = thousandeyes_sdk.agents.models.AgentClusterAssignRequest.from_json(request_body_json)
agent_id = '281474976710706'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"errors" : [ {
"code" : "code",
"field" : "field",
"message" : "message"
}, {
"code" : "code",
"field" : "field",
"message" : "message"
} ],
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(400)
) as context:
self.api.assign_agent_to_cluster(
agent_id=agent_id,
agent_cluster_assign_request=agent_cluster_assign_request,
aid=aid,
_headers=self.te_headers("assign_agent_to_cluster", error_status="400"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_assign_agent_to_cluster_error_401(self) -> None:
"""Integration test for assign_agent_to_cluster error path (HTTP 401)"""
request_body_json = """
{
"agents" : [ "281474976710706" ]
}
"""
agent_cluster_assign_request = thousandeyes_sdk.agents.models.AgentClusterAssignRequest.from_json(request_body_json)
agent_id = '281474976710706'
aid = '1234'
error_body_json = """
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(401)
) as context:
self.api.assign_agent_to_cluster(
agent_id=agent_id,
agent_cluster_assign_request=agent_cluster_assign_request,
aid=aid,
_headers=self.te_headers("assign_agent_to_cluster", error_status="401"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_assign_agent_to_cluster_error_403(self) -> None:
"""Integration test for assign_agent_to_cluster error path (HTTP 403)"""
request_body_json = """
{
"agents" : [ "281474976710706" ]
}
"""
agent_cluster_assign_request = thousandeyes_sdk.agents.models.AgentClusterAssignRequest.from_json(request_body_json)
agent_id = '281474976710706'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(403)
) as context:
self.api.assign_agent_to_cluster(
agent_id=agent_id,
agent_cluster_assign_request=agent_cluster_assign_request,
aid=aid,
_headers=self.te_headers("assign_agent_to_cluster", error_status="403"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_assign_agent_to_cluster_error_404(self) -> None:
"""Integration test for assign_agent_to_cluster error path (HTTP 404)"""
request_body_json = """
{
"agents" : [ "281474976710706" ]
}
"""
agent_cluster_assign_request = thousandeyes_sdk.agents.models.AgentClusterAssignRequest.from_json(request_body_json)
agent_id = '281474976710706'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(404)
) as context:
self.api.assign_agent_to_cluster(
agent_id=agent_id,
agent_cluster_assign_request=agent_cluster_assign_request,
aid=aid,
_headers=self.te_headers("assign_agent_to_cluster", error_status="404"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_assign_agent_to_cluster_error_429(self) -> None:
"""Integration test for assign_agent_to_cluster error path (HTTP 429)"""
request_body_json = """
{
"agents" : [ "281474976710706" ]
}
"""
agent_cluster_assign_request = thousandeyes_sdk.agents.models.AgentClusterAssignRequest.from_json(request_body_json)
agent_id = '281474976710706'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(429)
) as context:
self.api.assign_agent_to_cluster(
agent_id=agent_id,
agent_cluster_assign_request=agent_cluster_assign_request,
aid=aid,
_headers=self.te_headers("assign_agent_to_cluster", error_status="429"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_assign_agent_to_cluster_error_500(self) -> None:
"""Integration test for assign_agent_to_cluster error path (HTTP 500)"""
request_body_json = """
{
"agents" : [ "281474976710706" ]
}
"""
agent_cluster_assign_request = thousandeyes_sdk.agents.models.AgentClusterAssignRequest.from_json(request_body_json)
agent_id = '281474976710706'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(500)
) as context:
self.api.assign_agent_to_cluster(
agent_id=agent_id,
agent_cluster_assign_request=agent_cluster_assign_request,
aid=aid,
_headers=self.te_headers("assign_agent_to_cluster", error_status="500"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_assign_agent_to_cluster_error_502(self) -> None:
"""Integration test for assign_agent_to_cluster error path (HTTP 502)"""
request_body_json = """
{
"agents" : [ "281474976710706" ]
}
"""
agent_cluster_assign_request = thousandeyes_sdk.agents.models.AgentClusterAssignRequest.from_json(request_body_json)
agent_id = '281474976710706'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(502)
) as context:
self.api.assign_agent_to_cluster(
agent_id=agent_id,
agent_cluster_assign_request=agent_cluster_assign_request,
aid=aid,
_headers=self.te_headers("assign_agent_to_cluster", error_status="502"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_unassign_agent_from_cluster_happy_path(self) -> None:
"""Integration test for unassign_agent_from_cluster success path"""
request_body_json = """
{
"members" : [ "281474976710706" ]
}
"""
agent_cluster_unassign_request = thousandeyes_sdk.agents.models.AgentClusterUnassignRequest.from_json(request_body_json)
agent_id = '281474976710706'
aid = '1234'
response_body_json = """
{
"_links" : {
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
},
"agents" : [ {
"agentId" : "281474976710706",
"agentType" : "enterprise-cluster",
"prefix" : "99.128.0.0/11",
"coordinates" : {
"latitude" : 37.77493,
"longitude" : -122.41942
},
"agentName" : "thousandeyes-stg-va-254",
"networkProviderInfo" : {
"asn" : 7018,
"name" : "AT&T Services, Inc.",
"type" : "isp"
},
"countryId" : "US",
"enabled" : true,
"network" : "AT&T Services, Inc. (AS 7018)",
"publicIpAddresses" : [ "192.168.1.78", "f9b2:3a21:f25c:d300:03f4:586d:f8d6:4e1c" ],
"ipAddresses" : [ "99.139.65.220", "9bbd:8a0a:a257:5876:288b:6cb2:3f36:64ce" ],
"location" : "San Francisco Bay Area",
"verifySslCertificates" : true
}, {
"agentId" : "281474976710706",
"agentType" : "enterprise-cluster",
"prefix" : "99.128.0.0/11",
"coordinates" : {
"latitude" : 37.77493,
"longitude" : -122.41942
},
"agentName" : "thousandeyes-stg-va-254",
"networkProviderInfo" : {
"asn" : 7018,
"name" : "AT&T Services, Inc.",
"type" : "isp"
},
"countryId" : "US",
"enabled" : true,
"network" : "AT&T Services, Inc. (AS 7018)",
"publicIpAddresses" : [ "192.168.1.78", "f9b2:3a21:f25c:d300:03f4:586d:f8d6:4e1c" ],
"ipAddresses" : [ "99.139.65.220", "9bbd:8a0a:a257:5876:288b:6cb2:3f36:64ce" ],
"location" : "San Francisco Bay Area",
"verifySslCertificates" : true
} ]
}
"""
expected_response = json.loads(response_body_json)
response = self.api.unassign_agent_from_cluster(
agent_id=agent_id,
agent_cluster_unassign_request=agent_cluster_unassign_request,
aid=aid,
_headers=self.te_headers("unassign_agent_from_cluster"),
)
assert_constructed_model_matches_example_json(response, expected_response)
def test_unassign_agent_from_cluster_error_400(self) -> None:
"""Integration test for unassign_agent_from_cluster error path (HTTP 400)"""
request_body_json = """
{
"members" : [ "281474976710706" ]
}
"""
agent_cluster_unassign_request = thousandeyes_sdk.agents.models.AgentClusterUnassignRequest.from_json(request_body_json)
agent_id = '281474976710706'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"errors" : [ {
"code" : "code",
"field" : "field",
"message" : "message"
}, {
"code" : "code",
"field" : "field",
"message" : "message"
} ],
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(400)
) as context:
self.api.unassign_agent_from_cluster(
agent_id=agent_id,
agent_cluster_unassign_request=agent_cluster_unassign_request,
aid=aid,
_headers=self.te_headers("unassign_agent_from_cluster", error_status="400"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_unassign_agent_from_cluster_error_401(self) -> None:
"""Integration test for unassign_agent_from_cluster error path (HTTP 401)"""
request_body_json = """
{
"members" : [ "281474976710706" ]
}
"""
agent_cluster_unassign_request = thousandeyes_sdk.agents.models.AgentClusterUnassignRequest.from_json(request_body_json)
agent_id = '281474976710706'
aid = '1234'
error_body_json = """
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(401)
) as context:
self.api.unassign_agent_from_cluster(
agent_id=agent_id,
agent_cluster_unassign_request=agent_cluster_unassign_request,
aid=aid,
_headers=self.te_headers("unassign_agent_from_cluster", error_status="401"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_unassign_agent_from_cluster_error_403(self) -> None:
"""Integration test for unassign_agent_from_cluster error path (HTTP 403)"""
request_body_json = """
{
"members" : [ "281474976710706" ]
}
"""
agent_cluster_unassign_request = thousandeyes_sdk.agents.models.AgentClusterUnassignRequest.from_json(request_body_json)
agent_id = '281474976710706'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(403)
) as context:
self.api.unassign_agent_from_cluster(
agent_id=agent_id,
agent_cluster_unassign_request=agent_cluster_unassign_request,
aid=aid,
_headers=self.te_headers("unassign_agent_from_cluster", error_status="403"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_unassign_agent_from_cluster_error_404(self) -> None:
"""Integration test for unassign_agent_from_cluster error path (HTTP 404)"""
request_body_json = """
{
"members" : [ "281474976710706" ]
}
"""
agent_cluster_unassign_request = thousandeyes_sdk.agents.models.AgentClusterUnassignRequest.from_json(request_body_json)
agent_id = '281474976710706'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(404)
) as context:
self.api.unassign_agent_from_cluster(
agent_id=agent_id,
agent_cluster_unassign_request=agent_cluster_unassign_request,
aid=aid,
_headers=self.te_headers("unassign_agent_from_cluster", error_status="404"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_unassign_agent_from_cluster_error_429(self) -> None:
"""Integration test for unassign_agent_from_cluster error path (HTTP 429)"""
request_body_json = """
{
"members" : [ "281474976710706" ]
}
"""
agent_cluster_unassign_request = thousandeyes_sdk.agents.models.AgentClusterUnassignRequest.from_json(request_body_json)
agent_id = '281474976710706'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(429)
) as context:
self.api.unassign_agent_from_cluster(
agent_id=agent_id,
agent_cluster_unassign_request=agent_cluster_unassign_request,
aid=aid,
_headers=self.te_headers("unassign_agent_from_cluster", error_status="429"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_unassign_agent_from_cluster_error_500(self) -> None:
"""Integration test for unassign_agent_from_cluster error path (HTTP 500)"""
request_body_json = """
{
"members" : [ "281474976710706" ]
}
"""
agent_cluster_unassign_request = thousandeyes_sdk.agents.models.AgentClusterUnassignRequest.from_json(request_body_json)
agent_id = '281474976710706'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(500)
) as context:
self.api.unassign_agent_from_cluster(
agent_id=agent_id,
agent_cluster_unassign_request=agent_cluster_unassign_request,
aid=aid,
_headers=self.te_headers("unassign_agent_from_cluster", error_status="500"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_unassign_agent_from_cluster_error_502(self) -> None:
"""Integration test for unassign_agent_from_cluster error path (HTTP 502)"""
request_body_json = """
{
"members" : [ "281474976710706" ]
}
"""
agent_cluster_unassign_request = thousandeyes_sdk.agents.models.AgentClusterUnassignRequest.from_json(request_body_json)
agent_id = '281474976710706'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(502)
) as context:
self.api.unassign_agent_from_cluster(
agent_id=agent_id,
agent_cluster_unassign_request=agent_cluster_unassign_request,
aid=aid,
_headers=self.te_headers("unassign_agent_from_cluster", error_status="502"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
if __name__ == '__main__':
unittest.main()

View File

@ -0,0 +1,344 @@
# coding: utf-8
"""
Agents API
## Overview Manage Cloud and Enterprise Agents available to your account in ThousandEyes.
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import json
import unittest
import thousandeyes_sdk.agents.models
from thousandeyes_sdk.core.exceptions import ApiException
from thousandeyes_sdk.agents.api.local_problems_api import LocalProblemsApi
from .integration_test_utils import IntegrationTestBase
from .test_utils import assert_constructed_model_matches_example_json
class TestLocalProblemsApiIntegration(IntegrationTestBase):
"""LocalProblemsApi integration test stubs"""
def setUp(self) -> None:
super().setUp()
self.api = LocalProblemsApi(self.api_client)
def test_get_agents_local_problems_happy_path(self) -> None:
"""Integration test for get_agents_local_problems success path"""
aid = '1234'
window = '12h'
start_date = '2022-07-17T22:00:54Z'
end_date = '2022-07-18T22:00:54Z'
response_body_json = """
{
"endDate" : "2022-07-18T22:00:54Z",
"_links" : {
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
},
"localProblems" : [ {
"duration" : 480,
"agent" : {
"agentId" : "281474976710706",
"agentName" : "thousandeyes-stg-va-254",
"location" : "San Francisco Bay Area",
"countryId" : "US"
},
"endDate" : "2026-05-18T03:22:00Z",
"active" : false,
"startDate" : "2026-05-18T03:14:00Z"
}, {
"duration" : 480,
"agent" : {
"agentId" : "281474976710706",
"agentName" : "thousandeyes-stg-va-254",
"location" : "San Francisco Bay Area",
"countryId" : "US"
},
"endDate" : "2026-05-18T03:22:00Z",
"active" : false,
"startDate" : "2026-05-18T03:14:00Z"
} ],
"startDate" : "2022-07-17T22:00:54Z"
}
"""
expected_response = json.loads(response_body_json)
response = self.api.get_agents_local_problems(
aid=aid,
window=window,
start_date=start_date,
end_date=end_date,
_headers=self.te_headers("get_agents_local_problems"),
)
assert_constructed_model_matches_example_json(response, expected_response)
def test_get_agents_local_problems_error_400(self) -> None:
"""Integration test for get_agents_local_problems error path (HTTP 400)"""
aid = '1234'
window = '12h'
start_date = '2022-07-17T22:00:54Z'
end_date = '2022-07-18T22:00:54Z'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"errors" : [ {
"code" : "code",
"field" : "field",
"message" : "message"
}, {
"code" : "code",
"field" : "field",
"message" : "message"
} ],
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(400)
) as context:
self.api.get_agents_local_problems(
aid=aid,
window=window,
start_date=start_date,
end_date=end_date,
_headers=self.te_headers("get_agents_local_problems", error_status="400"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_agents_local_problems_error_401(self) -> None:
"""Integration test for get_agents_local_problems error path (HTTP 401)"""
aid = '1234'
window = '12h'
start_date = '2022-07-17T22:00:54Z'
end_date = '2022-07-18T22:00:54Z'
error_body_json = """
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(401)
) as context:
self.api.get_agents_local_problems(
aid=aid,
window=window,
start_date=start_date,
end_date=end_date,
_headers=self.te_headers("get_agents_local_problems", error_status="401"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_agents_local_problems_error_403(self) -> None:
"""Integration test for get_agents_local_problems error path (HTTP 403)"""
aid = '1234'
window = '12h'
start_date = '2022-07-17T22:00:54Z'
end_date = '2022-07-18T22:00:54Z'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(403)
) as context:
self.api.get_agents_local_problems(
aid=aid,
window=window,
start_date=start_date,
end_date=end_date,
_headers=self.te_headers("get_agents_local_problems", error_status="403"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_agents_local_problems_error_404(self) -> None:
"""Integration test for get_agents_local_problems error path (HTTP 404)"""
aid = '1234'
window = '12h'
start_date = '2022-07-17T22:00:54Z'
end_date = '2022-07-18T22:00:54Z'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(404)
) as context:
self.api.get_agents_local_problems(
aid=aid,
window=window,
start_date=start_date,
end_date=end_date,
_headers=self.te_headers("get_agents_local_problems", error_status="404"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_agents_local_problems_error_429(self) -> None:
"""Integration test for get_agents_local_problems error path (HTTP 429)"""
aid = '1234'
window = '12h'
start_date = '2022-07-17T22:00:54Z'
end_date = '2022-07-18T22:00:54Z'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(429)
) as context:
self.api.get_agents_local_problems(
aid=aid,
window=window,
start_date=start_date,
end_date=end_date,
_headers=self.te_headers("get_agents_local_problems", error_status="429"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_agents_local_problems_error_500(self) -> None:
"""Integration test for get_agents_local_problems error path (HTTP 500)"""
aid = '1234'
window = '12h'
start_date = '2022-07-17T22:00:54Z'
end_date = '2022-07-18T22:00:54Z'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(500)
) as context:
self.api.get_agents_local_problems(
aid=aid,
window=window,
start_date=start_date,
end_date=end_date,
_headers=self.te_headers("get_agents_local_problems", error_status="500"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_agents_local_problems_error_502(self) -> None:
"""Integration test for get_agents_local_problems error path (HTTP 502)"""
aid = '1234'
window = '12h'
start_date = '2022-07-17T22:00:54Z'
end_date = '2022-07-18T22:00:54Z'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(502)
) as context:
self.api.get_agents_local_problems(
aid=aid,
window=window,
start_date=start_date,
end_date=end_date,
_headers=self.te_headers("get_agents_local_problems", error_status="502"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
if __name__ == '__main__':
unittest.main()

File diff suppressed because it is too large Load Diff

View File

@ -2,15 +2,36 @@
import json import json
import unittest import unittest
from typing import Any
from pydantic import BaseModel from pydantic import BaseModel
def _project_onto_constructed(expected: Any, constructed: Any) -> Any:
"""Keep only example fields that appear in the constructed model output."""
if isinstance(constructed, dict):
if not isinstance(expected, dict):
return expected
return {
key: _project_onto_constructed(expected.get(key), value)
for key, value in constructed.items()
}
if isinstance(constructed, list):
if not isinstance(expected, list):
return expected
return [
_project_onto_constructed(expected[index], value)
for index, value in enumerate(constructed)
]
return expected
def assert_constructed_model_matches_example_json(model: BaseModel, loaded_json: dict): def assert_constructed_model_matches_example_json(model: BaseModel, loaded_json: dict):
test_case = unittest.TestCase() test_case = unittest.TestCase()
test_case.maxDiff = None test_case.maxDiff = None
test_case.assertIsNotNone(model) test_case.assertIsNotNone(model)
constructed_json = json.loads(model.to_json()) constructed_json = json.loads(model.to_json())
sorted_loaded_json = json.dumps(loaded_json, sort_keys=True) projected_loaded_json = _project_onto_constructed(loaded_json, constructed_json)
sorted_loaded_json = json.dumps(projected_loaded_json, sort_keys=True)
sorted_constructed_json = json.dumps(constructed_json, sort_keys=True) sorted_constructed_json = json.dumps(constructed_json, sort_keys=True)
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json) test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)

View File

@ -134,7 +134,13 @@ src/thousandeyes_sdk/alerts/models/validation_error_item.py
src/thousandeyes_sdk/alerts/models/webhook_integration_type.py src/thousandeyes_sdk/alerts/models/webhook_integration_type.py
src/thousandeyes_sdk/alerts/py.typed src/thousandeyes_sdk/alerts/py.typed
test/__init__.py test/__init__.py
test/conftest.py
test/integration_test_utils.py
test/mock_manifest.py
test/test_alert_rules_api.py test/test_alert_rules_api.py
test/test_alert_rules_api_integration.py
test/test_alert_suppression_windows_api.py test/test_alert_suppression_windows_api.py
test/test_alert_suppression_windows_api_integration.py
test/test_alerts_api.py test/test_alerts_api.py
test/test_alerts_api_integration.py
test/test_utils.py test/test_utils.py

View File

@ -14,7 +14,7 @@ For more information about the alerts, see [Alerts](https://docs.thousandeyes.co
This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
- API version: 7.0.96 - API version: 7.0.97
- Generator version: 7.6.0 - Generator version: 7.6.0
- Build package: com.thousandeyes.api.codegen.ThousandeyesPythonGenerator - Build package: com.thousandeyes.api.codegen.ThousandeyesPythonGenerator
@ -87,7 +87,7 @@ configuration = thousandeyes_sdk.core.Configuration(
with thousandeyes_sdk.core.ApiClient(configuration) as api_client: with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.alerts.AlertRulesApi(api_client) api_instance = thousandeyes_sdk.alerts.AlertRulesApi(api_client)
rule_detail_update = thousandeyes_sdk.alerts.RuleDetailUpdate() # RuleDetailUpdate | rule_detail_update = # RuleDetailUpdate |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:

View File

@ -49,7 +49,7 @@ configuration = thousandeyes_sdk.core.Configuration(
with thousandeyes_sdk.core.ApiClient(configuration) as api_client: with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.alerts.AlertRulesApi(api_client) api_instance = thousandeyes_sdk.alerts.AlertRulesApi(api_client)
rule_detail_update = thousandeyes_sdk.alerts.RuleDetailUpdate() # RuleDetailUpdate | rule_detail_update = # RuleDetailUpdate |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:
@ -388,7 +388,7 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.alerts.AlertRulesApi(api_client) api_instance = thousandeyes_sdk.alerts.AlertRulesApi(api_client)
rule_id = '127094' # str | Unique alert rule ID. rule_id = '127094' # str | Unique alert rule ID.
rule_detail_update = thousandeyes_sdk.alerts.RuleDetailUpdate() # RuleDetailUpdate | rule_detail_update = # RuleDetailUpdate |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:

View File

@ -50,9 +50,9 @@ configuration = thousandeyes_sdk.core.Configuration(
with thousandeyes_sdk.core.ApiClient(configuration) as api_client: with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.alerts.AlertSuppressionWindowsApi(api_client) api_instance = thousandeyes_sdk.alerts.AlertSuppressionWindowsApi(api_client)
alert_suppression_window_request = thousandeyes_sdk.alerts.AlertSuppressionWindowRequest() # AlertSuppressionWindowRequest | alert_suppression_window_request = # AlertSuppressionWindowRequest |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
expand = [thousandeyes_sdk.alerts.ExpandAlertTestOptions()] # List[ExpandAlertTestOptions] | Optional parameter on whether or not to expand alert related resources. Without this parameter, there's no default expansion. For example, to expand the \"tests\" resource, use the `?expand=test` query. (optional) expand = # List[ExpandAlertTestOptions] | Optional parameter on whether or not to expand alert related resources. Without this parameter, there's no default expansion. For example, to expand the \"tests\" resource, use the `?expand=test` query. (optional)
try: try:
# Create alert suppression window # Create alert suppression window
@ -224,7 +224,7 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
api_instance = thousandeyes_sdk.alerts.AlertSuppressionWindowsApi(api_client) api_instance = thousandeyes_sdk.alerts.AlertSuppressionWindowsApi(api_client)
window_id = '2411' # str | Unique window ID. window_id = '2411' # str | Unique window ID.
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
expand = [thousandeyes_sdk.alerts.ExpandAlertTestOptions()] # List[ExpandAlertTestOptions] | Optional parameter on whether or not to expand alert related resources. Without this parameter, there's no default expansion. For example, to expand the \"tests\" resource, use the `?expand=test` query. (optional) expand = # List[ExpandAlertTestOptions] | Optional parameter on whether or not to expand alert related resources. Without this parameter, there's no default expansion. For example, to expand the \"tests\" resource, use the `?expand=test` query. (optional)
try: try:
# Retrieve alert suppression window # Retrieve alert suppression window
@ -395,9 +395,9 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.alerts.AlertSuppressionWindowsApi(api_client) api_instance = thousandeyes_sdk.alerts.AlertSuppressionWindowsApi(api_client)
window_id = '2411' # str | Unique window ID. window_id = '2411' # str | Unique window ID.
alert_suppression_window_request = thousandeyes_sdk.alerts.AlertSuppressionWindowRequest() # AlertSuppressionWindowRequest | alert_suppression_window_request = # AlertSuppressionWindowRequest |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
expand = [thousandeyes_sdk.alerts.ExpandAlertTestOptions()] # List[ExpandAlertTestOptions] | Optional parameter on whether or not to expand alert related resources. Without this parameter, there's no default expansion. For example, to expand the \"tests\" resource, use the `?expand=test` query. (optional) expand = # List[ExpandAlertTestOptions] | Optional parameter on whether or not to expand alert related resources. Without this parameter, there's no default expansion. For example, to expand the \"tests\" resource, use the `?expand=test` query. (optional)
try: try:
# Update alert suppression window # Update alert suppression window

View File

@ -136,7 +136,7 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
end_date = '2022-07-18T22:00:54Z' # datetime | Defaults to current time the request is made. Use with the `startDate` parameter. Include the complete time (hours, minutes, and seconds) in UTC time zone, following the ISO 8601 date-time format. See the example for reference. Please note that this parameter can't be used with `window`. (optional) end_date = '2022-07-18T22:00:54Z' # datetime | Defaults to current time the request is made. Use with the `startDate` parameter. Include the complete time (hours, minutes, and seconds) in UTC time zone, following the ISO 8601 date-time format. See the example for reference. Please note that this parameter can't be used with `window`. (optional)
max = 5 # int | (Optional) Maximum number of objects to return. (optional) max = 5 # int | (Optional) Maximum number of objects to return. (optional)
cursor = 'cursor_example' # str | (Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter. (optional) cursor = 'cursor_example' # str | (Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter. (optional)
state = thousandeyes_sdk.alerts.State() # State | Optional parameter to match a specific alert state. If not specified, it defaults to `trigger`. (optional) state = # State | Optional parameter to match a specific alert state. If not specified, it defaults to `trigger`. (optional)
try: try:
# List alerts # List alerts

View File

@ -0,0 +1,7 @@
import sys
from pathlib import Path
_repo_root = Path(__file__).resolve().parents[2]
_core_test_support = _repo_root / "thousandeyes-sdk-core" / "test"
if str(_core_test_support) not in sys.path:
sys.path.insert(0, str(_core_test_support))

View File

@ -0,0 +1,37 @@
# coding: utf-8
"""
Alerts API
**Note:** API operations for the creation or retrieval of API, Page Load, or Web-Transaction alert rules are not available for ThousandEyes for Government instance. You can manage the following alert functionalities on the ThousandEyes platform using the Alerts API: * **Alerts**: Retrieve alert details. Alerts are assigned to tests through alert rules. * **Alert Rules**: Conditions that you configure in order to highlight or be notified of events of interest in your ThousandEyes tests. When an alert rules conditions are met, the associated alert is triggered and the alert becomes active. It remains active until the alert is cleared. Alert rules are reusable across multiple tests.. * **Alert Suppression Windows**: Suppress alerts for tests during periods such as planned maintenance. Windows can be one-time events or recurring events to handle periodic occurrences such as monthly downtime for maintenance. For more information about the alerts, see [Alerts](https://docs.thousandeyes.com/product-documentation/alerts).
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import unittest
from thousandeyes_sdk.core.api_client import ApiClient
from thousandeyes_sdk.core.configuration import Configuration
from sdk_test_support.mock_server import ERROR_STATUS_HEADER, OPERATION_ID_HEADER, MockApiServer
from .mock_manifest import OPERATION_MANIFEST
class IntegrationTestBase(unittest.TestCase):
def setUp(self) -> None:
self.server = MockApiServer(OPERATION_MANIFEST)
self.server.start()
configuration = Configuration(host=self.server.base_url, access_token="test-token")
self.api_client = ApiClient(configuration=configuration)
def tearDown(self) -> None:
self.server.stop()
def te_headers(self, operation_id: str, error_status=None):
headers = {OPERATION_ID_HEADER: operation_id}
if error_status is not None:
headers[ERROR_STATUS_HEADER] = error_status
return headers

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,680 @@
# coding: utf-8
"""
Alerts API
**Note:** API operations for the creation or retrieval of API, Page Load, or Web-Transaction alert rules are not available for ThousandEyes for Government instance. You can manage the following alert functionalities on the ThousandEyes platform using the Alerts API: * **Alerts**: Retrieve alert details. Alerts are assigned to tests through alert rules. * **Alert Rules**: Conditions that you configure in order to highlight or be notified of events of interest in your ThousandEyes tests. When an alert rules conditions are met, the associated alert is triggered and the alert becomes active. It remains active until the alert is cleared. Alert rules are reusable across multiple tests.. * **Alert Suppression Windows**: Suppress alerts for tests during periods such as planned maintenance. Windows can be one-time events or recurring events to handle periodic occurrences such as monthly downtime for maintenance. For more information about the alerts, see [Alerts](https://docs.thousandeyes.com/product-documentation/alerts).
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import json
import unittest
import thousandeyes_sdk.alerts.models
from thousandeyes_sdk.core.exceptions import ApiException
from thousandeyes_sdk.alerts.api.alerts_api import AlertsApi
from .integration_test_utils import IntegrationTestBase
from .test_utils import assert_constructed_model_matches_example_json
class TestAlertsApiIntegration(IntegrationTestBase):
"""AlertsApi integration test stubs"""
def setUp(self) -> None:
super().setUp()
self.api = AlertsApi(self.api_client)
def test_get_alert_happy_path(self) -> None:
"""Integration test for get_alert success path"""
alert_id = 'e9c3bf02-a48c-4aa8-9e5f-898800d6f569'
aid = '1234'
response_body_json = """
{
"severity" : "major",
"alertType" : "http-server",
"endDate" : "2022-07-18T22:00:54Z",
"_links" : {
"appLink" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
},
"test" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
},
"rule" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
},
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
},
"alertSeverity" : "major",
"duration" : 60,
"violationCount" : 2,
"_embedded" : {
"asn" : {
"name" : "Cisco Webex LLC",
"id" : "13445",
"type" : "asn"
}
},
"meta" : {
"version" : 1
},
"details" : [ {
"name" : "Bucharest, Romania",
"start" : {
"metrics" : "metrics"
},
"end" : {
"metrics" : "metrics"
},
"id" : "3379",
"state" : "trigger",
"type" : "cea_agent"
}, {
"name" : "Bucharest, Romania",
"start" : {
"metrics" : "metrics"
},
"end" : {
"metrics" : "metrics"
},
"id" : "3379",
"state" : "trigger",
"type" : "cea_agent"
} ],
"id" : "e9c3bf02-a48c-4aa8-9e5f-898800d6f569",
"suppressed" : false,
"state" : "trigger",
"alertState" : "trigger",
"startDate" : "2022-07-17T22:00:54Z"
}
"""
expected_response = json.loads(response_body_json)
response = self.api.get_alert(
alert_id=alert_id,
aid=aid,
_headers=self.te_headers("get_alert"),
)
assert_constructed_model_matches_example_json(response, expected_response)
def test_get_alert_error_401(self) -> None:
"""Integration test for get_alert error path (HTTP 401)"""
alert_id = 'e9c3bf02-a48c-4aa8-9e5f-898800d6f569'
aid = '1234'
error_body_json = """
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(401)
) as context:
self.api.get_alert(
alert_id=alert_id,
aid=aid,
_headers=self.te_headers("get_alert", error_status="401"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_alert_error_403(self) -> None:
"""Integration test for get_alert error path (HTTP 403)"""
alert_id = 'e9c3bf02-a48c-4aa8-9e5f-898800d6f569'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(403)
) as context:
self.api.get_alert(
alert_id=alert_id,
aid=aid,
_headers=self.te_headers("get_alert", error_status="403"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_alert_error_404(self) -> None:
"""Integration test for get_alert error path (HTTP 404)"""
alert_id = 'e9c3bf02-a48c-4aa8-9e5f-898800d6f569'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(404)
) as context:
self.api.get_alert(
alert_id=alert_id,
aid=aid,
_headers=self.te_headers("get_alert", error_status="404"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_alert_error_429(self) -> None:
"""Integration test for get_alert error path (HTTP 429)"""
alert_id = 'e9c3bf02-a48c-4aa8-9e5f-898800d6f569'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(429)
) as context:
self.api.get_alert(
alert_id=alert_id,
aid=aid,
_headers=self.te_headers("get_alert", error_status="429"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_alert_error_500(self) -> None:
"""Integration test for get_alert error path (HTTP 500)"""
alert_id = 'e9c3bf02-a48c-4aa8-9e5f-898800d6f569'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(500)
) as context:
self.api.get_alert(
alert_id=alert_id,
aid=aid,
_headers=self.te_headers("get_alert", error_status="500"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_alerts_happy_path(self) -> None:
"""Integration test for get_alerts success path"""
aid = '1234'
window = '12h'
start_date = '2022-07-17T22:00:54Z'
end_date = '2022-07-18T22:00:54Z'
max = 5
cursor = 'cursor_example'
response_body_json = """
{
"alerts" : [ {
"severity" : "MAJOR",
"alertType" : "http-server",
"endDate" : "2022-07-18T22:00:54Z",
"_links" : {
"appLink" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
},
"test" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
},
"rule" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
},
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
},
"apiLinks" : [ {
"key" : ""
}, {
"key" : ""
} ],
"alertSeverity" : "major",
"dateEnd" : "2020-04-23 13:43:16",
"duration" : 60,
"violationCount" : 2,
"dateStart" : "2020-04-23 13:43:16",
"meta" : {
"version" : 1
},
"id" : "e9c3bf02-a48c-4aa8-9e5f-898800d6f569",
"suppressed" : false,
"alertId" : "e9c3bf02-a48c-4aa8-9e5f-898800d6f569",
"state" : "ACTIVE",
"ruleId" : 127094,
"permalink" : "https://app.thousandeyes.com/alerts/list?__a=75&alertId=2783&agentId=12",
"alertState" : "trigger",
"startDate" : "2022-07-17T22:00:54Z",
"alertRuleId" : "127094"
}, {
"severity" : "MAJOR",
"alertType" : "http-server",
"endDate" : "2022-07-18T22:00:54Z",
"_links" : {
"appLink" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
},
"test" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
},
"rule" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
},
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
},
"apiLinks" : [ {
"key" : ""
}, {
"key" : ""
} ],
"alertSeverity" : "major",
"dateEnd" : "2020-04-23 13:43:16",
"duration" : 60,
"violationCount" : 2,
"dateStart" : "2020-04-23 13:43:16",
"meta" : {
"version" : 1
},
"id" : "e9c3bf02-a48c-4aa8-9e5f-898800d6f569",
"suppressed" : false,
"alertId" : "e9c3bf02-a48c-4aa8-9e5f-898800d6f569",
"state" : "ACTIVE",
"ruleId" : 127094,
"permalink" : "https://app.thousandeyes.com/alerts/list?__a=75&alertId=2783&agentId=12",
"alertState" : "trigger",
"startDate" : "2022-07-17T22:00:54Z",
"alertRuleId" : "127094"
} ],
"_links" : {
"next" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
},
"previous" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
},
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
}
}
"""
expected_response = json.loads(response_body_json)
response = self.api.get_alerts(
aid=aid,
window=window,
start_date=start_date,
end_date=end_date,
max=max,
cursor=cursor,
_headers=self.te_headers("get_alerts"),
)
assert_constructed_model_matches_example_json(response, expected_response)
def test_get_alerts_error_401(self) -> None:
"""Integration test for get_alerts error path (HTTP 401)"""
aid = '1234'
window = '12h'
start_date = '2022-07-17T22:00:54Z'
end_date = '2022-07-18T22:00:54Z'
max = 5
cursor = 'cursor_example'
error_body_json = """
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(401)
) as context:
self.api.get_alerts(
aid=aid,
window=window,
start_date=start_date,
end_date=end_date,
max=max,
cursor=cursor,
_headers=self.te_headers("get_alerts", error_status="401"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_alerts_error_403(self) -> None:
"""Integration test for get_alerts error path (HTTP 403)"""
aid = '1234'
window = '12h'
start_date = '2022-07-17T22:00:54Z'
end_date = '2022-07-18T22:00:54Z'
max = 5
cursor = 'cursor_example'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(403)
) as context:
self.api.get_alerts(
aid=aid,
window=window,
start_date=start_date,
end_date=end_date,
max=max,
cursor=cursor,
_headers=self.te_headers("get_alerts", error_status="403"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_alerts_error_404(self) -> None:
"""Integration test for get_alerts error path (HTTP 404)"""
aid = '1234'
window = '12h'
start_date = '2022-07-17T22:00:54Z'
end_date = '2022-07-18T22:00:54Z'
max = 5
cursor = 'cursor_example'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(404)
) as context:
self.api.get_alerts(
aid=aid,
window=window,
start_date=start_date,
end_date=end_date,
max=max,
cursor=cursor,
_headers=self.te_headers("get_alerts", error_status="404"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_alerts_error_429(self) -> None:
"""Integration test for get_alerts error path (HTTP 429)"""
aid = '1234'
window = '12h'
start_date = '2022-07-17T22:00:54Z'
end_date = '2022-07-18T22:00:54Z'
max = 5
cursor = 'cursor_example'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(429)
) as context:
self.api.get_alerts(
aid=aid,
window=window,
start_date=start_date,
end_date=end_date,
max=max,
cursor=cursor,
_headers=self.te_headers("get_alerts", error_status="429"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_alerts_error_500(self) -> None:
"""Integration test for get_alerts error path (HTTP 500)"""
aid = '1234'
window = '12h'
start_date = '2022-07-17T22:00:54Z'
end_date = '2022-07-18T22:00:54Z'
max = 5
cursor = 'cursor_example'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(500)
) as context:
self.api.get_alerts(
aid=aid,
window=window,
start_date=start_date,
end_date=end_date,
max=max,
cursor=cursor,
_headers=self.te_headers("get_alerts", error_status="500"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
if __name__ == '__main__':
unittest.main()

View File

@ -2,15 +2,36 @@
import json import json
import unittest import unittest
from typing import Any
from pydantic import BaseModel from pydantic import BaseModel
def _project_onto_constructed(expected: Any, constructed: Any) -> Any:
"""Keep only example fields that appear in the constructed model output."""
if isinstance(constructed, dict):
if not isinstance(expected, dict):
return expected
return {
key: _project_onto_constructed(expected.get(key), value)
for key, value in constructed.items()
}
if isinstance(constructed, list):
if not isinstance(expected, list):
return expected
return [
_project_onto_constructed(expected[index], value)
for index, value in enumerate(constructed)
]
return expected
def assert_constructed_model_matches_example_json(model: BaseModel, loaded_json: dict): def assert_constructed_model_matches_example_json(model: BaseModel, loaded_json: dict):
test_case = unittest.TestCase() test_case = unittest.TestCase()
test_case.maxDiff = None test_case.maxDiff = None
test_case.assertIsNotNone(model) test_case.assertIsNotNone(model)
constructed_json = json.loads(model.to_json()) constructed_json = json.loads(model.to_json())
sorted_loaded_json = json.dumps(loaded_json, sort_keys=True) projected_loaded_json = _project_onto_constructed(loaded_json, constructed_json)
sorted_loaded_json = json.dumps(projected_loaded_json, sort_keys=True)
sorted_constructed_json = json.dumps(constructed_json, sort_keys=True) sorted_constructed_json = json.dumps(constructed_json, sort_keys=True)
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json) test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)

View File

@ -24,5 +24,9 @@ src/thousandeyes_sdk/bgp_monitors/models/self_links.py
src/thousandeyes_sdk/bgp_monitors/models/unauthorized_error.py src/thousandeyes_sdk/bgp_monitors/models/unauthorized_error.py
src/thousandeyes_sdk/bgp_monitors/py.typed src/thousandeyes_sdk/bgp_monitors/py.typed
test/__init__.py test/__init__.py
test/conftest.py
test/integration_test_utils.py
test/mock_manifest.py
test/test_bgp_monitors_api.py test/test_bgp_monitors_api.py
test/test_bgp_monitors_api_integration.py
test/test_utils.py test/test_utils.py

View File

@ -10,7 +10,7 @@ For more information about monitors, see [Inside-Out BGP Visibility](https://doc
This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
- API version: 7.0.96 - API version: 7.0.97
- Generator version: 7.6.0 - Generator version: 7.6.0
- Build package: com.thousandeyes.api.codegen.ThousandeyesPythonGenerator - Build package: com.thousandeyes.api.codegen.ThousandeyesPythonGenerator

View File

@ -0,0 +1,7 @@
import sys
from pathlib import Path
_repo_root = Path(__file__).resolve().parents[2]
_core_test_support = _repo_root / "thousandeyes-sdk-core" / "test"
if str(_core_test_support) not in sys.path:
sys.path.insert(0, str(_core_test_support))

View File

@ -0,0 +1,37 @@
# coding: utf-8
"""
BGP Monitors API
**Note:** Private monitor data is not available for ThousandEyes for Government instance. Retrieve information about BGP monitors available to your ThousandEyes account. ThousandEyes ingests BGP routing data from dozens of global BGP collectors and automatically integrates that visibility as a configurable layer under service, network, and path visualization layers. When you specify a service URL in a test, layered BGP tests automatically track reachability and path changes for any relevant prefix. When you use an IP address as the target for a test, the ThousandEyes platform monitors the relevant internet-routed prefix. You can also create specific BGP monitoring for a prefix, and can alert on hijacks and leaks. For more information about monitors, see [Inside-Out BGP Visibility](https://docs.thousandeyes.com/product-documentation/internet-and-wan-monitoring/tests/bgp-tests/inside-out-bgp-visibility).
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import unittest
from thousandeyes_sdk.core.api_client import ApiClient
from thousandeyes_sdk.core.configuration import Configuration
from sdk_test_support.mock_server import ERROR_STATUS_HEADER, OPERATION_ID_HEADER, MockApiServer
from .mock_manifest import OPERATION_MANIFEST
class IntegrationTestBase(unittest.TestCase):
def setUp(self) -> None:
self.server = MockApiServer(OPERATION_MANIFEST)
self.server.start()
configuration = Configuration(host=self.server.base_url, access_token="test-token")
self.api_client = ApiClient(configuration=configuration)
def tearDown(self) -> None:
self.server.stop()
def te_headers(self, operation_id: str, error_status=None):
headers = {OPERATION_ID_HEADER: operation_id}
if error_status is not None:
headers[ERROR_STATUS_HEADER] = error_status
return headers

View File

@ -0,0 +1,131 @@
# coding: utf-8
"""
BGP Monitors API
**Note:** Private monitor data is not available for ThousandEyes for Government instance. Retrieve information about BGP monitors available to your ThousandEyes account. ThousandEyes ingests BGP routing data from dozens of global BGP collectors and automatically integrates that visibility as a configurable layer under service, network, and path visualization layers. When you specify a service URL in a test, layered BGP tests automatically track reachability and path changes for any relevant prefix. When you use an IP address as the target for a test, the ThousandEyes platform monitors the relevant internet-routed prefix. You can also create specific BGP monitoring for a prefix, and can alert on hijacks and leaks. For more information about monitors, see [Inside-Out BGP Visibility](https://docs.thousandeyes.com/product-documentation/internet-and-wan-monitoring/tests/bgp-tests/inside-out-bgp-visibility).
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import json
from sdk_test_support.mock_server_types import ErrorResponseExpectation, OperationExpectation
OPERATION_MANIFEST = {
"get_bgp_monitors": OperationExpectation(
operation_id="get_bgp_monitors",
method="GET",
path="/monitors",
path_param_examples={
},
success_status=200,
success_body=json.loads("""
{
"_links" : {
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
},
"monitors" : [ {
"monitorType" : "public",
"monitorId" : "1234",
"monitorName" : "Seattle, WA",
"ipAddress" : "4.69.184.193",
"countryId" : "GB",
"network" : "Level 3 Communications, Inc. (AS 3356)"
}, {
"monitorType" : "public",
"monitorId" : "1234",
"monitorName" : "Seattle, WA",
"ipAddress" : "4.69.184.193",
"countryId" : "GB",
"network" : "Level 3 Communications, Inc. (AS 3356)"
} ]
}
"""),
success_content_type="application/json",
request_body_example=None,
error_responses={
"401": ErrorResponseExpectation(
status=401,
body=json.loads("""
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}"""),
content_type="application/json",
),
"403": ErrorResponseExpectation(
status=403,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"404": ErrorResponseExpectation(
status=404,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"429": ErrorResponseExpectation(
status=429,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"500": ErrorResponseExpectation(
status=500,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
},
),
}

View File

@ -0,0 +1,203 @@
# coding: utf-8
"""
BGP Monitors API
**Note:** Private monitor data is not available for ThousandEyes for Government instance. Retrieve information about BGP monitors available to your ThousandEyes account. ThousandEyes ingests BGP routing data from dozens of global BGP collectors and automatically integrates that visibility as a configurable layer under service, network, and path visualization layers. When you specify a service URL in a test, layered BGP tests automatically track reachability and path changes for any relevant prefix. When you use an IP address as the target for a test, the ThousandEyes platform monitors the relevant internet-routed prefix. You can also create specific BGP monitoring for a prefix, and can alert on hijacks and leaks. For more information about monitors, see [Inside-Out BGP Visibility](https://docs.thousandeyes.com/product-documentation/internet-and-wan-monitoring/tests/bgp-tests/inside-out-bgp-visibility).
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import json
import unittest
import thousandeyes_sdk.bgp_monitors.models
from thousandeyes_sdk.core.exceptions import ApiException
from thousandeyes_sdk.bgp_monitors.api.bgp_monitors_api import BGPMonitorsApi
from .integration_test_utils import IntegrationTestBase
from .test_utils import assert_constructed_model_matches_example_json
class TestBGPMonitorsApiIntegration(IntegrationTestBase):
"""BGPMonitorsApi integration test stubs"""
def setUp(self) -> None:
super().setUp()
self.api = BGPMonitorsApi(self.api_client)
def test_get_bgp_monitors_happy_path(self) -> None:
"""Integration test for get_bgp_monitors success path"""
aid = '1234'
response_body_json = """
{
"_links" : {
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
},
"monitors" : [ {
"monitorType" : "public",
"monitorId" : "1234",
"monitorName" : "Seattle, WA",
"ipAddress" : "4.69.184.193",
"countryId" : "GB",
"network" : "Level 3 Communications, Inc. (AS 3356)"
}, {
"monitorType" : "public",
"monitorId" : "1234",
"monitorName" : "Seattle, WA",
"ipAddress" : "4.69.184.193",
"countryId" : "GB",
"network" : "Level 3 Communications, Inc. (AS 3356)"
} ]
}
"""
expected_response = json.loads(response_body_json)
response = self.api.get_bgp_monitors(
aid=aid,
_headers=self.te_headers("get_bgp_monitors"),
)
assert_constructed_model_matches_example_json(response, expected_response)
def test_get_bgp_monitors_error_401(self) -> None:
"""Integration test for get_bgp_monitors error path (HTTP 401)"""
aid = '1234'
error_body_json = """
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(401)
) as context:
self.api.get_bgp_monitors(
aid=aid,
_headers=self.te_headers("get_bgp_monitors", error_status="401"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_bgp_monitors_error_403(self) -> None:
"""Integration test for get_bgp_monitors error path (HTTP 403)"""
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(403)
) as context:
self.api.get_bgp_monitors(
aid=aid,
_headers=self.te_headers("get_bgp_monitors", error_status="403"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_bgp_monitors_error_404(self) -> None:
"""Integration test for get_bgp_monitors error path (HTTP 404)"""
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(404)
) as context:
self.api.get_bgp_monitors(
aid=aid,
_headers=self.te_headers("get_bgp_monitors", error_status="404"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_bgp_monitors_error_429(self) -> None:
"""Integration test for get_bgp_monitors error path (HTTP 429)"""
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(429)
) as context:
self.api.get_bgp_monitors(
aid=aid,
_headers=self.te_headers("get_bgp_monitors", error_status="429"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_bgp_monitors_error_500(self) -> None:
"""Integration test for get_bgp_monitors error path (HTTP 500)"""
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(500)
) as context:
self.api.get_bgp_monitors(
aid=aid,
_headers=self.te_headers("get_bgp_monitors", error_status="500"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
if __name__ == '__main__':
unittest.main()

View File

@ -2,15 +2,36 @@
import json import json
import unittest import unittest
from typing import Any
from pydantic import BaseModel from pydantic import BaseModel
def _project_onto_constructed(expected: Any, constructed: Any) -> Any:
"""Keep only example fields that appear in the constructed model output."""
if isinstance(constructed, dict):
if not isinstance(expected, dict):
return expected
return {
key: _project_onto_constructed(expected.get(key), value)
for key, value in constructed.items()
}
if isinstance(constructed, list):
if not isinstance(expected, list):
return expected
return [
_project_onto_constructed(expected[index], value)
for index, value in enumerate(constructed)
]
return expected
def assert_constructed_model_matches_example_json(model: BaseModel, loaded_json: dict): def assert_constructed_model_matches_example_json(model: BaseModel, loaded_json: dict):
test_case = unittest.TestCase() test_case = unittest.TestCase()
test_case.maxDiff = None test_case.maxDiff = None
test_case.assertIsNotNone(model) test_case.assertIsNotNone(model)
constructed_json = json.loads(model.to_json()) constructed_json = json.loads(model.to_json())
sorted_loaded_json = json.dumps(loaded_json, sort_keys=True) projected_loaded_json = _project_onto_constructed(loaded_json, constructed_json)
sorted_loaded_json = json.dumps(projected_loaded_json, sort_keys=True)
sorted_constructed_json = json.dumps(constructed_json, sort_keys=True) sorted_constructed_json = json.dumps(constructed_json, sort_keys=True)
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json) test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)

View File

@ -76,9 +76,17 @@ src/thousandeyes_sdk/connectors/models/webhook_operation.py
src/thousandeyes_sdk/connectors/models/webhook_operations.py src/thousandeyes_sdk/connectors/models/webhook_operations.py
src/thousandeyes_sdk/connectors/py.typed src/thousandeyes_sdk/connectors/py.typed
test/__init__.py test/__init__.py
test/conftest.py
test/integration_test_utils.py
test/mock_manifest.py
test/test_credential_vault_operations_api.py test/test_credential_vault_operations_api.py
test/test_credential_vault_operations_api_integration.py
test/test_cyber_ark_conjur_connectors_api.py test/test_cyber_ark_conjur_connectors_api.py
test/test_cyber_ark_conjur_connectors_api_integration.py
test/test_generic_connectors_api.py test/test_generic_connectors_api.py
test/test_generic_connectors_api_integration.py
test/test_operation_connectors_api.py test/test_operation_connectors_api.py
test/test_operation_connectors_api_integration.py
test/test_utils.py test/test_utils.py
test/test_webhook_operations_api.py test/test_webhook_operations_api.py
test/test_webhook_operations_api_integration.py

View File

@ -6,7 +6,7 @@ Manage connectors and operations.
This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
- API version: 7.0.96 - API version: 7.0.97
- Generator version: 7.6.0 - Generator version: 7.6.0
- Build package: com.thousandeyes.api.codegen.ThousandeyesPythonGenerator - Build package: com.thousandeyes.api.codegen.ThousandeyesPythonGenerator
@ -79,7 +79,7 @@ configuration = thousandeyes_sdk.core.Configuration(
with thousandeyes_sdk.core.ApiClient(configuration) as api_client: with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.connectors.CredentialVaultOperationsApi(api_client) api_instance = thousandeyes_sdk.connectors.CredentialVaultOperationsApi(api_client)
credential_vault_operation = thousandeyes_sdk.connectors.CredentialVaultOperation() # CredentialVaultOperation | credential_vault_operation = # CredentialVaultOperation |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:

View File

@ -48,7 +48,7 @@ configuration = thousandeyes_sdk.core.Configuration(
with thousandeyes_sdk.core.ApiClient(configuration) as api_client: with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.connectors.CredentialVaultOperationsApi(api_client) api_instance = thousandeyes_sdk.connectors.CredentialVaultOperationsApi(api_client)
credential_vault_operation = thousandeyes_sdk.connectors.CredentialVaultOperation() # CredentialVaultOperation | credential_vault_operation = # CredentialVaultOperation |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:
@ -386,7 +386,7 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.connectors.CredentialVaultOperationsApi(api_client) api_instance = thousandeyes_sdk.connectors.CredentialVaultOperationsApi(api_client)
id = 'cb1b8033-ea2d-4e9b-a920-fe87850693cf' # str | The operation ID. id = 'cb1b8033-ea2d-4e9b-a920-fe87850693cf' # str | The operation ID.
credential_vault_operation = thousandeyes_sdk.connectors.CredentialVaultOperation() # CredentialVaultOperation | credential_vault_operation = # CredentialVaultOperation |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:

View File

@ -50,7 +50,7 @@ configuration = thousandeyes_sdk.core.Configuration(
with thousandeyes_sdk.core.ApiClient(configuration) as api_client: with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.connectors.CyberArkConjurConnectorsApi(api_client) api_instance = thousandeyes_sdk.connectors.CyberArkConjurConnectorsApi(api_client)
conjur_connector = thousandeyes_sdk.connectors.ConjurConnector() # ConjurConnector | conjur_connector = # ConjurConnector |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:
@ -562,7 +562,7 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.connectors.CyberArkConjurConnectorsApi(api_client) api_instance = thousandeyes_sdk.connectors.CyberArkConjurConnectorsApi(api_client)
id = 'cb1b8033-ea2d-4e9b-a920-fe87850693cf' # str | The connector ID. id = 'cb1b8033-ea2d-4e9b-a920-fe87850693cf' # str | The connector ID.
conjur_connector = thousandeyes_sdk.connectors.ConjurConnector() # ConjurConnector | conjur_connector = # ConjurConnector |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:

View File

@ -50,7 +50,7 @@ configuration = thousandeyes_sdk.core.Configuration(
with thousandeyes_sdk.core.ApiClient(configuration) as api_client: with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.connectors.GenericConnectorsApi(api_client) api_instance = thousandeyes_sdk.connectors.GenericConnectorsApi(api_client)
generic_connector = thousandeyes_sdk.connectors.GenericConnector() # GenericConnector | generic_connector = # GenericConnector |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:
@ -558,7 +558,7 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.connectors.GenericConnectorsApi(api_client) api_instance = thousandeyes_sdk.connectors.GenericConnectorsApi(api_client)
id = 'cb1b8033-ea2d-4e9b-a920-fe87850693cf' # str | The connector ID. id = 'cb1b8033-ea2d-4e9b-a920-fe87850693cf' # str | The connector ID.
generic_connector = thousandeyes_sdk.connectors.GenericConnector() # GenericConnector | generic_connector = # GenericConnector |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:

View File

@ -48,7 +48,7 @@ configuration = thousandeyes_sdk.core.Configuration(
with thousandeyes_sdk.core.ApiClient(configuration) as api_client: with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.connectors.WebhookOperationsApi(api_client) api_instance = thousandeyes_sdk.connectors.WebhookOperationsApi(api_client)
webhook_operation = thousandeyes_sdk.connectors.WebhookOperation() # WebhookOperation | webhook_operation = # WebhookOperation |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:
@ -384,7 +384,7 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.connectors.WebhookOperationsApi(api_client) api_instance = thousandeyes_sdk.connectors.WebhookOperationsApi(api_client)
id = 'cb1b8033-ea2d-4e9b-a920-fe87850693cf' # str | The operation ID. id = 'cb1b8033-ea2d-4e9b-a920-fe87850693cf' # str | The operation ID.
webhook_operation = thousandeyes_sdk.connectors.WebhookOperation() # WebhookOperation | webhook_operation = # WebhookOperation |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:

View File

@ -0,0 +1,7 @@
import sys
from pathlib import Path
_repo_root = Path(__file__).resolve().parents[2]
_core_test_support = _repo_root / "thousandeyes-sdk-core" / "test"
if str(_core_test_support) not in sys.path:
sys.path.insert(0, str(_core_test_support))

View File

@ -0,0 +1,37 @@
# coding: utf-8
"""
Integrations API
**Note:** The Webhook Operations APIs are not available for ThousandEyes for Government instance. Manage connectors and operations.
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import unittest
from thousandeyes_sdk.core.api_client import ApiClient
from thousandeyes_sdk.core.configuration import Configuration
from sdk_test_support.mock_server import ERROR_STATUS_HEADER, OPERATION_ID_HEADER, MockApiServer
from .mock_manifest import OPERATION_MANIFEST
class IntegrationTestBase(unittest.TestCase):
def setUp(self) -> None:
self.server = MockApiServer(OPERATION_MANIFEST)
self.server.start()
configuration = Configuration(host=self.server.base_url, access_token="test-token")
self.api_client = ApiClient(configuration=configuration)
def tearDown(self) -> None:
self.server.stop()
def te_headers(self, operation_id: str, error_status=None):
headers = {OPERATION_ID_HEADER: operation_id}
if error_status is not None:
headers[ERROR_STATUS_HEADER] = error_status
return headers

File diff suppressed because it is too large Load Diff

View File

@ -230,7 +230,7 @@ class TestCyberArkConjurConnectorsApi(unittest.TestCase):
def test_set_conjur_connector_operations_models_validation(self) -> None: def test_set_conjur_connector_operations_models_validation(self) -> None:
"""Test case for set_conjur_connector_operations request and response models""" """Test case for set_conjur_connector_operations request and response models"""
request_body_json = """ request_body_json = """
["ca39314d-eb4f-496f-9435-b5d20b1bfbff","a32cfbab-32f6-41d8-9027-7127cba965dd"] none
""" """
request_loaded_json = json.loads(request_body_json) request_loaded_json = json.loads(request_body_json)

View File

@ -260,7 +260,7 @@ class TestGenericConnectorsApi(unittest.TestCase):
def test_set_generic_connector_operations_models_validation(self) -> None: def test_set_generic_connector_operations_models_validation(self) -> None:
"""Test case for set_generic_connector_operations request and response models""" """Test case for set_generic_connector_operations request and response models"""
request_body_json = """ request_body_json = """
["ca39314d-eb4f-496f-9435-b5d20b1bfbff","a32cfbab-32f6-41d8-9027-7127cba965dd"] none
""" """
request_loaded_json = json.loads(request_body_json) request_loaded_json = json.loads(request_body_json)

File diff suppressed because it is too large Load Diff

View File

@ -55,7 +55,7 @@ class TestOperationConnectorsApi(unittest.TestCase):
def test_set_operation_connectors_models_validation(self) -> None: def test_set_operation_connectors_models_validation(self) -> None:
"""Test case for set_operation_connectors request and response models""" """Test case for set_operation_connectors request and response models"""
request_body_json = """ request_body_json = """
["ca39314d-eb4f-496f-9435-b5d20b1bfbff"] none
""" """
request_loaded_json = json.loads(request_body_json) request_loaded_json = json.loads(request_body_json)

View File

@ -0,0 +1,234 @@
# coding: utf-8
"""
Integrations API
**Note:** The Webhook Operations APIs are not available for ThousandEyes for Government instance. Manage connectors and operations.
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import json
import unittest
import thousandeyes_sdk.connectors.models
from thousandeyes_sdk.core.exceptions import ApiException
from thousandeyes_sdk.connectors.api.operation_connectors_api import OperationConnectorsApi
from .integration_test_utils import IntegrationTestBase
from .test_utils import assert_constructed_model_matches_example_json
class TestOperationConnectorsApiIntegration(IntegrationTestBase):
"""OperationConnectorsApi integration test stubs"""
def setUp(self) -> None:
super().setUp()
self.api = OperationConnectorsApi(self.api_client)
def test_get_operation_connectors_happy_path(self) -> None:
"""Integration test for get_operation_connectors success path"""
type = 'webhooks'
id = 'cb1b8033-ea2d-4e9b-a920-fe87850693cf'
aid = '1234'
response_body_json = """
{
"_links" : {
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
},
"items" : [ "ca39314d-eb4f-496f-9435-b5d20b1bfbff", "ca39314d-eb4f-496f-9435-b5d20b1bfbff" ]
}
"""
expected_response = json.loads(response_body_json)
response = self.api.get_operation_connectors(
type=type,
id=id,
aid=aid,
_headers=self.te_headers("get_operation_connectors"),
)
assert_constructed_model_matches_example_json(response, expected_response)
def test_get_operation_connectors_error_400(self) -> None:
"""Integration test for get_operation_connectors error path (HTTP 400)"""
type = 'webhooks'
id = 'cb1b8033-ea2d-4e9b-a920-fe87850693cf'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"errors" : [ {
"code" : "code",
"field" : "field",
"message" : "message"
}, {
"code" : "code",
"field" : "field",
"message" : "message"
} ],
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(400)
) as context:
self.api.get_operation_connectors(
type=type,
id=id,
aid=aid,
_headers=self.te_headers("get_operation_connectors", error_status="400"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_operation_connectors_error_401(self) -> None:
"""Integration test for get_operation_connectors error path (HTTP 401)"""
type = 'webhooks'
id = 'cb1b8033-ea2d-4e9b-a920-fe87850693cf'
aid = '1234'
error_body_json = """
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(401)
) as context:
self.api.get_operation_connectors(
type=type,
id=id,
aid=aid,
_headers=self.te_headers("get_operation_connectors", error_status="401"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_operation_connectors_error_403(self) -> None:
"""Integration test for get_operation_connectors error path (HTTP 403)"""
type = 'webhooks'
id = 'cb1b8033-ea2d-4e9b-a920-fe87850693cf'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 6
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(403)
) as context:
self.api.get_operation_connectors(
type=type,
id=id,
aid=aid,
_headers=self.te_headers("get_operation_connectors", error_status="403"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_operation_connectors_error_404(self) -> None:
"""Integration test for get_operation_connectors error path (HTTP 404)"""
type = 'webhooks'
id = 'cb1b8033-ea2d-4e9b-a920-fe87850693cf'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 6
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(404)
) as context:
self.api.get_operation_connectors(
type=type,
id=id,
aid=aid,
_headers=self.te_headers("get_operation_connectors", error_status="404"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_operation_connectors_error_500(self) -> None:
"""Integration test for get_operation_connectors error path (HTTP 500)"""
type = 'webhooks'
id = 'cb1b8033-ea2d-4e9b-a920-fe87850693cf'
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 6
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(500)
) as context:
self.api.get_operation_connectors(
type=type,
id=id,
aid=aid,
_headers=self.te_headers("get_operation_connectors", error_status="500"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
if __name__ == '__main__':
unittest.main()

View File

@ -2,15 +2,36 @@
import json import json
import unittest import unittest
from typing import Any
from pydantic import BaseModel from pydantic import BaseModel
def _project_onto_constructed(expected: Any, constructed: Any) -> Any:
"""Keep only example fields that appear in the constructed model output."""
if isinstance(constructed, dict):
if not isinstance(expected, dict):
return expected
return {
key: _project_onto_constructed(expected.get(key), value)
for key, value in constructed.items()
}
if isinstance(constructed, list):
if not isinstance(expected, list):
return expected
return [
_project_onto_constructed(expected[index], value)
for index, value in enumerate(constructed)
]
return expected
def assert_constructed_model_matches_example_json(model: BaseModel, loaded_json: dict): def assert_constructed_model_matches_example_json(model: BaseModel, loaded_json: dict):
test_case = unittest.TestCase() test_case = unittest.TestCase()
test_case.maxDiff = None test_case.maxDiff = None
test_case.assertIsNotNone(model) test_case.assertIsNotNone(model)
constructed_json = json.loads(model.to_json()) constructed_json = json.loads(model.to_json())
sorted_loaded_json = json.dumps(loaded_json, sort_keys=True) projected_loaded_json = _project_onto_constructed(loaded_json, constructed_json)
sorted_loaded_json = json.dumps(projected_loaded_json, sort_keys=True)
sorted_constructed_json = json.dumps(constructed_json, sort_keys=True) sorted_constructed_json = json.dumps(constructed_json, sort_keys=True)
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json) test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)

File diff suppressed because it is too large Load Diff

View File

@ -30,5 +30,9 @@ src/thousandeyes_sdk/credentials/models/validation_error.py
src/thousandeyes_sdk/credentials/models/validation_error_item.py src/thousandeyes_sdk/credentials/models/validation_error_item.py
src/thousandeyes_sdk/credentials/py.typed src/thousandeyes_sdk/credentials/py.typed
test/__init__.py test/__init__.py
test/conftest.py
test/integration_test_utils.py
test/mock_manifest.py
test/test_credentials_api.py test/test_credentials_api.py
test/test_credentials_api_integration.py
test/test_utils.py test/test_utils.py

View File

@ -13,7 +13,7 @@ For more information about credentials, see [Working With Secure Credentials](ht
This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
- API version: 7.0.96 - API version: 7.0.97
- Generator version: 7.6.0 - Generator version: 7.6.0
- Build package: com.thousandeyes.api.codegen.ThousandeyesPythonGenerator - Build package: com.thousandeyes.api.codegen.ThousandeyesPythonGenerator
@ -86,7 +86,7 @@ configuration = thousandeyes_sdk.core.Configuration(
with thousandeyes_sdk.core.ApiClient(configuration) as api_client: with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.credentials.CredentialsApi(api_client) api_instance = thousandeyes_sdk.credentials.CredentialsApi(api_client)
credential_request = thousandeyes_sdk.credentials.CredentialRequest() # CredentialRequest | credential_request = # CredentialRequest |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:

View File

@ -49,7 +49,7 @@ configuration = thousandeyes_sdk.core.Configuration(
with thousandeyes_sdk.core.ApiClient(configuration) as api_client: with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.credentials.CredentialsApi(api_client) api_instance = thousandeyes_sdk.credentials.CredentialsApi(api_client)
credential_request = thousandeyes_sdk.credentials.CredentialRequest() # CredentialRequest | credential_request = # CredentialRequest |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:
@ -388,7 +388,7 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.credentials.CredentialsApi(api_client) api_instance = thousandeyes_sdk.credentials.CredentialsApi(api_client)
id = '3247' # str | The ID of the desired credential. id = '3247' # str | The ID of the desired credential.
credential_request = thousandeyes_sdk.credentials.CredentialRequest() # CredentialRequest | credential_request = # CredentialRequest |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:

View File

@ -0,0 +1,7 @@
import sys
from pathlib import Path
_repo_root = Path(__file__).resolve().parents[2]
_core_test_support = _repo_root / "thousandeyes-sdk-core" / "test"
if str(_core_test_support) not in sys.path:
sys.path.insert(0, str(_core_test_support))

View File

@ -0,0 +1,37 @@
# coding: utf-8
"""
Credentials API
Manage credentials for transaction tests using the Credentials API. The following permissions are required to access Credentials API operations: * `Settings Tests Read` for read operations. * `Settings Tests Update` for write operations. * `View sensitive data in web transaction scripts` to view the encrypted value property of credentials. * `Settings Tests Create Transaction (Tx) Tests` to create credentials. For more information about credentials, see [Working With Secure Credentials](https://docs.thousandeyes.com/product-documentation/browser-synthetics/transaction-tests/getting-started/working-with-secure-credentials).
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import unittest
from thousandeyes_sdk.core.api_client import ApiClient
from thousandeyes_sdk.core.configuration import Configuration
from sdk_test_support.mock_server import ERROR_STATUS_HEADER, OPERATION_ID_HEADER, MockApiServer
from .mock_manifest import OPERATION_MANIFEST
class IntegrationTestBase(unittest.TestCase):
def setUp(self) -> None:
self.server = MockApiServer(OPERATION_MANIFEST)
self.server.start()
configuration = Configuration(host=self.server.base_url, access_token="test-token")
self.api_client = ApiClient(configuration=configuration)
def tearDown(self) -> None:
self.server.stop()
def te_headers(self, operation_id: str, error_status=None):
headers = {OPERATION_ID_HEADER: operation_id}
if error_status is not None:
headers[ERROR_STATUS_HEADER] = error_status
return headers

View File

@ -0,0 +1,604 @@
# coding: utf-8
"""
Credentials API
Manage credentials for transaction tests using the Credentials API. The following permissions are required to access Credentials API operations: * `Settings Tests Read` for read operations. * `Settings Tests Update` for write operations. * `View sensitive data in web transaction scripts` to view the encrypted value property of credentials. * `Settings Tests Create Transaction (Tx) Tests` to create credentials. For more information about credentials, see [Working With Secure Credentials](https://docs.thousandeyes.com/product-documentation/browser-synthetics/transaction-tests/getting-started/working-with-secure-credentials).
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import json
from sdk_test_support.mock_server_types import ErrorResponseExpectation, OperationExpectation
OPERATION_MANIFEST = {
"create_credential": OperationExpectation(
operation_id="create_credential",
method="POST",
path="/credentials",
path_param_examples={
},
success_status=201,
success_body=json.loads("""
{
"_links" : {
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
},
"name" : "Example Credential",
"id" : "3247"
}
"""),
success_content_type="application/json",
request_body_example=json.loads("""
{
"name" : "Example Credential 1",
"value" : "Example Credential 1 Password"
}
"""),
error_responses={
"400": ErrorResponseExpectation(
status=400,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"errors" : [ {
"code" : "code",
"field" : "field",
"message" : "message"
}, {
"code" : "code",
"field" : "field",
"message" : "message"
} ],
"status" : 0
}"""),
content_type="application/json",
),
"401": ErrorResponseExpectation(
status=401,
body=json.loads("""
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}"""),
content_type="application/json",
),
"403": ErrorResponseExpectation(
status=403,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"404": ErrorResponseExpectation(
status=404,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"429": ErrorResponseExpectation(
status=429,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"500": ErrorResponseExpectation(
status=500,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
},
),
"delete_credential": OperationExpectation(
operation_id="delete_credential",
method="DELETE",
path="/credentials/{id}",
path_param_examples={
"id": '3247',
},
success_status=204,
success_body=None,
success_content_type="application/json",
request_body_example=None,
error_responses={
"401": ErrorResponseExpectation(
status=401,
body=json.loads("""
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}"""),
content_type="application/json",
),
"403": ErrorResponseExpectation(
status=403,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"404": ErrorResponseExpectation(
status=404,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"429": ErrorResponseExpectation(
status=429,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"500": ErrorResponseExpectation(
status=500,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
},
),
"get_credential": OperationExpectation(
operation_id="get_credential",
method="GET",
path="/credentials/{id}",
path_param_examples={
"id": '3247',
},
success_status=200,
success_body=json.loads("""
{
"_links" : {
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
},
"name" : "Example Credential",
"id" : "3247",
"value" : "rwhR12uDm1Im47p5IVXgzz4ORgC7m48ajzzeWVUt"
}
"""),
success_content_type="application/json",
request_body_example=None,
error_responses={
"400": ErrorResponseExpectation(
status=400,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"errors" : [ {
"code" : "code",
"field" : "field",
"message" : "message"
}, {
"code" : "code",
"field" : "field",
"message" : "message"
} ],
"status" : 0
}"""),
content_type="application/json",
),
"401": ErrorResponseExpectation(
status=401,
body=json.loads("""
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}"""),
content_type="application/json",
),
"403": ErrorResponseExpectation(
status=403,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"404": ErrorResponseExpectation(
status=404,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"429": ErrorResponseExpectation(
status=429,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"500": ErrorResponseExpectation(
status=500,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
},
),
"get_credentials": OperationExpectation(
operation_id="get_credentials",
method="GET",
path="/credentials",
path_param_examples={
},
success_status=200,
success_body=json.loads("""
{
"credentials" : [ {
"_links" : {
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
},
"name" : "Example Credential",
"id" : "3247",
"value" : "rwhR12uDm1Im47p5IVXgzz4ORgC7m48ajzzeWVUt"
}, {
"_links" : {
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
},
"name" : "Example Credential",
"id" : "3247",
"value" : "rwhR12uDm1Im47p5IVXgzz4ORgC7m48ajzzeWVUt"
} ],
"_links" : {
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
}
}
"""),
success_content_type="application/json",
request_body_example=None,
error_responses={
"401": ErrorResponseExpectation(
status=401,
body=json.loads("""
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}"""),
content_type="application/json",
),
"403": ErrorResponseExpectation(
status=403,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"404": ErrorResponseExpectation(
status=404,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"429": ErrorResponseExpectation(
status=429,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"500": ErrorResponseExpectation(
status=500,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
},
),
"update_credential": OperationExpectation(
operation_id="update_credential",
method="PUT",
path="/credentials/{id}",
path_param_examples={
"id": '3247',
},
success_status=200,
success_body=json.loads("""
{
"_links" : {
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
},
"name" : "Example Credential",
"id" : "3247"
}
"""),
success_content_type="application/json",
request_body_example=json.loads("""
{
"name" : "Example Credential 1",
"value" : "Example Credential 1 Password"
}
"""),
error_responses={
"400": ErrorResponseExpectation(
status=400,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"errors" : [ {
"code" : "code",
"field" : "field",
"message" : "message"
}, {
"code" : "code",
"field" : "field",
"message" : "message"
} ],
"status" : 0
}"""),
content_type="application/json",
),
"401": ErrorResponseExpectation(
status=401,
body=json.loads("""
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}"""),
content_type="application/json",
),
"403": ErrorResponseExpectation(
status=403,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"404": ErrorResponseExpectation(
status=404,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"429": ErrorResponseExpectation(
status=429,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"500": ErrorResponseExpectation(
status=500,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
},
),
}

File diff suppressed because it is too large Load Diff

View File

@ -2,15 +2,36 @@
import json import json
import unittest import unittest
from typing import Any
from pydantic import BaseModel from pydantic import BaseModel
def _project_onto_constructed(expected: Any, constructed: Any) -> Any:
"""Keep only example fields that appear in the constructed model output."""
if isinstance(constructed, dict):
if not isinstance(expected, dict):
return expected
return {
key: _project_onto_constructed(expected.get(key), value)
for key, value in constructed.items()
}
if isinstance(constructed, list):
if not isinstance(expected, list):
return expected
return [
_project_onto_constructed(expected[index], value)
for index, value in enumerate(constructed)
]
return expected
def assert_constructed_model_matches_example_json(model: BaseModel, loaded_json: dict): def assert_constructed_model_matches_example_json(model: BaseModel, loaded_json: dict):
test_case = unittest.TestCase() test_case = unittest.TestCase()
test_case.maxDiff = None test_case.maxDiff = None
test_case.assertIsNotNone(model) test_case.assertIsNotNone(model)
constructed_json = json.loads(model.to_json()) constructed_json = json.loads(model.to_json())
sorted_loaded_json = json.dumps(loaded_json, sort_keys=True) projected_loaded_json = _project_onto_constructed(loaded_json, constructed_json)
sorted_loaded_json = json.dumps(projected_loaded_json, sort_keys=True)
sorted_constructed_json = json.dumps(constructed_json, sort_keys=True) sorted_constructed_json = json.dumps(constructed_json, sort_keys=True)
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json) test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)

View File

@ -246,7 +246,13 @@ src/thousandeyes_sdk/dashboards/models/widget_measure_type.py
src/thousandeyes_sdk/dashboards/models/widget_position.py src/thousandeyes_sdk/dashboards/models/widget_position.py
src/thousandeyes_sdk/dashboards/py.typed src/thousandeyes_sdk/dashboards/py.typed
test/__init__.py test/__init__.py
test/conftest.py
test/integration_test_utils.py
test/mock_manifest.py
test/test_dashboard_snapshots_api.py test/test_dashboard_snapshots_api.py
test/test_dashboard_snapshots_api_integration.py
test/test_dashboards_api.py test/test_dashboards_api.py
test/test_dashboards_api_integration.py
test/test_dashboards_filters_api.py test/test_dashboards_filters_api.py
test/test_dashboards_filters_api_integration.py
test/test_utils.py test/test_utils.py

View File

@ -3,7 +3,7 @@ Manage ThousandEyes Dashboards.
This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
- API version: 7.0.96 - API version: 7.0.97
- Generator version: 7.6.0 - Generator version: 7.6.0
- Build package: com.thousandeyes.api.codegen.ThousandeyesPythonGenerator - Build package: com.thousandeyes.api.codegen.ThousandeyesPythonGenerator
@ -76,7 +76,7 @@ configuration = thousandeyes_sdk.core.Configuration(
with thousandeyes_sdk.core.ApiClient(configuration) as api_client: with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.dashboards.DashboardSnapshotsApi(api_client) api_instance = thousandeyes_sdk.dashboards.DashboardSnapshotsApi(api_client)
generate_dashboard_snapshot_request = thousandeyes_sdk.dashboards.GenerateDashboardSnapshotRequest() # GenerateDashboardSnapshotRequest | Request body schema to create a dashboard snapshot. generate_dashboard_snapshot_request = # GenerateDashboardSnapshotRequest | Request body schema to create a dashboard snapshot.
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:

View File

@ -50,7 +50,7 @@ configuration = thousandeyes_sdk.core.Configuration(
with thousandeyes_sdk.core.ApiClient(configuration) as api_client: with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.dashboards.DashboardSnapshotsApi(api_client) api_instance = thousandeyes_sdk.dashboards.DashboardSnapshotsApi(api_client)
generate_dashboard_snapshot_request = thousandeyes_sdk.dashboards.GenerateDashboardSnapshotRequest() # GenerateDashboardSnapshotRequest | Request body schema to create a dashboard snapshot. generate_dashboard_snapshot_request = # GenerateDashboardSnapshotRequest | Request body schema to create a dashboard snapshot.
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:
@ -482,7 +482,7 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.dashboards.DashboardSnapshotsApi(api_client) api_instance = thousandeyes_sdk.dashboards.DashboardSnapshotsApi(api_client)
snapshot_id = 'd28bb71f-5a47-4783-8f12-d4b115e61b0c' # str | A Identifier for a dashboard snapshot which can be obtained from the `/dashboards-snapshots` endpoint. snapshot_id = 'd28bb71f-5a47-4783-8f12-d4b115e61b0c' # str | A Identifier for a dashboard snapshot which can be obtained from the `/dashboards-snapshots` endpoint.
update_snapshot_expiration_date_api_request = thousandeyes_sdk.dashboards.UpdateSnapshotExpirationDateApiRequest() # UpdateSnapshotExpirationDateApiRequest | Request body schema to update a snapshot expiration. update_snapshot_expiration_date_api_request = # UpdateSnapshotExpirationDateApiRequest | Request body schema to update a snapshot expiration.
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:

View File

@ -51,7 +51,7 @@ configuration = thousandeyes_sdk.core.Configuration(
with thousandeyes_sdk.core.ApiClient(configuration) as api_client: with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.dashboards.DashboardsApi(api_client) api_instance = thousandeyes_sdk.dashboards.DashboardsApi(api_client)
dashboard = thousandeyes_sdk.dashboards.Dashboard() # Dashboard | Request body schema to create a dashboard. dashboard = # Dashboard | Request body schema to create a dashboard.
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:
@ -316,7 +316,7 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
max = 10 # float | Optionally specify the maximum number of objects to retrieve. This only applies to the **Alert List** and **Test Table** Widgets. * The default for the **Alert List** widget is set by its limitBy configuration. * The default value for the **Test Table** widget is 10. (optional) max = 10 # float | Optionally specify the maximum number of objects to retrieve. This only applies to the **Alert List** and **Test Table** Widgets. * The default for the **Alert List** widget is set by its limitBy configuration. * The default value for the **Test Table** widget is 10. (optional)
cursor = 'bGFzdFJvdW5kSWQ9MTY4MTQxMDQ4MA' # str | An optional pagination cursor. This parameter should not not be used directly. Instead, use the `_links` returned by the API. This feature is only available in the **Test Table** widget. (optional) cursor = 'bGFzdFJvdW5kSWQ9MTY4MTQxMDQ4MA' # str | An optional pagination cursor. This parameter should not not be used directly. Instead, use the `_links` returned by the API. This feature is only available in the **Test Table** widget. (optional)
sort = 'alertStatus' # str | Optional sorting parameter with attributes listed comma-separated. This only applies to the **Alert List** and **Test Table** Widgets. * For the **Alert List** widget, you can sort by `alertStatus` or `startTime`. The default is `alertStatus`. * For the **Test Table** widget, you can sort by `alertStatus`, `testName`, or `testType`. The sequence might vary from the web application. The default sort attribute is `alertStatus`. (optional) sort = 'alertStatus' # str | Optional sorting parameter with attributes listed comma-separated. This only applies to the **Alert List** and **Test Table** Widgets. * For the **Alert List** widget, you can sort by `alertStatus` or `startTime`. The default is `alertStatus`. * For the **Test Table** widget, you can sort by `alertStatus`, `testName`, or `testType`. The sequence might vary from the web application. The default sort attribute is `alertStatus`. (optional)
order = thousandeyes_sdk.dashboards.DashboardOrder() # DashboardOrder | Optional sorting order parameter that accepts either `asc` (ascending) or `desc` (descending) values. This only applies to the **Alert List** and **Test Table** Widgets. (optional) order = # DashboardOrder | Optional sorting order parameter that accepts either `asc` (ascending) or `desc` (descending) values. This only applies to the **Alert List** and **Test Table** Widgets. (optional)
try: try:
# Retrieve dashboard widget data # Retrieve dashboard widget data
@ -686,7 +686,7 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.dashboards.DashboardsApi(api_client) api_instance = thousandeyes_sdk.dashboards.DashboardsApi(api_client)
dashboard_id = '646f4d2ce3c99b0536c3821e' # str | A Identifier for a dashboard which can be obtained from the `/dashboards` endpoint. dashboard_id = '646f4d2ce3c99b0536c3821e' # str | A Identifier for a dashboard which can be obtained from the `/dashboards` endpoint.
dashboard = thousandeyes_sdk.dashboards.Dashboard() # Dashboard | Request body schema to update a dashboard. dashboard = # Dashboard | Request body schema to update a dashboard.
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:

View File

@ -49,7 +49,7 @@ configuration = thousandeyes_sdk.core.Configuration(
with thousandeyes_sdk.core.ApiClient(configuration) as api_client: with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.dashboards.DashboardsFiltersApi(api_client) api_instance = thousandeyes_sdk.dashboards.DashboardsFiltersApi(api_client)
api_context_filter_request = thousandeyes_sdk.dashboards.ApiContextFilterRequest() # ApiContextFilterRequest | Dashboard filter object to be created and saved api_context_filter_request = # ApiContextFilterRequest | Dashboard filter object to be created and saved
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:
@ -392,7 +392,7 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.dashboards.DashboardsFiltersApi(api_client) api_instance = thousandeyes_sdk.dashboards.DashboardsFiltersApi(api_client)
id = '65bc18e8f2073a4a469cd958' # str | Unique dashboard filter ID. id = '65bc18e8f2073a4a469cd958' # str | Unique dashboard filter ID.
api_context_filter_request = thousandeyes_sdk.dashboards.ApiContextFilterRequest() # ApiContextFilterRequest | Updated dashboard filter context object api_context_filter_request = # ApiContextFilterRequest | Updated dashboard filter context object
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:

View File

@ -0,0 +1,7 @@
import sys
from pathlib import Path
_repo_root = Path(__file__).resolve().parents[2]
_core_test_support = _repo_root / "thousandeyes-sdk-core" / "test"
if str(_core_test_support) not in sys.path:
sys.path.insert(0, str(_core_test_support))

View File

@ -0,0 +1,37 @@
# coding: utf-8
"""
Dashboards API
Manage ThousandEyes Dashboards.
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import unittest
from thousandeyes_sdk.core.api_client import ApiClient
from thousandeyes_sdk.core.configuration import Configuration
from sdk_test_support.mock_server import ERROR_STATUS_HEADER, OPERATION_ID_HEADER, MockApiServer
from .mock_manifest import OPERATION_MANIFEST
class IntegrationTestBase(unittest.TestCase):
def setUp(self) -> None:
self.server = MockApiServer(OPERATION_MANIFEST)
self.server.start()
configuration = Configuration(host=self.server.base_url, access_token="test-token")
self.api_client = ApiClient(configuration=configuration)
def tearDown(self) -> None:
self.server.stop()
def te_headers(self, operation_id: str, error_status=None):
headers = {OPERATION_ID_HEADER: operation_id}
if error_status is not None:
headers[ERROR_STATUS_HEADER] = error_status
return headers

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -2,15 +2,36 @@
import json import json
import unittest import unittest
from typing import Any
from pydantic import BaseModel from pydantic import BaseModel
def _project_onto_constructed(expected: Any, constructed: Any) -> Any:
"""Keep only example fields that appear in the constructed model output."""
if isinstance(constructed, dict):
if not isinstance(expected, dict):
return expected
return {
key: _project_onto_constructed(expected.get(key), value)
for key, value in constructed.items()
}
if isinstance(constructed, list):
if not isinstance(expected, list):
return expected
return [
_project_onto_constructed(expected[index], value)
for index, value in enumerate(constructed)
]
return expected
def assert_constructed_model_matches_example_json(model: BaseModel, loaded_json: dict): def assert_constructed_model_matches_example_json(model: BaseModel, loaded_json: dict):
test_case = unittest.TestCase() test_case = unittest.TestCase()
test_case.maxDiff = None test_case.maxDiff = None
test_case.assertIsNotNone(model) test_case.assertIsNotNone(model)
constructed_json = json.loads(model.to_json()) constructed_json = json.loads(model.to_json())
sorted_loaded_json = json.dumps(loaded_json, sort_keys=True) projected_loaded_json = _project_onto_constructed(loaded_json, constructed_json)
sorted_loaded_json = json.dumps(projected_loaded_json, sort_keys=True)
sorted_constructed_json = json.dumps(constructed_json, sort_keys=True) sorted_constructed_json = json.dumps(constructed_json, sort_keys=True)
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json) test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)

View File

@ -32,5 +32,9 @@ src/thousandeyes_sdk/emulation/models/user_agent.py
src/thousandeyes_sdk/emulation/models/user_agents.py src/thousandeyes_sdk/emulation/models/user_agents.py
src/thousandeyes_sdk/emulation/py.typed src/thousandeyes_sdk/emulation/py.typed
test/__init__.py test/__init__.py
test/conftest.py
test/integration_test_utils.py
test/mock_manifest.py
test/test_emulation_api.py test/test_emulation_api.py
test/test_emulation_api_integration.py
test/test_utils.py test/test_utils.py

View File

@ -11,7 +11,7 @@ To access Emulation API operations, the following permissions are required:
This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
- API version: 7.0.96 - API version: 7.0.97
- Generator version: 7.6.0 - Generator version: 7.6.0
- Build package: com.thousandeyes.api.codegen.ThousandeyesPythonGenerator - Build package: com.thousandeyes.api.codegen.ThousandeyesPythonGenerator
@ -84,7 +84,7 @@ configuration = thousandeyes_sdk.core.Configuration(
with thousandeyes_sdk.core.ApiClient(configuration) as api_client: with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.emulation.EmulationApi(api_client) api_instance = thousandeyes_sdk.emulation.EmulationApi(api_client)
emulated_device = thousandeyes_sdk.emulation.EmulatedDevice() # EmulatedDevice | emulated_device = # EmulatedDevice |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:

View File

@ -47,7 +47,7 @@ configuration = thousandeyes_sdk.core.Configuration(
with thousandeyes_sdk.core.ApiClient(configuration) as api_client: with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.emulation.EmulationApi(api_client) api_instance = thousandeyes_sdk.emulation.EmulationApi(api_client)
emulated_device = thousandeyes_sdk.emulation.EmulatedDevice() # EmulatedDevice | emulated_device = # EmulatedDevice |
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:
@ -133,7 +133,7 @@ configuration = thousandeyes_sdk.core.Configuration(
with thousandeyes_sdk.core.ApiClient(configuration) as api_client: with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.emulation.EmulationApi(api_client) api_instance = thousandeyes_sdk.emulation.EmulationApi(api_client)
expand = [thousandeyes_sdk.emulation.ExpandEmulatedDeviceOptions()] # List[ExpandEmulatedDeviceOptions] | Optional query parameter that controls whether user-agent templates are included in the response. By default, user-agent templates are not included. To include them, add `?expand=user-agent` to the request. (optional) expand = # List[ExpandEmulatedDeviceOptions] | Optional query parameter that controls whether user-agent templates are included in the response. By default, user-agent templates are not included. To include them, add `?expand=user-agent` to the request. (optional)
try: try:
# List emulated devices # List emulated devices

View File

@ -0,0 +1,7 @@
import sys
from pathlib import Path
_repo_root = Path(__file__).resolve().parents[2]
_core_test_support = _repo_root / "thousandeyes-sdk-core" / "test"
if str(_core_test_support) not in sys.path:
sys.path.insert(0, str(_core_test_support))

View File

@ -0,0 +1,37 @@
# coding: utf-8
"""
Emulation API
**Note:** All Emulation APIs are not available for ThousandEyes for Government instance. The Emulation API facilitates the retrieval of user-agent strings for HTTP, pageload, and transaction tests. It also enables the retrieval and addition of emulated devices for pageload and transaction tests. To access Emulation API operations, the following permissions are required: * `Settings Tests Read` for read operations. * `Settings Tests Update` for write operations.
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import unittest
from thousandeyes_sdk.core.api_client import ApiClient
from thousandeyes_sdk.core.configuration import Configuration
from sdk_test_support.mock_server import ERROR_STATUS_HEADER, OPERATION_ID_HEADER, MockApiServer
from .mock_manifest import OPERATION_MANIFEST
class IntegrationTestBase(unittest.TestCase):
def setUp(self) -> None:
self.server = MockApiServer(OPERATION_MANIFEST)
self.server.start()
configuration = Configuration(host=self.server.base_url, access_token="test-token")
self.api_client = ApiClient(configuration=configuration)
def tearDown(self) -> None:
self.server.stop()
def te_headers(self, operation_id: str, error_status=None):
headers = {OPERATION_ID_HEADER: operation_id}
if error_status is not None:
headers[ERROR_STATUS_HEADER] = error_status
return headers

View File

@ -0,0 +1,340 @@
# coding: utf-8
"""
Emulation API
**Note:** All Emulation APIs are not available for ThousandEyes for Government instance. The Emulation API facilitates the retrieval of user-agent strings for HTTP, pageload, and transaction tests. It also enables the retrieval and addition of emulated devices for pageload and transaction tests. To access Emulation API operations, the following permissions are required: * `Settings Tests Read` for read operations. * `Settings Tests Update` for write operations.
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import json
from sdk_test_support.mock_server_types import ErrorResponseExpectation, OperationExpectation
OPERATION_MANIFEST = {
"create_emulated_device": OperationExpectation(
operation_id="create_emulated_device",
method="POST",
path="/emulated-devices",
path_param_examples={
},
success_status=201,
success_body=json.loads("""
{
"availableUserAgents" : [ "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.70 Mobile Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.70 Safari/537.36" ],
"width" : 1024,
"name" : "iPad Pro 12.9-in",
"codeName" : "IPAD_PRO_12_9",
"id" : "11",
"category" : "desktop",
"defaultUserAgentTemplate" : "Mozilla/5.0 (Android 4.4; Tablet; rv:70.0) Gecko/70.0 Firefox/70.0",
"height" : 768
}
"""),
success_content_type="application/json",
request_body_example=json.loads("""
{
"width" : 1024,
"category" : "desktop",
"height" : 768
}
"""),
error_responses={
"401": ErrorResponseExpectation(
status=401,
body=json.loads("""
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}"""),
content_type="application/json",
),
"403": ErrorResponseExpectation(
status=403,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"404": ErrorResponseExpectation(
status=404,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"429": ErrorResponseExpectation(
status=429,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"500": ErrorResponseExpectation(
status=500,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
},
),
"get_emulated_devices": OperationExpectation(
operation_id="get_emulated_devices",
method="GET",
path="/emulated-devices",
path_param_examples={
},
success_status=200,
success_body=json.loads("""
{
"emulatedDevices" : [ {
"availableUserAgents" : [ "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.70 Mobile Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.70 Safari/537.36" ],
"width" : 1024,
"name" : "iPad Pro 12.9-in",
"codeName" : "IPAD_PRO_12_9",
"id" : "11",
"category" : "desktop",
"defaultUserAgentTemplate" : "Mozilla/5.0 (Android 4.4; Tablet; rv:70.0) Gecko/70.0 Firefox/70.0",
"height" : 768
}, {
"availableUserAgents" : [ "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.70 Mobile Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.70 Safari/537.36" ],
"width" : 1024,
"name" : "iPad Pro 12.9-in",
"codeName" : "IPAD_PRO_12_9",
"id" : "11",
"category" : "desktop",
"defaultUserAgentTemplate" : "Mozilla/5.0 (Android 4.4; Tablet; rv:70.0) Gecko/70.0 Firefox/70.0",
"height" : 768
} ],
"_links" : {
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
}
}
"""),
success_content_type="application/json",
request_body_example=None,
error_responses={
"401": ErrorResponseExpectation(
status=401,
body=json.loads("""
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}"""),
content_type="application/json",
),
"403": ErrorResponseExpectation(
status=403,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"404": ErrorResponseExpectation(
status=404,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"429": ErrorResponseExpectation(
status=429,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"500": ErrorResponseExpectation(
status=500,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
},
),
"get_user_agents": OperationExpectation(
operation_id="get_user_agents",
method="GET",
path="/user-agents",
path_param_examples={
},
success_status=200,
success_body=json.loads("""
{
"_links" : {
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
},
"userAgents" : [ {
"os" : "Windows",
"browser" : "Firefox",
"value" : "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.70 Mobile Safari/537.36"
}, {
"os" : "Windows",
"browser" : "Firefox",
"value" : "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.70 Mobile Safari/537.36"
} ]
}
"""),
success_content_type="application/json",
request_body_example=None,
error_responses={
"401": ErrorResponseExpectation(
status=401,
body=json.loads("""
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}"""),
content_type="application/json",
),
"403": ErrorResponseExpectation(
status=403,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"404": ErrorResponseExpectation(
status=404,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"429": ErrorResponseExpectation(
status=429,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
"500": ErrorResponseExpectation(
status=500,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
},
),
}

View File

@ -0,0 +1,572 @@
# coding: utf-8
"""
Emulation API
**Note:** All Emulation APIs are not available for ThousandEyes for Government instance. The Emulation API facilitates the retrieval of user-agent strings for HTTP, pageload, and transaction tests. It also enables the retrieval and addition of emulated devices for pageload and transaction tests. To access Emulation API operations, the following permissions are required: * `Settings Tests Read` for read operations. * `Settings Tests Update` for write operations.
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import json
import unittest
import thousandeyes_sdk.emulation.models
from thousandeyes_sdk.core.exceptions import ApiException
from thousandeyes_sdk.emulation.api.emulation_api import EmulationApi
from .integration_test_utils import IntegrationTestBase
from .test_utils import assert_constructed_model_matches_example_json
class TestEmulationApiIntegration(IntegrationTestBase):
"""EmulationApi integration test stubs"""
def setUp(self) -> None:
super().setUp()
self.api = EmulationApi(self.api_client)
def test_create_emulated_device_happy_path(self) -> None:
"""Integration test for create_emulated_device success path"""
request_body_json = """
{
"width" : 1024,
"category" : "desktop",
"height" : 768
}
"""
emulated_device = thousandeyes_sdk.emulation.models.EmulatedDevice.from_json(request_body_json)
aid = '1234'
response_body_json = """
{
"availableUserAgents" : [ "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.70 Mobile Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.70 Safari/537.36" ],
"width" : 1024,
"name" : "iPad Pro 12.9-in",
"codeName" : "IPAD_PRO_12_9",
"id" : "11",
"category" : "desktop",
"defaultUserAgentTemplate" : "Mozilla/5.0 (Android 4.4; Tablet; rv:70.0) Gecko/70.0 Firefox/70.0",
"height" : 768
}
"""
expected_response = json.loads(response_body_json)
response = self.api.create_emulated_device(
emulated_device=emulated_device,
aid=aid,
_headers=self.te_headers("create_emulated_device"),
)
assert_constructed_model_matches_example_json(response, expected_response)
def test_create_emulated_device_error_401(self) -> None:
"""Integration test for create_emulated_device error path (HTTP 401)"""
request_body_json = """
{
"width" : 1024,
"category" : "desktop",
"height" : 768
}
"""
emulated_device = thousandeyes_sdk.emulation.models.EmulatedDevice.from_json(request_body_json)
aid = '1234'
error_body_json = """
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(401)
) as context:
self.api.create_emulated_device(
emulated_device=emulated_device,
aid=aid,
_headers=self.te_headers("create_emulated_device", error_status="401"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_create_emulated_device_error_403(self) -> None:
"""Integration test for create_emulated_device error path (HTTP 403)"""
request_body_json = """
{
"width" : 1024,
"category" : "desktop",
"height" : 768
}
"""
emulated_device = thousandeyes_sdk.emulation.models.EmulatedDevice.from_json(request_body_json)
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(403)
) as context:
self.api.create_emulated_device(
emulated_device=emulated_device,
aid=aid,
_headers=self.te_headers("create_emulated_device", error_status="403"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_create_emulated_device_error_404(self) -> None:
"""Integration test for create_emulated_device error path (HTTP 404)"""
request_body_json = """
{
"width" : 1024,
"category" : "desktop",
"height" : 768
}
"""
emulated_device = thousandeyes_sdk.emulation.models.EmulatedDevice.from_json(request_body_json)
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(404)
) as context:
self.api.create_emulated_device(
emulated_device=emulated_device,
aid=aid,
_headers=self.te_headers("create_emulated_device", error_status="404"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_create_emulated_device_error_429(self) -> None:
"""Integration test for create_emulated_device error path (HTTP 429)"""
request_body_json = """
{
"width" : 1024,
"category" : "desktop",
"height" : 768
}
"""
emulated_device = thousandeyes_sdk.emulation.models.EmulatedDevice.from_json(request_body_json)
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(429)
) as context:
self.api.create_emulated_device(
emulated_device=emulated_device,
aid=aid,
_headers=self.te_headers("create_emulated_device", error_status="429"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_create_emulated_device_error_500(self) -> None:
"""Integration test for create_emulated_device error path (HTTP 500)"""
request_body_json = """
{
"width" : 1024,
"category" : "desktop",
"height" : 768
}
"""
emulated_device = thousandeyes_sdk.emulation.models.EmulatedDevice.from_json(request_body_json)
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(500)
) as context:
self.api.create_emulated_device(
emulated_device=emulated_device,
aid=aid,
_headers=self.te_headers("create_emulated_device", error_status="500"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_emulated_devices_happy_path(self) -> None:
"""Integration test for get_emulated_devices success path"""
response_body_json = """
{
"emulatedDevices" : [ {
"availableUserAgents" : [ "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.70 Mobile Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.70 Safari/537.36" ],
"width" : 1024,
"name" : "iPad Pro 12.9-in",
"codeName" : "IPAD_PRO_12_9",
"id" : "11",
"category" : "desktop",
"defaultUserAgentTemplate" : "Mozilla/5.0 (Android 4.4; Tablet; rv:70.0) Gecko/70.0 Firefox/70.0",
"height" : 768
}, {
"availableUserAgents" : [ "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.70 Mobile Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.70 Safari/537.36" ],
"width" : 1024,
"name" : "iPad Pro 12.9-in",
"codeName" : "IPAD_PRO_12_9",
"id" : "11",
"category" : "desktop",
"defaultUserAgentTemplate" : "Mozilla/5.0 (Android 4.4; Tablet; rv:70.0) Gecko/70.0 Firefox/70.0",
"height" : 768
} ],
"_links" : {
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
}
}
"""
expected_response = json.loads(response_body_json)
response = self.api.get_emulated_devices(
_headers=self.te_headers("get_emulated_devices"),
)
assert_constructed_model_matches_example_json(response, expected_response)
def test_get_emulated_devices_error_401(self) -> None:
"""Integration test for get_emulated_devices error path (HTTP 401)"""
error_body_json = """
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(401)
) as context:
self.api.get_emulated_devices(
_headers=self.te_headers("get_emulated_devices", error_status="401"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_emulated_devices_error_403(self) -> None:
"""Integration test for get_emulated_devices error path (HTTP 403)"""
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(403)
) as context:
self.api.get_emulated_devices(
_headers=self.te_headers("get_emulated_devices", error_status="403"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_emulated_devices_error_404(self) -> None:
"""Integration test for get_emulated_devices error path (HTTP 404)"""
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(404)
) as context:
self.api.get_emulated_devices(
_headers=self.te_headers("get_emulated_devices", error_status="404"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_emulated_devices_error_429(self) -> None:
"""Integration test for get_emulated_devices error path (HTTP 429)"""
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(429)
) as context:
self.api.get_emulated_devices(
_headers=self.te_headers("get_emulated_devices", error_status="429"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_emulated_devices_error_500(self) -> None:
"""Integration test for get_emulated_devices error path (HTTP 500)"""
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(500)
) as context:
self.api.get_emulated_devices(
_headers=self.te_headers("get_emulated_devices", error_status="500"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_user_agents_happy_path(self) -> None:
"""Integration test for get_user_agents success path"""
aid = '1234'
response_body_json = """
{
"_links" : {
"self" : {
"hreflang" : "hreflang",
"templated" : true,
"profile" : "profile",
"name" : "name",
"href" : "https://api.thousandeyes.com/v7/link/to/resource/id",
"type" : "type",
"deprecation" : "deprecation",
"title" : "title"
}
},
"userAgents" : [ {
"os" : "Windows",
"browser" : "Firefox",
"value" : "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.70 Mobile Safari/537.36"
}, {
"os" : "Windows",
"browser" : "Firefox",
"value" : "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.70 Mobile Safari/537.36"
} ]
}
"""
expected_response = json.loads(response_body_json)
response = self.api.get_user_agents(
aid=aid,
_headers=self.te_headers("get_user_agents"),
)
assert_constructed_model_matches_example_json(response, expected_response)
def test_get_user_agents_error_401(self) -> None:
"""Integration test for get_user_agents error path (HTTP 401)"""
aid = '1234'
error_body_json = """
{
"error_description" : "Invalid access token",
"error" : "invalid_token"
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(401)
) as context:
self.api.get_user_agents(
aid=aid,
_headers=self.te_headers("get_user_agents", error_status="401"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_user_agents_error_403(self) -> None:
"""Integration test for get_user_agents error path (HTTP 403)"""
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(403)
) as context:
self.api.get_user_agents(
aid=aid,
_headers=self.te_headers("get_user_agents", error_status="403"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_user_agents_error_404(self) -> None:
"""Integration test for get_user_agents error path (HTTP 404)"""
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(404)
) as context:
self.api.get_user_agents(
aid=aid,
_headers=self.te_headers("get_user_agents", error_status="404"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_user_agents_error_429(self) -> None:
"""Integration test for get_user_agents error path (HTTP 429)"""
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(429)
) as context:
self.api.get_user_agents(
aid=aid,
_headers=self.te_headers("get_user_agents", error_status="429"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_user_agents_error_500(self) -> None:
"""Integration test for get_user_agents error path (HTTP 500)"""
aid = '1234'
error_body_json = """
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(500)
) as context:
self.api.get_user_agents(
aid=aid,
_headers=self.te_headers("get_user_agents", error_status="500"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
if __name__ == '__main__':
unittest.main()

View File

@ -2,15 +2,36 @@
import json import json
import unittest import unittest
from typing import Any
from pydantic import BaseModel from pydantic import BaseModel
def _project_onto_constructed(expected: Any, constructed: Any) -> Any:
"""Keep only example fields that appear in the constructed model output."""
if isinstance(constructed, dict):
if not isinstance(expected, dict):
return expected
return {
key: _project_onto_constructed(expected.get(key), value)
for key, value in constructed.items()
}
if isinstance(constructed, list):
if not isinstance(expected, list):
return expected
return [
_project_onto_constructed(expected[index], value)
for index, value in enumerate(constructed)
]
return expected
def assert_constructed_model_matches_example_json(model: BaseModel, loaded_json: dict): def assert_constructed_model_matches_example_json(model: BaseModel, loaded_json: dict):
test_case = unittest.TestCase() test_case = unittest.TestCase()
test_case.maxDiff = None test_case.maxDiff = None
test_case.assertIsNotNone(model) test_case.assertIsNotNone(model)
constructed_json = json.loads(model.to_json()) constructed_json = json.loads(model.to_json())
sorted_loaded_json = json.dumps(loaded_json, sort_keys=True) projected_loaded_json = _project_onto_constructed(loaded_json, constructed_json)
sorted_loaded_json = json.dumps(projected_loaded_json, sort_keys=True)
sorted_constructed_json = json.dumps(constructed_json, sort_keys=True) sorted_constructed_json = json.dumps(constructed_json, sort_keys=True)
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json) test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)

View File

@ -152,8 +152,15 @@ src/thousandeyes_sdk/endpoint_agents/models/vpn_type.py
src/thousandeyes_sdk/endpoint_agents/models/wireless_profile.py src/thousandeyes_sdk/endpoint_agents/models/wireless_profile.py
src/thousandeyes_sdk/endpoint_agents/py.typed src/thousandeyes_sdk/endpoint_agents/py.typed
test/__init__.py test/__init__.py
test/conftest.py
test/integration_test_utils.py
test/mock_manifest.py
test/test_endpoint_agent_log_items_api.py test/test_endpoint_agent_log_items_api.py
test/test_endpoint_agent_log_items_api_integration.py
test/test_endpoint_agents_api.py test/test_endpoint_agents_api.py
test/test_endpoint_agents_api_integration.py
test/test_endpoint_agents_transfer_api.py test/test_endpoint_agents_transfer_api.py
test/test_endpoint_agents_transfer_api_integration.py
test/test_endpoint_proxies_api.py test/test_endpoint_proxies_api.py
test/test_endpoint_proxies_api_integration.py
test/test_utils.py test/test_utils.py

View File

@ -7,7 +7,7 @@ For more information about Endpoint Agents, see [Endpoint Agents](https://docs.t
This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
- API version: 7.0.96 - API version: 7.0.97
- Generator version: 7.6.0 - Generator version: 7.6.0
- Build package: com.thousandeyes.api.codegen.ThousandeyesPythonGenerator - Build package: com.thousandeyes.api.codegen.ThousandeyesPythonGenerator

View File

@ -53,7 +53,7 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
api_instance = thousandeyes_sdk.endpoint_agents.EndpointAgentsApi(api_client) api_instance = thousandeyes_sdk.endpoint_agents.EndpointAgentsApi(api_client)
agent_id = 'agent_id_example' # str | The identifier of the agent to operate on. agent_id = 'agent_id_example' # str | The identifier of the agent to operate on.
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
expand = [thousandeyes_sdk.endpoint_agents.ExpandEndpointAgentOptions()] # List[ExpandEndpointAgentOptions] | This optional parameter allows you to control the expansion of test resources associated with the agent. By default, no expansion occurs when this query parameter is omitted. To expand the \"clients\" resource, include the query parameter `?expand=clients`. For multiple expansions, you have two options: * Separate the values with commas. For example, `?expandAgent=clients,tasks`. * Specify the parameter multiple times. For example, `?expandAgent=clients&expandAgent=tasks`. This parameter offers flexibility for users to customize the expansion of specific resources related to the agent. (optional) expand = # List[ExpandEndpointAgentOptions] | This optional parameter allows you to control the expansion of test resources associated with the agent. By default, no expansion occurs when this query parameter is omitted. To expand the \"clients\" resource, include the query parameter `?expand=clients`. For multiple expansions, you have two options: * Separate the values with commas. For example, `?expandAgent=clients,tasks`. * Specify the parameter multiple times. For example, `?expandAgent=clients&expandAgent=tasks`. This parameter offers flexibility for users to customize the expansion of specific resources related to the agent. (optional)
try: try:
# Delete endpoint agent # Delete endpoint agent
@ -305,12 +305,12 @@ configuration = thousandeyes_sdk.core.Configuration(
with thousandeyes_sdk.core.ApiClient(configuration) as api_client: with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.endpoint_agents.EndpointAgentsApi(api_client) api_instance = thousandeyes_sdk.endpoint_agents.EndpointAgentsApi(api_client)
agent_search_request = thousandeyes_sdk.endpoint_agents.AgentSearchRequest() # AgentSearchRequest | The filter options for advanced search filtering for agents. agent_search_request = # AgentSearchRequest | The filter options for advanced search filtering for agents.
max = 5 # int | (Optional) Maximum number of objects to return. (optional) max = 5 # int | (Optional) Maximum number of objects to return. (optional)
cursor = 'cursor_example' # str | (Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter. (optional) cursor = 'cursor_example' # str | (Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter. (optional)
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
expand = [thousandeyes_sdk.endpoint_agents.ExpandEndpointAgentOptions()] # List[ExpandEndpointAgentOptions] | This optional parameter allows you to control the expansion of test resources associated with the agent. By default, no expansion occurs when this query parameter is omitted. To expand the \"clients\" resource, include the query parameter `?expand=clients`. For multiple expansions, you have two options: * Separate the values with commas. For example, `?expandAgent=clients,tasks`. * Specify the parameter multiple times. For example, `?expandAgent=clients&expandAgent=tasks`. This parameter offers flexibility for users to customize the expansion of specific resources related to the agent. (optional) expand = # List[ExpandEndpointAgentOptions] | This optional parameter allows you to control the expansion of test resources associated with the agent. By default, no expansion occurs when this query parameter is omitted. To expand the \"clients\" resource, include the query parameter `?expand=clients`. For multiple expansions, you have two options: * Separate the values with commas. For example, `?expandAgent=clients,tasks`. * Specify the parameter multiple times. For example, `?expandAgent=clients&expandAgent=tasks`. This parameter offers flexibility for users to customize the expansion of specific resources related to the agent. (optional)
include_deleted = false # bool | When requesting entities, set to `true` if you want to see deleted entities. (optional) include_deleted = False # bool | When requesting entities, set to `true` if you want to see deleted entities. (optional)
try: try:
# Filter endpoint agents # Filter endpoint agents
@ -400,8 +400,8 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
api_instance = thousandeyes_sdk.endpoint_agents.EndpointAgentsApi(api_client) api_instance = thousandeyes_sdk.endpoint_agents.EndpointAgentsApi(api_client)
agent_id = 'agent_id_example' # str | The identifier of the agent to operate on. agent_id = 'agent_id_example' # str | The identifier of the agent to operate on.
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
expand = [thousandeyes_sdk.endpoint_agents.ExpandEndpointAgentOptions()] # List[ExpandEndpointAgentOptions] | This optional parameter allows you to control the expansion of test resources associated with the agent. By default, no expansion occurs when this query parameter is omitted. To expand the \"clients\" resource, include the query parameter `?expand=clients`. For multiple expansions, you have two options: * Separate the values with commas. For example, `?expandAgent=clients,tasks`. * Specify the parameter multiple times. For example, `?expandAgent=clients&expandAgent=tasks`. This parameter offers flexibility for users to customize the expansion of specific resources related to the agent. (optional) expand = # List[ExpandEndpointAgentOptions] | This optional parameter allows you to control the expansion of test resources associated with the agent. By default, no expansion occurs when this query parameter is omitted. To expand the \"clients\" resource, include the query parameter `?expand=clients`. For multiple expansions, you have two options: * Separate the values with commas. For example, `?expandAgent=clients,tasks`. * Specify the parameter multiple times. For example, `?expandAgent=clients&expandAgent=tasks`. This parameter offers flexibility for users to customize the expansion of specific resources related to the agent. (optional)
include_deleted = false # bool | When requesting entities, set to `true` if you want to see deleted entities. (optional) include_deleted = False # bool | When requesting entities, set to `true` if you want to see deleted entities. (optional)
try: try:
# Retrieve endpoint agent # Retrieve endpoint agent
@ -490,8 +490,8 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
max = 5 # int | (Optional) Maximum number of objects to return. (optional) max = 5 # int | (Optional) Maximum number of objects to return. (optional)
cursor = 'cursor_example' # str | (Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter. (optional) cursor = 'cursor_example' # str | (Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter. (optional)
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
expand = [thousandeyes_sdk.endpoint_agents.ExpandEndpointAgentOptions()] # List[ExpandEndpointAgentOptions] | This optional parameter allows you to control the expansion of test resources associated with the agent. By default, no expansion occurs when this query parameter is omitted. To expand the \"clients\" resource, include the query parameter `?expand=clients`. For multiple expansions, you have two options: * Separate the values with commas. For example, `?expandAgent=clients,tasks`. * Specify the parameter multiple times. For example, `?expandAgent=clients&expandAgent=tasks`. This parameter offers flexibility for users to customize the expansion of specific resources related to the agent. (optional) expand = # List[ExpandEndpointAgentOptions] | This optional parameter allows you to control the expansion of test resources associated with the agent. By default, no expansion occurs when this query parameter is omitted. To expand the \"clients\" resource, include the query parameter `?expand=clients`. For multiple expansions, you have two options: * Separate the values with commas. For example, `?expandAgent=clients,tasks`. * Specify the parameter multiple times. For example, `?expandAgent=clients&expandAgent=tasks`. This parameter offers flexibility for users to customize the expansion of specific resources related to the agent. (optional)
include_deleted = false # bool | When requesting entities, set to `true` if you want to see deleted entities. (optional) include_deleted = False # bool | When requesting entities, set to `true` if you want to see deleted entities. (optional)
use_all_permitted_aids = False # bool | Set to `true` to load data from all accounts the user has access to. (optional) (default to False) use_all_permitted_aids = False # bool | Set to `true` to load data from all accounts the user has access to. (optional) (default to False)
agent_name = 'agent_name_example' # str | Returns only agents with the specified name. This is an exact match only. (optional) agent_name = 'agent_name_example' # str | Returns only agents with the specified name. This is an exact match only. (optional)
computer_name = 'computer_name_example' # str | Returns only agents with the specified computer name. This is an exact match only. (optional) computer_name = 'computer_name_example' # str | Returns only agents with the specified computer name. This is an exact match only. (optional)
@ -665,8 +665,8 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
api_instance = thousandeyes_sdk.endpoint_agents.EndpointAgentsApi(api_client) api_instance = thousandeyes_sdk.endpoint_agents.EndpointAgentsApi(api_client)
agent_id = 'agent_id_example' # str | The identifier of the agent to operate on. agent_id = 'agent_id_example' # str | The identifier of the agent to operate on.
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
expand = [thousandeyes_sdk.endpoint_agents.ExpandEndpointAgentOptions()] # List[ExpandEndpointAgentOptions] | This optional parameter allows you to control the expansion of test resources associated with the agent. By default, no expansion occurs when this query parameter is omitted. To expand the \"clients\" resource, include the query parameter `?expand=clients`. For multiple expansions, you have two options: * Separate the values with commas. For example, `?expandAgent=clients,tasks`. * Specify the parameter multiple times. For example, `?expandAgent=clients&expandAgent=tasks`. This parameter offers flexibility for users to customize the expansion of specific resources related to the agent. (optional) expand = # List[ExpandEndpointAgentOptions] | This optional parameter allows you to control the expansion of test resources associated with the agent. By default, no expansion occurs when this query parameter is omitted. To expand the \"clients\" resource, include the query parameter `?expand=clients`. For multiple expansions, you have two options: * Separate the values with commas. For example, `?expandAgent=clients,tasks`. * Specify the parameter multiple times. For example, `?expandAgent=clients&expandAgent=tasks`. This parameter offers flexibility for users to customize the expansion of specific resources related to the agent. (optional)
endpoint_agent_update = thousandeyes_sdk.endpoint_agents.EndpointAgentUpdate() # EndpointAgentUpdate | Fields to modify on the agent (optional) endpoint_agent_update = # EndpointAgentUpdate | Fields to modify on the agent (optional)
try: try:
# Update endpoint agent # Update endpoint agent

View File

@ -46,7 +46,7 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.endpoint_agents.EndpointAgentsTransferApi(api_client) api_instance = thousandeyes_sdk.endpoint_agents.EndpointAgentsTransferApi(api_client)
agent_id = 'agent_id_example' # str | The identifier of the agent to operate on. agent_id = 'agent_id_example' # str | The identifier of the agent to operate on.
agent_transfer_request = thousandeyes_sdk.endpoint_agents.AgentTransferRequest() # AgentTransferRequest | The request to move an agent between accounts. agent_transfer_request = # AgentTransferRequest | The request to move an agent between accounts.
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
try: try:
@ -131,7 +131,7 @@ with thousandeyes_sdk.core.ApiClient(configuration) as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = thousandeyes_sdk.endpoint_agents.EndpointAgentsTransferApi(api_client) api_instance = thousandeyes_sdk.endpoint_agents.EndpointAgentsTransferApi(api_client)
aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional) aid = '1234' # str | A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response. (optional)
bulk_agent_transfer_request = thousandeyes_sdk.endpoint_agents.BulkAgentTransferRequest() # BulkAgentTransferRequest | A collection of `AgentTransfers`. (optional) bulk_agent_transfer_request = # BulkAgentTransferRequest | A collection of `AgentTransfers`. (optional)
try: try:
# Bulk transfer agents # Bulk transfer agents

View File

@ -0,0 +1,7 @@
import sys
from pathlib import Path
_repo_root = Path(__file__).resolve().parents[2]
_core_test_support = _repo_root / "thousandeyes-sdk-core" / "test"
if str(_core_test_support) not in sys.path:
sys.path.insert(0, str(_core_test_support))

View File

@ -0,0 +1,37 @@
# coding: utf-8
"""
Endpoint Agents API
**Note:** The Endpoint Agents Transfer APIs are not available for ThousandEyes for Government instance. Manage ThousandEyes Endpoint Agents using this API. For more information about Endpoint Agents, see [Endpoint Agents](https://docs.thousandeyes.com/product-documentation/global-vantage-points/endpoint-agents).
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import unittest
from thousandeyes_sdk.core.api_client import ApiClient
from thousandeyes_sdk.core.configuration import Configuration
from sdk_test_support.mock_server import ERROR_STATUS_HEADER, OPERATION_ID_HEADER, MockApiServer
from .mock_manifest import OPERATION_MANIFEST
class IntegrationTestBase(unittest.TestCase):
def setUp(self) -> None:
self.server = MockApiServer(OPERATION_MANIFEST)
self.server.start()
configuration = Configuration(host=self.server.base_url, access_token="test-token")
self.api_client = ApiClient(configuration=configuration)
def tearDown(self) -> None:
self.server.stop()
def te_headers(self, operation_id: str, error_status=None):
headers = {OPERATION_ID_HEADER: operation_id}
if error_status is not None:
headers[ERROR_STATUS_HEADER] = error_status
return headers

Some files were not shown because too many files have changed in this diff Show More