From 874de2de300a95b080166e5a55f3da209d172180 Mon Sep 17 00:00:00 2001 From: Kyle Quarles Date: Wed, 14 Sep 2016 13:42:49 -0400 Subject: [PATCH 1/5] Adjusted options and succeed/fail callbacks to consider expected failures (options.expect_fail) - this enhances its use for integration test cases. Additionally added a spacing argument to JSON.stringify when printing messages, so output is human-readable even when objects are returned. --- utils/invoke_task.js | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/utils/invoke_task.js b/utils/invoke_task.js index a9db0b9..b93eb56 100644 --- a/utils/invoke_task.js +++ b/utils/invoke_task.js @@ -27,7 +27,8 @@ invokeTask.getHandler = function (grunt) { 'file_name': 'index.js', 'event': 'event.json', 'client_context': 'client_context.json', - 'identity': 'identity.json' + 'identity': 'identity.json', + 'expect_fail': false }); grunt.log.writeln(""); @@ -74,22 +75,24 @@ invokeTask.getHandler = function (grunt) { process.chdir(cwd); } grunt.log.writeln(""); - grunt.log.writeln("Success! Message:"); - grunt.log.writeln("------------------"); - var msg = (typeof(result) === 'object') ? JSON.stringify(result) : result; + var header = (options.expect_fail ? "Unexpected " : "") + "Success! Message:" + grunt.log.writeln(header); + grunt.log.writeln(grunt.repeat(header.length, "-")); + var msg = (typeof(result) === 'object') ? JSON.stringify(result, 2) : result; grunt.log.writeln((typeof(result) !== 'undefined') ? msg : "Successful!"); - done(true); + done(true && !options.expect_fail); }, fail: function (error) { if (cwd) { process.chdir(cwd); } grunt.log.writeln(""); - grunt.log.writeln("Failure! Message:"); - grunt.log.writeln("------------------"); - var msg = (typeof(error) === 'object') ? JSON.stringify(error) : error; + var header = (options.expect_fail ? "Expected " : "") + "Failure! Message:" + grunt.log.writeln(header); + grunt.log.writeln(grunt.repeat(header.length, "-")); + var msg = (typeof(error) === 'object') ? JSON.stringify(error, 2) : error; grunt.log.writeln((typeof(error) !== 'undefined') ? msg : "Error not provided."); - done(false); + done(false || options.expect_fail); }, awsRequestId: 'LAMBDA_INVOKE', logStreamName: 'LAMBDA_INVOKE', From 7f3935240172925a5aba1b07eff74c71789ee286 Mon Sep 17 00:00:00 2001 From: Kyle Quarles Date: Wed, 14 Sep 2016 13:45:56 -0400 Subject: [PATCH 2/5] Verbage cleanup --- utils/invoke_task.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/invoke_task.js b/utils/invoke_task.js index b93eb56..e1cb8c6 100644 --- a/utils/invoke_task.js +++ b/utils/invoke_task.js @@ -75,7 +75,7 @@ invokeTask.getHandler = function (grunt) { process.chdir(cwd); } grunt.log.writeln(""); - var header = (options.expect_fail ? "Unexpected " : "") + "Success! Message:" + var header = (options.expect_fail ? "Unexpected" : "Expected") + " Success! Message:" grunt.log.writeln(header); grunt.log.writeln(grunt.repeat(header.length, "-")); var msg = (typeof(result) === 'object') ? JSON.stringify(result, 2) : result; @@ -87,7 +87,7 @@ invokeTask.getHandler = function (grunt) { process.chdir(cwd); } grunt.log.writeln(""); - var header = (options.expect_fail ? "Expected " : "") + "Failure! Message:" + var header = (options.expect_fail ? "Expected" : "Unexpected") + " Failure! Message:" grunt.log.writeln(header); grunt.log.writeln(grunt.repeat(header.length, "-")); var msg = (typeof(error) === 'object') ? JSON.stringify(error, 2) : error; From 2e4e44c98d46e2344b023c4124e53870302a1327 Mon Sep 17 00:00:00 2001 From: Kyle Quarles Date: Wed, 14 Sep 2016 14:38:15 -0400 Subject: [PATCH 3/5] Added test cases, fixed dumb mistakes :) --- test/unit/invoke_task_test.js | 91 ++++++++++++++++++++++++++--------- utils/invoke_task.js | 14 +++--- 2 files changed, 73 insertions(+), 32 deletions(-) diff --git a/test/unit/invoke_task_test.js b/test/unit/invoke_task_test.js index e116477..374bc42 100644 --- a/test/unit/invoke_task_test.js +++ b/test/unit/invoke_task_test.js @@ -88,7 +88,7 @@ invokeTaskTests.testLambdaEnvironment = function(test) { callback: function(harness) { test.equal(harness.status, true); test.equal(harness.output.length, 5); - test.equal(harness.output[2], 'Success! Message:'); + test.equal(harness.output[2], 'Expected Success! Message:'); test.equal(harness.output[4], 'My Message'); test.done(); } @@ -110,7 +110,7 @@ invokeTaskTests.testDoneSucceed = function(test) { callback: function(harness) { test.equal(harness.status, true); test.equal(harness.output.length, 5); - test.equal(harness.output[2], 'Success! Message:'); + test.equal(harness.output[2], 'Expected Success! Message:'); test.equal(harness.output[4], 'My Message'); test.done(); } @@ -132,8 +132,8 @@ invokeTaskTests.testDoneWithObjectStatus = function(test) { callback: function(harness) { test.equal(harness.status, true); test.equal(harness.output.length, 5); - test.equal(harness.output[2], 'Success! Message:'); - test.equal(harness.output[4], '{"some":"object"}'); + test.equal(harness.output[2], 'Expected Success! Message:'); + test.equal(harness.output[4], '{\n "some": "object"\n}'); test.done(); } }; @@ -155,7 +155,7 @@ invokeTaskTests.testDoneUndefined = function(test) { callback: function(harness) { test.equal(harness.status, true); test.equal(harness.output.length, 5); - test.equal(harness.output[2], 'Success! Message:'); + test.equal(harness.output[2], 'Expected Success! Message:'); test.equal(harness.output[4], 'My Message'); test.done(); } @@ -178,8 +178,8 @@ invokeTaskTests.testDoneError = function(test) { callback: function(harness) { test.equal(harness.status, false); test.equal(harness.output.length, 5); - test.equal(harness.output[2], 'Failure! Message:'); - test.equal(harness.output[4], '{"message":"Some Error"}'); + test.equal(harness.output[2], 'Unexpected Failure! Message:'); + test.equal(harness.output[4], '{\n "message": "Some Error"\n}'); test.done(); } }; @@ -201,8 +201,8 @@ invokeTaskTests.testFail = function(test) { callback: function(harness) { test.equal(harness.status, false); test.equal(harness.output.length, 5); - test.equal(harness.output[2], 'Failure! Message:'); - test.equal(harness.output[4], '{"message":"Some Error"}'); + test.equal(harness.output[2], 'Unexpected Failure! Message:'); + test.equal(harness.output[4], '{\n "message": "Some Error"\n}'); test.done(); } }; @@ -225,7 +225,7 @@ invokeTaskTests.testFileName = function(test) { callback: function(harness) { test.equal(harness.status, true); test.equal(harness.output.length, 5); - test.equal(harness.output[2], 'Success! Message:'); + test.equal(harness.output[2], 'Expected Success! Message:'); test.equal(harness.output[4], 'My Message'); test.done(); } @@ -249,7 +249,7 @@ invokeTaskTests.testHandler = function(test) { callback: function(harness) { test.equal(harness.status, true); test.equal(harness.output.length, 5); - test.equal(harness.output[2], 'Success! Message:'); + test.equal(harness.output[2], 'Expected Success! Message:'); test.equal(harness.output[4], 'My Message'); test.done(); } @@ -273,7 +273,7 @@ invokeTaskTests.testFileName = function(test) { callback: function(harness) { test.equal(harness.status, true); test.equal(harness.output.length, 5); - test.equal(harness.output[2], 'Success! Message:'); + test.equal(harness.output[2], 'Expected Success! Message:'); test.equal(harness.output[4], 'My Message'); test.done(); } @@ -302,7 +302,7 @@ invokeTaskTests.testEvent = function(test) { callback: function(harness) { test.equal(harness.status, true); test.equal(harness.output.length, 5); - test.equal(harness.output[2], 'Success! Message:'); + test.equal(harness.output[2], 'Expected Success! Message:'); test.equal(harness.output[4], 'My Message'); test.done(); } @@ -331,7 +331,7 @@ invokeTaskTests.testClientContext = function(test) { callback: function(harness) { test.equal(harness.status, true); test.equal(harness.output.length, 5); - test.equal(harness.output[2], 'Success! Message:'); + test.equal(harness.output[2], 'Expected Success! Message:'); test.equal(harness.output[4], 'My Message'); test.done(); } @@ -360,7 +360,7 @@ invokeTaskTests.testIdentity = function(test) { callback: function(harness) { test.equal(harness.status, true); test.equal(harness.output.length, 5); - test.equal(harness.output[2], 'Success! Message:'); + test.equal(harness.output[2], 'Expected Success! Message:'); test.equal(harness.output[4], 'My Message'); test.done(); } @@ -389,7 +389,7 @@ invokeTaskTests.testPackageFolder = function(test) { test.equal(process.cwd(), original); test.equal(harness.status, true); test.equal(harness.output.length, 5); - test.equal(harness.output[2], 'Success! Message:'); + test.equal(harness.output[2], 'Expected Success! Message:'); test.equal(harness.output[4], 'My Message'); test.done(); } @@ -414,7 +414,7 @@ invokeTaskTests.testNoClientContext = function(test) { callback: function(harness) { test.equal(harness.status, true); test.equal(harness.output.length, 5); - test.equal(harness.output[2], 'Success! Message:'); + test.equal(harness.output[2], 'Expected Success! Message:'); test.equal(harness.output[4], 'My Message'); test.done(); } @@ -439,7 +439,7 @@ invokeTaskTests.testNoIdentity = function(test) { callback: function(harness) { test.equal(harness.status, true); test.equal(harness.output.length, 5); - test.equal(harness.output[2], 'Success! Message:'); + test.equal(harness.output[2], 'Expected Success! Message:'); test.equal(harness.output[4], 'My Message'); test.done(); } @@ -460,7 +460,7 @@ invokeTaskTests.testCallbackSucceed = function(test) { callback: function(harness) { test.equal(harness.status, true); test.equal(harness.output.length, 5); - test.equal(harness.output[2], 'Success! Message:'); + test.equal(harness.output[2], 'Expected Success! Message:'); test.equal(harness.output[4], 'My Message'); test.done(); } @@ -482,8 +482,8 @@ invokeTaskTests.testCallbackWithObjectStatus = function(test) { callback: function(harness) { test.equal(harness.status, true); test.equal(harness.output.length, 5); - test.equal(harness.output[2], 'Success! Message:'); - test.equal(harness.output[4], '{"some":"object"}'); + test.equal(harness.output[2], 'Expected Success! Message:'); + test.equal(harness.output[4], '{\n "some": "object"\n}'); test.done(); } }; @@ -505,7 +505,7 @@ invokeTaskTests.testCallbackUndefined = function(test) { callback: function(harness) { test.equal(harness.status, true); test.equal(harness.output.length, 5); - test.equal(harness.output[2], 'Success! Message:'); + test.equal(harness.output[2], 'Expected Success! Message:'); test.equal(harness.output[4], 'My Message'); test.done(); } @@ -528,13 +528,56 @@ invokeTaskTests.testCallbackError = function(test) { callback: function(harness) { test.equal(harness.status, false); test.equal(harness.output.length, 5); - test.equal(harness.output[2], 'Failure! Message:'); - test.equal(harness.output[4], '{"message":"Some Error"}'); + test.equal(harness.output[2], 'Unexpected Failure! Message:'); + test.equal(harness.output[4], '{\n "message": "Some Error"\n}'); test.done(); } }; gruntMock.execute(invokeTask.getHandler, harnessParams); }; +invokeTaskTests.testUnexpectedSuccess = function(test) { + test.expect(4); + + setLambdaFunction(function(event, context, callback) { + callback(null, 'My message'); + }); + + var invokeTask = require('../../utils/invoke_task'); + + var harnessParams = { + options: {expect_fail: true}, + callback: function(harness) { + test.equal(harness.status, false); + test.equal(harness.output.length, 5); + test.equal(harness.output[2], 'Unexpected Success! Message:'); + test.equal(harness.output[4], 'My message'); + test.done(); + } + }; + gruntMock.execute(invokeTask.getHandler, harnessParams); +} + +invokeTaskTests.testExpectedFailure = function(test) { + test.expect(4); + + setLambdaFunction(function(event, context, callback) { + callback({message: 'Some Error'}, 'My message'); + }); + + var invokeTask = require('../../utils/invoke_task'); + + var harnessParams = { + options: {expect_fail: true}, + callback: function(harness) { + test.equal(harness.status, true); + test.equal(harness.output.length, 5); + test.equal(harness.output[2], 'Expected Failure! Message:'); + test.equal(harness.output[4], '{\n "message": "Some Error"\n}'); + test.done(); + } + }; + gruntMock.execute(invokeTask.getHandler, harnessParams); +} module.exports = invokeTaskTests; \ No newline at end of file diff --git a/utils/invoke_task.js b/utils/invoke_task.js index e1cb8c6..2e8ea15 100644 --- a/utils/invoke_task.js +++ b/utils/invoke_task.js @@ -75,10 +75,9 @@ invokeTask.getHandler = function (grunt) { process.chdir(cwd); } grunt.log.writeln(""); - var header = (options.expect_fail ? "Unexpected" : "Expected") + " Success! Message:" - grunt.log.writeln(header); - grunt.log.writeln(grunt.repeat(header.length, "-")); - var msg = (typeof(result) === 'object') ? JSON.stringify(result, 2) : result; + grunt.log.writeln((options.expect_fail ? "Unexpected" : "Expected") + " Success! Message:"); + grunt.log.writeln("-----------------------------"); + var msg = (typeof(result) === 'object') ? JSON.stringify(result, null, 2) : result; grunt.log.writeln((typeof(result) !== 'undefined') ? msg : "Successful!"); done(true && !options.expect_fail); }, @@ -87,10 +86,9 @@ invokeTask.getHandler = function (grunt) { process.chdir(cwd); } grunt.log.writeln(""); - var header = (options.expect_fail ? "Expected" : "Unexpected") + " Failure! Message:" - grunt.log.writeln(header); - grunt.log.writeln(grunt.repeat(header.length, "-")); - var msg = (typeof(error) === 'object') ? JSON.stringify(error, 2) : error; + grunt.log.writeln((options.expect_fail ? "Expected" : "Unexpected") + " Failure! Message:"); + grunt.log.writeln("-----------------------------"); + var msg = (typeof(error) === 'object') ? JSON.stringify(error, null, 2) : error; grunt.log.writeln((typeof(error) !== 'undefined') ? msg : "Error not provided."); done(false || options.expect_fail); }, From dccc454935e86a3885c28c5d0e13beada5ff202b Mon Sep 17 00:00:00 2001 From: Kyle Quarles Date: Wed, 14 Sep 2016 14:43:30 -0400 Subject: [PATCH 4/5] One day I might learn to run lint as a pre-commit task. Today is, unfortunately, not that day. --- test/unit/invoke_task_test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unit/invoke_task_test.js b/test/unit/invoke_task_test.js index 374bc42..a45d84a 100644 --- a/test/unit/invoke_task_test.js +++ b/test/unit/invoke_task_test.js @@ -556,7 +556,7 @@ invokeTaskTests.testUnexpectedSuccess = function(test) { } }; gruntMock.execute(invokeTask.getHandler, harnessParams); -} +}; invokeTaskTests.testExpectedFailure = function(test) { test.expect(4); @@ -578,6 +578,6 @@ invokeTaskTests.testExpectedFailure = function(test) { } }; gruntMock.execute(invokeTask.getHandler, harnessParams); -} +}; module.exports = invokeTaskTests; \ No newline at end of file From 0535e93b9b07ddd06ab935a64d4770801943f1d0 Mon Sep 17 00:00:00 2001 From: Kyle Quarles Date: Wed, 14 Sep 2016 15:15:11 -0400 Subject: [PATCH 5/5] Added integration tests, fixed package_folder_options to work on Windows (lfs previously mismatched, causing equals assertion to fail) --- Gruntfile.js | 15 +++++++++++ test/expected/custom_options | 4 +-- test/expected/default_options | 4 +-- test/expected/expected_failure_options | 11 ++++++++ test/expected/failure_options | 4 +-- test/expected/unexpected_success_options | 12 +++++++++ test/integ/lambda_invoke_test.js | 32 ++++++++++++++++++++++-- 7 files changed, 74 insertions(+), 8 deletions(-) create mode 100644 test/expected/expected_failure_options create mode 100644 test/expected/unexpected_success_options diff --git a/Gruntfile.js b/Gruntfile.js index 8b8d605..9baf38e 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -53,6 +53,21 @@ module.exports = function (grunt) { handler: 'myfunction' } }, + expected_failure_options: { + options: { + file_name: 'test/fixtures/failing_index.js', + event: 'test/fixtures/event.json', + handler: 'myfunction', + expect_fail: true + } + }, + unexpected_success_options: { + options: { + file_name: 'test/fixtures/index.js', + event: 'test/fixtures/event.json', + expect_fail: true + } + }, package_folder_options: { options: { package_folder: 'test/fixtures/package_folder_option', diff --git a/test/expected/custom_options b/test/expected/custom_options index ea6a5f4..b881bc2 100644 --- a/test/expected/custom_options +++ b/test/expected/custom_options @@ -4,8 +4,8 @@ value1 = value4 value2 = value5 value3 = value6 -Success! Message: ------------------- +Expected Success! Message: +----------------------------- Hello World Done, without errors. \ No newline at end of file diff --git a/test/expected/default_options b/test/expected/default_options index dd0ac50..4e38cec 100644 --- a/test/expected/default_options +++ b/test/expected/default_options @@ -4,8 +4,8 @@ value1 = value1 value2 = value2 value3 = value3 -Success! Message: ------------------- +Expected Success! Message: +----------------------------- Hello World Done, without errors. \ No newline at end of file diff --git a/test/expected/expected_failure_options b/test/expected/expected_failure_options new file mode 100644 index 0000000..679f84c --- /dev/null +++ b/test/expected/expected_failure_options @@ -0,0 +1,11 @@ +Running "lambda_invoke:expected_failure_options" (lambda_invoke) task + +value1 = value1 +value2 = value2 +value3 = value3 + +Expected Failure! Message: +----------------------------- +Hello World + +Done, without errors. \ No newline at end of file diff --git a/test/expected/failure_options b/test/expected/failure_options index a432f79..5940e3b 100644 --- a/test/expected/failure_options +++ b/test/expected/failure_options @@ -4,8 +4,8 @@ value1 = value1 value2 = value2 value3 = value3 -Failure! Message: ------------------- +Unexpected Failure! Message: +----------------------------- Hello World Warning: Task "lambda_invoke:failure_options" failed. Use --force to continue. diff --git a/test/expected/unexpected_success_options b/test/expected/unexpected_success_options new file mode 100644 index 0000000..701e635 --- /dev/null +++ b/test/expected/unexpected_success_options @@ -0,0 +1,12 @@ +Running "lambda_invoke:unexpected_success_options" (lambda_invoke) task + +value1 = value1 +value2 = value2 +value3 = value3 + +Unexpected Success! Message: +----------------------------- +Hello World +Warning: Task "lambda_invoke:unexpected_success_options" failed. Use --force to continue. + +Aborted due to warnings. \ No newline at end of file diff --git a/test/integ/lambda_invoke_test.js b/test/integ/lambda_invoke_test.js index 9261d97..0baef22 100644 --- a/test/integ/lambda_invoke_test.js +++ b/test/integ/lambda_invoke_test.js @@ -74,6 +74,34 @@ exports.lambda_invoke = { test.done(); }); }, + expected_failure_options: function (test) { + test.expect(1); + + grunt.util.spawn({ + grunt: true, + args: ['lambda_invoke:expected_failure_options', '--no-color'] + }, function (err, result, code) { + + var expected = getNormalizedFile('test/expected/expected_failure_options'); + var actual = grunt.util.normalizelf(result.stdout); + test.equal(actual, expected); + test.done(); + }); + }, + unexpected_success_options: function (test) { + test.expect(1); + + grunt.util.spawn({ + grunt: true, + args: ['lambda_invoke:unexpected_success_options', '--no-color'] + }, function (err, result, code) { + + var expected = getNormalizedFile('test/expected/unexpected_success_options'); + var actual = grunt.util.normalizelf(result.stdout); + test.equal(actual, expected); + test.done(); + }); + }, package_folder_options: function (test) { test.expect(2); @@ -85,9 +113,9 @@ exports.lambda_invoke = { var cwd = process.cwd(); // test cwd inside the function - var expected_cwd = 'Running "lambda_invoke:package_folder_options" (lambda_invoke) task\n\n\nSuccess! Message:\n------------------\n' + + var expected_cwd = grunt.util.normalizelf('Running "lambda_invoke:package_folder_options" (lambda_invoke) task\n\n\nExpected Success! Message:\n-----------------------------\n' + path.join(cwd, 'test/fixtures/package_folder_option') + - '\n\nDone, without errors.'; + '\n\nDone, without errors.'); var actual_cwd = grunt.util.normalizelf(result.stdout); test.equal(actual_cwd, expected_cwd);