Skip to content

Commit

Permalink
Added tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Konstantin Yegupov committed Aug 21, 2019
1 parent d04bb7c commit 5d9700f
Show file tree
Hide file tree
Showing 7 changed files with 608 additions and 12 deletions.
4 changes: 3 additions & 1 deletion src/cli/commands/test/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,9 @@ async function test(...args: MethodArgs): Promise<string> {
throw err;
}

const pinningSupported = (await isFeatureFlagSupportedForOrg('pythonPinning')).ok;
const pinningSupported =
results.find((r) => (r as LegacyVulnApiResult).packageManager === 'pip') &&
(await isFeatureFlagSupportedForOrg('pythonPinning')).ok;

let response = results
.map((unused, i) => {
Expand Down
2 changes: 1 addition & 1 deletion src/lib/snyk-test/run-test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as _ from 'lodash';
import fs = require('then-fs');
import * as fs from 'fs';
import pathUtil = require('path');
import moduleToObject = require('snyk-module');
import * as depGraphLib from '@snyk/dep-graph';
Expand Down
65 changes: 61 additions & 4 deletions test/acceptance/cli.acceptance.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,11 @@ const after = tap.runOnly ? only : test;
// Should be after `process.env` setup.
import * as plugins from '../../src/lib/plugins';
import { legacyPlugin as pluginApi } from '@snyk/cli-interface';
import { AuthFailedError } from '../../src/lib/errors/authentication-failed-error';
import { InternalServerError } from '../../src/lib/errors';
import { fail } from 'assert';

function loadJson(filename: string) {
return JSON.parse(fs.readFileSync(filename, 'utf-8'))
}

// @later: remove this config stuff.
// Was copied straight from ../src/cli-server.js
Expand Down Expand Up @@ -1224,7 +1227,10 @@ test('`test pip-app --file=requirements.txt`', async (t) => {
await cli.test('pip-app', {
file: 'requirements.txt',
});
const req = server.popRequest();
let req = server.popRequest();
t.equal(req.method, 'GET', 'makes GET request');
t.match(req.url, 'cli-config/feature-flags/pythonPinning', 'to correct url');
req = server.popRequest();
t.equal(req.method, 'POST', 'makes POST request');
t.equal(req.headers['x-snyk-cli-version'], versionNumber, 'sends version number');
t.match(req.url, '/test-dep-graph', 'posts to correct url');
Expand Down Expand Up @@ -1266,7 +1272,10 @@ test('`test pipenv-app --file=Pipfile`', async (t) => {
await cli.test('pipenv-app', {
file: 'Pipfile',
});
const req = server.popRequest();
let req = server.popRequest();
t.equal(req.method, 'GET', 'makes GET request');
t.match(req.url, 'cli-config/feature-flags/pythonPinning', 'to correct url');
req = server.popRequest();
t.equal(req.method, 'POST', 'makes POST request');
t.equal(req.headers['x-snyk-cli-version'], versionNumber, 'sends version number');
t.match(req.url, '/test-dep-graph', 'posts to correct url');
Expand All @@ -1284,6 +1293,54 @@ test('`test pipenv-app --file=Pipfile`', async (t) => {
}], 'calls python plugin');
});

test('`test pip-app-transitive-vuln --file=requirements.txt`', async (t) => {
chdirWorkspaces();
const plugin = {
async inspect() {
return loadJson('./pip-app-transitive-vuln/inspect-result.json');
},
};
const spyPlugin = sinon.spy(plugin, 'inspect');

const loadPlugin = sinon.stub(plugins, 'loadPlugin');
t.teardown(loadPlugin.restore);
loadPlugin
.withArgs('pip')
.returns(plugin);

server.setNextResponses([
{ok: true},
loadJson('./pip-app-transitive-vuln/response-with-remediation.json'),
]);
t.teardown(() => server.setNextResponses([]));
try {
await cli.test('pip-app-transitive-vuln', {
file: 'requirements.txt',
});
t.fail('should throw, since there are vulns');
} catch (e) {
t.match(e.message, /Pin Jinja2 to 2.10.1 to fix/);
}
let req = server.popRequest();
t.equal(req.method, 'GET', 'makes GET request');
t.match(req.url, 'cli-config/feature-flags/pythonPinning', 'to correct url');
req = server.popRequest();
t.equal(req.method, 'POST', 'makes POST request');
t.equal(req.headers['x-snyk-cli-version'], versionNumber, 'sends version number');
t.match(req.url, '/test-dep-graph', 'posts to correct url');
t.equal(req.body.depGraph.pkgManager.name, 'pip');
t.same(spyPlugin.getCall(0).args,
['pip-app-transitive-vuln', 'requirements.txt', {
args: null,
file: 'requirements.txt',
org: null,
projectName: null,
packageManager: 'pip',
path: 'pip-app-transitive-vuln',
showVulnPaths: true,
}], 'calls python plugin');
});

test('`test nuget-app --file=project.assets.json`', async (t) => {
chdirWorkspaces();
const plugin = {
Expand Down
17 changes: 11 additions & 6 deletions test/acceptance/fake-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ import * as restify from 'restify';

interface FakeServer extends restify.Server {
_reqLog: restify.Request[];
_nextResponse?: restify.Response;
_nextResponseQueue: restify.Response[];
_nextStatusCode?: number;
popRequest: () => restify.Request;
setNextResponse: (r: any) => void;
setNextResponses: (r: any[]) => void;
setNextStatusCodeAndResponse: (c: number, r: any) => void;
}

Expand All @@ -14,6 +15,7 @@ export function fakeServer(root, apikey) {
name: 'snyk-mock-server',
version: '1.0.0',
}) as FakeServer;
server._nextResponseQueue = [];
server._reqLog = [];
server.popRequest = function () {
return server._reqLog.pop()!;
Expand Down Expand Up @@ -53,11 +55,10 @@ export function fakeServer(root, apikey) {
});

server.use(function (req, res, next) {
if (!server._nextResponse && !server._nextStatusCode) {
if (!server._nextResponseQueue.length && !server._nextStatusCode) {
return next();
}
var response = server._nextResponse;
delete server._nextResponse;
var response = server._nextResponseQueue.pop();
if (server._nextStatusCode) {
const code = server._nextStatusCode;
delete server._nextStatusCode;
Expand Down Expand Up @@ -144,12 +145,16 @@ export function fakeServer(root, apikey) {
});

server.setNextResponse = function (response) {
server._nextResponse = response;
server._nextResponseQueue = [response];
};

server.setNextResponses = function (responses) {
server._nextResponseQueue = responses;
};

server.setNextStatusCodeAndResponse = (code, body) => {
server._nextStatusCode = code;
server._nextResponse = body;
server._nextResponseQueue = [body];
};

return server;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
{
"plugin": {
"name": "snyk-python-plugin",
"runtime": "Python 2.7.16"
},
"package": {
"packageFormatVersion": "pip:0.0.1",
"version": "0.0.0",
"name": "pip-app-transitive-vuln",
"dependencies": {
"flask": {
"version": "0.12.2",
"name": "flask",
"dependencies": {
"itsdangerous": {
"version": "0.24",
"name": "itsdangerous"
},
"Jinja2": {
"version": "2.9.6",
"name": "Jinja2",
"dependencies": {
"MarkupSafe": {
"version": "1.0",
"name": "MarkupSafe"
}
}
},
"click": {
"version": "6.7",
"name": "click"
},
"Werkzeug": {
"version": "0.12.2",
"name": "Werkzeug"
}
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
flask==0.12.2
Loading

0 comments on commit 5d9700f

Please sign in to comment.