Javascript Har to Postman converter. Try it out
The main goal of the project is the creation of a JS library to convert .har
files to Postman requests/collection in .JSON
format.
HTTP Archive format
or HAR
files are a JSON-formatted archive file format for logging of a web browser's interaction with a site (HTTP transactions).
On the other hand Postman
is a testing API client tool, allowing us to test a request against a specific environment.
The intended audience is, therefore, anybody who finds a use case where this library is useful in any way.
npm install har2postman
var Har2Postman = require('har2postman');
var includeTests = true;
harToPostman.createPostmanCollection(stringifiedHarFile, includeTests);
includeTests
: defaultfalse
, set totrue
for including test assertions in requests
- Rafael Paez - rafapaezbas
- Javier Aviles - javieraviles
Please note every version should include a suite of test cases ensuring new requirements are working. The last test case of the suite should check the library produces a JSON
output matching the content of the file /test/x.x.x/output.json
given a JSON
input matching the content of the file /test/x.x.x/input.json
.
- Create a first basic JS
createPostmanCollection
function able to produce a valid postman collection including the expectedfile
(postman metadata) anditem
(request itself) objects out of ahar
file. - Create a CI pipeline, executing jasmine tests on every push and updating the
Har2Postman
in npm if new tag is released.
- The output file should also include basic test assertions in GET requests for postman based on the response section from
har
file (response code, maybe id if path param?). - The
createPostmanCollection
function should include a second optionalboolean
argument to decide whether the output should include the test section or not. By default, the behaviour of the boolean flag should befalse
. - Include basic usage example for the lib in docs.
- A GET request might include multiple
query params
; those should also be mapped from the har file to the postman collection. Evaluate whether some of them (FK?) should be included as part of the test assertions. - Evaluate if response is an array, if so, generate test assertion.
- Evaluate if response is not a json file, if so generate only status code assertion.
- CI pipeline should also include integration tests on tag release: using the just released version of the lib, generate a postman collection using the version input, and run it with newman so it checks the lib output works out of the box.
- Include ESLint, with some format scripts in the package and check the linting from the pipeline too.
- A
har
file can contain multiple requests, and all them should be contained within the swagger collection. - The provided examples contain api versioning; the lib should be able to deal with them.
- Even though the method is already picked up by the lib, some methods such POST or PUT might include a body.
- Some headers such
Content-Type
should be included in the request.
- Status code such as 200, 204, 400, 401, 403 or 404 must have specific assertions.
- Non-json responses should even not tried to be analysed.
- Include relevant headers for each request, only the necessary ones.
- Make library compatible for Browser.
- Demo page automatically getting lib from cdn.
- Include the option for converting a har file into a collection from the command line.
- Url hostname of requests, if common, should come from an env variable
- Auth methods should not be included as simple headers, but collection auth method and inherit from there in every request
- support
xml
format - when creating an object, might be interesting to save it's
id
if contained in response as env variable for future requests over same entity (GET, PUT or DELETE) - Prepare nice docs
- Make sure every function generates only one type of data structure. F.e. this should be avoided:
var generateItem = function(){
var item = [{
name: generateItemName(harRequest.method, harRequestUrl.pathname, harResponse.status, generateTest),
event: generateItemEvent(harResponse, harRequestUrl),
request: {
method: harRequest.method,
url: {
raw: harRequestUrl.toString(),
protocol: harRequestUrl.protocol.slice(0, -1),
host: harRequestUrl.hostname.split('.'),
path: harPathnameArray.slice(1)
}
}
}];
}
The right way for this function would be:
var generateItem = function(){
return [{
name: generateItemName(harRequest.method, harRequestUrl.pathname, harResponse.status, generateTest),
event: generateItemEvent(harResponse, harRequestUrl),
request: generateRequest(harRequest, harRequestUrl);
}];
}
var generateRequest = function(){
return {
method: harRequest.method,
url: generateUrl(harRequestUrl);
}
}
//var generateUrl = function() ...
Also important have a look at the functions returning arrays instead of objects, this will have to change in the future if those arrays need more than one element.
This project is licensed under the MIT License - see the LICENSE file for details