|
1 | 1 | (ns etaoin.api-test
|
2 | 2 | (:require
|
3 | 3 | [babashka.fs :as fs]
|
| 4 | + [babashka.process :as p] |
4 | 5 | [clojure.edn :as edn]
|
5 | 6 | [clojure.java.io :as io]
|
6 | 7 | [clojure.java.shell :as shell]
|
7 | 8 | [clojure.string :as str]
|
8 | 9 | [clojure.test :refer [deftest is testing use-fixtures]]
|
9 | 10 | [etaoin.api :as e]
|
10 | 11 | [etaoin.impl.util :as util]
|
| 12 | + [etaoin.impl.client :as client] |
11 | 13 | [etaoin.test-report :as test-report]
|
12 |
| - [slingshot.slingshot :refer [try+]])) |
| 14 | + [slingshot.slingshot :refer [try+]]) |
| 15 | + (:import [java.net ServerSocket])) |
13 | 16 |
|
14 | 17 | (defn numeric? [val]
|
15 | 18 | (or (instance? Double val)
|
|
49 | 52 |
|
50 | 53 | (def ^:dynamic *driver*)
|
51 | 54 |
|
| 55 | +(defn- find-available-port [] |
| 56 | + (with-open [sock (ServerSocket. 0)] |
| 57 | + (.getLocalPort sock))) |
| 58 | + |
| 59 | +(def ^:dynamic *test-server-port* nil) |
| 60 | + |
| 61 | +(defn test-server-url [path] |
| 62 | + (format "http://localhost:%d/%s" *test-server-port* path)) |
| 63 | + |
52 | 64 | ;; tests failed in safari 13.1.1 https://bugs.webkit.org/show_bug.cgi?id=202589 use STP newest
|
53 | 65 | (defn fixture-browsers [f]
|
54 |
| - (let [url (-> "html/test.html" io/resource str)] |
| 66 | + (let [url (test-server-url "test.html")] |
55 | 67 | (doseq [type drivers
|
56 | 68 | :let [opts (get default-opts type {})]]
|
57 | 69 | (e/with-driver type opts driver
|
|
70 | 82 | (println "Testing with browsers:" drivers)
|
71 | 83 | (f))
|
72 | 84 |
|
| 85 | +(defn test-server [f] |
| 86 | + (binding [*test-server-port* (find-available-port)] |
| 87 | + (let [proc (p/process {:out :inherit :err :inherit} |
| 88 | + "bb test-server --port" *test-server-port*)] |
| 89 | + (let [deadline (+ (System/currentTimeMillis) 15000) |
| 90 | + test-url (test-server-url "test.html") ] |
| 91 | + (loop [] |
| 92 | + (let [resp (try (client/http-request {:method :get :url test-url}) |
| 93 | + (catch Throwable _ :not-ready))] |
| 94 | + (when (= :not-ready resp) |
| 95 | + (if (< (System/currentTimeMillis) deadline) |
| 96 | + (do |
| 97 | + (println "- waiting for test-server to be ready at" test-url) |
| 98 | + (Thread/sleep 1000) |
| 99 | + (recur)) |
| 100 | + (throw (ex-info "Timed out waiting for ready test server" {})))))) |
| 101 | + (println "Test server ready")) |
| 102 | + (f) |
| 103 | + (p/destroy proc) |
| 104 | + @proc))) |
| 105 | + |
73 | 106 | (use-fixtures
|
74 | 107 | :once
|
75 |
| - report-browsers) |
| 108 | + report-browsers |
| 109 | + test-server) |
76 | 110 |
|
77 | 111 | (deftest test-visible
|
78 | 112 | (doto *driver*
|
|
268 | 302 | (deftest test-url
|
269 | 303 | (doto *driver*
|
270 | 304 | (-> e/get-url
|
271 |
| - (str/ends-with? "/resources/html/test.html") |
| 305 | + (str/ends-with? "/test.html") |
272 | 306 | is)))
|
273 | 307 |
|
274 | 308 | (deftest test-css-props
|
|
409 | 443 |
|
410 | 444 | (deftest test-drag-n-drop
|
411 | 445 | (is 1)
|
412 |
| - (let [url (-> "html/drag-n-drop/index.html" io/resource str) |
| 446 | + (let [url (test-server-url "drag-n-drop/index.html") |
413 | 447 | doc {:class :document}
|
414 | 448 | trash {:xpath "//div[contains(@class, 'trash')]"}]
|
415 | 449 | (doto *driver*
|
|
510 | 544 |
|
511 | 545 | (deftest test-cookies
|
512 | 546 | (testing "getting all cookies"
|
513 |
| - (let [cookies (e/get-cookies *driver*)] |
514 |
| - (e/when-safari *driver* |
515 |
| - ;; Safari Webdriver v16.4 added sameSite, we'll ignore it for now |
516 |
| - (let [cookies (map #(dissoc % :sameSite) cookies)] |
517 |
| - (is (= cookies |
518 |
| - [{:domain ".^filecookies^" |
519 |
| - :secure false |
520 |
| - :httpOnly false |
521 |
| - :value "test1" |
522 |
| - :path "/" |
523 |
| - :name "cookie1"} |
524 |
| - {:domain ".^filecookies^" |
525 |
| - :secure false |
526 |
| - :httpOnly false |
527 |
| - :value "test2" |
528 |
| - :path "/" |
529 |
| - :name "cookie2"}])))) |
530 |
| - (e/when-chrome *driver* |
531 |
| - (is (= cookies []))) |
532 |
| - (e/when-firefox *driver* |
533 |
| - ;; Firefox Webdriver added sameSite, we'll ignore it for now |
534 |
| - (let [cookies (map #(dissoc % :sameSite) cookies)] |
535 |
| - (is (= cookies [{:name "cookie1", |
536 |
| - :value "test1", |
537 |
| - :path "/", |
538 |
| - :domain "", |
539 |
| - :secure false, |
540 |
| - :httpOnly false} |
541 |
| - {:name "cookie2", |
542 |
| - :value "test2", |
543 |
| - :path "/", |
544 |
| - :domain "", |
545 |
| - :secure false, |
546 |
| - :httpOnly false}])))) |
547 |
| - (e/when-phantom *driver* |
548 |
| - (is (= cookies [{:domain "", |
549 |
| - :httponly false, |
550 |
| - :name "cookie2", |
551 |
| - :path "/", |
552 |
| - :secure false, |
553 |
| - :value "test2"} |
554 |
| - {:domain "", |
555 |
| - :httponly false, |
556 |
| - :name "cookie1", |
557 |
| - :path "/", |
558 |
| - :secure false, |
559 |
| - :value "test1"}]))))) |
| 547 | + (let [cookies (e/get-cookies *driver*) |
| 548 | + sorted-cookies (->> cookies |
| 549 | + (map #(dissoc % :sameSite)) ;; varies, maybe we don't care about this one |
| 550 | + (sort-by :name) ;; order varies we don't care |
| 551 | + )] |
| 552 | + (is (= sorted-cookies [{:domain "localhost" |
| 553 | + :httpOnly false |
| 554 | + :name "cookie1" |
| 555 | + :path "/" |
| 556 | + :secure false |
| 557 | + :value "test1"} |
| 558 | + {:domain "localhost" |
| 559 | + :httpOnly false |
| 560 | + :name "cookie2" |
| 561 | + :path "/" |
| 562 | + :secure false |
| 563 | + :value "test2"}])))) |
560 | 564 | (testing "getting a cookie"
|
561 |
| - (let [cookie (e/get-cookie *driver* :cookie2)] |
562 |
| - (e/when-safari *driver* |
563 |
| - ;; Safari Webdriver v16.4 added sameSite, we'll ignore it for now |
564 |
| - (let [cookie (dissoc cookie :sameSite)] |
565 |
| - (is (= cookie |
566 |
| - {:domain ".^filecookies^" |
567 |
| - :secure false |
568 |
| - :httpOnly false |
569 |
| - :value "test2" |
570 |
| - :path "/" |
571 |
| - :name "cookie2"})))) |
572 |
| - (e/when-chrome *driver* |
573 |
| - (is (nil? cookie))) |
574 |
| - (e/when-firefox *driver* |
575 |
| - ;; Firefox Webdriver added sameSite, we'll ignore it for now |
576 |
| - (let [cookie (dissoc cookie :sameSite)] |
577 |
| - (is (= cookie |
578 |
| - {:name "cookie2" |
579 |
| - :value "test2" |
580 |
| - :path "/" |
581 |
| - :domain "" |
582 |
| - :secure false |
583 |
| - :httpOnly false})))) |
584 |
| - (e/when-phantom *driver* |
585 |
| - (is (= cookie |
586 |
| - {:domain "" |
587 |
| - :httponly false |
588 |
| - :name "cookie2" |
589 |
| - :path "/" |
590 |
| - :secure false |
591 |
| - :value "test2"}))))) |
| 565 | + (let [cookie (e/get-cookie *driver* :cookie2) |
| 566 | + cookie (dissoc cookie :sameSite)] |
| 567 | + (is (= cookie {:domain "localhost" |
| 568 | + :httpOnly false |
| 569 | + :name "cookie2" |
| 570 | + :path "/" |
| 571 | + :secure false |
| 572 | + :value "test2"})))) |
592 | 573 | (testing "deleting a cookie"
|
593 | 574 | (e/when-not-phantom
|
594 | 575 | *driver*
|
|
653 | 634 | :bar [true nil "Hello"]})))))
|
654 | 635 |
|
655 | 636 | (deftest test-add-script
|
656 |
| - (let [js-url (-> "js/inject.js" io/resource |
657 |
| - fs/file .toURI .toURL ;; little extra dance here for bb on Windows, |
658 |
| - ;; otherwise slash after file: is ommitted and therefore invalid |
659 |
| - str)] |
| 637 | + (let [js-url (test-server-url "js/inject.js")] |
660 | 638 | (testing "adding a script"
|
661 | 639 | (e/add-script *driver* js-url)
|
662 | 640 | (e/wait 1)
|
|
712 | 690 | ["div" "b" "p" "span"])))))
|
713 | 691 |
|
714 | 692 | (deftest test-query-tree
|
715 |
| - (let [url (-> "html/test2.html" io/resource str) |
| 693 | + (let [url (test-server-url "test2.html") |
716 | 694 | _ (e/go *driver* url)
|
717 | 695 | all-div (e/query-tree *driver* {:tag :div})
|
718 | 696 | all-li (e/query-tree *driver* {:tag :li})
|
|
0 commit comments