Skip to content

Commit 7c136ce

Browse files
committed
test(lambda): add integration for Serverless Land integration
1 parent 15afdf4 commit 7c136ce

File tree

1 file changed

+141
-0
lines changed
  • packages/core/src/testInteg/appBuilder/serverlessLand

1 file changed

+141
-0
lines changed
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
/*!
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
import assert from 'assert'
7+
import * as vscode from 'vscode'
8+
import path from 'path'
9+
import { PrompterTester } from '../../../test/shared/wizards/prompterTester'
10+
import { describe } from 'mocha'
11+
import { ProjectMetadata } from '../../../awsService/appBuilder/serverlessLand/metadataManager'
12+
import * as nodefs from 'fs' // eslint-disable-line no-restricted-imports
13+
import fs from '../../../shared/fs/fs'
14+
import { AppBuilderRootNode } from '../../../awsService/appBuilder/explorer/nodes/rootNode'
15+
import * as sinon from 'sinon'
16+
import { AppNode } from '../../../awsService/appBuilder/explorer/nodes/appNode'
17+
import { ResourceNode } from '../../../awsService/appBuilder/explorer/nodes/resourceNode'
18+
import { getTestWindow } from '../../../test/shared/vscode/window'
19+
20+
describe('Serverless Land Integration', async () => {
21+
const metadataPath = path.resolve(
22+
__dirname,
23+
'../../../../../src/awsService/appBuilder/serverlessLand/metadata.json'
24+
)
25+
const metadataContent = nodefs.readFileSync(metadataPath, { encoding: 'utf-8' })
26+
const parseMetadata = JSON.parse(metadataContent) as ProjectMetadata
27+
const workspaceFolder = vscode.workspace.workspaceFolders![0]
28+
const projectFolder = 'my-project-from-Serverless-Land'
29+
let rootNode: sinon.SinonSpiedInstance<AppBuilderRootNode>
30+
let sandbox: sinon.SinonSandbox
31+
32+
beforeEach(async () => {
33+
sandbox = sinon.createSandbox()
34+
await fs.delete(path.join(workspaceFolder.uri.fsPath, projectFolder), { recursive: true })
35+
rootNode = sandbox.spy(AppBuilderRootNode.instance)
36+
})
37+
38+
afterEach(async () => {
39+
await fs.delete(path.join(workspaceFolder.uri.fsPath, projectFolder), { recursive: true })
40+
})
41+
42+
describe(':) Path', async () => {
43+
it('creates an AppBuilderRootNode with correct label', async () => {
44+
/**
45+
* Selection:
46+
* - pattern : [Select] 2 apigw-rest-api-lambda-sam
47+
* - runtime : [Select] 3 dotnet
48+
* - iac : [Select] 1 sam
49+
* - location : [Input] From TestFolder.uri
50+
* - name : [Input] "my-project-from-Serverless-Land"
51+
*/
52+
53+
const testWindow = getTestWindow()
54+
const prompterTester = PrompterTester.init({ testWindow })
55+
.handleQuickPick('Select a Pattern for your application', async (quickPick) => {
56+
await quickPick.untilReady()
57+
const options = quickPick.items
58+
Object.entries(parseMetadata.patterns).map(([key, pattern]) => {
59+
options.find((option) => option.label === key && option.detail === pattern.description)
60+
})
61+
quickPick.acceptItem(quickPick.items[1])
62+
})
63+
.handleQuickPick('Select Runtime', async (quickPick) => {
64+
await quickPick.untilReady()
65+
const options = quickPick.items
66+
assert.strictEqual(options[0].label, 'python')
67+
assert.strictEqual(options[1].label, 'javascript')
68+
assert.strictEqual(options[2].label, 'java')
69+
assert.strictEqual(options[3].label, 'dotnet')
70+
quickPick.acceptItem(options[3])
71+
})
72+
.handleQuickPick('Select IaC', async (quickPick) => {
73+
await quickPick.untilReady()
74+
const options = quickPick.items
75+
assert.strictEqual(options[0].label, 'sam')
76+
quickPick.acceptItem(options[0])
77+
})
78+
.handleQuickPick('Select Project Location', async (quickPick) => {
79+
await quickPick.untilReady()
80+
const options = quickPick.items
81+
assert.strictEqual(options[0].label, '$(folder) workspaceFolder')
82+
assert.strictEqual(options[1].label, '$(folder-opened) Select a folder...')
83+
quickPick.acceptItem(options[0])
84+
})
85+
.handleInputBox('Enter Project Name', (inputBox) => {
86+
inputBox.acceptValue('my-project-from-Serverless-Land')
87+
})
88+
.build()
89+
90+
// Validate that the README.md is shown.
91+
testWindow.onDidChangeActiveTextEditor((editors) => {
92+
assert(editors)
93+
const readMe = path.join(workspaceFolder.uri.fsPath, projectFolder, 'README.md')
94+
assert.strictEqual(editors?.document.fileName, readMe)
95+
})
96+
97+
await vscode.commands.executeCommand('aws.toolkit.lambda.createServerlessLandProject')
98+
99+
// projectNodes set from previous step
100+
101+
const projectNode = await rootNode
102+
.getChildren()
103+
.then(
104+
(children) =>
105+
children.find(
106+
(node) =>
107+
node instanceof AppNode &&
108+
node.label === 'workspaceFolder/my-project-from-Serverless-Land'
109+
) as AppNode | undefined
110+
)
111+
112+
assert.ok(projectNode)
113+
114+
// Check App Builder resources
115+
const resourceNodes = await projectNode.getChildren()
116+
assert.strictEqual(resourceNodes.length, 1)
117+
assert.ok(resourceNodes[0] instanceof ResourceNode)
118+
119+
// Validate Lambda resource configuration
120+
const lamdaResource = resourceNodes[0] as ResourceNode
121+
assert.strictEqual(lamdaResource.resource.resource.Type, 'AWS::Serverless::Function')
122+
assert.strictEqual(lamdaResource.resource.resource.Runtime, 'dotnet8')
123+
assert.strictEqual(lamdaResource.resource.resource.Id, 'HelloWorldFunction')
124+
assert.deepStrictEqual(lamdaResource.resource.resource.Events, [
125+
{
126+
Id: 'HelloWorld',
127+
Type: 'Api',
128+
Path: '/hello',
129+
Method: 'get',
130+
},
131+
])
132+
assert.deepStrictEqual(lamdaResource.resource.resource.Environment, {
133+
Variables: {
134+
PARAM1: 'VALUE',
135+
},
136+
})
137+
138+
prompterTester.assertCallAll()
139+
})
140+
})
141+
})

0 commit comments

Comments
 (0)