#![allow(non_snake_case)] use dioxus::prelude::*; use dioxus_router::prelude::*; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use std::str::FromStr; fn prepare() -> String where ::Err: std::fmt::Display, { let mut vdom = VirtualDom::new_with_props( App, AppProps:: { phantom: std::marker::PhantomData, }, ); let _ = vdom.rebuild(); return dioxus_ssr::render(&vdom); #[derive(Props)] struct AppProps { phantom: std::marker::PhantomData, } impl PartialEq for AppProps { fn eq(&self, _other: &Self) -> bool { false } } fn App(cx: Scope>) -> Element where ::Err: std::fmt::Display, { render! { h1 { "App" } GenericRouter:: { config: RouterConfiguration { history: Box::>::default(), ..Default::default() } } } } } #[test] fn href_internal() { #[derive(Routable, Clone, Serialize, Deserialize)] enum Route { #[route("/")] Root {}, #[route("/test")] Test {}, } #[inline_props] fn Test(cx: Scope) -> Element { todo!() } #[inline_props] fn Root(cx: Scope) -> Element { render! { Link { target: Route::Test {}, "Link" } } } let expected = format!( "

App

Link", href = r#"href="/test""#, default = r#"dioxus-prevent-default="onclick""#, class = r#"class="""#, id = r#"id="""#, rel = r#"rel="""#, target = r#"target="""# ); assert_eq!(prepare::(), expected); } #[test] fn href_external() { #[derive(Routable, Clone, Serialize, Deserialize)] enum Route { #[route("/")] Root {}, #[route("/test")] Test {}, } #[inline_props] fn Test(cx: Scope) -> Element { todo!() } #[inline_props] fn Root(cx: Scope) -> Element { render! { Link { target: NavigationTarget::External("https://dioxuslabs.com/".into()), "Link" } } } let expected = format!( "

App

Link", href = r#"href="https://dioxuslabs.com/""#, default = r#"dioxus-prevent-default="""#, class = r#"class="""#, id = r#"id="""#, rel = r#"rel="noopener noreferrer""#, target = r#"target="""# ); assert_eq!(prepare::(), expected); } #[test] fn with_class() { #[derive(Routable, Clone, Serialize, Deserialize)] enum Route { #[route("/")] Root {}, #[route("/test")] Test {}, } #[inline_props] fn Test(cx: Scope) -> Element { todo!() } #[inline_props] fn Root(cx: Scope) -> Element { render! { Link { target: Route::Test {}, class: "test_class", "Link" } } } let expected = format!( "

App

Link", href = r#"href="/test""#, default = r#"dioxus-prevent-default="onclick""#, class = r#"class="test_class""#, id = r#"id="""#, rel = r#"rel="""#, target = r#"target="""# ); assert_eq!(prepare::(), expected); } #[test] fn with_active_class_active() { #[derive(Routable, Clone, Serialize, Deserialize)] enum Route { #[route("/")] Root {}, } #[inline_props] fn Root(cx: Scope) -> Element { render! { Link { target: Route::Root {}, active_class: "active_class", class: "test_class", "Link" } } } let expected = format!( "

App

Link", href = r#"href="/""#, default = r#"dioxus-prevent-default="onclick""#, class = r#"class="test_class active_class""#, id = r#"id="""#, rel = r#"rel="""#, target = r#"target="""# ); assert_eq!(prepare::(), expected); } #[test] fn with_active_class_inactive() { #[derive(Routable, Clone, Serialize, Deserialize)] enum Route { #[route("/")] Root {}, #[route("/test")] Test {}, } #[inline_props] fn Test(cx: Scope) -> Element { todo!() } #[inline_props] fn Root(cx: Scope) -> Element { render! { Link { target: Route::Test {}, active_class: "active_class", class: "test_class", "Link" } } } let expected = format!( "

App

Link", href = r#"href="/test""#, default = r#"dioxus-prevent-default="onclick""#, class = r#"class="test_class""#, id = r#"id="""#, rel = r#"rel="""#, target = r#"target="""# ); assert_eq!(prepare::(), expected); } #[test] fn with_id() { #[derive(Routable, Clone, Serialize, Deserialize)] enum Route { #[route("/")] Root {}, #[route("/test")] Test {}, } #[inline_props] fn Test(cx: Scope) -> Element { todo!() } #[inline_props] fn Root(cx: Scope) -> Element { render! { Link { target: Route::Test {}, id: "test_id", "Link" } } } let expected = format!( "

App

Link", href = r#"href="/test""#, default = r#"dioxus-prevent-default="onclick""#, class = r#"class="""#, id = r#"id="test_id""#, rel = r#"rel="""#, target = r#"target="""# ); assert_eq!(prepare::(), expected); } #[test] fn with_new_tab() { #[derive(Routable, Clone, Serialize, Deserialize)] enum Route { #[route("/")] Root {}, #[route("/test")] Test {}, } #[inline_props] fn Test(cx: Scope) -> Element { todo!() } #[inline_props] fn Root(cx: Scope) -> Element { render! { Link { target: Route::Test {}, new_tab: true, "Link" } } } let expected = format!( "

App

Link", href = r#"href="/test""#, default = r#"dioxus-prevent-default="""#, class = r#"class="""#, id = r#"id="""#, rel = r#"rel="""#, target = r#"target="_blank""# ); assert_eq!(prepare::(), expected); } #[test] fn with_new_tab_external() { #[derive(Routable, Clone, Serialize, Deserialize)] enum Route { #[route("/")] Root {}, } #[inline_props] fn Root(cx: Scope) -> Element { render! { Link { target: NavigationTarget::External("https://dioxuslabs.com/".into()), new_tab: true, "Link" } } } let expected = format!( "

App

Link", href = r#"href="https://dioxuslabs.com/""#, default = r#"dioxus-prevent-default="""#, class = r#"class="""#, id = r#"id="""#, rel = r#"rel="noopener noreferrer""#, target = r#"target="_blank""# ); assert_eq!(prepare::(), expected); } #[test] fn with_rel() { #[derive(Routable, Clone, Serialize, Deserialize)] enum Route { #[route("/")] Root {}, #[route("/test")] Test {}, } #[inline_props] fn Test(cx: Scope) -> Element { todo!() } #[inline_props] fn Root(cx: Scope) -> Element { render! { Link { target: Route::Test {}, rel: "test_rel", "Link" } } } let expected = format!( "

App

Link", href = r#"href="/test""#, default = r#"dioxus-prevent-default="onclick""#, class = r#"class="""#, id = r#"id="""#, rel = r#"rel="test_rel""#, target = r#"target="""# ); assert_eq!(prepare::(), expected); }