Skip to content

Commit 8b6d07f

Browse files
committed
add matrix cases
1 parent 584e430 commit 8b6d07f

File tree

7 files changed

+204
-65
lines changed

7 files changed

+204
-65
lines changed

packages/amplify-codegen-e2e-core/src/categories/codegen.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,10 @@ export function addCodegen(cwd: string, settings: any = {}): Promise<void> {
9595
? ['codegen', 'add', ...mergedSettings.params]
9696
: ['codegen', 'add'];
9797
const chain = spawn(getCLIPath(), params, { cwd, stripColors: true });
98-
if (mergedSettings.isAPINotAdded) {
98+
if(mergedSettings.frontendType === AmplifyFrontend.flutter) {
99+
chain.wait("Flutter only supports the command $amplify codegen models. All the other codegen commands are not supported.");
100+
}
101+
else if (mergedSettings.isAPINotAdded) {
99102
chain.wait("There are no GraphQL APIs available.");
100103
chain.wait("Add by running $amplify api add");
101104
}

packages/amplify-codegen-e2e-core/src/configure/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export const amplifyRegions = [
4949
const configurationOptions = ['Project information', 'AWS Profile setting', 'Advanced: Container-based deployments'];
5050
const profileOptions = ['No', 'Update AWS Profile', 'Remove AWS Profile'];
5151
const authenticationOptions = ['AWS profile', 'AWS access keys'];
52-
const javaScriptFrameworkList = [ 'none', 'angluar', 'ember', 'ionic', 'react', 'react-native', 'vue' ];
52+
const javaScriptFrameworkList = [ 'none', 'angular', 'ember', 'ionic', 'react', 'react-native', 'vue' ];
5353

5454

5555
const MANDATORY_PARAMS = ['accessKeyId', 'secretAccessKey', 'region'];
@@ -166,9 +166,9 @@ export function amplifyConfigureProjectInfo(settings: {
166166
.sendLine(s.name)
167167
.wait('Choose your default editor:')
168168
.sendLine(s.editor)
169-
.wait("Choose the type of app that you're building")
169+
.wait("Choose the type of app that you're building")
170170
.sendLine(s.frontendType);
171-
171+
172172
switch (s.frontendType) {
173173
case 'javascript':
174174
chain.wait('What javascript framework are you using');

packages/amplify-codegen-e2e-core/src/init/initProjectHelper.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ const defaultSettings = {
2222
providerConfig: undefined,
2323
};
2424

25-
const javaScriptFrameworkList = [ 'none', 'angluar', 'ember', 'ionic', 'react', 'react-native', 'vue' ];
25+
const javaScriptFrameworkList = [ 'none', 'angular', 'ember', 'ionic', 'react', 'react-native', 'vue' ];
2626

2727
export function initJSProjectWithProfile(cwd: string, settings: Object = {}): Promise<void> {
2828
const s = { ...defaultSettings, ...settings };

packages/amplify-codegen-e2e-core/src/utils/frontend-config-helper.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export enum AmplifyFrontend {
77

88
export type JavaScriptFramework = 'none' | 'angular' | 'ember' | 'ionic' | 'react' | 'react-native' | 'vue';
99

10-
export type JavaScriptCodegenTarget = 'javascript' | 'typescript' | 'flow' | 'angluar';
10+
export type JavaScriptCodegenTarget = 'javascript' | 'typescript' | 'flow' | 'angular';
1111

1212
export type JavaScriptConfig = {
1313
frontendType: AmplifyFrontend.javascript,
@@ -53,7 +53,7 @@ export const DEFAULT_ANDROID_CONFIG: AmplifyFrontendConfig = {
5353
frontendType: AmplifyFrontend.android,
5454
srcDir: 'app/src/main/res',
5555
modelgenDir: 'app/src/main/java',
56-
graphqlCodegenDir : 'app/src/main/graphql'
56+
graphqlCodegenDir : 'app/src/main/graphql/com/amazonaws/amplify/generated/graphql'
5757
};
5858

5959
export const DEFAULT_IOS_CONFIG: AmplifyFrontendConfig = {

packages/amplify-codegen-e2e-tests/src/__tests__/add-codegen-js.test.ts

Lines changed: 0 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@ import {
66
createRandomName,
77
addApiWithoutSchema,
88
updateApiSchema,
9-
AmplifyFrontend,
10-
apiGqlCompile,
11-
removeCodegen,
12-
amplifyConfigureProjectInfo,
139
} from "@aws-amplify/amplify-codegen-e2e-core";
1410
import { existsSync } from "fs";
1511
import path from 'path';
@@ -20,7 +16,6 @@ import {
2016
testSetupBeforeAddCodegen,
2117
getGraphQLConfigFilePath,
2218
testValidGraphQLConfig,
23-
testAddCodegenMatrix,
2419
} from '../codegen-tests-base';
2520

2621
const schema = 'simple_model.graphql';
@@ -87,50 +82,3 @@ describe('codegen add tests - JS', () => {
8782
await testAddCodegen(config, projectRoot, schema, ['--region', 'us-fake-1']);
8883
});
8984
});
90-
91-
describe.only('JS codegen matrix test', () => {
92-
let projectRoot: string;
93-
let config = DEFAULT_JS_CONFIG;
94-
95-
beforeAll(async () => {
96-
projectRoot = await createNewProjectDir('addCodegenMatrixJS');
97-
// init project and add API category
98-
await initProjectWithProfile(projectRoot, { ...config });
99-
const projectName = createRandomName();
100-
await addApiWithoutSchema(projectRoot, { apiName: projectName });
101-
await updateApiSchema(projectRoot, projectName, schema);
102-
await apiGqlCompile(projectRoot);
103-
104-
});
105-
beforeEach(async () => {
106-
107-
});
108-
afterEach(async () => {
109-
await removeCodegen(projectRoot);
110-
await amplifyConfigureProjectInfo({ cwd: projectRoot, frontendType: 'flutter'} )
111-
});
112-
afterAll(async () => {
113-
await deleteAmplifyProject(projectRoot);
114-
});
115-
116-
it('Adding codegen works as expected 1', async () => {
117-
config = {
118-
frontendType: AmplifyFrontend.javascript,
119-
framework: 'ionic',
120-
codegenTarget: 'angluar',
121-
srcDir: 'src',
122-
graphqlCodegenDir : 'src/graphql'
123-
}
124-
await testAddCodegenMatrix(config, projectRoot);
125-
});
126-
it('Adding codegen works as expected 2', async () => {
127-
config = {
128-
frontendType: AmplifyFrontend.javascript,
129-
framework: 'react',
130-
codegenTarget: 'typescript',
131-
srcDir: 'src',
132-
graphqlCodegenDir : 'src/graphql'
133-
}
134-
await testAddCodegenMatrix(config, projectRoot);
135-
});
136-
});
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
import { DEFAULT_JS_CONFIG, createNewProjectDir, initProjectWithProfile, createRandomName, addApiWithoutSchema, updateApiSchema, apiGqlCompile, removeCodegen, amplifyConfigureProjectInfo, AmplifyFrontend, DEFAULT_FLUTTER_CONFIG, DEFAULT_IOS_CONFIG, DEFAULT_ANDROID_CONFIG } from "@aws-amplify/amplify-codegen-e2e-core";
2+
import { CodegenMatrixTestProps, deleteAmplifyProject, testAddCodegenMatrix } from "../codegen-tests-base";
3+
4+
const schema = 'simple_model.graphql';
5+
6+
describe('JS codegen matrix test', () => {
7+
let projectRoot: string;
8+
let config: any = DEFAULT_JS_CONFIG;
9+
10+
beforeAll(async () => {
11+
projectRoot = await createNewProjectDir('addCodegenMatrixJS');
12+
// init project and add API category
13+
await initProjectWithProfile(projectRoot, { ...config });
14+
const projectName = createRandomName();
15+
await addApiWithoutSchema(projectRoot, { apiName: projectName });
16+
await updateApiSchema(projectRoot, projectName, schema);
17+
await apiGqlCompile(projectRoot);
18+
});
19+
beforeEach(async () => {
20+
21+
});
22+
afterEach(async () => {
23+
await removeCodegen(projectRoot);
24+
await amplifyConfigureProjectInfo({ cwd: projectRoot, frontendType: 'flutter'} )
25+
});
26+
afterAll(async () => {
27+
await deleteAmplifyProject(projectRoot);
28+
});
29+
it('Adding codegen works as expected', async () => {
30+
config = {
31+
...DEFAULT_FLUTTER_CONFIG,
32+
isStatementGenerated: false,
33+
isTypeGenerated: false,
34+
}
35+
await testAddCodegenMatrix(config, projectRoot);
36+
});
37+
it('Adding codegen works as expected', async () => {
38+
config = {
39+
...DEFAULT_ANDROID_CONFIG,
40+
isTypeGenerated: false,
41+
}
42+
await testAddCodegenMatrix(config, projectRoot);
43+
});
44+
it('Adding codegen works as expected', async () => {
45+
config = {
46+
...DEFAULT_IOS_CONFIG,
47+
}
48+
await testAddCodegenMatrix(config, projectRoot);
49+
});
50+
it('Adding codegen works as expected', async () => {
51+
config = {
52+
...DEFAULT_IOS_CONFIG,
53+
typeFileName: 'apiType', // directory name
54+
}
55+
await testAddCodegenMatrix(config, projectRoot);
56+
});
57+
it('Adding codegen works as expected', async () => {
58+
config = {
59+
...DEFAULT_JS_CONFIG,
60+
isTypeGenerated: false,
61+
}
62+
await testAddCodegenMatrix(config, projectRoot);
63+
});
64+
it('Adding codegen works as expected', async () => {
65+
config = {
66+
...DEFAULT_JS_CONFIG,
67+
framework: 'angular',
68+
codegenTarget: 'angular',
69+
}
70+
await testAddCodegenMatrix(config, projectRoot);
71+
});
72+
it('Adding codegen works as expected', async () => {
73+
config = {
74+
...DEFAULT_JS_CONFIG,
75+
framework: 'angular',
76+
codegenTarget: 'typescript',
77+
}
78+
await testAddCodegenMatrix(config, projectRoot);
79+
});
80+
it('Adding codegen works as expected', async () => {
81+
config = {
82+
...DEFAULT_JS_CONFIG,
83+
framework: 'ionic',
84+
codegenTarget: 'angular',
85+
}
86+
await testAddCodegenMatrix(config, projectRoot);
87+
});
88+
it('Adding codegen works as expected', async () => {
89+
config = {
90+
...DEFAULT_JS_CONFIG,
91+
framework: 'ionic',
92+
codegenTarget: 'typescript',
93+
}
94+
await testAddCodegenMatrix(config, projectRoot);
95+
});
96+
it('Adding codegen works as expected', async () => {
97+
config = {
98+
...DEFAULT_JS_CONFIG,
99+
framework: 'react',
100+
codegenTarget: 'javascript',
101+
isTypeGenerated: false,
102+
}
103+
await testAddCodegenMatrix(config, projectRoot);
104+
});
105+
it('Adding codegen works as expected', async () => {
106+
config = {
107+
...DEFAULT_JS_CONFIG,
108+
framework: 'react',
109+
codegenTarget: 'typescript',
110+
}
111+
await testAddCodegenMatrix(config, projectRoot);
112+
});
113+
it('Adding codegen works as expected', async () => {
114+
config = {
115+
...DEFAULT_JS_CONFIG,
116+
framework: 'react',
117+
codegenTarget: 'flow',
118+
}
119+
await testAddCodegenMatrix(config, projectRoot);
120+
});
121+
});

packages/amplify-codegen-e2e-tests/src/codegen-tests-base/add-codegen.ts

Lines changed: 73 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,35 +13,102 @@ import {
1313
generateTypes,
1414
amplifyConfigureProjectInfo,
1515
deleteProjectDir,
16+
DEFAULT_JS_CONFIG,
1617
} from "@aws-amplify/amplify-codegen-e2e-core";
17-
import { existsSync, readFileSync, writeFileSync, readdirSync, rmSync } from "fs";
18+
import { existsSync, readFileSync, writeFileSync, readdirSync, rmSync, lstatSync } from "fs";
1819
import path from 'path';
1920
import { isNotEmptyDir } from '../utils';
2021
import { getGraphQLConfigFilePath, testSetupBeforeAddCodegen, testValidGraphQLConfig } from "./test-setup";
2122

22-
type CodegenMatrixTestProps = AmplifyFrontendConfig & {
23+
export type CodegenMatrixTestProps = AmplifyFrontendConfig & {
2324
params?: string[];
2425
isAPINotAdded?: boolean;
2526
isCodegenAdded?: boolean;
2627
frontendType?: AmplifyFrontend;
2728
framework?: string;
28-
codegenTarget?: string;
2929
isStatementGenerated?: boolean;
3030
statementNamePattern?: string;
3131
maxDepth?: number;
3232
isTypeGenerated?: boolean;
3333
typeFileName?: string;
3434
}
3535

36-
export async function testAddCodegenMatrix(config: CodegenMatrixTestProps, projectRoot: string) {
36+
const defaultConfig: CodegenMatrixTestProps = {
37+
...DEFAULT_JS_CONFIG,
38+
params: [],
39+
isAPINotAdded: false,
40+
isCodegenAdded: false,
41+
isStatementGenerated: true,
42+
statementNamePattern: '\r', // default value
43+
maxDepth: 2, // default value
44+
isTypeGenerated: true,
45+
typeFileName: '\r', // default value
46+
}
47+
48+
const getTypeFilePath = (props: CodegenMatrixTestProps, projectRoot: string): string | undefined => {
49+
if (props.typeFileName) {
50+
if (props.typeFileName === '\r') {
51+
if (props.frontendType === AmplifyFrontend.ios) {
52+
return path.join(projectRoot, 'API.swift')
53+
} else if (props.frontendType === AmplifyFrontend.javascript) {
54+
switch (props.codegenTarget) {
55+
case 'flow':
56+
return path.join(projectRoot, 'src', 'API.js');
57+
case 'angular':
58+
return path.join(projectRoot, 'src', 'app', 'API.service.ts');
59+
case 'typescript':
60+
return path.join(projectRoot, 'src', 'API.ts');
61+
default:
62+
return undefined;
63+
}
64+
}
65+
}
66+
return path.join(projectRoot, props.typeFileName);
67+
}
68+
return undefined;
69+
}
70+
71+
const isTypeFileGeneratedAtPath = (filePath: string | undefined): boolean => {
72+
if (filePath) {
73+
if (existsSync(filePath)) {
74+
// if path is directory, check if files are generated within
75+
if (lstatSync(filePath).isDirectory()) {
76+
return readdirSync(filePath).length > 0;
77+
}
78+
// path is a single file
79+
return true;
80+
}
81+
return false;
82+
}
83+
return false;
84+
}
85+
86+
export async function testAddCodegenMatrix(props: CodegenMatrixTestProps, projectRoot: string) {
87+
const config: CodegenMatrixTestProps = { ...defaultConfig, ...props }
88+
if (config.graphqlCodegenDir) {
89+
deleteProjectDir(path.join(projectRoot, config.graphqlCodegenDir));
90+
}
91+
if (config.srcDir !== '.') {
92+
deleteProjectDir(path.join(projectRoot, config.srcDir));
93+
}
94+
const typeFilePath = getTypeFilePath(config, projectRoot);
95+
if (typeFilePath && existsSync(typeFilePath)) {
96+
rmSync(typeFilePath);
97+
}
98+
if (config.framework === 'angular') {
99+
// Mock angular json file otherwise the project configure will fail
100+
writeFileSync(path.join(projectRoot, 'angular.json'), '{}');
101+
}
37102
await amplifyConfigureProjectInfo({ cwd: projectRoot, ...config });
38-
deleteProjectDir(path.join(projectRoot, config.graphqlCodegenDir));
39103
// Setup the non-amplify project with schema and pre-existing files
40104
const userSourceCodePath = testSetupBeforeAddCodegen(projectRoot, config);
41105
await expect(addCodegen(projectRoot, { ...config })).resolves.not.toThrow();
42-
expect(isNotEmptyDir(path.join(projectRoot, config.graphqlCodegenDir))).toBe(true);
106+
// Check if statements are generated
107+
expect(isNotEmptyDir(path.join(projectRoot, config.graphqlCodegenDir))).toBe(config.isStatementGenerated);
43108
// pre-existing file should still exist
44109
expect(existsSync(userSourceCodePath)).toBe(true);
110+
// Check if type files are generated
111+
expect(isTypeFileGeneratedAtPath(typeFilePath)).toBe(config.isTypeGenerated)
45112
}
46113

47114
export async function testAddCodegen(config: AmplifyFrontendConfig, projectRoot: string, schema: string, additionalParams?: Array<string>) {

0 commit comments

Comments
 (0)