Как мне протестировать мой запрос, учитывая, что возвращаемый результат всегда зашифрован? - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть этот вспомогательный класс, который помогает сгенерировать заголовок запроса и вернуть его как request.SuperAgentRequest, используя superagent-bluebird-promise.

Мой вопрос здесь

Как мне протестировать мой запрос? Учитывая, что возвращаемый результат всегда зашифрован.

Как проверить security.decryptJWE?

Что я делал до сих пор в своем модульном тестировании, так это проверял только количество раз, когда вызывается функция.

Класс юнит-теста:

let sendRequestSpy = sinon.spy(helper, "sendRequest");

main.updateInfo();

sinon.assert.callCount(sendRequestSpy, 10);

вспомогательный класс:

const restClient = require('superagent-bluebird-promise');

function sendRequest(id) {
    ...

    _.set(headers, "Authorization", authHeaders);

    let request = restClient.get(url);

    // Set headers
    if (!_.isUndefined(headers) && !_.isEmpty(headers)) {
        request.set(headers);
    }

    return request;
}

основной класс:

function updateInfo {

    ...
        for (var i = 0; i < list.length; i++) {

            let request = helper.sendRequest(id);
            request.buffer(true).end(function (err, res) {
            ...
                let data = {
                    body: res.body,
                    text: res.text
                };

                let apiData = data.text;

                let privateKey = "./resource/priv_key.pem";

                var jweParts = apiData.split(".");
                security.decryptJWE(jweParts[0], jweParts[1], jweParts[2], jweParts[3], jweParts[4], privateKey)
                .then(apiData => {
                    ...
                    //process here
                }
            }
    }
}

класс безопасности:

...
security.decryptJWE = function decryptJWE(header, encryptedKey, iv, cipherText, tag, privateKey) {
  console.log("Decrypting JWE".green + " (Format: " + "header".red + "." + "encryptedKey".cyan + "." + "iv".green + "." + "cipherText".magenta + "." + "tag".yellow + ")");
  console.log(header.red + "." + encryptedKey.cyan + "." + iv.green + "." + cipherText.magenta + "." + tag.yellow);
  return new Promise((resolve, reject) => {

    var keystore = jose.JWK.createKeyStore();

    console.log((new Buffer(header, 'base64')).toString('ascii'));

    var data = {
      "type": "compact",
      "ciphertext": cipherText,
      "protected": header,
      "encrypted_key": encryptedKey,
      "tag": tag,
      "iv": iv,
      "header": JSON.parse(jose.util.base64url.decode(header).toString())
    };
    keystore.add(fs.readFileSync(privateKey, 'utf8'), "pem")
      .then(function (jweKey) {
        // {result} is a jose.JWK.Key
        jose.JWE.createDecrypt(jweKey)
          .decrypt(data)
          .then(function (result) {
            resolve(JSON.parse(result.payload.toString()));
          })
          .catch(function (error) {
            reject(error);
          });
      });

  })
    .catch(error => {
      console.error("Error with decrypting JWE: %s".red, error);
      throw "Error with decrypting JWE";
    })
}

1 Ответ

0 голосов
/ 09 ноября 2018

После долгих исследований мне наконец-то удалось выяснить, как проверить мой запрос.

и это использует nocks.

let test = nock('https://test.api.com/id')
        .get('/ID123945/')
        .reply(200, json.encoded.success.result);

Однако я все еще не могу выяснить, как проверить полученные данные (мои собственные и вернуть их в зашифрованном виде)

...