Skip to content

Commit baac7ae

Browse files
smoghe-bwclaude
andcommitted
Address PR review feedback for BRTC endpoints tests
- Smoke tests: Replace has_properties with individual assertions, remove hamcrest dependency, add assertions for links/data/errors fields and all properties on response objects, remove AI-generated comments, reuse endpoint ID from create test in delete test - Unit API tests: Remove pagination test, required-only props test, and error handling test; add assertions for tag, devices, and other fields on mocked response data - Unit model tests: Add missing test files for ErrorResponse, Page, SipConnectionMetadata, and SipCredentials models Generated from Claude9 with Claude Code Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent af7e0c9 commit baac7ae

6 files changed

Lines changed: 287 additions & 72 deletions

File tree

test/smoke/test_endpoints_api.py

Lines changed: 46 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
import unittest
55
from datetime import datetime
66

7-
from hamcrest import assert_that, has_properties, instance_of, equal_to, greater_than
8-
97
from bandwidth import ApiClient, ApiResponse, Configuration
108
from bandwidth.api.endpoints_api import EndpointsApi
119
from bandwidth.models.create_web_rtc_connection_request import CreateWebRtcConnectionRequest
@@ -57,22 +55,21 @@ def createEndpoint(self):
5755
create_request
5856
)
5957

60-
assert_that(response.status_code, equal_to(201))
61-
assert_that(response.data, instance_of(CreateEndpointResponse))
62-
assert_that(response.data.links, instance_of(list))
63-
assert_that(len(response.data.links), equal_to(0))
64-
assert_that(response.data.errors, instance_of(list))
65-
assert_that(response.data.data, instance_of(CreateEndpointResponseData))
66-
assert_that(response.data.data, has_properties(
67-
'endpoint_id', instance_of(str),
68-
'type', EndpointTypeEnum.WEBRTC,
69-
'status', instance_of(EndpointStatusEnum),
70-
'token', instance_of(str),
71-
'creation_timestamp', instance_of(datetime),
72-
'expiration_timestamp', instance_of(datetime),
73-
'tag', equal_to("python-sdk-test-endpoint"),
74-
'devices', instance_of(list)
75-
))
58+
assert response.status_code == 201
59+
assert isinstance(response.data, CreateEndpointResponse)
60+
assert isinstance(response.data.links, list)
61+
assert len(response.data.links) == 0
62+
assert isinstance(response.data.errors, list)
63+
assert len(response.data.errors) == 0
64+
assert isinstance(response.data.data, CreateEndpointResponseData)
65+
assert isinstance(response.data.data.endpoint_id, str)
66+
assert response.data.data.type == EndpointTypeEnum.WEBRTC
67+
assert isinstance(response.data.data.status, EndpointStatusEnum)
68+
assert isinstance(response.data.data.token, str)
69+
assert isinstance(response.data.data.creation_timestamp, datetime)
70+
assert isinstance(response.data.data.expiration_timestamp, datetime)
71+
assert response.data.data.tag == "python-sdk-test-endpoint"
72+
assert isinstance(response.data.data.devices, list)
7673

7774
self.__class__.endpoint_id = response.data.data.endpoint_id
7875

@@ -83,68 +80,54 @@ def listEndpoints(self):
8380
limit=10
8481
)
8582

86-
assert_that(response.status_code, equal_to(200))
87-
assert_that(response.data, instance_of(ListEndpointsResponse))
88-
assert_that(response.data.links, instance_of(list))
89-
assert_that(len(response.data.links), equal_to(0))
90-
assert_that(response.data.errors, instance_of(list))
91-
assert_that(response.data.data, instance_of(list))
92-
assert_that(len(response.data.data), greater_than(0))
83+
assert response.status_code == 200
84+
assert isinstance(response.data, ListEndpointsResponse)
85+
assert isinstance(response.data.links, list)
86+
assert len(response.data.links) == 0
87+
assert isinstance(response.data.errors, list)
88+
assert len(response.data.errors) == 0
89+
assert isinstance(response.data.data, list)
90+
assert len(response.data.data) > 0
9391

9492
listed_ids = [ep.endpoint_id for ep in response.data.data]
95-
assert_that(self.endpoint_id in listed_ids, equal_to(True))
93+
assert self.endpoint_id in listed_ids
9694

9795
endpoint = response.data.data[0]
98-
assert_that(endpoint, instance_of(Endpoints))
99-
assert_that(endpoint, has_properties(
100-
'endpoint_id', instance_of(str),
101-
'type', instance_of(EndpointTypeEnum),
102-
'status', instance_of(EndpointStatusEnum),
103-
'creation_timestamp', instance_of(datetime),
104-
'expiration_timestamp', instance_of(datetime)
105-
))
96+
assert isinstance(endpoint, Endpoints)
97+
assert isinstance(endpoint.endpoint_id, str)
98+
assert isinstance(endpoint.type, EndpointTypeEnum)
99+
assert isinstance(endpoint.status, EndpointStatusEnum)
100+
assert isinstance(endpoint.creation_timestamp, datetime)
101+
assert isinstance(endpoint.expiration_timestamp, datetime)
106102

107103
def getEndpoint(self):
108104
response: ApiResponse = self.endpoints_api_instance.get_endpoint_with_http_info(
109105
self.account_id,
110106
self.endpoint_id
111107
)
112108

113-
assert_that(response.status_code, equal_to(200))
114-
assert_that(response.data, instance_of(EndpointResponse))
115-
assert_that(response.data.links, instance_of(list))
116-
assert_that(len(response.data.links), equal_to(0))
117-
assert_that(response.data.errors, instance_of(list))
118-
assert_that(response.data.data, instance_of(Endpoint))
119-
assert_that(response.data.data, has_properties(
120-
'endpoint_id', equal_to(self.endpoint_id),
121-
'type', EndpointTypeEnum.WEBRTC,
122-
'status', instance_of(EndpointStatusEnum),
123-
'creation_timestamp', instance_of(datetime),
124-
'expiration_timestamp', instance_of(datetime),
125-
'tag', equal_to("python-sdk-test-endpoint"),
126-
'devices', instance_of(list)
127-
))
128-
129-
# Note: This endpoint is currently not working in the API, so this test is commented out for now. Once the API issue is resolved, this test should be uncommented and verified.
130-
# def updateEndpointBxml(self):
131-
# bxml = '<?xml version="1.0" encoding="UTF-8"?><Bxml><StartStream name="test_stream"/></Bxml>'
132-
# response: ApiResponse = self.endpoints_api_instance.update_endpoint_bxml_with_http_info(
133-
# self.account_id,
134-
# self.endpoint_id,
135-
# bxml
136-
# )
137-
#
138-
# assert_that(response.status_code, equal_to(204))
139-
# ...
109+
assert response.status_code == 200
110+
assert isinstance(response.data, EndpointResponse)
111+
assert isinstance(response.data.links, list)
112+
assert len(response.data.links) == 0
113+
assert isinstance(response.data.errors, list)
114+
assert len(response.data.errors) == 0
115+
assert isinstance(response.data.data, Endpoint)
116+
assert response.data.data.endpoint_id == self.endpoint_id
117+
assert response.data.data.type == EndpointTypeEnum.WEBRTC
118+
assert isinstance(response.data.data.status, EndpointStatusEnum)
119+
assert isinstance(response.data.data.creation_timestamp, datetime)
120+
assert isinstance(response.data.data.expiration_timestamp, datetime)
121+
assert response.data.data.tag == "python-sdk-test-endpoint"
122+
assert isinstance(response.data.data.devices, list)
140123

141124
def deleteEndpoint(self):
142125
response: ApiResponse = self.endpoints_api_instance.delete_endpoint_with_http_info(
143126
self.account_id,
144127
self.endpoint_id
145128
)
146129

147-
assert_that(response.status_code, equal_to(204))
130+
assert response.status_code == 204
148131

149132
def _steps(self):
150133
call_order = ['createEndpoint', 'listEndpoints', 'getEndpoint', 'deleteEndpoint']
@@ -156,9 +139,7 @@ def test_steps(self):
156139
step()
157140

158141
def assertApiException(self, context, expected_status_code: int):
159-
assert_that(context.exception, has_properties(
160-
'status', expected_status_code,
161-
))
142+
assert context.exception.status == expected_status_code
162143

163144
def test_create_endpoint_unauthorized(self):
164145
create_request = CreateWebRtcConnectionRequest(

test/unit/api/test_endpoints_api.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
from bandwidth.models.endpoints import Endpoints
2929
from bandwidth.models.list_endpoints_response import ListEndpointsResponse
3030
from bandwidth.models.link import Link
31-
from bandwidth.models.page import Page
3231
from bandwidth.models.endpoint_type_enum import EndpointTypeEnum
3332
from bandwidth.models.endpoint_direction_enum import EndpointDirectionEnum
3433
from bandwidth.models.endpoint_status_enum import EndpointStatusEnum
@@ -85,6 +84,8 @@ def test_create_endpoint(self) -> None:
8584
assert_that(response.data.data.creation_timestamp, instance_of(datetime))
8685
assert_that(response.data.data.expiration_timestamp, instance_of(datetime))
8786
assert_that(response.data.data.token, instance_of(str))
87+
assert_that(response.data.data.tag, instance_of(str))
88+
assert_that(response.data.data.devices, instance_of(list))
8889

8990
assert_that(response.data.errors, instance_of(list))
9091

@@ -125,6 +126,8 @@ def test_get_endpoint(self) -> None:
125126
assert_that(response.data.data.status, is_in(EndpointStatusEnum))
126127
assert_that(response.data.data.creation_timestamp, instance_of(datetime))
127128
assert_that(response.data.data.expiration_timestamp, instance_of(datetime))
129+
assert_that(response.data.data.tag, instance_of(str))
130+
assert_that(response.data.data.devices, instance_of(list))
128131

129132
assert_that(response.data.errors, instance_of(list))
130133

@@ -155,14 +158,8 @@ def test_list_endpoints(self) -> None:
155158
assert_that(response.data.data[0].creation_timestamp, instance_of(datetime))
156159
assert_that(response.data.data[0].expiration_timestamp, instance_of(datetime))
157160

158-
if response.data.page:
159-
assert_that(response.data.page, instance_of(Page))
160-
assert_that(response.data.page.page_size, greater_than_or_equal_to(0))
161-
162161
assert_that(response.data.errors, instance_of(list))
163162

164163

165-
166-
167164
if __name__ == '__main__':
168165
unittest.main()
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# coding: utf-8
2+
3+
"""
4+
Bandwidth
5+
6+
Bandwidth's Communication APIs
7+
8+
The version of the OpenAPI document: 1.0.0
9+
Contact: letstalk@bandwidth.com
10+
Generated by OpenAPI Generator (https://openapi-generator.tech)
11+
12+
Do not edit the class manually.
13+
""" # noqa: E501
14+
15+
16+
import unittest
17+
18+
from bandwidth.models.error_response import ErrorResponse
19+
from bandwidth.models.error import Error
20+
from bandwidth.models.link import Link
21+
22+
class TestErrorResponse(unittest.TestCase):
23+
"""ErrorResponse unit test stubs"""
24+
25+
def setUp(self):
26+
pass
27+
28+
def tearDown(self):
29+
pass
30+
31+
def make_instance(self, include_optional) -> ErrorResponse:
32+
"""Test ErrorResponse
33+
include_optional is a boolean, when False only required
34+
params are included, when True both required and
35+
optional params are included """
36+
return ErrorResponse(
37+
links=[
38+
Link(href='https://api.bandwidth.com/errors', rel='self')
39+
],
40+
data={'key': 'value'},
41+
errors=[
42+
Error(
43+
code=400,
44+
description='Bad Request'
45+
)
46+
]
47+
)
48+
49+
def testErrorResponse(self):
50+
"""Test ErrorResponse"""
51+
instance = self.make_instance(True)
52+
assert instance is not None
53+
assert isinstance(instance, ErrorResponse)
54+
assert isinstance(instance.links, list)
55+
assert len(instance.links) == 1
56+
assert isinstance(instance.links[0], Link)
57+
assert instance.links[0].href == 'https://api.bandwidth.com/errors'
58+
assert instance.links[0].rel == 'self'
59+
assert isinstance(instance.data, dict)
60+
assert instance.data['key'] == 'value'
61+
assert isinstance(instance.errors, list)
62+
assert len(instance.errors) == 1
63+
assert isinstance(instance.errors[0], Error)
64+
assert instance.errors[0].code == 400
65+
assert instance.errors[0].description == 'Bad Request'
66+
67+
if __name__ == '__main__':
68+
unittest.main()

test/unit/models/test_page.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# coding: utf-8
2+
3+
"""
4+
Bandwidth
5+
6+
Bandwidth's Communication APIs
7+
8+
The version of the OpenAPI document: 1.0.0
9+
Contact: letstalk@bandwidth.com
10+
Generated by OpenAPI Generator (https://openapi-generator.tech)
11+
12+
Do not edit the class manually.
13+
""" # noqa: E501
14+
15+
16+
import unittest
17+
18+
from bandwidth.models.page import Page
19+
20+
class TestPage(unittest.TestCase):
21+
"""Page unit test stubs"""
22+
23+
def setUp(self):
24+
pass
25+
26+
def tearDown(self):
27+
pass
28+
29+
def make_instance(self, include_optional) -> Page:
30+
"""Test Page
31+
include_optional is a boolean, when False only required
32+
params are included, when True both required and
33+
optional params are included """
34+
if include_optional:
35+
return Page(
36+
page_size=10,
37+
total_elements=100,
38+
total_pages=10,
39+
page_number=1
40+
)
41+
else:
42+
return Page(
43+
page_size=10
44+
)
45+
46+
def testPage(self):
47+
"""Test Page"""
48+
instance = self.make_instance(True)
49+
assert instance is not None
50+
assert isinstance(instance, Page)
51+
assert instance.page_size == 10
52+
assert instance.total_elements == 100
53+
assert instance.total_pages == 10
54+
assert instance.page_number == 1
55+
56+
if __name__ == '__main__':
57+
unittest.main()
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# coding: utf-8
2+
3+
"""
4+
Bandwidth
5+
6+
Bandwidth's Communication APIs
7+
8+
The version of the OpenAPI document: 1.0.0
9+
Contact: letstalk@bandwidth.com
10+
Generated by OpenAPI Generator (https://openapi-generator.tech)
11+
12+
Do not edit the class manually.
13+
""" # noqa: E501
14+
15+
16+
import unittest
17+
18+
from bandwidth.models.sip_connection_metadata import SipConnectionMetadata
19+
from bandwidth.models.sip_credentials import SipCredentials
20+
21+
class TestSipConnectionMetadata(unittest.TestCase):
22+
"""SipConnectionMetadata unit test stubs"""
23+
24+
def setUp(self):
25+
pass
26+
27+
def tearDown(self):
28+
pass
29+
30+
def make_instance(self, include_optional) -> SipConnectionMetadata:
31+
"""Test SipConnectionMetadata
32+
include_optional is a boolean, when False only required
33+
params are included, when True both required and
34+
optional params are included """
35+
if include_optional:
36+
return SipConnectionMetadata(
37+
ip_address='192.168.1.1',
38+
port=5060,
39+
credentials=SipCredentials(
40+
username='sip_user',
41+
password='sip_password'
42+
),
43+
uui_header='test-uui-header'
44+
)
45+
else:
46+
return SipConnectionMetadata()
47+
48+
def testSipConnectionMetadata(self):
49+
"""Test SipConnectionMetadata"""
50+
instance = self.make_instance(True)
51+
assert instance is not None
52+
assert isinstance(instance, SipConnectionMetadata)
53+
assert instance.ip_address == '192.168.1.1'
54+
assert instance.port == 5060
55+
assert isinstance(instance.credentials, SipCredentials)
56+
assert instance.credentials.username == 'sip_user'
57+
assert instance.credentials.password == 'sip_password'
58+
assert instance.uui_header == 'test-uui-header'
59+
60+
if __name__ == '__main__':
61+
unittest.main()

0 commit comments

Comments
 (0)