aboutsummaryrefslogblamecommitdiffhomepage
path: root/server/tests/api/friends-basic.ts
blob: 13edf627312da7d75ff396eff470402a6e956be0 (plain) (tree)










































































































































































































                                                                                    
/* tslint:disable:no-unused-expression */

import 'mocha'
import * as chai from 'chai'
const expect = chai.expect

import {
  ServerInfo,
  flushTests,
  quitFriends,
  wait,
  setAccessTokensToServers,
  flushAndRunMultipleServers,
  killallServers,
  makeFriends,
  getFriendsList,
  dateIsValid,
  quitOneFriend
} from '../utils'

describe('Test basic friends', function () {
  let servers = []

  function makeFriendsWrapper (podNumber: number) {
    const server = servers[podNumber - 1]
    return makeFriends(server.url, server.accessToken)
  }

  async function testMadeFriends (servers: ServerInfo[], serverToTest: ServerInfo) {
    const friends = []
    for (let i = 0; i < servers.length; i++) {
      if (servers[i].url === serverToTest.url) continue
      friends.push(servers[i].host)
    }

    const res = await getFriendsList(serverToTest.url)

    const result = res.body.data
    expect(result).to.be.an('array')
    expect(result.length).to.equal(2)

    const resultHosts = [ result[0].host, result[1].host ]
    expect(resultHosts[0]).to.not.equal(resultHosts[1])

    const errorString = 'Friends host do not correspond for ' + serverToTest.host
    expect(friends).to.contain(resultHosts[0], errorString)
    expect(friends).to.contain(resultHosts[1], errorString)
  }

  // ---------------------------------------------------------------

  before(async function () {
    this.timeout(120000)

    servers = await flushAndRunMultipleServers(3)

    await setAccessTokensToServers(servers)
  })

  it('Should not have friends', async function () {
    for (const server of servers) {
      const res = await getFriendsList(server.url)

      const result = res.body.data
      expect(result).to.be.an('array')
      expect(result.length).to.equal(0)
    }
  })

  it('Should make friends', async function () {
    this.timeout(120000)

    // The second pod make friend with the third
    await makeFriendsWrapper(2)

    // Wait for the request between pods
    await wait(11000)

    // The second pod should have the third as a friend
    const res1 = await getFriendsList(servers[1].url)

    const friends = res1.body.data
    expect(friends).to.be.an('array')
    expect(friends.length).to.equal(1)

    const pod1 = friends[0]
    expect(pod1.host).to.equal(servers[2].host)
    expect(pod1.email).to.equal('admin3@example.com')
    expect(pod1.score).to.equal(20)
    expect(dateIsValid(pod1.createdAt)).to.be.true

    // Same here, the third pod should have the second pod as a friend
    const res2 = await getFriendsList(servers[2].url)
    const result = res2.body.data
    expect(result).to.be.an('array')
    expect(result.length).to.equal(1)

    const pod2 = result[0]
    expect(pod2.host).to.equal(servers[1].host)
    expect(pod2.email).to.equal('admin2@example.com')
    expect(pod2.score).to.equal(20)
    expect(dateIsValid(pod2.createdAt)).to.be.true

    // Finally the first pod make friend with the second pod
    await makeFriendsWrapper(1)

    // Wait for the request between pods
    await wait(11000)

    // Now each pod should be friend with the other ones
    for (const server of servers) {
      await testMadeFriends(servers, server)
    }
  })

  it('Should not be allowed to make friend again', async function () {
    this.timeout(10000)

    const server = servers[1]
    await makeFriends(server.url, server.accessToken, 409)
  })

  it('Should quit friends of pod 2', async function () {
    this.timeout(10000)

    // Pod 1 quit friends
    await quitFriends(servers[1].url, servers[1].accessToken)

    // Pod 1 should not have friends anymore
    const res = await getFriendsList(servers[1].url)
    const friends = res.body.data
    expect(friends).to.be.an('array')
    expect(friends).to.have.lengthOf(0)

    // Other pods shouldn't have pod 1 too
    const serversToTest = [ servers[0].url, servers[2].url ]
    for (const url of serversToTest) {
      const res = await getFriendsList(url)
      const friends = res.body.data

      expect(friends).to.be.an('array')
      expect(friends.length).to.equal(1)
      expect(friends[0].host).not.to.be.equal(servers[1].host)
    }
  })

  it('Should allow pod 2 to make friend again', async function () {
    this.timeout(120000)

    const server = servers[1]
    await makeFriends(server.url, server.accessToken)
    await wait(11000)

    for (const server of servers) {
      await testMadeFriends(servers, server)
    }
  })

  it('Should allow pod 1 to quit only pod 2', async function () {
    // Pod 1 quits pod 2
    const server = servers[0]

    // Get pod 2 id so we can query it
    const res1 = await getFriendsList(server.url)
    const friends1 = res1.body.data
    let pod1 = friends1.find(friend => (friend.host === servers[1].host))

    // Remove it from the friends list
    await quitOneFriend(server.url, server.accessToken, pod1.id)

    // Pod 1 should have only pod 3 in its friends list
    const res2 = await getFriendsList(servers[0].url)
    const friends2 = res2.body.data
    expect(friends2).to.be.an('array')
    expect(friends2.length).to.equal(1)

    const pod2 = friends2[0]
    expect(pod2.host).to.equal(servers[2].host)

    // Pod 2 should have only pod 3 in its friends list
    const res3 = await getFriendsList(servers[1].url)
    const friends3 = res3.body.data
    expect(friends3).to.be.an('array')
    expect(friends3.length).to.equal(1)

    const pod = friends3[0]
    expect(pod.host).to.equal(servers[2].host)

    // Pod 3 should have both pods in its friends list
    const res4 = await getFriendsList(servers[2].url)
    const friends4 = res4.body.data
    expect(friends4).to.be.an('array')
    expect(friends4.length).to.equal(2)
  })

  after(async function () {
    killallServers(servers)

    if (this['ok']) {
      await flushTests()
    }
  })
})