Update HAR codegen

This commit is contained in:
Ankit Mahato
2024-03-12 05:23:27 +05:30
parent e4f0633eca
commit 67fcc66aa2
2 changed files with 321 additions and 46 deletions

View File

@ -1,6 +1,10 @@
// http://www.softwareishard.com/blog/har-12-spec/
// https://github.com/ahmadnassri/har-spec/blob/master/versions/1.2.md
import 'dart:convert';
import 'package:apidash/consts.dart';
import 'package:apidash/utils/utils.dart' show getValidRequestUri;
import 'package:apidash/utils/utils.dart'
show getValidRequestUri, getNewUuid, getFilenameFromPath;
import 'package:apidash/models/models.dart' show RequestModel;
import 'package:package_info_plus/package_info_plus.dart';
@ -75,6 +79,7 @@ Map<String, dynamic> requestModelToHARJsonRequest(
defaultUriScheme = kDefaultUriScheme,
bool exportMode = false,
bool useEnabled = false,
String? boundary,
}) {
Map<String, dynamic> json = {};
bool hasBody = false;
@ -110,21 +115,37 @@ Map<String, dynamic> requestModelToHARJsonRequest(
}
}
var method = requestModel.method;
var requestBody = requestModel.requestBody;
if (kMethodsWithBody.contains(method) &&
requestBody != null &&
!requestModel.isFormDataRequest) {
var contentLength = utf8.encode(requestBody).length;
if (contentLength > 0) {
hasBody = true;
json["postData"] = {};
json["postData"]["mimeType"] =
requestModel.requestBodyContentType.header;
json["postData"]["text"] = requestBody;
if (exportMode) {
json["postData"]["comment"] = "";
if (requestModel.hasJsonData || requestModel.hasTextData) {
hasBody = true;
json["postData"] = {};
json["postData"]["mimeType"] = requestModel.requestBodyContentType.header;
json["postData"]["text"] = requestModel.requestBody;
if (exportMode) {
json["postData"]["comment"] = "";
}
}
if (requestModel.hasFormData) {
boundary = boundary ?? getNewUuid();
hasBody = true;
json["postData"] = {};
json["postData"]["mimeType"] =
"${requestModel.requestBodyContentType.header}; boundary=$boundary";
json["postData"]["params"] = [];
for (var item in requestModel.formDataList) {
Map<String, String> d = exportMode ? {"comment": ""} : {};
if (item.type == FormDataType.text) {
d["name"] = item.name;
d["value"] = item.value;
}
if (item.type == FormDataType.file) {
d["name"] = item.name;
d["fileName"] = getFilenameFromPath(item.value);
}
json["postData"]["params"].add(d);
}
if (exportMode) {
json["postData"]["comment"] = "";
}
}
@ -137,8 +158,8 @@ Map<String, dynamic> requestModelToHARJsonRequest(
if (headers.isNotEmpty || hasBody) {
if (hasBody && !requestModel.hasContentTypeHeader) {
var m = {
"name": "Content-Type",
"value": requestModel.requestBodyContentType.header
"name": kHeaderContentType,
"value": json["postData"]["mimeType"]
};
if (exportMode) {
m["comment"] = "";
@ -154,14 +175,12 @@ Map<String, dynamic> requestModelToHARJsonRequest(
}
}
}
if (requestModel.isFormDataRequest) {
json["formData"] = requestModel.formDataMapList;
}
if (exportMode) {
json["comment"] = "";
json["cookies"] = [];
json["headersSize"] = -1;
json["bodySize"] = hasBody ? utf8.encode(requestBody!).length : 0;
json["bodySize"] =
hasBody ? utf8.encode(json["postData"]["text"] ?? "").length : 0;
}
}
return json;

View File

@ -1,9 +1,10 @@
import 'package:apidash/codegen/others/har.dart';
import '../request_models.dart';
import 'package:apidash/codegen/codegen.dart';
import 'package:apidash/consts.dart';
import 'package:test/test.dart';
import '../request_models.dart';
void main() {
final harCodeGen = HARCodeGen();
final codeGen = Codegen();
group('GET Request', () {
test('GET 1', () {
@ -14,7 +15,8 @@ void main() {
"queryString": [],
"headers": []
}""";
expect(harCodeGen.getCode(requestModelGet1, "https"), expectedCode);
expect(codeGen.getCode(CodegenLanguage.har, requestModelGet1, "https"),
expectedCode);
});
test('GET 2', () {
@ -30,7 +32,8 @@ void main() {
],
"headers": []
}""";
expect(harCodeGen.getCode(requestModelGet2, "https"), expectedCode);
expect(codeGen.getCode(CodegenLanguage.har, requestModelGet2, "https"),
expectedCode);
});
test('GET 3', () {
@ -46,7 +49,8 @@ void main() {
],
"headers": []
}""";
expect(harCodeGen.getCode(requestModelGet3, "https"), expectedCode);
expect(codeGen.getCode(CodegenLanguage.har, requestModelGet3, "https"),
expectedCode);
});
test('GET 4', () {
@ -78,7 +82,8 @@ void main() {
],
"headers": []
}""";
expect(harCodeGen.getCode(requestModelGet4, "https"), expectedCode);
expect(codeGen.getCode(CodegenLanguage.har, requestModelGet4, "https"),
expectedCode);
});
test('GET 5', () {
@ -94,7 +99,8 @@ void main() {
}
]
}""";
expect(harCodeGen.getCode(requestModelGet5, "https"), expectedCode);
expect(codeGen.getCode(CodegenLanguage.har, requestModelGet5, "https"),
expectedCode);
});
test('GET 6', () {
@ -115,7 +121,8 @@ void main() {
}
]
}""";
expect(harCodeGen.getCode(requestModelGet6, "https"), expectedCode);
expect(codeGen.getCode(CodegenLanguage.har, requestModelGet6, "https"),
expectedCode);
});
test('GET 7', () {
@ -126,7 +133,8 @@ void main() {
"queryString": [],
"headers": []
}""";
expect(harCodeGen.getCode(requestModelGet7, "https"), expectedCode);
expect(codeGen.getCode(CodegenLanguage.har, requestModelGet7, "https"),
expectedCode);
});
test('GET 8', () {
@ -147,7 +155,8 @@ void main() {
}
]
}""";
expect(harCodeGen.getCode(requestModelGet8, "https"), expectedCode);
expect(codeGen.getCode(CodegenLanguage.har, requestModelGet8, "https"),
expectedCode);
});
test('GET 9', () {
@ -167,7 +176,8 @@ void main() {
],
"headers": []
}""";
expect(harCodeGen.getCode(requestModelGet9, "https"), expectedCode);
expect(codeGen.getCode(CodegenLanguage.har, requestModelGet9, "https"),
expectedCode);
});
test('GET 10', () {
@ -184,7 +194,8 @@ void main() {
]
}""";
expect(
harCodeGen.getCode(
codeGen.getCode(
CodegenLanguage.har,
requestModelGet10,
"https",
),
@ -213,7 +224,8 @@ void main() {
}
]
}""";
expect(harCodeGen.getCode(requestModelGet11, "https"), expectedCode);
expect(codeGen.getCode(CodegenLanguage.har, requestModelGet11, "https"),
expectedCode);
});
test('GET 12', () {
@ -224,7 +236,8 @@ void main() {
"queryString": [],
"headers": []
}""";
expect(harCodeGen.getCode(requestModelGet12, "https"), expectedCode);
expect(codeGen.getCode(CodegenLanguage.har, requestModelGet12, "https"),
expectedCode);
});
});
@ -237,7 +250,8 @@ void main() {
"queryString": [],
"headers": []
}""";
expect(harCodeGen.getCode(requestModelHead1, "https"), expectedCode);
expect(codeGen.getCode(CodegenLanguage.har, requestModelHead1, "https"),
expectedCode);
});
test('HEAD 2', () {
@ -248,7 +262,8 @@ void main() {
"queryString": [],
"headers": []
}""";
expect(harCodeGen.getCode(requestModelHead2, "http"), expectedCode);
expect(codeGen.getCode(CodegenLanguage.har, requestModelHead2, "http"),
expectedCode);
});
});
@ -270,7 +285,8 @@ void main() {
"text": "{\n\"text\": \"I LOVE Flutter\"\n}"
}
}""";
expect(harCodeGen.getCode(requestModelPost1, "https"), expectedCode);
expect(codeGen.getCode(CodegenLanguage.har, requestModelPost1, "https"),
expectedCode);
});
test('POST 2', () {
@ -287,10 +303,11 @@ void main() {
],
"postData": {
"mimeType": "application/json",
"text": "{\n\"text\": \"I LOVE Flutter\"\n}"
"text": "{\n\"text\": \"I LOVE Flutter\",\n\"flag\": null,\n\"male\": true,\n\"female\": false,\n\"no\": 1.2,\n\"arr\": [\"null\", \"true\", \"false\", null]\n}"
}
}""";
expect(harCodeGen.getCode(requestModelPost2, "https"), expectedCode);
expect(codeGen.getCode(CodegenLanguage.har, requestModelPost2, "https"),
expectedCode);
});
test('POST 3', () {
@ -314,7 +331,242 @@ void main() {
"text": "{\n\"text\": \"I LOVE Flutter\"\n}"
}
}""";
expect(harCodeGen.getCode(requestModelPost3, "https"), expectedCode);
expect(codeGen.getCode(CodegenLanguage.har, requestModelPost3, "https"),
expectedCode);
});
test('POST 4', () {
const expectedCode = r"""{
"method": "POST",
"url": "https://api.apidash.dev/io/form",
"httpVersion": "HTTP/1.1",
"queryString": [],
"headers": [
{
"name": "Content-Type",
"value": "multipart/form-data; boundary=d43e2510-a25e-1f08-b0a5-591aeb704467"
}
],
"postData": {
"mimeType": "multipart/form-data; boundary=d43e2510-a25e-1f08-b0a5-591aeb704467",
"params": [
{
"name": "text",
"value": "API"
},
{
"name": "sep",
"value": "|"
},
{
"name": "times",
"value": "3"
}
]
}
}""";
expect(
codeGen.getCode(CodegenLanguage.har, requestModelPost4, "https",
boundary: "d43e2510-a25e-1f08-b0a5-591aeb704467"),
expectedCode);
});
test('POST 5', () {
const expectedCode = r"""{
"method": "POST",
"url": "https://api.apidash.dev/io/form",
"httpVersion": "HTTP/1.1",
"queryString": [],
"headers": [
{
"name": "Content-Type",
"value": "multipart/form-data; boundary=ce268b20-a3e6-1f08-b0a5-591aeb704467"
},
{
"name": "User-Agent",
"value": "Test Agent"
}
],
"postData": {
"mimeType": "multipart/form-data; boundary=ce268b20-a3e6-1f08-b0a5-591aeb704467",
"params": [
{
"name": "text",
"value": "API"
},
{
"name": "sep",
"value": "|"
},
{
"name": "times",
"value": "3"
}
]
}
}""";
expect(
codeGen.getCode(CodegenLanguage.har, requestModelPost5, "https",
boundary: "ce268b20-a3e6-1f08-b0a5-591aeb704467"),
expectedCode);
});
test('POST 6', () {
const expectedCode = r"""{
"method": "POST",
"url": "https://api.apidash.dev/io/img",
"httpVersion": "HTTP/1.1",
"queryString": [],
"headers": [
{
"name": "Content-Type",
"value": "multipart/form-data; boundary=c90d21a0-a44d-1f08-b0a5-591aeb704467"
}
],
"postData": {
"mimeType": "multipart/form-data; boundary=c90d21a0-a44d-1f08-b0a5-591aeb704467",
"params": [
{
"name": "token",
"value": "xyz"
},
{
"name": "imfile",
"fileName": "1.png"
}
]
}
}""";
expect(
codeGen.getCode(CodegenLanguage.har, requestModelPost6, "https",
boundary: "c90d21a0-a44d-1f08-b0a5-591aeb704467"),
expectedCode);
});
test('POST 7', () {
const expectedCode = r"""{
"method": "POST",
"url": "https://api.apidash.dev/io/img",
"httpVersion": "HTTP/1.1",
"queryString": [],
"headers": [
{
"name": "Content-Type",
"value": "multipart/form-data; boundary=4ac86770-a4dc-1f08-b0a5-591aeb704467"
}
],
"postData": {
"mimeType": "multipart/form-data; boundary=4ac86770-a4dc-1f08-b0a5-591aeb704467",
"params": [
{
"name": "token",
"value": "xyz"
},
{
"name": "imfile",
"fileName": "1.png"
}
]
}
}""";
expect(
codeGen.getCode(CodegenLanguage.har, requestModelPost7, "https",
boundary: "4ac86770-a4dc-1f08-b0a5-591aeb704467"),
expectedCode);
});
test('POST 8', () {
const expectedCode = r"""{
"method": "POST",
"url": "https://api.apidash.dev/io/form?size=2&len=3",
"httpVersion": "HTTP/1.1",
"queryString": [
{
"name": "size",
"value": "2"
},
{
"name": "len",
"value": "3"
}
],
"headers": [
{
"name": "Content-Type",
"value": "multipart/form-data; boundary=78403a20-a54a-1f08-b0a5-591aeb704467"
}
],
"postData": {
"mimeType": "multipart/form-data; boundary=78403a20-a54a-1f08-b0a5-591aeb704467",
"params": [
{
"name": "text",
"value": "API"
},
{
"name": "sep",
"value": "|"
},
{
"name": "times",
"value": "3"
}
]
}
}""";
expect(
codeGen.getCode(CodegenLanguage.har, requestModelPost8, "https",
boundary: "78403a20-a54a-1f08-b0a5-591aeb704467"),
expectedCode);
});
test('POST 9', () {
const expectedCode = r"""{
"method": "POST",
"url": "https://api.apidash.dev/io/img?size=2&len=3",
"httpVersion": "HTTP/1.1",
"queryString": [
{
"name": "size",
"value": "2"
},
{
"name": "len",
"value": "3"
}
],
"headers": [
{
"name": "Content-Type",
"value": "multipart/form-data; boundary=2d9cd390-a593-1f08-b0a5-591aeb704467"
},
{
"name": "User-Agent",
"value": "Test Agent"
},
{
"name": "Keep-Alive",
"value": "true"
}
],
"postData": {
"mimeType": "multipart/form-data; boundary=2d9cd390-a593-1f08-b0a5-591aeb704467",
"params": [
{
"name": "token",
"value": "xyz"
},
{
"name": "imfile",
"fileName": "1.png"
}
]
}
}""";
expect(
codeGen.getCode(CodegenLanguage.har, requestModelPost9, "https",
boundary: "2d9cd390-a593-1f08-b0a5-591aeb704467"),
expectedCode);
});
});
@ -336,7 +588,8 @@ void main() {
"text": "{\n\"name\": \"morpheus\",\n\"job\": \"zion resident\"\n}"
}
}""";
expect(harCodeGen.getCode(requestModelPut1, "https"), expectedCode);
expect(codeGen.getCode(CodegenLanguage.har, requestModelPut1, "https"),
expectedCode);
});
});
@ -358,7 +611,8 @@ void main() {
"text": "{\n\"name\": \"marfeus\",\n\"job\": \"accountant\"\n}"
}
}""";
expect(harCodeGen.getCode(requestModelPatch1, "https"), expectedCode);
expect(codeGen.getCode(CodegenLanguage.har, requestModelPatch1, "https"),
expectedCode);
});
});
@ -371,7 +625,8 @@ void main() {
"queryString": [],
"headers": []
}""";
expect(harCodeGen.getCode(requestModelDelete1, "https"), expectedCode);
expect(codeGen.getCode(CodegenLanguage.har, requestModelDelete1, "https"),
expectedCode);
});
test('DELETE 2', () {
@ -391,7 +646,8 @@ void main() {
"text": "{\n\"name\": \"marfeus\",\n\"job\": \"accountant\"\n}"
}
}""";
expect(harCodeGen.getCode(requestModelDelete2, "https"), expectedCode);
expect(codeGen.getCode(CodegenLanguage.har, requestModelDelete2, "https"),
expectedCode);
});
});
}