arn-the-long-beard / seed-routing

Prototype for having easy routing to use in Seed

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Add integration test for the router withing inside a Seed App

arn-the-long-beard opened this issue · comments

We need to create few integration tests for the very used public apis of the Router.

I have pushed these tests today

#[wasm_bindgen_test]
    fn test_router_init() {
        add_router!();
        let my_router = router();
        assert_eq!(my_router.current_route(), Route::NotFound);
        let url = Route::Login.to_url();
        router().init(url);
        assert_eq!(my_router.current_route(), Route::Login);
    }

    #[wasm_bindgen_test]
    fn test_router_and_route_view() {
        let my_router: Router<Route> = router();
        my_router.navigate_to_new(Route::Login);

        let current_view = my_router
            .current_route()
            .view(&Model {
                dashboard: dashboard::Model::default(),
                user: None,
            })
            .to_string();
        let login_view = login(&Model {
            dashboard: dashboard::Model::default(),
            user: None,
        })
        .to_string();
        assert_eq!(current_view, login_view);
    }
    #[wasm_bindgen_test]
    fn test_router_view_and_guard() {
        let my_router: Router<Route> = router();
        my_router.navigate_to_new(Dashboard(dashboard::Route::Settings));
        let current_view = my_router
            .current_route()
            .view(&Model {
                dashboard: dashboard::Model::default(),
                user: None,
            })
            .to_string();
        assert_eq!(
            current_view,
            forbidden(Some(&UserLogged {
                name: "".to_string()
            }))
            .to_string()
        );

        let test_user = UserLogged {
            name: "test_user".to_string(),
        };
        my_router.navigate_to_new(Dashboard(dashboard::Route::Settings));
        let current_view = my_router
            .current_route()
            .view(&Model {
                dashboard: dashboard::Model::default(),
                user: Some(test_user),
            })
            .to_string();
        assert_eq!(
            current_view,
            dashboard::settings(&dashboard::Model::default()).to_string()
        );
    }

I do not really run the seed app so . I am still looking for a solution for that.

Done today with the latest commit.

Here is how I did :

  #[wasm_bindgen_test]
    fn test_router_navigation_and_page_init() {
        let mut model = Model {
            dashboard: dashboard::Model::default(),
            admin: admin::Model::default(),
            other: other::Model::default(),
            user: None,
        };
        let window = web_sys::window().expect("no global `window` exists");
        let document = window.document().expect("should have a document on window");
        let body = document.body().expect("document should have a body");
        let val = document
            .create_element("section")
            .expect("should add section");
        val.set_id("app");

        let app = App::start(val, init, update, view);
        let mut orders = OrdersContainer::new(app);
        let url = Route::Home.to_url(); // Home is chosen by wasm_pak probably because it does query the base url first from Seed
        update(
            Msg::UrlChanged(subs::UrlChanged(url)),
            &mut model,
            &mut orders,
        );

        assert_eq!(&model.dashboard.stuff, "");
        let dashboard_url = Route::Dashboard(dashboard::Route::Settings).to_url();
        router().navigate_to_url(dashboard_url.clone());

        update(
            Msg::UrlChanged(subs::UrlChanged(dashboard_url)),
            &mut model,
            &mut orders,
        );

        assert_eq!(&model.dashboard.stuff, "init_has_been_done");

        let admin_url: Url = "http://localhost/admin?admin_id=1&admin_privilege=high"
            .parse()
            .unwrap();

        router().navigate_to_url(admin_url.clone());

        update(
            Msg::UrlChanged(subs::UrlChanged(admin_url)),
            &mut model,
            &mut orders,
        );

        assert_eq!(&model.admin.admin_id, "1");
        assert_eq!(&model.admin.admin_privilege, "high");
    }