Skip to content

Commit

Permalink
A-1207660367546313: backup and restoring (#183)
Browse files Browse the repository at this point in the history
* feat: add wallet backup to JSON

* feat: add restoring wallet from JSON

* feat: improve validation

* test: add new and fix existings tests

* chore: move saving logig from db to account

* fix
  • Loading branch information
owlsua authored Aug 21, 2024
1 parent d740b39 commit 9fda79c
Show file tree
Hide file tree
Showing 35 changed files with 1,132 additions and 182 deletions.
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "browser-extension",
"version": "1.3.0",
"version": "1.3.1",
"private": true,
"dependencies": {
"@mintlayer/entropy-generator": "^1.0.4",
Expand Down
2 changes: 1 addition & 1 deletion public/manifestDefault.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"manifest_version": 3,
"name": "Mojito - A Mintlayer Wallet",
"version": "1.3.0",
"version": "1.3.1",
"short_name": "Mojito",
"description": "Mojito is a non-custodial decentralized crypto wallet that lets you send and receive BTC and ML from any other address.",
"homepage_url": "https://www.mintlayer.org/",
Expand Down
2 changes: 1 addition & 1 deletion public/manifestFirefox.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"manifest_version": 3,
"name": "Mojito - A Mintlayer Wallet",
"version": "1.3.0",
"version": "1.3.1",
"description": "Mojito is a non-custodial decentralized crypto wallet that lets you send and receive BTC and ML from any other address.",
"homepage_url": "https://www.mintlayer.org/",
"icons": {
Expand Down
5 changes: 5 additions & 0 deletions src/assets/images/icon-json.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 2 additions & 1 deletion src/components/basic/Button/Button.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ const Button = ({
extraStyleClasses = [],
disabled = false,
buttonType = 'button',
dataTestId = 'button',
onMouseEnter,
onMouseLeave,
}) => {
Expand All @@ -31,7 +32,7 @@ const Button = ({
<button
className={styleClasses}
onClick={onClickHandle}
data-testid="button"
data-testid={dataTestId}
disabled={disabled}
type={buttonType}
onMouseEnter={onMouseEnter}
Expand Down
2 changes: 1 addition & 1 deletion src/components/basic/Toggle/Toggle.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { useState } from 'react'
import './Toggle.css'

const Toggle = ({ label, name = 'toggleInput', toggled, onClick }) => {
const Toggle = ({ label, name = 'toggleInput', toggled = false, onClick }) => {
const [isToggled, toggle] = useState(toggled)

const callback = () => {
Expand Down
5 changes: 1 addition & 4 deletions src/components/composed/Entropy/DrawingBoard.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,6 @@ import 'konva/lib/shapes/Line'
const setLines = jest.fn()
const setEntropy = jest.fn()

const scaleMock = jest.fn()


test('Render Drawing Board', () => {
render(
<AccountProvider>
Expand All @@ -32,7 +29,7 @@ test('Render Drawing Board', () => {

test('allows drawing on the canvas', () => {
render(
<AccountProvider value={{ lines: [], setLines, scale: scaleMock }}>
<AccountProvider value={{ lines: [], setLines }}>
<DrawingBoard />
</AccountProvider>,
)
Expand Down
105 changes: 82 additions & 23 deletions src/components/composed/Header/Header.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,53 @@ import {
useLocation,
} from 'react-router-dom'

import { AccountProvider, SettingsProvider, MintlayerProvider, BitcoinProvider } from '@Contexts'
import {
AccountProvider,
SettingsProvider,
MintlayerProvider,
BitcoinProvider,
} from '@Contexts'
import Header from './Header'
import { expect } from '@playwright/test'

global.AbortSignal = global.AbortSignal || {}

global.AbortSignal.timeout = jest.fn((timeout) => {
const controller = new AbortController()
setTimeout(() => controller.abort(), timeout)
return controller.signal
})

const toggleNetworkType = jest.fn()

const setup = async (location) => {
const value = { isAccountUnlocked: () => true, logout: jest.fn(), addresses: {mlMainnetAddresses: ['address'], mlTestnetAddresses: ['address']}}
const setup = async (location, mode = 'default') => {
const valueDefaul = {
isAccountUnlocked: () => true,
logout: jest.fn(),
setSliderMenuOpen: jest.fn(),
addresses: {
mlMainnetAddresses: ['address'],
mlTestnetAddresses: ['address'],
},
}

const valueOpenMenu = {
isAccountUnlocked: () => true,
logout: jest.fn(),
setSliderMenuOpen: jest.fn(),
sliderMenuOpen: true,
addresses: {
mlMainnetAddresses: ['address'],
mlTestnetAddresses: ['address'],
},
}

const mintlayerProviderValue = {
currentMlAddresses: {
mlReceivingAddresses: ['address'],
mlChangeAddresses: ['address'],
},
}

const PreviousPage = () => {
location = useLocation()
Expand All @@ -38,24 +78,26 @@ const setup = async (location) => {
)
}

const value = mode === 'default' ? valueDefaul : valueOpenMenu

await render(
<AccountProvider value={value}>
<SettingsProvider value={{ networkType: 'testnet', toggleNetworkType }}>
<MintlayerProvider>
<MintlayerProvider value={mintlayerProviderValue}>
<BitcoinProvider>
<MemoryRouter initialEntries={['/']}>
<Routes>
<Route
path="/next-page"
element={<NextPage />}
/>
<Route
exact
path="/"
element={<PreviousPage />}
/>
</Routes>
</MemoryRouter>
<MemoryRouter initialEntries={['/']}>
<Routes>
<Route
path="/next-page"
element={<NextPage />}
/>
<Route
exact
path="/"
element={<PreviousPage />}
/>
</Routes>
</MemoryRouter>
</BitcoinProvider>
</MintlayerProvider>
</SettingsProvider>
Expand All @@ -80,6 +122,7 @@ test('Header component, renders a page before, navigate to Header and go back',

const nextPageComponent = screen.getByTestId('next-page')
const buttons = screen.getAllByTestId('button')
expect(nextPageComponent).toBeInTheDocument()

expect(nextPageComponent).toBeInTheDocument()

Expand All @@ -91,8 +134,8 @@ test('Header component, renders a page before, navigate to Header and go back',
expect(prevPageComponent).toBeInTheDocument()
})

test('Header component, renders a page before, navigate to Header and logout', async () => {
const { value } = await setup()
test('Header component, navigate to Header and open menu', async () => {
const { value } = await setup(false, 'open')

const nextPageLinkComponent = screen.getByTestId('next-page-link')

Expand All @@ -109,13 +152,29 @@ test('Header component, renders a page before, navigate to Header and logout', a
expect(nextPageComponent).toBeInTheDocument()

act(() => {
buttons[3].click()
buttons[1].click()
})

await waitFor(async () => {
expect(value.logout).toBeCalled()
expect(value.setSliderMenuOpen).toBeCalled()
})

const prevPageComponent = screen.getByTestId('prev-page')
expect(prevPageComponent).toBeInTheDocument()
const backdrop = screen.getByTestId('backdrop')
const sliderMenu = screen.getByTestId('slider-menu')

expect(backdrop).toBeInTheDocument()
expect(sliderMenu).toBeInTheDocument()

const logoutButton = screen.getByTestId('navigation-logout')
const expandViewButton = screen.getByTestId('navigation-expand-view')
expect(logoutButton).toBeInTheDocument()
expect(expandViewButton).toBeInTheDocument()

act(() => {
logoutButton.click()
})

await waitFor(async () => {
expect(value.logout).toBeCalled()
})
})
17 changes: 11 additions & 6 deletions src/components/composed/Navigation/Navigation.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import { ReactComponent as LoginImg } from '@Assets/images/icon-login.svg'
import { ReactComponent as AddWalletImg } from '@Assets/images/icon-add-wallet.svg'
import { ReactComponent as HomeImg } from '@Assets/images/icon-home.svg'


import { AccountContext } from '@Contexts'

import './Navigation.css'
Expand All @@ -32,9 +31,9 @@ const Navigation = ({ customNavigation }) => {
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [location.pathname])

const toggleSliderMenu = () => {
setSliderMenuOpen(!sliderMenuOpen)
}
const toggleSliderMenu = () => {
setSliderMenuOpen(!sliderMenuOpen)
}

const goSettings = () => {
navigate('/settings')
Expand Down Expand Up @@ -108,7 +107,11 @@ const Navigation = ({ customNavigation }) => {
},
]

const navList = customNavigation ? customNavigation : unlocked ? loggedNavigationList : navigationList
const navList = customNavigation
? customNavigation
: unlocked
? loggedNavigationList
: navigationList

return (
<>
Expand All @@ -129,6 +132,7 @@ const Navigation = ({ customNavigation }) => {
<li
className="bottom-menu-item"
onClick={expandHandler}
data-testid="navigation-expand-view"
>
<ExpandImg /> Expand view
</li>
Expand All @@ -137,12 +141,13 @@ const Navigation = ({ customNavigation }) => {
<li
className="bottom-menu-item"
onClick={logoutHandler}
data-testid="navigation-logout"
>
<LogoutImg />
Logout
</li>
)}
<span className='slider-version'>v1.2.9</span>
<span className="slider-version">v1.3.1</span>
</ul>
</>
)
Expand Down
Loading

0 comments on commit 9fda79c

Please sign in to comment.