This commit is contained in:
Kevin Han 2026-07-28 16:04:05 +00:00 committed by GitHub
commit 60baf5de16
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
184 changed files with 196495 additions and 43 deletions

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

@ -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

@ -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

@ -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

@ -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

File diff suppressed because it is too large Load Diff

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

@ -14,7 +14,7 @@
# #
# SPDX-License-Identifier: Apache-2.0 # SPDX-License-Identifier: Apache-2.0
from typing import Any, Optional from typing import Any, Optional, Type
from typing_extensions import Self from typing_extensions import Self
@ -135,6 +135,22 @@ class ApiException(OpenApiException):
pass pass
self.headers = http_resp.getheaders() self.headers = http_resp.getheaders()
@classmethod
def exception_class_for_http_status(cls, status: int) -> Type["ApiException"]:
if status == 400:
return BadRequestException
if status == 401:
return UnauthorizedException
if status == 403:
return ForbiddenException
if status == 404:
return NotFoundException
if status == 429:
return TooManyRequestsException
if 500 <= status <= 599:
return ServiceException
return ApiException
@classmethod @classmethod
def from_response( def from_response(
cls, cls,
@ -143,24 +159,8 @@ class ApiException(OpenApiException):
body: Optional[str], body: Optional[str],
data: Optional[Any], data: Optional[Any],
) -> Self: ) -> Self:
if http_resp.status == 400: exc_class = cls.exception_class_for_http_status(http_resp.status)
raise BadRequestException(http_resp=http_resp, body=body, data=data) raise exc_class(http_resp=http_resp, body=body, data=data)
if http_resp.status == 401:
raise UnauthorizedException(http_resp=http_resp, body=body, data=data)
if http_resp.status == 403:
raise ForbiddenException(http_resp=http_resp, body=body, data=data)
if http_resp.status == 404:
raise NotFoundException(http_resp=http_resp, body=body, data=data)
if http_resp.status == 429:
raise TooManyRequestsException(http_resp=http_resp, body=body, data=data)
if 500 <= http_resp.status <= 599:
raise ServiceException(http_resp=http_resp, body=body, data=data)
raise ApiException(http_resp=http_resp, body=body, data=data)
def __str__(self): def __str__(self):
"""Custom error messages for exception""" """Custom error messages for exception"""

View File

@ -0,0 +1,6 @@
import sys
from pathlib import Path
_core_test_support = Path(__file__).resolve().parent
if str(_core_test_support) not in sys.path:
sys.path.insert(0, str(_core_test_support))

View File

@ -0,0 +1 @@
# Test-only helpers for SDK integration tests. Not shipped in the published package.

View File

@ -0,0 +1,228 @@
# Copyright 2024 Cisco Systems, Inc. and its affiliates
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
from __future__ import annotations
import json
import re
import threading
from datetime import datetime
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
from typing import Any, Dict, Mapping, Optional
from urllib.parse import urlparse
from sdk_test_support.mock_server_types import OperationExpectation
OPERATION_ID_HEADER = "X-TE-Operation-Id"
ERROR_STATUS_HEADER = "X-TE-Error-Status"
AUTHORIZATION_HEADER = "Authorization"
def _normalize_scalar(value: Any) -> Any:
if isinstance(value, str) and "T" in value:
try:
return datetime.fromisoformat(value.replace("Z", "+00:00")).isoformat().replace("+00:00", "Z")
except ValueError:
return value
return value
def _normalize_json(value: Any) -> Any:
if isinstance(value, dict):
return {key: _normalize_json(value[key]) for key in sorted(value.keys())}
if isinstance(value, list):
return [_normalize_json(item) for item in value]
return _normalize_scalar(value)
def _json_body_matches(expected: Any, actual: Any) -> bool:
if isinstance(expected, dict) and isinstance(actual, dict):
for key in actual:
if key not in expected:
return False
if not _json_body_matches(expected[key], actual[key]):
return False
return True
if isinstance(expected, list) and isinstance(actual, list):
if len(expected) != len(actual):
return False
return all(_json_body_matches(expected_item, actual_item)
for expected_item, actual_item in zip(expected, actual))
return _normalize_json(expected) == _normalize_json(actual)
class MockApiServer:
def __init__(self, manifest: Mapping[str, OperationExpectation], host: str = "127.0.0.1", port: int = 0):
self._manifest = dict(manifest)
self._host = host
self._port = port
self._server: Optional[ThreadingHTTPServer] = None
self._thread: Optional[threading.Thread] = None
@property
def base_url(self) -> str:
if self._server is None:
raise RuntimeError("MockApiServer has not been started")
return f"http://{self._host}:{self._server.server_port}"
def start(self) -> None:
if self._server is not None:
return
manifest = self._manifest
handler = _build_handler(manifest)
self._server = ThreadingHTTPServer((self._host, self._port), handler)
self._thread = threading.Thread(target=self._server.serve_forever, daemon=True)
self._thread.start()
def stop(self) -> None:
if self._server is None:
return
self._server.shutdown()
self._server.server_close()
if self._thread is not None:
self._thread.join(timeout=5)
self._server = None
self._thread = None
def __enter__(self) -> "MockApiServer":
self.start()
return self
def __exit__(self, exc_type, exc, tb) -> None:
self.stop()
def _build_handler(manifest: Mapping[str, OperationExpectation]):
class MockApiRequestHandler(BaseHTTPRequestHandler):
def log_message(self, format: str, *args) -> None:
return
def do_GET(self) -> None:
self._handle_request("GET")
def do_POST(self) -> None:
self._handle_request("POST")
def do_PUT(self) -> None:
self._handle_request("PUT")
def do_PATCH(self) -> None:
self._handle_request("PATCH")
def do_DELETE(self) -> None:
self._handle_request("DELETE")
def _handle_request(self, method: str) -> None:
auth_error = _validate_authorization(self.headers.get(AUTHORIZATION_HEADER))
if auth_error is not None:
self._write_json(auth_error, 401)
return
operation_id = self.headers.get(OPERATION_ID_HEADER)
if not operation_id:
self._write_json({"detail": f"Missing required header {OPERATION_ID_HEADER}"}, 400)
return
expectation = manifest.get(operation_id)
if expectation is None:
self._write_json({"detail": f"Unknown operation id {operation_id}"}, 400)
return
if expectation.method.upper() != method.upper():
self._write_json(
{"detail": f"Unexpected HTTP method {method} for operation {operation_id}"},
400,
)
return
parsed = urlparse(self.path)
if not _path_matches(expectation.path, parsed.path):
self._write_json({"detail": "Path does not match operation expectation"}, 400)
return
error_status_header = self.headers.get(ERROR_STATUS_HEADER)
if error_status_header:
self._handle_error_response(expectation, error_status_header)
return
body_bytes = _read_body(self)
if expectation.request_body_example is not None:
if not body_bytes:
self._write_json({"detail": "Expected request body"}, 400)
return
try:
request_json = json.loads(body_bytes.decode("utf-8"))
except json.JSONDecodeError:
self._write_json({"detail": "Invalid JSON request body"}, 400)
return
if not _json_body_matches(expectation.request_body_example, request_json):
self._write_json({"detail": "Request body does not match OAS example"}, 400)
return
if expectation.success_body is None:
self.send_response(expectation.success_status)
self.end_headers()
return
self._write_json(
expectation.success_body,
expectation.success_status,
expectation.success_content_type,
)
def _handle_error_response(self, expectation: OperationExpectation, error_status_header: str) -> None:
error_response = expectation.error_responses.get(error_status_header)
if error_response is None:
self._write_json(
{"detail": f"No configured error response for status {error_status_header}"},
400,
)
return
if error_response.body is None:
self.send_response(error_response.status)
self.end_headers()
return
self._write_json(error_response.body, error_response.status, error_response.content_type)
def _write_json(self, body: Any, status: int, content_type: str = "application/json") -> None:
payload = json.dumps(body).encode("utf-8")
self.send_response(status)
self.send_header("Content-Type", content_type)
self.send_header("Content-Length", str(len(payload)))
self.end_headers()
self.wfile.write(payload)
return MockApiRequestHandler
def _validate_authorization(value: Optional[str]) -> Optional[Dict[str, str]]:
if value is None or not value.strip():
return {"detail": f"Missing or empty required header {AUTHORIZATION_HEADER}"}
return None
def _read_body(handler: BaseHTTPRequestHandler) -> bytes:
length = handler.headers.get("Content-Length")
if not length:
return b""
return handler.rfile.read(int(length))
def _path_matches(template: str, actual_path: str) -> bool:
pattern = re.sub(r"\{[^/]+\}", r"[^/]+", template)
pattern = f"^{pattern}$"
return re.match(pattern, actual_path) is not None

View File

@ -0,0 +1,41 @@
# Copyright 2024 Cisco Systems, Inc. and its affiliates
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Any, Dict
@dataclass(frozen=True)
class ErrorResponseExpectation:
status: int
body: Any
content_type: str = "application/problem+json"
@dataclass(frozen=True)
class OperationExpectation:
operation_id: str
method: str
path: str
success_status: int
success_body: Any = None
success_content_type: str = "application/json"
request_body_example: Any = None
path_param_examples: Dict[str, str] = field(default_factory=dict)
query_param_examples: Dict[str, str] = field(default_factory=dict)
error_responses: Dict[str, ErrorResponseExpectation] = field(default_factory=dict)

View File

@ -0,0 +1,28 @@
import pytest
from thousandeyes_sdk.core.exceptions import (
ApiException,
BadRequestException,
ForbiddenException,
NotFoundException,
ServiceException,
TooManyRequestsException,
UnauthorizedException,
)
@pytest.mark.parametrize(
("status", "expected"),
[
(400, BadRequestException),
(401, UnauthorizedException),
(403, ForbiddenException),
(404, NotFoundException),
(429, TooManyRequestsException),
(500, ServiceException),
(503, ServiceException),
(418, ApiException),
],
)
def test_exception_class_for_http_status(status, expected):
assert ApiException.exception_class_for_http_status(status) is expected

View File

@ -0,0 +1,315 @@
import json
import pytest
from sdk_test_support.mock_server import (
AUTHORIZATION_HEADER,
ERROR_STATUS_HEADER,
OPERATION_ID_HEADER,
MockApiServer,
)
from sdk_test_support.mock_server_types import ErrorResponseExpectation, OperationExpectation
@pytest.fixture
def manifest():
return {
"createAlertRule": OperationExpectation(
operation_id="createAlertRule",
method="POST",
path="/alerts/rules",
request_body_example={"ruleName": "Example"},
success_status=201,
success_body={"ruleId": "1"},
error_responses={
"400": ErrorResponseExpectation(
status=400,
body={"title": "Bad Request", "status": 400},
)
},
),
"deleteAlertRule": OperationExpectation(
operation_id="deleteAlertRule",
method="DELETE",
path="/alerts/rules/{ruleId}",
path_param_examples={"ruleId": "127094"},
success_status=204,
success_body=None,
),
"getAlertRule": OperationExpectation(
operation_id="getAlertRule",
method="GET",
path="/alerts/rules/{ruleId}",
path_param_examples={"ruleId": "127094"},
success_status=200,
success_body={"ruleId": "127094", "ruleName": "Example"},
),
}
def _request(server: MockApiServer, *, method: str, path: str, headers=None, body=None):
import urllib.request
request_headers = {
AUTHORIZATION_HEADER: "Bearer test-token",
OPERATION_ID_HEADER: "createAlertRule",
}
if headers:
request_headers.update(headers)
data = None
if body is not None:
data = json.dumps(body).encode("utf-8")
request_headers["Content-Type"] = "application/json"
request = urllib.request.Request(
server.base_url + path,
data=data,
headers=request_headers,
method=method,
)
try:
with urllib.request.urlopen(request) as response:
return response.status, response.read()
except urllib.error.HTTPError as exc:
return exc.code, exc.read()
def test_mock_server_happy_path(manifest):
with MockApiServer(manifest) as server:
status, body = _request(
server,
method="POST",
path="/alerts/rules",
body={"ruleName": "Example"},
)
assert status == 201
assert json.loads(body.decode("utf-8")) == {"ruleId": "1"}
def test_mock_server_rejects_missing_authorization(manifest):
with MockApiServer(manifest) as server:
status, _ = _request(
server,
method="POST",
path="/alerts/rules",
headers={AUTHORIZATION_HEADER: ""},
body={"ruleName": "Example"},
)
assert status == 401
def test_mock_server_rejects_invalid_request_body(manifest):
with MockApiServer(manifest) as server:
status, _ = _request(
server,
method="POST",
path="/alerts/rules",
body={"ruleName": "Wrong"},
)
assert status == 400
def test_mock_server_error_path(manifest):
with MockApiServer(manifest) as server:
status, body = _request(
server,
method="POST",
path="/alerts/rules",
headers={ERROR_STATUS_HEADER: "400"},
body={"unexpected": True},
)
assert status == 400
assert json.loads(body.decode("utf-8"))["title"] == "Bad Request"
def test_mock_server_ignores_readonly_fields_in_expected_body(manifest):
readonly_manifest = {
**manifest,
"createAlertRule": OperationExpectation(
operation_id="createAlertRule",
method="POST",
path="/alerts/rules",
request_body_example={"ruleName": "Example", "ruleId": "read-only"},
success_status=201,
success_body={"ruleId": "1"},
),
}
with MockApiServer(readonly_manifest) as server:
status, body = _request(
server,
method="POST",
path="/alerts/rules",
body={"ruleName": "Example"},
)
assert status == 201
assert json.loads(body.decode("utf-8")) == {"ruleId": "1"}
def test_mock_server_no_content_response(manifest):
with MockApiServer(manifest) as server:
import urllib.request
request = urllib.request.Request(
server.base_url + "/alerts/rules/127094",
headers={
AUTHORIZATION_HEADER: "Bearer test-token",
OPERATION_ID_HEADER: "deleteAlertRule",
},
method="DELETE",
)
with urllib.request.urlopen(request) as response:
assert response.status == 204
assert response.read() == b""
def test_mock_server_matches_path_variable(manifest):
with MockApiServer(manifest) as server:
status, body = _request(
server,
method="GET",
path="/alerts/rules/127094",
headers={OPERATION_ID_HEADER: "getAlertRule"},
)
assert status == 200
assert json.loads(body.decode("utf-8")) == {"ruleId": "127094", "ruleName": "Example"}
def test_mock_server_rejects_path_missing_path_variable(manifest):
with MockApiServer(manifest) as server:
status, body = _request(
server,
method="GET",
path="/alerts/rules",
headers={OPERATION_ID_HEADER: "getAlertRule"},
)
assert status == 400
assert json.loads(body.decode("utf-8"))["detail"] == "Path does not match operation expectation"
def test_mock_server_accepts_equivalent_iso8601_datetime_formats(manifest):
datetime_manifest = {
**manifest,
"createAlertRule": OperationExpectation(
operation_id="createAlertRule",
method="POST",
path="/alerts/rules",
request_body_example={
"ruleName": "Example",
"startDate": "2017-07-01T05:00:00Z",
},
success_status=201,
success_body={"ruleId": "1"},
),
}
with MockApiServer(datetime_manifest) as server:
status, body = _request(
server,
method="POST",
path="/alerts/rules",
body={
"ruleName": "Example",
"startDate": "2017-07-01T05:00:00+00:00",
},
)
assert status == 201
assert json.loads(body.decode("utf-8")) == {"ruleId": "1"}
def test_mock_server_ignores_readonly_fields_in_nested_request_objects(manifest):
nested_manifest = {
**manifest,
"createAlertRule": OperationExpectation(
operation_id="createAlertRule",
method="POST",
path="/alerts/rules",
request_body_example={
"ruleName": "Example",
"widgets": [
{
"title": "Widget Title",
"id": "read-only-id",
"embedUrl": "https://example.com/embed",
}
],
},
success_status=201,
success_body={"ruleId": "1"},
),
}
with MockApiServer(nested_manifest) as server:
status, body = _request(
server,
method="POST",
path="/alerts/rules",
body={
"ruleName": "Example",
"widgets": [{"title": "Widget Title"}],
},
)
assert status == 201
assert json.loads(body.decode("utf-8")) == {"ruleId": "1"}
def test_integration_error_assertion_fails_when_deserialized_error_does_not_match_oas_example():
"""Generated error-path tests compare ApiException.data to the OAS error example."""
import unittest
import urllib.error
import urllib.request
from pydantic import BaseModel, ConfigDict
class Error(BaseModel):
title: str
status: int
model_config = ConfigDict(extra="allow")
def to_json(self) -> str:
return self.model_dump_json()
mismatched_manifest = {
"createAlertRule": OperationExpectation(
operation_id="createAlertRule",
method="POST",
path="/alerts/rules",
request_body_example={"ruleName": "Example"},
success_status=201,
success_body={"ruleId": "1"},
error_responses={
"400": ErrorResponseExpectation(
status=400,
body={"title": "Wrong Title", "status": 400},
)
},
),
}
oas_example = {"title": "Bad Request", "status": 400}
with MockApiServer(mismatched_manifest) as server:
request = urllib.request.Request(
server.base_url + "/alerts/rules",
data=json.dumps({"unexpected": True}).encode("utf-8"),
headers={
AUTHORIZATION_HEADER: "Bearer test-token",
OPERATION_ID_HEADER: "createAlertRule",
ERROR_STATUS_HEADER: "400",
"Content-Type": "application/json",
},
method="POST",
)
with pytest.raises(urllib.error.HTTPError) as http_error:
urllib.request.urlopen(request)
wire_body = json.loads(http_error.value.read().decode("utf-8"))
exception_data = Error.model_validate(wire_body)
def assert_constructed_model_matches_example_json(model, loaded_json):
test_case = unittest.TestCase()
test_case.assertEqual(
json.dumps(loaded_json, sort_keys=True),
json.dumps(json.loads(model.to_json()), sort_keys=True),
)
with pytest.raises(AssertionError):
assert_constructed_model_matches_example_json(exception_data, oas_example)

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

@ -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

@ -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

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,421 @@
# 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 json
import unittest
import thousandeyes_sdk.endpoint_agents.models
from thousandeyes_sdk.core.exceptions import ApiException
from thousandeyes_sdk.endpoint_agents.api.endpoint_agent_log_items_api import EndpointAgentLogItemsApi
from .integration_test_utils import IntegrationTestBase
from .test_utils import assert_constructed_model_matches_example_json
class TestEndpointAgentLogItemsApiIntegration(IntegrationTestBase):
"""EndpointAgentLogItemsApi integration test stubs"""
def setUp(self) -> None:
super().setUp()
self.api = EndpointAgentLogItemsApi(self.api_client)
def test_get_endpoint_agent_log_items_happy_path(self) -> None:
"""Integration test for get_endpoint_agent_log_items success path"""
agent_id = 'agent_id_example'
aid = '1234'
max = 1000
cursor = 'WyIxNzA5MjQwMDAwMDAwIl0='
window = '12h'
start_date = '2022-07-17T22:00:54Z'
end_date = '2022-07-18T22:00:54Z'
response_body_json = """
{
"_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"
},
"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"
}
},
"logs" : [ {
"wifiLogItem" : {
"bssidFrom" : "00:11:22:33:44:54",
"bssid" : "00:11:22:33:44:55",
"failure" : {
"code" : 4,
"context" : "WPA authentication failed",
"type" : "auth"
},
"logItemType" : "wifi-connect",
"channel" : "36",
"physicalMode" : "802.11ac",
"physicalModeFrom" : "802.11n",
"ssid" : "CorpWiFi",
"channelFrom" : "11"
},
"agentLogItemType" : "wifi",
"onlineOfflineLogItem" : {
"logItemType" : "online"
},
"id" : "8d23f1b7-74ef-4e0c-925c-58601fc0662d",
"vpnLogItem" : {
"logItemType" : "vpn-connect",
"vpnServerName" : "vpn-us-west",
"vpnType" : "cisco-anyconnect",
"vpnServerAddress" : "192.0.2.10"
},
"stateChangesLogItem" : {
"logItemType" : "enabled"
},
"timestampMs" : 1709240000000
}, {
"wifiLogItem" : {
"bssidFrom" : "00:11:22:33:44:54",
"bssid" : "00:11:22:33:44:55",
"failure" : {
"code" : 4,
"context" : "WPA authentication failed",
"type" : "auth"
},
"logItemType" : "wifi-connect",
"channel" : "36",
"physicalMode" : "802.11ac",
"physicalModeFrom" : "802.11n",
"ssid" : "CorpWiFi",
"channelFrom" : "11"
},
"agentLogItemType" : "wifi",
"onlineOfflineLogItem" : {
"logItemType" : "online"
},
"id" : "8d23f1b7-74ef-4e0c-925c-58601fc0662d",
"vpnLogItem" : {
"logItemType" : "vpn-connect",
"vpnServerName" : "vpn-us-west",
"vpnType" : "cisco-anyconnect",
"vpnServerAddress" : "192.0.2.10"
},
"stateChangesLogItem" : {
"logItemType" : "enabled"
},
"timestampMs" : 1709240000000
} ]
}
"""
expected_response = json.loads(response_body_json)
response = self.api.get_endpoint_agent_log_items(
agent_id=agent_id,
aid=aid,
max=max,
cursor=cursor,
window=window,
start_date=start_date,
end_date=end_date,
_headers=self.te_headers("get_endpoint_agent_log_items"),
)
assert_constructed_model_matches_example_json(response, expected_response)
def test_get_endpoint_agent_log_items_error_400(self) -> None:
"""Integration test for get_endpoint_agent_log_items error path (HTTP 400)"""
agent_id = 'agent_id_example'
aid = '1234'
max = 1000
cursor = 'WyIxNzA5MjQwMDAwMDAwIl0='
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_endpoint_agent_log_items(
agent_id=agent_id,
aid=aid,
max=max,
cursor=cursor,
window=window,
start_date=start_date,
end_date=end_date,
_headers=self.te_headers("get_endpoint_agent_log_items", error_status="400"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_endpoint_agent_log_items_error_401(self) -> None:
"""Integration test for get_endpoint_agent_log_items error path (HTTP 401)"""
agent_id = 'agent_id_example'
aid = '1234'
max = 1000
cursor = 'WyIxNzA5MjQwMDAwMDAwIl0='
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_endpoint_agent_log_items(
agent_id=agent_id,
aid=aid,
max=max,
cursor=cursor,
window=window,
start_date=start_date,
end_date=end_date,
_headers=self.te_headers("get_endpoint_agent_log_items", error_status="401"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_endpoint_agent_log_items_error_403(self) -> None:
"""Integration test for get_endpoint_agent_log_items error path (HTTP 403)"""
agent_id = 'agent_id_example'
aid = '1234'
max = 1000
cursor = 'WyIxNzA5MjQwMDAwMDAwIl0='
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" : 6
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(403)
) as context:
self.api.get_endpoint_agent_log_items(
agent_id=agent_id,
aid=aid,
max=max,
cursor=cursor,
window=window,
start_date=start_date,
end_date=end_date,
_headers=self.te_headers("get_endpoint_agent_log_items", error_status="403"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_endpoint_agent_log_items_error_429(self) -> None:
"""Integration test for get_endpoint_agent_log_items error path (HTTP 429)"""
agent_id = 'agent_id_example'
aid = '1234'
max = 1000
cursor = 'WyIxNzA5MjQwMDAwMDAwIl0='
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" : 6
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(429)
) as context:
self.api.get_endpoint_agent_log_items(
agent_id=agent_id,
aid=aid,
max=max,
cursor=cursor,
window=window,
start_date=start_date,
end_date=end_date,
_headers=self.te_headers("get_endpoint_agent_log_items", error_status="429"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_endpoint_agent_log_items_error_500(self) -> None:
"""Integration test for get_endpoint_agent_log_items error path (HTTP 500)"""
agent_id = 'agent_id_example'
aid = '1234'
max = 1000
cursor = 'WyIxNzA5MjQwMDAwMDAwIl0='
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" : 6
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(500)
) as context:
self.api.get_endpoint_agent_log_items(
agent_id=agent_id,
aid=aid,
max=max,
cursor=cursor,
window=window,
start_date=start_date,
end_date=end_date,
_headers=self.te_headers("get_endpoint_agent_log_items", error_status="500"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_endpoint_agent_log_items_error_502(self) -> None:
"""Integration test for get_endpoint_agent_log_items error path (HTTP 502)"""
agent_id = 'agent_id_example'
aid = '1234'
max = 1000
cursor = 'WyIxNzA5MjQwMDAwMDAwIl0='
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" : 6
}
"""
expected_error = json.loads(error_body_json)
with self.assertRaises(
ApiException.exception_class_for_http_status(502)
) as context:
self.api.get_endpoint_agent_log_items(
agent_id=agent_id,
aid=aid,
max=max,
cursor=cursor,
window=window,
start_date=start_date,
end_date=end_date,
_headers=self.te_headers("get_endpoint_agent_log_items", 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,318 @@
# 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 json
import unittest
import thousandeyes_sdk.endpoint_agents.models
from thousandeyes_sdk.core.exceptions import ApiException
from thousandeyes_sdk.endpoint_agents.api.endpoint_agents_transfer_api import EndpointAgentsTransferApi
from .integration_test_utils import IntegrationTestBase
from .test_utils import assert_constructed_model_matches_example_json
class TestEndpointAgentsTransferApiIntegration(IntegrationTestBase):
"""EndpointAgentsTransferApi integration test stubs"""
def setUp(self) -> None:
super().setUp()
self.api = EndpointAgentsTransferApi(self.api_client)
def test_transfer_endpoint_agents_happy_path(self) -> None:
"""Integration test for transfer_endpoint_agents success path"""
request_body_json = """
{
"transfers" : [ {
"agentId" : "5d0764ac-7e42-4ec8-a0d4-39fc53edccba",
"fromAid" : "1234",
"toAid" : "12345"
}, {
"agentId" : "5d0764ac-7e42-4ec8-a0d4-39fc53edccba",
"fromAid" : "1234",
"toAid" : "12345"
} ]
}
"""
bulk_agent_transfer_request = thousandeyes_sdk.endpoint_agents.models.BulkAgentTransferRequest.from_json(request_body_json)
aid = '1234'
response_body_json = """
{
"items" : [ {
"status" : 200,
"detail" : "Initiated",
"request" : {
"agentId" : "5d0764ac-7e42-4ec8-a0d4-39fc53edccba",
"fromAid" : "1234",
"toAid" : "12345"
}
}, {
"status" : 400,
"detail" : "Missing from-account id",
"request" : {
"agentId" : "5d0764ac-7e42-4ec8-a0d5-39fc53ed1234",
"fromAid" : "xxx",
"toAid" : "12345"
}
}, {
"status" : 403,
"detail" : "User does not have permission on 'to' aid",
"request" : {
"agentId" : "5d0764ac-7e42-4ec8-a0d5-39fc53ed7890",
"fromAid" : "1234",
"toAid" : "12345"
}
} ]
}
"""
expected_response = json.loads(response_body_json)
response = self.api.transfer_endpoint_agents(
aid=aid,
bulk_agent_transfer_request=bulk_agent_transfer_request,
_headers=self.te_headers("transfer_endpoint_agents"),
)
assert_constructed_model_matches_example_json(response, expected_response)
def test_transfer_endpoint_agents_error_400(self) -> None:
"""Integration test for transfer_endpoint_agents error path (HTTP 400)"""
request_body_json = """
{
"transfers" : [ {
"agentId" : "5d0764ac-7e42-4ec8-a0d4-39fc53edccba",
"fromAid" : "1234",
"toAid" : "12345"
}, {
"agentId" : "5d0764ac-7e42-4ec8-a0d4-39fc53edccba",
"fromAid" : "1234",
"toAid" : "12345"
} ]
}
"""
bulk_agent_transfer_request = thousandeyes_sdk.endpoint_agents.models.BulkAgentTransferRequest.from_json(request_body_json)
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.transfer_endpoint_agents(
aid=aid,
bulk_agent_transfer_request=bulk_agent_transfer_request,
_headers=self.te_headers("transfer_endpoint_agents", error_status="400"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_transfer_endpoint_agents_error_401(self) -> None:
"""Integration test for transfer_endpoint_agents error path (HTTP 401)"""
request_body_json = """
{
"transfers" : [ {
"agentId" : "5d0764ac-7e42-4ec8-a0d4-39fc53edccba",
"fromAid" : "1234",
"toAid" : "12345"
}, {
"agentId" : "5d0764ac-7e42-4ec8-a0d4-39fc53edccba",
"fromAid" : "1234",
"toAid" : "12345"
} ]
}
"""
bulk_agent_transfer_request = thousandeyes_sdk.endpoint_agents.models.BulkAgentTransferRequest.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.transfer_endpoint_agents(
aid=aid,
bulk_agent_transfer_request=bulk_agent_transfer_request,
_headers=self.te_headers("transfer_endpoint_agents", error_status="401"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_transfer_endpoint_agents_error_403(self) -> None:
"""Integration test for transfer_endpoint_agents error path (HTTP 403)"""
request_body_json = """
{
"transfers" : [ {
"agentId" : "5d0764ac-7e42-4ec8-a0d4-39fc53edccba",
"fromAid" : "1234",
"toAid" : "12345"
}, {
"agentId" : "5d0764ac-7e42-4ec8-a0d4-39fc53edccba",
"fromAid" : "1234",
"toAid" : "12345"
} ]
}
"""
bulk_agent_transfer_request = thousandeyes_sdk.endpoint_agents.models.BulkAgentTransferRequest.from_json(request_body_json)
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.transfer_endpoint_agents(
aid=aid,
bulk_agent_transfer_request=bulk_agent_transfer_request,
_headers=self.te_headers("transfer_endpoint_agents", error_status="403"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_transfer_endpoint_agents_error_404(self) -> None:
"""Integration test for transfer_endpoint_agents error path (HTTP 404)"""
request_body_json = """
{
"transfers" : [ {
"agentId" : "5d0764ac-7e42-4ec8-a0d4-39fc53edccba",
"fromAid" : "1234",
"toAid" : "12345"
}, {
"agentId" : "5d0764ac-7e42-4ec8-a0d4-39fc53edccba",
"fromAid" : "1234",
"toAid" : "12345"
} ]
}
"""
bulk_agent_transfer_request = thousandeyes_sdk.endpoint_agents.models.BulkAgentTransferRequest.from_json(request_body_json)
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.transfer_endpoint_agents(
aid=aid,
bulk_agent_transfer_request=bulk_agent_transfer_request,
_headers=self.te_headers("transfer_endpoint_agents", error_status="404"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_transfer_endpoint_agents_error_429(self) -> None:
"""Integration test for transfer_endpoint_agents error path (HTTP 429)"""
request_body_json = """
{
"transfers" : [ {
"agentId" : "5d0764ac-7e42-4ec8-a0d4-39fc53edccba",
"fromAid" : "1234",
"toAid" : "12345"
}, {
"agentId" : "5d0764ac-7e42-4ec8-a0d4-39fc53edccba",
"fromAid" : "1234",
"toAid" : "12345"
} ]
}
"""
bulk_agent_transfer_request = thousandeyes_sdk.endpoint_agents.models.BulkAgentTransferRequest.from_json(request_body_json)
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.transfer_endpoint_agents(
aid=aid,
bulk_agent_transfer_request=bulk_agent_transfer_request,
_headers=self.te_headers("transfer_endpoint_agents", error_status="429"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
if __name__ == '__main__':
unittest.main()

View File

@ -0,0 +1,176 @@
# 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 json
import unittest
import thousandeyes_sdk.endpoint_agents.models
from thousandeyes_sdk.core.exceptions import ApiException
from thousandeyes_sdk.endpoint_agents.api.endpoint_proxies_api import EndpointProxiesApi
from .integration_test_utils import IntegrationTestBase
from .test_utils import assert_constructed_model_matches_example_json
class TestEndpointProxiesApiIntegration(IntegrationTestBase):
"""EndpointProxiesApi integration test stubs"""
def setUp(self) -> None:
super().setUp()
self.api = EndpointProxiesApi(self.api_client)
def test_get_endpoint_proxies_happy_path(self) -> None:
"""Integration test for get_endpoint_proxies success path"""
aid = '1234'
response_body_json = """
{
"proxies" : [ {
"testIds" : [ "9923667", "9923667" ],
"agentIds" : [ "861b7557-cd57-4bbb-b648-00bddf88ef49", "861b7557-cd57-4bbb-b648-00bddf88ef49" ],
"pac" : "https://example.com/proxy.pac",
"port" : 8080,
"name" : "Local Mitmproxy",
"host" : "localhost",
"type" : "static",
"userName" : "endpoint-proxy-user",
"authType" : "none",
"bypassList" : "localhost,127.0.0.1",
"proxyId" : "101498"
}, {
"testIds" : [ "9923667", "9923667" ],
"agentIds" : [ "861b7557-cd57-4bbb-b648-00bddf88ef49", "861b7557-cd57-4bbb-b648-00bddf88ef49" ],
"pac" : "https://example.com/proxy.pac",
"port" : 8080,
"name" : "Local Mitmproxy",
"host" : "localhost",
"type" : "static",
"userName" : "endpoint-proxy-user",
"authType" : "none",
"bypassList" : "localhost,127.0.0.1",
"proxyId" : "101498"
} ]
}
"""
expected_response = json.loads(response_body_json)
response = self.api.get_endpoint_proxies(
aid=aid,
_headers=self.te_headers("get_endpoint_proxies"),
)
assert_constructed_model_matches_example_json(response, expected_response)
def test_get_endpoint_proxies_error_401(self) -> None:
"""Integration test for get_endpoint_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_endpoint_proxies(
aid=aid,
_headers=self.te_headers("get_endpoint_proxies", error_status="401"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_endpoint_proxies_error_403(self) -> None:
"""Integration test for get_endpoint_proxies 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_endpoint_proxies(
aid=aid,
_headers=self.te_headers("get_endpoint_proxies", error_status="403"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_endpoint_proxies_error_429(self) -> None:
"""Integration test for get_endpoint_proxies 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_endpoint_proxies(
aid=aid,
_headers=self.te_headers("get_endpoint_proxies", error_status="429"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_endpoint_proxies_error_500(self) -> None:
"""Integration test for get_endpoint_proxies 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_endpoint_proxies(
aid=aid,
_headers=self.te_headers("get_endpoint_proxies", 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

@ -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 Instant Scheduled Tests API
You can create and execute a new endpoint instant scheduled test within ThousandEyes using this API. The test parameters are specified in the `POST` data. The following applies to the Endpoint Instant Scheduled Tests API: * To initiate the creation and execution of an instant scheduled test, the user must possess the `Edit endpoint tests` permission. * Upon successful creation of an instant scheduled test, the API responds with an HTTP/201 CREATED status code and return the test definition. * It's important to note that the response does not include the results of the instant scheduled test. To retrieve test results, users can utilize the Endpoint Test Data endpoints. The URLs for these API test data endpoints are provided within the test definition output when an instant scheduled test is created.
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,499 @@
# coding: utf-8
"""
Endpoint Instant Scheduled Tests API
You can create and execute a new endpoint instant scheduled test within ThousandEyes using this API. The test parameters are specified in the `POST` data. The following applies to the Endpoint Instant Scheduled Tests API: * To initiate the creation and execution of an instant scheduled test, the user must possess the `Edit endpoint tests` permission. * Upon successful creation of an instant scheduled test, the API responds with an HTTP/201 CREATED status code and return the test definition. * It's important to note that the response does not include the results of the instant scheduled test. To retrieve test results, users can utilize the Endpoint Test Data endpoints. The URLs for these API test data endpoints are provided within the test definition output when an instant scheduled test is created.
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_agent_to_server_scheduled_instant_test": OperationExpectation(
operation_id="create_agent_to_server_scheduled_instant_test",
method="POST",
path="/endpoint/tests/scheduled-tests/agent-to-server/instant",
path_param_examples={
},
success_status=201,
success_body=json.loads("""
{
"server" : "www.example.com",
"isSavedEvent" : false,
"_links" : {
"testResults" : [ {
"href" : "https://api.thousandeyes.com/v7/endpoint/test-results/scheduled-tests/281474976710706/network/filter"
}, {
"href" : "https://api.thousandeyes.com/v7/endpoint/test-results/scheduled-tests/281474976710706/pathvis"
} ],
"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"
}
},
"isPrioritized" : false,
"networkMeasurements" : true,
"type" : "agent-to-server",
"tcpProbeMode" : "auto",
"labels" : [ {
"labelId" : "961",
"name" : "Artem label",
"isBuiltin" : false
}, {
"labelId" : "961",
"name" : "Artem label",
"isBuiltin" : false
} ],
"protocol" : "icmp",
"createdDate" : "2022-07-17T22:00:54Z",
"ipVersion" : "V4_ONLY",
"port" : 443,
"isEnabled" : true,
"modifiedDate" : "2022-07-17T22:00:54Z",
"interval" : 60,
"testId" : "281474976710706",
"aid" : "1234",
"agentSelectorConfig" : {
"agentSelectorType" : "all-agents",
"maxMachines" : 25
},
"hasPathTraceInSession" : true,
"testName" : "Test name"
}
"""),
success_content_type="application/json",
request_body_example=json.loads("""
{
"server" : "www.example.com",
"ipVersion" : "V4_ONLY",
"port" : 443,
"agentSelectorType" : "all-agents",
"tagIds" : [ "c6b78e57-81a2-4c5f-a11a-d96c3c664d55", "5aeab5d5-0d34-4d44-a7ac-fb440185295c" ],
"maxMachines" : 25,
"serverName" : "www.example.com",
"endpointAgentLabels" : [ "567", "214" ],
"agents" : [ "0a3b9998-dc3a-4ff2-b50d-ac4a7cd986e1", "66eec0f1-72b4-4755-aa83-3aed61d17f3c" ],
"testName" : "Test name"
}
"""),
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" : 6
}"""),
content_type="application/json",
),
"429": ErrorResponseExpectation(
status=429,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 6
}"""),
content_type="application/json",
),
"500": ErrorResponseExpectation(
status=500,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 6
}"""),
content_type="application/json",
),
"502": ErrorResponseExpectation(
status=502,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 6
}"""),
content_type="application/json",
),
},
),
"create_http_server_scheduled_instant_test": OperationExpectation(
operation_id="create_http_server_scheduled_instant_test",
method="POST",
path="/endpoint/tests/scheduled-tests/http-server/instant",
path_param_examples={
},
success_status=201,
success_body=json.loads("""
{
"server" : "www.example.com",
"isSavedEvent" : false,
"sslVersion" : "Auto",
"useNtlm" : false,
"_links" : {
"testResults" : [ {
"href" : "https://api.thousandeyes.com/v7/endpoint/test-results/scheduled-tests/281474976710706/network/filter"
}, {
"href" : "https://api.thousandeyes.com/v7/endpoint/test-results/scheduled-tests/281474976710706/pathvis"
} ],
"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"
}
},
"isPrioritized" : false,
"httpTimeLimit" : 5000,
"type" : "http-server",
"protocol" : "icmp",
"httpVersion" : 2,
"followRedirects" : true,
"authType" : "none",
"testName" : "Test name",
"verifyCertificate" : true,
"networkMeasurements" : true,
"tcpProbeMode" : "auto",
"url" : "https://example.com:443",
"labels" : [ {
"labelId" : "961",
"name" : "Artem label",
"isBuiltin" : false
}, {
"labelId" : "961",
"name" : "Artem label",
"isBuiltin" : false
} ],
"createdDate" : "2022-07-17T22:00:54Z",
"ipVersion" : "V4_ONLY",
"port" : 443,
"isEnabled" : true,
"modifiedDate" : "2022-07-17T22:00:54Z",
"interval" : 60,
"testId" : "281474976710706",
"aid" : "1234",
"agentSelectorConfig" : {
"agentSelectorType" : "all-agents",
"maxMachines" : 25
},
"hasPathTraceInSession" : true,
"httpTargetTime" : 100,
"username" : "username",
"sslVersionId" : "0"
}
"""),
success_content_type="application/json",
request_body_example=json.loads("""
{
"verifyCertificate" : true,
"hasPing" : true,
"agentSelectorType" : "all-agents",
"tagIds" : [ "c6b78e57-81a2-4c5f-a11a-d96c3c664d55", "5aeab5d5-0d34-4d44-a7ac-fb440185295c" ],
"maxMachines" : 25,
"httpTimeLimit" : 5000,
"networkMeasurements" : true,
"endpointAgentLabels" : [ "567", "214" ],
"tcpProbeMode" : "auto",
"url" : "https://example.com:443",
"agents" : [ "0a3b9998-dc3a-4ff2-b50d-ac4a7cd986e1", "66eec0f1-72b4-4755-aa83-3aed61d17f3c" ],
"protocol" : "icmp",
"password" : "password",
"ipVersion" : "V4_ONLY",
"hasTraceroute" : true,
"targetResponseTime" : 1000,
"authType" : "none",
"hasPathTraceInSession" : true,
"testName" : "Test name",
"username" : "username",
"sslVersionId" : "0"
}
"""),
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" : 6
}"""),
content_type="application/json",
),
"429": ErrorResponseExpectation(
status=429,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 6
}"""),
content_type="application/json",
),
"500": ErrorResponseExpectation(
status=500,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 6
}"""),
content_type="application/json",
),
"502": ErrorResponseExpectation(
status=502,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 6
}"""),
content_type="application/json",
),
},
),
"run_endpoint_scheduled_instant_test": OperationExpectation(
operation_id="run_endpoint_scheduled_instant_test",
method="POST",
path="/endpoint/tests/scheduled-tests/{testId}/run",
path_param_examples={
"testId": '765231567',
},
success_status=200,
success_body=json.loads("""
{
"message" : "Successfully reran the instant scheduled test with testId=765231567"
}
"""),
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" : 6
}"""),
content_type="application/json",
),
"404": ErrorResponseExpectation(
status=404,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 6
}"""),
content_type="application/json",
),
"429": ErrorResponseExpectation(
status=429,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 6
}"""),
content_type="application/json",
),
"500": ErrorResponseExpectation(
status=500,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 6
}"""),
content_type="application/json",
),
"502": ErrorResponseExpectation(
status=502,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 6
}"""),
content_type="application/json",
),
},
),
}

View File

@ -0,0 +1,390 @@
# coding: utf-8
"""
Endpoint Instant Scheduled Tests API
You can create and execute a new endpoint instant scheduled test within ThousandEyes using this API. The test parameters are specified in the `POST` data. The following applies to the Endpoint Instant Scheduled Tests API: * To initiate the creation and execution of an instant scheduled test, the user must possess the `Edit endpoint tests` permission. * Upon successful creation of an instant scheduled test, the API responds with an HTTP/201 CREATED status code and return the test definition. * It's important to note that the response does not include the results of the instant scheduled test. To retrieve test results, users can utilize the Endpoint Test Data endpoints. The URLs for these API test data endpoints are provided within the test definition output when an instant scheduled test is created.
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import json
import unittest
import thousandeyes_sdk.endpoint_instant_tests.models
from thousandeyes_sdk.core.exceptions import ApiException
from thousandeyes_sdk.endpoint_instant_tests.api.agent_to_server_endpoint_instant_scheduled_tests_api import AgentToServerEndpointInstantScheduledTestsApi
from .integration_test_utils import IntegrationTestBase
from .test_utils import assert_constructed_model_matches_example_json
class TestAgentToServerEndpointInstantScheduledTestsApiIntegration(IntegrationTestBase):
"""AgentToServerEndpointInstantScheduledTestsApi integration test stubs"""
def setUp(self) -> None:
super().setUp()
self.api = AgentToServerEndpointInstantScheduledTestsApi(self.api_client)
def test_create_agent_to_server_scheduled_instant_test_happy_path(self) -> None:
"""Integration test for create_agent_to_server_scheduled_instant_test success path"""
request_body_json = """
{
"server" : "www.example.com",
"ipVersion" : "V4_ONLY",
"port" : 443,
"agentSelectorType" : "all-agents",
"tagIds" : [ "c6b78e57-81a2-4c5f-a11a-d96c3c664d55", "5aeab5d5-0d34-4d44-a7ac-fb440185295c" ],
"maxMachines" : 25,
"serverName" : "www.example.com",
"endpointAgentLabels" : [ "567", "214" ],
"agents" : [ "0a3b9998-dc3a-4ff2-b50d-ac4a7cd986e1", "66eec0f1-72b4-4755-aa83-3aed61d17f3c" ],
"testName" : "Test name"
}
"""
endpoint_agent_to_server_instant_test = thousandeyes_sdk.endpoint_instant_tests.models.EndpointAgentToServerInstantTest.from_json(request_body_json)
aid = '1234'
response_body_json = """
{
"server" : "www.example.com",
"isSavedEvent" : false,
"_links" : {
"testResults" : [ {
"href" : "https://api.thousandeyes.com/v7/endpoint/test-results/scheduled-tests/281474976710706/network/filter"
}, {
"href" : "https://api.thousandeyes.com/v7/endpoint/test-results/scheduled-tests/281474976710706/pathvis"
} ],
"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"
}
},
"isPrioritized" : false,
"networkMeasurements" : true,
"type" : "agent-to-server",
"tcpProbeMode" : "auto",
"labels" : [ {
"labelId" : "961",
"name" : "Artem label",
"isBuiltin" : false
}, {
"labelId" : "961",
"name" : "Artem label",
"isBuiltin" : false
} ],
"protocol" : "icmp",
"createdDate" : "2022-07-17T22:00:54Z",
"ipVersion" : "V4_ONLY",
"port" : 443,
"isEnabled" : true,
"modifiedDate" : "2022-07-17T22:00:54Z",
"interval" : 60,
"testId" : "281474976710706",
"aid" : "1234",
"agentSelectorConfig" : {
"agentSelectorType" : "all-agents",
"maxMachines" : 25
},
"hasPathTraceInSession" : true,
"testName" : "Test name"
}
"""
expected_response = json.loads(response_body_json)
response = self.api.create_agent_to_server_scheduled_instant_test(
endpoint_agent_to_server_instant_test=endpoint_agent_to_server_instant_test,
aid=aid,
_headers=self.te_headers("create_agent_to_server_scheduled_instant_test"),
)
assert_constructed_model_matches_example_json(response, expected_response)
def test_create_agent_to_server_scheduled_instant_test_error_400(self) -> None:
"""Integration test for create_agent_to_server_scheduled_instant_test error path (HTTP 400)"""
request_body_json = """
{
"server" : "www.example.com",
"ipVersion" : "V4_ONLY",
"port" : 443,
"agentSelectorType" : "all-agents",
"tagIds" : [ "c6b78e57-81a2-4c5f-a11a-d96c3c664d55", "5aeab5d5-0d34-4d44-a7ac-fb440185295c" ],
"maxMachines" : 25,
"serverName" : "www.example.com",
"endpointAgentLabels" : [ "567", "214" ],
"agents" : [ "0a3b9998-dc3a-4ff2-b50d-ac4a7cd986e1", "66eec0f1-72b4-4755-aa83-3aed61d17f3c" ],
"testName" : "Test name"
}
"""
endpoint_agent_to_server_instant_test = thousandeyes_sdk.endpoint_instant_tests.models.EndpointAgentToServerInstantTest.from_json(request_body_json)
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.create_agent_to_server_scheduled_instant_test(
endpoint_agent_to_server_instant_test=endpoint_agent_to_server_instant_test,
aid=aid,
_headers=self.te_headers("create_agent_to_server_scheduled_instant_test", error_status="400"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_create_agent_to_server_scheduled_instant_test_error_401(self) -> None:
"""Integration test for create_agent_to_server_scheduled_instant_test error path (HTTP 401)"""
request_body_json = """
{
"server" : "www.example.com",
"ipVersion" : "V4_ONLY",
"port" : 443,
"agentSelectorType" : "all-agents",
"tagIds" : [ "c6b78e57-81a2-4c5f-a11a-d96c3c664d55", "5aeab5d5-0d34-4d44-a7ac-fb440185295c" ],
"maxMachines" : 25,
"serverName" : "www.example.com",
"endpointAgentLabels" : [ "567", "214" ],
"agents" : [ "0a3b9998-dc3a-4ff2-b50d-ac4a7cd986e1", "66eec0f1-72b4-4755-aa83-3aed61d17f3c" ],
"testName" : "Test name"
}
"""
endpoint_agent_to_server_instant_test = thousandeyes_sdk.endpoint_instant_tests.models.EndpointAgentToServerInstantTest.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_agent_to_server_scheduled_instant_test(
endpoint_agent_to_server_instant_test=endpoint_agent_to_server_instant_test,
aid=aid,
_headers=self.te_headers("create_agent_to_server_scheduled_instant_test", error_status="401"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_create_agent_to_server_scheduled_instant_test_error_403(self) -> None:
"""Integration test for create_agent_to_server_scheduled_instant_test error path (HTTP 403)"""
request_body_json = """
{
"server" : "www.example.com",
"ipVersion" : "V4_ONLY",
"port" : 443,
"agentSelectorType" : "all-agents",
"tagIds" : [ "c6b78e57-81a2-4c5f-a11a-d96c3c664d55", "5aeab5d5-0d34-4d44-a7ac-fb440185295c" ],
"maxMachines" : 25,
"serverName" : "www.example.com",
"endpointAgentLabels" : [ "567", "214" ],
"agents" : [ "0a3b9998-dc3a-4ff2-b50d-ac4a7cd986e1", "66eec0f1-72b4-4755-aa83-3aed61d17f3c" ],
"testName" : "Test name"
}
"""
endpoint_agent_to_server_instant_test = thousandeyes_sdk.endpoint_instant_tests.models.EndpointAgentToServerInstantTest.from_json(request_body_json)
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.create_agent_to_server_scheduled_instant_test(
endpoint_agent_to_server_instant_test=endpoint_agent_to_server_instant_test,
aid=aid,
_headers=self.te_headers("create_agent_to_server_scheduled_instant_test", error_status="403"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_create_agent_to_server_scheduled_instant_test_error_429(self) -> None:
"""Integration test for create_agent_to_server_scheduled_instant_test error path (HTTP 429)"""
request_body_json = """
{
"server" : "www.example.com",
"ipVersion" : "V4_ONLY",
"port" : 443,
"agentSelectorType" : "all-agents",
"tagIds" : [ "c6b78e57-81a2-4c5f-a11a-d96c3c664d55", "5aeab5d5-0d34-4d44-a7ac-fb440185295c" ],
"maxMachines" : 25,
"serverName" : "www.example.com",
"endpointAgentLabels" : [ "567", "214" ],
"agents" : [ "0a3b9998-dc3a-4ff2-b50d-ac4a7cd986e1", "66eec0f1-72b4-4755-aa83-3aed61d17f3c" ],
"testName" : "Test name"
}
"""
endpoint_agent_to_server_instant_test = thousandeyes_sdk.endpoint_instant_tests.models.EndpointAgentToServerInstantTest.from_json(request_body_json)
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.create_agent_to_server_scheduled_instant_test(
endpoint_agent_to_server_instant_test=endpoint_agent_to_server_instant_test,
aid=aid,
_headers=self.te_headers("create_agent_to_server_scheduled_instant_test", error_status="429"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_create_agent_to_server_scheduled_instant_test_error_500(self) -> None:
"""Integration test for create_agent_to_server_scheduled_instant_test error path (HTTP 500)"""
request_body_json = """
{
"server" : "www.example.com",
"ipVersion" : "V4_ONLY",
"port" : 443,
"agentSelectorType" : "all-agents",
"tagIds" : [ "c6b78e57-81a2-4c5f-a11a-d96c3c664d55", "5aeab5d5-0d34-4d44-a7ac-fb440185295c" ],
"maxMachines" : 25,
"serverName" : "www.example.com",
"endpointAgentLabels" : [ "567", "214" ],
"agents" : [ "0a3b9998-dc3a-4ff2-b50d-ac4a7cd986e1", "66eec0f1-72b4-4755-aa83-3aed61d17f3c" ],
"testName" : "Test name"
}
"""
endpoint_agent_to_server_instant_test = thousandeyes_sdk.endpoint_instant_tests.models.EndpointAgentToServerInstantTest.from_json(request_body_json)
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.create_agent_to_server_scheduled_instant_test(
endpoint_agent_to_server_instant_test=endpoint_agent_to_server_instant_test,
aid=aid,
_headers=self.te_headers("create_agent_to_server_scheduled_instant_test", error_status="500"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_create_agent_to_server_scheduled_instant_test_error_502(self) -> None:
"""Integration test for create_agent_to_server_scheduled_instant_test error path (HTTP 502)"""
request_body_json = """
{
"server" : "www.example.com",
"ipVersion" : "V4_ONLY",
"port" : 443,
"agentSelectorType" : "all-agents",
"tagIds" : [ "c6b78e57-81a2-4c5f-a11a-d96c3c664d55", "5aeab5d5-0d34-4d44-a7ac-fb440185295c" ],
"maxMachines" : 25,
"serverName" : "www.example.com",
"endpointAgentLabels" : [ "567", "214" ],
"agents" : [ "0a3b9998-dc3a-4ff2-b50d-ac4a7cd986e1", "66eec0f1-72b4-4755-aa83-3aed61d17f3c" ],
"testName" : "Test name"
}
"""
endpoint_agent_to_server_instant_test = thousandeyes_sdk.endpoint_instant_tests.models.EndpointAgentToServerInstantTest.from_json(request_body_json)
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(502)
) as context:
self.api.create_agent_to_server_scheduled_instant_test(
endpoint_agent_to_server_instant_test=endpoint_agent_to_server_instant_test,
aid=aid,
_headers=self.te_headers("create_agent_to_server_scheduled_instant_test", error_status="502"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
if __name__ == '__main__':
unittest.main()

View File

@ -0,0 +1,478 @@
# coding: utf-8
"""
Endpoint Instant Scheduled Tests API
You can create and execute a new endpoint instant scheduled test within ThousandEyes using this API. The test parameters are specified in the `POST` data. The following applies to the Endpoint Instant Scheduled Tests API: * To initiate the creation and execution of an instant scheduled test, the user must possess the `Edit endpoint tests` permission. * Upon successful creation of an instant scheduled test, the API responds with an HTTP/201 CREATED status code and return the test definition. * It's important to note that the response does not include the results of the instant scheduled test. To retrieve test results, users can utilize the Endpoint Test Data endpoints. The URLs for these API test data endpoints are provided within the test definition output when an instant scheduled test is created.
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import json
import unittest
import thousandeyes_sdk.endpoint_instant_tests.models
from thousandeyes_sdk.core.exceptions import ApiException
from thousandeyes_sdk.endpoint_instant_tests.api.http_server_endpoint_instant_scheduled_tests_api import HTTPServerEndpointInstantScheduledTestsApi
from .integration_test_utils import IntegrationTestBase
from .test_utils import assert_constructed_model_matches_example_json
class TestHTTPServerEndpointInstantScheduledTestsApiIntegration(IntegrationTestBase):
"""HTTPServerEndpointInstantScheduledTestsApi integration test stubs"""
def setUp(self) -> None:
super().setUp()
self.api = HTTPServerEndpointInstantScheduledTestsApi(self.api_client)
def test_create_http_server_scheduled_instant_test_happy_path(self) -> None:
"""Integration test for create_http_server_scheduled_instant_test success path"""
request_body_json = """
{
"verifyCertificate" : true,
"hasPing" : true,
"agentSelectorType" : "all-agents",
"tagIds" : [ "c6b78e57-81a2-4c5f-a11a-d96c3c664d55", "5aeab5d5-0d34-4d44-a7ac-fb440185295c" ],
"maxMachines" : 25,
"httpTimeLimit" : 5000,
"networkMeasurements" : true,
"endpointAgentLabels" : [ "567", "214" ],
"tcpProbeMode" : "auto",
"url" : "https://example.com:443",
"agents" : [ "0a3b9998-dc3a-4ff2-b50d-ac4a7cd986e1", "66eec0f1-72b4-4755-aa83-3aed61d17f3c" ],
"protocol" : "icmp",
"password" : "password",
"ipVersion" : "V4_ONLY",
"hasTraceroute" : true,
"targetResponseTime" : 1000,
"authType" : "none",
"hasPathTraceInSession" : true,
"testName" : "Test name",
"username" : "username",
"sslVersionId" : "0"
}
"""
endpoint_http_server_instant_test = thousandeyes_sdk.endpoint_instant_tests.models.EndpointHttpServerInstantTest.from_json(request_body_json)
aid = '1234'
response_body_json = """
{
"server" : "www.example.com",
"isSavedEvent" : false,
"sslVersion" : "Auto",
"useNtlm" : false,
"_links" : {
"testResults" : [ {
"href" : "https://api.thousandeyes.com/v7/endpoint/test-results/scheduled-tests/281474976710706/network/filter"
}, {
"href" : "https://api.thousandeyes.com/v7/endpoint/test-results/scheduled-tests/281474976710706/pathvis"
} ],
"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"
}
},
"isPrioritized" : false,
"httpTimeLimit" : 5000,
"type" : "http-server",
"protocol" : "icmp",
"httpVersion" : 2,
"followRedirects" : true,
"authType" : "none",
"testName" : "Test name",
"verifyCertificate" : true,
"networkMeasurements" : true,
"tcpProbeMode" : "auto",
"url" : "https://example.com:443",
"labels" : [ {
"labelId" : "961",
"name" : "Artem label",
"isBuiltin" : false
}, {
"labelId" : "961",
"name" : "Artem label",
"isBuiltin" : false
} ],
"createdDate" : "2022-07-17T22:00:54Z",
"ipVersion" : "V4_ONLY",
"port" : 443,
"isEnabled" : true,
"modifiedDate" : "2022-07-17T22:00:54Z",
"interval" : 60,
"testId" : "281474976710706",
"aid" : "1234",
"agentSelectorConfig" : {
"agentSelectorType" : "all-agents",
"maxMachines" : 25
},
"hasPathTraceInSession" : true,
"httpTargetTime" : 100,
"username" : "username",
"sslVersionId" : "0"
}
"""
expected_response = json.loads(response_body_json)
response = self.api.create_http_server_scheduled_instant_test(
endpoint_http_server_instant_test=endpoint_http_server_instant_test,
aid=aid,
_headers=self.te_headers("create_http_server_scheduled_instant_test"),
)
assert_constructed_model_matches_example_json(response, expected_response)
def test_create_http_server_scheduled_instant_test_error_400(self) -> None:
"""Integration test for create_http_server_scheduled_instant_test error path (HTTP 400)"""
request_body_json = """
{
"verifyCertificate" : true,
"hasPing" : true,
"agentSelectorType" : "all-agents",
"tagIds" : [ "c6b78e57-81a2-4c5f-a11a-d96c3c664d55", "5aeab5d5-0d34-4d44-a7ac-fb440185295c" ],
"maxMachines" : 25,
"httpTimeLimit" : 5000,
"networkMeasurements" : true,
"endpointAgentLabels" : [ "567", "214" ],
"tcpProbeMode" : "auto",
"url" : "https://example.com:443",
"agents" : [ "0a3b9998-dc3a-4ff2-b50d-ac4a7cd986e1", "66eec0f1-72b4-4755-aa83-3aed61d17f3c" ],
"protocol" : "icmp",
"password" : "password",
"ipVersion" : "V4_ONLY",
"hasTraceroute" : true,
"targetResponseTime" : 1000,
"authType" : "none",
"hasPathTraceInSession" : true,
"testName" : "Test name",
"username" : "username",
"sslVersionId" : "0"
}
"""
endpoint_http_server_instant_test = thousandeyes_sdk.endpoint_instant_tests.models.EndpointHttpServerInstantTest.from_json(request_body_json)
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.create_http_server_scheduled_instant_test(
endpoint_http_server_instant_test=endpoint_http_server_instant_test,
aid=aid,
_headers=self.te_headers("create_http_server_scheduled_instant_test", error_status="400"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_create_http_server_scheduled_instant_test_error_401(self) -> None:
"""Integration test for create_http_server_scheduled_instant_test error path (HTTP 401)"""
request_body_json = """
{
"verifyCertificate" : true,
"hasPing" : true,
"agentSelectorType" : "all-agents",
"tagIds" : [ "c6b78e57-81a2-4c5f-a11a-d96c3c664d55", "5aeab5d5-0d34-4d44-a7ac-fb440185295c" ],
"maxMachines" : 25,
"httpTimeLimit" : 5000,
"networkMeasurements" : true,
"endpointAgentLabels" : [ "567", "214" ],
"tcpProbeMode" : "auto",
"url" : "https://example.com:443",
"agents" : [ "0a3b9998-dc3a-4ff2-b50d-ac4a7cd986e1", "66eec0f1-72b4-4755-aa83-3aed61d17f3c" ],
"protocol" : "icmp",
"password" : "password",
"ipVersion" : "V4_ONLY",
"hasTraceroute" : true,
"targetResponseTime" : 1000,
"authType" : "none",
"hasPathTraceInSession" : true,
"testName" : "Test name",
"username" : "username",
"sslVersionId" : "0"
}
"""
endpoint_http_server_instant_test = thousandeyes_sdk.endpoint_instant_tests.models.EndpointHttpServerInstantTest.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_http_server_scheduled_instant_test(
endpoint_http_server_instant_test=endpoint_http_server_instant_test,
aid=aid,
_headers=self.te_headers("create_http_server_scheduled_instant_test", error_status="401"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_create_http_server_scheduled_instant_test_error_403(self) -> None:
"""Integration test for create_http_server_scheduled_instant_test error path (HTTP 403)"""
request_body_json = """
{
"verifyCertificate" : true,
"hasPing" : true,
"agentSelectorType" : "all-agents",
"tagIds" : [ "c6b78e57-81a2-4c5f-a11a-d96c3c664d55", "5aeab5d5-0d34-4d44-a7ac-fb440185295c" ],
"maxMachines" : 25,
"httpTimeLimit" : 5000,
"networkMeasurements" : true,
"endpointAgentLabels" : [ "567", "214" ],
"tcpProbeMode" : "auto",
"url" : "https://example.com:443",
"agents" : [ "0a3b9998-dc3a-4ff2-b50d-ac4a7cd986e1", "66eec0f1-72b4-4755-aa83-3aed61d17f3c" ],
"protocol" : "icmp",
"password" : "password",
"ipVersion" : "V4_ONLY",
"hasTraceroute" : true,
"targetResponseTime" : 1000,
"authType" : "none",
"hasPathTraceInSession" : true,
"testName" : "Test name",
"username" : "username",
"sslVersionId" : "0"
}
"""
endpoint_http_server_instant_test = thousandeyes_sdk.endpoint_instant_tests.models.EndpointHttpServerInstantTest.from_json(request_body_json)
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.create_http_server_scheduled_instant_test(
endpoint_http_server_instant_test=endpoint_http_server_instant_test,
aid=aid,
_headers=self.te_headers("create_http_server_scheduled_instant_test", error_status="403"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_create_http_server_scheduled_instant_test_error_429(self) -> None:
"""Integration test for create_http_server_scheduled_instant_test error path (HTTP 429)"""
request_body_json = """
{
"verifyCertificate" : true,
"hasPing" : true,
"agentSelectorType" : "all-agents",
"tagIds" : [ "c6b78e57-81a2-4c5f-a11a-d96c3c664d55", "5aeab5d5-0d34-4d44-a7ac-fb440185295c" ],
"maxMachines" : 25,
"httpTimeLimit" : 5000,
"networkMeasurements" : true,
"endpointAgentLabels" : [ "567", "214" ],
"tcpProbeMode" : "auto",
"url" : "https://example.com:443",
"agents" : [ "0a3b9998-dc3a-4ff2-b50d-ac4a7cd986e1", "66eec0f1-72b4-4755-aa83-3aed61d17f3c" ],
"protocol" : "icmp",
"password" : "password",
"ipVersion" : "V4_ONLY",
"hasTraceroute" : true,
"targetResponseTime" : 1000,
"authType" : "none",
"hasPathTraceInSession" : true,
"testName" : "Test name",
"username" : "username",
"sslVersionId" : "0"
}
"""
endpoint_http_server_instant_test = thousandeyes_sdk.endpoint_instant_tests.models.EndpointHttpServerInstantTest.from_json(request_body_json)
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.create_http_server_scheduled_instant_test(
endpoint_http_server_instant_test=endpoint_http_server_instant_test,
aid=aid,
_headers=self.te_headers("create_http_server_scheduled_instant_test", error_status="429"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_create_http_server_scheduled_instant_test_error_500(self) -> None:
"""Integration test for create_http_server_scheduled_instant_test error path (HTTP 500)"""
request_body_json = """
{
"verifyCertificate" : true,
"hasPing" : true,
"agentSelectorType" : "all-agents",
"tagIds" : [ "c6b78e57-81a2-4c5f-a11a-d96c3c664d55", "5aeab5d5-0d34-4d44-a7ac-fb440185295c" ],
"maxMachines" : 25,
"httpTimeLimit" : 5000,
"networkMeasurements" : true,
"endpointAgentLabels" : [ "567", "214" ],
"tcpProbeMode" : "auto",
"url" : "https://example.com:443",
"agents" : [ "0a3b9998-dc3a-4ff2-b50d-ac4a7cd986e1", "66eec0f1-72b4-4755-aa83-3aed61d17f3c" ],
"protocol" : "icmp",
"password" : "password",
"ipVersion" : "V4_ONLY",
"hasTraceroute" : true,
"targetResponseTime" : 1000,
"authType" : "none",
"hasPathTraceInSession" : true,
"testName" : "Test name",
"username" : "username",
"sslVersionId" : "0"
}
"""
endpoint_http_server_instant_test = thousandeyes_sdk.endpoint_instant_tests.models.EndpointHttpServerInstantTest.from_json(request_body_json)
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.create_http_server_scheduled_instant_test(
endpoint_http_server_instant_test=endpoint_http_server_instant_test,
aid=aid,
_headers=self.te_headers("create_http_server_scheduled_instant_test", error_status="500"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_create_http_server_scheduled_instant_test_error_502(self) -> None:
"""Integration test for create_http_server_scheduled_instant_test error path (HTTP 502)"""
request_body_json = """
{
"verifyCertificate" : true,
"hasPing" : true,
"agentSelectorType" : "all-agents",
"tagIds" : [ "c6b78e57-81a2-4c5f-a11a-d96c3c664d55", "5aeab5d5-0d34-4d44-a7ac-fb440185295c" ],
"maxMachines" : 25,
"httpTimeLimit" : 5000,
"networkMeasurements" : true,
"endpointAgentLabels" : [ "567", "214" ],
"tcpProbeMode" : "auto",
"url" : "https://example.com:443",
"agents" : [ "0a3b9998-dc3a-4ff2-b50d-ac4a7cd986e1", "66eec0f1-72b4-4755-aa83-3aed61d17f3c" ],
"protocol" : "icmp",
"password" : "password",
"ipVersion" : "V4_ONLY",
"hasTraceroute" : true,
"targetResponseTime" : 1000,
"authType" : "none",
"hasPathTraceInSession" : true,
"testName" : "Test name",
"username" : "username",
"sslVersionId" : "0"
}
"""
endpoint_http_server_instant_test = thousandeyes_sdk.endpoint_instant_tests.models.EndpointHttpServerInstantTest.from_json(request_body_json)
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(502)
) as context:
self.api.create_http_server_scheduled_instant_test(
endpoint_http_server_instant_test=endpoint_http_server_instant_test,
aid=aid,
_headers=self.te_headers("create_http_server_scheduled_instant_test", error_status="502"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
if __name__ == '__main__':
unittest.main()

View File

@ -0,0 +1,260 @@
# coding: utf-8
"""
Endpoint Instant Scheduled Tests API
You can create and execute a new endpoint instant scheduled test within ThousandEyes using this API. The test parameters are specified in the `POST` data. The following applies to the Endpoint Instant Scheduled Tests API: * To initiate the creation and execution of an instant scheduled test, the user must possess the `Edit endpoint tests` permission. * Upon successful creation of an instant scheduled test, the API responds with an HTTP/201 CREATED status code and return the test definition. * It's important to note that the response does not include the results of the instant scheduled test. To retrieve test results, users can utilize the Endpoint Test Data endpoints. The URLs for these API test data endpoints are provided within the test definition output when an instant scheduled test is created.
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import json
import unittest
import thousandeyes_sdk.endpoint_instant_tests.models
from thousandeyes_sdk.core.exceptions import ApiException
from thousandeyes_sdk.endpoint_instant_tests.api.run_endpoint_instant_scheduled_tests_api import RunEndpointInstantScheduledTestsApi
from .integration_test_utils import IntegrationTestBase
from .test_utils import assert_constructed_model_matches_example_json
class TestRunEndpointInstantScheduledTestsApiIntegration(IntegrationTestBase):
"""RunEndpointInstantScheduledTestsApi integration test stubs"""
def setUp(self) -> None:
super().setUp()
self.api = RunEndpointInstantScheduledTestsApi(self.api_client)
def test_run_endpoint_scheduled_instant_test_happy_path(self) -> None:
"""Integration test for run_endpoint_scheduled_instant_test success path"""
test_id = '765231567'
aid = '1234'
response_body_json = """
{
"message" : "Successfully reran the instant scheduled test with testId=765231567"
}
"""
expected_response = json.loads(response_body_json)
response = self.api.run_endpoint_scheduled_instant_test(
test_id=test_id,
aid=aid,
_headers=self.te_headers("run_endpoint_scheduled_instant_test"),
)
assert_constructed_model_matches_example_json(response, expected_response)
def test_run_endpoint_scheduled_instant_test_error_400(self) -> None:
"""Integration test for run_endpoint_scheduled_instant_test error path (HTTP 400)"""
test_id = '765231567'
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.run_endpoint_scheduled_instant_test(
test_id=test_id,
aid=aid,
_headers=self.te_headers("run_endpoint_scheduled_instant_test", error_status="400"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_run_endpoint_scheduled_instant_test_error_401(self) -> None:
"""Integration test for run_endpoint_scheduled_instant_test error path (HTTP 401)"""
test_id = '765231567'
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.run_endpoint_scheduled_instant_test(
test_id=test_id,
aid=aid,
_headers=self.te_headers("run_endpoint_scheduled_instant_test", error_status="401"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_run_endpoint_scheduled_instant_test_error_403(self) -> None:
"""Integration test for run_endpoint_scheduled_instant_test error path (HTTP 403)"""
test_id = '765231567'
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.run_endpoint_scheduled_instant_test(
test_id=test_id,
aid=aid,
_headers=self.te_headers("run_endpoint_scheduled_instant_test", error_status="403"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_run_endpoint_scheduled_instant_test_error_404(self) -> None:
"""Integration test for run_endpoint_scheduled_instant_test error path (HTTP 404)"""
test_id = '765231567'
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.run_endpoint_scheduled_instant_test(
test_id=test_id,
aid=aid,
_headers=self.te_headers("run_endpoint_scheduled_instant_test", error_status="404"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_run_endpoint_scheduled_instant_test_error_429(self) -> None:
"""Integration test for run_endpoint_scheduled_instant_test error path (HTTP 429)"""
test_id = '765231567'
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.run_endpoint_scheduled_instant_test(
test_id=test_id,
aid=aid,
_headers=self.te_headers("run_endpoint_scheduled_instant_test", error_status="429"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_run_endpoint_scheduled_instant_test_error_500(self) -> None:
"""Integration test for run_endpoint_scheduled_instant_test error path (HTTP 500)"""
test_id = '765231567'
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.run_endpoint_scheduled_instant_test(
test_id=test_id,
aid=aid,
_headers=self.te_headers("run_endpoint_scheduled_instant_test", error_status="500"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_run_endpoint_scheduled_instant_test_error_502(self) -> None:
"""Integration test for run_endpoint_scheduled_instant_test error path (HTTP 502)"""
test_id = '765231567'
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(502)
) as context:
self.api.run_endpoint_scheduled_instant_test(
test_id=test_id,
aid=aid,
_headers=self.te_headers("run_endpoint_scheduled_instant_test", error_status="502"),
)
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

@ -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 Agent Labels API
Manage labels applied to endpoint agents using this API.
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,575 @@
# coding: utf-8
"""
Endpoint Agent Labels API
Manage labels applied to endpoint agents using this API.
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_endpoint_label": OperationExpectation(
operation_id="create_endpoint_label",
method="POST",
path="/endpoint/labels",
path_param_examples={
},
success_status=201,
success_body=json.loads("""
{
"color" : "#ff3333",
"_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"
}
},
"matchType" : "and",
"name" : "Head office meeting rooms",
"id" : "abc-123-def",
"filters" : [ {
"mode" : "in",
"values" : [ "10.1.1.0/24", "192.168.1.0/24" ],
"key" : "vpn-client-network"
}, {
"mode" : "in",
"values" : [ "10.1.1.0/24", "192.168.1.0/24" ],
"key" : "vpn-client-network"
} ]
}
"""),
success_content_type="application/json",
request_body_example=json.loads("""
{
"color" : "#ff3333",
"matchType" : "and",
"name" : "Head office meeting rooms",
"id" : "abc-123-def",
"filters" : [ {
"mode" : "in",
"values" : [ "10.1.1.0/24", "192.168.1.0/24" ],
"key" : "vpn-client-network"
}, {
"mode" : "in",
"values" : [ "10.1.1.0/24", "192.168.1.0/24" ],
"key" : "vpn-client-network"
} ]
}
"""),
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",
),
"429": ErrorResponseExpectation(
status=429,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
},
),
"delete_endpoint_label": OperationExpectation(
operation_id="delete_endpoint_label",
method="DELETE",
path="/endpoint/labels/{id}",
path_param_examples={
"id": 'id_example',
},
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",
),
},
),
"get_endpoint_label": OperationExpectation(
operation_id="get_endpoint_label",
method="GET",
path="/endpoint/labels/{id}",
path_param_examples={
"id": 'id_example',
},
success_status=200,
success_body=json.loads("""
{
"color" : "#ff3333",
"_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"
}
},
"matchType" : "and",
"name" : "Head office meeting rooms",
"id" : "abc-123-def",
"filters" : [ {
"mode" : "in",
"values" : [ "10.1.1.0/24", "192.168.1.0/24" ],
"key" : "vpn-client-network"
}, {
"mode" : "in",
"values" : [ "10.1.1.0/24", "192.168.1.0/24" ],
"key" : "vpn-client-network"
} ]
}
"""),
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",
),
},
),
"get_endpoint_labels": OperationExpectation(
operation_id="get_endpoint_labels",
method="GET",
path="/endpoint/labels",
path_param_examples={
},
success_status=200,
success_body=json.loads("""
{
"_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"
},
"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"
}
},
"labels" : [ {
"color" : "#ff3333",
"_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"
}
},
"matchType" : "and",
"name" : "Head office meeting rooms",
"id" : "abc-123-def",
"filters" : [ {
"mode" : "in",
"values" : [ "10.1.1.0/24", "192.168.1.0/24" ],
"key" : "vpn-client-network"
}, {
"mode" : "in",
"values" : [ "10.1.1.0/24", "192.168.1.0/24" ],
"key" : "vpn-client-network"
} ]
}, {
"color" : "#ff3333",
"_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"
}
},
"matchType" : "and",
"name" : "Head office meeting rooms",
"id" : "abc-123-def",
"filters" : [ {
"mode" : "in",
"values" : [ "10.1.1.0/24", "192.168.1.0/24" ],
"key" : "vpn-client-network"
}, {
"mode" : "in",
"values" : [ "10.1.1.0/24", "192.168.1.0/24" ],
"key" : "vpn-client-network"
} ]
} ]
}
"""),
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",
),
"429": ErrorResponseExpectation(
status=429,
body=json.loads("""
{
"instance" : "instance",
"detail" : "detail",
"type" : "type",
"title" : "title",
"status" : 0
}"""),
content_type="application/json",
),
},
),
"update_endpoint_label": OperationExpectation(
operation_id="update_endpoint_label",
method="PATCH",
path="/endpoint/labels/{id}",
path_param_examples={
"id": 'id_example',
},
success_status=200,
success_body=json.loads("""
{
"color" : "#ff3333",
"_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"
}
},
"matchType" : "and",
"name" : "Head office meeting rooms",
"id" : "abc-123-def",
"filters" : [ {
"mode" : "in",
"values" : [ "10.1.1.0/24", "192.168.1.0/24" ],
"key" : "vpn-client-network"
}, {
"mode" : "in",
"values" : [ "10.1.1.0/24", "192.168.1.0/24" ],
"key" : "vpn-client-network"
} ]
}
"""),
success_content_type="application/json",
request_body_example=json.loads("""
{
"color" : "#ff3333",
"matchType" : "and",
"name" : "Head office meeting rooms",
"id" : "abc-123-def",
"filters" : [ {
"mode" : "in",
"values" : [ "10.1.1.0/24", "192.168.1.0/24" ],
"key" : "vpn-client-network"
}, {
"mode" : "in",
"values" : [ "10.1.1.0/24", "192.168.1.0/24" ],
"key" : "vpn-client-network"
} ]
}
"""),
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",
),
},
),
}

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

@ -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 Test Results API
Retrieve results for scheduled and dynamic tests on 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

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

@ -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 Tests API
Manage endpoint agent dynamic and scheduled tests using the Endpoint Tests API.
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,176 @@
# coding: utf-8
"""
Endpoint Tests API
Manage endpoint agent dynamic and scheduled tests using the Endpoint Tests API.
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import json
import unittest
import thousandeyes_sdk.endpoint_tests.models
from thousandeyes_sdk.core.exceptions import ApiException
from thousandeyes_sdk.endpoint_tests.api.endpoint_real_user_tests_api import EndpointRealUserTestsApi
from .integration_test_utils import IntegrationTestBase
from .test_utils import assert_constructed_model_matches_example_json
class TestEndpointRealUserTestsApiIntegration(IntegrationTestBase):
"""EndpointRealUserTestsApi integration test stubs"""
def setUp(self) -> None:
super().setUp()
self.api = EndpointRealUserTestsApi(self.api_client)
def test_get_endpoint_real_user_tests_happy_path(self) -> None:
"""Integration test for get_endpoint_real_user_tests success path"""
aid = '1234'
response_body_json = """
{
"realUserTests" : [ {
"includedDomains" : [ "example.com", "example.com" ],
"profileId" : "73421",
"monitoringSettings" : {
"monitoringSettingsId" : "1f5c1b5d-8a0d-4d6b-a3be-56b060f7f2c9",
"monitoringSettingsType" : "agent-tags",
"tagIds" : [ "49d9e7d2-7df5-43df-9b37-aa596b929062" ],
"labelIds" : [ "567" ]
},
"name" : "Corporate domains",
"excludedDomains" : [ "static.example.com", "static.example.com" ],
"aid" : "1234"
}, {
"includedDomains" : [ "example.com", "example.com" ],
"profileId" : "73421",
"monitoringSettings" : {
"monitoringSettingsId" : "1f5c1b5d-8a0d-4d6b-a3be-56b060f7f2c9",
"monitoringSettingsType" : "agent-tags",
"tagIds" : [ "49d9e7d2-7df5-43df-9b37-aa596b929062" ],
"labelIds" : [ "567" ]
},
"name" : "Corporate domains",
"excludedDomains" : [ "static.example.com", "static.example.com" ],
"aid" : "1234"
} ]
}
"""
expected_response = json.loads(response_body_json)
response = self.api.get_endpoint_real_user_tests(
aid=aid,
_headers=self.te_headers("get_endpoint_real_user_tests"),
)
assert_constructed_model_matches_example_json(response, expected_response)
def test_get_endpoint_real_user_tests_error_401(self) -> None:
"""Integration test for get_endpoint_real_user_tests 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_endpoint_real_user_tests(
aid=aid,
_headers=self.te_headers("get_endpoint_real_user_tests", error_status="401"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_endpoint_real_user_tests_error_403(self) -> None:
"""Integration test for get_endpoint_real_user_tests 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_endpoint_real_user_tests(
aid=aid,
_headers=self.te_headers("get_endpoint_real_user_tests", error_status="403"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_endpoint_real_user_tests_error_429(self) -> None:
"""Integration test for get_endpoint_real_user_tests 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_endpoint_real_user_tests(
aid=aid,
_headers=self.te_headers("get_endpoint_real_user_tests", error_status="429"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_endpoint_real_user_tests_error_500(self) -> None:
"""Integration test for get_endpoint_real_user_tests 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_endpoint_real_user_tests(
aid=aid,
_headers=self.te_headers("get_endpoint_real_user_tests", error_status="500"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
if __name__ == '__main__':
unittest.main()

View File

@ -0,0 +1,285 @@
# coding: utf-8
"""
Endpoint Tests API
Manage endpoint agent dynamic and scheduled tests using the Endpoint Tests API.
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import json
import unittest
import thousandeyes_sdk.endpoint_tests.models
from thousandeyes_sdk.core.exceptions import ApiException
from thousandeyes_sdk.endpoint_tests.api.endpoint_scheduled_tests_api import EndpointScheduledTestsApi
from .integration_test_utils import IntegrationTestBase
from .test_utils import assert_constructed_model_matches_example_json
class TestEndpointScheduledTestsApiIntegration(IntegrationTestBase):
"""EndpointScheduledTestsApi integration test stubs"""
def setUp(self) -> None:
super().setUp()
self.api = EndpointScheduledTestsApi(self.api_client)
def test_get_endpoint_scheduled_tests_happy_path(self) -> None:
"""Integration test for get_endpoint_scheduled_tests success path"""
aid = '1234'
response_body_json = """
{
"tests" : [ {
"server" : "www.example.com",
"isSavedEvent" : false,
"_links" : {
"testResults" : [ {
"href" : "https://api.thousandeyes.com/v7/endpoint/test-results/scheduled-tests/281474976710706/network/filter"
}, {
"href" : "https://api.thousandeyes.com/v7/endpoint/test-results/scheduled-tests/281474976710706/pathvis"
} ],
"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"
}
},
"isPrioritized" : false,
"networkMeasurements" : true,
"type" : "agent-to-server",
"tcpProbeMode" : "auto",
"labels" : [ {
"labelId" : "961",
"name" : "Artem label",
"isBuiltin" : false
}, {
"labelId" : "961",
"name" : "Artem label",
"isBuiltin" : false
} ],
"protocol" : "icmp",
"createdDate" : "2022-07-17T22:00:54Z",
"ipVersion" : "V4_ONLY",
"port" : 443,
"isEnabled" : true,
"modifiedDate" : "2022-07-17T22:00:54Z",
"interval" : 60,
"testId" : "281474976710706",
"aid" : "1234",
"agentSelectorConfig" : {
"agentSelectorType" : "all-agents",
"maxMachines" : 25
},
"hasPathTraceInSession" : true,
"testName" : "Test name"
}, {
"server" : "www.example.com",
"isSavedEvent" : false,
"_links" : {
"testResults" : [ {
"href" : "https://api.thousandeyes.com/v7/endpoint/test-results/scheduled-tests/281474976710706/network/filter"
}, {
"href" : "https://api.thousandeyes.com/v7/endpoint/test-results/scheduled-tests/281474976710706/pathvis"
} ],
"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"
}
},
"isPrioritized" : false,
"networkMeasurements" : true,
"type" : "agent-to-server",
"tcpProbeMode" : "auto",
"labels" : [ {
"labelId" : "961",
"name" : "Artem label",
"isBuiltin" : false
}, {
"labelId" : "961",
"name" : "Artem label",
"isBuiltin" : false
} ],
"protocol" : "icmp",
"createdDate" : "2022-07-17T22:00:54Z",
"ipVersion" : "V4_ONLY",
"port" : 443,
"isEnabled" : true,
"modifiedDate" : "2022-07-17T22:00:54Z",
"interval" : 60,
"testId" : "281474976710706",
"aid" : "1234",
"agentSelectorConfig" : {
"agentSelectorType" : "all-agents",
"maxMachines" : 25
},
"hasPathTraceInSession" : true,
"testName" : "Test name"
} ],
"_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_endpoint_scheduled_tests(
aid=aid,
_headers=self.te_headers("get_endpoint_scheduled_tests"),
)
assert_constructed_model_matches_example_json(response, expected_response)
def test_get_endpoint_scheduled_tests_error_401(self) -> None:
"""Integration test for get_endpoint_scheduled_tests 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_endpoint_scheduled_tests(
aid=aid,
_headers=self.te_headers("get_endpoint_scheduled_tests", error_status="401"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_endpoint_scheduled_tests_error_403(self) -> None:
"""Integration test for get_endpoint_scheduled_tests 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_endpoint_scheduled_tests(
aid=aid,
_headers=self.te_headers("get_endpoint_scheduled_tests", error_status="403"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_endpoint_scheduled_tests_error_429(self) -> None:
"""Integration test for get_endpoint_scheduled_tests 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_endpoint_scheduled_tests(
aid=aid,
_headers=self.te_headers("get_endpoint_scheduled_tests", error_status="429"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_endpoint_scheduled_tests_error_500(self) -> None:
"""Integration test for get_endpoint_scheduled_tests 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_endpoint_scheduled_tests(
aid=aid,
_headers=self.te_headers("get_endpoint_scheduled_tests", error_status="500"),
)
assert_constructed_model_matches_example_json(context.exception.data, expected_error)
def test_get_endpoint_scheduled_tests_error_502(self) -> None:
"""Integration test for get_endpoint_scheduled_tests 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_endpoint_scheduled_tests(
aid=aid,
_headers=self.te_headers("get_endpoint_scheduled_tests", error_status="502"),
)
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

@ -19,7 +19,7 @@ from importlib.metadata import version
import thousandeyes_sdk.event_detection.models import thousandeyes_sdk.event_detection.models
from datetime import datetime from datetime import datetime
from pydantic import Field, StrictInt, StrictStr, field_validator from pydantic import Field, StrictBool, StrictInt, StrictStr, field_validator
from typing import Optional from typing import Optional
from typing_extensions import Annotated from typing_extensions import Annotated
from thousandeyes_sdk.event_detection.models.event_detail import EventDetail from thousandeyes_sdk.event_detection.models.event_detail import EventDetail
@ -350,6 +350,7 @@ class EventsApi:
end_date: Annotated[Optional[datetime], Field(description="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`.")] = None, end_date: Annotated[Optional[datetime], Field(description="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`.")] = None,
max: Annotated[Optional[StrictInt], Field(description="(Optional) Maximum number of objects to return.")] = None, max: Annotated[Optional[StrictInt], Field(description="(Optional) Maximum number of objects to return.")] = None,
cursor: Annotated[Optional[StrictStr], Field(description="(Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter.")] = None, cursor: Annotated[Optional[StrictStr], Field(description="(Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter.")] = None,
ongoing: Annotated[Optional[StrictBool], Field(description="When set to `true`, only ongoing (active) events whose start date is within the specified time window are included in the response. When set to `false`, ongoing events are excluded from the response. If not set, both ongoing and concluded events appear in the response.")] = None,
_request_timeout: Union[ _request_timeout: Union[
None, None,
Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)],
@ -379,6 +380,8 @@ class EventsApi:
:type max: int :type max: int
:param cursor: (Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter. :param cursor: (Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter.
:type cursor: str :type cursor: str
:param ongoing: When set to `true`, only ongoing (active) events whose start date is within the specified time window are included in the response. When set to `false`, ongoing events are excluded from the response. If not set, both ongoing and concluded events appear in the response.
:type ongoing: bool
:param _request_timeout: timeout setting for this request. If one :param _request_timeout: timeout setting for this request. If one
number provided, it will be total request number provided, it will be total request
timeout. It can also be a pair (tuple) of timeout. It can also be a pair (tuple) of
@ -403,7 +406,7 @@ class EventsApi:
return PaginationIterable( return PaginationIterable(
self.get_events, self.get_events,
lambda data: data.events if data and data.events else [], lambda data: data.events if data and data.events else [],
aid = aid, window = window, start_date = start_date, end_date = end_date, max = max, cursor = cursor, aid = aid, window = window, start_date = start_date, end_date = end_date, max = max, cursor = cursor, ongoing = ongoing,
_request_timeout=_request_timeout, _request_timeout=_request_timeout,
_request_auth=_request_auth, _request_auth=_request_auth,
_content_type=_content_type, _content_type=_content_type,
@ -421,6 +424,7 @@ class EventsApi:
end_date: Annotated[Optional[datetime], Field(description="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`.")] = None, end_date: Annotated[Optional[datetime], Field(description="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`.")] = None,
max: Annotated[Optional[StrictInt], Field(description="(Optional) Maximum number of objects to return.")] = None, max: Annotated[Optional[StrictInt], Field(description="(Optional) Maximum number of objects to return.")] = None,
cursor: Annotated[Optional[StrictStr], Field(description="(Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter.")] = None, cursor: Annotated[Optional[StrictStr], Field(description="(Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter.")] = None,
ongoing: Annotated[Optional[StrictBool], Field(description="When set to `true`, only ongoing (active) events whose start date is within the specified time window are included in the response. When set to `false`, ongoing events are excluded from the response. If not set, both ongoing and concluded events appear in the response.")] = None,
_request_timeout: Union[ _request_timeout: Union[
None, None,
Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)],
@ -450,6 +454,8 @@ class EventsApi:
:type max: int :type max: int
:param cursor: (Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter. :param cursor: (Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter.
:type cursor: str :type cursor: str
:param ongoing: When set to `true`, only ongoing (active) events whose start date is within the specified time window are included in the response. When set to `false`, ongoing events are excluded from the response. If not set, both ongoing and concluded events appear in the response.
:type ongoing: bool
:param _request_timeout: timeout setting for this request. If one :param _request_timeout: timeout setting for this request. If one
number provided, it will be total request number provided, it will be total request
timeout. It can also be a pair (tuple) of timeout. It can also be a pair (tuple) of
@ -479,6 +485,7 @@ class EventsApi:
end_date=end_date, end_date=end_date,
max=max, max=max,
cursor=cursor, cursor=cursor,
ongoing=ongoing,
_request_auth=_request_auth, _request_auth=_request_auth,
_content_type=_content_type, _content_type=_content_type,
_headers=_headers, _headers=_headers,
@ -516,6 +523,7 @@ class EventsApi:
end_date: Annotated[Optional[datetime], Field(description="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`.")] = None, end_date: Annotated[Optional[datetime], Field(description="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`.")] = None,
max: Annotated[Optional[StrictInt], Field(description="(Optional) Maximum number of objects to return.")] = None, max: Annotated[Optional[StrictInt], Field(description="(Optional) Maximum number of objects to return.")] = None,
cursor: Annotated[Optional[StrictStr], Field(description="(Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter.")] = None, cursor: Annotated[Optional[StrictStr], Field(description="(Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter.")] = None,
ongoing: Annotated[Optional[StrictBool], Field(description="When set to `true`, only ongoing (active) events whose start date is within the specified time window are included in the response. When set to `false`, ongoing events are excluded from the response. If not set, both ongoing and concluded events appear in the response.")] = None,
_request_timeout: Union[ _request_timeout: Union[
None, None,
Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)],
@ -545,6 +553,8 @@ class EventsApi:
:type max: int :type max: int
:param cursor: (Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter. :param cursor: (Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter.
:type cursor: str :type cursor: str
:param ongoing: When set to `true`, only ongoing (active) events whose start date is within the specified time window are included in the response. When set to `false`, ongoing events are excluded from the response. If not set, both ongoing and concluded events appear in the response.
:type ongoing: bool
:param _request_timeout: timeout setting for this request. If one :param _request_timeout: timeout setting for this request. If one
number provided, it will be total request number provided, it will be total request
timeout. It can also be a pair (tuple) of timeout. It can also be a pair (tuple) of
@ -574,6 +584,7 @@ class EventsApi:
end_date=end_date, end_date=end_date,
max=max, max=max,
cursor=cursor, cursor=cursor,
ongoing=ongoing,
_request_auth=_request_auth, _request_auth=_request_auth,
_content_type=_content_type, _content_type=_content_type,
_headers=_headers, _headers=_headers,
@ -611,6 +622,7 @@ class EventsApi:
end_date: Annotated[Optional[datetime], Field(description="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`.")] = None, end_date: Annotated[Optional[datetime], Field(description="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`.")] = None,
max: Annotated[Optional[StrictInt], Field(description="(Optional) Maximum number of objects to return.")] = None, max: Annotated[Optional[StrictInt], Field(description="(Optional) Maximum number of objects to return.")] = None,
cursor: Annotated[Optional[StrictStr], Field(description="(Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter.")] = None, cursor: Annotated[Optional[StrictStr], Field(description="(Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter.")] = None,
ongoing: Annotated[Optional[StrictBool], Field(description="When set to `true`, only ongoing (active) events whose start date is within the specified time window are included in the response. When set to `false`, ongoing events are excluded from the response. If not set, both ongoing and concluded events appear in the response.")] = None,
_request_timeout: Union[ _request_timeout: Union[
None, None,
Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)],
@ -640,6 +652,8 @@ class EventsApi:
:type max: int :type max: int
:param cursor: (Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter. :param cursor: (Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter.
:type cursor: str :type cursor: str
:param ongoing: When set to `true`, only ongoing (active) events whose start date is within the specified time window are included in the response. When set to `false`, ongoing events are excluded from the response. If not set, both ongoing and concluded events appear in the response.
:type ongoing: bool
:param _request_timeout: timeout setting for this request. If one :param _request_timeout: timeout setting for this request. If one
number provided, it will be total request number provided, it will be total request
timeout. It can also be a pair (tuple) of timeout. It can also be a pair (tuple) of
@ -669,6 +683,7 @@ class EventsApi:
end_date=end_date, end_date=end_date,
max=max, max=max,
cursor=cursor, cursor=cursor,
ongoing=ongoing,
_request_auth=_request_auth, _request_auth=_request_auth,
_content_type=_content_type, _content_type=_content_type,
_headers=_headers, _headers=_headers,
@ -700,6 +715,7 @@ class EventsApi:
end_date, end_date,
max, max,
cursor, cursor,
ongoing,
_request_auth, _request_auth,
_content_type, _content_type,
_headers, _headers,
@ -762,6 +778,10 @@ class EventsApi:
_query_params.append(('cursor', cursor)) _query_params.append(('cursor', cursor))
if ongoing is not None:
_query_params.append(('ongoing', ongoing))
# process the header parameters # process the header parameters
# process the form parameters # process the form parameters
# process the body parameter # process the body parameter

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))

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