Skip to content

Commit

Permalink
feat: add script to auto generate new-client tests (#204)
Browse files Browse the repository at this point in the history
  • Loading branch information
trivikr authored Dec 23, 2022
1 parent 0c9cfd1 commit 126d28b
Show file tree
Hide file tree
Showing 25 changed files with 522 additions and 12 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
"prettier": "2.7.1",
"simple-git-hooks": "^2.8.1",
"ts-jest": "^29.0.3",
"tsx": "^3.12.1",
"typescript": "~4.9.4"
},
"engines": {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { CLIENT_PACKAGE_NAMES_MAP } from "../../src/transforms/v2-to-v3/utils/config";

export const getClientNamesSortedByPackageName = () =>
Object.keys(CLIENT_PACKAGE_NAMES_MAP).sort((a, b) =>
CLIENT_PACKAGE_NAMES_MAP[a].localeCompare(CLIENT_PACKAGE_NAMES_MAP[b])
);
10 changes: 10 additions & 0 deletions scripts/generateNewClientTests/getGlobalImportInputContent.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { getV2ClientsNewExpressionCode } from "./getV2ClientsNewExpressionCode";

export const getGlobalImportInputContent = (codegenComment: string) => {
let globalImportInputContent = `${codegenComment}\n`;

globalImportInputContent += `import AWS from "aws-sdk";\n\n`;
globalImportInputContent += getV2ClientsNewExpressionCode(`AWS.`);

return globalImportInputContent;
};
13 changes: 13 additions & 0 deletions scripts/generateNewClientTests/getGlobalImportOutputContent.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { getClientNamesSortedByPackageName } from "./getClientNamesSortedByPackageName";
import { getV3ClientsNewExpressionCode } from "./getV3ClientsNewExpressionCode";
import { getV3PackageImportsCode } from "./getV3PackageImportsCode";

export const getGlobalImportOutputContent = (codegenComment: string) => {
let globalImportOutputContent = `${codegenComment}\n`;

globalImportOutputContent += getV3PackageImportsCode(getClientNamesSortedByPackageName());
globalImportOutputContent += `\n`;
globalImportOutputContent += getV3ClientsNewExpressionCode();

return globalImportOutputContent;
};
10 changes: 10 additions & 0 deletions scripts/generateNewClientTests/getGlobalRequireInputContent.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { getV2ClientsNewExpressionCode } from "./getV2ClientsNewExpressionCode";

export const getGlobalRequireInputContent = (codegenComment: string) => {
let globalRequireInputContent = `${codegenComment}\n`;

globalRequireInputContent += `const AWS = require("aws-sdk");\n\n`;
globalRequireInputContent += getV2ClientsNewExpressionCode(`AWS.`);

return globalRequireInputContent;
};
14 changes: 14 additions & 0 deletions scripts/generateNewClientTests/getGlobalRequireOutputContent.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { getClientNamesSortedByPackageName } from "./getClientNamesSortedByPackageName";
import { getV3ClientsNewExpressionCode } from "./getV3ClientsNewExpressionCode";
import { getV3PackageRequireCode } from "./getV3PackageRequireCode";

export const getGlobalRequireOutputContent = (codegenComment: string) => {
let globalRequireOutputContent = `${codegenComment}\n\n`;

globalRequireOutputContent += getV3PackageRequireCode(getClientNamesSortedByPackageName(), {
extraNewLine: true,
});
globalRequireOutputContent += getV3ClientsNewExpressionCode();

return globalRequireOutputContent;
};
14 changes: 14 additions & 0 deletions scripts/generateNewClientTests/getServiceImportInputContent.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { CLIENT_NAMES } from "../../src/transforms/v2-to-v3/utils/config";
import { getV2ClientsNewExpressionCode } from "./getV2ClientsNewExpressionCode";

export const getServiceImportInputContent = (codegenComment: string) => {
let serviceImportInputContent = `${codegenComment}\n`;

for (const clientName of CLIENT_NAMES) {
serviceImportInputContent += `import ${clientName} from "aws-sdk/clients/${clientName.toLowerCase()}";\n`;
}
serviceImportInputContent += `\n`;
serviceImportInputContent += getV2ClientsNewExpressionCode();

return serviceImportInputContent;
};
13 changes: 13 additions & 0 deletions scripts/generateNewClientTests/getServiceImportOutputContent.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { CLIENT_NAMES } from "../../src/transforms/v2-to-v3/utils/config";
import { getV3ClientsNewExpressionCode } from "./getV3ClientsNewExpressionCode";
import { getV3PackageImportsCode } from "./getV3PackageImportsCode";

export const getServiceImportOutputContent = (codegenComment: string) => {
let serviceImportOutputContent = `${codegenComment}\n`;

serviceImportOutputContent += getV3PackageImportsCode(CLIENT_NAMES);
serviceImportOutputContent += `\n`;
serviceImportOutputContent += getV3ClientsNewExpressionCode();

return serviceImportOutputContent;
};
14 changes: 14 additions & 0 deletions scripts/generateNewClientTests/getServiceRequireInputContent.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { CLIENT_NAMES } from "../../src/transforms/v2-to-v3/utils/config";
import { getV2ClientsNewExpressionCode } from "./getV2ClientsNewExpressionCode";

export const getServiceRequireInputContent = (codegenComment: string) => {
let serviceRequireInputContent = `${codegenComment}\n`;

for (const clientName of CLIENT_NAMES) {
serviceRequireInputContent += `const ${clientName} = require("aws-sdk/clients/${clientName.toLowerCase()}");\n`;
}
serviceRequireInputContent += `\n`;
serviceRequireInputContent += getV2ClientsNewExpressionCode();

return serviceRequireInputContent;
};
13 changes: 13 additions & 0 deletions scripts/generateNewClientTests/getServiceRequireOutputContent.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { CLIENT_NAMES } from "../../src/transforms/v2-to-v3/utils/config";
import { getV3ClientsNewExpressionCode } from "./getV3ClientsNewExpressionCode";
import { getV3PackageRequireCode } from "./getV3PackageRequireCode";

export const getServiceRequireOutputContent = (codegenComment: string) => {
let serviceRequireOutputContent = `${codegenComment}\n`;

serviceRequireOutputContent += getV3PackageRequireCode(CLIENT_NAMES);
serviceRequireOutputContent += `\n`;
serviceRequireOutputContent += getV3ClientsNewExpressionCode();

return serviceRequireOutputContent;
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { CLIENT_NAMES } from "../../src/transforms/v2-to-v3/utils/config";

export const getV2ClientsNewExpressionCode = (prefix?: string) => {
let v2ClientsNewExpressionCode = ``;
for (const clientName of CLIENT_NAMES) {
v2ClientsNewExpressionCode += `new ${prefix || ""}${clientName}();\n`;
}
return v2ClientsNewExpressionCode;
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { CLIENT_NAMES, CLIENT_NAMES_MAP } from "../../src/transforms/v2-to-v3/utils/config";

export const getV3ClientsNewExpressionCode = () => {
let v3ClientsNewExpressionCode = ``;
for (const v2ClientName of CLIENT_NAMES) {
v3ClientsNewExpressionCode += `new ${CLIENT_NAMES_MAP[v2ClientName]}();\n`;
}
return v3ClientsNewExpressionCode;
};
15 changes: 15 additions & 0 deletions scripts/generateNewClientTests/getV3PackageImportsCode.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import {
CLIENT_NAMES,
CLIENT_NAMES_MAP,
CLIENT_PACKAGE_NAMES_MAP,
} from "../../src/transforms/v2-to-v3/utils/config";

export const getV3PackageImportsCode = (sortedV2ClientNames: typeof CLIENT_NAMES) => {
let v3PackageImportsCode = ``;
for (const v2ClientName of sortedV2ClientNames) {
const v3ClientName = CLIENT_NAMES_MAP[v2ClientName];
const v3ClientPackageName = `@aws-sdk/${CLIENT_PACKAGE_NAMES_MAP[v2ClientName]}`;
v3PackageImportsCode += `import { ${v3ClientName} } from "${v3ClientPackageName}";\n`;
}
return v3PackageImportsCode;
};
19 changes: 19 additions & 0 deletions scripts/generateNewClientTests/getV3PackageRequireCode.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import {
CLIENT_NAMES,
CLIENT_NAMES_MAP,
CLIENT_PACKAGE_NAMES_MAP,
} from "../../src/transforms/v2-to-v3/utils/config";

export const getV3PackageRequireCode = (
sortedV2ClientNames: typeof CLIENT_NAMES,
{ extraNewLine = false }: { extraNewLine?: boolean } = {}
) => {
let v3PackageRequireCode = ``;
for (const v2ClientName of sortedV2ClientNames) {
const v3ClientName = CLIENT_NAMES_MAP[v2ClientName];
const v3ClientPackageName = `@aws-sdk/${CLIENT_PACKAGE_NAMES_MAP[v2ClientName]}`;
v3PackageRequireCode += `const {\n ${v3ClientName}\n} = require("${v3ClientPackageName}");\n`;
if (extraNewLine) v3PackageRequireCode += `\n`;
}
return v3PackageRequireCode;
};
39 changes: 39 additions & 0 deletions scripts/generateNewClientTests/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// This script generates tests in src/transforms/v2-to-v3/__fixtures__/new-client
// Run them using: yarn tsx scripts/generateNewClientTests/index.ts
import { writeFile } from "fs/promises";
import { join } from "path";

import { getGlobalImportInputContent } from "./getGlobalImportInputContent";
import { getGlobalImportOutputContent } from "./getGlobalImportOutputContent";
import { getGlobalRequireInputContent } from "./getGlobalRequireInputContent";
import { getGlobalRequireOutputContent } from "./getGlobalRequireOutputContent";
import { getServiceImportInputContent } from "./getServiceImportInputContent";
import { getServiceImportOutputContent } from "./getServiceImportOutputContent";
import { getServiceRequireInputContent } from "./getServiceRequireInputContent";
import { getServiceRequireOutputContent } from "./getServiceRequireOutputContent";

// The "use strict" directive is added to so that comments can be attached to it.
// Recast removes the comments while removing import/require.
// Details in https://github.com/awslabs/aws-sdk-js-codemod/issues/205
const codegenComment = `// This file is generated by scripts/generateNewClientTests/index.ts
// Do not edit this file directly. Instead, edit the script and run it to regenerate this file.
"use strict";`;

const newClientsTestsFolder = join("src", "transforms", "v2-to-v3", "__fixtures__", "new-client");
const newClientTestsPath = join(__dirname, "..", "..", newClientsTestsFolder);

(async () => {
for (const [fileName, getFileContent] of [
["global-import.input.js", getGlobalImportInputContent],
["global-import.output.js", getGlobalImportOutputContent],
["global-require.input.js", getGlobalRequireInputContent],
["global-require.output.js", getGlobalRequireOutputContent],
["service-import.input.js", getServiceImportInputContent],
["service-import.output.js", getServiceImportOutputContent],
["service-require.input.js", getServiceRequireInputContent],
["service-require.output.js", getServiceRequireOutputContent],
] as [string, (comment: string) => string][]) {
const filePath = join(newClientTestsPath, fileName);
await writeFile(filePath, getFileContent(codegenComment));
}
})();
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
// This file is generated by scripts/generateNewClientTests/index.ts
// Do not edit this file directly. Instead, edit the script and run it to regenerate this file.
"use strict";
import AWS from "aws-sdk";

new AWS.ACM();
Expand Down Expand Up @@ -296,4 +299,4 @@ new AWS.WorkMail();
new AWS.WorkMailMessageFlow();
new AWS.WorkSpaces();
new AWS.WorkSpacesWeb();
new AWS.XRay();
new AWS.XRay();
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
// This file is generated by scripts/generateNewClientTests/index.ts
// Do not edit this file directly. Instead, edit the script and run it to regenerate this file.
"use strict";
import { AccessAnalyzer } from "@aws-sdk/client-accessanalyzer";
import { Account } from "@aws-sdk/client-account";
import { ACM } from "@aws-sdk/client-acm";
Expand Down Expand Up @@ -592,4 +595,4 @@ new WorkMail();
new WorkMailMessageFlow();
new WorkSpaces();
new WorkSpacesWeb();
new XRay();
new XRay();
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
// This file is generated by scripts/generateNewClientTests/index.ts
// Do not edit this file directly. Instead, edit the script and run it to regenerate this file.
"use strict";
const AWS = require("aws-sdk");

new AWS.ACM();
Expand Down Expand Up @@ -296,4 +299,4 @@ new AWS.WorkMail();
new AWS.WorkMailMessageFlow();
new AWS.WorkSpaces();
new AWS.WorkSpacesWeb();
new AWS.XRay();
new AWS.XRay();
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
// This file is generated by scripts/generateNewClientTests/index.ts
// Do not edit this file directly. Instead, edit the script and run it to regenerate this file.
"use strict";

const {
AccessAnalyzer
} = require("@aws-sdk/client-accessanalyzer");
Expand Down Expand Up @@ -1482,4 +1486,4 @@ new WorkMail();
new WorkMailMessageFlow();
new WorkSpaces();
new WorkSpacesWeb();
new XRay();
new XRay();
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
// This file is generated by scripts/generateNewClientTests/index.ts
// Do not edit this file directly. Instead, edit the script and run it to regenerate this file.
"use strict";
import ACM from "aws-sdk/clients/acm";
import ACMPCA from "aws-sdk/clients/acmpca";
import APIGateway from "aws-sdk/clients/apigateway";
Expand Down Expand Up @@ -592,4 +595,4 @@ new WorkMail();
new WorkMailMessageFlow();
new WorkSpaces();
new WorkSpacesWeb();
new XRay();
new XRay();
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
// This file is generated by scripts/generateNewClientTests/index.ts
// Do not edit this file directly. Instead, edit the script and run it to regenerate this file.
"use strict";
import { ACM } from "@aws-sdk/client-acm";
import { ACMPCA } from "@aws-sdk/client-acm-pca";
import { APIGateway } from "@aws-sdk/client-api-gateway";
Expand Down Expand Up @@ -592,4 +595,4 @@ new WorkMail();
new WorkMailMessageFlow();
new WorkSpaces();
new WorkSpacesWeb();
new XRay();
new XRay();
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
// This file is generated by scripts/generateNewClientTests/index.ts
// Do not edit this file directly. Instead, edit the script and run it to regenerate this file.
"use strict";
const ACM = require("aws-sdk/clients/acm");
const ACMPCA = require("aws-sdk/clients/acmpca");
const APIGateway = require("aws-sdk/clients/apigateway");
Expand Down Expand Up @@ -592,4 +595,4 @@ new WorkMail();
new WorkMailMessageFlow();
new WorkSpaces();
new WorkSpacesWeb();
new XRay();
new XRay();
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
// This file is generated by scripts/generateNewClientTests/index.ts
// Do not edit this file directly. Instead, edit the script and run it to regenerate this file.
"use strict";
const {
ACM
} = require("@aws-sdk/client-acm");
Expand Down Expand Up @@ -1186,4 +1189,4 @@ new WorkMail();
new WorkMailMessageFlow();
new WorkSpaces();
new WorkSpacesWeb();
new XRay();
new XRay();
2 changes: 1 addition & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@
"resolveJsonModule": true,
"rootDir": "src"
},
"exclude": ["dist", "**/__fixtures__/**", "**/*.spec.ts"]
"exclude": ["dist", "**/__fixtures__/**", "**/*.spec.ts", "scripts"]
}
Loading

0 comments on commit 126d28b

Please sign in to comment.