iweb_test.ml 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. open Seppo_lib
  2. let test_scanf () =
  3. Scanf.sscanf "37s" "%is" (fun i -> i)
  4. |> Assrt.equals_int __LOC__ 37
  5. let test_regexp () =
  6. let rx = Str.regexp {|^[^\n\t ]\([^\n\t]+[^\n\t ]\)?$|} in
  7. assert (Str.string_match rx "a" 0);
  8. assert true
  9. let test_markup_xml () =
  10. [
  11. `Start_element (("", "foo"), []);
  12. `Start_element (("", "bar"), []);
  13. `Start_element (("", "baz"), []);
  14. `End_element;
  15. `End_element;
  16. `End_element;
  17. ]
  18. |> Markup.of_list |> Markup.pretty_print |> Markup.write_xml
  19. |> Markup.to_string
  20. |> Assrt.equals_string __LOC__ "<foo>\n <bar>\n <baz/>\n </bar>\n</foo>\n"
  21. let test_login () =
  22. Iweb.MyCookie.name |> Assrt.equals_string __LOC__ "#session";
  23. let tit = {|> U " h & ' u <|}
  24. and tok = "ff13e7eaf9541ca2ba30fd44e864c3ff014d2bc9"
  25. and ret = "retu"
  26. and att n v = (("", n), v)
  27. and elm name atts = `Start_element (("", name), atts) in
  28. [
  29. `Xml
  30. {
  31. Markup.version = "1.0";
  32. encoding = Some "utf-8";
  33. standalone = Some false;
  34. };
  35. `PI
  36. ("xml-stylesheet", "type='text/xsl' href='./themes/current/do=login.xsl'");
  37. `Comment
  38. "\n\
  39. \ must be compatible with \
  40. https://code.mro.name/mro/Shaarli-API-test/src/master/tests/test-post.sh\n\
  41. \ \
  42. https://code.mro.name/mro/ShaarliOS/src/1d124e012933d1209d64071a90237dc5ec6372fc/ios/ShaarliOS/API/ShaarliCmd.m#L386\n";
  43. elm "html" [ att "xmlns" "http://www.w3.org/1999/xhtml" ];
  44. elm "head" [];
  45. elm "title" [];
  46. `Text [ tit ];
  47. `End_element;
  48. `End_element;
  49. elm "body" [];
  50. elm "form" [ att "method" "post" ];
  51. elm "input" [ att "name" "login"; att "type" "text" ];
  52. `End_element;
  53. elm "input" [ att "name" "password"; att "type" "password" ];
  54. `End_element;
  55. elm "input" [ att "name" "longlastingsession"; att "type" "checkbox" ];
  56. `End_element;
  57. elm "input" [ att "name" "token"; att "type" "hidden"; att "value" tok ];
  58. `End_element;
  59. elm "input" [ att "name" "returnurl"; att "type" "hidden"; att "value" ret ];
  60. `End_element;
  61. elm "input" [ att "value" "Login"; att "type" "submit" ];
  62. `End_element;
  63. `End_element;
  64. `End_element;
  65. ]
  66. |> Markup.of_list |> Markup.pretty_print |> Markup.write_xml
  67. |> Markup.to_string |> String.length
  68. |> Assrt.equals_int __LOC__ 841
  69. let test_cookie () =
  70. Iweb.MyCookie.name |> Assrt.equals_string __LOC__ "#session";
  71. (match "(5:seppi25:2022-10-03T01:02:03+01:00)"
  72. |> Iweb.MyCookie.decode with
  73. | Ok (Auth.Uid uid, _t) ->
  74. uid |> Assrt.equals_string __LOC__ "seppi"
  75. | Error e -> e |> Assrt.equals_string __LOC__ "");
  76. (Auth.Uid "seppa", Ptime.epoch)
  77. |> Iweb.MyCookie.encode
  78. |> Assrt.equals_string __LOC__ "(5:seppa25:1970-01-01T00:00:00-00:00)";
  79. (match (Auth.Uid "seppu", Ptime.epoch)
  80. |> Iweb.MyCookie.encode
  81. |> Iweb.MyCookie.decode with
  82. | Ok (Auth.Uid uid, _t) ->
  83. uid |> Assrt.equals_string __LOC__ "seppu"
  84. | Error e -> e |> Assrt.equals_string __LOC__ "");
  85. assert true
  86. let test_csrf_token () =
  87. let fu () = () in
  88. let v = "f19a65cecdfa2971afb827bc9413eb7244e469a8" in
  89. let f = ([("token", [ v ])], ()) in
  90. match Iweb.check_token fu v f with
  91. | Ok (t, _) -> Assrt.equals_string __LOC__ v t
  92. | Error (s,_,_) ->
  93. s |> Cohttp.Code.code_of_status |> Assrt.equals_int __LOC__ 200
  94. let test_date () =
  95. let d x = x
  96. |> Option.value ~default:Iweb.Post.epoch_shaarli
  97. |> Ptime.to_rfc3339
  98. in
  99. "20230927_125036" |> Iweb.Post.s2d |> d |> Assrt.equals_string __LOC__ "2023-09-27T12:50:36-00:00"
  100. let test_bookmarklet () =
  101. let s = Option.value ~default:"" in
  102. let b s = if s then "yes" else "no" in
  103. let d s = s |> Option.value ~default:Ptime.min |> Ptime.to_rfc3339 in
  104. let u x = x |> Option.value ~default:Uri.empty |> Uri.to_string in
  105. let s' x= x in
  106. let l = String.concat " " in
  107. let now = ((2023,9,27),((14,45,42),2*60*60))
  108. |> Ptime.of_date_time in
  109. let emp = Iweb.Post.empty in
  110. let emp = {emp with dat = now} in
  111. let x = {|post=https%3A%2F%2Fwww.heise.de%2F&source=bookmarklet&scrape=no&title=heise+online+-+IT-News%2C+Nachrichten+und+Hintergr%C3%BCnde&tags=heise+online%2C+c%27t%2C+iX%2C+MIT+Technology+Review%2C+Newsticker%2C+Telepolis%2C+Security%2C+Netze&image=https%3A%2F%2Fheise.cloudimg.io%2Fbound%2F1200x1200%2Fq85.png-lossy-85.webp-lossy-85.foil1%2F_www-heise-de_%2Ficons%2Fho%2Fopengraph%2Fopengraph.png&description=News+und+Foren+zu+Computer%2C+IT%2C+Wissenschaft%2C+Medien+und+Politik.+Preisvergleich+von+Hardware+und+Software+sowie+Downloads+bei+Heise+Medien.|} in
  112. let r : Iweb.Post.t = x
  113. |> Uri.query_of_encoded
  114. |> List.fold_left Iweb.Post.sift_bookmarklet_get emp in
  115. r.scrape |> b |> Assrt.equals_string __LOC__ "yes";
  116. r.source |> s |> Assrt.equals_string __LOC__ "bookmarklet";
  117. r.dat |> d |> Assrt.equals_string __LOC__ "2023-09-27T12:45:42-00:00";
  118. r.url |> u |> Assrt.equals_string __LOC__ "https://www.heise.de/";
  119. r.tit |> s |> Assrt.equals_string __LOC__ "heise online - IT-News, Nachrichten und Hintergründe";
  120. r.dsc |> s |> Assrt.equals_string __LOC__ "News und Foren zu Computer, IT, Wissenschaft, Medien und Politik. Preisvergleich von Hardware und Software sowie Downloads bei Heise Medien.";
  121. r.tag |> l |> Assrt.equals_string __LOC__ "heise online, c't, iX, MIT Technology Review, Newsticker, Telepolis, Security, Netze";
  122. r.pri |> b |> Assrt.equals_string __LOC__ "no";
  123. assert (r.sav |> Option.is_none);
  124. r.can |> s |> Assrt.equals_string __LOC__ "";
  125. r.tok |> s'|> Assrt.equals_string __LOC__ "";
  126. r.ret |> u |> Assrt.equals_string __LOC__ "";
  127. r.img |> u |> Assrt.equals_string __LOC__ "https://heise.cloudimg.io/bound/1200x1200/q85.png-lossy-85.webp-lossy-85.foil1/_www-heise-de_/icons/ho/opengraph/opengraph.png";
  128. let x = {|post=Some #text 🐫|} in
  129. let r : Iweb.Post.t = x
  130. |> Uri.query_of_encoded
  131. |> List.fold_left Iweb.Post.sift_bookmarklet_get emp in
  132. r.scrape |> b |> Assrt.equals_string __LOC__ "no";
  133. r.source |> s |> Assrt.equals_string __LOC__ "";
  134. r.dat |> d |> Assrt.equals_string __LOC__ "2023-09-27T12:45:42-00:00";
  135. r.url |> u |> Assrt.equals_string __LOC__ "";
  136. r.tit |> s |> Assrt.equals_string __LOC__ "Some #text 🐫";
  137. r.dsc |> s |> Assrt.equals_string __LOC__ "";
  138. r.tag |> l |> Assrt.equals_string __LOC__ "";
  139. r.pri |> b |> Assrt.equals_string __LOC__ "no";
  140. assert (r.sav |> Option.is_none);
  141. r.can |> s |> Assrt.equals_string __LOC__ "";
  142. r.tok |> s'|> Assrt.equals_string __LOC__ "";
  143. r.ret |> u |> Assrt.equals_string __LOC__ "";
  144. r.img |> u |> Assrt.equals_string __LOC__ ""
  145. let test_post () =
  146. let x = "?lf_linkdate=20210913_134542&token=f19a65cecdfa2971afb827bc9413eb7244e469a8&returnurl=&lf_image=&lf_url=http://example.com&lf_title=title&lf_description=body%20%23tags&save_edit=Save" in
  147. let s = Option.value ~default:"" in
  148. let b s = if s then "yes" else "no" in
  149. let d s = s |> Option.value ~default:Iweb.Post.epoch_shaarli |> Ptime.to_rfc3339 in
  150. let u x = x |> Option.value ~default:Uri.empty |> Uri.to_string in
  151. let l = String.concat " " in
  152. let s' x = x in
  153. let r : Iweb.Post.t = x
  154. |> Uri.of_string
  155. |> Uri.query
  156. |> List.fold_left Iweb.Post.sift_post Iweb.Post.empty in
  157. r.scrape |> b |> Assrt.equals_string __LOC__ "no";
  158. r.source |> s |> Assrt.equals_string __LOC__ "";
  159. r.dat |> d |> Assrt.equals_string __LOC__ "2021-09-13T13:45:42-00:00";
  160. r.url |> u |> Assrt.equals_string __LOC__ "http://example.com";
  161. r.tit |> s |> Assrt.equals_string __LOC__ "title";
  162. r.dsc |> s |> Assrt.equals_string __LOC__ "body #tags";
  163. r.tag |> l |> Assrt.equals_string __LOC__ "";
  164. r.pri |> b |> Assrt.equals_string __LOC__ "no";
  165. (match r.sav with | Some Save -> "Save"| _ -> "Fail") |> Assrt.equals_string __LOC__ "Save";
  166. r.can |> s |> Assrt.equals_string __LOC__ "";
  167. r.tok |> s'|> Assrt.equals_string __LOC__ "f19a65cecdfa2971afb827bc9413eb7244e469a8";
  168. r.ret |> u |> Assrt.equals_string __LOC__ "";
  169. r.img |> u |> Assrt.equals_string __LOC__ ""
  170. module Actor = struct
  171. let test_basic () =
  172. Logr.info (fun m -> m "%s.%s" "Iweb.Actor" "basic");
  173. let s = {|token=68f4cf03-8f2d-491c-a954-bd8118f93c01&id=https%3A%2F%2Falpaka.social%2Fusers%2Ftraunstein&inbox=https%3A%2F%2Falpaka.social%2Fusers%2Ftraunstein%2Finbox&~notify=no&~subscribe=yes&~block=no&notify=on|} in
  174. let f = s |> Http.Form.of_string in
  175. f |> List.length |> Assrt.equals_int __LOC__ 7;
  176. f |> List.assoc "token" |> String.concat "|" |> Assrt.equals_string __LOC__ "68f4cf03-8f2d-491c-a954-bd8118f93c01";
  177. f |> List.assoc "id" |> String.concat "|" |> Assrt.equals_string __LOC__ "https://alpaka.social/users/traunstein";
  178. f |> List.assoc "inbox" |> String.concat "|" |> Assrt.equals_string __LOC__ "https://alpaka.social/users/traunstein/inbox";
  179. f |> List.assoc "~notify" |> String.concat "|" |> Assrt.equals_string __LOC__ "no";
  180. f |> List.assoc "~subscribe" |> String.concat "|" |> Assrt.equals_string __LOC__ "yes";
  181. f |> List.assoc "~block" |> String.concat "|" |> Assrt.equals_string __LOC__ "no";
  182. f |> List.assoc "notify" |> String.concat "|" |> Assrt.equals_string __LOC__ "on";
  183. let switch k v' v =
  184. if v' = v
  185. then None
  186. else (
  187. Logr.debug (fun m -> m "field %s: %s" k (v |> As2.No_p_yes.to_string));
  188. Some k) in
  189. let form_switch_folder k_of_old f_switch form init (k_old,v_old) =
  190. match k_old |> k_of_old with
  191. | None -> init
  192. | Some k ->
  193. let v = match form |> List.assoc_opt k with
  194. | None
  195. | Some ["no"] -> As2.No_p_yes.No
  196. | _ -> As2.No_p_yes.Yes in
  197. let v_old = match v_old with
  198. | ["no"] -> As2.No_p_yes.No
  199. | _ -> As2.No_p_yes.Yes in
  200. match f_switch k v_old v with
  201. | None -> init
  202. | Some x -> x :: init in
  203. f
  204. |> List.fold_left (form_switch_folder (St.after ~prefix:"~") switch f) []
  205. |> String.concat "|"
  206. |> Assrt.equals_string __LOC__ "subscribe|notify"
  207. end
  208. let () =
  209. Unix.chdir "../../../test/";
  210. test_scanf ();
  211. test_regexp ();
  212. test_markup_xml ();
  213. test_login ();
  214. test_cookie ();
  215. test_csrf_token ();
  216. test_date ();
  217. test_bookmarklet ();
  218. test_post ();
  219. Actor.test_basic ();
  220. assert true