link.rs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. #![allow(non_snake_case)]
  2. use dioxus::prelude::*;
  3. use dioxus_router::prelude::*;
  4. use std::str::FromStr;
  5. fn prepare<R: Routable>() -> String
  6. where
  7. <R as FromStr>::Err: std::fmt::Display,
  8. {
  9. let mut vdom = VirtualDom::new_with_props(
  10. App,
  11. AppProps::<R> {
  12. phantom: std::marker::PhantomData,
  13. },
  14. );
  15. let _ = vdom.rebuild();
  16. return dioxus_ssr::render(&vdom);
  17. #[derive(Props)]
  18. struct AppProps<R: Routable> {
  19. phantom: std::marker::PhantomData<R>,
  20. }
  21. impl<R: Routable> PartialEq for AppProps<R> {
  22. fn eq(&self, _other: &Self) -> bool {
  23. false
  24. }
  25. }
  26. fn App<R: Routable>(cx: Scope<AppProps<R>>) -> Element
  27. where
  28. <R as FromStr>::Err: std::fmt::Display,
  29. {
  30. render! {
  31. h1 { "App" }
  32. GenericRouter::<R> {
  33. config: RouterConfiguration {
  34. history: Box::<MemoryHistory::<R>>::default(),
  35. ..Default::default()
  36. }
  37. }
  38. }
  39. }
  40. }
  41. #[test]
  42. fn href_internal() {
  43. #[derive(Routable, Clone)]
  44. enum Route {
  45. #[route("/")]
  46. Root {},
  47. #[route("/test")]
  48. Test {},
  49. }
  50. #[inline_props]
  51. fn Test(cx: Scope) -> Element {
  52. todo!()
  53. }
  54. #[inline_props]
  55. fn Root(cx: Scope) -> Element {
  56. render! {
  57. Link {
  58. target: Route::Test {},
  59. "Link"
  60. }
  61. }
  62. }
  63. let expected = format!(
  64. "<h1>App</h1><a {href} {default} {class} {id} {rel} {target}>Link</a>",
  65. href = r#"href="/test""#,
  66. default = r#"dioxus-prevent-default="onclick""#,
  67. class = r#"class="""#,
  68. id = r#"id="""#,
  69. rel = r#"rel="""#,
  70. target = r#"target="""#
  71. );
  72. assert_eq!(prepare::<Route>(), expected);
  73. }
  74. #[test]
  75. fn href_external() {
  76. #[derive(Routable, Clone)]
  77. enum Route {
  78. #[route("/")]
  79. Root {},
  80. #[route("/test")]
  81. Test {},
  82. }
  83. #[inline_props]
  84. fn Test(cx: Scope) -> Element {
  85. todo!()
  86. }
  87. #[inline_props]
  88. fn Root(cx: Scope) -> Element {
  89. render! {
  90. Link {
  91. target: "https://dioxuslabs.com/",
  92. "Link"
  93. }
  94. }
  95. }
  96. let expected = format!(
  97. "<h1>App</h1><a {href} {default} {class} {id} {rel} {target}>Link</a>",
  98. href = r#"href="https://dioxuslabs.com/""#,
  99. default = r#"dioxus-prevent-default="""#,
  100. class = r#"class="""#,
  101. id = r#"id="""#,
  102. rel = r#"rel="noopener noreferrer""#,
  103. target = r#"target="""#
  104. );
  105. assert_eq!(prepare::<Route>(), expected);
  106. }
  107. #[test]
  108. fn with_class() {
  109. #[derive(Routable, Clone)]
  110. enum Route {
  111. #[route("/")]
  112. Root {},
  113. #[route("/test")]
  114. Test {},
  115. }
  116. #[inline_props]
  117. fn Test(cx: Scope) -> Element {
  118. todo!()
  119. }
  120. #[inline_props]
  121. fn Root(cx: Scope) -> Element {
  122. render! {
  123. Link {
  124. target: Route::Test {},
  125. class: "test_class",
  126. "Link"
  127. }
  128. }
  129. }
  130. let expected = format!(
  131. "<h1>App</h1><a {href} {default} {class} {id} {rel} {target}>Link</a>",
  132. href = r#"href="/test""#,
  133. default = r#"dioxus-prevent-default="onclick""#,
  134. class = r#"class="test_class""#,
  135. id = r#"id="""#,
  136. rel = r#"rel="""#,
  137. target = r#"target="""#
  138. );
  139. assert_eq!(prepare::<Route>(), expected);
  140. }
  141. #[test]
  142. fn with_active_class_active() {
  143. #[derive(Routable, Clone)]
  144. enum Route {
  145. #[route("/")]
  146. Root {},
  147. }
  148. #[inline_props]
  149. fn Root(cx: Scope) -> Element {
  150. render! {
  151. Link {
  152. target: "/",
  153. active_class: "active_class",
  154. class: "test_class",
  155. "Link"
  156. }
  157. }
  158. }
  159. let expected = format!(
  160. "<h1>App</h1><a {href} {default} {class} {id} {rel} {target}>Link</a>",
  161. href = r#"href="/""#,
  162. default = r#"dioxus-prevent-default="onclick""#,
  163. class = r#"class="test_class active_class""#,
  164. id = r#"id="""#,
  165. rel = r#"rel="""#,
  166. target = r#"target="""#
  167. );
  168. assert_eq!(prepare::<Route>(), expected);
  169. }
  170. #[test]
  171. fn with_active_class_inactive() {
  172. #[derive(Routable, Clone)]
  173. enum Route {
  174. #[route("/")]
  175. Root {},
  176. #[route("/test")]
  177. Test {},
  178. }
  179. #[inline_props]
  180. fn Test(cx: Scope) -> Element {
  181. todo!()
  182. }
  183. #[inline_props]
  184. fn Root(cx: Scope) -> Element {
  185. render! {
  186. Link {
  187. target: Route::Test {},
  188. active_class: "active_class",
  189. class: "test_class",
  190. "Link"
  191. }
  192. }
  193. }
  194. let expected = format!(
  195. "<h1>App</h1><a {href} {default} {class} {id} {rel} {target}>Link</a>",
  196. href = r#"href="/test""#,
  197. default = r#"dioxus-prevent-default="onclick""#,
  198. class = r#"class="test_class""#,
  199. id = r#"id="""#,
  200. rel = r#"rel="""#,
  201. target = r#"target="""#
  202. );
  203. assert_eq!(prepare::<Route>(), expected);
  204. }
  205. #[test]
  206. fn with_id() {
  207. #[derive(Routable, Clone)]
  208. enum Route {
  209. #[route("/")]
  210. Root {},
  211. #[route("/test")]
  212. Test {},
  213. }
  214. #[inline_props]
  215. fn Test(cx: Scope) -> Element {
  216. todo!()
  217. }
  218. #[inline_props]
  219. fn Root(cx: Scope) -> Element {
  220. render! {
  221. Link {
  222. target: Route::Test {},
  223. id: "test_id",
  224. "Link"
  225. }
  226. }
  227. }
  228. let expected = format!(
  229. "<h1>App</h1><a {href} {default} {class} {id} {rel} {target}>Link</a>",
  230. href = r#"href="/test""#,
  231. default = r#"dioxus-prevent-default="onclick""#,
  232. class = r#"class="""#,
  233. id = r#"id="test_id""#,
  234. rel = r#"rel="""#,
  235. target = r#"target="""#
  236. );
  237. assert_eq!(prepare::<Route>(), expected);
  238. }
  239. #[test]
  240. fn with_new_tab() {
  241. #[derive(Routable, Clone)]
  242. enum Route {
  243. #[route("/")]
  244. Root {},
  245. #[route("/test")]
  246. Test {},
  247. }
  248. #[inline_props]
  249. fn Test(cx: Scope) -> Element {
  250. todo!()
  251. }
  252. #[inline_props]
  253. fn Root(cx: Scope) -> Element {
  254. render! {
  255. Link {
  256. target: Route::Test {},
  257. new_tab: true,
  258. "Link"
  259. }
  260. }
  261. }
  262. let expected = format!(
  263. "<h1>App</h1><a {href} {default} {class} {id} {rel} {target}>Link</a>",
  264. href = r#"href="/test""#,
  265. default = r#"dioxus-prevent-default="""#,
  266. class = r#"class="""#,
  267. id = r#"id="""#,
  268. rel = r#"rel="""#,
  269. target = r#"target="_blank""#
  270. );
  271. assert_eq!(prepare::<Route>(), expected);
  272. }
  273. #[test]
  274. fn with_new_tab_external() {
  275. #[derive(Routable, Clone)]
  276. enum Route {
  277. #[route("/")]
  278. Root {},
  279. }
  280. #[inline_props]
  281. fn Root(cx: Scope) -> Element {
  282. render! {
  283. Link {
  284. target: "https://dioxuslabs.com/",
  285. new_tab: true,
  286. "Link"
  287. }
  288. }
  289. }
  290. let expected = format!(
  291. "<h1>App</h1><a {href} {default} {class} {id} {rel} {target}>Link</a>",
  292. href = r#"href="https://dioxuslabs.com/""#,
  293. default = r#"dioxus-prevent-default="""#,
  294. class = r#"class="""#,
  295. id = r#"id="""#,
  296. rel = r#"rel="noopener noreferrer""#,
  297. target = r#"target="_blank""#
  298. );
  299. assert_eq!(prepare::<Route>(), expected);
  300. }
  301. #[test]
  302. fn with_rel() {
  303. #[derive(Routable, Clone)]
  304. enum Route {
  305. #[route("/")]
  306. Root {},
  307. #[route("/test")]
  308. Test {},
  309. }
  310. #[inline_props]
  311. fn Test(cx: Scope) -> Element {
  312. todo!()
  313. }
  314. #[inline_props]
  315. fn Root(cx: Scope) -> Element {
  316. render! {
  317. Link {
  318. target: Route::Test {},
  319. rel: "test_rel",
  320. "Link"
  321. }
  322. }
  323. }
  324. let expected = format!(
  325. "<h1>App</h1><a {href} {default} {class} {id} {rel} {target}>Link</a>",
  326. href = r#"href="/test""#,
  327. default = r#"dioxus-prevent-default="onclick""#,
  328. class = r#"class="""#,
  329. id = r#"id="""#,
  330. rel = r#"rel="test_rel""#,
  331. target = r#"target="""#
  332. );
  333. assert_eq!(prepare::<Route>(), expected);
  334. }