From 664cbf6bbe18b1e400f7be170d1a741a33f35d1b Mon Sep 17 00:00:00 2001 From: Roman Volosovskyi Date: Sun, 13 Jan 2019 20:30:34 +0200 Subject: [PATCH] Sign-in flow docs and tests --- doc/sign_in/readme.md | 68 +++++ doc/sign_in/sign_in_diagram.jpg | Bin 0 -> 97392 bytes doc/sign_in/sign_in_diagram.xml | 1 + src/status_im/events.cljs | 22 +- src/status_im/protocol/core.cljs | 5 +- .../react_native/js_dependencies.cljs | 3 + test/cljs/status_im/test/runner.cljs | 6 +- test/cljs/status_im/test/sign_in/data.cljs | 221 ++++++++++++++++ test/cljs/status_im/test/sign_in/flow.cljs | 235 ++++++++++++++++++ 9 files changed, 547 insertions(+), 14 deletions(-) create mode 100644 doc/sign_in/readme.md create mode 100644 doc/sign_in/sign_in_diagram.jpg create mode 100644 doc/sign_in/sign_in_diagram.xml create mode 100644 test/cljs/status_im/test/sign_in/data.cljs create mode 100644 test/cljs/status_im/test/sign_in/flow.cljs 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 0000000000000000000000000000000000000000..548fccc6dd7b202c0ddb7ba4a63cdfde5095b068 GIT binary patch literal 97392 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 z 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%0DV_lqbM8%3k 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 RVD0%|E#!Y8{?%{e{|}8m8-@S? literal 0 HcmV?d00001 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)))))))