'use strict'

const colors = require('colors')

expect.extend({
  /**
   * Expect Snyk results to have no errors
   * @param {*} received Snyk results
   * @param {*} argument Arguments
   * @returns {object} Matcher result
   */
  toPassSnyk (received, argument) {
    if (received && received.ok === false) {
      let errorMsgBuf = []
      for (let i = 0; i < received.vulnerabilities.length; i++) {
        const result = received.vulnerabilities[i]
        let vulnPath = result.from.slice(1).join(' > ')
        errorMsgBuf.push(colors.red(`└──[${result.severity}] ${result.packageName}\t${result.title}`))
        errorMsgBuf.push(colors.grey(`\t${vulnPath}`))
      }
      return {
        message: () => (errorMsgBuf.join(`\n`)),
        pass: false
      }
    }
    return {
      pass: true
    }
  }
})

describe('Security', () => {
  it('should pass Snyk test', () => {
    const snyk = require('snyk').test
    return snyk('./').then(report => {
      expect(report).toPassSnyk()
    })
  }, 30000)
})