import { loginAsLockedAccount } from '../roles'
import { followAs, unfollowAs } from '../serverActions'
import {
  avatarInComposeBox,
  communityNavButton, followersButton, getNthSearchResult, getSearchResultByHref, getUrl, goBack,
  homeNavButton, sleep
} from '../utils'
import { users } from '../users'
import { Selector as $ } from 'testcafe'

fixture`116-follow-requests.js`
  .page`http://localhost:4002`

const timeout = 30000

test('Can approve and reject follow requests', async t => {
  await loginAsLockedAccount(t)

  // necessary for re-running this test in local testing
  await Promise.all([
    unfollowAs('admin', 'LockedAccount'),
    unfollowAs('baz', 'LockedAccount'),
    unfollowAs('quux', 'LockedAccount')
  ])

  await Promise.all([
    followAs('admin', 'LockedAccount'),
    followAs('baz', 'LockedAccount'),
    followAs('quux', 'LockedAccount')
  ])

  await sleep(2000)

  const approveAdminButton = () => getSearchResultByHref(`/accounts/${users.admin.id}`).find('button:nth-child(1)')
  const rejectBazButton = () => getSearchResultByHref(`/accounts/${users.baz.id}`).find('button:nth-child(2)')
  const approveQuuxButton = () => getSearchResultByHref(`/accounts/${users.quux.id}`).find('button:nth-child(1)')

  await t.click(communityNavButton)
    .click($('a[href="/requests"]'))
    // no guaranteed order on these
    .expect(getNthSearchResult(1).innerText).match(/(@admin|@baz|@quux)/)
    .expect(getNthSearchResult(2).innerText).match(/(@admin|@baz|@quux)/)
    .expect(getNthSearchResult(3).innerText).match(/(@admin|@baz|@quux)/)
    .expect(getNthSearchResult(4).exists).notOk()
    // approve admin
    .expect(approveAdminButton().getAttribute('aria-label')).eql('Approve')
    .hover(approveAdminButton())
    .click(approveAdminButton())
    .expect(getNthSearchResult(1).innerText).match(/(@baz|@quux)/, { timeout })
    .expect(getNthSearchResult(2).innerText).match(/(@baz|@quux)/)
    .expect(getNthSearchResult(3).exists).notOk()
  await goBack()
  await t
    .click($('a[href="/requests"]'))
    // reject baz
    .expect(rejectBazButton().getAttribute('aria-label')).eql('Reject')
    .hover(rejectBazButton())
    .click(rejectBazButton())
    .expect(getNthSearchResult(1).innerText).contains('@quux', { timeout })
    .expect(getNthSearchResult(2).exists).notOk()
  await goBack()
  await t
    .click($('a[href="/requests"]'))
    // approve quux
    .expect(approveQuuxButton().getAttribute('aria-label')).eql('Approve')
    .hover(approveQuuxButton())
    .click(approveQuuxButton())
    .expect(getNthSearchResult(1).exists).notOk({ timeout })
    // check our follow list to make sure they follow us
    .click(homeNavButton)
    .click(avatarInComposeBox)
    .expect(getUrl()).contains(`/accounts/${users.LockedAccount.id}`)
    .click(followersButton)
    .expect(getNthSearchResult(1).innerText).match(/(@admin|@quux)/)
    .expect(getNthSearchResult(2).innerText).match(/(@admin|@quux)/)
    .expect(getNthSearchResult(3).exists).notOk()
})