Add 13 access-review driver implementations → Dispatch new providers in review engine and name worker

- Add 13 access-review driver implementations
- Add VCR-driven driver tests with synthetic cassettes
- Guard cassettes against non-synthetic email leaks
- Dispatch new providers in review engine and name worker

Signed-off-by: Aurélien Sibiril <81782+aureliensibiril@users.noreply.github.com>
This commit is contained in:
Aurélien Sibiril
2026-05-17 17:22:48 +02:00
parent 0147acd9f0
commit 1532e94eb1
43 changed files with 3345 additions and 0 deletions

View File

@@ -0,0 +1,35 @@
---
version: 2
interactions:
- id: 0
request:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
content_length: 0
host: app.asana.com
form:
limit:
- "100"
opt_fields:
- "email,name"
headers:
Accept:
- application/json
url: https://app.asana.com/api/1.0/workspaces/9999999/users?opt_fields=email,name&limit=100
method: GET
response:
proto: HTTP/2.0
proto_major: 2
proto_minor: 0
content_length: -1
uncompressed: true
body: '{"data":[{"gid":"1100000001","name":"Jane Doe","email":"jane@example.com"},{"gid":"1100000002","name":"Bob Smith","email":""}],"next_page":null}'
headers:
Content-Type:
- application/json
Date:
- Thu, 01 May 2026 12:00:00 GMT
status: 200 OK
code: 200
duration: 100ms

View File

@@ -0,0 +1,35 @@
---
version: 2
interactions:
- id: 0
request:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
content_length: 0
host: api.bitbucket.org
form:
fields:
- "+values.user.email"
pagelen:
- "100"
headers:
Accept:
- application/json
url: https://api.bitbucket.org/2.0/workspaces/acme/members?fields=%2Bvalues.user.email&pagelen=100
method: GET
response:
proto: HTTP/2.0
proto_major: 2
proto_minor: 0
content_length: -1
uncompressed: true
body: '{"values":[{"user":{"account_id":"557058:abc-123","display_name":"Jane Doe","nickname":"jane","email":"jane@example.com"}},{"user":{"account_id":"557058:def-456","display_name":"Bob Smith","nickname":"bsmith","email":""}}]}'
headers:
Content-Type:
- application/json
Date:
- Thu, 01 May 2026 12:00:00 GMT
status: 200 OK
code: 200
duration: 100ms

View File

@@ -0,0 +1,30 @@
---
version: 2
interactions:
- id: 0
request:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
content_length: 0
host: api.clickup.com
headers:
Accept:
- application/json
url: https://api.clickup.com/api/v2/team/9999999
method: GET
response:
proto: HTTP/2.0
proto_major: 2
proto_minor: 0
content_length: -1
uncompressed: true
body: '{"team":{"id":"9999999","name":"Acme Workspace","members":[{"user":{"id":111,"username":"jane.doe","email":"jane@example.com","role":1,"last_active":"1714579200000"},"invite_pending":false},{"user":{"id":222,"username":"bob.smith","email":"bob@example.com","role":3,"last_active":""},"invite_pending":true}]}}'
headers:
Content-Type:
- application/json
Date:
- Thu, 01 May 2026 12:00:00 GMT
status: 200 OK
code: 200
duration: 100ms

View File

@@ -0,0 +1,67 @@
---
version: 2
interactions:
- id: 0
request:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
content_length: 0
host: api.letsdeel.com
form:
limit:
- "100"
offset:
- "0"
headers:
Accept:
- application/json
url: https://api.letsdeel.com/rest/v2/people?limit=100&offset=0
method: GET
response:
proto: HTTP/2.0
proto_major: 2
proto_minor: 0
content_length: -1
uncompressed: true
body: '{"data":[{"id":"d_jane","email":"jane@example.com","first_name":"Jane","last_name":"Doe","job_title":"Engineering Lead","hiring_status":"active","start_date":"2024-06-01","end_date":""},{"id":"d_bob","email":"bob@example.com","first_name":"Bob","last_name":"Smith","job_title":"Designer","hiring_status":"inactive","start_date":"2023-01-15","end_date":"2025-09-30"}]}'
headers:
Content-Type:
- application/json
Date:
- Thu, 01 May 2026 12:00:00 GMT
status: 200 OK
code: 200
duration: 100ms
- id: 1
request:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
content_length: 0
host: api.letsdeel.com
form:
limit:
- "100"
offset:
- "100"
headers:
Accept:
- application/json
url: https://api.letsdeel.com/rest/v2/people?limit=100&offset=100
method: GET
response:
proto: HTTP/2.0
proto_major: 2
proto_minor: 0
content_length: -1
uncompressed: true
body: '{"data":[]}'
headers:
Content-Type:
- application/json
Date:
- Thu, 01 May 2026 12:00:00 GMT
status: 200 OK
code: 200
duration: 100ms

View File

@@ -0,0 +1,33 @@
---
version: 2
interactions:
- id: 0
request:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
content_length: 0
host: gitlab.com
form:
per_page:
- "100"
headers:
Accept:
- application/json
url: https://gitlab.com/api/v4/groups/12345/members/all?per_page=100
method: GET
response:
proto: HTTP/2.0
proto_major: 2
proto_minor: 0
content_length: -1
uncompressed: true
body: '[{"id":1000001,"username":"jane.doe","name":"Jane Doe","email":"jane@example.com","state":"active","access_level":50},{"id":1000002,"username":"bob.smith","name":"Bob Smith","email":"bob@example.com","state":"active","access_level":30},{"id":1000003,"username":"alice","name":"Alice","email":null,"state":"blocked","access_level":10}]'
headers:
Content-Type:
- application/json
Date:
- Thu, 01 May 2026 12:00:00 GMT
status: 200 OK
code: 200
duration: 100ms

View File

@@ -0,0 +1,30 @@
---
version: 2
interactions:
- id: 0
request:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
content_length: 0
host: api.heroku.com
headers:
Accept:
- application/vnd.heroku+json; version=3
url: https://api.heroku.com/teams/acme/members
method: GET
response:
proto: HTTP/2.0
proto_major: 2
proto_minor: 0
content_length: -1
uncompressed: true
body: '[{"id":"00000000-0000-0000-0000-000000000001","email":"jane@example.com","role":"admin","two_factor_authentication":true,"federated":false,"created_at":"2024-06-01T12:00:00Z","user":{"id":"u-1","email":"jane@example.com","name":"Jane Doe"}},{"id":"00000000-0000-0000-0000-000000000002","email":"bob@example.com","role":"member","two_factor_authentication":false,"federated":false,"created_at":"2025-01-15T09:00:00Z","user":{"id":"u-2","email":"bob@example.com","name":"Bob Smith"}}]'
headers:
Content-Type:
- application/json
Date:
- Thu, 01 May 2026 12:00:00 GMT
status: 200 OK
code: 200
duration: 100ms

View File

@@ -0,0 +1,33 @@
---
version: 2
interactions:
- id: 0
request:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
content_length: 0
host: api.lever.co
form:
limit:
- "100"
headers:
Accept:
- application/json
url: https://api.lever.co/v1/users?limit=100
method: GET
response:
proto: HTTP/2.0
proto_major: 2
proto_minor: 0
content_length: -1
uncompressed: true
body: '{"data":[{"id":"l_jane","email":"jane@example.com","name":"Jane Doe","accessRole":"super admin","deactivatedAt":null,"lastLoggedInAt":1745000000000,"createdAt":1717200000000},{"id":"l_bob","email":"bob@example.com","name":"Bob Smith","accessRole":"admin","deactivatedAt":1735000000000,"lastLoggedInAt":null,"createdAt":1717200000000}],"hasNext":false,"next":""}'
headers:
Content-Type:
- application/json
Date:
- Thu, 01 May 2026 12:00:00 GMT
status: 200 OK
code: 200
duration: 100ms

View File

@@ -0,0 +1,63 @@
---
version: 2
interactions:
- id: 0
request:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
content_length: 165
host: api.monday.com
body: '{"query":"query($p: Int!) { users(limit: 200, page: $p) { id email name enabled is_admin is_guest is_pending last_activity created_at title } }","variables":{"p":1}}'
headers:
Accept:
- application/json
Content-Type:
- application/json
url: https://api.monday.com/v2
method: POST
response:
proto: HTTP/2.0
proto_major: 2
proto_minor: 0
content_length: -1
uncompressed: true
body: '{"data":{"users":[{"id":"1001","email":"jane@example.com","name":"Jane Doe","enabled":true,"is_admin":true,"is_guest":false,"is_pending":false,"last_activity":"2026-04-30T15:00:00Z","created_at":"2024-06-01T12:00:00Z","title":"Engineering Lead"},{"id":"1002","email":"bob@example.com","name":"Bob Smith","enabled":true,"is_admin":false,"is_guest":false,"is_pending":true,"last_activity":"","created_at":"2025-03-10T09:30:00Z","title":""}]}}'
headers:
Content-Type:
- application/json
Date:
- Thu, 01 May 2026 12:00:00 GMT
status: 200 OK
code: 200
duration: 100ms
- id: 1
request:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
content_length: 165
host: api.monday.com
body: '{"query":"query($p: Int!) { users(limit: 200, page: $p) { id email name enabled is_admin is_guest is_pending last_activity created_at title } }","variables":{"p":2}}'
headers:
Accept:
- application/json
Content-Type:
- application/json
url: https://api.monday.com/v2
method: POST
response:
proto: HTTP/2.0
proto_major: 2
proto_minor: 0
content_length: -1
uncompressed: true
body: '{"data":{"users":[]}}'
headers:
Content-Type:
- application/json
Date:
- Thu, 01 May 2026 12:00:00 GMT
status: 200 OK
code: 200
duration: 100ms

View File

@@ -0,0 +1,33 @@
---
version: 2
interactions:
- id: 0
request:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
content_length: 0
host: api.netlify.com
form:
per_page:
- "100"
headers:
Accept:
- application/json
url: https://api.netlify.com/api/v1/acme/members?per_page=100
method: GET
response:
proto: HTTP/2.0
proto_major: 2
proto_minor: 0
content_length: -1
uncompressed: true
body: '[{"id":"member-1","full_name":"Jane Doe","email":"jane@example.com","role":"Owner"},{"id":"member-2","full_name":"Bob Smith","email":"bob@example.com","role":"Collaborator"}]'
headers:
Content-Type:
- application/json
Date:
- Thu, 01 May 2026 12:00:00 GMT
status: 200 OK
code: 200
duration: 100ms

View File

@@ -0,0 +1,35 @@
---
version: 2
interactions:
- id: 0
request:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
content_length: 0
host: api.pagerduty.com
form:
limit:
- "100"
offset:
- "0"
headers:
Accept:
- application/vnd.pagerduty+json;version=2
url: https://api.pagerduty.com/users?limit=100&offset=0
method: GET
response:
proto: HTTP/2.0
proto_major: 2
proto_minor: 0
content_length: -1
uncompressed: true
body: '{"users":[{"id":"PXAAAAA","email":"jane@example.com","name":"Jane Doe","role":"admin","invitation_sent":false,"created_at":"2024-06-01T12:00:00Z"},{"id":"PXBBBBB","email":"bob@example.com","name":"Bob Smith","role":"user","invitation_sent":true,"created_at":"2025-04-10T09:30:00Z"}],"more":false,"limit":100,"offset":0,"total":null}'
headers:
Content-Type:
- application/json
Date:
- Thu, 01 May 2026 12:00:00 GMT
status: 200 OK
code: 200
duration: 100ms

View File

@@ -0,0 +1,33 @@
---
version: 2
interactions:
- id: 0
request:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
content_length: 0
host: api.ramp.com
form:
page_size:
- "100"
headers:
Accept:
- application/json
url: https://api.ramp.com/developer/v1/users?page_size=100
method: GET
response:
proto: HTTP/2.0
proto_major: 2
proto_minor: 0
content_length: -1
uncompressed: true
body: '{"data":[{"id":"user-1","email":"jane@example.com","first_name":"Jane","last_name":"Doe","role":"BUSINESS_ADMIN","status":"USER_ACTIVE","last_login_at":"2026-04-15T10:00:00Z","is_manager":true},{"id":"user-2","email":"bob@example.com","first_name":"Bob","last_name":"Smith","role":"BUSINESS_USER","status":"USER_SUSPENDED","last_login_at":"","is_manager":false}],"page":{"next":""}}'
headers:
Content-Type:
- application/json
Date:
- Thu, 01 May 2026 12:00:00 GMT
status: 200 OK
code: 200
duration: 100ms

View File

@@ -0,0 +1,35 @@
---
version: 2
interactions:
- id: 0
request:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
content_length: 0
host: api.snyk.io
form:
limit:
- "100"
version:
- "2024-10-15"
headers:
Accept:
- application/vnd.api+json
url: https://api.snyk.io/rest/orgs/org-1234/memberships?version=2024-10-15&limit=100
method: GET
response:
proto: HTTP/2.0
proto_major: 2
proto_minor: 0
content_length: -1
uncompressed: true
body: '{"data":[{"id":"membership-1","type":"org_membership","attributes":{"user":{"id":"user-1","email":"jane@example.com","name":"Jane Doe"},"role":{"id":"role-1","name":"Admin"}}},{"id":"membership-2","type":"org_membership","attributes":{"user":{"id":"user-2","email":"bob@example.com","name":"Bob Smith"},"role":{"id":"role-2","name":"Collaborator"}}}],"links":{"self":"/rest/orgs/org-1234/memberships?version=2024-10-15&limit=100"}}'
headers:
Content-Type:
- application/vnd.api+json
Date:
- Thu, 01 May 2026 12:00:00 GMT
status: 200 OK
code: 200
duration: 100ms

View File

@@ -0,0 +1,33 @@
---
version: 2
interactions:
- id: 0
request:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
content_length: 0
host: api.vercel.com
form:
limit:
- "100"
headers:
Accept:
- application/json
url: https://api.vercel.com/v3/teams/team_acme/members?limit=100
method: GET
response:
proto: HTTP/2.0
proto_major: 2
proto_minor: 0
content_length: -1
uncompressed: true
body: '{"members":[{"uid":"u_jane","email":"jane@example.com","username":"jane","name":"Jane Doe","role":"OWNER","confirmed":true,"isEnterpriseManaged":false,"joinedFrom":{"origin":"manual"}},{"uid":"u_bob","email":"bob@example.com","username":"bob","name":"Bob Smith","role":"MEMBER","confirmed":false,"isEnterpriseManaged":false,"joinedFrom":{"origin":"invite"}}],"pagination":{"next":""}}'
headers:
Content-Type:
- application/json
Date:
- Thu, 01 May 2026 12:00:00 GMT
status: 200 OK
code: 200
duration: 100ms