Skip to content

Commit 5e2ff63

Browse files
committed
test run
1 parent 306691e commit 5e2ff63

2 files changed

Lines changed: 459 additions & 0 deletions

File tree

tests/cluster/TEST_RUN_9_11_0.md

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
# twilio-python 9.11.0 — Integration Test Run Report
2+
3+
## Summary
4+
5+
| | |
6+
|---|---|
7+
| **Package** | `twilio==9.11.0` (PyPI) |
8+
| **Test file** | `tests/cluster/test_9_11_0.py` |
9+
| **Run date** | 2026-08-11 |
10+
| **Result** | ✅ 17 passed, 0 failed, 0 skipped |
11+
| **Duration** | 16.10s |
12+
| **Python** | 3.13.9 |
13+
| **pytest** | 9.1.1 |
14+
15+
## Package Verification
16+
17+
The tests were executed against the **published PyPI package**, not the local source tree.
18+
19+
```
20+
pip install twilio==9.11.0
21+
22+
INSTALLER : pip
23+
Location : /tmp/twilio-9110-test/lib/python3.13/site-packages
24+
Interpreter: /tmp/twilio-9110-test/bin/python3 (isolated venv)
25+
```
26+
27+
Tests were run from outside the repository root (`cd /tmp`) to ensure the local
28+
source directory was not prepended to `sys.path` and could not shadow the
29+
installed package.
30+
31+
## Spec References
32+
33+
| PR | Repository | Description |
34+
|----|-----------|-------------|
35+
| [#150](https://github.com/twilio/twilio-oai/pull/150) | twilio-oai | OAI spec changes regenerated at `f443c9d` / `89762bc` |
36+
| [#951](https://github.com/twilio/twilio-python/pull/951) | twilio-python | Generated SDK changes — Release 9.11.0 |
37+
38+
## Test Results
39+
40+
```
41+
PASSED test_accounts_suppress_email_notification_on_auth_token_promotion
42+
PASSED test_accounts_suppress_email_notification_on_secondary_auth_token
43+
PASSED test_conversations_v2_configurations_list
44+
PASSED test_conversations_v2_conversations_list
45+
PASSED test_insights_v3_metadata_fetch
46+
PASSED test_insights_v3_query_create
47+
PASSED test_intelligence_v3_conversations_list
48+
PASSED test_intelligence_v3_operators_list
49+
PASSED test_knowledge_v2_knowledge_bases_list
50+
PASSED test_memory_v1_store_lifecycle
51+
PASSED test_memory_v1_stores_list
52+
PASSED test_routes_v3_phone_number_fetch
53+
PASSED test_twiml_connect_no_assistant_noun
54+
PASSED test_twiml_dial_passports_attribute
55+
PASSED test_voice_v2_account_default_configuration_recording_fetch
56+
PASSED test_voice_v2_recording_configuration_fetch
57+
PASSED test_voice_v2_transcription_configuration_fetch
58+
59+
17 passed in 16.10s
60+
```
61+
62+
## Coverage by Change Area
63+
64+
### TwiML
65+
| Test | What it validates |
66+
|------|------------------|
67+
| `test_twiml_dial_passports_attribute` | New `passports` attribute on `<Dial>` renders correctly for SHAKEN/STIR passport passthrough |
68+
| `test_twiml_connect_no_assistant_noun` | `<Assistant>` noun removed from `<Connect>` verb (AI Assistants deprecation breaking change) |
69+
70+
### Accounts
71+
| Test | What it validates |
72+
|------|------------------|
73+
| `test_accounts_suppress_email_notification_on_secondary_auth_token` | `suppress_email_notification` parameter present on `SecondaryAuthToken.create()` and `.delete()` |
74+
| `test_accounts_suppress_email_notification_on_auth_token_promotion` | `suppress_email_notification` parameter present on `AuthTokenPromotion.update()` |
75+
76+
> Auth token rotation tests are signature-only (no live API call) to avoid destructive side effects on the production account.
77+
78+
### Voice v2 (new module)
79+
| Test | What it validates |
80+
|------|------------------|
81+
| `test_voice_v2_recording_configuration_fetch` | `voice.v2.recording(id).fetch()` routes correctly to `/Configurations/Recording/{id}` |
82+
| `test_voice_v2_transcription_configuration_fetch` | `voice.v2.transcription(id).fetch()` routes correctly to `/Configurations/Transcription/{id}` |
83+
| `test_voice_v2_account_default_configuration_recording_fetch` | `voice.v2.account_default_configuration("Recording").fetch()` routes correctly |
84+
85+
### Insights v3 (new module)
86+
| Test | What it validates |
87+
|------|------------------|
88+
| `test_insights_v3_metadata_fetch` | `insights.v3.metadata.fetch()` returns metadata from `/InsightsDomains/Conversations/Metadata` |
89+
| `test_insights_v3_query_create` | `insights.v3.query.create(InsightsQueryRequest)` sends a synchronous query |
90+
91+
### Intelligence v3 (new module)
92+
| Test | What it validates |
93+
|------|------------------|
94+
| `test_intelligence_v3_operators_list` | `intelligence.v3.operators.list()` returns a list of Language Operators |
95+
| `test_intelligence_v3_conversations_list` | `intelligence.v3.conversations.list()` returns paginated conversation records |
96+
97+
### Memory v1 (new module)
98+
| Test | What it validates |
99+
|------|------------------|
100+
| `test_memory_v1_store_lifecycle` | Full async create → operation poll → fetch → delete lifecycle for a Memory Store |
101+
| `test_memory_v1_stores_list` | `memory.v1.stores.list()` returns store IDs as strings; each ID is fetchable for full details |
102+
103+
> Memory store create returns HTTP 202 (Accepted) with a `status_url`. The lifecycle test polls the
104+
> operation until `COMPLETED`, extracts the store ID from `result_url`, fetches it, then deletes it.
105+
> A `uuid4`-based unique display name is used per run to avoid the 520045 name-reservation collision
106+
> that occurs during the async deletion window.
107+
108+
### Knowledge v2 (new module)
109+
| Test | What it validates |
110+
|------|------------------|
111+
| `test_knowledge_v2_knowledge_bases_list` | `knowledge.v2.knowledge_bases.list()` returns knowledge base records |
112+
113+
### Conversations v2 (new module)
114+
| Test | What it validates |
115+
|------|------------------|
116+
| `test_conversations_v2_configurations_list` | `conversations.v2.configurations.list()` returns configuration records |
117+
| `test_conversations_v2_conversations_list` | `conversations.v2.conversations.list()` returns conversation records |
118+
119+
### Routes v3 (new module)
120+
| Test | What it validates |
121+
|------|------------------|
122+
| `test_routes_v3_phone_number_fetch` | `routes.v3.phone_numbers(number).fetch()` returns routing config for a known E.164 number |
123+
124+
> Requires `TWILIO_PHONE_NUMBER` env var. Test self-skips if not set.
125+
126+
## Environment Variables Required
127+
128+
```bash
129+
export TWILIO_ACCOUNT_SID=<account_sid>
130+
export TWILIO_AUTH_TOKEN=<auth_token>
131+
export TWILIO_PHONE_NUMBER=<e164_number> # optional — Routes v3 test skips if unset
132+
```
133+
134+
## How to Run
135+
136+
```bash
137+
# Isolated run against the published PyPI package (recommended)
138+
python3 -m venv /tmp/twilio-9110-test
139+
/tmp/twilio-9110-test/bin/pip install twilio==9.11.0 pytest
140+
141+
cd /tmp # run outside repo root to prevent local source shadowing the installed package
142+
143+
TWILIO_ACCOUNT_SID=<sid> \
144+
TWILIO_AUTH_TOKEN=<token> \
145+
TWILIO_PHONE_NUMBER=<number> \
146+
/tmp/twilio-9110-test/bin/python3 -m pytest \
147+
/path/to/twilio-python/tests/cluster/test_9_11_0.py -v
148+
149+
# Or from inside the repo (uses local source tree)
150+
cd /path/to/twilio-python
151+
export TWILIO_ACCOUNT_SID=<sid>
152+
export TWILIO_AUTH_TOKEN=<token>
153+
export TWILIO_PHONE_NUMBER=<number>
154+
python3 -m pytest tests/cluster/test_9_11_0.py -v
155+
```
156+
157+
## Notable Findings
158+
159+
### Memory Store create is asynchronous
160+
`stores.create()` returns HTTP **202 Accepted**, not 201. The response body contains only a
161+
`status_url` (operation URL) and a message — the store `id` is not present in the create
162+
response. Callers must poll the operation endpoint until `status == "COMPLETED"` and then
163+
read the store ID from `result_url`.
164+
165+
### Memory store list returns ID strings, not resource objects
166+
`memory.v1.stores.list()` returns `List[str]` (store ID strings), not `List[StoreInstance]`.
167+
Fetch each ID individually via `memory.v1.stores(store_id).fetch()` to get the full resource.
168+
169+
### Display name is reserved during async deletion
170+
After deleting a store, the display name remains reserved while the async delete operation
171+
is `RUNNING`. Attempting to create a new store with the same name during this window fails
172+
with error **520045** ("Memory store already exists"). The lifecycle test uses a
173+
`uuid4`-suffixed name to avoid this.

0 commit comments

Comments
 (0)