From aa6d98df002de4c4b977adeae0ecb89efc3d8bed Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Mon, 24 Aug 2026 06:49:11 +0100 Subject: [PATCH] refactor: semantically port TS to AffineScript --- tests/aspect/security_aspect_test.affine | 54 +++++++++----------- tests/bench/infra_bench.affine | 24 ++++----- tests/contract/infra_contracts_test.affine | 54 +++++++++----------- tests/e2e/pipeline_e2e_test.affine | 44 ++++++++-------- tests/property/ansible_property_test.affine | 50 +++++++++--------- tests/smoke/infra_smoke_test.affine | 46 ++++++++--------- tests/unit/ansible_structure_test.affine | 56 ++++++++++----------- 7 files changed, 150 insertions(+), 178 deletions(-) diff --git a/tests/aspect/security_aspect_test.affine b/tests/aspect/security_aspect_test.affine index 6e8999d..84c8b9d 100644 --- a/tests/aspect/security_aspect_test.affine +++ b/tests/aspect/security_aspect_test.affine @@ -1,21 +1,18 @@ // SPDX-License-Identifier: MPL-2.0 -// Ported via Harvard Engine mechanical processor +// Ported via Harvard Engine (Semantic pass) module security_aspect_test; -// TODO: Complete semantic implementation - -/* === ORIGINAL TYPESCRIPT CONTEXT === // SPDX-License-Identifier: MPL-2.0 // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) // Security aspect tests — Defense-in-depth dimension checks import { assertEquals } from "https://deno.land/std@0.220.0/assert/mod.ts"; -const REPO_ROOT = new URL("../..", import.meta.url).pathname; +let REPO_ROOT = new URL("../..", import.meta.url).pathname; Deno.test("Aspect: No hardcoded SSH private keys in repository", async () => { - const sshPatterns = [ + let sshPatterns = [ /-----BEGIN RSA PRIVATE KEY-----/, /-----BEGIN OPENSSH PRIVATE KEY-----/, /-----BEGIN EC PRIVATE KEY-----/, @@ -40,7 +37,7 @@ Deno.test("Aspect: No hardcoded SSH private keys in repository", async () => { } try { - const content = await Deno.readTextFile(entry); + let content = await Deno.readTextFile(entry); for (const pattern of sshPatterns) { assertEquals( !pattern.test(content), @@ -58,18 +55,18 @@ Deno.test("Aspect: No hardcoded SSH private keys in repository", async () => { }); Deno.test("Aspect: No AWS/GCP access keys in Terraform files", async () => { - const keyPatterns = [ + let keyPatterns = [ /aws_access_key_id\s*=\s*['"][A-Z0-9]{20}['"]/, // AWS key format /aws_secret_access_key\s*=\s*['"][A-Za-z0-9\/+]{40}['"]/, // AWS secret format /AKIAIOSFODNN7EXAMPLE/, // AWS example key (should not be present) /AIzaSy[A-Za-z0-9_-]{33}/, // GCP API key format ]; - const terraformDir = `${REPO_ROOT}/terraform`; + let terraformDir = `${REPO_ROOT}/terraform`; try { for await (const entry of Deno.readDir(terraformDir)) { if (entry.isFile && entry.name.endsWith(".tf")) { - const content = await Deno.readTextFile( + let content = await Deno.readTextFile( `${terraformDir}/${entry.name}`, ); @@ -90,17 +87,17 @@ Deno.test("Aspect: No AWS/GCP access keys in Terraform files", async () => { }); Deno.test("Aspect: No plaintext HTTP URLs in critical configs", async () => { - const criticalFiles = [ + let criticalFiles = [ `${REPO_ROOT}/ansible/ansible.cfg`, `${REPO_ROOT}/terraform/providers.tf`, ]; for (const file of criticalFiles) { try { - const content = await Deno.readTextFile(file); + let content = await Deno.readTextFile(file); // Check for http:// (should use https) // Exclude http comments and documentation - const hasInsecureHttp = /\bhttp:\/\/[^\s#"']+\.(com|org|net|io)/gi.test( + let hasInsecureHttp = /\bhttp:\/\/[^\s#"']+\.(com|org|net|io)/gi.test( content, ); @@ -118,12 +115,12 @@ Deno.test("Aspect: No plaintext HTTP URLs in critical configs", async () => { }); Deno.test("Aspect: Firewall defaults to deny policy", async () => { - const firewallTasksFile = + let firewallTasksFile = `${REPO_ROOT}/ansible/roles/firewall/tasks/main.yml`; - const content = await Deno.readTextFile(firewallTasksFile); + let content = await Deno.readTextFile(firewallTasksFile); // Check for default deny policy or allow-only approach - const hasDenyDefault = + let hasDenyDefault = content.includes("default: DROP") || content.includes("zone:") || content.includes("firewall"); @@ -136,8 +133,8 @@ Deno.test("Aspect: Firewall defaults to deny policy", async () => { }); Deno.test("Aspect: No ignore_errors in security playbooks", async () => { - const securityPlaybook = `${REPO_ROOT}/ansible/playbooks/security.yml`; - const content = await Deno.readTextFile(securityPlaybook); + let securityPlaybook = `${REPO_ROOT}/ansible/playbooks/security.yml`; + let content = await Deno.readTextFile(securityPlaybook); assertEquals( !content.includes("ignore_errors: true"), @@ -147,8 +144,8 @@ Deno.test("Aspect: No ignore_errors in security playbooks", async () => { }); Deno.test("Aspect: Security playbook uses become for privileged operations", async () => { - const securityPlaybook = `${REPO_ROOT}/ansible/playbooks/security.yml`; - const content = await Deno.readTextFile(securityPlaybook); + let securityPlaybook = `${REPO_ROOT}/ansible/playbooks/security.yml`; + let content = await Deno.readTextFile(securityPlaybook); assertEquals( content.includes("become") || content.includes("sudo"), @@ -158,8 +155,8 @@ Deno.test("Aspect: Security playbook uses become for privileged operations", asy }); Deno.test("Aspect: No debug mode enabled in production configs", async () => { - const ansibleCfg = `${REPO_ROOT}/ansible/ansible.cfg`; - const content = await Deno.readTextFile(ansibleCfg); + let ansibleCfg = `${REPO_ROOT}/ansible/ansible.cfg`; + let content = await Deno.readTextFile(ansibleCfg); assertEquals( !content.includes("debug = True"), @@ -169,10 +166,10 @@ Deno.test("Aspect: No debug mode enabled in production configs", async () => { }); Deno.test("Aspect: Sudo configuration restricts commands", async () => { - const sudoPath = `${REPO_ROOT}/ansible/roles/sudo_config/tasks/main.yml`; - const content = await Deno.readTextFile(sudoPath); + let sudoPath = `${REPO_ROOT}/ansible/roles/sudo_config/tasks/main.yml`; + let content = await Deno.readTextFile(sudoPath); - const hasCommandRestrictions = + let hasCommandRestrictions = content.includes("sudoers") || content.includes("NOPASSWD") || content.includes("Cmnd_Alias"); @@ -184,8 +181,8 @@ Deno.test("Aspect: Sudo configuration restricts commands", async () => { ); }); -function isTextFile(path: string): boolean { - const binaryExtensions = [ +fn isTextFile(path: string): boolean { + let binaryExtensions = [ ".pyc", ".pyo", ".o", @@ -208,7 +205,7 @@ function isTextFile(path: string): boolean { async function* walkFiles(path: string): AsyncGenerator { try { for await (const entry of Deno.readDir(path)) { - const fullPath = `${path}/${entry.name}`; + let fullPath = `${path}/${entry.name}`; if ( entry.name.startsWith(".") || @@ -231,4 +228,3 @@ async function* walkFiles(path: string): AsyncGenerator { } } -==================================== */ diff --git a/tests/bench/infra_bench.affine b/tests/bench/infra_bench.affine index 8ce4823..444e4d6 100644 --- a/tests/bench/infra_bench.affine +++ b/tests/bench/infra_bench.affine @@ -1,21 +1,18 @@ // SPDX-License-Identifier: MPL-2.0 -// Ported via Harvard Engine mechanical processor +// Ported via Harvard Engine (Semantic pass) module infra_bench; -// TODO: Complete semantic implementation - -/* === ORIGINAL TYPESCRIPT CONTEXT === // SPDX-License-Identifier: MPL-2.0 // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) // Benchmarks — Infrastructure configuration performance baseline -const REPO_ROOT = new URL("../..", import.meta.url).pathname; +let REPO_ROOT = new URL("../..", import.meta.url).pathname; Deno.bench( "bench: read all ansible playbooks", async () => { - const files = [ + let files = [ "site.yml", "base.yml", "security.yml", @@ -34,7 +31,7 @@ Deno.bench( Deno.bench( "bench: enumerate all role directories", async () => { - const entries = []; + let entries = []; for await (const e of Deno.readDir(`${REPO_ROOT}/ansible/roles`)) { entries.push(e); } @@ -51,7 +48,7 @@ Deno.bench( Deno.bench( "bench: enumerate group_vars", async () => { - const entries = []; + let entries = []; for await (const e of Deno.readDir( `${REPO_ROOT}/ansible/inventory/group_vars`, )) { @@ -63,9 +60,9 @@ Deno.bench( Deno.bench( "bench: read all terraform main files", async () => { - const files = ["main.tf", "variables.tf", "outputs.tf", "versions.tf"]; - const promises = files.map((f) => { - const path = `${REPO_ROOT}/terraform/${f}`; + let files = ["main.tf", "variables.tf", "outputs.tf", "versions.tf"]; + let promises = files.map((f) => { + let path = `${REPO_ROOT}/terraform/${f}`; return Deno.readTextFile(path).catch(() => null); }); await Promise.all(promises); @@ -75,7 +72,7 @@ Deno.bench( Deno.bench( "bench: enumerate terraform modules", async () => { - const entries = []; + let entries = []; try { for await (const e of Deno.readDir(`${REPO_ROOT}/terraform/modules`)) { entries.push(e); @@ -98,11 +95,10 @@ Deno.bench( Deno.bench( "bench: enumerate all scripts", async () => { - const entries = []; + let entries = []; for await (const e of Deno.readDir(`${REPO_ROOT}/scripts`)) { entries.push(e); } }, ); -==================================== */ diff --git a/tests/contract/infra_contracts_test.affine b/tests/contract/infra_contracts_test.affine index e033f03..8260638 100644 --- a/tests/contract/infra_contracts_test.affine +++ b/tests/contract/infra_contracts_test.affine @@ -1,47 +1,44 @@ // SPDX-License-Identifier: MPL-2.0 -// Ported via Harvard Engine mechanical processor +// Ported via Harvard Engine (Semantic pass) module infra_contracts_test; -// TODO: Complete semantic implementation - -/* === ORIGINAL TYPESCRIPT CONTEXT === // SPDX-License-Identifier: MPL-2.0 // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) // Contract/invariant tests — Security and structural requirements import { assertEquals } from "https://deno.land/std@0.220.0/assert/mod.ts"; -const REPO_ROOT = new URL("../..", import.meta.url).pathname; +let REPO_ROOT = new URL("../..", import.meta.url).pathname; Deno.test("Contract: INVARIANT — No plaintext passwords in YAML files", async () => { const yamlFiles: string[] = []; // Collect all YAML files - const playbooksDir = `${REPO_ROOT}/ansible/playbooks`; + let playbooksDir = `${REPO_ROOT}/ansible/playbooks`; for await (const entry of Deno.readDir(playbooksDir)) { if (entry.isFile && entry.name.endsWith(".yml")) { yamlFiles.push(`${playbooksDir}/${entry.name}`); } } - const rolesDir = `${REPO_ROOT}/ansible/roles`; + let rolesDir = `${REPO_ROOT}/ansible/roles`; for await (const roleEntry of Deno.readDir(rolesDir)) { if (roleEntry.isDirectory) { - const tasksFile = `${rolesDir}/${roleEntry.name}/tasks/main.yml`; - const defaultsFile = `${rolesDir}/${roleEntry.name}/defaults/main.yml`; + let tasksFile = `${rolesDir}/${roleEntry.name}/tasks/main.yml`; + let defaultsFile = `${rolesDir}/${roleEntry.name}/defaults/main.yml`; if (await fileExists(tasksFile)) yamlFiles.push(tasksFile); if (await fileExists(defaultsFile)) yamlFiles.push(defaultsFile); } } // Pattern for suspected plaintext passwords - const passwordPattern = + let passwordPattern = /password:\s*['"]?(?!{{\s*.*\s*}})([a-zA-Z0-9!@#$%^&*_-]{8,})['"]?/gi; for (const file of yamlFiles) { - const content = await Deno.readTextFile(file); - const matches = content.match(passwordPattern); + let content = await Deno.readTextFile(file); + let matches = content.match(passwordPattern); // Exclude vault references and variable interpolation let suspiciousMatches = 0; @@ -66,8 +63,8 @@ Deno.test("Contract: INVARIANT — No plaintext passwords in YAML files", async }); Deno.test("Contract: INVARIANT — Firewall role must exist", async () => { - const firewallPath = `${REPO_ROOT}/ansible/roles/firewall`; - const stat = await Deno.stat(firewallPath); + let firewallPath = `${REPO_ROOT}/ansible/roles/firewall`; + let stat = await Deno.stat(firewallPath); assertEquals( stat.isDirectory, true, @@ -76,8 +73,8 @@ Deno.test("Contract: INVARIANT — Firewall role must exist", async () => { }); Deno.test("Contract: INVARIANT — Sudo config role must exist", async () => { - const sudoPath = `${REPO_ROOT}/ansible/roles/sudo_config`; - const stat = await Deno.stat(sudoPath); + let sudoPath = `${REPO_ROOT}/ansible/roles/sudo_config`; + let stat = await Deno.stat(sudoPath); assertEquals( stat.isDirectory, true, @@ -86,12 +83,12 @@ Deno.test("Contract: INVARIANT — Sudo config role must exist", async () => { }); Deno.test("Contract: INVARIANT — All roles have meta/main.yml", async () => { - const rolesDir = `${REPO_ROOT}/ansible/roles`; + let rolesDir = `${REPO_ROOT}/ansible/roles`; for await (const entry of Deno.readDir(rolesDir)) { if (entry.isDirectory) { - const metaFile = `${rolesDir}/${entry.name}/meta/main.yml`; - const stat = await Deno.stat(metaFile); + let metaFile = `${rolesDir}/${entry.name}/meta/main.yml`; + let stat = await Deno.stat(metaFile); assertEquals( stat.isFile, true, @@ -120,11 +117,11 @@ Deno.test("Contract: INVARIANT — Terraform state files not committed", async ( }); Deno.test("Contract: INVARIANT — Security playbook has hardening context", async () => { - const securityContent = await Deno.readTextFile( + let securityContent = await Deno.readTextFile( `${REPO_ROOT}/ansible/playbooks/security.yml`, ); - const hasSecurityContext = + let hasSecurityContext = securityContent.includes("become: true") || securityContent.includes("firewall") || securityContent.includes("sudo"); @@ -137,14 +134,14 @@ Deno.test("Contract: INVARIANT — Security playbook has hardening context", asy }); Deno.test("Contract: INVARIANT — No become without justification in critical roles", async () => { - const criticalRoles = ["firewall", "sudo_config"]; + let criticalRoles = ["firewall", "sudo_config"]; for (const role of criticalRoles) { - const tasksFile = `${REPO_ROOT}/ansible/roles/${role}/tasks/main.yml`; - const content = await Deno.readTextFile(tasksFile); + let tasksFile = `${REPO_ROOT}/ansible/roles/${role}/tasks/main.yml`; + let content = await Deno.readTextFile(tasksFile); // Check that become: true is used (justified by the role's purpose) - const hasBecomeTrue = content.includes("become: true"); + let hasBecomeTrue = content.includes("become: true"); assertEquals( hasBecomeTrue, true, @@ -154,7 +151,7 @@ Deno.test("Contract: INVARIANT — No become without justification in critical r }); Deno.test("Contract: Base configuration must reference base_packages", async () => { - const baseContent = await Deno.readTextFile( + let baseContent = await Deno.readTextFile( `${REPO_ROOT}/ansible/playbooks/base.yml`, ); @@ -165,7 +162,7 @@ Deno.test("Contract: Base configuration must reference base_packages", async () ); }); -async function fileExists(path: string): Promise { +async fn fileExists(path: string): boolean { try { await Deno.stat(path); return true; @@ -180,7 +177,7 @@ async function fileExists(path: string): Promise { async function* walkDir(path: string): AsyncGenerator { try { for await (const entry of Deno.readDir(path)) { - const fullPath = `${path}/${entry.name}`; + let fullPath = `${path}/${entry.name}`; yield fullPath; if (entry.isDirectory) { yield* walkDir(fullPath); @@ -193,4 +190,3 @@ async function* walkDir(path: string): AsyncGenerator { } } -==================================== */ diff --git a/tests/e2e/pipeline_e2e_test.affine b/tests/e2e/pipeline_e2e_test.affine index 41a41c8..1d6f1c6 100644 --- a/tests/e2e/pipeline_e2e_test.affine +++ b/tests/e2e/pipeline_e2e_test.affine @@ -1,25 +1,22 @@ // SPDX-License-Identifier: MPL-2.0 -// Ported via Harvard Engine mechanical processor +// Ported via Harvard Engine (Semantic pass) module pipeline_e2e_test; -// TODO: Complete semantic implementation - -/* === ORIGINAL TYPESCRIPT CONTEXT === // SPDX-License-Identifier: MPL-2.0 // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) // E2E contract tests — Full Ansible hierarchy validation import { assertEquals } from "https://deno.land/std@0.220.0/assert/mod.ts"; -const REPO_ROOT = new URL("../..", import.meta.url).pathname; +let REPO_ROOT = new URL("../..", import.meta.url).pathname; Deno.test("E2E: site.yml imports all critical playbooks", async () => { - const siteContent = await Deno.readTextFile( + let siteContent = await Deno.readTextFile( `${REPO_ROOT}/ansible/playbooks/site.yml`, ); - const requiredImports = ["base.yml", "security.yml", "containers.yml"]; + let requiredImports = ["base.yml", "security.yml", "containers.yml"]; for (const importName of requiredImports) { assertEquals( siteContent.includes(importName), @@ -30,22 +27,22 @@ Deno.test("E2E: site.yml imports all critical playbooks", async () => { }); Deno.test("E2E: All roles referenced in playbooks exist", async () => { - const playbooksDir = `${REPO_ROOT}/ansible/playbooks`; + let playbooksDir = `${REPO_ROOT}/ansible/playbooks`; const roleNames: Set = new Set(); // Collect all playbook files for await (const entry of Deno.readDir(playbooksDir)) { if (entry.isFile && entry.name.endsWith(".yml")) { - const content = await Deno.readTextFile( + let content = await Deno.readTextFile( `${playbooksDir}/${entry.name}`, ); // Extract role references (simple pattern: "- role:" or "roles:") - const roleMatches = content.match(/\brole:\s*(\w+)/g) || + let roleMatches = content.match(/\brole:\s*(\w+)/g) || content.match(/\broles:\s*[\n\s]*-\s*(\w+)/g) || []; for (const match of roleMatches) { - const roleName = match.replace(/role:\s*|\broles:\s*[\n\s]*-\s*/, ""); + let roleName = match.replace(/role:\s*|\broles:\s*[\n\s]*-\s*/, ""); if (roleName.length > 0) { roleNames.add(roleName); } @@ -54,10 +51,10 @@ Deno.test("E2E: All roles referenced in playbooks exist", async () => { } // Verify each referenced role exists - const rolesDir = `${REPO_ROOT}/ansible/roles`; + let rolesDir = `${REPO_ROOT}/ansible/roles`; for (const roleName of roleNames) { try { - const stat = await Deno.stat(`${rolesDir}/${roleName}`); + let stat = await Deno.stat(`${rolesDir}/${roleName}`); assertEquals( stat.isDirectory, true, @@ -74,17 +71,17 @@ Deno.test("E2E: All roles referenced in playbooks exist", async () => { }); Deno.test("E2E: Inventory references match group_vars", async () => { - const hostsContent = await Deno.readTextFile( + let hostsContent = await Deno.readTextFile( `${REPO_ROOT}/ansible/inventory/hosts.yml`, ); // Extract group names from inventory - const groupMatches = hostsContent.match(/^\[(\w+)\]/gm) || []; + let groupMatches = hostsContent.match(/^\[(\w+)\]/gm) || []; const groups: Set = new Set( groupMatches.map((g) => g.replace(/[\[\]]/g, "")), ); - const groupVarsDir = `${REPO_ROOT}/ansible/inventory/group_vars`; + let groupVarsDir = `${REPO_ROOT}/ansible/inventory/group_vars`; const varsFiles: Set = new Set(); for await (const entry of Deno.readDir(groupVarsDir)) { @@ -95,7 +92,7 @@ Deno.test("E2E: Inventory references match group_vars", async () => { // Each group in inventory should have a corresponding group_vars file for (const group of groups) { - const hasVars = varsFiles.has(group); + let hasVars = varsFiles.has(group); assertEquals( hasVars || group === "all" || group === "ungrouped", true, @@ -105,7 +102,7 @@ Deno.test("E2E: Inventory references match group_vars", async () => { }); Deno.test("E2E: Security playbook references firewall and sudo roles", async () => { - const securityContent = await Deno.readTextFile( + let securityContent = await Deno.readTextFile( `${REPO_ROOT}/ansible/playbooks/security.yml`, ); @@ -123,7 +120,7 @@ Deno.test("E2E: Security playbook references firewall and sudo roles", async () }); Deno.test("E2E: Base playbook references base_packages and users roles", async () => { - const baseContent = await Deno.readTextFile( + let baseContent = await Deno.readTextFile( `${REPO_ROOT}/ansible/playbooks/base.yml`, ); @@ -141,7 +138,7 @@ Deno.test("E2E: Base playbook references base_packages and users roles", async ( }); Deno.test("E2E: Containers playbook references podman role", async () => { - const containersContent = await Deno.readTextFile( + let containersContent = await Deno.readTextFile( `${REPO_ROOT}/ansible/playbooks/containers.yml`, ); @@ -153,7 +150,7 @@ Deno.test("E2E: Containers playbook references podman role", async () => { }); Deno.test("E2E: All playbooks have valid basic YAML structure", async () => { - const playbooks = [ + let playbooks = [ "site.yml", "base.yml", "security.yml", @@ -163,12 +160,12 @@ Deno.test("E2E: All playbooks have valid basic YAML structure", async () => { ]; for (const playbook of playbooks) { - const content = await Deno.readTextFile( + let content = await Deno.readTextFile( `${REPO_ROOT}/ansible/playbooks/${playbook}`, ); // Should have some YAML structure indicators - const hasYamlStructure = + let hasYamlStructure = content.includes("-") || content.includes(":") || content.includes("name:") || @@ -182,4 +179,3 @@ Deno.test("E2E: All playbooks have valid basic YAML structure", async () => { } }); -==================================== */ diff --git a/tests/property/ansible_property_test.affine b/tests/property/ansible_property_test.affine index 259cdbc..8f9f12e 100644 --- a/tests/property/ansible_property_test.affine +++ b/tests/property/ansible_property_test.affine @@ -1,36 +1,33 @@ // SPDX-License-Identifier: MPL-2.0 -// Ported via Harvard Engine mechanical processor +// Ported via Harvard Engine (Semantic pass) module ansible_property_test; -// TODO: Complete semantic implementation - -/* === ORIGINAL TYPESCRIPT CONTEXT === // SPDX-License-Identifier: MPL-2.0 // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) // Property-based tests — YAML validation loops and convention checks import { assertEquals } from "https://deno.land/std@0.220.0/assert/mod.ts"; -const REPO_ROOT = new URL("../..", import.meta.url).pathname; +let REPO_ROOT = new URL("../..", import.meta.url).pathname; Deno.test("Property: All YAML files are readable and valid (100 iterations)", async () => { const yamlFiles: string[] = []; // Collect all YAML files - const playbooksDir = `${REPO_ROOT}/ansible/playbooks`; + let playbooksDir = `${REPO_ROOT}/ansible/playbooks`; for await (const entry of Deno.readDir(playbooksDir)) { if (entry.isFile && entry.name.endsWith(".yml")) { yamlFiles.push(`${playbooksDir}/${entry.name}`); } } - const rolesDir = `${REPO_ROOT}/ansible/roles`; + let rolesDir = `${REPO_ROOT}/ansible/roles`; for await (const roleEntry of Deno.readDir(rolesDir)) { if (roleEntry.isDirectory) { - const tasksFile = `${rolesDir}/${roleEntry.name}/tasks/main.yml`; - const metaFile = `${rolesDir}/${roleEntry.name}/meta/main.yml`; - const defaultsFile = `${rolesDir}/${roleEntry.name}/defaults/main.yml`; + let tasksFile = `${rolesDir}/${roleEntry.name}/tasks/main.yml`; + let metaFile = `${rolesDir}/${roleEntry.name}/meta/main.yml`; + let defaultsFile = `${rolesDir}/${roleEntry.name}/defaults/main.yml`; if (await fileExists(tasksFile)) yamlFiles.push(tasksFile); if (await fileExists(metaFile)) yamlFiles.push(metaFile); @@ -41,7 +38,7 @@ Deno.test("Property: All YAML files are readable and valid (100 iterations)", as // Property: Run 100 iterations of YAML readability for (let i = 0; i < 100; i++) { for (const yamlFile of yamlFiles) { - const content = await Deno.readTextFile(yamlFile); + let content = await Deno.readTextFile(yamlFile); assertEquals( typeof content, "string", @@ -52,8 +49,8 @@ Deno.test("Property: All YAML files are readable and valid (100 iterations)", as }); Deno.test("Property: Role directory names follow lowercase-underscore convention", async () => { - const rolesDir = `${REPO_ROOT}/ansible/roles`; - const rolePattern = /^[a-z][a-z0-9_]*$/; + let rolesDir = `${REPO_ROOT}/ansible/roles`; + let rolePattern = /^[a-z][a-z0-9_]*$/; for await (const entry of Deno.readDir(rolesDir)) { if (entry.isDirectory) { @@ -67,12 +64,12 @@ Deno.test("Property: Role directory names follow lowercase-underscore convention }); Deno.test("Property: All role tasks/main.yml files are non-empty", async () => { - const rolesDir = `${REPO_ROOT}/ansible/roles`; + let rolesDir = `${REPO_ROOT}/ansible/roles`; for await (const entry of Deno.readDir(rolesDir)) { if (entry.isDirectory) { - const taskFile = `${rolesDir}/${entry.name}/tasks/main.yml`; - const content = await Deno.readTextFile(taskFile); + let taskFile = `${rolesDir}/${entry.name}/tasks/main.yml`; + let content = await Deno.readTextFile(taskFile); assertEquals( content.length > 0, true, @@ -88,32 +85,32 @@ Deno.test("Property: All role tasks/main.yml files are non-empty", async () => { }); Deno.test("Property: Group vars follow expected structure patterns", async () => { - const groupVarsDir = `${REPO_ROOT}/ansible/inventory/group_vars`; + let groupVarsDir = `${REPO_ROOT}/ansible/inventory/group_vars`; for await (const entry of Deno.readDir(groupVarsDir)) { if (entry.isFile && entry.name.endsWith(".yml")) { - const content = await Deno.readTextFile( + let content = await Deno.readTextFile( `${groupVarsDir}/${entry.name}`, ); // Property: group vars should contain YAML structure assertEquals( content.includes(":") || content.includes("---"), true, - `Group var ${entry.name} should have valid YAML structure`, + `Group let ${entry.name} should have valid YAML structure`, ); } } }); Deno.test("Property: All playbooks start with valid YAML", async () => { - const playbooksDir = `${REPO_ROOT}/ansible/playbooks`; + let playbooksDir = `${REPO_ROOT}/ansible/playbooks`; for await (const entry of Deno.readDir(playbooksDir)) { if (entry.isFile && entry.name.endsWith(".yml")) { - const content = await Deno.readTextFile( + let content = await Deno.readTextFile( `${playbooksDir}/${entry.name}`, ); - const startIsValid = + let startIsValid = content.startsWith("---") || content.startsWith("#") || content.startsWith("-") || @@ -129,7 +126,7 @@ Deno.test("Property: All playbooks start with valid YAML", async () => { }); Deno.test("Property: Handlers exist in roles that define them", async () => { - const rolesWithHandlers = [ + let rolesWithHandlers = [ "firewall", "monitoring", "services", @@ -137,9 +134,9 @@ Deno.test("Property: Handlers exist in roles that define them", async () => { ]; for (const role of rolesWithHandlers) { - const handlersFile = `${REPO_ROOT}/ansible/roles/${role}/handlers/main.yml`; + let handlersFile = `${REPO_ROOT}/ansible/roles/${role}/handlers/main.yml`; try { - const content = await Deno.readTextFile(handlersFile); + let content = await Deno.readTextFile(handlersFile); assertEquals( content.length > 0, true, @@ -153,7 +150,7 @@ Deno.test("Property: Handlers exist in roles that define them", async () => { } }); -async function fileExists(path: string): Promise { +async fn fileExists(path: string): boolean { try { await Deno.stat(path); return true; @@ -165,4 +162,3 @@ async function fileExists(path: string): Promise { } } -==================================== */ diff --git a/tests/smoke/infra_smoke_test.affine b/tests/smoke/infra_smoke_test.affine index d36c26f..2ee2f43 100644 --- a/tests/smoke/infra_smoke_test.affine +++ b/tests/smoke/infra_smoke_test.affine @@ -1,32 +1,29 @@ // SPDX-License-Identifier: MPL-2.0 -// Ported via Harvard Engine mechanical processor +// Ported via Harvard Engine (Semantic pass) module infra_smoke_test; -// TODO: Complete semantic implementation - -/* === ORIGINAL TYPESCRIPT CONTEXT === // SPDX-License-Identifier: MPL-2.0 // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) // Smoke tests — Rapid validation of critical infrastructure components import { assertEquals } from "https://deno.land/std@0.220.0/assert/mod.ts"; -const REPO_ROOT = new URL("../..", import.meta.url).pathname; +let REPO_ROOT = new URL("../..", import.meta.url).pathname; Deno.test("Smoke: All shell scripts exist with bash shebang", async () => { - const scripts = [ + let scripts = [ "bootstrap.sh", "self-check.sh", "migrate-from-salt.sh", ]; for (const script of scripts) { - const path = `${REPO_ROOT}/scripts/${script}`; - const stat = await Deno.stat(path); + let path = `${REPO_ROOT}/scripts/${script}`; + let stat = await Deno.stat(path); assertEquals(stat.isFile, true, `Script ${script} should exist`); - const content = await Deno.readTextFile(path); + let content = await Deno.readTextFile(path); assertEquals( content.startsWith("#!/usr/bin/env bash") || content.startsWith("#!/bin/bash"), @@ -37,7 +34,7 @@ Deno.test("Smoke: All shell scripts exist with bash shebang", async () => { }); Deno.test("Smoke: Critical roles exist", async () => { - const criticalRoles = [ + let criticalRoles = [ "base_packages", "users", "firewall", @@ -47,8 +44,8 @@ Deno.test("Smoke: Critical roles exist", async () => { ]; for (const role of criticalRoles) { - const path = `${REPO_ROOT}/ansible/roles/${role}`; - const stat = await Deno.stat(path); + let path = `${REPO_ROOT}/ansible/roles/${role}`; + let stat = await Deno.stat(path); assertEquals( stat.isDirectory, true, @@ -58,7 +55,7 @@ Deno.test("Smoke: Critical roles exist", async () => { }); Deno.test("Smoke: Terraform structure exists", async () => { - const terraformPaths = [ + let terraformPaths = [ `${REPO_ROOT}/terraform`, `${REPO_ROOT}/terraform/main.tf`, `${REPO_ROOT}/terraform/variables.tf`, @@ -69,7 +66,7 @@ Deno.test("Smoke: Terraform structure exists", async () => { for (const path of terraformPaths) { try { - const stat = await Deno.stat(path); + let stat = await Deno.stat(path); assertEquals(true, true, `${path} should exist`); } catch (e) { if (e instanceof Deno.errors.NotFound) { @@ -82,7 +79,7 @@ Deno.test("Smoke: Terraform structure exists", async () => { }); Deno.test("Smoke: No obvious hardcoded passwords in playbooks", async () => { - const playbooks = [ + let playbooks = [ "site.yml", "base.yml", "security.yml", @@ -92,9 +89,9 @@ Deno.test("Smoke: No obvious hardcoded passwords in playbooks", async () => { ]; for (const playbook of playbooks) { - const path = `${REPO_ROOT}/ansible/playbooks/${playbook}`; - const content = await Deno.readTextFile(path); - const hasPassword = /password:\s*['"]?[a-zA-Z0-9_]{8,}['"]?/gi.test( + let path = `${REPO_ROOT}/ansible/playbooks/${playbook}`; + let content = await Deno.readTextFile(path); + let hasPassword = /password:\s*['"]?[a-zA-Z0-9_]{8,}['"]?/gi.test( content, ); assertEquals( @@ -106,9 +103,9 @@ Deno.test("Smoke: No obvious hardcoded passwords in playbooks", async () => { }); Deno.test("Smoke: Terraform modules directory exists", async () => { - const modulesPath = `${REPO_ROOT}/terraform/modules`; + let modulesPath = `${REPO_ROOT}/terraform/modules`; try { - const stat = await Deno.stat(modulesPath); + let stat = await Deno.stat(modulesPath); assertEquals(stat.isDirectory, true, "terraform/modules should exist"); } catch (e) { if (e instanceof Deno.errors.NotFound) { @@ -120,20 +117,20 @@ Deno.test("Smoke: Terraform modules directory exists", async () => { }); Deno.test("Smoke: Inventory structure is complete", async () => { - const inventoryPaths = [ + let inventoryPaths = [ `${REPO_ROOT}/ansible/inventory/hosts.yml`, `${REPO_ROOT}/ansible/inventory/group_vars`, ]; for (const path of inventoryPaths) { - const stat = await Deno.stat(path); + let stat = await Deno.stat(path); assertEquals(true, true, `${path} should exist`); } }); Deno.test("Smoke: ansible.cfg is present and readable", async () => { - const ansibleCfg = `${REPO_ROOT}/ansible/ansible.cfg`; - const content = await Deno.readTextFile(ansibleCfg); + let ansibleCfg = `${REPO_ROOT}/ansible/ansible.cfg`; + let content = await Deno.readTextFile(ansibleCfg); assertEquals( content.length > 0, true, @@ -146,4 +143,3 @@ Deno.test("Smoke: ansible.cfg is present and readable", async () => { ); }); -==================================== */ diff --git a/tests/unit/ansible_structure_test.affine b/tests/unit/ansible_structure_test.affine index c0f55b2..3a81060 100644 --- a/tests/unit/ansible_structure_test.affine +++ b/tests/unit/ansible_structure_test.affine @@ -1,21 +1,18 @@ // SPDX-License-Identifier: MPL-2.0 -// Ported via Harvard Engine mechanical processor +// Ported via Harvard Engine (Semantic pass) module ansible_structure_test; -// TODO: Complete semantic implementation - -/* === ORIGINAL TYPESCRIPT CONTEXT === // SPDX-License-Identifier: MPL-2.0 // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) // Unit tests — Ansible playbook and role structure validation import { assertEquals } from "https://deno.land/std@0.220.0/assert/mod.ts"; -const REPO_ROOT = new URL("../..", import.meta.url).pathname; +let REPO_ROOT = new URL("../..", import.meta.url).pathname; Deno.test("Unit: All playbook files exist", async () => { - const playbooks = [ + let playbooks = [ "site.yml", "base.yml", "security.yml", @@ -25,14 +22,14 @@ Deno.test("Unit: All playbook files exist", async () => { ]; for (const playbook of playbooks) { - const path = `${REPO_ROOT}/ansible/playbooks/${playbook}`; - const stat = await Deno.stat(path); + let path = `${REPO_ROOT}/ansible/playbooks/${playbook}`; + let stat = await Deno.stat(path); assertEquals(stat.isFile, true, `Playbook ${playbook} should exist`); } }); Deno.test("Unit: All critical roles exist", async () => { - const roles = [ + let roles = [ "base_packages", "users", "firewall", @@ -47,18 +44,18 @@ Deno.test("Unit: All critical roles exist", async () => { ]; for (const role of roles) { - const path = `${REPO_ROOT}/ansible/roles/${role}`; - const stat = await Deno.stat(path); + let path = `${REPO_ROOT}/ansible/roles/${role}`; + let stat = await Deno.stat(path); assertEquals(stat.isDirectory, true, `Role directory ${role} should exist`); } }); Deno.test("Unit: All roles have tasks/main.yml", async () => { - const rolesDir = `${REPO_ROOT}/ansible/roles`; + let rolesDir = `${REPO_ROOT}/ansible/roles`; for await (const entry of Deno.readDir(rolesDir)) { if (entry.isDirectory) { - const taskFile = `${rolesDir}/${entry.name}/tasks/main.yml`; - const stat = await Deno.stat(taskFile); + let taskFile = `${rolesDir}/${entry.name}/tasks/main.yml`; + let stat = await Deno.stat(taskFile); assertEquals( stat.isFile, true, @@ -69,17 +66,17 @@ Deno.test("Unit: All roles have tasks/main.yml", async () => { }); Deno.test("Unit: Inventory files exist", async () => { - const inventory = `${REPO_ROOT}/ansible/inventory/hosts.yml`; - const stat = await Deno.stat(inventory); + let inventory = `${REPO_ROOT}/ansible/inventory/hosts.yml`; + let stat = await Deno.stat(inventory); assertEquals(stat.isFile, true, "Inventory hosts.yml should exist"); - const groupVars = `${REPO_ROOT}/ansible/inventory/group_vars`; - const gvStat = await Deno.stat(groupVars); + let groupVars = `${REPO_ROOT}/ansible/inventory/group_vars`; + let gvStat = await Deno.stat(groupVars); assertEquals(gvStat.isDirectory, true, "group_vars directory should exist"); }); Deno.test("Unit: Playbook files are non-empty YAML", async () => { - const playbooks = [ + let playbooks = [ "site.yml", "base.yml", "security.yml", @@ -89,8 +86,8 @@ Deno.test("Unit: Playbook files are non-empty YAML", async () => { ]; for (const playbook of playbooks) { - const path = `${REPO_ROOT}/ansible/playbooks/${playbook}`; - const content = await Deno.readTextFile(path); + let path = `${REPO_ROOT}/ansible/playbooks/${playbook}`; + let content = await Deno.readTextFile(path); assertEquals(content.length > 0, true, `${playbook} should not be empty`); assertEquals( content.includes("---") || content.includes(":"), @@ -101,11 +98,11 @@ Deno.test("Unit: Playbook files are non-empty YAML", async () => { }); Deno.test("Unit: All role tasks are non-empty", async () => { - const rolesDir = `${REPO_ROOT}/ansible/roles`; + let rolesDir = `${REPO_ROOT}/ansible/roles`; for await (const entry of Deno.readDir(rolesDir)) { if (entry.isDirectory) { - const taskFile = `${rolesDir}/${entry.name}/tasks/main.yml`; - const content = await Deno.readTextFile(taskFile); + let taskFile = `${rolesDir}/${entry.name}/tasks/main.yml`; + let content = await Deno.readTextFile(taskFile); assertEquals( content.length > 0, true, @@ -116,11 +113,11 @@ Deno.test("Unit: All role tasks are non-empty", async () => { }); Deno.test("Unit: All roles have meta/main.yml", async () => { - const rolesDir = `${REPO_ROOT}/ansible/roles`; + let rolesDir = `${REPO_ROOT}/ansible/roles`; for await (const entry of Deno.readDir(rolesDir)) { if (entry.isDirectory) { - const metaFile = `${rolesDir}/${entry.name}/meta/main.yml`; - const stat = await Deno.stat(metaFile); + let metaFile = `${rolesDir}/${entry.name}/meta/main.yml`; + let stat = await Deno.stat(metaFile); assertEquals( stat.isFile, true, @@ -131,9 +128,8 @@ Deno.test("Unit: All roles have meta/main.yml", async () => { }); Deno.test("Unit: ansible.cfg exists", async () => { - const ansibleCfg = `${REPO_ROOT}/ansible/ansible.cfg`; - const stat = await Deno.stat(ansibleCfg); + let ansibleCfg = `${REPO_ROOT}/ansible/ansible.cfg`; + let stat = await Deno.stat(ansibleCfg); assertEquals(stat.isFile, true, "ansible.cfg should exist"); }); -==================================== */