diff --git a/__e2e__/flows/curate-lists.yml b/__e2e__/flows/curate-lists.yml index ece9a7ce87..16bad198b9 100644 --- a/__e2e__/flows/curate-lists.yml +++ b/__e2e__/flows/curate-lists.yml @@ -39,7 +39,6 @@ appId: xyz.blueskyweb.app id: "editListNameInput" - eraseText - inputText: "Bad Ppl" -- hideKeyboard - tapOn: id: "editListDescriptionInput" - eraseText diff --git a/__e2e__/flows/feed-reorder.yml b/__e2e__/flows/feed-reorder.yml index a917344a7d..42abc3295e 100644 --- a/__e2e__/flows/feed-reorder.yml +++ b/__e2e__/flows/feed-reorder.yml @@ -35,9 +35,12 @@ appId: xyz.blueskyweb.app id: "menuItemButton-Feeds" - tapOn: id: "editFeedsBtn" -- tapOn: - label: "Tap on down arrow" - id: "feed-timeline-moveDown" +- swipe: + label: "Drag feed down" + from: + id: "feed-drag-handle" + direction: "DOWN" + duration: 1000 - tapOn: label: "Save button" id: "saveChangesBtn" @@ -55,9 +58,12 @@ appId: xyz.blueskyweb.app id: "menuItemButton-Feeds" - tapOn: id: "editFeedsBtn" -- tapOn: - label: "Tap on down arrow" - id: "feed-feed-moveDown" +- swipe: + label: "Drag feed down" + from: + id: "feed-drag-handle" + direction: "DOWN" + duration: 1000 - tapOn: label: "Save button" id: "saveChangesBtn" diff --git a/__e2e__/flows/login.yml b/__e2e__/flows/login.yml index 5ca40224c5..ba6b79ac48 100644 --- a/__e2e__/flows/login.yml +++ b/__e2e__/flows/login.yml @@ -15,6 +15,11 @@ appId: xyz.blueskyweb.app - tapOn: id: "customServerTextInput" - inputText: "http://localhost:3000" +- runFlow: + when: + platform: Android + commands: + - hideKeyboard - tapOn: "Done" - tapOn: id: "loginUsernameInput" diff --git a/__e2e__/flows/report-dialog/post.reason-other.yml b/__e2e__/flows/report-dialog/post.reason-other.yml index 72da5a9fdf..e1065ece4d 100644 --- a/__e2e__/flows/report-dialog/post.reason-other.yml +++ b/__e2e__/flows/report-dialog/post.reason-other.yml @@ -26,6 +26,7 @@ appId: xyz.blueskyweb.app - tapOn: id: "report:details" - inputText: "This is a test report" +- hideKeyboard - tapOn: id: "report:submit" - assertNotVisible: diff --git a/__e2e__/setupApp.yml b/__e2e__/setupApp.yml index 00f53c526e..dc784e661f 100644 --- a/__e2e__/setupApp.yml +++ b/__e2e__/setupApp.yml @@ -3,15 +3,29 @@ appId: xyz.blueskyweb.app - launchApp: appId: "xyz.blueskyweb.app" clearState: true -- waitForAnimationToEnd -- tapOn: "http://localhost:8081" -- waitForAnimationToEnd -- extendedWaitUntil: - visible: "Continue" -- swipe: - from: "Bluesky" - direction: DOWN - duration: 100 + arguments: + "-EXDevMenuIsOnboardingFinished": true +- runFlow: + when: + platform: iOS + commands: + - openLink: "exp+bluesky://expo-development-client/?url=http%3A%2F%2Flocalhost%3A8081" + - runFlow: + when: + visible: 'Open in "Bluesky"' + commands: + - tapOn: Open +- runFlow: + when: + platform: Android + commands: + - tapOn: 'http://localhost:8081' + - runFlow: + label: "Dismiss Expo dev menu" + when: + visible: "Continue" + commands: + - back - tapOn: id: e2eProxyHeaderInput - inputText: ${output.result} diff --git a/docs/testing.md b/docs/testing.md index bba63e44c7..d8931a61e1 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -9,6 +9,14 @@ values. 2. You can write Maestro tests in `/.maestro/flows/` directory by creating a new `.yml` file or by modifying an existing one. 3. You can also use [Maestro Studio](https://maestro.mobile.dev/getting-started/maestro-studio) which automatically generates commands by recording your actions on the app. Therefore, you can create realistic tests without having to manually write any code. Use the `maestro studio` command to start recording your actions. +### Running on Android + +You will need to allow your device access to the port that the mock server is running on. + +``` +adb reverse tcp:3000 tcp:3000 +``` + ### Running Maestro tests - In one tab, run `yarn e2e:mock-server` diff --git a/src/Navigation.tsx b/src/Navigation.tsx index 4d05b95dc0..03ff43d739 100644 --- a/src/Navigation.tsx +++ b/src/Navigation.tsx @@ -690,6 +690,7 @@ function HomeTabNavigator() { headerShown: true, headerTransparent: true, headerTitle: '', + headerBackVisible: false, scrollEdgeEffects: { top: 'soft', }, diff --git a/src/components/DraggableList/index.tsx b/src/components/DraggableList/index.tsx index 86076c20ae..08676bd172 100644 --- a/src/components/DraggableList/index.tsx +++ b/src/components/DraggableList/index.tsx @@ -454,6 +454,7 @@ function SortableItem({ const dragHandle = ( void bannerRef?: AnimatedRef + testID?: string + label?: string }) { const pagerContext = usePagerHeaderContext() @@ -42,8 +46,11 @@ export function GrowableBanner({ if (!pagerContext || !IS_IOS) { return ( {children} @@ -60,7 +67,9 @@ export function GrowableBanner({ scrollY={scrollY} backButton={backButton} onPress={onPress} - bannerRef={bannerRef}> + bannerRef={bannerRef} + testID={testID} + label={label}> {children} ) @@ -72,12 +81,16 @@ function GrowableBannerInner({ children, onPress, bannerRef, + testID, + label, }: { scrollY: SharedValue backButton?: React.ReactNode children: React.ReactNode onPress?: () => void bannerRef?: AnimatedRef + testID?: string + label?: string }) { const {top: topInset} = useSafeAreaInsets() const isFetching = useIsProfileFetching() @@ -142,8 +155,11 @@ function GrowableBannerInner({ animatedStyle, ]}> () const {top: topInset} = useSafeAreaInsets() @@ -168,6 +167,12 @@ let ProfileHeaderShell = ({ style={[a.relative, {height: 150}]}> )} - + void}) { const agent = useAgent() useEffect(() => { const actors = accounts.map(acc => acc.did) + if (actors.length === 0) return void queryClient.prefetchQuery({ queryKey: profilesQueryKey(actors), staleTime: STALE.MINUTES.FIVE, diff --git a/src/view/com/testing/TestCtrls.e2e.tsx b/src/view/com/testing/TestCtrls.e2e.tsx index 31e65c64f0..b01651d7b1 100644 --- a/src/view/com/testing/TestCtrls.e2e.tsx +++ b/src/view/com/testing/TestCtrls.e2e.tsx @@ -25,6 +25,7 @@ export function TestCtrls() { const onboardingDispatch = useOnboardingDispatch() const {setShowLoggedOut} = useLoggedOutViewControls() const onPressSignInAlice = async () => { + console.info('[E2E] Signing in as Alice') await login( { service: 'http://localhost:3000', @@ -36,6 +37,7 @@ export function TestCtrls() { setShowLoggedOut(false) } const onPressSignInBob = async () => { + console.info('[E2E] Signing in as Bob') await login( { service: 'http://localhost:3000', @@ -54,6 +56,9 @@ export function TestCtrls() { accessibilityHint="Enter proxy header" testID="e2eProxyHeaderInput" onChangeText={val => setProxyHeader(val as any)} + autoComplete="off" + autoCorrect={false} + autoCapitalize="none" onSubmitEditing={() => { const header = `${proxyHeader}#bsky_appview` BLUESKY_PROXY_HEADER.set(header) @@ -135,15 +140,6 @@ export function TestCtrls() { accessibilityRole="button" style={BTN} /> - {/* TODO remove this entire control when experiment is over */} - { - onboardingDispatch({type: 'start'}) - }} - accessibilityRole="button" - style={BTN} - /> ) } diff --git a/src/view/com/util/UserBanner.tsx b/src/view/com/util/UserBanner.tsx index dc61e78272..8146b7ad9d 100644 --- a/src/view/com/util/UserBanner.tsx +++ b/src/view/com/util/UserBanner.tsx @@ -210,7 +210,6 @@ export function UserBanner({ ) : banner && !((moderation?.blur && IS_ANDROID) /* android crashes with blur */) ? ( ) : (