diff --git a/src/frontend/src/lib/components/loaders/LoaderWallets.svelte b/src/frontend/src/lib/components/loaders/LoaderWallets.svelte index dfbbdee7e8..b4e4167953 100644 --- a/src/frontend/src/lib/components/loaders/LoaderWallets.svelte +++ b/src/frontend/src/lib/components/loaders/LoaderWallets.svelte @@ -1,10 +1,13 @@ - + + + diff --git a/src/frontend/src/sol/components/core/SolLoaderWallets.svelte b/src/frontend/src/sol/components/core/SolLoaderWallets.svelte new file mode 100644 index 0000000000..14d2f18d40 --- /dev/null +++ b/src/frontend/src/sol/components/core/SolLoaderWallets.svelte @@ -0,0 +1,32 @@ + + + + + diff --git a/src/frontend/src/tests/sol/components/core/SolLoaderWallets.spec.ts b/src/frontend/src/tests/sol/components/core/SolLoaderWallets.spec.ts new file mode 100644 index 0000000000..09041b287f --- /dev/null +++ b/src/frontend/src/tests/sol/components/core/SolLoaderWallets.spec.ts @@ -0,0 +1,124 @@ +import * as solEnv from '$env/networks/networks.sol.env'; +import { + SOLANA_DEVNET_TOKEN, + SOLANA_TESTNET_TOKEN, + SOLANA_TOKEN +} from '$env/tokens/tokens.sol.env'; +import * as appConstants from '$lib/constants/app.constants'; +import { + solAddressDevnetStore, + solAddressLocalnetStore, + solAddressMainnetStore, + solAddressTestnetStore +} from '$lib/stores/address.store'; +import { testnetsStore } from '$lib/stores/settings.store'; +import SolLoaderWallets from '$sol/components/core/SolLoaderWallets.svelte'; +import { enabledSolanaTokens } from '$sol/derived/tokens.derived'; +import { initSolWalletWorker } from '$sol/services/worker.sol-wallet.services'; +import { render } from '@testing-library/svelte'; +import { get } from 'svelte/store'; + +vi.mock('$sol/services/worker.sol-wallet.services', () => ({ + initSolWalletWorker: vi.fn() +})); + +describe('SolLoaderWallets', () => { + beforeEach(() => { + vi.clearAllMocks(); + + // Reset all address stores + solAddressLocalnetStore.reset(); + solAddressTestnetStore.reset(); + solAddressDevnetStore.reset(); + solAddressMainnetStore.reset(); + testnetsStore.reset({ key: 'testnets' }); + + vi.spyOn(solEnv, 'SOLANA_NETWORK_ENABLED', 'get').mockImplementation(() => true); + + vi.spyOn(appConstants, 'LOCAL', 'get').mockImplementation(() => false); + }); + + it('should not initialize wallet workers when no addresses are available', () => { + testnetsStore.set({ key: 'testnets', value: { enabled: true } }); + + render(SolLoaderWallets); + + // With testnets enabled, we expect mainnet + testnet + devnet tokens + expect(get(enabledSolanaTokens).length).toBe(3); + expect(initSolWalletWorker).not.toHaveBeenCalled(); + }); + + it('should initialize wallet workers only for networks with available addresses', () => { + const testnetAddress = 'testnet-address'; + const mainnetAddress = 'mainnet-address'; + + testnetsStore.set({ key: 'testnets', value: { enabled: true } }); + solAddressTestnetStore.set({ data: testnetAddress, certified: true }); + solAddressMainnetStore.set({ data: mainnetAddress, certified: true }); + + render(SolLoaderWallets); + + const walletWorkerTokens = get(enabledSolanaTokens).filter( + ({ network: { id: networkId } }) => + (networkId === SOLANA_TESTNET_TOKEN.network.id && testnetAddress) || + (networkId === SOLANA_TOKEN.network.id && mainnetAddress) + ); + + expect(walletWorkerTokens.length).toBe(2); + }); + + it('should update wallet workers when addresses change', async () => { + const devnetAddress = 'devnet-address'; + testnetsStore.set({ key: 'testnets', value: { enabled: true } }); + + const { rerender } = render(SolLoaderWallets); + + expect(initSolWalletWorker).not.toHaveBeenCalled(); + + solAddressDevnetStore.set({ data: devnetAddress, certified: true }); + await rerender({}); + + const walletWorkerTokens = get(enabledSolanaTokens).filter( + ({ network: { id: networkId } }) => + networkId === SOLANA_DEVNET_TOKEN.network.id && devnetAddress + ); + + expect(walletWorkerTokens.length).toBe(1); + }); + + it('should handle empty enabled tokens list when Solana network is disabled', () => { + vi.spyOn(solEnv, 'SOLANA_NETWORK_ENABLED', 'get').mockImplementation(() => false); + render(SolLoaderWallets); + expect(get(enabledSolanaTokens).length).toBe(0); + expect(initSolWalletWorker).not.toHaveBeenCalled(); + }); + + it('should handle all networks having addresses', () => { + testnetsStore.set({ key: 'testnets', value: { enabled: true } }); + solAddressLocalnetStore.set({ data: 'local-address', certified: true }); + solAddressTestnetStore.set({ data: 'testnet-address', certified: true }); + solAddressDevnetStore.set({ data: 'devnet-address', certified: true }); + solAddressMainnetStore.set({ data: 'mainnet-address', certified: true }); + + render(SolLoaderWallets); + + const walletWorkerTokens = get(enabledSolanaTokens).filter( + ({ network: { id: networkId } }) => + networkId === SOLANA_TESTNET_TOKEN.network.id || + networkId === SOLANA_TOKEN.network.id || + networkId === SOLANA_DEVNET_TOKEN.network.id + ); + + expect(walletWorkerTokens.length).toBe(3); + }); + + it('should include local network token when LOCAL is true', () => { + vi.spyOn(appConstants, 'LOCAL', 'get').mockImplementation(() => true); + testnetsStore.set({ key: 'testnets', value: { enabled: true } }); + + render(SolLoaderWallets); + + // With LOCAL true and testnets enabled, we expect mainnet + testnet + devnet + local tokens + expect(get(enabledSolanaTokens).length).toBe(4); + }); +});