template-function.test.ts 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. import {
  2. RENDER_ERROR,
  3. REQUEST_OBJECT_ERROR,
  4. METHOD,
  5. BASE_URL
  6. } from "../config/config";
  7. import { compile, stringify } from "../../src/main";
  8. import {
  9. e,
  10. eq,
  11. aeq,
  12. aeqe,
  13. createTestObj2,
  14. createTestObj3,
  15. createTestObj4
  16. } from "./functions";
  17. /**
  18. * Template function
  19. */
  20. describe("template function", () => {
  21. e(
  22. "",
  23. () =>
  24. compile(
  25. createTestObj2(
  26. `<button>Click</button>{{ "src":"/api/test", "method": "test", "after": "click:#increment" }}`
  27. )
  28. )(),
  29. `${REQUEST_OBJECT_ERROR}: The "${METHOD}" property has only GET, POST, PUT, PATCH or DELETE values`
  30. );
  31. e(
  32. "",
  33. () => compile(`{{ "src":"/api/test", "after": "click:#increment" }}`)(),
  34. `${RENDER_ERROR}: EventTarget is undefined`
  35. );
  36. e(
  37. "",
  38. () => compile(`{{ "src":"/api/test", "memo": true }}`)(),
  39. `${REQUEST_OBJECT_ERROR}: Memoization works in the enabled repetition mode`
  40. );
  41. e(
  42. "",
  43. () =>
  44. compile(
  45. createTestObj2(
  46. `<button>Click</button>{{ "src":"/api/test", "after": "click:#increment", "memo": true, "repeat": false }}`
  47. )
  48. )(),
  49. `${REQUEST_OBJECT_ERROR}: Memoization works in the enabled repetition mode`
  50. );
  51. e(
  52. "",
  53. () =>
  54. compile(
  55. createTestObj2(
  56. `<button>Click</button>{{ "src":"/api/test", "after":"click:#increment" }}`
  57. )
  58. )(),
  59. `${RENDER_ERROR}: Selectors nodes not found`
  60. );
  61. eq(
  62. "",
  63. compile(
  64. createTestObj2(
  65. `<button id="increment">Click</button>{{ "src":"/api/test", "after":"click:#increment" }}`
  66. ),
  67. { memo: true }
  68. )().response?.outerHTML,
  69. '<div><button id="increment">Click</button><!--hmpl0--></div>'
  70. );
  71. eq(
  72. "",
  73. compile(
  74. createTestObj2(
  75. `<button id="increment">Click</button>{{ "src":"/api/test", "after":"click:#increment", "repeat": false }}`
  76. ),
  77. { memo: true }
  78. )().response?.outerHTML,
  79. '<div><button id="increment">Click</button><!--hmpl0--></div>'
  80. );
  81. eq(
  82. "",
  83. compile(
  84. createTestObj2(
  85. `<button id="increment">Click</button>{{ "src":"/api/test", "after":"click:#increment", "memo": true }}`
  86. ),
  87. { memo: false }
  88. )().response?.outerHTML,
  89. '<div><button id="increment">Click</button><!--hmpl0--></div>'
  90. );
  91. eq(
  92. "",
  93. compile(
  94. createTestObj2(
  95. `<button id="increment">Click</button>{{ "src":"/api/test", "after":"click:#increment", "memo": true }}`
  96. ),
  97. { memo: false }
  98. )().response?.outerHTML,
  99. '<div><button id="increment">Click</button><!--hmpl0--></div>'
  100. );
  101. eq(
  102. "",
  103. compile(
  104. createTestObj2(
  105. `<button id="increment">Click</button>{{ "src":"/api/test", "after":"click:#increment", "memo": false }}`
  106. ),
  107. { memo: true }
  108. )().response?.outerHTML,
  109. '<div><button id="increment">Click</button><!--hmpl0--></div>'
  110. );
  111. eq(
  112. "",
  113. compile(createTestObj2(`{{ "src":"${BASE_URL}/api/test" }}`))().response
  114. ?.outerHTML,
  115. "<div><!--hmpl0--></div>"
  116. );
  117. eq(
  118. "",
  119. compile(
  120. createTestObj2(
  121. `<button id="increment">Click</button>{{ "src":"/api/test", "after":"click:#increment" }}`
  122. )
  123. )().response?.outerHTML,
  124. '<div><button id="increment">Click</button><!--hmpl0--></div>'
  125. );
  126. eq(
  127. "",
  128. compile(
  129. createTestObj2(
  130. `<button id="increment">Click</button>{{ "src":"/api/test", "after":"click:#increment" }}`
  131. )
  132. )({
  133. keepalive: true
  134. } as any).response?.outerHTML,
  135. '<div><button id="increment">Click</button><!--hmpl0--></div>'
  136. );
  137. aeq(
  138. createTestObj2(`{{ "src":"${BASE_URL}/api/test" }}`),
  139. (res, prop, value) => {
  140. switch (prop) {
  141. case "response":
  142. if (value?.outerHTML === `<div><div>123</div></div>`) {
  143. res(true);
  144. } else {
  145. res(false);
  146. }
  147. break;
  148. }
  149. }
  150. );
  151. const aeq0 = stringify({
  152. src: `${BASE_URL}/api/test`,
  153. indicators: [
  154. {
  155. trigger: "pending",
  156. content: "<p>Loading...</p>"
  157. }
  158. ]
  159. });
  160. aeq(createTestObj2(`{${aeq0}}`), (res, prop, value) => {
  161. switch (prop) {
  162. case "response":
  163. if (value?.outerHTML === `<div><p>Loading...</p></div>`) {
  164. res(true);
  165. } else {
  166. res(false);
  167. }
  168. break;
  169. }
  170. });
  171. aeq(
  172. createTestObj2(`{${aeq0}}`),
  173. (res, prop, value) => {
  174. switch (prop) {
  175. case "response":
  176. if (value?.outerHTML === `<div><p>Loading...</p></div>`) {
  177. res(true);
  178. } else {
  179. res(false);
  180. }
  181. break;
  182. }
  183. },
  184. {
  185. mode: "cors",
  186. cache: "no-cache",
  187. credentials: "same-origin",
  188. timeout: 4000,
  189. redirect: "follow",
  190. referrerPolicy: "no-referrer",
  191. headers: {
  192. "Cache-Control": "no-cache"
  193. }
  194. }
  195. );
  196. const aeq1 = stringify({
  197. src: `${BASE_URL}/api/test`,
  198. after: "click:#click"
  199. });
  200. aeqe(createTestObj3(`{${aeq1}}`), (res, prop, value) => {
  201. switch (prop) {
  202. case "response":
  203. if (
  204. value?.outerHTML ===
  205. `<div><button id="click">click</button><div>123</div></div>`
  206. ) {
  207. res(true);
  208. } else {
  209. res(false);
  210. }
  211. break;
  212. }
  213. });
  214. let memoItem: Element | undefined = undefined;
  215. aeqe(
  216. createTestObj3(`{${aeq1}}`),
  217. (res, prop, value) => {
  218. switch (prop) {
  219. case "response":
  220. if (
  221. value?.outerHTML ===
  222. `<div><button id="click">click</button><div>123</div></div>`
  223. ) {
  224. if (!memoItem) {
  225. memoItem = value;
  226. } else {
  227. res(memoItem.childNodes[1] === value.childNodes[1]);
  228. }
  229. } else {
  230. res(false);
  231. }
  232. break;
  233. }
  234. },
  235. {
  236. memo: true
  237. },
  238. {},
  239. {},
  240. 2
  241. );
  242. let memoItem1: Element | undefined = undefined;
  243. aeqe(
  244. createTestObj3(`{${aeq1}}`),
  245. (res, prop, value) => {
  246. switch (prop) {
  247. case "response":
  248. if (
  249. value?.outerHTML ===
  250. `<div><button id="click">click</button><div>123</div></div>`
  251. ) {
  252. if (!memoItem1) {
  253. memoItem1 = value;
  254. } else {
  255. // this is false
  256. res(memoItem1.childNodes[1] === value.childNodes[1]);
  257. }
  258. } else {
  259. res(false);
  260. }
  261. break;
  262. }
  263. },
  264. {},
  265. {},
  266. {},
  267. 2
  268. );
  269. let memoItem2: Element | undefined = undefined;
  270. const aeq2 = stringify({
  271. src: `${BASE_URL}/api/test`,
  272. after: "click:#click",
  273. indicators: [
  274. {
  275. trigger: "pending",
  276. content: "<p>Loading...</p>"
  277. }
  278. ]
  279. });
  280. aeqe(
  281. createTestObj3(`{${aeq2}}`),
  282. (res, prop, value) => {
  283. switch (prop) {
  284. case "response":
  285. if (
  286. value?.outerHTML ===
  287. `<div><button id="click">click</button><div>123</div></div>`
  288. ) {
  289. if (!memoItem2) {
  290. memoItem2 = value;
  291. } else {
  292. res(memoItem2.childNodes[1] === value.childNodes[1]);
  293. }
  294. }
  295. break;
  296. }
  297. },
  298. {},
  299. {},
  300. {},
  301. 2
  302. );
  303. aeqe(
  304. createTestObj3(`{${aeq2}}`),
  305. (res, prop, value) => {
  306. switch (prop) {
  307. case "response":
  308. if (
  309. value?.outerHTML ===
  310. `<div><button id="click">click</button><div>123</div></div>`
  311. ) {
  312. if (!memoItem2) {
  313. memoItem2 = value;
  314. } else {
  315. res(memoItem2.childNodes[1] !== value.childNodes[1]);
  316. }
  317. }
  318. break;
  319. }
  320. },
  321. {
  322. memo: true
  323. },
  324. {},
  325. {},
  326. 2
  327. );
  328. aeqe(
  329. createTestObj3(`{${aeq2}}`),
  330. (res, prop, value) => {
  331. switch (prop) {
  332. case "response":
  333. if (
  334. value?.outerHTML ===
  335. `<div><button id="click">click</button><div>123</div></div>`
  336. ) {
  337. if (!memoItem2) {
  338. memoItem2 = value;
  339. } else {
  340. res(memoItem2.childNodes[1] !== value.childNodes[1]);
  341. }
  342. }
  343. break;
  344. }
  345. },
  346. {
  347. memo: true
  348. },
  349. {},
  350. {},
  351. 2
  352. );
  353. const aeq3 = stringify({
  354. src: `${BASE_URL}/api/getFormComponent`,
  355. after: "submit:#form",
  356. method: "post"
  357. });
  358. aeqe(
  359. createTestObj4(`{${aeq3}}`),
  360. (res, prop, value) => {
  361. switch (prop) {
  362. case "response":
  363. if (
  364. value?.outerHTML ===
  365. `<div><form onsubmit="function prevent(e){e.preventDefault();};return prevent(event);" id="form"></form><div>123</div></div>`
  366. ) {
  367. res(true);
  368. } else {
  369. res(false);
  370. }
  371. break;
  372. }
  373. },
  374. {
  375. autoBody: true
  376. },
  377. {},
  378. {
  379. route: "/api/getFormComponent",
  380. method: "post"
  381. },
  382. 1,
  383. (el) => {
  384. return el?.getElementsByTagName("form")?.[0];
  385. },
  386. "submit"
  387. );
  388. });