index.js

// Copyright 2018 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

'use strict';

var proc = require('./lib/process.js')
var compile = require('./lib/compile.js')
var sway = require('sway')
var fs = require('fs')
var join = require('path').join
var merge2 = require('./lib/util').merge2

module.exports = {
  generate: generate
}

/**
 * GenerationResults is the final result of the generation function
 * @typedef {object} GenerationResults
 * @property {compilation.GeneratedTest[]} generated set of generated test objects
 */

/**
 * Generates test artifacts based on the given API Spec and options
 * @function generate
 * @instance
 * @param {string} specPath path to the API spec document
 * @param {object} options options to apply during processing of API spec
 * @return {Promise<GenerationResults>}
 */
function generate(specPath, options) {
  return sway.create({
    'definition': specPath,
    'jsonRefs': options && options.jsonRefs,
    'customFormats': options && options.customFormats,
    'customFormatGenerators': options && options.customFormatGenerators,
    'customValidators': options && options.customValidators
  })
      .then(function (api) {
        if (options.customValues) {
          options.customValues = JSON.parse(options.customValues);
        }

        if (options.customValuesFile) {
          var customFromFile = require(
              join(process.cwd(), options.customValuesFile))
          options.customValues = merge2(options.customValues, customFromFile)
        }

        var processed = proc(api, options)
        var compiled = compile(processed, options)

        if (options.writeTo !== undefined) {
          if (!fs.existsSync(options.writeTo)) {
            fs.mkdirSync(options.writeTo)
          }

          try {
            for (var i = 0; i < compiled.length; i++) {
              const testObj = compiled[i];
              fs.writeFileSync(join(options.writeTo, testObj.filename), testObj.contents)
            }
          } catch (err) {
            console.log(err);
          }
        }

        return {'generated': compiled}
      }, function (err) {
        console.error(err.stack);
        return err
      });
}