diff --git a/doc/sign_in/readme.md b/doc/sign_in/readme.md new file mode 100644 index 0000000000..a10c4c989a --- /dev/null +++ b/doc/sign_in/readme.md @@ -0,0 +1,68 @@ +# Sign in flow + +## tl;dr +In general, at first we try to encrypt realm database using password +and then proceed with the rest of operations. We do not wait for +`Statusgo.Login` callback in order to show `:home` screen with chats +as this call may add more than 1s to the process. + +![img](sign_in_diagram.jpg) + +## In details + +#### Main flow: +1. User enters password +2. Presses "Sign In" +3. Attempt to open account's db +4. + _a._ If DB file doesn't exist go to [**Empty DB flow**](#empty-db-flow) + + _b._ Otherwise continue +5. + _a._ If db can't be encrypted go to [**Verify password flow**](#verify-password-flow) + + _b._ Otherwise continue +6. + _a._ If db can't be migrate DB schema **show migrations failure popup with + option to erase DB** + + _b._ Otherwise continue +7. Proceed with [**UI flow**](#ui-flow) and [**Statusgo.Login flow**] +(#statusgologin-flow) + +#### Empty DB flow: +1. Verify password +2. + _a._ If password is wrong **show "Wrong password" label** + + _b._ Otherwise continue +3. Create account's DB (by opening it with correct encryption key) +4. Proceed with [**UI flow**](#ui-flow) and [**Statusgo.Login flow**] +(#statusgologin-flow) + +#### Verify password flow: +1. Verify password +2. + _a._ If password is correct **show encryption failure popup with option to + erase DB** + + _b._ Otherwise **show "Wrong password" label** + +#### Statusgo.Login flow: +1. Start node +2. "node.ready" event received +3. Statusgo.Login is called +4. Statusgo.Login callback +5. + _a._ If password is incorrect **show error popup (passwords used for db + encryption and for account do not match)** + + _b._ Otherwise continue +6. Done + +#### UI flow: +1. Load necessary data for last 10 chats +2. Show `:home` screen +2. Load the rest of chats +3. Show them too +4. Done diff --git a/doc/sign_in/sign_in_diagram.jpg b/doc/sign_in/sign_in_diagram.jpg new file mode 100644 index 0000000000..548fccc6dd Binary files /dev/null and b/doc/sign_in/sign_in_diagram.jpg differ diff --git a/doc/sign_in/sign_in_diagram.xml b/doc/sign_in/sign_in_diagram.xml new file mode 100644 index 0000000000..d9537608ab --- /dev/null +++ b/doc/sign_in/sign_in_diagram.xml @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/src/status_im/events.cljs b/src/status_im/events.cljs index a60cd0698d..7e1aafba9d 100644 --- a/src/status_im/events.cljs +++ b/src/status_im/events.cljs @@ -104,6 +104,17 @@ {:db (assoc db :chats/loading? false)} (chat-loading/initialize-chats {:from 10})))) +(defn account-change-success + [{:keys [db] :as cofx} [_ address]] + (let [{:node/keys [status on-ready]} db] + (fx/merge + cofx + (if (= status :started) + (accounts.login/login) + (node/initialize (get-in db [:accounts/login :address]))) + (init/initialize-account address) + (chat-loading/initialize-chats {:to 10})))) + (handlers/register-handler-fx :init.callback/account-change-success [(re-frame/inject-cofx :web3/get-web3) @@ -113,15 +124,7 @@ (re-frame/inject-cofx :data-store/all-dapp-permissions) (re-frame/inject-cofx :get-default-dapps) (re-frame/inject-cofx :data-store/all-chats)] - (fn [{:keys [db] :as cofx} [_ address]] - (let [{:node/keys [status on-ready]} db] - (fx/merge - cofx - (if (= status :started) - (accounts.login/login) - (node/initialize (get-in db [:accounts/login :address]))) - (init/initialize-account address) - (chat-loading/initialize-chats {:to 10}))))) + account-change-success) (handlers/register-handler-fx :init.callback/keychain-reset @@ -260,7 +263,6 @@ (handlers/register-handler-fx :accounts.login.callback/login-success [(re-frame/inject-cofx :web3/get-web3) - (re-frame/inject-cofx :data-store/all-chats) (re-frame/inject-cofx :data-store/get-all-mailservers) (re-frame/inject-cofx :data-store/transport) (re-frame/inject-cofx :data-store/mailserver-topics)] diff --git a/src/status_im/protocol/core.cljs b/src/status_im/protocol/core.cljs index dbb56d48d6..4d28b482a6 100644 --- a/src/status_im/protocol/core.cljs +++ b/src/status_im/protocol/core.cljs @@ -32,9 +32,10 @@ (fx/defn check-sync-state [{{:keys [web3] :as db} :db :as cofx}] (if (:account/account db) - {:web3/get-syncing web3 + {:web3/get-syncing web3 :web3/get-block-number web3 - :dispatch-later [{:ms 10000 :dispatch [:protocol/state-sync-timed-out]}]} + :utils/dispatch-later [{:ms 10000 + :dispatch [:protocol/state-sync-timed-out]}]} (semaphores/free cofx :check-sync-state?))) (fx/defn start-check-sync-state diff --git a/test/cljs/status_im/react_native/js_dependencies.cljs b/test/cljs/status_im/react_native/js_dependencies.cljs index 95a2e2fc1c..569bce7da1 100644 --- a/test/cljs/status_im/react_native/js_dependencies.cljs +++ b/test/cljs/status_im/react_native/js_dependencies.cljs @@ -50,3 +50,6 @@ (def keychain #js {:setGenericPassword (constantly (.resolve js/Promise true))}) (def secure-random #(.resolve js/Promise (clj->js (range 0 %)))) (def react-navigation #js {:NavigationActions #js {}}) +(def desktop-menu #js {}) +(def desktop-config #js {}) + diff --git a/test/cljs/status_im/test/runner.cljs b/test/cljs/status_im/test/runner.cljs index fc0423232a..93ae7cf707 100644 --- a/test/cljs/status_im/test/runner.cljs +++ b/test/cljs/status_im/test/runner.cljs @@ -59,7 +59,8 @@ [status-im.test.hardwallet.core] [status-im.test.contact-recovery.core] [status-im.test.ui.screens.currency-settings.models] - [status-im.test.ui.screens.wallet.db])) + [status-im.test.ui.screens.wallet.db] + [status-im.test.sign-in.flow])) (enable-console-print!) @@ -129,4 +130,5 @@ 'status-im.test.browser.core 'status-im.test.contact-recovery.core 'status-im.test.extensions.ethereum - 'status-im.test.browser.permissions) + 'status-im.test.browser.permissions + 'status-im.test.sign-in.flow) diff --git a/test/cljs/status_im/test/sign_in/data.cljs b/test/cljs/status_im/test/sign_in/data.cljs new file mode 100644 index 0000000000..3e0b38a21f --- /dev/null +++ b/test/cljs/status_im/test/sign_in/data.cljs @@ -0,0 +1,221 @@ +(ns status-im.test.sign-in.data) + +(def all-contacts + [{:description nil + :last-updated 1547185503000 + :tags #{} + :hide-contact? false + :address "2f88d65f3cb52605a54a833ae118fb1363acccd2" + :name "Darkviolet Lightgreen Halcyon" + :fcm-token "cwigXoAk9R4:APA91bFZOy8vsCj9I9t6PYZXropyYEqAhKaVD2GxrURwvxe_Ay3zLrtJxeirp69se_5EOjS5i4T9xQnoPWrFTLfU9U7AUBdjxZtq5cnlP005bOY05p-psxGsQThMKQMeP5DJC9uxN0Ei" + :dapp-url nil + :dapp-hash nil + :photo-path "data:image/png;base64iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAADAFBMVEX///+M2KwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADdPOdBAAABAHRSTlP//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmfXxgAABnNJREFUeNoBaAaX+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5UBARL8TK8AAAAASUVORK5CYII=" + :debug? false + :status nil + :bot-url nil + :pending? false + :last-online 0 + :dapp? false + :public-key "0x04d6e56a475cd35f512d6ce0bf76c2c2af435c85ff48c2b9bdefd129f620e051a436f50961eae5717b2a750e59c3f5b60647d927da46d0b8b11621640b5678fc24"} + {:description nil + :last-updated 1547271764000 + :tags #{} + :hide-contact? false + :address "b267ff8336ac10b3a1986c04a70ff91fb03d0b78" + :name "rv" + :fcm-token "dpVPtMBLuv8:APA91bEU4YuSz9yrc-vsiSl-IjdLSR5UpHm7yffaFlWQs_fvsTiK18ZcdYUbzA8iUoNuMVRNF_ngU7JdQInwNpXdGtNv_qcAFt0jhXHqf7dWY-kGJUBw9Ma8G_2fa40JLJchGVrzUIen" + :dapp-url nil + :dapp-hash nil + :photo-path "data:image/png;base64iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAADAFBMVEX////VjNgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwYzy6AAABAHRSTlP//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmfXxgAABnNJREFUeNoBaAaX+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAAAAAAEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEAAAAAAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQAAAAABAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAAAAAAEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6IYA4bRtf+EAAAAASUVORK5CYII=" + :debug? false + :status nil + :bot-url nil + :pending? false + :last-online 0 + :dapp? false + :public-key "0x043ae31038ff45a31b096a91d3f8290e079366fbbae76a00fbbd349cd0e5b8d7598965d206772ec4504f68908649a08383cdc51a52cdae5e9ccc744ace4d37020f"}]) + +(def chats + [{:updated-at nil + :tags #{} + :color "#51d0f0" + :contacts #{} + :last-clock-value 154990121501242 + :admins #{} + :members-joined #{} + :name "status" + :removed-from-at nil + :membership-updates () + :unviewed-messages-count 0 + :last-message-content-type "text/plain" + :is-active true + :last-message-content {:chat-id "status" :text "darn typos...! "} + :debug? false + :added-to-at nil + :group-chat true + :public? true + :removed-at nil + :message-overhead 0 + :chat-id "status" + :timestamp 1547361080397 + :deleted-at-clock-value nil} + {:updated-at nil + :tags #{} + :color "#d37ef4" + :contacts #{"0x043ae31038ff45a31b096a91d3f8290e079366fbbae76a00fbbd349cd0e5b8d7598965d206772ec4504f68908649a08383cdc51a52cdae5e9ccc744ace4d37020f"} + :last-clock-value 154727176928001 + :admins #{} + :members-joined #{} + :name "rv" + :removed-from-at nil + :membership-updates () + :unviewed-messages-count 0 + :last-message-content-type "text/plain" + :is-active true + :last-message-content {:chat-id "0x04173f7cdea0076a7998abb674cc79fe61337c42db77043c01d5b0f3e3ac1e5a45bca0c93bb9f3c3d38b7cc9a7337cd64f9f9b2114fe4bbdfe1ae2633ba14d8c9c" + :text "Hey"} + :debug? false + :added-to-at nil + :group-chat false + :public? false + :removed-at nil + :message-overhead 0 + :chat-id "0x043ae31038ff45a31b096a91d3f8290e079366fbbae76a00fbbd349cd0e5b8d7598965d206772ec4504f68908649a08383cdc51a52cdae5e9ccc744ace4d37020f" + :timestamp 1547271770816 + :deleted-at-clock-value nil} + {:updated-at nil + :tags #{} + :color "#7cda00" + :contacts #{"0x04d6e56a475cd35f512d6ce0bf76c2c2af435c85ff48c2b9bdefd129f620e051a436f50961eae5717b2a750e59c3f5b60647d927da46d0b8b11621640b5678fc24"} + :last-clock-value 154718689430301 + :admins #{} + :members-joined #{} + :name "Darkviolet Lightgreen Halcyon" + :removed-from-at nil + :membership-updates () + :unviewed-messages-count 0 + :last-message-content-type "text/plain" + :is-active true + :last-message-content {:chat-id "0x04173f7cdea0076a7998abb674cc79fe61337c42db77043c01d5b0f3e3ac1e5a45bca0c93bb9f3c3d38b7cc9a7337cd64f9f9b2114fe4bbdfe1ae2633ba14d8c9c" + :text "Djndjd"} + :debug? false + :added-to-at nil + :group-chat false + :public? false + :removed-at nil + :message-overhead 0 + :chat-id "0x04d6e56a475cd35f512d6ce0bf76c2c2af435c85ff48c2b9bdefd129f620e051a436f50961eae5717b2a750e59c3f5b60647d927da46d0b8b11621640b5678fc24" + :timestamp 1547186895328 + :deleted-at-clock-value nil}]) + +(def account + {:desktop-alpha-release-warning-shown? false + :last-updated 0 + :address "7540c34d6c4082391f12468580a9a4e0724c6755" + :mnemonic "tumble gorilla neglect dumb budget involve tennis ocean diary eagle lady ring" + :bootnodes {} + :signing-phrase "bull exam weed" + :signed-up? true + :name "name" + :last-request nil + :desktop-notifications? false + :settings {:web3-opt-in? true + :wallet {:visible-tokens {:testnet #{:STT + :HND} + :mainnet #{:SNT} + :rinkeby #{:MOKSHA + :KDO} + :xdai #{} + :poa #{}}}} + :dev-mode? false + :networks {"testnet" {:id "testnet" + :name "Ropsten" + :config {:NetworkId 3 + :DataDir "/ethereum/testnet" + :LightEthConfig {:Enabled true}} + :rpc-url nil} + "testnet_rpc" {:id "testnet_rpc" + :name "Ropsten with upstream RPC" + :config {:NetworkId 3 + :DataDir "/ethereum/testnet_rpc" + :UpstreamConfig {:Enabled true + :URL "https://ropsten.infura.io/z6GCTmjdP3FETEJmMBI4"}} + :rpc-url nil} + "rinkeby_rpc" {:id "rinkeby_rpc" + :name "Rinkeby with upstream RPC" + :config {:NetworkId 4 + :DataDir "/ethereum/rinkeby_rpc" + :UpstreamConfig {:Enabled true + :URL "https://rinkeby.infura.io/z6GCTmjdP3FETEJmMBI4"}} + :rpc-url nil} + "mainnet_rpc" {:id "mainnet_rpc" + :name "Mainnet with upstream RPC" + :config {:NetworkId 1 + :DataDir "/ethereum/mainnet_rpc" + :UpstreamConfig {:Enabled true + :URL "https://mainnet.infura.io/z6GCTmjdP3FETEJmMBI4"}} + :rpc-url nil} + "xdai_rpc" {:id "xdai_rpc" + :name "xDai Chain" + :config {:NetworkId 100 + :DataDir "/ethereum/xdai_rpc" + :UpstreamConfig {:Enabled true + :URL "https://dai.poa.network"}} + :rpc-url nil} + "poa_rpc" {:id "poa_rpc" + :name "POA Network" + :config {:NetworkId 99 + :DataDir "/ethereum/poa_rpc" + :UpstreamConfig {:Enabled true + :URL "https://poa.infura.io"}} + :rpc-url nil}} + :photo-path "data:image/png;base64iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAADAFBMVEX////YsYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPGFwxAAABAHRSTlP//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmfXxgAABnNJREFUeNoBaAaX+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAQEBAQAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAABAQEBAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAEBAQEAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAQEBAQAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAABAQEBAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAEBAQEAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAQEBAQAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAABAQEBAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAEBAQEAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAQEBAQAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAABAQEBAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAEBAQEAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAAAAAAEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEAAAAAAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQAAAAABAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAAAAAAEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAloYA4a9rBHIAAAAASUVORK5CYII=" + :debug? false + :status "success is simply the wisdom born out of so called failures" + :extensions {} + :mainnet-warning-shown? false + :last-sign-in 1547271706793 + :seed-backed-up? false + :network "mainnet_rpc" + :wallet-set-up-passed? false + :public-key "0x04173f7cdea0076a7998abb674cc79fe61337c42db77043c01d5b0f3e3ac1e5a45bca0c93bb9f3c3d38b7cc9a7337cd64f9f9b2114fe4bbdfe1ae2633ba14d8c9c" + :keycard-instance-uid nil + :installation-id "618ec020-13c8-5505-8aa6-9c5444317e7f"}) + +(def accounts + {"address" account}) + +(defn get-chats [_ _] chats) + +(def transport + {"0x04d6e56a475cd35f512d6ce0bf76c2c2af435c85ff48c2b9bdefd129f620e051a436f50961eae5717b2a750e59c3f5b60647d927da46d0b8b11621640b5678fc24" + {:sym-key nil + :resend? nil + :topic nil + :pending-ack [] + :seen [] + :ack [] + :sym-key-id nil + :pending-send []} + "0x043ae31038ff45a31b096a91d3f8290e079366fbbae76a00fbbd349cd0e5b8d7598965d206772ec4504f68908649a08383cdc51a52cdae5e9ccc744ace4d37020f" + {:sym-key nil + :resend? nil + :topic nil + :pending-ack [] + :seen [] + :ack [] + :sym-key-id nil + :pending-send []} + "status" + {:sym-key "0x36224048e42c49e5c59c57bba5024fbb8822d6b4ee6ac5fbefd8b77f5323ecc4" + :resend? nil + :topic "0xcd423760" + :pending-ack [] + :seen [] + :ack [] + :sym-key-id "2091c39cac37211987f63391b93d0bd021b9df247da50728bfd766946993849d" + :pending-send []}}) + +(def topics {"0xf8946aac" {:chat-ids #{:discovery-topic} + :last-request 1547319670}}) diff --git a/test/cljs/status_im/test/sign_in/flow.cljs b/test/cljs/status_im/test/sign_in/flow.cljs new file mode 100644 index 0000000000..3cdcf413ad --- /dev/null +++ b/test/cljs/status_im/test/sign_in/flow.cljs @@ -0,0 +1,235 @@ +(ns status-im.test.sign-in.flow + "The main purpose of these tests is to signal that some steps of the sign in + flow has been changed. Such changes should be reflected in both these tests + and documents which describe the whole \"sign in\" flow." + (:require [cljs.test :refer-macros [deftest is are testing]] + [status-im.accounts.login.core :as login.core] + [status-im.events :as events] + [status-im.ui.screens.browser.default-dapps :as default-dapps] + [status-im.test.sign-in.data :as data] + [status-im.signals.core :as signals])) + +(deftest on-password-input-submitted + (testing + "handling :accounts.login.ui/password-input-submitted event" + (let [cofx {:db {:accounts/login {:address "address" + :password "password"}}} + create-database? false + efx (login.core/user-login cofx create-database?)] + (testing "Web data cleared." + (is (contains? efx :accounts.login/clear-web-data))) + (testing "Change account." + (is (= (:data-store/change-account efx) + ["address" "password" false]))) + (testing "set `node/on-ready` handler" + (is (= (get-in efx [:db :node/on-ready]) :login))) + (testing "start activity indicator" + (is (= (get-in efx [:db :accounts/login :processing]) true)))))) + +(deftest on-successful-account-change + (testing + "Account changed successfully: :init.callback/account-change-success + event is handled." + (let [db {:accounts/login {:address "address" + :password "password"} + :node/on-ready :login + :accounts/accounts data/accounts} + cofx {:db db + :web3 :web3 + :all-contacts data/all-contacts + :all-installations [] + :all-stored-browsers [] + :all-dapp-permissions [] + :default-dapps default-dapps/all + :get-all-stored-chats data/get-chats} + efx (events/account-change-success cofx [nil "address"]) + new-db (:db efx)] + (testing "Starting node." + (is (contains? efx :node/start))) + (testing "Get fcm token." + (is (contains? efx :notifications/get-fcm-token))) + (testing "Request notifications permissions." + (is (contains? efx :notifications/request-notifications-permissions))) + (testing "Navigate to :home." + (is (= :home (efx :status-im.ui.screens.navigation/navigate-to)))) + (testing "Account selected." + (is (contains? new-db :account/account))) + (testing "Chats initialized." + (is (= 3 (count (:chats new-db))))) + (testing "Contacts initialized." + (is (= 2 (count (:contacts/contacts new-db)))))))) + +(deftest decryption-failure-on-account-change + (testing ":init.callback/account-change-error event received." + (let [cofx {:db {}} + error {:error :decryption-failed} + efx (login.core/handle-change-account-error cofx error) + new-db (:db efx)] + (testing "Init account's password verification" + (is (= :verify-account (new-db :node/on-ready)))) + (testing "Init account's password verification" + (is (= :decryption-failed (get-in new-db [:realm-error :error])))) + (testing "Start node." + (is (contains? efx :node/start)))))) + +(deftest database-does-not-exist-on-account-change + (testing ":init.callback/account-change-error event received." + (let [cofx {:db {}} + error {:error :database-does-not-exist} + efx (login.core/handle-change-account-error cofx error) + new-db (:db efx)] + (testing "Init account's password verification" + (is (= :verify-account (new-db :node/on-ready)))) + (testing "Init account's password verification" + (is (= :database-does-not-exist (get-in new-db [:realm-error :error])))) + (testing "Start node." + (is (contains? efx :node/start)))))) + +(deftest migrations-failed-on-account-change + (testing ":init.callback/account-change-error event received." + (let [cofx {:db {}} + error {:error :migrations-failed} + efx (login.core/handle-change-account-error cofx error)] + (testing "Show migrations dialog." + (is (contains? efx :ui/show-confirmation)))))) + +(deftest unknown-realm-error-on-account-change + (testing ":init.callback/account-change-error event received." + (let [cofx {:db {}} + error {:error :unknown-error} + efx (login.core/handle-change-account-error cofx error)] + (testing "Show unknown error dialog." + (is (contains? efx :ui/show-confirmation)))))) + +(deftest on-node-started + (testing "node.ready signal received" + (let [cofx {:db {:accounts/login {:address "address" + :password "password"} + :node/on-ready :login + :accounts/accounts data/accounts + :account/account data/accounts}} + efx (signals/status-node-started cofx)] + (testing "Init Login call." + (is (= ["address" "password"] (:accounts.login/login efx)))) + (testing "Change node's status to started." + (is (= :started (get-in efx [:db :node/status]))))))) + +(deftest on-node-started-for-verification + (testing "node.ready signal received" + (let [cofx {:db {:accounts/login {:address "address" + :password "password"} + :node/on-ready :verify-account + :accounts/accounts data/accounts + :account/account data/accounts + :realm-error {:error :database-does-not-exist}}} + efx (signals/status-node-started cofx)] + (testing "Init VerifyAccountPassword call." + (is (= ["address" "password" {:error :database-does-not-exist}] + (:accounts.login/verify efx)))) + (testing "Change node's status to started." + (is (= :started (get-in efx [:db :node/status]))))))) + +(deftest on-verify-account-success-after-decryption-failure + (testing ":accounts.login.callback/verify-success event received." + (let [cofx {:db {}} + verify-result "{\"error\":\"\"}" + realm-error {:error :decryption-failed} + efx (login.core/verify-callback cofx verify-result realm-error)] + (testing "Show dialog." + (is (contains? efx :ui/show-confirmation))) + (testing "Stop node." + (is (contains? efx :node/stop)))))) + +(deftest on-verify-account-success-after-database-does-not-exist + (testing ":accounts.login.callback/verify-success event received." + (let [cofx {:db {:accounts/login {:address "address" + :password "password"}}} + verify-result "{\"error\":\"\"}" + realm-error {:error :database-does-not-exist} + efx (login.core/verify-callback + cofx verify-result realm-error)] + (testing "Change account." + (is (= ["address" "password" true] + (:data-store/change-account efx)))) + (testing "Stop node." + (is (contains? efx :node/stop)))))) + +(deftest on-verify-account-failed + (testing ":accounts.login.callback/verify-success event received." + (let [cofx {:db {:accounts/login {:address "address" + :password "password"}}} + verify-result "{\"error\":\"some error\"}" + realm-error {:error :database-does-not-exist} + efx (login.core/verify-callback + cofx verify-result realm-error) + new-db (:db efx)] + (testing "Show error in sign in form." + (is (= "some error" (get-in new-db [:accounts/login :error])))) + (testing "Hide activity indicator." + (is (= false (get-in new-db [:accounts/login :processing])))) + (testing "Stop node." + (is (contains? efx :node/stop)))))) + +(deftest login-success + (testing ":accounts.login.callback/login-success event received." + (let [db {:accounts/login {:address "address" + :password "password"} + :account/account data/account + :semaphores #{}} + cofx {:db db + :data-store/mailservers [] + :data-store/transport data/transport + :data-store/mailserver-topics data/topics} + login-result "{\"error\":\"\"}" + efx (login.core/user-login-callback cofx login-result) + new-db (:db efx)] + (testing ":accounts/login cleared." + (is (not (contains? new-db :accounts/login)))) + (testing "Check messaging related effects." + (is (= 1 (count (get-in efx [:shh/restore-sym-keys-batch :transport])))) + (is (contains? efx :shh/generate-sym-key-from-password)) + (is (contains? efx :shh/add-discovery-filters)) + (is (contains? efx :mailserver/add-peer)) + (is (contains? efx :mailserver/update-mailservers)) + (is (contains? efx :protocol/assert-correct-network)) + (is (= #{{:ms 10000 + :dispatch [:mailserver/check-connection-timeout]} + {:ms 10000 + :dispatch [:protocol/state-sync-timed-out]}} + (set (:utils/dispatch-later efx))))) + (testing "Check the rest of effects." + (is (contains? efx :web3/set-default-account)) + (is (contains? efx :web3/get-block-number)) + (is (contains? efx :web3/fetch-node-version)) + (is (contains? efx :get-balance)) + (is (contains? efx :web3/get-syncing)) + (is (contains? efx :get-tokens-balance)) + (is (contains? efx :get-prices)) + (is (contains? efx :status-im.models.transactions/start-sync-transactions)))))) + +(deftest login-failed + (testing + ":accounts.login.callback/login-success event received with error." + (let [db {:accounts/login {:address "address" + :password "password"} + :account/account data/account + :semaphores #{}} + cofx {:db db + :data-store/mailservers [] + :data-store/transport data/transport + :data-store/mailserver-topics data/topics} + login-result "{\"error\":\"Something went wrong!\"}" + efx (login.core/user-login-callback cofx login-result) + new-db (:db efx)] + (testing "Prevent saving of the password." + (is (= false (get-in new-db [:accounts/login :save-password?])))) + (testing "Show error in sign in form." + (is (contains? (:accounts/login new-db) :error))) + (testing "Stop activity indicator." + (is (= false (get-in new-db [:accounts/login :processing])))) + (testing "Show error in sign in form." + (is (contains? (:accounts/login new-db) :error))) + (testing "Show error popup." + (is (contains? efx :utils/show-popup))) + (testing "Logout." + (is (= [:accounts.logout.ui/logout-confirmed] (:dispatch efx)))))))