Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

lambda-testing-framework

Unit testing framework for testing requests/responses for Amazon Lambda functions (including Amazon Alexa skills)

Lambda Testing Framework depends upon https://mochajs.org/.

Summary

The lambda-testing-framework is an easy way to perform unit testing for AWS Lambda functions and Amazon Alexa skills by automatically generating mocha test-cases with response validation from a directory of static .json files.

lambda-testing-framework framework uses a data-driven static files approach. You create test-cases in a directory with *.request.json files to represent the event data that should be sumitted to the lambda function under test. The testing framework loads the event/request data, invokes your handler, and then compares the handler's response to the contents of a matching *.response.json file.

Getting Started

  1. Install lambda-testing-framework as a devDependency. npm install -D lambda-testing-framework

  2. Create a test directory with the test-driver in it (let's call it index.js)

    constpath=require("path");constmethod_under_test=require("../index").handler;// the handler function you are testingconsttest=require("lambda-testing-framework");describe("Event tests",()=>test(method_under_test,{path: path.resolve(__dirname,"events")}));
  3. Create a test/events sub-directory.

  4. Place some *.requests.json files in the ./tests/events folder.

  5. Place matching *.response.json files in the same folder.

  6. Setup your package.json to run the tests with:

    "scripts": {
    "test": "mocha"
    }

    and then run them with npm test or npm test debug.

Requests and Responses

It can be tedious to build the input .request.json files by hand, especially if your function handles API Gateway requests. I find it convenient to copy/paste request events from CloudWatch logs.

As an alternative to building the .response.json files by hand, you can allow lambda-testing-framework to save missing response files automatically to create a baseline. To do this, add saveMissingResponses: true to the options object. HINT: I typically have my test/index.js check for the existence of some environment variable to toggle this property.

```javascript
// ...
options.saveMissingResponses = process.env.SAVE_RESPONSES==="true";
// ...
```

Then run it with $ SAVE_RESPONSES=true npm test

API

// Executes all *.request.json test cases in the options.path directorymodule.exports=function(method_under_test,options)
  • method_under_test - The lambda handler function(event, context, callback) you are testing.
  • options.path - path to the directory containing the test cases
  • options.errorExpected - boolean flag to indicate that test case should expect an error to be thrown (in the future, this value may allow for specific errors to be matched)
  • before - function(request, test_case_name, options) : hook that is called before the test is executed
  • after - function(error, response, request, test_case_name, options, validate) - hook that is called after the test is executed, but before validation

The options.before Hook

The options.before hook allows you to provide a custom function that can be used to perform setup tasks or to modify the request object before it is submited for testing. The function must either return the request object or a promise that resolves to the request object. The returned request object will be used for the test, so you can apply custom transformations to the request before processing.

The options.after Hook

The options.after hook can be used to perform custom validation on the error/response, or to modify the error/response before passing on to the normal validation routine. The options.after function may return a promise. The function should throw an error if the response/error fails your custom validation. The built-in validation routine is provided as the last parameter if you decide to invoke it to perform the normal validation. The built-in validation function takes the same parameters as the options.after hook and returns a promise.

Example use of options.after w/validation chaining

functionafter_hook(error,response,request,test_case_name,options,validate){// Do some custom validation on the response or error objects and// throw new Error("If the validation fails.");// or you can modify the response/error objects to clear out non-deterministic values (such as datestamps, or unique-ids)// before passing on to the default validation routine which compare the results to a static response.// Call the built-in validation if you want to keep the built-in response checking.returnvalidate(error,response,request,test_case_name,options);}

Response Validation

*.response.json

Matches the Lambda response against the provided .json object.

*.response.pattern

Matches the JSON serialized value of the Lambda response against the provided regex pattern. The file content is read in as the pattern and default options are used.

*.response.js

A module that exports a javascript function that will be invoked with the same interface/requirements as the options.after hook (minus the final validate parameter).

About

Unit testing framework for testing requests/responses for Amazon Alexa skills

Resources

Stars

5 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

lambda-testing-framework

Unit testing framework for testing requests/responses for Amazon Lambda functions (including Amazon Alexa skills)

Lambda Testing Framework depends upon https://mochajs.org/.

Summary

The lambda-testing-framework is an easy way to perform unit testing for AWS Lambda functions and Amazon Alexa skills by automatically generating mocha test-cases with response validation from a directory of static .json files.

lambda-testing-framework framework uses a data-driven static files approach. You create test-cases in a directory with *.request.json files to represent the event data that should be sumitted to the lambda function under test. The testing framework loads the event/request data, invokes your handler, and then compares the handler's response to the contents of a matching *.response.json file.

Getting Started

  1. Install lambda-testing-framework as a devDependency. npm install -D lambda-testing-framework

  2. Create a test directory with the test-driver in it (let's call it index.js)

    constpath=require("path");constmethod_under_test=require("../index").handler;// the handler function you are testingconsttest=require("lambda-testing-framework");describe("Event tests",()=>test(method_under_test,{path: path.resolve(__dirname,"events")}));
  3. Create a test/events sub-directory.

  4. Place some *.requests.json files in the ./tests/events folder.

  5. Place matching *.response.json files in the same folder.

  6. Setup your package.json to run the tests with:

    "scripts": {
    "test": "mocha"
    }

    and then run them with npm test or npm test debug.

Requests and Responses

It can be tedious to build the input .request.json files by hand, especially if your function handles API Gateway requests. I find it convenient to copy/paste request events from CloudWatch logs.

As an alternative to building the .response.json files by hand, you can allow lambda-testing-framework to save missing response files automatically to create a baseline. To do this, add saveMissingResponses: true to the options object. HINT: I typically have my test/index.js check for the existence of some environment variable to toggle this property.

```javascript
// ...
options.saveMissingResponses = process.env.SAVE_RESPONSES==="true";
// ...
```

Then run it with $ SAVE_RESPONSES=true npm test

API

// Executes all *.request.json test cases in the options.path directorymodule.exports=function(method_under_test,options)
  • method_under_test - The lambda handler function(event, context, callback) you are testing.
  • options.path - path to the directory containing the test cases
  • options.errorExpected - boolean flag to indicate that test case should expect an error to be thrown (in the future, this value may allow for specific errors to be matched)
  • before - function(request, test_case_name, options) : hook that is called before the test is executed
  • after - function(error, response, request, test_case_name, options, validate) - hook that is called after the test is executed, but before validation

The options.before Hook

The options.before hook allows you to provide a custom function that can be used to perform setup tasks or to modify the request object before it is submited for testing. The function must either return the request object or a promise that resolves to the request object. The returned request object will be used for the test, so you can apply custom transformations to the request before processing.

The options.after Hook

The options.after hook can be used to perform custom validation on the error/response, or to modify the error/response before passing on to the normal validation routine. The options.after function may return a promise. The function should throw an error if the response/error fails your custom validation. The built-in validation routine is provided as the last parameter if you decide to invoke it to perform the normal validation. The built-in validation function takes the same parameters as the options.after hook and returns a promise.

Example use of options.after w/validation chaining

functionafter_hook(error,response,request,test_case_name,options,validate){// Do some custom validation on the response or error objects and// throw new Error("If the validation fails.");// or you can modify the response/error objects to clear out non-deterministic values (such as datestamps, or unique-ids)// before passing on to the default validation routine which compare the results to a static response.// Call the built-in validation if you want to keep the built-in response checking.returnvalidate(error,response,request,test_case_name,options);}

Response Validation

*.response.json

Matches the Lambda response against the provided .json object.

*.response.pattern

Matches the JSON serialized value of the Lambda response against the provided regex pattern. The file content is read in as the pattern and default options are used.

*.response.js

A module that exports a javascript function that will be invoked with the same interface/requirements as the options.after hook (minus the final validate parameter).

About

Unit testing framework for testing requests/responses for Amazon Alexa skills

Resources

Stars

5 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

lambda-testing-framework

Unit testing framework for testing requests/responses for Amazon Lambda functions (including Amazon Alexa skills)

Lambda Testing Framework depends upon https://mochajs.org/.

Summary

The lambda-testing-framework is an easy way to perform unit testing for AWS Lambda functions and Amazon Alexa skills by automatically generating mocha test-cases with response validation from a directory of static .json files.

lambda-testing-framework framework uses a data-driven static files approach. You create test-cases in a directory with *.request.json files to represent the event data that should be sumitted to the lambda function under test. The testing framework loads the event/request data, invokes your handler, and then compares the handler's response to the contents of a matching *.response.json file.

Getting Started

  1. Install lambda-testing-framework as a devDependency. npm install -D lambda-testing-framework

  2. Create a test directory with the test-driver in it (let's call it index.js)

    constpath=require("path");constmethod_under_test=require("../index").handler;// the handler function you are testingconsttest=require("lambda-testing-framework");describe("Event tests",()=>test(method_under_test,{path: path.resolve(__dirname,"events")}));
  3. Create a test/events sub-directory.

  4. Place some *.requests.json files in the ./tests/events folder.

  5. Place matching *.response.json files in the same folder.

  6. Setup your package.json to run the tests with:

    "scripts": {
    "test": "mocha"
    }

    and then run them with npm test or npm test debug.

Requests and Responses

It can be tedious to build the input .request.json files by hand, especially if your function handles API Gateway requests. I find it convenient to copy/paste request events from CloudWatch logs.

As an alternative to building the .response.json files by hand, you can allow lambda-testing-framework to save missing response files automatically to create a baseline. To do this, add saveMissingResponses: true to the options object. HINT: I typically have my test/index.js check for the existence of some environment variable to toggle this property.

```javascript
// ...
options.saveMissingResponses = process.env.SAVE_RESPONSES==="true";
// ...
```

Then run it with $ SAVE_RESPONSES=true npm test

API

// Executes all *.request.json test cases in the options.path directorymodule.exports=function(method_under_test,options)
  • method_under_test - The lambda handler function(event, context, callback) you are testing.
  • options.path - path to the directory containing the test cases
  • options.errorExpected - boolean flag to indicate that test case should expect an error to be thrown (in the future, this value may allow for specific errors to be matched)
  • before - function(request, test_case_name, options) : hook that is called before the test is executed
  • after - function(error, response, request, test_case_name, options, validate) - hook that is called after the test is executed, but before validation

The options.before Hook

The options.before hook allows you to provide a custom function that can be used to perform setup tasks or to modify the request object before it is submited for testing. The function must either return the request object or a promise that resolves to the request object. The returned request object will be used for the test, so you can apply custom transformations to the request before processing.

The options.after Hook

The options.after hook can be used to perform custom validation on the error/response, or to modify the error/response before passing on to the normal validation routine. The options.after function may return a promise. The function should throw an error if the response/error fails your custom validation. The built-in validation routine is provided as the last parameter if you decide to invoke it to perform the normal validation. The built-in validation function takes the same parameters as the options.after hook and returns a promise.

Example use of options.after w/validation chaining

functionafter_hook(error,response,request,test_case_name,options,validate){// Do some custom validation on the response or error objects and// throw new Error("If the validation fails.");// or you can modify the response/error objects to clear out non-deterministic values (such as datestamps, or unique-ids)// before passing on to the default validation routine which compare the results to a static response.// Call the built-in validation if you want to keep the built-in response checking.returnvalidate(error,response,request,test_case_name,options);}

Response Validation

*.response.json

Matches the Lambda response against the provided .json object.

*.response.pattern

Matches the JSON serialized value of the Lambda response against the provided regex pattern. The file content is read in as the pattern and default options are used.

*.response.js

A module that exports a javascript function that will be invoked with the same interface/requirements as the options.after hook (minus the final validate parameter).

About

Unit testing framework for testing requests/responses for Amazon Alexa skills

Resources

Stars

5 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

lambda-testing-framework

Unit testing framework for testing requests/responses for Amazon Lambda functions (including Amazon Alexa skills)

Lambda Testing Framework depends upon https://mochajs.org/.

Summary

The lambda-testing-framework is an easy way to perform unit testing for AWS Lambda functions and Amazon Alexa skills by automatically generating mocha test-cases with response validation from a directory of static .json files.

lambda-testing-framework framework uses a data-driven static files approach. You create test-cases in a directory with *.request.json files to represent the event data that should be sumitted to the lambda function under test. The testing framework loads the event/request data, invokes your handler, and then compares the handler's response to the contents of a matching *.response.json file.

Getting Started

  1. Install lambda-testing-framework as a devDependency. npm install -D lambda-testing-framework

  2. Create a test directory with the test-driver in it (let's call it index.js)

    constpath=require("path");constmethod_under_test=require("../index").handler;// the handler function you are testingconsttest=require("lambda-testing-framework");describe("Event tests",()=>test(method_under_test,{path: path.resolve(__dirname,"events")}));
  3. Create a test/events sub-directory.

  4. Place some *.requests.json files in the ./tests/events folder.

  5. Place matching *.response.json files in the same folder.

  6. Setup your package.json to run the tests with:

    "scripts": {
    "test": "mocha"
    }

    and then run them with npm test or npm test debug.

Requests and Responses

It can be tedious to build the input .request.json files by hand, especially if your function handles API Gateway requests. I find it convenient to copy/paste request events from CloudWatch logs.

As an alternative to building the .response.json files by hand, you can allow lambda-testing-framework to save missing response files automatically to create a baseline. To do this, add saveMissingResponses: true to the options object. HINT: I typically have my test/index.js check for the existence of some environment variable to toggle this property.

```javascript
// ...
options.saveMissingResponses = process.env.SAVE_RESPONSES==="true";
// ...
```

Then run it with $ SAVE_RESPONSES=true npm test

API

// Executes all *.request.json test cases in the options.path directorymodule.exports=function(method_under_test,options)
  • method_under_test - The lambda handler function(event, context, callback) you are testing.
  • options.path - path to the directory containing the test cases
  • options.errorExpected - boolean flag to indicate that test case should expect an error to be thrown (in the future, this value may allow for specific errors to be matched)
  • before - function(request, test_case_name, options) : hook that is called before the test is executed
  • after - function(error, response, request, test_case_name, options, validate) - hook that is called after the test is executed, but before validation

The options.before Hook

The options.before hook allows you to provide a custom function that can be used to perform setup tasks or to modify the request object before it is submited for testing. The function must either return the request object or a promise that resolves to the request object. The returned request object will be used for the test, so you can apply custom transformations to the request before processing.

The options.after Hook

The options.after hook can be used to perform custom validation on the error/response, or to modify the error/response before passing on to the normal validation routine. The options.after function may return a promise. The function should throw an error if the response/error fails your custom validation. The built-in validation routine is provided as the last parameter if you decide to invoke it to perform the normal validation. The built-in validation function takes the same parameters as the options.after hook and returns a promise.

Example use of options.after w/validation chaining

functionafter_hook(error,response,request,test_case_name,options,validate){// Do some custom validation on the response or error objects and// throw new Error("If the validation fails.");// or you can modify the response/error objects to clear out non-deterministic values (such as datestamps, or unique-ids)// before passing on to the default validation routine which compare the results to a static response.// Call the built-in validation if you want to keep the built-in response checking.returnvalidate(error,response,request,test_case_name,options);}

Response Validation

*.response.json

Matches the Lambda response against the provided .json object.

*.response.pattern

Matches the JSON serialized value of the Lambda response against the provided regex pattern. The file content is read in as the pattern and default options are used.

*.response.js

A module that exports a javascript function that will be invoked with the same interface/requirements as the options.after hook (minus the final validate parameter).

About

Unit testing framework for testing requests/responses for Amazon Alexa skills

Resources

Stars

5 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

lambda-testing-framework

Unit testing framework for testing requests/responses for Amazon Lambda functions (including Amazon Alexa skills)

Lambda Testing Framework depends upon https://mochajs.org/.

Summary

The lambda-testing-framework is an easy way to perform unit testing for AWS Lambda functions and Amazon Alexa skills by automatically generating mocha test-cases with response validation from a directory of static .json files.

lambda-testing-framework framework uses a data-driven static files approach. You create test-cases in a directory with *.request.json files to represent the event data that should be sumitted to the lambda function under test. The testing framework loads the event/request data, invokes your handler, and then compares the handler's response to the contents of a matching *.response.json file.

Getting Started

  1. Install lambda-testing-framework as a devDependency. npm install -D lambda-testing-framework

  2. Create a test directory with the test-driver in it (let's call it index.js)

    constpath=require("path");constmethod_under_test=require("../index").handler;// the handler function you are testingconsttest=require("lambda-testing-framework");describe("Event tests",()=>test(method_under_test,{path: path.resolve(__dirname,"events")}));
  3. Create a test/events sub-directory.

  4. Place some *.requests.json files in the ./tests/events folder.

  5. Place matching *.response.json files in the same folder.

  6. Setup your package.json to run the tests with:

    "scripts": {
    "test": "mocha"
    }

    and then run them with npm test or npm test debug.

Requests and Responses

It can be tedious to build the input .request.json files by hand, especially if your function handles API Gateway requests. I find it convenient to copy/paste request events from CloudWatch logs.

As an alternative to building the .response.json files by hand, you can allow lambda-testing-framework to save missing response files automatically to create a baseline. To do this, add saveMissingResponses: true to the options object. HINT: I typically have my test/index.js check for the existence of some environment variable to toggle this property.

```javascript
// ...
options.saveMissingResponses = process.env.SAVE_RESPONSES==="true";
// ...
```

Then run it with $ SAVE_RESPONSES=true npm test

API

// Executes all *.request.json test cases in the options.path directorymodule.exports=function(method_under_test,options)
  • method_under_test - The lambda handler function(event, context, callback) you are testing.
  • options.path - path to the directory containing the test cases
  • options.errorExpected - boolean flag to indicate that test case should expect an error to be thrown (in the future, this value may allow for specific errors to be matched)
  • before - function(request, test_case_name, options) : hook that is called before the test is executed
  • after - function(error, response, request, test_case_name, options, validate) - hook that is called after the test is executed, but before validation

The options.before Hook

The options.before hook allows you to provide a custom function that can be used to perform setup tasks or to modify the request object before it is submited for testing. The function must either return the request object or a promise that resolves to the request object. The returned request object will be used for the test, so you can apply custom transformations to the request before processing.

The options.after Hook

The options.after hook can be used to perform custom validation on the error/response, or to modify the error/response before passing on to the normal validation routine. The options.after function may return a promise. The function should throw an error if the response/error fails your custom validation. The built-in validation routine is provided as the last parameter if you decide to invoke it to perform the normal validation. The built-in validation function takes the same parameters as the options.after hook and returns a promise.

Example use of options.after w/validation chaining

functionafter_hook(error,response,request,test_case_name,options,validate){// Do some custom validation on the response or error objects and// throw new Error("If the validation fails.");// or you can modify the response/error objects to clear out non-deterministic values (such as datestamps, or unique-ids)// before passing on to the default validation routine which compare the results to a static response.// Call the built-in validation if you want to keep the built-in response checking.returnvalidate(error,response,request,test_case_name,options);}

Response Validation

*.response.json

Matches the Lambda response against the provided .json object.

*.response.pattern

Matches the JSON serialized value of the Lambda response against the provided regex pattern. The file content is read in as the pattern and default options are used.

*.response.js

A module that exports a javascript function that will be invoked with the same interface/requirements as the options.after hook (minus the final validate parameter).

About

Unit testing framework for testing requests/responses for Amazon Alexa skills

Resources

Stars

5 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

lambda-testing-framework

Unit testing framework for testing requests/responses for Amazon Lambda functions (including Amazon Alexa skills)

Lambda Testing Framework depends upon https://mochajs.org/.

Summary

The lambda-testing-framework is an easy way to perform unit testing for AWS Lambda functions and Amazon Alexa skills by automatically generating mocha test-cases with response validation from a directory of static .json files.

lambda-testing-framework framework uses a data-driven static files approach. You create test-cases in a directory with *.request.json files to represent the event data that should be sumitted to the lambda function under test. The testing framework loads the event/request data, invokes your handler, and then compares the handler's response to the contents of a matching *.response.json file.

Getting Started

  1. Install lambda-testing-framework as a devDependency. npm install -D lambda-testing-framework

  2. Create a test directory with the test-driver in it (let's call it index.js)

    constpath=require("path");constmethod_under_test=require("../index").handler;// the handler function you are testingconsttest=require("lambda-testing-framework");describe("Event tests",()=>test(method_under_test,{path: path.resolve(__dirname,"events")}));
  3. Create a test/events sub-directory.

  4. Place some *.requests.json files in the ./tests/events folder.

  5. Place matching *.response.json files in the same folder.

  6. Setup your package.json to run the tests with:

    "scripts": {
    "test": "mocha"
    }

    and then run them with npm test or npm test debug.

Requests and Responses

It can be tedious to build the input .request.json files by hand, especially if your function handles API Gateway requests. I find it convenient to copy/paste request events from CloudWatch logs.

As an alternative to building the .response.json files by hand, you can allow lambda-testing-framework to save missing response files automatically to create a baseline. To do this, add saveMissingResponses: true to the options object. HINT: I typically have my test/index.js check for the existence of some environment variable to toggle this property.

```javascript
// ...
options.saveMissingResponses = process.env.SAVE_RESPONSES==="true";
// ...
```

Then run it with $ SAVE_RESPONSES=true npm test

API

// Executes all *.request.json test cases in the options.path directorymodule.exports=function(method_under_test,options)
  • method_under_test - The lambda handler function(event, context, callback) you are testing.
  • options.path - path to the directory containing the test cases
  • options.errorExpected - boolean flag to indicate that test case should expect an error to be thrown (in the future, this value may allow for specific errors to be matched)
  • before - function(request, test_case_name, options) : hook that is called before the test is executed
  • after - function(error, response, request, test_case_name, options, validate) - hook that is called after the test is executed, but before validation

The options.before Hook

The options.before hook allows you to provide a custom function that can be used to perform setup tasks or to modify the request object before it is submited for testing. The function must either return the request object or a promise that resolves to the request object. The returned request object will be used for the test, so you can apply custom transformations to the request before processing.

The options.after Hook

The options.after hook can be used to perform custom validation on the error/response, or to modify the error/response before passing on to the normal validation routine. The options.after function may return a promise. The function should throw an error if the response/error fails your custom validation. The built-in validation routine is provided as the last parameter if you decide to invoke it to perform the normal validation. The built-in validation function takes the same parameters as the options.after hook and returns a promise.

Example use of options.after w/validation chaining

functionafter_hook(error,response,request,test_case_name,options,validate){// Do some custom validation on the response or error objects and// throw new Error("If the validation fails.");// or you can modify the response/error objects to clear out non-deterministic values (such as datestamps, or unique-ids)// before passing on to the default validation routine which compare the results to a static response.// Call the built-in validation if you want to keep the built-in response checking.returnvalidate(error,response,request,test_case_name,options);}

Response Validation

*.response.json

Matches the Lambda response against the provided .json object.

*.response.pattern

Matches the JSON serialized value of the Lambda response against the provided regex pattern. The file content is read in as the pattern and default options are used.

*.response.js

A module that exports a javascript function that will be invoked with the same interface/requirements as the options.after hook (minus the final validate parameter).

About

Unit testing framework for testing requests/responses for Amazon Alexa skills

Resources

Stars

5 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

lambda-testing-framework

Unit testing framework for testing requests/responses for Amazon Lambda functions (including Amazon Alexa skills)

Lambda Testing Framework depends upon https://mochajs.org/.

Summary

The lambda-testing-framework is an easy way to perform unit testing for AWS Lambda functions and Amazon Alexa skills by automatically generating mocha test-cases with response validation from a directory of static .json files.

lambda-testing-framework framework uses a data-driven static files approach. You create test-cases in a directory with *.request.json files to represent the event data that should be sumitted to the lambda function under test. The testing framework loads the event/request data, invokes your handler, and then compares the handler's response to the contents of a matching *.response.json file.

Getting Started

  1. Install lambda-testing-framework as a devDependency. npm install -D lambda-testing-framework

  2. Create a test directory with the test-driver in it (let's call it index.js)

    constpath=require("path");constmethod_under_test=require("../index").handler;// the handler function you are testingconsttest=require("lambda-testing-framework");describe("Event tests",()=>test(method_under_test,{path: path.resolve(__dirname,"events")}));
  3. Create a test/events sub-directory.

  4. Place some *.requests.json files in the ./tests/events folder.

  5. Place matching *.response.json files in the same folder.

  6. Setup your package.json to run the tests with:

    "scripts": {
    "test": "mocha"
    }

    and then run them with npm test or npm test debug.

Requests and Responses

It can be tedious to build the input .request.json files by hand, especially if your function handles API Gateway requests. I find it convenient to copy/paste request events from CloudWatch logs.

As an alternative to building the .response.json files by hand, you can allow lambda-testing-framework to save missing response files automatically to create a baseline. To do this, add saveMissingResponses: true to the options object. HINT: I typically have my test/index.js check for the existence of some environment variable to toggle this property.

```javascript
// ...
options.saveMissingResponses = process.env.SAVE_RESPONSES==="true";
// ...
```

Then run it with $ SAVE_RESPONSES=true npm test

API

// Executes all *.request.json test cases in the options.path directorymodule.exports=function(method_under_test,options)
  • method_under_test - The lambda handler function(event, context, callback) you are testing.
  • options.path - path to the directory containing the test cases
  • options.errorExpected - boolean flag to indicate that test case should expect an error to be thrown (in the future, this value may allow for specific errors to be matched)
  • before - function(request, test_case_name, options) : hook that is called before the test is executed
  • after - function(error, response, request, test_case_name, options, validate) - hook that is called after the test is executed, but before validation

The options.before Hook

The options.before hook allows you to provide a custom function that can be used to perform setup tasks or to modify the request object before it is submited for testing. The function must either return the request object or a promise that resolves to the request object. The returned request object will be used for the test, so you can apply custom transformations to the request before processing.

The options.after Hook

The options.after hook can be used to perform custom validation on the error/response, or to modify the error/response before passing on to the normal validation routine. The options.after function may return a promise. The function should throw an error if the response/error fails your custom validation. The built-in validation routine is provided as the last parameter if you decide to invoke it to perform the normal validation. The built-in validation function takes the same parameters as the options.after hook and returns a promise.

Example use of options.after w/validation chaining

functionafter_hook(error,response,request,test_case_name,options,validate){// Do some custom validation on the response or error objects and// throw new Error("If the validation fails.");// or you can modify the response/error objects to clear out non-deterministic values (such as datestamps, or unique-ids)// before passing on to the default validation routine which compare the results to a static response.// Call the built-in validation if you want to keep the built-in response checking.returnvalidate(error,response,request,test_case_name,options);}

Response Validation

*.response.json

Matches the Lambda response against the provided .json object.

*.response.pattern

Matches the JSON serialized value of the Lambda response against the provided regex pattern. The file content is read in as the pattern and default options are used.

*.response.js

A module that exports a javascript function that will be invoked with the same interface/requirements as the options.after hook (minus the final validate parameter).

About

Unit testing framework for testing requests/responses for Amazon Alexa skills

Resources

Stars

5 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

lambda-testing-framework

Unit testing framework for testing requests/responses for Amazon Lambda functions (including Amazon Alexa skills)

Lambda Testing Framework depends upon https://mochajs.org/.

Summary

The lambda-testing-framework is an easy way to perform unit testing for AWS Lambda functions and Amazon Alexa skills by automatically generating mocha test-cases with response validation from a directory of static .json files.

lambda-testing-framework framework uses a data-driven static files approach. You create test-cases in a directory with *.request.json files to represent the event data that should be sumitted to the lambda function under test. The testing framework loads the event/request data, invokes your handler, and then compares the handler's response to the contents of a matching *.response.json file.

Getting Started

  1. Install lambda-testing-framework as a devDependency. npm install -D lambda-testing-framework

  2. Create a test directory with the test-driver in it (let's call it index.js)

    constpath=require("path");constmethod_under_test=require("../index").handler;// the handler function you are testingconsttest=require("lambda-testing-framework");describe("Event tests",()=>test(method_under_test,{path: path.resolve(__dirname,"events")}));
  3. Create a test/events sub-directory.

  4. Place some *.requests.json files in the ./tests/events folder.

  5. Place matching *.response.json files in the same folder.

  6. Setup your package.json to run the tests with:

    "scripts": {
    "test": "mocha"
    }

    and then run them with npm test or npm test debug.

Requests and Responses

It can be tedious to build the input .request.json files by hand, especially if your function handles API Gateway requests. I find it convenient to copy/paste request events from CloudWatch logs.

As an alternative to building the .response.json files by hand, you can allow lambda-testing-framework to save missing response files automatically to create a baseline. To do this, add saveMissingResponses: true to the options object. HINT: I typically have my test/index.js check for the existence of some environment variable to toggle this property.

```javascript
// ...
options.saveMissingResponses = process.env.SAVE_RESPONSES==="true";
// ...
```

Then run it with $ SAVE_RESPONSES=true npm test

API

// Executes all *.request.json test cases in the options.path directorymodule.exports=function(method_under_test,options)
  • method_under_test - The lambda handler function(event, context, callback) you are testing.
  • options.path - path to the directory containing the test cases
  • options.errorExpected - boolean flag to indicate that test case should expect an error to be thrown (in the future, this value may allow for specific errors to be matched)
  • before - function(request, test_case_name, options) : hook that is called before the test is executed
  • after - function(error, response, request, test_case_name, options, validate) - hook that is called after the test is executed, but before validation

The options.before Hook

The options.before hook allows you to provide a custom function that can be used to perform setup tasks or to modify the request object before it is submited for testing. The function must either return the request object or a promise that resolves to the request object. The returned request object will be used for the test, so you can apply custom transformations to the request before processing.

The options.after Hook

The options.after hook can be used to perform custom validation on the error/response, or to modify the error/response before passing on to the normal validation routine. The options.after function may return a promise. The function should throw an error if the response/error fails your custom validation. The built-in validation routine is provided as the last parameter if you decide to invoke it to perform the normal validation. The built-in validation function takes the same parameters as the options.after hook and returns a promise.

Example use of options.after w/validation chaining

functionafter_hook(error,response,request,test_case_name,options,validate){// Do some custom validation on the response or error objects and// throw new Error("If the validation fails.");// or you can modify the response/error objects to clear out non-deterministic values (such as datestamps, or unique-ids)// before passing on to the default validation routine which compare the results to a static response.// Call the built-in validation if you want to keep the built-in response checking.returnvalidate(error,response,request,test_case_name,options);}

Response Validation

*.response.json

Matches the Lambda response against the provided .json object.

*.response.pattern

Matches the JSON serialized value of the Lambda response against the provided regex pattern. The file content is read in as the pattern and default options are used.

*.response.js

A module that exports a javascript function that will be invoked with the same interface/requirements as the options.after hook (minus the final validate parameter).

About

Unit testing framework for testing requests/responses for Amazon Alexa skills

Resources

Stars

5 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages