link.rs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. use dioxus::prelude::*;
  2. use std::str::FromStr;
  3. fn prepare<R: Routable>() -> String
  4. where
  5. <R as FromStr>::Err: std::fmt::Display,
  6. {
  7. let mut vdom = VirtualDom::new_with_props(
  8. App,
  9. AppProps::<R> {
  10. phantom: std::marker::PhantomData,
  11. },
  12. );
  13. vdom.rebuild_in_place();
  14. return dioxus_ssr::render(&vdom);
  15. #[derive(Props)]
  16. struct AppProps<R: Routable> {
  17. phantom: std::marker::PhantomData<R>,
  18. }
  19. impl<R: Routable> Clone for AppProps<R> {
  20. fn clone(&self) -> Self {
  21. Self {
  22. phantom: std::marker::PhantomData,
  23. }
  24. }
  25. }
  26. impl<R: Routable> PartialEq for AppProps<R> {
  27. fn eq(&self, _other: &Self) -> bool {
  28. false
  29. }
  30. }
  31. #[allow(non_snake_case)]
  32. fn App<R: Routable>(_props: AppProps<R>) -> Element
  33. where
  34. <R as FromStr>::Err: std::fmt::Display,
  35. {
  36. rsx! {
  37. h1 { "App" }
  38. Router::<R> {
  39. config: || RouterConfig::default().history(MemoryHistory::default())
  40. }
  41. }
  42. }
  43. }
  44. #[test]
  45. fn href_internal() {
  46. #[derive(Routable, Clone)]
  47. enum Route {
  48. #[route("/")]
  49. Root {},
  50. #[route("/test")]
  51. Test {},
  52. }
  53. #[component]
  54. fn Test() -> Element {
  55. unimplemented!()
  56. }
  57. #[component]
  58. fn Root() -> Element {
  59. rsx! {
  60. Link {
  61. to: Route::Test {},
  62. "Link"
  63. }
  64. }
  65. }
  66. let expected = format!(
  67. "<h1>App</h1><a {href} {default}>Link</a>",
  68. href = r#"href="/test""#,
  69. default = r#"dioxus-prevent-default="onclick""#,
  70. );
  71. assert_eq!(prepare::<Route>(), expected);
  72. }
  73. #[test]
  74. fn href_external() {
  75. #[derive(Routable, Clone)]
  76. enum Route {
  77. #[route("/")]
  78. Root {},
  79. #[route("/test")]
  80. Test {},
  81. }
  82. #[component]
  83. fn Test() -> Element {
  84. unimplemented!()
  85. }
  86. #[component]
  87. fn Root() -> Element {
  88. rsx! {
  89. Link {
  90. to: "https://dioxuslabs.com/",
  91. "Link"
  92. }
  93. }
  94. }
  95. let expected = format!(
  96. "<h1>App</h1><a {href} {default} {rel}>Link</a>",
  97. href = r#"href="https://dioxuslabs.com/""#,
  98. default = r#"dioxus-prevent-default="""#,
  99. rel = r#"rel="noopener noreferrer""#,
  100. );
  101. assert_eq!(prepare::<Route>(), expected);
  102. }
  103. #[test]
  104. fn with_class() {
  105. #[derive(Routable, Clone)]
  106. enum Route {
  107. #[route("/")]
  108. Root {},
  109. #[route("/test")]
  110. Test {},
  111. }
  112. #[component]
  113. fn Test() -> Element {
  114. unimplemented!()
  115. }
  116. #[component]
  117. fn Root() -> Element {
  118. rsx! {
  119. Link {
  120. to: Route::Test {},
  121. class: "test_class",
  122. "Link"
  123. }
  124. }
  125. }
  126. let expected = format!(
  127. "<h1>App</h1><a {href} {default} {class}>Link</a>",
  128. href = r#"href="/test""#,
  129. default = r#"dioxus-prevent-default="onclick""#,
  130. class = r#"class="test_class""#,
  131. );
  132. assert_eq!(prepare::<Route>(), expected);
  133. }
  134. #[test]
  135. fn with_active_class_active() {
  136. #[derive(Routable, Clone)]
  137. enum Route {
  138. #[route("/")]
  139. Root {},
  140. }
  141. #[component]
  142. fn Root() -> Element {
  143. rsx! {
  144. Link {
  145. to: Route::Root {},
  146. active_class: "active_class".to_string(),
  147. class: "test_class",
  148. "Link"
  149. }
  150. }
  151. }
  152. let expected = format!(
  153. "<h1>App</h1><a {href} {default} {class} {aria}>Link</a>",
  154. href = r#"href="/""#,
  155. default = r#"dioxus-prevent-default="onclick""#,
  156. class = r#"class="test_class active_class""#,
  157. aria = r#"aria-current="page""#,
  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. }