在Firebase函数中存根auth0

时间:2018-11-20 05:00:48

标签: javascript firebase google-cloud-functions sinon auth0

我具有以下Firebase函数,该函数利用Auth0获取用户个人资料。

'use strict';

const {
    dialogflow,
    Image,
  } = require('actions-on-google')

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);

const db = admin.firestore();

// database collection and key names
const DB_BANK_COLLECTION_KEY = 'bank'
// the action name from all Dialogflow intents
const INTENT_WELCOME_USER = 'Default Welcome Intent';

// Initialize the Auth0 client
var AuthenticationClient = require('auth0').AuthenticationClient;
var auth0 = new AuthenticationClient({
    domain: functions.config().familybank.auth0.domain,
    clientID: functions.config().familybank.auth0.clientid
});

const app = dialogflow();

app.intent(INTENT_WELCOME_USER, async (conv) => {
    console.log('Request: ' + JSON.stringify(conv.request));

    const userInfo = await auth0.getProfile(conv.user.access.token)
    .catch( function(err) {
        console.error('Error getting userProfile from Auth0: ' + err);
        conv.close("Something went wrong. Please try again in a few minutes. " + err)
    });
    console.log('userInfo: ' + JSON.stringify(userInfo));

    // check for existing bank, if not present, create it
    var bankRef = db.collection(DB_BANK_COLLECTION_KEY).doc(userInfo.email);
    const bankSnapshot = await bankRef.get()

})

exports.accessAccount = functions.https.onRequest(app);

我尝试使用以下代码(以及几个排列)在测试中模拟auth0,但实际功能总是被调用而不是模拟。

const chai = require('chai');
const assert = chai.assert;

const sinon = require('sinon');

// Require firebase-admin so we can stub out some of its methods.
const admin = require('firebase-admin');
const test = require('firebase-functions-test')();

var AuthenticationClient = require('auth0').AuthenticationClient;
var auth0 = new AuthenticationClient({
  domain: "mock",
  clientID: "mock"
});

describe('Cloud Functions', () => {
  let myFunctions, adminInitStub;

  before(() => {
    test.mockConfig({"familybank": {"auth0": {"domain": "mockdomain", "clientid": "mockid"}}});
    adminInitStub = sinon.stub(admin, 'initializeApp');
    sinon.stub(admin, 'firestore')
   .get(function() { 
       return function() { 
           return "data";
       }
    });
    sinon.stub(auth0, 'getProfile').callsFake( function fakeGetProfile(accessToken) {
      return Promise.resolve({"email": "daniel.watrous@gmail.com", "accessToken": accessToken});
    });
    myFunctions = require('../index');
  });

  after(() => {
    adminInitStub.restore();
    test.cleanup();
  });

  describe('accessAccount', () => {

    it('should return a 200', (done) => {
      const req = {REQUESTDATA};
      const res = {
        redirect: (code, url) => {
          assert.equal(code, 200);
          done();
        }
      };

      myFunctions.accessAccount(req, res);
    });
  });
})

是否有某种方法可以为脱机测试模拟auth0?

1 个答案:

答案 0 :(得分:0)

我发现,与其初始化Auth0 AuthenticationClient,不如我首先需要UsersManager,在其中定义了getProfile(包装getInfo)。

var UsersManager = require('auth0/src/auth/UsersManager');

然后在我的before()方法中,可以像这样为getInfo创建存根

sinon.stub(UsersManager.prototype, 'getInfo').callsFake( function fakeGetProfile() {
  return Promise.resolve({"email": "some.user@company.com"});
});

所有对auth0.getProfile的调用然后返回一个Promise,该Promise解析为我的存根伪造函数中显示的文档。