@@ -64,7 +64,7 @@ The following comprehensive testing procedures were executed to validate that cu
6464# ## Test Environment Setup
6565
6666**Test Configuration File:**
67- - **Location**: `s3://genaiidp-config- bucket-20250826/custom- config.yaml`
67+ - **Location**: `s3://your- bucket/path/to/ config.yaml` (For Example)
6868- **Size**: 1,509 bytes
6969- **Format**: YAML with Invoice and Receipt classes
7070- **Models**: Claude 3.7 Sonnet for OCR, classification, and extraction
@@ -132,13 +132,13 @@ extraction:
132132**Test Commands:**
133133` ` ` bash
134134# 1. Verify file exists in S3
135- aws s3 ls s3://genaiidp-config- bucket-20250826/custom- config.yaml
135+ aws s3 ls s3://your- bucket/path/to/ config.yaml
136136
137137# Expected Output:
138138# 2025-08-26 21:41:06 1509 custom-config.yaml
139139
140140# 2. Download and validate YAML syntax
141- aws s3 cp s3://genaiidp-config- bucket-20250826/custom- config.yaml /tmp/test-config.yaml
141+ aws s3 cp s3://your- bucket/path/to/ config.yaml /tmp/test-config.yaml
142142python3 -c "
143143import yaml
144144with open('/tmp/test-config.yaml', 'r') as f:
@@ -186,8 +186,7 @@ grep -A 10 -B 2 "HasCustomConfigPath" template.yaml | grep -A 8 "Effect: Allow"
186186# Expected Output shows conditional permissions with proper ARN format
187187` ` `
188188
189- **Result**: ✅ **PASSED** - Template contains required parameters, conditions, and security configurations
190-
189+ **Result**: ✅ **PASSED**
191190# ## Test 3: IAM Permissions Security Validation
192191
193192**Objective**: Verify least-privilege IAM permissions are properly configured
@@ -214,200 +213,4 @@ grep -A 5 "Path: !Select" template.yaml
214213# Expected Output shows CloudFormation functions converting S3 URI to ARN
215214` ` `
216215
217- **Result**: ✅ **PASSED** - Least-privilege IAM permissions correctly implemented, no security vulnerabilities
218-
219- # ## Test 4: Stack Deployment with Custom Configuration
220-
221- **Objective**: Deploy a test stack using custom configuration parameter
222-
223- **Test Commands:**
224- ` ` ` bash
225- # 1. Deploy stack with custom configuration (simulated - actual deployment tested)
226- aws cloudformation create-stack \
227- --stack-name IDPtest-custom-validation \
228- --template-body file://template.yaml \
229- --parameters \
230- ParameterKey=CustomConfigPath,ParameterValue=s3://genaiidp-config-bucket-20250826/custom-config.yaml \
231- ParameterKey=AdminEmail,ParameterValue=yamahala@amazon.com \
232- --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM \
233- --region us-east-1
234-
235- # 2. Verify parameter is correctly passed
236- aws cloudformation describe-stacks \
237- --stack-name IDPtest-custom-validation \
238- --query 'Stacks[0].Parameters[?ParameterKey==` CustomConfigPath`]'
239-
240- # Expected Output:
241- # [
242- # {
243- # "ParameterKey": "CustomConfigPath",
244- # "ParameterValue": "s3://genaiidp-config-bucket-20250826/custom-config.yaml"
245- # }
246- # ]
247- ```
248-
249- ** Result** : ✅ ** PASSED** - Stack accepts CustomConfigPath parameter and deploys successfully
250-
251- ### Test 5: Configuration Loading Verification
252-
253- ** Objective** : Verify custom configuration is loaded into the DynamoDB configuration table
254-
255- ** Test Commands:**
256- ``` bash
257- # 1. Get configuration table name from stack outputs
258- CONFIG_TABLE=$( aws cloudformation describe-stacks \
259- --stack-name IDPtest-custom-validation \
260- --query ' Stacks[0].Outputs[?OutputKey==`ConfigurationTableName`].OutputValue' \
261- --output text)
262-
263- echo " Configuration table: ${CONFIG_TABLE} "
264-
265- # 2. Check if custom Invoice class exists with correct attributes
266- aws dynamodb get-item \
267- --table-name ${CONFIG_TABLE} \
268- --key ' {"id": {"S": "Invoice"}}' \
269- --region us-east-1 \
270- --output json | jq -r ' .Item.attributes.L[].M.name.S'
271-
272- # Expected Output:
273- # InvoiceNumber
274- # InvoiceDate
275- # TotalAmount
276- # VendorName
277-
278- # 3. Check if custom Receipt class exists with correct attributes
279- aws dynamodb get-item \
280- --table-name ${CONFIG_TABLE} \
281- --key ' {"id": {"S": "Receipt"}}' \
282- --region us-east-1 \
283- --output json | jq -r ' .Item.attributes.L[].M.name.S'
284-
285- # Expected Output:
286- # TransactionDate
287- # Amount
288- # MerchantName
289-
290- # 4. Verify evaluation methods are correctly loaded
291- aws dynamodb get-item \
292- --table-name ${CONFIG_TABLE} \
293- --key ' {"id": {"S": "Invoice"}}' \
294- --region us-east-1 \
295- --output json | jq -r ' .Item.attributes.L[0].M.evaluation_method.S'
296-
297- # Expected Output:
298- # EXACT
299- ```
300-
301- ** Result** : ✅ ** PASSED** - Custom classes loaded into DynamoDB with correct attributes and evaluation methods
302-
303- ### Test 6: UpdateConfigurationFunction Execution Validation
304-
305- ** Objective** : Verify the Lambda function successfully processes custom configuration
306-
307- ** Test Commands:**
308- ``` bash
309- # 1. Check UpdateConfigurationFunction logs for successful execution
310- aws logs filter-log-events \
311- --log-group-name " /aws/lambda/IDPtest-custom-validation-UpdateConfigurationFunction-*" \
312- --start-time $( date -d ' 1 hour ago' +%s) 000 \
313- --filter-pattern " Custom configuration" \
314- --region us-east-1
315-
316- # Expected Log Entries:
317- # "Loading custom configuration from s3://genaiidp-config-bucket-20250826/custom-config.yaml"
318- # "Successfully loaded custom configuration with 2 classes"
319- # "Configuration updated in DynamoDB table"
320-
321- # 2. Verify no error logs
322- aws logs filter-log-events \
323- --log-group-name " /aws/lambda/IDPtest-custom-validation-UpdateConfigurationFunction-*" \
324- --start-time $( date -d ' 1 hour ago' +%s) 000 \
325- --filter-pattern " ERROR" \
326- --region us-east-1
327-
328- # Expected Output: No error entries
329- ```
330-
331- ** Result** : ✅ ** PASSED** - Lambda function successfully loads and processes custom configuration
332-
333- ### Test 7: Document Processing with Custom Classes
334-
335- ** Objective** : Process a test document and verify it uses custom classes for classification and extraction
336-
337- ** Test Commands:**
338- ``` bash
339- # 1. Get input bucket from stack outputs
340- INPUT_BUCKET=$( aws cloudformation describe-stacks \
341- --stack-name IDPtest-custom-validation \
342- --query ' Stacks[0].Outputs[?OutputKey==`InputBucketName`].OutputValue' \
343- --output text)
344-
345- # 2. Create test invoice document
346- cat > test-invoice.txt << EOF
347- INVOICE
348-
349- Invoice Number: INV-2025-001
350- Invoice Date: 2025-08-26
351- Vendor Name: Test Company Inc.
352- Total Amount: $1 ,234.56
353-
354- Items:
355- - Product A: $5 00.00
356- - Product B: $7 34.56
357-
358- Thank you for your business!
359- EOF
360-
361- # 3. Upload test document
362- aws s3 cp test-invoice.txt s3://${INPUT_BUCKET} / --region us-east-1
363-
364- # 4. Monitor Step Functions execution and verify classification
365- STEP_FUNCTION_ARN=$( aws cloudformation describe-stacks \
366- --stack-name IDPtest-custom-validation \
367- --query ' Stacks[0].Outputs[?OutputKey==`StateMachineArn`].OutputValue' \
368- --output text)
369-
370- # 5. Check processing results after completion
371- OUTPUT_BUCKET=$( aws cloudformation describe-stacks \
372- --stack-name IDPtest-custom-validation \
373- --query ' Stacks[0].Outputs[?OutputKey==`OutputBucketName`].OutputValue' \
374- --output text)
375-
376- # Wait for processing and check results
377- aws s3 cp s3://${OUTPUT_BUCKET} /results/test-invoice.json /tmp/result.json
378- cat /tmp/result.json | jq ' .classification.document_class'
379-
380- # Expected Output:
381- # "Invoice"
382-
383- # Verify extracted attributes match custom configuration
384- cat /tmp/result.json | jq ' .extraction.attributes | keys'
385-
386- # Expected Output:
387- # ["InvoiceDate", "InvoiceNumber", "TotalAmount", "VendorName"]
388- ```
389-
390- ** Result** : ✅ ** PASSED** - Document processing uses custom Invoice class and extracts defined attributes
391-
392- ### Test Results Summary
393-
394- | Test Case | Status | Validation |
395- | -----------| --------| ------------|
396- | Configuration File Accessibility | ✅ ** PASSED** | File exists, accessible, valid YAML syntax |
397- | CloudFormation Template Validation | ✅ ** PASSED** | Parameters, conditions, and IAM permissions present |
398- | IAM Permissions Security | ✅ ** PASSED** | Least-privilege, no wildcards, proper ARN format |
399- | Stack Deployment | ✅ ** PASSED** | Successful deployment with CustomConfigPath parameter |
400- | Configuration Loading | ✅ ** PASSED** | Custom classes loaded into DynamoDB with correct structure |
401- | Lambda Function Execution | ✅ ** PASSED** | UpdateConfigurationFunction processes custom config successfully |
402- | Document Processing | ✅ ** PASSED** | Processing uses custom classes for classification and extraction |
403-
404- ### Key Validation Points Confirmed
405-
406- 1 . ** ✅ Custom Configuration Loading** : The ` UpdateConfigurationFunction ` successfully downloads and parses the custom YAML configuration from S3
407- 2 . ** ✅ DynamoDB Integration** : Custom classes and attributes are correctly stored in the configuration table with proper structure
408- 3 . ** ✅ Security Compliance** : IAM permissions are scoped only to the specified S3 object, eliminating security vulnerabilities
409- 4 . ** ✅ Processing Integration** : Document processing workflows use the custom classes for both classification and extraction
410- 5 . ** ✅ Backward Compatibility** : When CustomConfigPath is empty, the system falls back to default configuration library
411- 6 . ** ✅ Error Handling** : Proper error handling for invalid S3 paths, malformed YAML, and missing required sections
412-
413- This comprehensive testing validates that the CustomConfigPath feature works correctly and securely loads custom configuration files when specified during deployment.
216+ **Result**: ✅ **PASSED**
0 commit comments