diff --git a/src/status_im/integration_test.cljs b/src/status_im/integration_test.cljs deleted file mode 100644 index 5228622cbc38..000000000000 --- a/src/status_im/integration_test.cljs +++ /dev/null @@ -1,261 +0,0 @@ -(ns status-im.integration-test - (:require - [cljs.test :refer [deftest is]] - [clojure.string :as string] - [day8.re-frame.test :as rf-test] - [native-module.core :as native-module] - [re-frame.core :as rf] - status-im.events - [status-im.multiaccounts.logout.core :as logout] - status-im.subs.root ; so integration tests can run independently - [status-im.transport.core :as transport] - [status-im.utils.test :as utils.test] - [status-im2.constants :as constants] - status-im2.events - status-im2.navigation.core - status-im2.subs.root ; so integration tests can run independently - [taoensso.timbre :as log])) - -(def password "testabc") - -(def community {:membership 1 :name "foo" :description "bar"}) - -(def account-name "account-abc") - -(utils.test/init!) - -(defn initialize-app! - [] - (rf/dispatch [:app-started])) - -(defn create-multiaccount! - [] - (rf/dispatch [:profile.create/create-and-login - {:display-name account-name :password password :color "blue"}])) - -(defn assert-app-initialized - [] - (let [app-state @(rf/subscribe [:app-state])] - (is (= "active" app-state)))) - -(defn messenger-started - [] - @(rf/subscribe [:messenger/started?])) - -(defn assert-messenger-started - [] - (is (messenger-started))) - -(defn assert-community-created - [] - (is (= @(rf/subscribe [:communities/create]) community))) - -(defn create-new-account! - [] - (rf/dispatch-sync [:wallet-legacy.accounts/start-adding-new-account {:type :generate}]) - (rf/dispatch-sync [:set-in [:add-account :account :name] account-name]) - (rf/dispatch [:wallet-legacy.accounts/add-new-account (native-module/sha3 password)])) - -(defn assert-new-account-created - [] - (is (true? (some #(= (:name %) account-name) - @(rf/subscribe [:profile/wallet-accounts]))))) - -(defn logout! - [] - (rf/dispatch [:logout])) - -(deftest initialize-app-test - (log/info "========= initialize-app-test ==================") - (rf-test/run-test-async - (rf/dispatch [:app-started]) - (rf-test/wait-for - ;; use initialize-view because it has the longest avg. time and - ;; is dispatched by initialize-multiaccounts (last non-view event) - [:profile/get-profiles-overview-success] - (assert-app-initialized)))) - -(deftest create-account-test - (log/info "====== create-account-test ==================") - (rf-test/run-test-async - (initialize-app!) ; initialize app - (rf-test/wait-for - [:profile/get-profiles-overview-success] - (create-multiaccount!) ; create a multiaccount - (rf-test/wait-for ; wait for login - [::transport/messenger-started] - (assert-messenger-started) - (logout!) - (rf-test/wait-for [::logout/logout-method]))))) - -(deftest create-community-test - (log/info "====== create-community-test ==================") - (rf-test/run-test-async - (initialize-app!) ; initialize app - (rf-test/wait-for - [:profile/get-profiles-overview-success] - (create-multiaccount!) ; create a multiaccount - (rf-test/wait-for ; wait for login - [::transport/messenger-started] - (assert-messenger-started) - (rf/dispatch-sync [:legacy-only-for-e2e/open-create-community]) - (doseq [[k v] (dissoc community :membership)] - (rf/dispatch-sync [:status-im.communities.core/create-field k v])) - (rf/dispatch [:status-im.communities.core/create-confirmation-pressed]) - (rf-test/wait-for - [:status-im.communities.core/community-created] - (assert-community-created) - (logout!) - (rf-test/wait-for [::logout/logout-method])))))) - -(deftest create-wallet-account-test - (log/info "====== create-wallet-account-test ==================") - (rf-test/run-test-async - (initialize-app!) - (rf-test/wait-for - [:profile/get-profiles-overview-success] - (create-multiaccount!) ; create a multiaccount - (rf-test/wait-for ; wait for login - [::transport/messenger-started] - (assert-messenger-started) - (create-new-account!) ; create a new account - (rf-test/wait-for - [:wallet-legacy.accounts/account-stored] - (assert-new-account-created) ; assert account was created - (logout!) - (rf-test/wait-for [::logout/logout-method])))))) - -(deftest back-up-seed-phrase-test - (log/info "========= back-up-seed-phrase-test ==================") - (rf-test/run-test-async - (initialize-app!) - (rf-test/wait-for - [:profile/get-profiles-overview-success] - (create-multiaccount!) - (rf-test/wait-for - [::transport/messenger-started] - (assert-messenger-started) - (rf/dispatch-sync [:set-in [:my-profile/seed :step] :12-words]) ; display seed phrase to user - (rf/dispatch-sync [:my-profile/enter-two-random-words]) ; begin prompting user for seed words - (let [{:keys [mnemonic]} @(rf/subscribe [:profile/profile]) - seed @(rf/subscribe [:my-profile/seed]) - word1 (second (:first-word seed)) - word2 (second (:second-word seed))] - (is (= 12 (count (string/split mnemonic #" ")))) ; assert 12-word seed phrase - (rf/dispatch-sync [:set-in [:my-profile/seed :word] word1]) - (rf/dispatch-sync [:my-profile/set-step :second-word]) - (rf/dispatch-sync [:set-in [:my-profile/seed :word] word2]) - ;; TODO: refactor (defn next-handler) & (defn enter-word) to improve test coverage? - (rf/dispatch [:my-profile/finish]) - (rf-test/wait-for - [:my-profile/finish-success] - (is (nil? @(rf/subscribe [:mnemonic]))) ; assert seed phrase has been removed - (logout!) - (rf-test/wait-for [::logout/logout-method]))))))) - -(def multiaccount-name "Narrow Frail Lemming") -(def multiaccount-mnemonic - "tattoo ramp health green tongue universe style vapor become tape lava reason") -(def multiaccount-key-uid "0x694b8229524820a3a00a6e211141561d61b251ad99d6b65daf82a73c9a57697b") - -(def chat-id - "0x0402905bed83f0bbf993cee8239012ccb1a8bc86907ead834c1e38476a0eda71414eed0e25f525f270592a2eebb01c9119a4ed6429ba114e51f5cb0a28dae1adfd") - -(deftest one-to-one-chat-test - (log/info "========= one-to-one-chat-test ==================") - (rf-test/run-test-async - (initialize-app!) - (rf-test/wait-for - [:profile/get-profiles-overview-success] - (create-multiaccount!) - (rf-test/wait-for - [::transport/messenger-started] - (assert-messenger-started) - (rf/dispatch-sync [:chat.ui/start-chat chat-id]) ;; start a new chat - (rf-test/wait-for - [:chat/one-to-one-chat-created] - (rf/dispatch-sync [:chat/navigate-to-chat chat-id]) - (is (= chat-id @(rf/subscribe [:chats/current-chat-id]))) - (logout!) - (rf-test/wait-for [::logout/logout-method])))))) - -(deftest delete-chat-test - (log/info "========= delete-chat-test ==================") - (rf-test/run-test-async - (initialize-app!) - (rf-test/wait-for - [:profile/get-profiles-overview-success] - (create-multiaccount!) - (rf-test/wait-for - [::transport/messenger-started] - (assert-messenger-started) - (rf/dispatch-sync [:chat.ui/start-chat chat-id]) ;; start a new chat - (rf-test/wait-for - [:chat/one-to-one-chat-created] - (rf/dispatch-sync [:chat/navigate-to-chat chat-id]) - (is (= chat-id @(rf/subscribe [:chats/current-chat-id]))) - (is @(rf/subscribe [:chats/chat chat-id])) - (rf/dispatch-sync [:chat.ui/show-remove-confirmation chat-id]) - (rf/dispatch-sync [:chat.ui/remove-chat chat-id]) - (logout!) - (rf-test/wait-for [::logout/logout-method])))))) - -(deftest mute-chat-test - (log/info "========= mute-chat-test ==================") - (rf-test/run-test-async - (initialize-app!) - (rf-test/wait-for - [:profile/get-profiles-overview-success] - (create-multiaccount!) - (rf-test/wait-for - [::transport/messenger-started] - (assert-messenger-started) - (rf/dispatch-sync [:chat.ui/start-chat chat-id]) ;; start a new chat - (rf-test/wait-for - [:chat/one-to-one-chat-created] - (rf/dispatch-sync [:chat/navigate-to-chat chat-id]) - (is (= chat-id @(rf/subscribe [:chats/current-chat-id]))) - (is @(rf/subscribe [:chats/chat chat-id])) - (rf/dispatch-sync [:chat.ui/mute chat-id true constants/mute-till-unmuted]) - (rf-test/wait-for - [:chat/mute-successfully] - (is @(rf/subscribe [:chats/muted chat-id])) - (rf/dispatch-sync [:chat.ui/mute chat-id false]) - (rf-test/wait-for - [:chat/mute-successfully] - (is (not @(rf/subscribe [:chats/muted chat-id]))) - (logout!) - (rf-test/wait-for [::logout/logout-method])))))))) - -(deftest add-contact-test - (log/info "========= add-contact-test ==================") - (let - [compressed-key "zQ3shWj4WaBdf2zYKCkXe6PHxDxNTzZyid1i75879Ue9cX9gA" - public-key - "0x048a6773339d11ccf5fd81677b7e54daeec544a1287bd92b725047ad6faa9a9b9f8ea86ed5a226d2a994f5f46d0b43321fd8de7b7997a166e67905c8c73cd37cea" - primary-name "zQ3...9cX9gA"] - (rf-test/run-test-async - (initialize-app!) - (rf-test/wait-for - [:profile/get-profiles-overview-success] - (create-multiaccount!) - (rf-test/wait-for - [::transport/messenger-started] - (assert-messenger-started) - ;; search for contact using compressed key - (rf/dispatch [:contacts/set-new-identity compressed-key]) - (rf-test/wait-for - [:contacts/set-new-identity-success] - (let [new-identity @(rf/subscribe [:contacts/new-identity])] - (is (= public-key (:public-key new-identity))) - (is (= :valid (:state new-identity)))) - ;; click 'view profile' button - (rf/dispatch [:chat.ui/show-profile public-key]) - (rf-test/wait-for - [:contacts/build-contact] - (rf-test/wait-for - [:contacts/contact-built] - (let [contact @(rf/subscribe [:contacts/current-contact])] - (is (= primary-name (:primary-name contact)))) - (logout!) - (rf-test/wait-for [::logout/logout-method]))))))))) diff --git a/src/status_im/test_runner.cljs b/src/status_im/test_runner.cljs index 3d0242e116b7..ee6f89c0be6e 100644 --- a/src/status_im/test_runner.cljs +++ b/src/status_im/test_runner.cljs @@ -5,8 +5,10 @@ [clojure.string :as string] [shadow.test :as st] [shadow.test.env :as env] + status-im.subs.root status-im2.setup.i18n-resources [status-im2.setup.interceptors :as interceptors] + status-im2.subs.root [utils.re-frame :as rf])) (defonce repl? (atom false)) diff --git a/src/status_im2/integration_test/chat.cljs b/src/status_im2/integration_test/chat.cljs new file mode 100644 index 000000000000..1b819ecfd94c --- /dev/null +++ b/src/status_im2/integration_test/chat.cljs @@ -0,0 +1,96 @@ +(ns status-im2.integration-test.chat + (:require + [cljs.test :refer [deftest is]] + [day8.re-frame.test :as rf-test] + [re-frame.core :as rf] + status-im.events + [status-im.multiaccounts.logout.core :as logout] + status-im.subs.root + [status-im2.constants :as constants] + status-im2.events + status-im2.navigation.core + status-im2.subs.root + [test-helpers.integration :as h])) + +(def chat-id + "0x0402905bed83f0bbf993cee8239012ccb1a8bc86907ead834c1e38476a0eda71414eed0e25f525f270592a2eebb01c9119a4ed6429ba114e51f5cb0a28dae1adfd") + +(deftest one-to-one-chat-test + (h/log-headline one-to-one-chat-test) + (rf-test/run-test-async + (h/with-app-initialized + (h/with-account + (rf/dispatch-sync [:chat.ui/start-chat chat-id]) ;; start a new chat + (rf-test/wait-for + [:chat/one-to-one-chat-created] + (rf/dispatch-sync [:chat/navigate-to-chat chat-id]) + (is (= chat-id @(rf/subscribe [:chats/current-chat-id]))) + (h/logout) + (rf-test/wait-for [::logout/logout-method])))))) + +(deftest delete-chat-test + (h/log-headline :delete-chat-test) + (rf-test/run-test-async + (h/with-app-initialized + (h/with-account + (rf/dispatch-sync [:chat.ui/start-chat chat-id]) ;; start a new chat + (rf-test/wait-for + [:chat/one-to-one-chat-created] + (rf/dispatch-sync [:chat/navigate-to-chat chat-id]) + (is (= chat-id @(rf/subscribe [:chats/current-chat-id]))) + (is @(rf/subscribe [:chats/chat chat-id])) + (rf/dispatch-sync [:chat.ui/show-remove-confirmation chat-id]) + (rf/dispatch-sync [:chat.ui/remove-chat chat-id]) + (h/logout) + (rf-test/wait-for [::logout/logout-method])))))) + +(deftest mute-chat-test + (h/log-headline :mute-chat-test) + (rf-test/run-test-async + (h/with-app-initialized + (h/with-account + (rf/dispatch-sync [:chat.ui/start-chat chat-id]) ;; start a new chat + (rf-test/wait-for + [:chat/one-to-one-chat-created] + (rf/dispatch-sync [:chat/navigate-to-chat chat-id]) + (is (= chat-id @(rf/subscribe [:chats/current-chat-id]))) + (is @(rf/subscribe [:chats/chat chat-id])) + (rf/dispatch-sync [:chat.ui/mute chat-id true constants/mute-till-unmuted]) + (rf-test/wait-for + [:chat/mute-successfully] + (is @(rf/subscribe [:chats/muted chat-id])) + (rf/dispatch-sync [:chat.ui/mute chat-id false]) + (rf-test/wait-for + [:chat/mute-successfully] + (is (not @(rf/subscribe [:chats/muted chat-id]))) + (h/logout) + (rf-test/wait-for [::logout/logout-method])))))))) + +(deftest add-contact-test + (h/log-headline :add-contact-test) + (let + [compressed-key "zQ3shWj4WaBdf2zYKCkXe6PHxDxNTzZyid1i75879Ue9cX9gA" + public-key (str "0x048a6773339d11ccf5fd81677b7e54daeec544a1287" + "bd92b725047ad6faa9a9b9f8ea86ed5a226d2a994f5f4" + "6d0b43321fd8de7b7997a166e67905c8c73cd37cea") + primary-name "zQ3...9cX9gA"] + (rf-test/run-test-async + (h/with-app-initialized + (h/with-account + ;; search for contact using compressed key + (rf/dispatch [:contacts/set-new-identity compressed-key]) + (rf-test/wait-for + [:contacts/set-new-identity-success] + (let [new-identity @(rf/subscribe [:contacts/new-identity])] + (is (= public-key (:public-key new-identity))) + (is (= :valid (:state new-identity)))) + ;; click 'view profile' button + (rf/dispatch [:chat.ui/show-profile public-key]) + (rf-test/wait-for + [:contacts/build-contact] + (rf-test/wait-for + [:contacts/contact-built] + (let [contact @(rf/subscribe [:contacts/current-contact])] + (is (= primary-name (:primary-name contact)))) + (h/logout) + (rf-test/wait-for [::logout/logout-method]))))))))) diff --git a/src/status_im2/integration_test/community.cljs b/src/status_im2/integration_test/community.cljs new file mode 100644 index 000000000000..999c9d822003 --- /dev/null +++ b/src/status_im2/integration_test/community.cljs @@ -0,0 +1,22 @@ +(ns status-im2.integration-test.community + (:require [cljs.test :refer [deftest]] + [day8.re-frame.test :as rf-test] + [re-frame.core :as rf] + [status-im.multiaccounts.logout.core :as logout] + [status-im2.integration-test.constants :as constants] + [test-helpers.integration :as h])) + +(deftest create-community-test + (h/log-headline :create-community-test) + (rf-test/run-test-async + (h/with-app-initialized + (h/with-account + (rf/dispatch-sync [:legacy-only-for-e2e/open-create-community]) + (doseq [[k v] (dissoc constants/community :membership)] + (rf/dispatch-sync [:status-im.communities.core/create-field k v])) + (rf/dispatch [:status-im.communities.core/create-confirmation-pressed]) + (rf-test/wait-for + [:status-im.communities.core/community-created] + (h/assert-community-created) + (h/logout) + (rf-test/wait-for [::logout/logout-method])))))) diff --git a/src/status_im2/integration_test/constants.cljs b/src/status_im2/integration_test/constants.cljs new file mode 100644 index 000000000000..373b227f5c41 --- /dev/null +++ b/src/status_im2/integration_test/constants.cljs @@ -0,0 +1,7 @@ +(ns status-im2.integration-test.constants) + +(def password "testabc") + +(def community {:membership 1 :name "foo" :description "bar"}) + +(def account-name "account-abc") diff --git a/src/status_im2/integration_test/core.cljs b/src/status_im2/integration_test/core.cljs new file mode 100644 index 000000000000..33fa768d6492 --- /dev/null +++ b/src/status_im2/integration_test/core.cljs @@ -0,0 +1,37 @@ +(ns status-im2.integration-test.core + (:require + [cljs.test :refer [deftest]] + [day8.re-frame.test :as rf-test] + [re-frame.core :as rf] + status-im.events + [status-im.multiaccounts.logout.core :as logout] + status-im.subs.root + [status-im.utils.test :as utils.test] + status-im2.events + status-im2.integration-test.chat + status-im2.integration-test.wallet + status-im2.navigation.core + status-im2.subs.root + [test-helpers.integration :as h])) + +(utils.test/init!) + +(deftest initialize-app-test + (h/log-headline :initialize-app-test) + (rf-test/run-test-async + (rf/dispatch [:app-started]) + (rf-test/wait-for + ;; use initialize-view because it has the longest avg. time and + ;; is dispatched by initialize-multiaccounts (last non-view event) + [:profile/get-profiles-overview-success] + (rf-test/wait-for + [:font/init-font-file-for-initials-avatar] + (h/assert-app-initialized))))) + +(deftest create-account-test + (h/log-headline :create-account-test) + (rf-test/run-test-async + (h/with-app-initialized + (h/with-account + (h/logout) + (rf-test/wait-for [::logout/logout-method]))))) diff --git a/src/status_im2/integration_test/wallet.cljs b/src/status_im2/integration_test/wallet.cljs new file mode 100644 index 000000000000..8ea0193532fe --- /dev/null +++ b/src/status_im2/integration_test/wallet.cljs @@ -0,0 +1,47 @@ +(ns status-im2.integration-test.wallet + (:require + [cljs.test :refer [deftest is]] + [clojure.string :as string] + [day8.re-frame.test :as rf-test] + [re-frame.core :as rf] + status-im.events + [status-im.multiaccounts.logout.core :as logout] + status-im.subs.root + status-im2.events + status-im2.navigation.core + status-im2.subs.root + [test-helpers.integration :as h])) + +(deftest create-wallet-account-test + (h/log-headline :create-wallet-account-test) + (rf-test/run-test-async + (h/with-app-initialized + (h/with-account + (h/create-new-account!) + (rf-test/wait-for + [:wallet-legacy.accounts/account-stored] + (h/assert-new-account-created) + (h/logout) + (rf-test/wait-for [::logout/logout-method])))))) + +(deftest back-up-seed-phrase-test + (h/log-headline :back-up-seed-phrase-test) + (rf-test/run-test-async + (h/with-app-initialized + (h/with-account + (rf/dispatch-sync [:set-in [:my-profile/seed :step] :12-words]) ; display seed phrase to user + (rf/dispatch-sync [:my-profile/enter-two-random-words]) ; begin prompting user for seed words + (let [{:keys [mnemonic]} @(rf/subscribe [:profile/profile]) + seed @(rf/subscribe [:my-profile/seed]) + word1 (second (:first-word seed)) + word2 (second (:second-word seed))] + (is (= 12 (count (string/split mnemonic #" ")))) + (rf/dispatch-sync [:set-in [:my-profile/seed :word] word1]) + (rf/dispatch-sync [:my-profile/set-step :second-word]) + (rf/dispatch-sync [:set-in [:my-profile/seed :word] word2]) + (rf/dispatch [:my-profile/finish]) + (rf-test/wait-for + [:my-profile/finish-success] + (is (nil? @(rf/subscribe [:mnemonic]))) ; assert seed phrase has been removed + (h/logout) + (rf-test/wait-for [::logout/logout-method]))))))) diff --git a/src/test_helpers/integration.clj b/src/test_helpers/integration.clj new file mode 100644 index 000000000000..2418e3d9ab25 --- /dev/null +++ b/src/test_helpers/integration.clj @@ -0,0 +1,24 @@ +(ns test-helpers.integration + (:require [day8.re-frame.test :as rf-test] + [re-frame.core :as rf])) + +(defmacro with-app-initialized + [& body] + `(if (app-initialized) + (do ~@body) + (do + (rf/dispatch [:app-started]) + (rf-test/wait-for + [:profile/get-profiles-overview-success] + ~@body)))) + +(defmacro with-account + [& body] + `(if (messenger-started) + (do ~@body) + (do + (create-multiaccount!) + (rf-test/wait-for + [:status-im.transport.core/messenger-started] + (assert-messenger-started) + ~@body)))) diff --git a/src/test_helpers/integration.cljs b/src/test_helpers/integration.cljs new file mode 100644 index 000000000000..77917b86edaf --- /dev/null +++ b/src/test_helpers/integration.cljs @@ -0,0 +1,61 @@ +(ns test-helpers.integration + (:require + [cljs.test :refer [is]] + [native-module.core :as native-module] + [re-frame.core :as rf] + status-im.events + status-im.subs.root + status-im2.events + [status-im2.integration-test.constants :as constants] + status-im2.navigation.core + status-im2.subs.root + [taoensso.timbre :as log])) + +(defn initialize-app! + [] + (rf/dispatch [:app-started])) + +(defn create-multiaccount! + [] + (rf/dispatch [:profile.create/create-and-login + {:display-name constants/account-name :password constants/password :color "blue"}])) + +(defn app-initialized + [] + (let [app-state @(rf/subscribe [:app-state])] + (= "active" app-state))) + +(defn assert-app-initialized + [] + (is (app-initialized))) + +(defn messenger-started + [] + @(rf/subscribe [:messenger/started?])) + +(defn assert-messenger-started + [] + (is (messenger-started))) + +(defn assert-community-created + [] + (is (= @(rf/subscribe [:communities/create]) constants/community))) + +(defn create-new-account! + [] + (rf/dispatch-sync [:wallet-legacy.accounts/start-adding-new-account {:type :generate}]) + (rf/dispatch-sync [:set-in [:add-account :account :name] constants/account-name]) + (rf/dispatch [:wallet-legacy.accounts/add-new-account (native-module/sha3 constants/password)])) + +(defn assert-new-account-created + [] + (is (true? (some #(= (:name %) constants/account-name) + @(rf/subscribe [:profile/wallet-accounts]))))) + +(defn logout + [] + (rf/dispatch [:logout])) + +(defn log-headline + [test-name] + (log/info (str "========= " (name test-name) " ==================")))