pinafore/tests/utils.js

152 lines
4.8 KiB
JavaScript
Raw Normal View History

2018-02-20 02:04:37 +01:00
import { ClientFunction as exec, Selector as $ } from 'testcafe'
2018-02-24 23:49:28 +01:00
const SCROLL_INTERVAL = 3
2018-02-20 02:04:37 +01:00
export const settingsButton = $('nav a[aria-label=Settings]')
export const instanceInput = $('#instanceInput')
export const addInstanceButton = $('.add-new-instance button')
2018-02-21 18:26:22 +01:00
export const modalDialogContents = $('.modal-dialog-contents')
export const closeDialogButton = $('.close-dialog-button')
2018-02-24 23:49:28 +01:00
export const notificationsNavButton = $('nav a[href="/notifications"]')
export const homeNavButton = $('nav a[href="/"]')
export const formError = $('.form-error-user-error')
2018-02-28 06:20:48 +01:00
export const composeInput = $('.compose-box-input')
export const composeButton = $('.compose-box-button')
export const composeLengthIndicator = $('.compose-box-length')
2018-03-01 03:45:29 +01:00
export const emojiButton = $('.compose-box-toolbar button:first-child')
2018-03-01 07:45:42 +01:00
export const emailInput = $('input#user_email')
export const passwordInput = $('input#user_password')
export const authorizeInput = $('button[type=submit]:not(.negative)')
2018-02-24 23:49:28 +01:00
export const favoritesCountElement = $('.status-favs-reblogs:nth-child(3)').addCustomDOMProperties({
innerCount: el => parseInt(el.innerText, 10)
})
export const reblogsCountElement = $('.status-favs-reblogs:nth-child(2)').addCustomDOMProperties({
innerCount: el => parseInt(el.innerText, 10)
})
2018-02-20 02:04:37 +01:00
export const getUrl = exec(() => window.location.href)
2018-02-21 18:26:22 +01:00
export const getActiveElementClass = exec(() =>
document.activeElement ? document.activeElement.getAttribute('class') : ''
)
export const goBack = exec(() => window.history.back())
2018-03-01 03:45:29 +01:00
export const getComposeSelectionStart = exec(() => composeInput().selectionStart, {
dependencies: { composeInput }
})
2018-02-21 06:08:26 +01:00
export function getNthStatus (n) {
2018-02-24 23:49:28 +01:00
return $(`div[aria-hidden="false"] > article[aria-posinset="${n}"]`)
2018-02-21 06:08:26 +01:00
}
export function getLastVisibleStatus () {
2018-02-24 23:49:28 +01:00
return $(`div[aria-hidden="false"] > article[aria-posinset]`).nth(-1)
}
export function getFirstVisibleStatus () {
return $(`div[aria-hidden="false"] > article[aria-posinset]`).nth(0)
}
export function getNthFavoriteButton (n) {
return getNthStatus(n).find('.status-toolbar button:nth-child(3)')
}
export function getNthFavorited (n) {
return getNthFavoriteButton(n).getAttribute('aria-pressed')
}
export function getFavoritesCount () {
return favoritesCountElement.innerCount
}
2018-02-25 03:20:33 +01:00
export function getNthReblogButton (n) {
return getNthStatus(n).find('.status-toolbar button:nth-child(2)')
}
export function getNthReblogged (n) {
return getNthReblogButton(n).getAttribute('aria-pressed')
}
2018-02-24 23:49:28 +01:00
export function getReblogsCount () {
return reblogsCountElement.innerCount
2018-02-20 02:04:37 +01:00
}
2018-02-20 03:25:59 +01:00
export async function validateTimeline (t, timeline) {
2018-02-20 02:04:37 +01:00
for (let i = 0; i < timeline.length; i++) {
let status = timeline[i]
if (status.content) {
2018-02-21 06:08:26 +01:00
await t.expect(getNthStatus(i).find('.status-content p').innerText)
2018-02-20 02:04:37 +01:00
.contains(status.content)
}
if (status.spoiler) {
2018-02-21 06:08:26 +01:00
await t.expect(getNthStatus(i).find('.status-spoiler p').innerText)
2018-02-20 02:04:37 +01:00
.contains(status.spoiler)
}
if (status.followedBy) {
2018-02-21 06:08:26 +01:00
await t.expect(getNthStatus(i).find('.status-header span').innerText)
2018-02-20 02:04:37 +01:00
.contains(status.followedBy + ' followed you')
}
if (status.rebloggedBy) {
2018-02-21 06:08:26 +01:00
await t.expect(getNthStatus(i).find('.status-header span').innerText)
2018-02-20 02:04:37 +01:00
.contains(status.rebloggedBy + ' boosted your status')
}
if (status.favoritedBy) {
2018-02-21 06:08:26 +01:00
await t.expect(getNthStatus(i).find('.status-header span').innerText)
2018-02-20 02:04:37 +01:00
.contains(status.favoritedBy + ' favorited your status')
}
// hovering forces TestCafé to scroll to that element: https://git.io/vABV2
2018-02-24 23:49:28 +01:00
if (i % SCROLL_INTERVAL === (SCROLL_INTERVAL - 1)) { // only scroll every nth element
2018-02-21 06:08:26 +01:00
await t.hover(getNthStatus(i))
.expect($('.loading-footer').exist).notOk()
2018-02-20 02:04:37 +01:00
}
}
2018-02-20 03:25:59 +01:00
}
2018-02-21 06:08:26 +01:00
2018-02-24 23:49:28 +01:00
export async function scrollTimelineUp (t) {
let oldFirstItem = await getFirstVisibleStatus().getAttribute('aria-posinset')
await t.hover(getFirstVisibleStatus())
let newFirstItem
while (true) {
newFirstItem = await getFirstVisibleStatus().getAttribute('aria-posinset')
if (newFirstItem === '0' || newFirstItem !== oldFirstItem) {
break
}
}
}
export async function scrollToTopOfTimeline (t) {
let i = await getFirstVisibleStatus().getAttribute('aria-posinset')
while (true) {
await t.hover(getNthStatus(i))
.expect($('.loading-footer').exist).notOk()
i -= SCROLL_INTERVAL
if (i <= 0) {
break
}
}
}
2018-02-21 06:08:26 +01:00
export async function scrollToBottomOfTimeline (t) {
2018-02-24 23:49:28 +01:00
let i = 0
2018-02-21 06:08:26 +01:00
while (true) {
2018-02-24 23:49:28 +01:00
await t.hover(getNthStatus(i))
2018-02-21 06:08:26 +01:00
.expect($('.loading-footer').exist).notOk()
2018-02-24 23:49:28 +01:00
let size = await getNthStatus(i).getAttribute('aria-setsize')
i += SCROLL_INTERVAL
if (i >= size - 1) {
2018-02-21 06:08:26 +01:00
break
}
}
2018-02-21 06:30:16 +01:00
}
2018-02-21 18:26:22 +01:00
export async function scrollToStatus (t, n) {
for (let i = 0; i < n; i += 2) {
await t.hover(getNthStatus(n))
}
await t.hover(getNthStatus(n))
}