link.rs 7.3 KB

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