/**
* Feature: agentcore-mcp-migration, Property 5: Terraform Variables Example Covers All Required Variables
*
* Validates: Requirements 10.3
*
* For any variable defined in variables.tf that has no default value (i.e., is
* required), the terraform.tfvars.example file SHALL contain a placeholder entry
* for that variable.
*/
import { describe, it, expect } from 'vitest';
import fc from 'fast-check';
import { readFileSync } from 'fs';
import { resolve } from 'path';
const VARIABLES_TF_PATH = resolve(import.meta.dirname, '..', 'terraform', 'variables.tf');
const TFVARS_EXAMPLE_PATH = resolve(import.meta.dirname, '..', 'terraform', 'terraform.tfvars.example');
/**
* Parse variables.tf and return arrays of { name, hasDefault } objects.
*/
function extractVariables(hclContent) {
const variables = [];
const varRegex = /variable\s+"(\w+)"\s*\{([\s\S]*?)^\}/gm;
let match;
while ((match = varRegex.exec(hclContent)) !== null) {
const name = match[1];
const body = match[2];
const hasDefault = /default\s*=/.test(body);
variables.push({ name, hasDefault });
}
return variables;
}
/**
* Extract variable names assigned in terraform.tfvars.example.
*/
function extractTfvarsKeys(content) {
const keys = new Set();
for (const line of content.split('\n')) {
const trimmed = line.trim();
if (!trimmed || trimmed.startsWith('#')) continue;
const keyMatch = trimmed.match(/^(\w+)\s*=/);
if (keyMatch) keys.add(keyMatch[1]);
}
return keys;
}
describe('Feature: agentcore-mcp-migration, Property 5: Terraform Variables Example Covers All Required Variables', () => {
const variablesTf = readFileSync(VARIABLES_TF_PATH, 'utf-8');
const tfvarsExample = readFileSync(TFVARS_EXAMPLE_PATH, 'utf-8');
const allVars = extractVariables(variablesTf);
const requiredVars = allVars.filter(v => !v.hasDefault).map(v => v.name);
const tfvarsKeys = extractTfvarsKeys(tfvarsExample);
it('should have at least one required variable', () => {
expect(requiredVars.length).toBeGreaterThan(0);
});
it('property: every required variable has a placeholder in tfvars.example', () => {
/**
* **Validates: Requirements 10.3**
*
* Draw from the set of required variables (no default) and verify each
* one has a corresponding entry in terraform.tfvars.example.
*/
const requiredVarArb = fc.constantFrom(...requiredVars);
fc.assert(
fc.property(requiredVarArb, (varName) => {
return tfvarsKeys.has(varName);
}),
{ numRuns: 100 }
);
});
it('should cover all required variables (exhaustive check)', () => {
for (const varName of requiredVars) {
expect(tfvarsKeys.has(varName)).toBe(true);
}
});
});