|
| 1 | +"""A membership change reaches the user's NEXT request, with no re-login (#381, #362). |
| 2 | +
|
| 3 | +``users_user.tenant_id`` used to be copied into the session at login, so moving |
| 4 | +a user between tenants only took effect after they signed in again. The active |
| 5 | +tenant now comes from ``tenants_membership`` on every request; these tests |
| 6 | +keep the member's signed session cookie fixed throughout and change membership |
| 7 | +underneath it. |
| 8 | +""" |
| 9 | + |
| 10 | +from __future__ import annotations |
| 11 | + |
| 12 | + |
| 13 | +async def test_removal_takes_effect_on_the_next_request(tenant_client): |
| 14 | + async with ( |
| 15 | + tenant_client() as owner, |
| 16 | + tenant_client("member", tenant_id=owner.tenant_id) as member, |
| 17 | + ): |
| 18 | + assert (await member.client.get("/api/tenants/current/members")).status_code == 200 |
| 19 | + |
| 20 | + removed = await owner.client.delete(f"/api/tenants/current/members/{member.user_id}") |
| 21 | + assert removed.status_code == 204 |
| 22 | + |
| 23 | + assert (await member.client.get("/api/tenants/current/members")).status_code != 200 |
| 24 | + assert (await member.client.get("/api/tenants/")).json() == [] |
| 25 | + |
| 26 | + |
| 27 | +async def test_role_change_takes_effect_on_the_next_request(tenant_client): |
| 28 | + async with ( |
| 29 | + tenant_client() as owner, |
| 30 | + tenant_client("member", tenant_id=owner.tenant_id) as member, |
| 31 | + ): |
| 32 | + invite = {"email": "new@example.com"} |
| 33 | + before = await member.client.post("/api/tenants/current/invitations", json=invite) |
| 34 | + assert before.status_code == 403 |
| 35 | + |
| 36 | + promoted = await owner.client.patch( |
| 37 | + f"/api/tenants/current/members/{member.user_id}", json={"role": "admin"} |
| 38 | + ) |
| 39 | + assert promoted.status_code == 200 |
| 40 | + after = await member.client.post("/api/tenants/current/invitations", json=invite) |
| 41 | + assert after.status_code == 201 |
| 42 | + |
| 43 | + await owner.client.patch( |
| 44 | + f"/api/tenants/current/members/{member.user_id}", json={"role": "member"} |
| 45 | + ) |
| 46 | + demoted = await member.client.post( |
| 47 | + "/api/tenants/current/invitations", json={"email": "other@example.com"} |
| 48 | + ) |
| 49 | + assert demoted.status_code == 403 |
| 50 | + |
| 51 | + |
| 52 | +async def test_joining_and_switching_tenants_needs_no_relogin(tenant_client): |
| 53 | + async with tenant_client() as user: |
| 54 | + first = user.tenant_id |
| 55 | + created = await user.client.post("/api/tenants/", json={"name": "Second", "slug": "second"}) |
| 56 | + assert created.status_code == 201 |
| 57 | + second = created.json()["id"] |
| 58 | + |
| 59 | + mine = {t["id"] for t in (await user.client.get("/api/tenants/")).json()} |
| 60 | + assert mine == {first, second} |
| 61 | + |
| 62 | + assert (await user.client.post(f"/api/tenants/{first}/switch")).status_code == 204 |
| 63 | + members = (await user.client.get("/api/tenants/current/members")).json() |
| 64 | + assert [m["user_id"] for m in members] == [user.user_id] |
0 commit comments