this repo has no description
lustre frontent oat-ui gleam
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

✅ add navigation unit tests

+59 -3
+2 -2
src/client.gleam
··· 203 203 // redirect them to the Login page. 204 204 session.None, _ | session.Pending(_, _), _ if protected -> route.Login 205 205 // If the User is *already* authenticated but navigating to 206 - // the Login page, redirect them to Home instead. 207 - session.Authenticated(_), route.Login -> route.Home 206 + // the Login page, redirect them to Dashboard instead. 207 + session.Authenticated(_), route.Login -> route.Dashboard 208 208 209 209 _, _ -> route 210 210 }
+2
src/client/page.gleam
··· 4 4 pub type Page { 5 5 Home 6 6 Login(page_model: login.Model) 7 + Dashboard 7 8 8 9 NotFound 9 10 } ··· 14 15 route.Home -> Home 15 16 route.Login -> Login(login.empty) 16 17 route.NotFound -> NotFound 18 + route.Dashboard -> Dashboard 17 19 } 18 20 }
+5 -1
src/client/route.gleam
··· 4 4 pub type Route { 5 5 Home 6 6 Login 7 + Dashboard 7 8 8 9 NotFound 9 10 } ··· 13 14 case variant { 14 15 "home" -> decode.success(Home) 15 16 "login" -> decode.success(Login) 17 + "dashboard" -> decode.success(Dashboard) 16 18 "not_found" -> decode.success(NotFound) 17 19 18 20 _ -> decode.failure(NotFound, "Route") ··· 22 24 /// Some routes might require authentication 23 25 pub fn is_protected(route: Route) -> Bool { 24 26 case route { 25 - Login | NotFound -> False 27 + Login | NotFound | Home -> False 26 28 _ -> True 27 29 } 28 30 } ··· 31 33 case uri.path_segments(uri.path) { 32 34 [] | [""] -> Home 33 35 ["login"] -> Login 36 + ["dashboard"] -> Dashboard 34 37 35 38 ["not-found"] | _ -> NotFound 36 39 } ··· 40 43 case route { 41 44 Home -> "/" 42 45 Login -> "/login" 46 + Dashboard -> "/dashboard" 43 47 NotFound -> "/not-found" 44 48 } 45 49 }
+46
test/client_test/navigation_test.gleam
··· 1 + import client 2 + import client/page 3 + import client/route 4 + import client/session 5 + import dummy 6 + import gleam/list 7 + import lustre/effect 8 + 9 + pub fn navigation_test() -> Nil { 10 + let model = dummy.model(dummy.session(), route.Home) 11 + let routes = [route.Home, route.Dashboard] 12 + 13 + list.fold(routes, #(model, effect.none()), fn(acc, route) { 14 + let msg = client.UserNavigatedTo(route) 15 + let #(model, _) = client.update(acc.0, msg) 16 + 17 + assert model.route == route as "route updated" 18 + assert model.page == page.init(route) as "page model initialized" 19 + 20 + #(model, effect.none()) 21 + }) 22 + 23 + Nil 24 + } 25 + 26 + pub fn redirect_guest_to_login_test() -> Nil { 27 + let model = dummy.model(session.None, route.Home) 28 + let msg = client.UserNavigatedTo(route.Dashboard) 29 + 30 + let #(model, _) = client.update(model, msg) 31 + assert model.route == route.Login 32 + as "redirect guest to login page when accessing protected route" 33 + 34 + Nil 35 + } 36 + 37 + pub fn prevent_redundant_login_test() -> Nil { 38 + let model = dummy.model(dummy.session(), route.Home) 39 + let msg = client.UserNavigatedTo(route.Login) 40 + 41 + let #(model, _) = client.update(model, msg) 42 + assert model.route == route.Dashboard 43 + as "redirected user to dashboard when accessing the login page" 44 + 45 + Nil 46 + }
+4
test/dummy.gleam
··· 9 9 User(id: "", full_name: "Dummy", email: "dummy@lustre.dev") 10 10 } 11 11 12 + pub fn session() -> session.Session { 13 + session.Authenticated(user()) 14 + } 15 + 12 16 pub fn model(session: session.Session, route: route.Route) -> client.Model { 13 17 client.Model(session:, route:, page: page.init(route), lang: language.English) 14 18 }