Как запустить интеграционные тесты в Node.js с администратором Firebase - PullRequest
0 голосов
/ 12 марта 2020

Наш back-end (Node) и наш front-end (React) размещены на GCP и Heroku соответственно.

Мы работаем над добавлением автоматических тестов в наш back-end код, но пока не работаем убедитесь, как тестировать аутентифицированные маршруты, так как все наши маршруты аутентифицируются с использованием Firebase. В частности, у нас есть Firebase Client на внешнем интерфейсе и Firebase Admin на внутреннем.

В нашей тестовой среде в настоящее время используются Jest и Supertest. Мы пытались использовать пакет firebase-mock , чтобы проверить его, но это не помогло. Поскольку мы всегда получаем ответ 400, даже при передаче ложного токена.

Вот код нашего auth промежуточного программного обеспечения:

// This middleware will verify that a request is coming from an authorized user
const admin = require('firebase-admin')

module.exports = async function auth(req, res, next) {
  // Try to extract the firebase-auth-token from the request header, 
  // respond with access denied if firebase-auth-token is not found
  const token = req.header('x-auth-token')
  if (!token) res.status(401).send('Access denied. No auth token provided.')

  try {
    const decodedToken = await admin.auth().verifyIdToken(token)

    req.user = { ...decodedToken }
    next()
  } catch (ex) {
    // Respond with 'bad request' if the token is invalid
    res.status(400).send('Invalid token.')
  }
}

Вот код для нашего auth.test.js файла:

const request = require('supertest')
const firebasemock = require('firebase-mock')
const server = require('../../index')

const mockauth = new firebasemock.MockAuthentication()

const mocksdk = new firebasemock.MockFirebaseSdk(
  null,
  // use null if your code does not use AUTHENTICATION
  () => mockauth,
  null,
  null,
  null
)

describe('auth middleware', () => {
  afterEach(async () => {
    await server.close()
  })

  let token

  const exec = () =>
    request(server)
      .get('/api/users')
      .set('x-auth-token', token)

  it('should return 200 if token is valid', async () => {
    mocksdk.auth().autoFlush()

    // create a user
    mocksdk.auth().createUser({
      uid: '123',
      email: 'test@test.com',
      password: 'abc123'
    })

    const user = await mocksdk.auth().getUser('123')
    token = await user.getIdToken()

    const res = await exec()

    expect(res.status).toBe(200)
  })
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...