Files
probo/pkg/accessreview/drivers/testdata/sendgrid.yaml
Aurélien Sibiril 2e86d0ebf5 Fix SendGrid teammate-detail decode and harden MFA/auth coverage
The teammate detail endpoint returns a bare object, not a {"result":...}
envelope, so the N+1 scope fetch silently discarded scopes and MFA was
always Unknown for every teammate. Decode the bare object.

Found by re-recording the driver cassette against the live API; the
hand-written cassette had hidden the mismatch. Also from that review:
- Map is_sso/is_partner_sso to AuthMethod (SSO vs Password) instead of
  hardcoding Unknown
- Log the swallowed teammate-detail fetch error (wire the driver logger,
  matching github.go)
- Add a restricted teammate + a missing-email row to the cassette so the
  N+1 decode, the empty-email skip, and the SSO path are load-bearing
- Drop the stale Content-Length response header; document ExternalID

Signed-off-by: Aurélien Sibiril <81782+aureliensibiril@users.noreply.github.com>
2026-06-04 18:29:18 +02:00

176 lines
12 KiB
YAML

---
version: 2
interactions:
- id: 0
request:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
content_length: 0
host: api.sendgrid.com
form:
limit:
- "500"
offset:
- "0"
headers:
Accept:
- application/json
url: https://api.sendgrid.com/v3/teammates?limit=500&offset=0
method: GET
response:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
content_length: -1
body: |
{"result":[{"username":"owner@example.com","email":"owner@example.com","first_name":"","last_name":"","address":"","address2":"","city":"","state":"","zip":"","country":"","company":"","website":"","phone":"","is_admin":true,"is_sso":false,"user_type":"owner","is_unified":true,"is_partner_sso":false},{"username":"taylor-teammate","email":"taylor@example.com","first_name":"Taylor","last_name":"Teammate","is_admin":false,"is_sso":true,"user_type":"teammate","is_unified":false,"is_partner_sso":false},{"username":"pending-invite","email":"","first_name":"","last_name":"","is_admin":false,"is_sso":false,"user_type":"teammate","is_unified":false,"is_partner_sso":false}]}
headers:
Access-Control-Allow-Headers:
- AUTHORIZATION, Content-Type, On-behalf-of, x-sg-elas-acl, X-Recaptcha, X-Request-Source, Browser-Fingerprint
Access-Control-Allow-Methods:
- HEAD, GET, PUT, POST, DELETE, OPTIONS, PATCH
Access-Control-Allow-Origin:
- '*'
Access-Control-Expose-Headers:
- Link, Location
Access-Control-Max-Age:
- "21600"
Cache-Control:
- no-cache
Connection:
- keep-alive
Content-Security-Policy:
- default-src https://api.sendgrid.com; frame-src 'none'; object-src 'none'
Content-Type:
- application/json; charset=utf8
Date:
- Thu, 04 Jun 2026 12:30:33 GMT
Link:
- <https://chaos.ing.customer-growth-eng.general-prod-a.us-east-2.aws.k8s.sendgrid.net/v3/teammates?limit=500&offset=0>; rel="first"; title="1", <https://chaos.ing.customer-growth-eng.general-prod-a.us-east-2.aws.k8s.sendgrid.net/v3/teammates?limit=500&offset=0>; rel="last"; title="1"
Powered-By:
- Mako
Referrer-Policy:
- strict-origin-when-cross-origin
Server:
- nginx
Strict-Transport-Security:
- max-age=31536000
X-Client-Ff:
- "1000"
X-Content-Type-Options:
- nosniff
X-Envoy-Upstream-Service-Time:
- "231"
X-Ratelimit-Limit:
- "600"
X-Ratelimit-Remaining:
- "599"
X-Ratelimit-Reset:
- "1780576260"
X-Robots-Tag:
- noindex, nofollow
status: 200 OK
code: 200
duration: 323.748208ms
- id: 1
request:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
content_length: 0
host: api.sendgrid.com
headers:
Accept:
- application/json
url: https://api.sendgrid.com/v3/teammates/owner@example.com
method: GET
response:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
transfer_encoding:
- chunked
content_length: -1
uncompressed: true
body: |
{"username":"owner@example.com","email":"owner@example.com","first_name":"","last_name":"","address":"","address2":"","city":"","state":"","zip":"","country":"","company":"","website":"","phone":"","is_admin":true,"is_sso":false,"user_type":"owner","scopes":["2fa_exempt","2fa_required","access_settings.activity.read","access_settings.whitelist.create","access_settings.whitelist.delete","access_settings.whitelist.read","access_settings.whitelist.update","alerts.create","alerts.delete","alerts.read","alerts.update","api_keys.create","api_keys.delete","api_keys.read","api_keys.update","asm.groups.create","asm.groups.delete","asm.groups.read","asm.groups.suppressions.create","asm.groups.suppressions.delete","asm.groups.suppressions.read","asm.groups.suppressions.update","asm.groups.update","asm.suppressions.global.create","asm.suppressions.global.delete","asm.suppressions.global.read","asm.suppressions.global.update","billing.create","billing.delete","billing.read","billing.update","browsers.stats.read","categories.create","categories.delete","categories.read","categories.stats.read","categories.stats.sums.read","categories.update","clients.desktop.stats.read","clients.phone.stats.read","clients.stats.read","clients.tablet.stats.read","clients.webmail.stats.read","credentials.create","credentials.delete","credentials.read","credentials.update","design_library.create","design_library.delete","design_library.read","design_library.update","devices.stats.read","email_testing.read","email_testing.write","geo.stats.read","ips.pools.ips.read","mail.batch.create","mail.batch.delete","mail.batch.read","mail.batch.update","mail.send","mail_settings.address_whitelist.create","mail_settings.address_whitelist.delete","mail_settings.address_whitelist.read","mail_settings.address_whitelist.update","mail_settings.bcc.create","mail_settings.bcc.delete","mail_settings.bcc.read","mail_settings.bcc.update","mail_settings.bounce_purge.create","mail_settings.bounce_purge.delete","mail_settings.bounce_purge.read","mail_settings.bounce_purge.update","mail_settings.footer.create","mail_settings.footer.delete","mail_settings.footer.read","mail_settings.footer.update","mail_settings.forward_bounce.create","mail_settings.forward_bounce.delete","mail_settings.forward_bounce.read","mail_settings.forward_bounce.update","mail_settings.forward_spam.create","mail_settings.forward_spam.delete","mail_settings.forward_spam.read","mail_settings.forward_spam.update","mail_settings.plain_content.create","mail_settings.plain_content.delete","mail_settings.plain_content.read","mail_settings.plain_content.update","mail_settings.read","mail_settings.spam_check.create","mail_settings.spam_check.delete","mail_settings.spam_check.read","mail_settings.spam_check.update","mail_settings.template.create","mail_settings.template.delete","mail_settings.template.read","mail_settings.template.update","mailbox_providers.stats.read","marketing.automation.read","marketing.read","messages.read","partner_settings.new_relic.create","partner_settings.new_relic.delete","partner_settings.new_relic.read","partner_settings.new_relic.update","partner_settings.read","partner_settings.sendwithus.create","partner_settings.sendwithus.delete","partner_settings.sendwithus.read","partner_settings.sendwithus.update","recipients.erasejob.create","recipients.erasejob.read","sender_verification_eligible","signup.trigger_confirmation","stats.global.read","stats.read","subusers.stats.monthly.read","subusers.stats.read","subusers.stats.sums.read","suppression.blocks.create","suppression.blocks.delete","suppression.blocks.read","suppression.blocks.update","suppression.bounces.create","suppression.bounces.delete","suppression.bounces.read","suppression.bounces.update","suppression.create","suppression.delete","suppression.invalid_emails.create","suppression.invalid_emails.delete","suppression.invalid_emails.read","suppression.invalid_emails.update","suppression.read","suppression.spam_reports.create","suppression.spam_reports.delete","suppression.spam_reports.read","suppression.spam_reports.update","suppression.unsubscribes.create","suppression.unsubscribes.delete","suppression.unsubscribes.read","suppression.unsubscribes.update","suppression.update","teammates.create","teammates.delete","teammates.read","teammates.update","templates.create","templates.delete","templates.read","templates.update","templates.versions.activate.create","templates.versions.activate.delete","templates.versions.activate.read","templates.versions.activate.update","templates.versions.create","templates.versions.delete","templates.versions.read","templates.versions.update","tracking_settings.click.create","tracking_settings.click.delete","tracking_settings.click.read","tracking_settings.click.update","tracking_settings.google_analytics.create","tracking_settings.google_analytics.delete","tracking_settings.google_analytics.read","tracking_settings.google_analytics.update","tracking_settings.open.create","tracking_settings.open.delete","tracking_settings.open.read","tracking_settings.open.update","tracking_settings.read","tracking_settings.subscription.create","tracking_settings.subscription.delete","tracking_settings.subscription.read","tracking_settings.subscription.update","ui.confirm_email","ui.provision","ui.signup_complete","user.account.read","user.credits.read","user.email.read","user.profile.create","user.profile.delete","user.profile.read","user.profile.update","user.scheduled_sends.create","user.scheduled_sends.delete","user.scheduled_sends.read","user.scheduled_sends.update","user.settings.enforced_tls.read","user.settings.enforced_tls.update","user.timezone.create","user.timezone.delete","user.timezone.read","user.timezone.update","user.username.read","user.webhooks.event.settings.create","user.webhooks.event.settings.delete","user.webhooks.event.settings.read","user.webhooks.event.settings.update","user.webhooks.event.test.create","user.webhooks.event.test.delete","user.webhooks.event.test.read","user.webhooks.event.test.update","user.webhooks.parse.settings.create","user.webhooks.parse.settings.delete","user.webhooks.parse.settings.read","user.webhooks.parse.settings.update","user.webhooks.parse.stats.read","whitelabel.create","whitelabel.delete","whitelabel.read","whitelabel.update"],"is_read_only":false,"is_unified":true,"is_partner_sso":false}
headers:
Access-Control-Allow-Headers:
- AUTHORIZATION, Content-Type, On-behalf-of, x-sg-elas-acl, X-Recaptcha, X-Request-Source, Browser-Fingerprint
Access-Control-Allow-Methods:
- HEAD, GET, PUT, POST, DELETE, OPTIONS, PATCH
Access-Control-Allow-Origin:
- '*'
Access-Control-Expose-Headers:
- Link, Location
Access-Control-Max-Age:
- "21600"
Cache-Control:
- no-cache
Connection:
- keep-alive
Content-Security-Policy:
- default-src https://api.sendgrid.com; frame-src 'none'; object-src 'none'
Content-Type:
- application/json; charset=utf8
Date:
- Thu, 04 Jun 2026 12:30:33 GMT
Powered-By:
- Mako
Referrer-Policy:
- strict-origin-when-cross-origin
Server:
- nginx
Strict-Transport-Security:
- max-age=31536000
X-Client-Ff:
- "1000"
X-Content-Type-Options:
- nosniff
X-Envoy-Upstream-Service-Time:
- "264"
X-Ratelimit-Limit:
- "600"
X-Ratelimit-Remaining:
- "599"
X-Ratelimit-Reset:
- "1780576260"
X-Robots-Tag:
- noindex, nofollow
status: 200 OK
code: 200
duration: 283.823083ms
- id: 2
request:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
content_length: 0
host: api.sendgrid.com
headers:
Accept:
- application/json
url: https://api.sendgrid.com/v3/teammates/taylor-teammate
method: GET
response:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
transfer_encoding:
- chunked
content_length: -1
uncompressed: true
body: |
{"username":"taylor-teammate","email":"taylor@example.com","first_name":"Taylor","last_name":"Teammate","is_admin":false,"is_sso":true,"user_type":"teammate","is_unified":false,"is_partner_sso":false,"scopes":["mail.send","2fa_required"]}
headers:
Content-Type:
- application/json; charset=utf8
Date:
- Thu, 04 Jun 2026 12:30:34 GMT
Server:
- nginx
status: 200 OK
code: 200
duration: 18ms