Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 0 additions & 17 deletions test/helpers/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1423,23 +1423,6 @@ export async function verifyAmountToSend(amount: number) {
await expectTextWithin('SendNumberField', formatSats(amount));
}

export async function deleteAllDefaultWidgets() {
await swipeFullScreen('up');
await swipeFullScreen('up');
await tap('WidgetsEdit');
for (const w of ['Bitcoin Price', 'Bitcoin Blocks', 'Bitkit Suggestions']) {
tap(w + '_WidgetActionDelete');
await elementByText('Yes, Delete').waitForDisplayed();
await elementByText('Yes, Delete').click();
await elementById(w).waitForDisplayed({ reverse: true, timeout: 5000 });
await sleep(1000);
}
await tap('WidgetsEdit');
await elementById('PriceWidget').waitForDisplayed({ reverse: true });
await elementById('SuggestionsWidget').waitForDisplayed({ reverse: true });
await elementById('BlocksWidget').waitForDisplayed({ reverse: true });
}

export async function attemptRefreshOnHomeScreen() {
await swipeFullScreen('down');
await sleep(2000); // wait for the app to settle
Expand Down
191 changes: 191 additions & 0 deletions test/helpers/widgets.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,191 @@
import { elementById, elementByText, sleep, swipeFullScreen, tap } from './actions';

export type WidgetId = 'price' | 'blocks' | 'news' | 'facts' | 'suggestions' | 'calculator';

type WidgetMetadata = {
listItemId: string;
actionName: string;
homeId?: () => string | undefined;
hasSettings: () => boolean;
};

const WIDGETS: Record<WidgetId, WidgetMetadata> = {
price: {
listItemId: 'WidgetListItem-price',
actionName: 'Bitcoin Price',
homeId: () => 'PriceWidget',
hasSettings: () => true,
},
blocks: {
listItemId: 'WidgetListItem-blocks',
actionName: 'Bitcoin Blocks',
homeId: () => 'BlocksWidget',
hasSettings: () => true,
},
news: {
listItemId: 'WidgetListItem-news',
actionName: 'Bitcoin Headlines',
homeId: () => 'NewsWidget',
hasSettings: () => true,
},
facts: {
listItemId: 'WidgetListItem-facts',
actionName: 'Bitcoin Facts',
homeId: () => (driver.isIOS ? 'FactsWidget' : undefined),
hasSettings: () => driver.isIOS,
},
suggestions: {
listItemId: 'WidgetListItem-suggestions',
actionName: 'Bitkit Suggestions',
homeId: () => 'SuggestionsWidget',
hasSettings: () => false,
},
calculator: {
listItemId: 'WidgetListItem-calculator',
actionName: 'Calculator',
homeId: () => 'CalculatorWidget',
hasSettings: () => false,
},
};

const DEFAULT_WIDGETS: WidgetId[] = ['price', 'blocks', 'suggestions'];

function widgetMetadata(widget: WidgetId): WidgetMetadata {
return WIDGETS[widget];
}

function widgetActionId(widget: WidgetId, action: 'Delete' | 'Edit' | 'Drag') {
return `${widgetMetadata(widget).actionName}_WidgetAction${action}`;
}

async function tapIfDisplayed(testId: string, timeout = 2_000): Promise<boolean> {
const element = await elementById(testId);
try {
await element.waitForDisplayed({ timeout });
await element.click();
await sleep(300);
return true;
} catch {
return false;
}
}

async function tapWidgetListItem(widget: WidgetId) {
const { listItemId } = widgetMetadata(widget);
if (await tapIfDisplayed(listItemId)) {
return;
}
await swipeFullScreen('up');
await tap(listItemId);
}

export async function scrollHomeToWidgets() {
await swipeFullScreen('up');
await swipeFullScreen('up');
await sleep(500);
}

export async function openWidgetsFeed() {
await scrollHomeToWidgets();
await tap('WidgetsAdd');
await tapIfDisplayed('WidgetsOnboarding-button');
}

export async function openWidgetPreview(widget: WidgetId) {
await openWidgetsFeed();
await tapWidgetListItem(widget);
}

export async function addWidget(widget: WidgetId) {
await openWidgetPreview(widget);
await tap('WidgetSave');
await elementById('WidgetsAdd').waitForDisplayed({ timeout: 15_000 });
}

export async function openWidgetSettings(widget: WidgetId) {
if (!widgetMetadata(widget).hasSettings()) {
throw new Error(`Widget '${widget}' does not have editable settings on this platform`);
}
await tap('WidgetEdit');
await elementById('WidgetEditPreview').waitForDisplayed();
}

export async function openSavedWidgetPreview(widget: WidgetId) {
await scrollHomeToWidgets();
await tap('WidgetsEdit');
await tap(widgetActionId(widget, 'Edit'));
await elementById('WidgetSave').waitForDisplayed();
}

export async function expectWidgetPresent(
widget: WidgetId,
present = true,
{ timeout = 8_000 }: { timeout?: number } = {}
) {
const homeId = widgetMetadata(widget).homeId?.();
if (!homeId) {
await expectWidgetSavedInEditList(widget, present, { timeout });
return;
}
await elementById(homeId).waitForDisplayed({
reverse: !present,
timeout,
interval: 250,
});
}

export async function expectWidgetSavedInEditList(
widget: WidgetId,
present = true,
{ timeout = 8_000 }: { timeout?: number } = {}
) {
await scrollHomeToWidgets();
await tap('WidgetsEdit');
await elementById(widgetActionId(widget, 'Delete')).waitForDisplayed({
reverse: !present,
timeout,
interval: 250,
});
await tap('WidgetsEdit');
}

export async function deleteWidget(widget: WidgetId) {
await scrollHomeToWidgets();
await tap('WidgetsEdit');
await tap(widgetActionId(widget, 'Delete'));
await elementByText('Yes, Delete').waitForDisplayed();
await elementByText('Yes, Delete').click();
await elementById(widgetActionId(widget, 'Delete')).waitForDisplayed({
reverse: true,
timeout: 8_000,
interval: 250,
});
await tap('WidgetsEdit');
await sleep(500);
}

export async function deleteWidgets(widgets: WidgetId[]) {
await scrollHomeToWidgets();
await tap('WidgetsEdit');
for (const widget of widgets) {
if (!(await tapIfDisplayed(widgetActionId(widget, 'Delete')))) {
continue;
}
await elementByText('Yes, Delete').waitForDisplayed();
await elementByText('Yes, Delete').click();
await elementById(widgetActionId(widget, 'Delete')).waitForDisplayed({
reverse: true,
timeout: 8_000,
interval: 250,
});
await sleep(500);
}
await tap('WidgetsEdit');
}

export async function deleteAllDefaultWidgets() {
await deleteWidgets(DEFAULT_WIDGETS);
for (const widget of DEFAULT_WIDGETS) {
await expectWidgetPresent(widget, false);
}
}
2 changes: 1 addition & 1 deletion test/specs/backup.e2e.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { reinstallApp } from '../helpers/setup';
import {
completeOnboarding,
confirmInputOnKeyboard,
deleteAllDefaultWidgets,
doNavigationClose,
elementById,
elementByIdWithin,
Expand All @@ -20,6 +19,7 @@ import {
import { ciIt } from '../helpers/suite';
import { ensureLocalFunds } from '../helpers/regtest';
import { openSettings } from '../helpers/navigation';
import { deleteAllDefaultWidgets } from '../helpers/widgets';

describe('@backup - Backup', () => {
let electrum: Awaited<ReturnType<typeof initElectrum>> | undefined;
Expand Down
Loading