Наш 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)
})
})