link.rs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  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}>Link</a>",
  154. href = r#"href="/""#,
  155. default = r#"dioxus-prevent-default="onclick""#,
  156. class = r#"class="test_class active_class""#,
  157. );
  158. assert_eq!(prepare::<Route>(), expected);
  159. }
  160. #[test]
  161. fn with_active_class_inactive() {
  162. #[derive(Routable, Clone)]
  163. enum Route {
  164. #[route("/")]
  165. Root {},
  166. #[route("/test")]
  167. Test {},
  168. }
  169. #[component]
  170. fn Test() -> Element {
  171. unimplemented!()
  172. }
  173. #[component]
  174. fn Root() -> Element {
  175. rsx! {
  176. Link {
  177. to: Route::Test {},
  178. active_class: "active_class".to_string(),
  179. class: "test_class",
  180. "Link"
  181. }
  182. }
  183. }
  184. let expected = format!(
  185. "<h1>App</h1><a {href} {default} {class}>Link</a>",
  186. href = r#"href="/test""#,
  187. default = r#"dioxus-prevent-default="onclick""#,
  188. class = r#"class="test_class""#,
  189. );
  190. assert_eq!(prepare::<Route>(), expected);
  191. }
  192. #[test]
  193. fn with_id() {
  194. #[derive(Routable, Clone)]
  195. enum Route {
  196. #[route("/")]
  197. Root {},
  198. #[route("/test")]
  199. Test {},
  200. }
  201. #[component]
  202. fn Test() -> Element {
  203. unimplemented!()
  204. }
  205. #[component]
  206. fn Root() -> Element {
  207. rsx! {
  208. Link {
  209. to: Route::Test {},
  210. id: "test_id",
  211. "Link"
  212. }
  213. }
  214. }
  215. let expected = format!(
  216. "<h1>App</h1><a {href} {default} {id}>Link</a>",
  217. href = r#"href="/test""#,
  218. default = r#"dioxus-prevent-default="onclick""#,
  219. id = r#"id="test_id""#,
  220. );
  221. assert_eq!(prepare::<Route>(), expected);
  222. }
  223. #[test]
  224. fn with_new_tab() {
  225. #[derive(Routable, Clone)]
  226. enum Route {
  227. #[route("/")]
  228. Root {},
  229. #[route("/test")]
  230. Test {},
  231. }
  232. #[component]
  233. fn Test() -> Element {
  234. unimplemented!()
  235. }
  236. #[component]
  237. fn Root() -> Element {
  238. rsx! {
  239. Link {
  240. to: Route::Test {},
  241. new_tab: true,
  242. "Link"
  243. }
  244. }
  245. }
  246. let expected = format!(
  247. "<h1>App</h1><a {href} {default} {target}>Link</a>",
  248. href = r#"href="/test""#,
  249. default = r#"dioxus-prevent-default="""#,
  250. target = r#"target="_blank""#
  251. );
  252. assert_eq!(prepare::<Route>(), expected);
  253. }
  254. #[test]
  255. fn with_new_tab_external() {
  256. #[derive(Routable, Clone)]
  257. enum Route {
  258. #[route("/")]
  259. Root {},
  260. }
  261. #[component]
  262. fn Root() -> Element {
  263. rsx! {
  264. Link {
  265. to: "https://dioxuslabs.com/",
  266. new_tab: true,
  267. "Link"
  268. }
  269. }
  270. }
  271. let expected = format!(
  272. "<h1>App</h1><a {href} {default} {rel} {target}>Link</a>",
  273. href = r#"href="https://dioxuslabs.com/""#,
  274. default = r#"dioxus-prevent-default="""#,
  275. rel = r#"rel="noopener noreferrer""#,
  276. target = r#"target="_blank""#
  277. );
  278. assert_eq!(prepare::<Route>(), expected);
  279. }
  280. #[test]
  281. fn with_rel() {
  282. #[derive(Routable, Clone)]
  283. enum Route {
  284. #[route("/")]
  285. Root {},
  286. #[route("/test")]
  287. Test {},
  288. }
  289. #[component]
  290. fn Test() -> Element {
  291. unimplemented!()
  292. }
  293. #[component]
  294. fn Root() -> Element {
  295. rsx! {
  296. Link {
  297. to: Route::Test {},
  298. rel: "test_rel".to_string(),
  299. "Link"
  300. }
  301. }
  302. }
  303. let expected = format!(
  304. "<h1>App</h1><a {href} {default} {rel}>Link</a>",
  305. href = r#"href="/test""#,
  306. default = r#"dioxus-prevent-default="onclick""#,
  307. rel = r#"rel="test_rel""#,
  308. );
  309. assert_eq!(prepare::<Route>(), expected);
  310. }