peter/jsonapitest

View on GitHub
lib/response.js

Summary

Maintainability
A
0 mins
Test Coverage
"use strict";
var util = require('./util'),
    selectHelper = require('./select_helper'),
    assertHelper = require('./assert_helper');

var select = function(response, selector) {
  return selectHelper.select(response, selector);
};
exports.select = select;

var save = function(options, response, data) {
  util.each(options, function(selector, key) {
    util.nestedValue.set(data, key, select(response, selector));
  });
};
exports.save = save;

var invokeFunction = function(data, assertion, response) {
  try {
    assertion.call(data, response.body, response.headers);
    return [];
  } catch (err) {
    return [{error_message: err.message, error_stack: err.stack}];
  }
};

var assert = function(data, assertion, response, customFunctions) {
  if (util.isFunction(assertion)) {
    return invokeFunction(data, assertion, response);
  } else {
    var selectValue = select(response, (assertion.select || 'body'));
    return assertHelper.errors(assertion, selectValue, customFunctions);
  }
};
exports.assert = assert;

var normalizeAssertions = function(apiCall) {
  var assertions = apiCall.assert || [];
  if (!util.isArray(assertions)) assertions = Array(assertions);
  if (apiCall.status) assertions = assertions.concat([{select: "status", equal: apiCall.status}]);
  return assertions;
};

var assertAll = function(data, apiCall, response, customFunctions) {
  var errors = [],
      assertions = normalizeAssertions(apiCall);
  assertions.forEach(function(assertion) {
    errors = errors.concat(assert(data, assertion, response, customFunctions));
  });
  return errors;
};
exports.assertAll = assertAll;

exports.process = function(apiCall, response, context) {
  //console.log("response.process: response=" + JSON.stringify(response));
  if (apiCall.save) save(apiCall.save, response, context.data);
  return assertAll(context.data, apiCall, response, util.loadModule(context, 'assert_functions'));
};