import gleam/http import gleam/int import gleam/json import gleam/set import server/router import server/user import server_test import shared/contract/register_crew as register_crew_contract import shared/role import wisp import wisp/simulate pub fn register_crew_test() -> Nil { use ctx <- server_test.with_context() let crew_name = wisp.random_string(12) let crew_is_active = True let assert Ok(crew_leader) = user.register( ctx, user_name: wisp.random_string(12), user_role: role.Captain, user_password: wisp.random_string(12), user_email: wisp.random_string(12) <> "@leader.com", user_phone: wisp.random_string(12), is_active: True, ) let members = { use acc, _ <- int.range(0, 5, []) let assert Ok(member) = user.register( ctx:, user_name: wisp.random_string(12), user_role: role.None, user_password: wisp.random_string(12), user_email: wisp.random_string(12) <> "@member.com", user_phone: wisp.random_string(12), is_active: True, ) [member, ..acc] } let leader_id = crew_leader.id let body = register_crew_contract.RequestBody(leader_id:, crew_name:, members:) |> register_crew_contract.request_to_json let req = simulate.browser_request(http.Post, register_crew_contract.url) |> simulate.json_body(body) // unauthorized { let resp = router.handle_request(req, ctx) assert resp.status == 401 } // authorized { let auth_resp = server_test.with_permissions(next: req, ctx:, with: role.Admin) |> router.handle_request(ctx) let body = simulate.read_body(auth_resp) assert auth_resp.status == 201 let assert Ok(returned) = json.parse(body, register_crew_contract.response_decoder()) assert returned.crew.leader_id == crew_leader.id assert returned.crew.is_active == crew_is_active assert returned.crew.name == crew_name let want = set.from_list(members) let got = set.from_list(returned.assigned) assert set.difference(got, want) |> set.to_list == [] } }