mirror of
https://github.com/thousandeyes/thousandeyes-sdk-python.git
synced 2026-08-04 00:46:52 +00:00
Fix integration test boolean literals and response assertion mismatches.
Regenerate endpoint-agents and event-detection integration tests with Python booleans, sync get_events ongoing param support, and compare responses using only fields present in constructed models. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
39517ce6d1
commit
85d34d7c26
@ -2,15 +2,36 @@
|
||||
|
||||
import json
|
||||
import unittest
|
||||
from typing import Any
|
||||
|
||||
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):
|
||||
test_case = unittest.TestCase()
|
||||
test_case.maxDiff = None
|
||||
test_case.assertIsNotNone(model)
|
||||
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)
|
||||
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)
|
||||
|
||||
@ -2,15 +2,36 @@
|
||||
|
||||
import json
|
||||
import unittest
|
||||
from typing import Any
|
||||
|
||||
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):
|
||||
test_case = unittest.TestCase()
|
||||
test_case.maxDiff = None
|
||||
test_case.assertIsNotNone(model)
|
||||
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)
|
||||
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)
|
||||
|
||||
@ -2,15 +2,36 @@
|
||||
|
||||
import json
|
||||
import unittest
|
||||
from typing import Any
|
||||
|
||||
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):
|
||||
test_case = unittest.TestCase()
|
||||
test_case.maxDiff = None
|
||||
test_case.assertIsNotNone(model)
|
||||
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)
|
||||
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)
|
||||
|
||||
@ -2,15 +2,36 @@
|
||||
|
||||
import json
|
||||
import unittest
|
||||
from typing import Any
|
||||
|
||||
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):
|
||||
test_case = unittest.TestCase()
|
||||
test_case.maxDiff = None
|
||||
test_case.assertIsNotNone(model)
|
||||
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)
|
||||
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)
|
||||
|
||||
@ -2,15 +2,36 @@
|
||||
|
||||
import json
|
||||
import unittest
|
||||
from typing import Any
|
||||
|
||||
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):
|
||||
test_case = unittest.TestCase()
|
||||
test_case.maxDiff = None
|
||||
test_case.assertIsNotNone(model)
|
||||
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)
|
||||
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)
|
||||
|
||||
@ -2,15 +2,36 @@
|
||||
|
||||
import json
|
||||
import unittest
|
||||
from typing import Any
|
||||
|
||||
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):
|
||||
test_case = unittest.TestCase()
|
||||
test_case.maxDiff = None
|
||||
test_case.assertIsNotNone(model)
|
||||
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)
|
||||
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)
|
||||
|
||||
@ -2,15 +2,36 @@
|
||||
|
||||
import json
|
||||
import unittest
|
||||
from typing import Any
|
||||
|
||||
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):
|
||||
test_case = unittest.TestCase()
|
||||
test_case.maxDiff = None
|
||||
test_case.assertIsNotNone(model)
|
||||
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)
|
||||
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)
|
||||
|
||||
@ -2,15 +2,36 @@
|
||||
|
||||
import json
|
||||
import unittest
|
||||
from typing import Any
|
||||
|
||||
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):
|
||||
test_case = unittest.TestCase()
|
||||
test_case.maxDiff = None
|
||||
test_case.assertIsNotNone(model)
|
||||
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)
|
||||
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)
|
||||
|
||||
@ -820,7 +820,7 @@ class TestEndpointAgentsApiIntegration(IntegrationTestBase):
|
||||
max = 5
|
||||
cursor = 'cursor_example'
|
||||
aid = '1234'
|
||||
include_deleted = false
|
||||
include_deleted = False
|
||||
response_body_json = """
|
||||
{
|
||||
"_links" : {
|
||||
@ -1261,7 +1261,7 @@ class TestEndpointAgentsApiIntegration(IntegrationTestBase):
|
||||
max = 5
|
||||
cursor = 'cursor_example'
|
||||
aid = '1234'
|
||||
include_deleted = false
|
||||
include_deleted = False
|
||||
error_body_json = """
|
||||
{
|
||||
"instance" : "instance",
|
||||
@ -1347,7 +1347,7 @@ class TestEndpointAgentsApiIntegration(IntegrationTestBase):
|
||||
max = 5
|
||||
cursor = 'cursor_example'
|
||||
aid = '1234'
|
||||
include_deleted = false
|
||||
include_deleted = False
|
||||
error_body_json = """
|
||||
{
|
||||
"error_description" : "Invalid access token",
|
||||
@ -1421,7 +1421,7 @@ class TestEndpointAgentsApiIntegration(IntegrationTestBase):
|
||||
max = 5
|
||||
cursor = 'cursor_example'
|
||||
aid = '1234'
|
||||
include_deleted = false
|
||||
include_deleted = False
|
||||
error_body_json = """
|
||||
{
|
||||
"instance" : "instance",
|
||||
@ -1498,7 +1498,7 @@ class TestEndpointAgentsApiIntegration(IntegrationTestBase):
|
||||
max = 5
|
||||
cursor = 'cursor_example'
|
||||
aid = '1234'
|
||||
include_deleted = false
|
||||
include_deleted = False
|
||||
error_body_json = """
|
||||
{
|
||||
"instance" : "instance",
|
||||
@ -1535,7 +1535,7 @@ class TestEndpointAgentsApiIntegration(IntegrationTestBase):
|
||||
"""Integration test for get_endpoint_agent success path"""
|
||||
agent_id = 'agent_id_example'
|
||||
aid = '1234'
|
||||
include_deleted = false
|
||||
include_deleted = False
|
||||
response_body_json = """
|
||||
{
|
||||
"npcapVersion" : "npcapVersion",
|
||||
@ -1736,7 +1736,7 @@ class TestEndpointAgentsApiIntegration(IntegrationTestBase):
|
||||
"""Integration test for get_endpoint_agent error path (HTTP 401)"""
|
||||
agent_id = 'agent_id_example'
|
||||
aid = '1234'
|
||||
include_deleted = false
|
||||
include_deleted = False
|
||||
error_body_json = """
|
||||
{
|
||||
"error_description" : "Invalid access token",
|
||||
@ -1764,7 +1764,7 @@ class TestEndpointAgentsApiIntegration(IntegrationTestBase):
|
||||
"""Integration test for get_endpoint_agent error path (HTTP 403)"""
|
||||
agent_id = 'agent_id_example'
|
||||
aid = '1234'
|
||||
include_deleted = false
|
||||
include_deleted = False
|
||||
error_body_json = """
|
||||
{
|
||||
"instance" : "instance",
|
||||
@ -1795,7 +1795,7 @@ class TestEndpointAgentsApiIntegration(IntegrationTestBase):
|
||||
"""Integration test for get_endpoint_agent error path (HTTP 404)"""
|
||||
agent_id = 'agent_id_example'
|
||||
aid = '1234'
|
||||
include_deleted = false
|
||||
include_deleted = False
|
||||
error_body_json = """
|
||||
{
|
||||
"instance" : "instance",
|
||||
@ -1826,7 +1826,7 @@ class TestEndpointAgentsApiIntegration(IntegrationTestBase):
|
||||
"""Integration test for get_endpoint_agent error path (HTTP 429)"""
|
||||
agent_id = 'agent_id_example'
|
||||
aid = '1234'
|
||||
include_deleted = false
|
||||
include_deleted = False
|
||||
error_body_json = """
|
||||
{
|
||||
"instance" : "instance",
|
||||
@ -1860,7 +1860,7 @@ class TestEndpointAgentsApiIntegration(IntegrationTestBase):
|
||||
max = 5
|
||||
cursor = 'cursor_example'
|
||||
aid = '1234'
|
||||
include_deleted = false
|
||||
include_deleted = False
|
||||
use_all_permitted_aids = False
|
||||
agent_name = 'agent_name_example'
|
||||
computer_name = 'computer_name_example'
|
||||
@ -2277,7 +2277,7 @@ class TestEndpointAgentsApiIntegration(IntegrationTestBase):
|
||||
max = 5
|
||||
cursor = 'cursor_example'
|
||||
aid = '1234'
|
||||
include_deleted = false
|
||||
include_deleted = False
|
||||
use_all_permitted_aids = False
|
||||
agent_name = 'agent_name_example'
|
||||
computer_name = 'computer_name_example'
|
||||
@ -2317,7 +2317,7 @@ class TestEndpointAgentsApiIntegration(IntegrationTestBase):
|
||||
max = 5
|
||||
cursor = 'cursor_example'
|
||||
aid = '1234'
|
||||
include_deleted = false
|
||||
include_deleted = False
|
||||
use_all_permitted_aids = False
|
||||
agent_name = 'agent_name_example'
|
||||
computer_name = 'computer_name_example'
|
||||
@ -2360,7 +2360,7 @@ class TestEndpointAgentsApiIntegration(IntegrationTestBase):
|
||||
max = 5
|
||||
cursor = 'cursor_example'
|
||||
aid = '1234'
|
||||
include_deleted = false
|
||||
include_deleted = False
|
||||
use_all_permitted_aids = False
|
||||
agent_name = 'agent_name_example'
|
||||
computer_name = 'computer_name_example'
|
||||
|
||||
@ -2,15 +2,36 @@
|
||||
|
||||
import json
|
||||
import unittest
|
||||
from typing import Any
|
||||
|
||||
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):
|
||||
test_case = unittest.TestCase()
|
||||
test_case.maxDiff = None
|
||||
test_case.assertIsNotNone(model)
|
||||
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)
|
||||
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)
|
||||
|
||||
@ -2,15 +2,36 @@
|
||||
|
||||
import json
|
||||
import unittest
|
||||
from typing import Any
|
||||
|
||||
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):
|
||||
test_case = unittest.TestCase()
|
||||
test_case.maxDiff = None
|
||||
test_case.assertIsNotNone(model)
|
||||
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)
|
||||
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)
|
||||
|
||||
@ -2,15 +2,36 @@
|
||||
|
||||
import json
|
||||
import unittest
|
||||
from typing import Any
|
||||
|
||||
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):
|
||||
test_case = unittest.TestCase()
|
||||
test_case.maxDiff = None
|
||||
test_case.assertIsNotNone(model)
|
||||
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)
|
||||
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)
|
||||
|
||||
@ -2,15 +2,36 @@
|
||||
|
||||
import json
|
||||
import unittest
|
||||
from typing import Any
|
||||
|
||||
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):
|
||||
test_case = unittest.TestCase()
|
||||
test_case.maxDiff = None
|
||||
test_case.assertIsNotNone(model)
|
||||
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)
|
||||
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)
|
||||
|
||||
@ -2,15 +2,36 @@
|
||||
|
||||
import json
|
||||
import unittest
|
||||
from typing import Any
|
||||
|
||||
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):
|
||||
test_case = unittest.TestCase()
|
||||
test_case.maxDiff = None
|
||||
test_case.assertIsNotNone(model)
|
||||
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)
|
||||
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)
|
||||
|
||||
@ -19,7 +19,7 @@ from importlib.metadata import version
|
||||
import thousandeyes_sdk.event_detection.models
|
||||
|
||||
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_extensions import Annotated
|
||||
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,
|
||||
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,
|
||||
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[
|
||||
None,
|
||||
Annotated[StrictFloat, Field(gt=0)],
|
||||
@ -379,6 +380,8 @@ class EventsApi:
|
||||
:type max: int
|
||||
:param cursor: (Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter.
|
||||
: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
|
||||
number provided, it will be total request
|
||||
timeout. It can also be a pair (tuple) of
|
||||
@ -403,7 +406,7 @@ class EventsApi:
|
||||
return PaginationIterable(
|
||||
self.get_events,
|
||||
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_auth=_request_auth,
|
||||
_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,
|
||||
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,
|
||||
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[
|
||||
None,
|
||||
Annotated[StrictFloat, Field(gt=0)],
|
||||
@ -450,6 +454,8 @@ class EventsApi:
|
||||
:type max: int
|
||||
:param cursor: (Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter.
|
||||
: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
|
||||
number provided, it will be total request
|
||||
timeout. It can also be a pair (tuple) of
|
||||
@ -479,6 +485,7 @@ class EventsApi:
|
||||
end_date=end_date,
|
||||
max=max,
|
||||
cursor=cursor,
|
||||
ongoing=ongoing,
|
||||
_request_auth=_request_auth,
|
||||
_content_type=_content_type,
|
||||
_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,
|
||||
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,
|
||||
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[
|
||||
None,
|
||||
Annotated[StrictFloat, Field(gt=0)],
|
||||
@ -545,6 +553,8 @@ class EventsApi:
|
||||
:type max: int
|
||||
:param cursor: (Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter.
|
||||
: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
|
||||
number provided, it will be total request
|
||||
timeout. It can also be a pair (tuple) of
|
||||
@ -574,6 +584,7 @@ class EventsApi:
|
||||
end_date=end_date,
|
||||
max=max,
|
||||
cursor=cursor,
|
||||
ongoing=ongoing,
|
||||
_request_auth=_request_auth,
|
||||
_content_type=_content_type,
|
||||
_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,
|
||||
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,
|
||||
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[
|
||||
None,
|
||||
Annotated[StrictFloat, Field(gt=0)],
|
||||
@ -640,6 +652,8 @@ class EventsApi:
|
||||
:type max: int
|
||||
:param cursor: (Optional) Opaque cursor used for pagination. Clients should use `next` value from `_links` instead of this parameter.
|
||||
: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
|
||||
number provided, it will be total request
|
||||
timeout. It can also be a pair (tuple) of
|
||||
@ -669,6 +683,7 @@ class EventsApi:
|
||||
end_date=end_date,
|
||||
max=max,
|
||||
cursor=cursor,
|
||||
ongoing=ongoing,
|
||||
_request_auth=_request_auth,
|
||||
_content_type=_content_type,
|
||||
_headers=_headers,
|
||||
@ -700,6 +715,7 @@ class EventsApi:
|
||||
end_date,
|
||||
max,
|
||||
cursor,
|
||||
ongoing,
|
||||
_request_auth,
|
||||
_content_type,
|
||||
_headers,
|
||||
@ -762,6 +778,10 @@ class EventsApi:
|
||||
|
||||
_query_params.append(('cursor', cursor))
|
||||
|
||||
if ongoing is not None:
|
||||
|
||||
_query_params.append(('ongoing', ongoing))
|
||||
|
||||
# process the header parameters
|
||||
# process the form parameters
|
||||
# process the body parameter
|
||||
|
||||
@ -353,7 +353,7 @@ class TestEventsApiIntegration(IntegrationTestBase):
|
||||
end_date = '2022-07-18T22:00:54Z'
|
||||
max = 5
|
||||
cursor = 'cursor_example'
|
||||
ongoing = true
|
||||
ongoing = True
|
||||
response_body_json = """
|
||||
{
|
||||
"endDate" : "2022-07-18T22:00:54Z",
|
||||
@ -482,7 +482,7 @@ class TestEventsApiIntegration(IntegrationTestBase):
|
||||
end_date = '2022-07-18T22:00:54Z'
|
||||
max = 5
|
||||
cursor = 'cursor_example'
|
||||
ongoing = true
|
||||
ongoing = True
|
||||
error_body_json = """
|
||||
{
|
||||
"instance" : "instance",
|
||||
@ -534,7 +534,7 @@ class TestEventsApiIntegration(IntegrationTestBase):
|
||||
end_date = '2022-07-18T22:00:54Z'
|
||||
max = 5
|
||||
cursor = 'cursor_example'
|
||||
ongoing = true
|
||||
ongoing = True
|
||||
error_body_json = """
|
||||
{
|
||||
"error_description" : "Invalid access token",
|
||||
@ -574,7 +574,7 @@ class TestEventsApiIntegration(IntegrationTestBase):
|
||||
end_date = '2022-07-18T22:00:54Z'
|
||||
max = 5
|
||||
cursor = 'cursor_example'
|
||||
ongoing = true
|
||||
ongoing = True
|
||||
error_body_json = """
|
||||
{
|
||||
"instance" : "instance",
|
||||
@ -617,7 +617,7 @@ class TestEventsApiIntegration(IntegrationTestBase):
|
||||
end_date = '2022-07-18T22:00:54Z'
|
||||
max = 5
|
||||
cursor = 'cursor_example'
|
||||
ongoing = true
|
||||
ongoing = True
|
||||
error_body_json = """
|
||||
{
|
||||
"instance" : "instance",
|
||||
@ -660,7 +660,7 @@ class TestEventsApiIntegration(IntegrationTestBase):
|
||||
end_date = '2022-07-18T22:00:54Z'
|
||||
max = 5
|
||||
cursor = 'cursor_example'
|
||||
ongoing = true
|
||||
ongoing = True
|
||||
error_body_json = """
|
||||
{
|
||||
"instance" : "instance",
|
||||
@ -703,7 +703,7 @@ class TestEventsApiIntegration(IntegrationTestBase):
|
||||
end_date = '2022-07-18T22:00:54Z'
|
||||
max = 5
|
||||
cursor = 'cursor_example'
|
||||
ongoing = true
|
||||
ongoing = True
|
||||
error_body_json = """
|
||||
{
|
||||
"instance" : "instance",
|
||||
@ -746,7 +746,7 @@ class TestEventsApiIntegration(IntegrationTestBase):
|
||||
end_date = '2022-07-18T22:00:54Z'
|
||||
max = 5
|
||||
cursor = 'cursor_example'
|
||||
ongoing = true
|
||||
ongoing = True
|
||||
error_body_json = """
|
||||
{
|
||||
"instance" : "instance",
|
||||
|
||||
@ -2,15 +2,36 @@
|
||||
|
||||
import json
|
||||
import unittest
|
||||
from typing import Any
|
||||
|
||||
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):
|
||||
test_case = unittest.TestCase()
|
||||
test_case.maxDiff = None
|
||||
test_case.assertIsNotNone(model)
|
||||
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)
|
||||
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)
|
||||
|
||||
@ -2,15 +2,36 @@
|
||||
|
||||
import json
|
||||
import unittest
|
||||
from typing import Any
|
||||
|
||||
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):
|
||||
test_case = unittest.TestCase()
|
||||
test_case.maxDiff = None
|
||||
test_case.assertIsNotNone(model)
|
||||
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)
|
||||
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)
|
||||
|
||||
@ -2,15 +2,36 @@
|
||||
|
||||
import json
|
||||
import unittest
|
||||
from typing import Any
|
||||
|
||||
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):
|
||||
test_case = unittest.TestCase()
|
||||
test_case.maxDiff = None
|
||||
test_case.assertIsNotNone(model)
|
||||
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)
|
||||
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)
|
||||
|
||||
@ -2,15 +2,36 @@
|
||||
|
||||
import json
|
||||
import unittest
|
||||
from typing import Any
|
||||
|
||||
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):
|
||||
test_case = unittest.TestCase()
|
||||
test_case.maxDiff = None
|
||||
test_case.assertIsNotNone(model)
|
||||
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)
|
||||
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)
|
||||
|
||||
@ -2,15 +2,36 @@
|
||||
|
||||
import json
|
||||
import unittest
|
||||
from typing import Any
|
||||
|
||||
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):
|
||||
test_case = unittest.TestCase()
|
||||
test_case.maxDiff = None
|
||||
test_case.assertIsNotNone(model)
|
||||
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)
|
||||
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)
|
||||
|
||||
@ -2,15 +2,36 @@
|
||||
|
||||
import json
|
||||
import unittest
|
||||
from typing import Any
|
||||
|
||||
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):
|
||||
test_case = unittest.TestCase()
|
||||
test_case.maxDiff = None
|
||||
test_case.assertIsNotNone(model)
|
||||
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)
|
||||
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)
|
||||
|
||||
@ -2,15 +2,36 @@
|
||||
|
||||
import json
|
||||
import unittest
|
||||
from typing import Any
|
||||
|
||||
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):
|
||||
test_case = unittest.TestCase()
|
||||
test_case.maxDiff = None
|
||||
test_case.assertIsNotNone(model)
|
||||
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)
|
||||
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)
|
||||
|
||||
@ -2,15 +2,36 @@
|
||||
|
||||
import json
|
||||
import unittest
|
||||
from typing import Any
|
||||
|
||||
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):
|
||||
test_case = unittest.TestCase()
|
||||
test_case.maxDiff = None
|
||||
test_case.assertIsNotNone(model)
|
||||
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)
|
||||
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)
|
||||
|
||||
@ -2,15 +2,36 @@
|
||||
|
||||
import json
|
||||
import unittest
|
||||
from typing import Any
|
||||
|
||||
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):
|
||||
test_case = unittest.TestCase()
|
||||
test_case.maxDiff = None
|
||||
test_case.assertIsNotNone(model)
|
||||
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)
|
||||
test_case.assertEqual(sorted_loaded_json, sorted_constructed_json)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user