import { beforeEach, describe, expect, it, vi } from 'vitest'; import { act, fireEvent, render, screen } from '../../../tests/helpers/render'; import { _resetNativeCapabilities, checkAppUpdate, loadNativeCapabilities } from '../../native/capabilities'; import { isNativeApp } from '../../native/platform'; import { TrekShell } from '../../native/trekShell'; import NativeUpdateNotice from './NativeUpdateNotice'; vi.mock('../../native/platform', () => ({ isNativeApp: vi.fn(), isNativeIos: vi.fn(() => false) })); vi.mock('../../native/trekShell', () => ({ TrekShell: { getCapabilities: vi.fn() }, isUnimplemented: () => false, })); beforeEach(() => { _resetNativeCapabilities(); vi.mocked(isNativeApp).mockReturnValue(true); vi.mocked(TrekShell.getCapabilities).mockResolvedValue({ shellApi: 2, platform: 'android', appVersion: '5.2.0', build: '3', features: [], } as never); }); describe('NativeUpdateNotice', () => { it('stays away while the binary is new enough', async () => { render(); await act(async () => { await checkAppUpdate(async () => ({ minNativeShellApi: 2 })); }); expect(screen.queryByRole('status')).not.toBeInTheDocument(); }); it('leads to the store when the server needs a newer binary, and can be dismissed', async () => { render(); await act(async () => { await loadNativeCapabilities(); await checkAppUpdate(async () => ({ minNativeShellApi: 3 })); }); const link = screen.getByRole('link'); expect(link).toHaveAttribute('href', 'https://play.google.com/store/apps/details?id=com.liketrek.trek'); fireEvent.click(screen.getByRole('button')); expect(screen.queryByRole('status')).not.toBeInTheDocument(); }); });