link.rs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. use dioxus::prelude::*;
  2. use dioxus_router::prelude::*;
  3. fn prepare(link: Component) -> String {
  4. #![allow(non_snake_case)]
  5. let mut vdom = VirtualDom::new_with_props(App, AppProps { link });
  6. let _ = vdom.rebuild();
  7. return dioxus_ssr::render(&vdom);
  8. #[derive(Props)]
  9. struct AppProps {
  10. link: Component,
  11. }
  12. impl PartialEq for AppProps {
  13. fn eq(&self, other: &Self) -> bool {
  14. false
  15. }
  16. }
  17. fn App(cx: Scope<AppProps>) -> Element {
  18. use_router(
  19. cx,
  20. &|| RouterConfiguration {
  21. synchronous: true,
  22. ..Default::default()
  23. },
  24. &|| Segment::content(comp(cx.props.link)),
  25. );
  26. render! {
  27. h1 { "App" }
  28. Outlet { }
  29. }
  30. }
  31. }
  32. #[test]
  33. fn href_internal() {
  34. fn content(cx: Scope) -> Element {
  35. render! {
  36. Link {
  37. target: "/test",
  38. "Link"
  39. }
  40. }
  41. }
  42. let expected = format!(
  43. "<h1>App</h1><a {href} {default} {class} {id} {rel} {target}>Link</a>",
  44. href = r#"href="/test""#,
  45. default = r#"dioxus-prevent-default="onclick""#,
  46. class = r#"class="""#,
  47. id = r#"id="""#,
  48. rel = r#"rel="""#,
  49. target = r#"target="""#
  50. );
  51. assert_eq!(prepare(content), expected);
  52. }
  53. #[test]
  54. fn href_named() {
  55. fn content(cx: Scope) -> Element {
  56. render! {
  57. Link {
  58. target: named::<RootIndex>(),
  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="/""#,
  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(content), expected);
  73. }
  74. #[test]
  75. fn href_external() {
  76. fn content(cx: Scope) -> Element {
  77. render! {
  78. Link {
  79. target: "https://dioxuslabs.com/",
  80. "Link"
  81. }
  82. }
  83. }
  84. let expected = format!(
  85. "<h1>App</h1><a {href} {default} {class} {id} {rel} {target}>Link</a>",
  86. href = r#"href="https://dioxuslabs.com/""#,
  87. default = r#"dioxus-prevent-default="""#,
  88. class = r#"class="""#,
  89. id = r#"id="""#,
  90. rel = r#"rel="noopener noreferrer""#,
  91. target = r#"target="""#
  92. );
  93. assert_eq!(prepare(content), expected);
  94. }
  95. #[test]
  96. fn with_class() {
  97. fn content(cx: Scope) -> Element {
  98. render! {
  99. Link {
  100. target: "/test",
  101. class: "test_class",
  102. "Link"
  103. }
  104. }
  105. }
  106. let expected = format!(
  107. "<h1>App</h1><a {href} {default} {class} {id} {rel} {target}>Link</a>",
  108. href = r#"href="/test""#,
  109. default = r#"dioxus-prevent-default="onclick""#,
  110. class = r#"class="test_class""#,
  111. id = r#"id="""#,
  112. rel = r#"rel="""#,
  113. target = r#"target="""#
  114. );
  115. assert_eq!(prepare(content), expected);
  116. }
  117. #[test]
  118. fn with_active_class_active() {
  119. fn content(cx: Scope) -> Element {
  120. render! {
  121. Link {
  122. target: "/",
  123. active_class: "active_class",
  124. class: "test_class",
  125. "Link"
  126. }
  127. }
  128. }
  129. let expected = format!(
  130. "<h1>App</h1><a {href} {default} {class} {id} {rel} {target}>Link</a>",
  131. href = r#"href="/""#,
  132. default = r#"dioxus-prevent-default="onclick""#,
  133. class = r#"class="test_class active_class""#,
  134. id = r#"id="""#,
  135. rel = r#"rel="""#,
  136. target = r#"target="""#
  137. );
  138. assert_eq!(prepare(content), expected);
  139. }
  140. #[test]
  141. fn with_active_class_inactive() {
  142. fn content(cx: Scope) -> Element {
  143. render! {
  144. Link {
  145. target: "/test",
  146. active_class: "active_class",
  147. class: "test_class",
  148. "Link"
  149. }
  150. }
  151. }
  152. let expected = format!(
  153. "<h1>App</h1><a {href} {default} {class} {id} {rel} {target}>Link</a>",
  154. href = r#"href="/test""#,
  155. default = r#"dioxus-prevent-default="onclick""#,
  156. class = r#"class="test_class""#,
  157. id = r#"id="""#,
  158. rel = r#"rel="""#,
  159. target = r#"target="""#
  160. );
  161. assert_eq!(prepare(content), expected);
  162. }
  163. #[test]
  164. fn with_id() {
  165. fn content(cx: Scope) -> Element {
  166. render! {
  167. Link {
  168. target: "/test",
  169. id: "test_id",
  170. "Link"
  171. }
  172. }
  173. }
  174. let expected = format!(
  175. "<h1>App</h1><a {href} {default} {class} {id} {rel} {target}>Link</a>",
  176. href = r#"href="/test""#,
  177. default = r#"dioxus-prevent-default="onclick""#,
  178. class = r#"class="""#,
  179. id = r#"id="test_id""#,
  180. rel = r#"rel="""#,
  181. target = r#"target="""#
  182. );
  183. assert_eq!(prepare(content), expected);
  184. }
  185. #[test]
  186. fn with_new_tab() {
  187. fn content(cx: Scope) -> Element {
  188. render! {
  189. Link {
  190. target: "/test",
  191. new_tab: true,
  192. "Link"
  193. }
  194. }
  195. }
  196. let expected = format!(
  197. "<h1>App</h1><a {href} {default} {class} {id} {rel} {target}>Link</a>",
  198. href = r#"href="/test""#,
  199. default = r#"dioxus-prevent-default="""#,
  200. class = r#"class="""#,
  201. id = r#"id="""#,
  202. rel = r#"rel="""#,
  203. target = r#"target="_blank""#
  204. );
  205. assert_eq!(prepare(content), expected);
  206. }
  207. #[test]
  208. fn with_new_tab_external() {
  209. fn content(cx: Scope) -> Element {
  210. render! {
  211. Link {
  212. target: "https://dioxuslabs.com/",
  213. new_tab: true,
  214. "Link"
  215. }
  216. }
  217. }
  218. let expected = format!(
  219. "<h1>App</h1><a {href} {default} {class} {id} {rel} {target}>Link</a>",
  220. href = r#"href="https://dioxuslabs.com/""#,
  221. default = r#"dioxus-prevent-default="""#,
  222. class = r#"class="""#,
  223. id = r#"id="""#,
  224. rel = r#"rel="noopener noreferrer""#,
  225. target = r#"target="_blank""#
  226. );
  227. assert_eq!(prepare(content), expected);
  228. }
  229. #[test]
  230. fn with_rel() {
  231. fn content(cx: Scope) -> Element {
  232. render! {
  233. Link {
  234. target: "/test",
  235. rel: "test_rel",
  236. "Link"
  237. }
  238. }
  239. }
  240. let expected = format!(
  241. "<h1>App</h1><a {href} {default} {class} {id} {rel} {target}>Link</a>",
  242. href = r#"href="/test""#,
  243. default = r#"dioxus-prevent-default="onclick""#,
  244. class = r#"class="""#,
  245. id = r#"id="""#,
  246. rel = r#"rel="test_rel""#,
  247. target = r#"target="""#
  248. );
  249. assert_eq!(prepare(content), expected);
  250. }