wip: currently rewriting the project as a full stack application tangled.org/kacaii.dev/sigo
gleam
at main 187 lines 6.6 kB view raw
1import app/domain/role 2import app/http_router 3import app/web 4import app_dev/sql as dev_sql 5import app_test 6import dummy 7import gleam/dynamic/decode 8import gleam/http 9import gleam/json 10import gleam/list 11import gleam/set 12import wisp 13import wisp/simulate 14import youid/uuid 15 16pub fn register_new_brigade_test() { 17 let path = "/admin/brigade/new" 18 use ctx <- app_test.global_data() 19 use _ <- list.each(list.range(1, app_test.n_tests)) 20 21 // 󰚩 DUMMY ------------------------------------------------------------------ 22 let dummy_leader = dummy.random_user(ctx.db) 23 let dummy_members = 24 list.map(list.range(1, 10), fn(_) { dummy.random_user(ctx.db) }) 25 26 // START --------------------------------------------------------------------- 27 28 let dummy_members_json = 29 json.array(dummy_members, fn(member) { json.string(uuid.to_string(member)) }) 30 31 let req = 32 simulate.browser_request(http.Post, path) 33 |> simulate.json_body( 34 json.object([ 35 #("liderId", json.string(uuid.to_string(dummy_leader))), 36 #("nome", json.string(wisp.random_string(6))), 37 #("codigoViatura", json.string(wisp.random_string(6))), 38 #("ativo", json.bool(True)), 39 #("membros", dummy_members_json), 40 ]), 41 ) 42 43 // REGULAR REQUEST 44 let resp = http_router.handle_request(req, ctx) 45 assert resp.status == 401 as "Endpoint restricted to Admin users" 46 47 // AS ADMIN 48 let with_auth = app_test.with_authorization(req) 49 50 // AUTHORIZED REQUEST 51 let resp = http_router.handle_request(with_auth, ctx) 52 assert resp.status == 201 as "Response sould be HTTP 201 CREATED" 53 54 // READ BODY ----------------------------------------------------------------- 55 let body = simulate.read_body(resp) 56 57 let assert Ok(_) = 58 json.parse(body, { 59 let members_decoder = { 60 use members <- decode.then( 61 decode.list(of: web.uuid_decoder("member_uuid")), 62 ) 63 decode.success(members) 64 } 65 66 use _ <- decode.field("id", web.uuid_decoder("uuid")) 67 use _ <- decode.field("created_at", decode.float) 68 use members <- decode.field("members", members_decoder) 69 70 let members_set = set.from_list(members) 71 let dummy_members_set = set.from_list(dummy_members) 72 73 // ASSERTIONS ------------------------------------------------------------ 74 assert set.difference(members_set, dummy_members_set) |> set.to_list() 75 == [] 76 as "Returned members contain unexpected users" 77 assert set.difference(dummy_members_set, members_set) |> set.to_list() 78 == [] 79 as "Some brigade members were not returned" 80 81 decode.success(Nil) 82 }) 83 as "Response should contain valid JSON" 84 85 // 󰃢 CLEANUP ---------------------------------------------------------------- 86 let assert Ok(_) = dev_sql.soft_truncate_user_account(ctx.db) 87 let assert Ok(_) = dev_sql.truncate_brigade(ctx.db) 88} 89 90pub fn get_brigade_members_test() { 91 use ctx <- app_test.global_data() 92 use _ <- list.each(list.range(1, app_test.n_tests)) 93 94 //  DUMMY LEADER ----------------------------------------------------------- 95 let leader_id = dummy.random_user(ctx.db) 96 97 // 󰚩 DUMMY MEMBERS ---------------------------------------------------------- 98 let dummy_members = 99 list.map(list.range(1, 10), fn(_) { dummy.random_user(ctx.db) }) 100 101 // 󰚩 󰚩 󰚩 DUMMY BRIGADE ---------------------------------------------------- 102 let dummy_brigade = 103 dummy.random_brigade(conn: ctx.db, leader_id:, members: dummy_members) 104 105 // START --------------------------------------------------------------------- 106 107 let path = "/brigade/" <> uuid.to_string(dummy_brigade) <> "/members" 108 let req = simulate.browser_request(http.Get, path) 109 110 let resp = http_router.handle_request(req, ctx) 111 assert resp.status == 200 as "Response should be HTTP 200 OK" 112 113 let body = simulate.read_body(resp) 114 let assert Ok(returned_members_list) = 115 json.parse(body, { 116 let role_decoder = { 117 use maybe_role <- decode.then(decode.string) 118 case role.from_string_pt_br(maybe_role) { 119 Error(_) -> decode.failure(role.Firefighter, "user_role") 120 Ok(value) -> decode.success(value) 121 } 122 } 123 124 decode.list({ 125 use user_uuid <- decode.field("id", web.uuid_decoder("user_uuid")) 126 use _ <- decode.field("full_name", decode.string) 127 use _ <- decode.field("user_role", role_decoder) 128 decode.success(user_uuid) 129 }) 130 }) 131 132 let returned_members_set = set.from_list(returned_members_list) 133 let dummy_members_set = set.from_list(dummy_members) 134 135 assert set.difference(returned_members_set, dummy_members_set) 136 |> set.to_list() 137 == [] 138 as "Returned list should be the same as the members list" 139 140 // 󰃢 CLEANUP ---------------------------------------------------------------- 141 let assert Ok(_) = dev_sql.truncate_brigade(ctx.db) 142 let assert Ok(_) = dev_sql.soft_truncate_user_account(ctx.db) 143} 144 145pub fn get_all_brigades_test() { 146 use ctx <- app_test.global_data() 147 use _ <- list.each(list.range(1, app_test.n_tests)) 148 let path = "/admin/brigade" 149 150 //  DUMMY LEADER ----------------------------------------------------------- 151 let leader_id = dummy.random_user(ctx.db) 152 153 // 󰚩 DUMMY MEMBERS ---------------------------------------------------------- 154 let dummy_members = 155 list.map(list.range(1, 10), fn(_) { dummy.random_user(ctx.db) }) 156 157 // 󰚩 󰚩 󰚩 DUMMY BRIGADE ---------------------------------------------------- 158 let dummy_brigade = 159 dummy.random_brigade(conn: ctx.db, leader_id:, members: dummy_members) 160 161 // START --------------------------------------------------------------------- 162 let req = simulate.browser_request(http.Get, path) 163 let resp = http_router.handle_request(req, ctx) 164 165 assert resp.status == 200 as "Enpoint should be accessible" 166 167 let body = simulate.read_body(resp) 168 let assert Ok(returned_list) = 169 json.parse( 170 body, 171 decode.list({ 172 use brigade_uuid <- decode.field("id", web.uuid_decoder("brigade_uuid")) 173 use _ <- decode.field("brigade_name", decode.string) 174 use _ <- decode.field("leader_name", decode.optional(decode.string)) 175 use _ <- decode.field("is_active", decode.bool) 176 decode.success(brigade_uuid) 177 }), 178 ) 179 as "Response should contain valid JSON" 180 181 assert list.contains(returned_list, dummy_brigade) 182 as "Response should contain the dummy brigade" 183 184 // 󰃢 CLEANUP --------------------------------------------------------------- 185 let assert Ok(_) = dev_sql.truncate_brigade(ctx.db) 186 let assert Ok(_) = dev_sql.soft_truncate_user_account(ctx.db) 187}