From e9e3dc3896336f2ca7d44946f42652193cfd0dff Mon Sep 17 00:00:00 2001 From: Roman Volosovskyi Date: Mon, 18 Jul 2016 16:22:32 +0300 Subject: [PATCH] on boarding tests Former-commit-id: a0912230d4a293aa62c5105693babc5918b92fd0 --- env/dev/env/android_test/main.cljs | 21 +++++ figwheel-bridge.js | 8 +- project.clj | 42 +++++---- resources/commands.js | 16 +++- resources/status.js | 34 +++++++- run-osx.sh | 13 ++- src/status_im/android/core.cljs | 2 +- src/status_im/chat/handlers.cljs | 87 ++++++++++++------- src/status_im/chat/handlers/commands.cljs | 7 +- src/status_im/chat/sign_up.cljs | 77 ++++++++-------- src/status_im/chat/views/message.cljs | 4 - src/status_im/chat/views/request_message.cljs | 10 ++- src/status_im/components/toolbar.cljs | 3 +- src/status_im/constants.cljs | 2 +- src/status_im/handlers.cljs | 4 +- src/status_im/models/commands.cljs | 27 +++--- src/status_im/models/contacts.cljs | 11 ++- src/status_im/translations/en.cljs | 3 +- test/clj/status_im/appium.clj | 22 ++++- test/clj/status_im/console.clj | 46 ++++++++-- test/cljs/status_im/test/handlers_stubs.cljs | 25 ++++++ 21 files changed, 327 insertions(+), 137 deletions(-) create mode 100644 env/dev/env/android_test/main.cljs create mode 100644 test/cljs/status_im/test/handlers_stubs.cljs diff --git a/env/dev/env/android_test/main.cljs b/env/dev/env/android_test/main.cljs new file mode 100644 index 0000000000..b3b074ae0c --- /dev/null +++ b/env/dev/env/android_test/main.cljs @@ -0,0 +1,21 @@ +(ns ^:figwheel-no-load env.android-test.main + (:require [reagent.core :as r] + [status-im.android.core :as core] + [figwheel.client :as figwheel :include-macros true] + [status-im.test.handlers-stubs :refer [init-stubs]])) + +(enable-console-print!) + +(set! js/console.disableYellowBox true) + +(def cnt (r/atom 0)) +(defn reloader [] @cnt [core/app-root]) +(def root-el (r/as-element [reloader])) + +(figwheel/watch-and-reload + :websocket-url "ws://localhost:3449/figwheel-ws" + :heads-up-display false + :jsload-callback #(swap! cnt inc)) + +(core/init :test) +(init-stubs) diff --git a/figwheel-bridge.js b/figwheel-bridge.js index 2a7cb1cc2f..6a36687e4e 100644 --- a/figwheel-bridge.js +++ b/figwheel-bridge.js @@ -164,11 +164,17 @@ function loadApp(platform, devHost, onLoadCb) { // callback when app is ready to get the reloadable component var mainJs = '/env/' + platform + '/main.js'; + var mainTestJs = '/env/' + platform + '_test/main.js'; evalListeners.push(function (url) { if (url.indexOf(mainJs) > -1) { onLoadCb(env[platform].main.root_el); console.log('Done loading Clojure app'); } + + if (url.indexOf(mainTestJs) > -1) { + onLoadCb(env[platform + "_test"].main.root_el); + console.log('Done loading Clojure app'); + } }); if (typeof goog === "undefined") { @@ -287,4 +293,4 @@ self = { start: startApp }; -module.exports = self; \ No newline at end of file +module.exports = self; diff --git a/project.clj b/project.clj index ad95b36baa..4fe9b62f32 100644 --- a/project.clj +++ b/project.clj @@ -27,24 +27,30 @@ [io.appium/java-client "3.4.1"]] :plugins [[lein-doo "0.1.6"]] :source-paths ["src" "env/dev"] - :cljsbuild {:builds {:ios {:source-paths ["src" "env/dev"] - :figwheel true - :compiler {:output-to "target/ios/not-used.js" - :main "env.ios.main" - :output-dir "target/ios" - :optimizations :none}} - :android {:source-paths ["src" "env/dev"] - :figwheel true - :compiler {:output-to "target/android/not-used.js" - :main "env.android.main" - :output-dir "target/android" - :optimizations :none}} - :test {:source-paths ["src" "test/cljs"] - :compiler - {:main status-im.test.runner - :output-to "target/test/test.js" - :optimizations :none - :target :nodejs}}}} + :cljsbuild {:builds {:ios {:source-paths ["src" "env/dev"] + :figwheel true + :compiler {:output-to "target/ios/not-used.js" + :main "env.ios.main" + :output-dir "target/ios" + :optimizations :none}} + :android {:source-paths ["src" "env/dev"] + :figwheel true + :compiler {:output-to "target/android/not-used.js" + :main "env.android.main" + :output-dir "target/android" + :optimizations :none}} + :android-test {:source-paths ["src" "env/dev"] + :figwheel true + :compiler {:output-to "target/android/not-used.js" + :main "env.android-test.main" + :output-dir "target/android" + :optimizations :none}} + :test {:source-paths ["src" "test/cljs"] + :compiler + {:main status-im.test.runner + :output-to "target/test/test.js" + :optimizations :none + :target :nodejs}}}} :repl-options {:nrepl-middleware [cemerick.piggieback/wrap-cljs-repl]}} :prod {:cljsbuild {:builds {:ios {:source-paths ["src" "env/prod"] :compiler {:output-to "index.ios.js" diff --git a/resources/commands.js b/resources/commands.js index 26bb73f1e3..3aa4c07ef6 100644 --- a/resources/commands.js +++ b/resources/commands.js @@ -136,7 +136,7 @@ function phoneSuggestions(params) { return {markup: view}; } -status.response({ +var phoneConfig = { name: "phone", description: "Send phone number", color: "#5fc48d", @@ -158,7 +158,9 @@ status.response({ params: [params.value] }; } -}); +}; +status.response(phoneConfig); +status.command(phoneConfig); status.command({ name: "help", @@ -193,6 +195,16 @@ status.response({ event: "confirm-sign-up", params: [params.value] }; + }, + validator: function(params){ + if(!/^[\d]{4}$/.test(params.value)){ + var error = status.components.validationMessage( + "Confirmation code", + "Wrong format" + ); + + return {errors: [error]} + } } }); diff --git a/resources/status.js b/resources/status.js index dd7ac3c7ee..29cd5caf8a 100644 --- a/resources/status.js +++ b/resources/status.js @@ -56,7 +56,7 @@ function call(pathStr, paramsStr) { _status_catalog ); - if(!fn) { + if (!fn) { return null; } @@ -94,6 +94,35 @@ function webView(url) { }]; } +function validationMessage(titleText, descriptionText) { + var titleStyle = { + color: "white", + fontSize: 12, + fontFamily: "sans-serif" + }; + var title = status.components.text(titleStyle, titleText); + + var descriptionStyle = { + color: "white", + fontSize: 12, + fontFamily: "sans-serif", + opacity: 0.9 + }; + var description = status.components.text(descriptionStyle, descriptionText); + + var message = status.components.view( + { + backgroundColor: "red", + height: 61, + paddingLeft: 16, + paddingTop: 14, + }, + [title, description] + ); + + return message; +} + var status = { command: function (h) { var command = new Command(); @@ -118,6 +147,7 @@ var status = { image: image, touchable: touchable, scrollView: scrollView, - webView: webView + webView: webView, + validationMessage: validationMessage } }; diff --git a/run-osx.sh b/run-osx.sh index 64a86b653f..47346feb5a 100755 --- a/run-osx.sh +++ b/run-osx.sh @@ -37,6 +37,13 @@ else device_type="genymotion" fi +if [ ! -z $2 ] +then + cljs_build="$2" +else + cljs_build="android" +fi + if [ "$device_type" = "genymotion" ] then # Find Device based on Android version 6.0.0 @@ -50,7 +57,7 @@ fi lein voom build-deps && re-natal deps && re-natal use-android-device "${device_type}" && re-natal use-figwheel # open figwheel in new tab -tab "lein figwheel android" +tab "lein figwheel ${cljs_build}" # open react-native package in new tab tab "react-native start" @@ -62,9 +69,9 @@ adb reverse tcp:8081 tcp:8081 && adb reverse tcp:3449 tcp:3449 react-native run-android -if [ ! -z $2 ] +if [ ! -z $3 ] then tab "appium" lein test lein doo node test once -fi \ No newline at end of file +fi diff --git a/src/status_im/android/core.cljs b/src/status_im/android/core.cljs index a270318386..859d12dbeb 100644 --- a/src/status_im/android/core.cljs +++ b/src/status_im/android/core.cljs @@ -96,7 +96,7 @@ :login [login] :my-profile [my-profile])))}))) -(defn init [] +(defn init [& [env]] (dispatch-sync [:reset-app]) (dispatch [:initialize-crypt]) (dispatch [:initialize-geth]) diff --git a/src/status_im/chat/handlers.cljs b/src/status_im/chat/handlers.cljs index 57c3cd0908..0506fba958 100644 --- a/src/status_im/chat/handlers.cljs +++ b/src/status_im/chat/handlers.cljs @@ -18,13 +18,14 @@ [status-im.persistence.realm.core :as r] [status-im.handlers.server :as server] [status-im.handlers.content-suggestions :refer [get-content-suggestions]] - [status-im.utils.phone-number :refer [format-phone-number]] + [status-im.utils.phone-number :refer [format-phone-number + valid-mobile-number?]] [status-im.utils.datetime :as time] [status-im.components.react :refer [geth]] [status-im.components.jail :as j] [status-im.utils.types :refer [json->clj]] [status-im.commands.utils :refer [generate-hiccup]] - status-im.chat.handlers.commands + [status-im.chat.handlers.commands :refer [command-prefix]] status-im.chat.handlers.animation status-im.chat.handlers.requests status-im.chat.handlers.unviewed-messages)) @@ -76,37 +77,28 @@ (when-let [message-input (:message-input db)] (.blur message-input))))) -(defn update-text - [{:keys [current-chat-id] :as db} [_ text]] - (let [suggestions (get-in db [:command-suggestions current-chat-id])] - (if-not (= 1 (count suggestions)) - (update-input-text db text) - (assoc db :disable-input true)))) +(defn update-text [db [_ chat-id text]] + (assoc-in db [:chats chat-id :input-text] text)) (defn update-command [db [_ text]] (if-not (commands/get-chat-command db) (let [{:keys [command]} (suggestions/check-suggestion db text)] (if command - (commands/set-chat-command db command) + (commands/set-command-input db :commands command) db)) db)) (defn check-suggestions - [{:keys [current-chat-id] :as db} [_ text]] + [db [_ chat-id text]] (let [suggestions (suggestions/get-suggestions db text)] - (assoc-in db [:command-suggestions current-chat-id] suggestions))) + (assoc-in db [:command-suggestions chat-id] suggestions))) (defn select-suggestion! - [{:keys [current-chat-id] :as db} [_ text]] - (let [suggestions (get-in db [:command-suggestions current-chat-id])] - (when (= 1 (count suggestions)) - (dispatch [:set-chat-command (ffirst suggestions)])))) - -(register-handler :set-chat-input-text - [(enrich update-command) - (after select-suggestion!) - (after #(dispatch [:animate-command-suggestions]))] - ((enrich update-text) check-suggestions)) + [db [_ chat-id text]] + (let [suggestions (get-in db [:command-suggestions chat-id])] + (if (= 1 (count suggestions)) + (dispatch [:set-chat-command (ffirst suggestions)]) + (dispatch [::set-text chat-id text])))) (defn console? [s] (= "console" s)) @@ -114,6 +106,43 @@ (def not-console? (complement console?)) +(register-handler :set-chat-input-text + (u/side-effect! + (fn [{:keys [current-chat-id]} [_ text]] + (if (console? current-chat-id) + (dispatch [::check-input-for-commands text]) + (dispatch [::check-suggestions current-chat-id text]))))) + +(def possible-commands + {[:confirmation-code :responses] #(re-matches #"^[\d]{4}$" %) + [:phone :commands] valid-mobile-number?}) + +(defn check-text-for-commands [text] + (ffirst (filter (fn [[_ f]] (f text)) possible-commands))) + +(register-handler ::check-input-for-commands + (u/side-effect! + (fn [_ [_ text]] + (if-let [[_ type :as command] (check-text-for-commands text)] + (let [text' (if (= :commands type) + (str command-prefix text) + text)] + (dispatch [::stage-command-with-content command text'])) + (dispatch [::check-suggestions "console" text]))))) + +(register-handler ::stage-command-with-content + (u/side-effect! + (fn [_ [_ [command type] text]] + (dispatch [:set-chat-command command type]) + (dispatch [:set-chat-command-content text])))) + +(register-handler ::check-suggestions + [(after select-suggestion!) + (after #(dispatch [:animate-command-suggestions]))] + check-suggestions) + +(register-handler ::set-text update-text) + (defn check-author-direction [db chat-id {:keys [from outgoing] :as message}] (let [previous-message (first (get-in db [:chats chat-id :messages]))] @@ -165,7 +194,7 @@ :outgoing true :timestamp (time/now-ms)})] (if command - (commands/set-chat-command db command) + (commands/set-command-input db :commands command) (assoc db :new-message (when-not (str/blank? text) message))))) (defn prepare-command @@ -344,7 +373,7 @@ (defn store-message! [{:keys [new-message]} [_ {chat-id :from}]] - (messages/save-message chat-id new-message)) + (messages/save-message chat-id new-message)) (defn dispatch-request! [{:keys [new-message]} [_ {chat-id :from}]] @@ -448,16 +477,16 @@ (defn delete-messages! [{:keys [current-chat-id]} _] (r/write :account - (fn [] - (r/delete :account (r/get-by-field :account :msgs :chat-id current-chat-id))))) + (fn [] + (r/delete :account (r/get-by-field :account :msgs :chat-id current-chat-id))))) (defn delete-chat! [{:keys [current-chat-id]} _] (r/write :account - (fn [] :account - (->> (r/get-by-field :account :chats :chat-id current-chat-id) - (r/single) - (r/delete :account))))) + (fn [] :account + (->> (r/get-by-field :account :chats :chat-id current-chat-id) + (r/single) + (r/delete :account))))) (register-handler :leave-group-chat ;; todo oreder of operations tbd diff --git a/src/status_im/chat/handlers/commands.cljs b/src/status_im/chat/handlers/commands.cljs index 0cc27f12fc..e4a9c45bf8 100644 --- a/src/status_im/chat/handlers/commands.cljs +++ b/src/status_im/chat/handlers/commands.cljs @@ -139,9 +139,9 @@ (commands/unstage-command db staged-command))) (defn set-chat-command - [{:keys [current-chat-id] :as db} [_ command-key]] + [{:keys [current-chat-id] :as db} [_ command-key type]] (-> db - (commands/set-chat-command command-key) + (commands/set-command-input (or type :commands) command-key) (assoc-in [:chats current-chat-id :command-input :content] command-prefix) (assoc :disable-input true))) @@ -153,7 +153,7 @@ (defn set-response-command [db [_ to-msg-id command-key]] (-> db - (commands/set-response-chat-command to-msg-id command-key) + (commands/set-command-input :responses to-msg-id command-key) (assoc :canceled-command false))) (register-handler :set-response-chat-command @@ -163,6 +163,7 @@ set-response-command) (register-handler ::add-validation-errors + (after #(dispatch [:fix-response-height])) (fn [db [_ chat-id errors]] (assoc-in db [:custom-validation-errors chat-id] (map cu/generate-hiccup errors)))) diff --git a/src/status_im/chat/sign_up.cljs b/src/status_im/chat/sign_up.cljs index c60f6d2bce..c721c18b60 100644 --- a/src/status_im/chat/sign_up.cljs +++ b/src/status_im/chat/sign_up.cljs @@ -28,6 +28,37 @@ (s/put kv/kv-store :signed-up signed-up) (assoc db :signed-up signed-up)) +; todo fn name is not too smart, but... +(defn command-content + [command content] + {:command (name command) + :content content}) + +;; -- Send phone number ---------------------------------------- +(defn on-sign-up-response [& [message]] + (let [msg-id (random/id)] + (dispatch [:received-msg + {:msg-id msg-id + :content (command-content + :confirmation-code + (or message (label :t/confirmation-code))) + :content-type content-type-command-request + :outgoing false + :from "console" + :to "me"}]))) + +(defn handle-sms [{body :body}] + (when-let [matches (re-matches #"(\d{4})" body)] + (dispatch [:sign-up-confirm (second matches)]))) + +(defn start-listening-confirmation-code-sms [db] + (when (not (:confirmation-code-sms-listener db)) + (assoc db :confirmation-code-sms-listener (add-sms-listener handle-sms)))) + +(defn stop-listening-confirmation-code-sms [db] + (when-let [listener (:confirmation-code-sms-listener db)] + (remove-sms-listener listener) + (dissoc db :confirmation-code-sms-listener))) ;; -- Send confirmation code and synchronize contacts--------------------------- (defn on-sync-contacts [] @@ -52,43 +83,15 @@ :outgoing false :from "console" :to "me"}]) - (when (:confirmed body) - (dispatch [:stop-listening-confirmation-code-sms]) - (sync-contacts) - ;; TODO should be called after sync-contacts? - (dispatch [:set-signed-up true]))) - -; todo fn name is not too smart, but... -(defn command-content - [command content] - {:command (name command) - :content content}) - -;; -- Send phone number ---------------------------------------- -(defn on-sign-up-response [] - (let [msg-id (random/id)] - (dispatch [:received-msg - {:msg-id msg-id - :content (command-content - :confirmation-code - (label :t/confirmation-code)) - :content-type content-type-command-request - :outgoing false - :from "console" - :to "me"}]))) - -(defn handle-sms [{body :body}] - (when-let [matches (re-matches #"(\d{4})" body)] - (dispatch [:sign-up-confirm (second matches)]))) - -(defn start-listening-confirmation-code-sms [db] - (when (not (:confirmation-code-sms-listener db)) - (assoc db :confirmation-code-sms-listener (add-sms-listener handle-sms)))) - -(defn stop-listening-confirmation-code-sms [db] - (when-let [listener (:confirmation-code-sms-listener db)] - (remove-sms-listener listener) - (dissoc db :confirmation-code-sms-listener))) + (let [status (keyword (:status body))] + (when (= :confirmed status) + (do + (dispatch [:stop-listening-confirmation-code-sms]) + (sync-contacts) + ;; TODO should be called after sync-contacts? + (dispatch [:set-signed-up true]))) + (when (= :failed status) + (on-sign-up-response (label :t/incorrect-code))))) ;; -- Saving password ---------------------------------------- (defn save-password [password] diff --git a/src/status_im/chat/views/message.cljs b/src/status_im/chat/views/message.cljs index 3b9b27e3f5..58ceabe552 100644 --- a/src/status_im/chat/views/message.cljs +++ b/src/status_im/chat/views/message.cljs @@ -76,10 +76,6 @@ (defn set-chat-command [msg-id command] (dispatch [:set-response-chat-command msg-id (keyword (:name command))])) -(defn label [{:keys [command]}] - (->> (when command (name command)) - (str "request-"))) - (defn message-view [message content] [view (st/message-view message) diff --git a/src/status_im/chat/views/request_message.cljs b/src/status_im/chat/views/request_message.cljs index 2bbd4e11df..380c154d1e 100644 --- a/src/status_im/chat/views/request_message.cljs +++ b/src/status_im/chat/views/request_message.cljs @@ -15,9 +15,10 @@ (defn set-chat-command [msg-id command] (dispatch [:set-response-chat-command msg-id (keyword (:name command))])) -(defn label [{:keys [command]}] - (->> (name command) - (str "request-"))) +(defn label [command] + (when command + (->> (name (:name command)) + (str "request-")))) (def min-scale 1) (def max-scale 1.3) @@ -59,7 +60,8 @@ [touchable-highlight {:on-press (when-not @answered? #(set-chat-command msg-id command)) - :style st/command-request-image-touchable} + :style st/command-request-image-touchable + :accessibility-label (label command)} [animated-view {:style (st/command-request-image-view command scale-anim-val)} [image {:source {:uri (:icon command)} :style st/command-request-image}]]])}))) diff --git a/src/status_im/components/toolbar.cljs b/src/status_im/components/toolbar.cljs index 820b338b9c..d9e3c4bcb6 100644 --- a/src/status_im/components/toolbar.cljs +++ b/src/status_im/components/toolbar.cljs @@ -33,7 +33,8 @@ :alignItems :center :justifyContent :center} [image (:image nav-action)]]] - [touchable-highlight {:on-press #(dispatch [:navigate-back])} + [touchable-highlight {:on-press #(dispatch [:navigate-back]) + :accessibility-label :navigate-back} [view {:width 56 :height 56 :alignItems :center diff --git a/src/status_im/constants.cljs b/src/status_im/constants.cljs index 41460b6cc9..d01788d834 100644 --- a/src/status_im/constants.cljs +++ b/src/status_im/constants.cljs @@ -16,4 +16,4 @@ (def response-input-hiding-duration 100) (def response-suggesstion-resize-duration 100) -(def default-number-of-messages 5) +(def default-number-of-messages 20) diff --git a/src/status_im/handlers.cljs b/src/status_im/handlers.cljs index 84887faa34..cc3cc2fb1e 100644 --- a/src/status_im/handlers.cljs +++ b/src/status_im/handlers.cljs @@ -10,7 +10,6 @@ [status-im.utils.crypt :refer [gen-random-bytes]] [status-im.components.react :refer [geth]] [status-im.utils.handlers :refer [register-handler] :as u] - [status-im.models.protocol :as protocol] status-im.chat.handlers status-im.group-settings.handlers status-im.navigation.handlers @@ -57,8 +56,7 @@ (register-handler :initialize-db (fn [_ _] (realm/reset-account) - (assoc app-db - :user-identity nil))) + (assoc app-db :user-identity nil))) (register-handler :initialize-account-db (fn [db _] diff --git a/src/status_im/models/commands.cljs b/src/status_im/models/commands.cljs index d7380a04c4..41fb7a85e1 100644 --- a/src/status_im/models/commands.cljs +++ b/src/status_im/models/commands.cljs @@ -4,11 +4,9 @@ (defn get-commands [{:keys [current-chat-id] :as db}] (or (get-in db [:chats current-chat-id :commands]) {})) -(defn get-command [{:keys [current-chat-id] :as db} command-key] - ((or (->> (get-in db [:chats current-chat-id]) - ((juxt :commands :responses)) - (apply merge)) - {}) command-key)) +(defn get-response-or-command + [type {:keys [current-chat-id] :as db} command-key] + ((or (get-in db [:chats current-chat-id type]) {}) command-key)) (defn find-command [commands command-key] (first (filter #(= command-key (:command %)) commands))) @@ -25,16 +23,15 @@ [{:keys [current-chat-id] :as db}] (get-in db (db/chat-command-path current-chat-id))) -(defn set-response-chat-command - [{:keys [current-chat-id] :as db} msg-id command-key] - (update-in db [:chats current-chat-id :command-input] merge - {:content nil - :command (get-command db command-key) - :parameter-idx 0 - :to-msg-id msg-id})) - -(defn set-chat-command [db command-key] - (set-response-chat-command db nil command-key)) +(defn set-command-input + ([db type command-key] + (set-command-input db type nil command-key)) + ([{:keys [current-chat-id] :as db} type msg-id command-key] + (update-in db [:chats current-chat-id :command-input] merge + {:content nil + :command (get-response-or-command type db command-key) + :parameter-idx 0 + :to-msg-id msg-id}))) (defn get-chat-command-to-msg-id [{:keys [current-chat-id] :as db}] diff --git a/src/status_im/models/contacts.cljs b/src/status_im/models/contacts.cljs index d10904e789..e565e46546 100644 --- a/src/status_im/models/contacts.cljs +++ b/src/status_im/models/contacts.cljs @@ -10,10 +10,13 @@ r/collection->map)) (defn create-contact [{:keys [name photo-path whisper-identity] :as contact}] - (->> {:name (or name "") - :photo-path (or photo-path (identicon whisper-identity))} - (merge contact) - (r/create :account :contacts))) + (let [contact-from-db (r/get-one-by-field :account :contacts + :whisper-identity whisper-identity)] + (when-not contact-from-db + (->> {:name (or name "") + :photo-path (or photo-path (identicon whisper-identity))} + (merge contact) + (r/create :account :contacts))))) (defn save-contacts [contacts] (r/write :account #(mapv create-contact contacts))) diff --git a/src/status_im/translations/en.cljs b/src/status_im/translations/en.cljs index d96cb58eb8..8093e85814 100644 --- a/src/status_im/translations/en.cljs +++ b/src/status_im/translations/en.cljs @@ -34,6 +34,7 @@ :contacts-syncronized "Your contacts have been synchronized" :confirmation-code (str "Thanks! We've sent you a text message with a confirmation " "code. Please provide that code to confirm your phone number") + :incorrect-code (str "Sorry the code was incorrect, please enter again") :password-saved (str "OK great! Your password has been saved. Just to let you " "know you can always change it in the Console by the way " "it's me the Console nice to meet you!") @@ -127,7 +128,7 @@ :address-explication "Maybe here should be some text explaining what an address is and where to look for it" :enter-valid-address "Please enter a valid address or scan a QR code" :unknown-address "Unknown address" - + ;login :recover-access "Recover access" diff --git a/test/clj/status_im/appium.clj b/test/clj/status_im/appium.clj index d3a77bc435..40170acc9a 100644 --- a/test/clj/status_im/appium.clj +++ b/test/clj/status_im/appium.clj @@ -51,10 +51,18 @@ (defn xpath-by-text [text] (str ".//*[@text='" text "']")) +(defn click-by-text [driver text] + (let [elements (->> (xpath-by-text text) + (elements-by-xpath driver))] + (when (pos? (.size elements)) + (let [element (.get elements 0)] + (.click element))))) + (defn contains-text [driver text] - (is (= 1 (->> (xpath-by-text text) - (elements-by-xpath driver) - (.size))))) + (is (pos? (->> (xpath-by-text text) + (elements-by-xpath driver) + (.size))) + (format "Text \"%s\" was not found on screen." text))) (defn quit [driver] (.quit driver)) @@ -81,6 +89,14 @@ (let [sym (gensym)] `(deftest ~name (let [~sym (init)] + (click-by-text ~sym "Continue") ~@(for [[f & rest] body] `(~f ~sym ~@rest)) (quit ~sym))))) + +(defmacro defaction + [name parameters & body] + (let [session (gensym)] + `(defn ~name [~@(concat [session] parameters)] + ~@(for [[f & rest] body] + `(~f ~session ~@rest))))) diff --git a/test/clj/status_im/console.clj b/test/clj/status_im/console.clj index 5cdf17ae45..c375c3700d 100644 --- a/test/clj/status_im/console.clj +++ b/test/clj/status_im/console.clj @@ -7,9 +7,45 @@ " the exclamation mark or hit the icon to open the command " "list and choose the !phone command")) -(appium-test console-test - (click :request-keypair-password) - (write :command-input "123") - (click :stage-command) +(defaction send-sommand [] (click :send-message) - (contains-text message-text)) + (click :send-message)) + +(defaction respond-to-request + [request value] + (click (keyword (str "request-" (name request)))) + (write :input value) + (send-sommand)) + +(appium-test happy-case + (click :create-account) + (respond-to-request :keypair "123") + (contains-text message-text) + (respond-to-request :phone "+380671111111") + (respond-to-request :confirmation-code "1234") + (click :navigate-back) + (contains-text "Switch users")) + +(appium-test wrong-confirmation-code + (click :create-account) + (respond-to-request :keypair "123") + (respond-to-request :phone "+380671111111") + (respond-to-request :confirmation-code "432") + (contains-text "Wrong format") + (respond-to-request :confirmation-code "4321") + (contains-text "Wrong code!") + (write :input "1234") + (send-sommand) + (click :navigate-back) + (contains-text "Switch users")) + +(appium-test wrong-phone-number + (click :create-account) + (respond-to-request :keypair "123") + (respond-to-request :phone "+380671111111") + (write :input "+380671111112") + (send-sommand) + (write :input "1234") + (send-sommand) + (click :navigate-back) + (contains-text "Switch users")) diff --git a/test/cljs/status_im/test/handlers_stubs.cljs b/test/cljs/status_im/test/handlers_stubs.cljs new file mode 100644 index 0000000000..24c6f831ee --- /dev/null +++ b/test/cljs/status_im/test/handlers_stubs.cljs @@ -0,0 +1,25 @@ +(ns status-im.test.handlers-stubs + (:require [re-frame.core :refer [subscribe dispatch after]] + [status-im.utils.handlers :refer [register-handler]] + [status-im.utils.handlers :as u] + [status-im.chat.sign-up :as sign-up-service] + status-im.handlers)) + +(defn init-stubs [] + (register-handler :sign-up + (fn [] + (println :ohh) + ;; todo save phone number to db + (sign-up-service/on-sign-up-response))) + + (register-handler :sign-up-confirm + (u/side-effect! + (fn [_ [_ confirmation-code]] + (sign-up-service/on-send-code-response + (if (= "1234" confirmation-code) + {:message "Done!" + :status :confirmed + :confirmed true} + {:message "Wrong code!" + :status :failed + :confirmed false}))))))