about summary refs log tree commit diff
path: root/__e2e__/flows
diff options
context:
space:
mode:
Diffstat (limited to '__e2e__/flows')
-rw-r--r--__e2e__/flows/composer-self-label.yml30
-rw-r--r--__e2e__/flows/composer.yml87
-rw-r--r--__e2e__/flows/create-account.yml37
-rw-r--r--__e2e__/flows/curate-lists.yml208
-rw-r--r--__e2e__/flows/home-screen.yml63
-rw-r--r--__e2e__/flows/login.yml26
-rw-r--r--__e2e__/flows/mod-lists.yml45
-rw-r--r--__e2e__/flows/profile-screen-edit.yml119
-rw-r--r--__e2e__/flows/profile-screen.yml37
-rw-r--r--__e2e__/flows/search-screen.yml22
-rw-r--r--__e2e__/flows/thread-muting.yml82
-rw-r--r--__e2e__/flows/thread-screen.yml84
12 files changed, 840 insertions, 0 deletions
diff --git a/__e2e__/flows/composer-self-label.yml b/__e2e__/flows/composer-self-label.yml
new file mode 100644
index 000000000..cc38b1d99
--- /dev/null
+++ b/__e2e__/flows/composer-self-label.yml
@@ -0,0 +1,30 @@
+appId: xyz.blueskyweb.app
+---
+- runScript:
+    file: ../setupServer.js
+    env:
+        SERVER_PATH: ?users
+- runFlow:
+    file: ../setupApp.yml
+- tapOn:
+    id: "e2eSignInAlice"
+
+# Post an image with the porn label
+- tapOn:
+    id: "composeFAB"
+- inputText: "Post with an image"
+- tapOn:
+    id: "openGalleryBtn"
+- tapOn:
+    id: "labelsBtn"
+- tapOn:
+    label: "Tap on porn"
+    point: 78%,67%
+- tapOn:
+    label: "Tap on confirm"
+    point: 51%,92%
+- tapOn:
+    id: "composerPublishBtn"
+- tapOn:
+    id: "e2eRefreshHome"
+- assertVisible: "Adult Content"
\ No newline at end of file
diff --git a/__e2e__/flows/composer.yml b/__e2e__/flows/composer.yml
new file mode 100644
index 000000000..f6d760ea5
--- /dev/null
+++ b/__e2e__/flows/composer.yml
@@ -0,0 +1,87 @@
+appId: xyz.blueskyweb.app
+---
+- runScript:
+    file: ../setupServer.js
+    env:
+        SERVER_PATH: ?users
+- runFlow:
+    file: ../setupApp.yml
+- tapOn:
+    id: "e2eSignInAlice"
+- tapOn:
+    id: "composeFAB"
+- inputText: "Post text only"
+- tapOn:
+    id: "composerPublishBtn"
+- assertVisible:
+    id: "composeFAB"
+- tapOn:
+    id: "composeFAB"
+- inputText: "Post with an image"
+- tapOn:
+    id: "openGalleryBtn"
+- tapOn:
+    id: "composerPublishBtn"
+- assertVisible:
+    id: "composeFAB"
+- tapOn:
+    id: "composeFAB"
+- inputText: "Post with a https://example.com link card"
+- tapOn:
+    id: "composerPublishBtn"
+- assertVisible:
+    id: "composeFAB"
+- tapOn:
+    id: "e2eRefreshHome"
+- tapOn:
+    id: "replyBtn"
+- inputText: "Reply text only"
+- tapOn:
+    id: "composerPublishBtn"
+- assertVisible:
+    id: "composeFAB"
+- tapOn:
+    id: "replyBtn"
+- inputText: "Reply with an image"
+- tapOn:
+    id: "openGalleryBtn"
+- tapOn:
+    id: "composerPublishBtn"
+- assertVisible:
+    id: "composeFAB"
+- tapOn:
+    id: "replyBtn"
+- inputText: "Reply with a https://example.com link card"
+- tapOn:
+    id: "composerPublishBtn"
+- assertVisible:
+    id: "composeFAB"
+- tapOn:
+    id: "repostBtn"
+- tapOn:
+    id: "quoteBtn"
+- inputText: "QP text only"   
+- tapOn:
+    id: "composerPublishBtn"
+- assertVisible:
+    id: "composeFAB"
+- tapOn:
+    id: "repostBtn"
+- tapOn:
+    id: "quoteBtn"
+- inputText: "QP with an image"
+- tapOn:
+    id: "openGalleryBtn"
+- tapOn:
+    id: "composerPublishBtn"
+- assertVisible:
+    id: "composeFAB"
+- tapOn:
+    id: "repostBtn"
+- tapOn:
+    id: "quoteBtn"
+- inputText: "QP with a https://example.com link card"
+- tapOn:
+    id: "composerPublishBtn"
+- assertVisible:
+    id: "composeFAB"
diff --git a/__e2e__/flows/create-account.yml b/__e2e__/flows/create-account.yml
new file mode 100644
index 000000000..99ac1371a
--- /dev/null
+++ b/__e2e__/flows/create-account.yml
@@ -0,0 +1,37 @@
+appId: xyz.blueskyweb.app
+---
+- runScript:
+    file: ../setupServer.js
+    env:
+        SERVER_PATH: ""
+- runFlow:
+    file: ../setupApp.yml
+- tapOn:
+    id: "e2eOpenLoggedOutView"
+- tapOn:
+    id: "createAccountButton"
+- tapOn:
+    id: "selectServiceButton"
+- tapOn:
+    id: "customSelectBtn"
+- tapOn:
+    id: "customServerTextInput"
+- inputText: "http://localhost:3000"
+- pressKey: Enter
+- tapOn:
+    id: "doneBtn"
+- tapOn:
+    id: "emailInput"
+- inputText: "example@test.com"
+- tapOn:
+    id: "passwordInput"
+- inputText: "hunter2"
+- pressKey: Enter
+- tapOn:
+    id: "nextBtn"
+- tapOn:
+     id: "handleInput"
+- inputText: "e2e-test"
+- tapOn:
+    id: "nextBtn"
+
diff --git a/__e2e__/flows/curate-lists.yml b/__e2e__/flows/curate-lists.yml
new file mode 100644
index 000000000..35f4f800d
--- /dev/null
+++ b/__e2e__/flows/curate-lists.yml
@@ -0,0 +1,208 @@
+appId: xyz.blueskyweb.app
+---
+- runScript:
+    file: ../setupServer.js
+    env:
+        SERVER_PATH: "?users&follows&posts"
+- runFlow:
+    file: ../setupApp.yml
+- tapOn:
+    id: "e2eSignInAlice"
+
+- tapOn:
+    label: "Create a curate list"
+    id: "e2eGotoLists"
+- tapOn:
+    id: "newUserListBtn"
+- assertVisible:
+    id: "createOrEditListModal"
+- tapOn:
+    id: "editNameInput"
+- inputText: "Good Ppl"
+- tapOn:
+    id: "editDescriptionInput"
+- inputText: "They good"
+- tapOn: "Save"
+- tapOn: "Save"
+- assertNotVisible:
+    id: "createOrEditListModal"
+- tapOn: "About"
+- assertVisible: "Good Ppl"
+- assertVisible: "They good"
+
+- tapOn:
+    label: "Edit display name and description via the edit curatelist modal"
+    point: "90%,9%"
+- tapOn: "Edit list details"
+- assertVisible:
+    id: "createOrEditListModal"
+- tapOn:
+    id: "editNameInput"
+- eraseText
+- inputText: "Bad Ppl"
+- hideKeyboard
+- tapOn:
+    id: "editDescriptionInput"
+- eraseText
+- inputText: "They bad"
+- tapOn: "Save"
+- tapOn: "Save"
+- assertNotVisible:
+    id: "createOrEditListModal"
+- assertVisible: Bad Ppl
+- assertVisible: They bad
+
+- tapOn:
+    label: "Remove description via the edit curatelist modal"
+    point: "90%,9%"
+- tapOn: "Edit list details"
+- assertVisible:
+    id: "createOrEditListModal"
+- tapOn:
+    id: "editDescriptionInput"
+- eraseText
+- tapOn: "Save"
+- tapOn: "Save"
+- assertNotVisible:
+    id: "createOrEditListModal"
+- assertNotVisible:
+    id: "listDescription"
+
+- tapOn:
+    label: "Delete the curatelist"
+    point: "90%,9%"
+- tapOn: "Delete List"
+- tapOn:
+    id: "confirmBtn"
+- assertVisible:
+    id: "listsEmpty"
+
+- tapOn:
+    label: "Create a new curatelist"
+    id: "e2eGotoLists"
+- tapOn:
+    id: "newUserListBtn"
+- assertVisible:
+    id: "createOrEditListModal"
+- tapOn:
+    id: "editNameInput"
+- inputText: "Good Ppl"
+- tapOn:
+    id: "editDescriptionInput"
+- inputText: "They good"
+- tapOn: "Save"
+- tapOn: "Save"
+- assertNotVisible:
+    id: "createOrEditListModal"
+- tapOn: "About"
+- assertVisible: "Good Ppl"
+- assertVisible: "They good"
+- tapOn: "About"
+
+- tapOn:
+    label: "Adds users on curatelists from the list"
+    id: "addUserBtn"
+- assertVisible:
+    id: "listAddUserModal"
+- tapOn:
+    id: "searchInput"
+- inputText: "b"
+- pressKey: Enter
+- tapOn:
+    id: "user-bob.test-addBtn"
+- tapOn:
+    id: "doneBtn"
+- assertNotVisible:
+    id: "listAddUserModal"
+- assertVisible:
+    id: "user-bob.test"
+
+- tapOn: "Posts"
+- assertVisible:
+    label: "Shows posts by the users in the list"
+    id: "feedItem-by-bob.test"
+
+- tapOn:
+    label: "Pins the list"
+    id: "pinBtn"
+- tapOn:
+    id: "e2eGotoHome"
+- tapOn: "Good Ppl"
+- assertVisible:
+    id: "feedItem-by-bob.test"
+- tapOn:
+    id: "bottomBarFeedsBtn"
+- tapOn:
+    id: "saved-feed-Good Ppl"
+- assertVisible:
+    id: "feedItem-by-bob.test"
+- tapOn:
+    id: "unpinBtn"
+- tapOn:
+    id: "bottomBarHomeBtn"
+- assertNotVisible:
+    id: "homeScreenFeedTabs-Good Ppl"
+- tapOn:
+    id: "e2eGotoLists"
+- tapOn:
+    id: "list-Good Ppl"
+
+- tapOn: "About"
+- assertVisible:
+    label: "Removes users on curatelists from the list"
+    id: "user-bob.test"
+- tapOn:
+    point: "90%,43%"
+- assertVisible:
+    id: "userAddRemoveListsModal"
+- tapOn:
+    id: "user-bob.test-addBtn"
+- tapOn:
+    id: "doneBtn"
+- assertNotVisible:
+    id: "userAddRemoveListsModal"
+
+- tapOn:
+    label: "Shows the curatelist on my profile"
+    id: "bottomBarProfileBtn"
+- swipe:
+    from:
+        id: "profilePager-selector"
+    direction: LEFT
+- tapOn:
+    id: "profilePager-selector-5"
+- tapOn:
+    id: "list-Good Ppl"
+
+- tapOn:
+    label: "Adds and removes users on curatelists from the profile"
+    id: "bottomBarSearchBtn"
+- tapOn:
+    id: "searchTextInput"
+- inputText: "bob"
+- tapOn:
+    id: "searchAutoCompleteResult-bob.test"
+- assertVisible:
+    id: "profileView"
+- tapOn:
+    id: "profileHeaderDropdownBtn"
+- tapOn: "Add to Lists"
+- assertVisible:
+    id: "userAddRemoveListsModal"
+- tapOn:
+    id: "user-bob.test-addBtn"
+- tapOn:
+    id: "doneBtn"
+- assertNotVisible:
+    id: "userAddRemoveListsModal"
+- tapOn:
+    id: "profileHeaderDropdownBtn"
+- tapOn: "Add to Lists"
+- assertVisible:
+    id: "userAddRemoveListsModal"
+- tapOn:
+    id: "user-bob.test-addBtn"
+- tapOn:
+    id: "doneBtn"
+- assertNotVisible:
+    id: "userAddRemoveListsModal"
diff --git a/__e2e__/flows/home-screen.yml b/__e2e__/flows/home-screen.yml
new file mode 100644
index 000000000..69a1fe37f
--- /dev/null
+++ b/__e2e__/flows/home-screen.yml
@@ -0,0 +1,63 @@
+appId: xyz.blueskyweb.app
+---
+- runScript:
+    file: ../setupServer.js
+    env:
+        SERVER_PATH: ?users&follows&posts&feeds
+- runFlow:
+    file: ../setupApp.yml
+- tapOn:
+    id: "e2eSignInAlice"
+
+- tapOn:
+    label: "Can go to feeds page using feeds button in tab bar"
+    text: "Feeds ✨"
+- assertVisible: "Discover New Feeds"
+
+- tapOn:
+    label: "Feeds button disappears after pinning a feed"
+    id: "bottomBarProfileBtn"
+- swipe:
+    from:
+        id: "profilePager-selector"
+    direction: LEFT
+- tapOn:
+    id: "profilePager-selector-4"
+- tapOn:
+    id: "feed-alice-favs"
+- tapOn: "Pin to Home"
+- tapOn:
+    id: "bottomBarHomeBtn"
+- assertNotVisible: "Feeds ✨"
+
+- tapOn:
+    label: "Can like posts"
+    id: "likeBtn"
+- assertVisible:
+    id: "likeCount"
+    text: "1"
+- tapOn:
+    id: "likeBtn"
+- assertNotVisible:
+    id: "likeCount"
+
+- tapOn:
+    label: "Can repost posts"
+    id: "repostBtn"
+- tapOn: "Repost"
+- assertVisible:
+    id: "repostCount"
+    text: "1"
+- tapOn:
+    id: "repostBtn"
+- tapOn: "Undo repost"
+- assertNotVisible:
+    id: "repostCount"
+
+- tapOn:
+    label: "Can delete posts"
+    id: "postDropdownBtn"
+    childOf:
+        id: "feedItem-by-alice.test"
+- tapOn: "Delete post"
+- tapOn: "Delete"
diff --git a/__e2e__/flows/login.yml b/__e2e__/flows/login.yml
new file mode 100644
index 000000000..f1001f78d
--- /dev/null
+++ b/__e2e__/flows/login.yml
@@ -0,0 +1,26 @@
+appId: xyz.blueskyweb.app
+---
+- runScript:
+    file: ../setupServer.js
+    env:
+        SERVER_PATH: "?users"
+- runFlow:
+    file: ../setupApp.yml
+- tapOn:
+    id: "e2eOpenLoggedOutView"
+- tapOn: "Sign in"
+- tapOn: 
+    id: "selectServiceButton"
+- tapOn: "Custom"
+- tapOn:
+    id: "customServerTextInput"
+- inputText: "http://localhost:3000"
+- tapOn: "Done"
+- tapOn:
+    id: "loginUsernameInput"
+- inputText: "Alice"
+- tapOn:
+    id: "loginPasswordInput"
+- inputText: "hunter2"
+- pressKey: Enter
+- assertVisible: "Following"
\ No newline at end of file
diff --git a/__e2e__/flows/mod-lists.yml b/__e2e__/flows/mod-lists.yml
new file mode 100644
index 000000000..75ee100a8
--- /dev/null
+++ b/__e2e__/flows/mod-lists.yml
@@ -0,0 +1,45 @@
+appId: xyz.blueskyweb.app
+---
+- runScript:
+    file: ../setupServer.js
+    env:
+        SERVER_PATH: "?users&follows&labels"
+- runFlow:
+    file: ../setupApp.yml
+- tapOn:
+    id: "e2eSignInAlice"
+
+# create a modlist
+- tapOn:
+    id: "e2eGotoModeration"
+- tapOn:
+    id: "moderationlistsBtn"
+- tapOn: "New"
+- tapOn:
+    id: "editNameInput"
+- inputText: "Muted Users"
+- tapOn:
+    id: "editDescriptionInput"
+- inputText: "Shhh"
+- tapOn: "Save"
+- tapOn: "Save"
+
+# view modlist
+- assertVisible: "Muted Users"
+- assertVisible: "Shhh"
+
+# toggle mute subscription
+- tapOn:
+    point: "70%,9%"
+- tapOn: "Mute accounts"
+- tapOn: "Mute list"
+- tapOn: "Unmute"
+
+# toggle block subscription
+- tapOn:
+    point: "70%,9%"
+- tapOn: "Block accounts"
+- tapOn: "Block list"
+- tapOn: "Unblock"
+ 
+ # the rest of the behaviors are tested in curate-lists.yml
\ No newline at end of file
diff --git a/__e2e__/flows/profile-screen-edit.yml b/__e2e__/flows/profile-screen-edit.yml
new file mode 100644
index 000000000..602cc6688
--- /dev/null
+++ b/__e2e__/flows/profile-screen-edit.yml
@@ -0,0 +1,119 @@
+appId: xyz.blueskyweb.app
+---
+- runScript:
+    file: ../setupServer.js
+    env:
+        SERVER_PATH: "?users&posts&feeds"
+- runFlow:
+    file: ../setupApp.yml
+- tapOn:
+    id: "e2eSignInAlice"
+
+
+# Navigate to my profile
+- tapOn:
+    id: "bottomBarProfileBtn"
+
+# Can see feeds
+- swipe:
+    from:
+        id: "profilePager-selector"
+    direction: LEFT
+- tapOn:
+    id: "profilePager-selector-4"
+- assertVisible: 
+    id: "feed-alice-favs"
+- swipe:
+    from:
+        id: "profilePager-selector"
+    direction: RIGHT
+- tapOn:
+    id: "profilePager-selector-0"
+
+# Open and close edit profile modal
+- tapOn:
+    id: "profileHeaderEditProfileButton"
+- assertVisible:
+    id: "editProfileModal"
+- tapOn:
+    id: "editProfileCancelBtn"
+- assertNotVisible:
+    id: "editProfileModal"
+
+# Edit display name and description via the edit profile modal
+- tapOn:
+    id: "profileHeaderEditProfileButton"
+- assertVisible:
+    id: "editProfileModal"
+- tapOn:
+    id: "editProfileDisplayNameInput"
+- eraseText
+- inputText: "Alicia"
+- tapOn:
+    id: "editProfileDescriptionInput"
+- eraseText
+- inputText: "One cool hacker"
+- tapOn: "Description"
+- tapOn:
+    id: "editProfileSaveBtn"
+- assertNotVisible:
+    id: "editProfileModal"
+- assertVisible: "Alicia"
+- assertVisible: "One cool hacker"
+
+# Remove display name and description via the edit profile modal
+- tapOn:
+    id: "profileHeaderEditProfileButton"
+- assertVisible:
+    id: "editProfileModal"
+- tapOn:
+    id: "editProfileDisplayNameInput"
+- eraseText
+- tapOn:
+    id: "editProfileDescriptionInput"
+- eraseText
+- tapOn: "Description"
+- tapOn:
+    id: "editProfileSaveBtn"
+- assertNotVisible:
+    id: "editProfileModal"
+- assertVisible: "alice.test"
+- assertNotVisible: "One cool hacker"
+
+# Set avi and banner via the edit profile modal
+- assertVisible:
+    id: "userBannerFallback"
+- tapOn:
+    id: "profileHeaderEditProfileButton"
+- assertVisible:
+    id: "editProfileModal"
+- tapOn:
+    id: "changeBannerBtn"
+- tapOn: "Upload from Library"
+- tapOn:
+    id: "changeAvatarBtn"
+- tapOn: "Upload from Library"
+- tapOn:
+    id: "editProfileSaveBtn"
+- assertNotVisible:
+    id: "editProfileModal"
+- assertVisible:
+    id: "userBannerImage"
+
+# # Remove avi and banner via the edit profile modal
+- tapOn:
+    id: "profileHeaderEditProfileButton"
+- assertVisible:
+    id: "editProfileModal"
+- tapOn:
+    id: "changeBannerBtn"
+- tapOn: "Remove Banner"
+- tapOn:
+    id: "changeAvatarBtn"
+- tapOn: "Remove Avatar"
+- tapOn:
+    id: "editProfileSaveBtn"
+- assertNotVisible:
+    id: "editProfileModal"
+- assertVisible:
+    id: "userBannerFallback"
diff --git a/__e2e__/flows/profile-screen.yml b/__e2e__/flows/profile-screen.yml
new file mode 100644
index 000000000..7d2d43dee
--- /dev/null
+++ b/__e2e__/flows/profile-screen.yml
@@ -0,0 +1,37 @@
+appId: xyz.blueskyweb.app
+---
+- runScript:
+    file: ../setupServer.js
+    env:
+        SERVER_PATH: "?users&posts&feeds"
+- runFlow:
+    file: ../setupApp.yml
+- tapOn:
+    id: "e2eSignInAlice"
+
+# Navigate to another user profile
+- tapOn:
+    id: "bottomBarSearchBtn"
+- tapOn:
+    id: "searchTextInput"
+- inputText: "b"
+- tapOn:
+    id: "searchAutoCompleteResult-bob.test"
+- assertVisible:
+    id: "profileView"
+
+# Can follow/unfollow another user
+- tapOn:
+    id: "followBtn"
+- tapOn:
+    id: "unfollowBtn"
+
+# Can mute/unmute another user
+- tapOn:
+    id: "profileHeaderDropdownBtn"
+- tapOn: "Mute Account"
+- assertVisible: "Account Muted"
+- tapOn:
+    id: "profileHeaderDropdownBtn"
+- tapOn: "Unmute Account"
+- assertNotVisible: "Account Muted"
\ No newline at end of file
diff --git a/__e2e__/flows/search-screen.yml b/__e2e__/flows/search-screen.yml
new file mode 100644
index 000000000..0d31d03fb
--- /dev/null
+++ b/__e2e__/flows/search-screen.yml
@@ -0,0 +1,22 @@
+appId: xyz.blueskyweb.app
+---
+- runScript:
+    file: ../setupServer.js
+    env:
+        SERVER_PATH: "?users"
+- runFlow:
+    file: ../setupApp.yml
+- tapOn:
+    id: "e2eSignInAlice"
+
+# Navigate to another user profile via autocomplete
+- tapOn:
+    id: "bottomBarSearchBtn"
+- tapOn:
+    id: "searchTextInput"
+- inputText: "b"
+- tapOn:
+    id: "searchAutoCompleteResult-bob.test"
+- assertVisible:
+    id: "profileView"
+
diff --git a/__e2e__/flows/thread-muting.yml b/__e2e__/flows/thread-muting.yml
new file mode 100644
index 000000000..316389a79
--- /dev/null
+++ b/__e2e__/flows/thread-muting.yml
@@ -0,0 +1,82 @@
+appId: xyz.blueskyweb.app
+---
+- runScript:
+    file: ../setupServer.js
+    env:
+        SERVER_PATH: "?users&follows"
+- runFlow:
+    file: ../setupApp.yml
+
+
+# Login, create a thread, and log out
+- tapOn:
+    id: "e2eSignInAlice"
+- tapOn:
+    id: "composeFAB"
+- inputText: "Test thread"
+- tapOn:
+    id: "composerPublishBtn"
+
+# Login, reply to the thread, and log out
+- tapOn:
+    id: "e2eSignInBob"
+- tapOn:
+    id: "replyBtn"
+- inputText: "Reply 1"
+- tapOn:
+    id: "composerPublishBtn"
+
+# Login, confirm notification exists, mute thread, and log out
+- tapOn:
+    id: "e2eSignInAlice"
+- tapOn:
+    id: "bottomBarNotificationsBtn"
+- assertVisible:
+    id: "feedItem-by-bob.test"
+- tapOn:
+    id: "feedItem-by-bob.test"
+- tapOn:
+    id: "postDropdownBtn"
+    childOf:
+        id: "postThreadItem-by-bob.test"
+- tapOn: "Mute thread"
+
+# Login, reply to the thread twice, and log out
+- tapOn:
+    id: "e2eSignInBob"
+- tapOn:
+    id: "bottomBarProfileBtn"
+- tapOn:
+    id: "profilePager-selector-1"
+- tapOn:
+    id: "replyBtn"
+- inputText: "Reply 2"
+- tapOn:
+    id: "composerPublishBtn"
+- tapOn:
+    id: "replyBtn"
+- inputText: "Reply 3"
+- tapOn:
+    id: "composerPublishBtn"
+
+
+# Login, confirm notifications dont exist, unmute the thread, confirm notifications exist
+- tapOn:
+    id: "e2eSignInAlice"
+- tapOn:
+    id: "bottomBarNotificationsBtn"
+- assertNotVisible:
+    id: "feedItem-by-bob.test"
+- tapOn:
+    id: "bottomBarHomeBtn"
+- tapOn:
+    id: "postDropdownBtn"
+- tapOn: "Unmute thread"
+- tapOn:
+    id: "bottomBarNotificationsBtn"
+- swipe:
+    from:
+        id: "notifsFeed"
+    direction: DOWN
+- assertVisible:
+    id: "feedItem-by-bob.test"
diff --git a/__e2e__/flows/thread-screen.yml b/__e2e__/flows/thread-screen.yml
new file mode 100644
index 000000000..22f71345d
--- /dev/null
+++ b/__e2e__/flows/thread-screen.yml
@@ -0,0 +1,84 @@
+appId: xyz.blueskyweb.app
+---
+- runScript:
+    file: ../setupServer.js
+    env:
+        SERVER_PATH: "?users&follows&thread"
+- runFlow:
+    file: ../setupApp.yml
+- tapOn:
+    id: "e2eSignInAlice"
+
+
+# Navigate to thread
+- tapOn: "Thread root"
+- assertVisible: "Thread reply"
+
+# Can like the root post
+- tapOn:
+    id: "likeBtn"
+    childOf:
+        id: "postThreadItem-by-bob.test"
+- assertVisible:
+    id: "likeCount-expanded"
+- tapOn:
+    id: "likeBtn"
+    childOf:
+        id: "postThreadItem-by-bob.test"
+- assertNotVisible:
+    id: "likeCount-expanded"
+
+# Can like a reply post
+- tapOn:
+    id: "likeBtn"
+    childOf:
+        id: "postThreadItem-by-carla.test"
+- assertVisible:
+    id: "likeCount"
+    childOf:
+        id: "postThreadItem-by-carla.test"
+- tapOn:
+    id: "likeBtn"
+    childOf:
+        id: "postThreadItem-by-carla.test"
+- assertNotVisible:
+    id: "likeCount"
+    childOf:
+        id: "postThreadItem-by-carla.test"
+
+# Can repost the root post
+- tapOn:
+    id: "repostBtn"
+    childOf:
+        id: "postThreadItem-by-bob.test"
+- tapOn: "Repost"
+- assertVisible:
+    id: "repostCount-expanded"
+- tapOn:
+    id: "repostBtn"
+    childOf:
+        id: "postThreadItem-by-bob.test"
+- tapOn: "Undo repost"
+- assertNotVisible:
+    id: "repostCount-expanded"
+
+
+# Can repost a reply post
+- tapOn:
+    id: "repostBtn"
+    childOf:
+        id: "postThreadItem-by-carla.test"
+- tapOn: "Repost"
+- assertVisible:
+    id: "repostCount"
+    childOf:
+        id: "postThreadItem-by-carla.test"
+- tapOn:
+    id: "repostBtn"
+    childOf:
+        id: "postThreadItem-by-carla.test"
+- tapOn: "Undo repost"
+- assertNotVisible:
+    id: "repostCount"
+    childOf:
+        id: "postThreadItem-by-carla.test"