Skip to content

Commit 644cba0

Browse files
committed
test: cover PATCH /voice_out_trunks/:id emergency_dids + emergency_enable_all
Three wire-level specs for the 2026-04-16 emergency trunk attributes: * toggle emergency_enable_all (boolean attribute) * replace emergency_dids to-many with a specific two-DID set * clear emergency_dids with data: []
1 parent bf9efc8 commit 644cba0

4 files changed

Lines changed: 132 additions & 0 deletions

File tree

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
interactions:
2+
- request:
3+
body: '{"data":{"id":"01234567-89ab-cdef-0123-456789abcdef","type":"voice_out_trunks","attributes":{},"relationships":{"emergency_dids":{"data":[]}}}}'
4+
headers:
5+
Accept:
6+
- application/vnd.api+json
7+
Api-Key:
8+
- test-api-key
9+
Content-Type:
10+
- application/vnd.api+json
11+
method: PATCH
12+
uri: https://sandbox-api.didww.com/v3/voice_out_trunks/01234567-89ab-cdef-0123-456789abcdef
13+
response:
14+
body:
15+
string: '{"data":{"id":"01234567-89ab-cdef-0123-456789abcdef","type":"voice_out_trunks","attributes":{"name":"Trunk with emergency DIDs","on_cli_mismatch_action":"replace_cli","capacity_limit":200,"created_at":"2026-01-15T10:00:00.000Z","allow_any_did_as_cli":false,"status":"active","threshold_reached":false,"threshold_amount":"100.0","default_dst_action":"allow_all","dst_prefixes":["1"],"media_encryption_mode":"disabled","callback_url":null,"force_symmetric_rtp":false,"allowed_rtp_ips":[],"emergency_enable_all":false,"rtp_timeout":30,"authentication_method":{"type":"credentials_and_ip","attributes":{"allowed_sip_ips":["10.0.0.1/32"],"tech_prefix":"","username":"user1","password":"pass1"}}},"relationships":{"emergency_dids":{"links":{"self":"https://sandbox-api.didww.com/v3/voice_out_trunks/01234567-89ab-cdef-0123-456789abcdef/relationships/emergency_dids","related":"https://sandbox-api.didww.com/v3/voice_out_trunks/01234567-89ab-cdef-0123-456789abcdef/emergency_dids"}}}},"meta":{"api_version":"2026-04-16"}}'
16+
headers:
17+
Content-Type:
18+
- application/vnd.api+json
19+
status:
20+
code: 200
21+
message: OK
22+
version: 1
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
interactions:
2+
- request:
3+
body: '{"data":{"id":"01234567-89ab-cdef-0123-456789abcdef","type":"voice_out_trunks","attributes":{},"relationships":{"emergency_dids":{"data":[{"type":"dids","id":"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"},{"type":"dids","id":"bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"}]}}}}'
4+
headers:
5+
Accept:
6+
- application/vnd.api+json
7+
Api-Key:
8+
- test-api-key
9+
Content-Type:
10+
- application/vnd.api+json
11+
method: PATCH
12+
uri: https://sandbox-api.didww.com/v3/voice_out_trunks/01234567-89ab-cdef-0123-456789abcdef
13+
response:
14+
body:
15+
string: '{"data":{"id":"01234567-89ab-cdef-0123-456789abcdef","type":"voice_out_trunks","attributes":{"name":"Trunk with emergency DIDs","on_cli_mismatch_action":"replace_cli","capacity_limit":200,"created_at":"2026-01-15T10:00:00.000Z","allow_any_did_as_cli":false,"status":"active","threshold_reached":false,"threshold_amount":"100.0","default_dst_action":"allow_all","dst_prefixes":["1"],"media_encryption_mode":"disabled","callback_url":null,"force_symmetric_rtp":false,"allowed_rtp_ips":[],"emergency_enable_all":false,"rtp_timeout":30,"authentication_method":{"type":"credentials_and_ip","attributes":{"allowed_sip_ips":["10.0.0.1/32"],"tech_prefix":"","username":"user1","password":"pass1"}}},"relationships":{"emergency_dids":{"links":{"self":"https://sandbox-api.didww.com/v3/voice_out_trunks/01234567-89ab-cdef-0123-456789abcdef/relationships/emergency_dids","related":"https://sandbox-api.didww.com/v3/voice_out_trunks/01234567-89ab-cdef-0123-456789abcdef/emergency_dids"}}}},"meta":{"api_version":"2026-04-16"}}'
16+
headers:
17+
Content-Type:
18+
- application/vnd.api+json
19+
status:
20+
code: 200
21+
message: OK
22+
version: 1
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
interactions:
2+
- request:
3+
body: '{"data":{"id":"01234567-89ab-cdef-0123-456789abcdef","type":"voice_out_trunks","attributes":{"emergency_enable_all":true}}}'
4+
headers:
5+
Accept:
6+
- application/vnd.api+json
7+
Api-Key:
8+
- test-api-key
9+
Content-Type:
10+
- application/vnd.api+json
11+
method: PATCH
12+
uri: https://sandbox-api.didww.com/v3/voice_out_trunks/01234567-89ab-cdef-0123-456789abcdef
13+
response:
14+
body:
15+
string: '{"data":{"id":"01234567-89ab-cdef-0123-456789abcdef","type":"voice_out_trunks","attributes":{"name":"Trunk with emergency","on_cli_mismatch_action":"replace_cli","capacity_limit":200,"created_at":"2026-01-15T10:00:00.000Z","allow_any_did_as_cli":false,"status":"active","threshold_reached":false,"threshold_amount":"100.0","default_dst_action":"allow_all","dst_prefixes":["1"],"media_encryption_mode":"disabled","callback_url":null,"force_symmetric_rtp":false,"allowed_rtp_ips":[],"emergency_enable_all":true,"rtp_timeout":30,"authentication_method":{"type":"credentials_and_ip","attributes":{"allowed_sip_ips":["10.0.0.1/32"],"tech_prefix":"","username":"user1","password":"pass1"}}},"relationships":{"default_did":{"links":{"self":"https://sandbox-api.didww.com/v3/voice_out_trunks/01234567-89ab-cdef-0123-456789abcdef/relationships/default_did","related":"https://sandbox-api.didww.com/v3/voice_out_trunks/01234567-89ab-cdef-0123-456789abcdef/default_did"}}}},"meta":{"api_version":"2026-04-16"}}'
16+
headers:
17+
Content-Type:
18+
- application/vnd.api+json
19+
status:
20+
code: 200
21+
message: OK
22+
version: 1

tests/resources/test_voice_out_trunk.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,72 @@ def test_emergency_dids_relationship(self):
109109
assert hasattr(trunk, 'emergency_dids')
110110

111111

112+
class TestVoiceOutTrunkEmergencyPatch:
113+
@my_vcr.use_cassette("voice_out_trunks/update_emergency_enable_all.yaml")
114+
def test_toggle_emergency_enable_all(self, client):
115+
trunk = VoiceOutTrunk.build("01234567-89ab-cdef-0123-456789abcdef")
116+
trunk.emergency_enable_all = True
117+
response = client.voice_out_trunks().update(trunk)
118+
updated = response.data
119+
assert updated.id == "01234567-89ab-cdef-0123-456789abcdef"
120+
assert updated.emergency_enable_all is True
121+
122+
def test_replace_emergency_dids_request_body(self):
123+
"""PATCH must send emergency_dids as a has-many relationship."""
124+
trunk = VoiceOutTrunk.build("01234567-89ab-cdef-0123-456789abcdef")
125+
trunk.emergency_dids = [
126+
Did.build("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"),
127+
Did.build("bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"),
128+
]
129+
doc = trunk.to_jsonapi(include_id=True, dirty_only=True)
130+
assert doc == {
131+
"id": "01234567-89ab-cdef-0123-456789abcdef",
132+
"type": "voice_out_trunks",
133+
"attributes": {},
134+
"relationships": {
135+
"emergency_dids": {
136+
"data": [
137+
{"type": "dids", "id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"},
138+
{"type": "dids", "id": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"},
139+
]
140+
}
141+
},
142+
}
143+
144+
@my_vcr.use_cassette("voice_out_trunks/update_emergency_dids.yaml")
145+
def test_replace_emergency_dids(self, client):
146+
trunk = VoiceOutTrunk.build("01234567-89ab-cdef-0123-456789abcdef")
147+
trunk.emergency_dids = [
148+
Did.build("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"),
149+
Did.build("bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"),
150+
]
151+
response = client.voice_out_trunks().update(trunk)
152+
updated = response.data
153+
assert updated.id == "01234567-89ab-cdef-0123-456789abcdef"
154+
155+
def test_clear_emergency_dids_request_body(self):
156+
"""PATCH with empty list must send emergency_dids data as []."""
157+
trunk = VoiceOutTrunk.build("01234567-89ab-cdef-0123-456789abcdef")
158+
trunk.emergency_dids = []
159+
doc = trunk.to_jsonapi(include_id=True, dirty_only=True)
160+
assert doc == {
161+
"id": "01234567-89ab-cdef-0123-456789abcdef",
162+
"type": "voice_out_trunks",
163+
"attributes": {},
164+
"relationships": {
165+
"emergency_dids": {"data": []}
166+
},
167+
}
168+
169+
@my_vcr.use_cassette("voice_out_trunks/update_clear_emergency_dids.yaml")
170+
def test_clear_emergency_dids(self, client):
171+
trunk = VoiceOutTrunk.build("01234567-89ab-cdef-0123-456789abcdef")
172+
trunk.emergency_dids = []
173+
response = client.voice_out_trunks().update(trunk)
174+
updated = response.data
175+
assert updated.id == "01234567-89ab-cdef-0123-456789abcdef"
176+
177+
112178
class TestAuthenticationMethodPolymorphism:
113179
def test_from_jsonapi_ip_only(self):
114180
data = {"type": "ip_only", "attributes": {"allowed_sip_ips": ["1.2.3.4/32"], "tech_prefix": "123"}}

0 commit comments

Comments
 (0)