( ′∀`)σ≡σ☆))Д′)レ(゚∀゚;)ヘ=З=З=Зε≡(ノ´_ゝ`)ノ
<?php
session_start();
// Repository Feature Test Harness for n8n PHP dashboard
require __DIR__ . '/lib/N8nHttp.php';
if (empty($_SESSION['auth'])) {
header('Location: auth.php');
exit;
}
$cfg = n8n_config();
function h($str) { return htmlspecialchars((string)$str, ENT_QUOTES, 'UTF-8'); }
// Handle actions
$action = $_POST['action'] ?? null;
$message = null;
$result = null;
if ($action === 'health_check') {
$result = n8n_health_check();
$message = 'Health check completed';
}
elseif ($action === 'list_workflows') {
$limit = (int)($_POST['limit'] ?? 10);
$result = n8n_list_workflows(['limit' => $limit]);
$message = 'Fetched workflows';
}
elseif ($action === 'get_workflow') {
$id = trim($_POST['workflow_id'] ?? '');
if ($id) {
$result = n8n_get_workflow($id);
$message = "Fetched workflow {$id}";
}
}
elseif ($action === 'activate_workflow') {
$id = trim($_POST['workflow_id'] ?? '');
if ($id) {
$result = n8n_activate_workflow($id);
$message = ($result['status'] === 200) ? "Activated {$id}" : ($result['error'] ?? 'Activation failed');
}
}
elseif ($action === 'deactivate_workflow') {
$id = trim($_POST['workflow_id'] ?? '');
if ($id) {
$result = n8n_deactivate_workflow($id);
$message = ($result['status'] === 200) ? "Deactivated {$id}" : ($result['error'] ?? 'Deactivation failed');
}
}
elseif ($action === 'trigger_webhook') {
$path = trim($_POST['webhook_path'] ?? '');
$method = trim($_POST['webhook_method'] ?? 'POST');
$payloadStr = $_POST['webhook_payload'] ?? '{}';
$payload = json_decode($payloadStr, true);
if (json_last_error() !== JSON_ERROR_NONE) {
$message = 'Invalid JSON payload';
} else {
$result = n8n_trigger_webhook($path, $payload, $method);
$message = ($result['status'] >= 200 && $result['status'] < 300) ? 'Webhook triggered' : ($result['error'] ?? 'Webhook failed');
}
}
elseif ($action === 'execution_status') {
$id = trim($_POST['execution_id'] ?? '');
if ($id) {
$includeData = !empty($_POST['include_data']);
$result = n8n_execution_status($id, $includeData);
$message = 'Execution fetched';
}
}
elseif ($action === 'api_request') {
$method = trim($_POST['method'] ?? 'GET');
$path = trim($_POST['path'] ?? '/');
$queryStr = trim($_POST['query'] ?? '');
$payloadStr = trim($_POST['payload'] ?? '');
$query = [];
$payload = [];
if ($queryStr) { $query = json_decode($queryStr, true) ?: []; }
if ($payloadStr) { $payload = json_decode($payloadStr, true) ?: []; }
$result = n8n_api_request($method, $path, $payload, $query);
$message = 'API request executed';
}
// Projects
elseif ($action === 'create_project') {
$name = trim($_POST['project_name'] ?? '');
$result = n8n_api_request('POST', '/projects', ['name' => $name]);
$message = 'Project created request sent';
}
elseif ($action === 'list_projects') {
$limit = (int)($_POST['limit'] ?? 25);
$result = n8n_api_request('GET', '/projects', [], ['limit' => $limit]);
$message = 'Projects fetched';
}
elseif ($action === 'delete_project') {
$id = trim($_POST['project_id'] ?? '');
$result = n8n_api_request('DELETE', "/projects/{$id}");
$message = 'Project delete request sent';
}
// Tags
elseif ($action === 'create_tag') {
$name = trim($_POST['tag_name'] ?? '');
$result = n8n_api_request('POST', '/tags', ['name' => $name]);
$message = 'Tag created request sent';
}
elseif ($action === 'list_tags') {
$limit = (int)($_POST['limit'] ?? 25);
$cursor = trim($_POST['cursor'] ?? '');
$query = ['limit' => $limit];
if ($cursor) { $query['cursor'] = $cursor; }
$result = n8n_api_request('GET', '/tags', [], $query);
$message = 'Tags fetched';
}
elseif ($action === 'delete_tag') {
$id = trim($_POST['tag_id'] ?? '');
$result = n8n_api_request('DELETE', "/tags/{$id}");
$message = 'Tag delete request sent';
}
// Variables
elseif ($action === 'create_variable') {
$key = trim($_POST['var_key'] ?? '');
$val = trim($_POST['var_value'] ?? '');
$result = n8n_api_request('POST', '/variables', ['key' => $key, 'value' => $val]);
$message = 'Variable create request sent';
}
elseif ($action === 'list_variables') {
$limit = (int)($_POST['limit'] ?? 25);
$result = n8n_api_request('GET', '/variables', [], ['limit' => $limit]);
$message = 'Variables fetched';
}
elseif ($action === 'delete_variable') {
$id = trim($_POST['var_id'] ?? '');
$result = n8n_api_request('DELETE', "/variables/{$id}");
$message = 'Variable delete request sent';
}
// Users
elseif ($action === 'list_users') {
// Accept optional filters JSON
$filtersStr = trim($_POST['filters'] ?? '');
$filters = $filtersStr ? (json_decode($filtersStr, true) ?: []) : [];
$result = n8n_api_request('GET', '/users', [], $filters);
$message = 'Users fetched';
}
elseif ($action === 'create_users') {
$payloadStr = trim($_POST['users_payload'] ?? '');
$payload = $payloadStr ? (json_decode($payloadStr, true) ?: []) : [];
$result = n8n_api_request('POST', '/users', $payload);
$message = 'Users create request sent';
}
elseif ($action === 'delete_user') {
$id = trim($_POST['user_id'] ?? '');
$result = n8n_api_request('DELETE', "/users/{$id}");
$message = 'User delete request sent';
}
?><!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Test Harness | n8n PHP</title>
<link rel="stylesheet" href="assets/styles.css">
</head>
<body>
<header>
<h1>Repository Test Harness</h1>
<div style="float:right; font-size:14px;">
<span style="opacity:.85; margin-right:10px;">Signed in as <?php echo h($_SESSION['name'] ?? ($_SESSION['user_email'] ?? 'user')); ?></span>
<a href="logout.php" style="color:#fff; text-decoration:none; border:1px solid #2a3447; padding:6px 10px; border-radius:8px; background:#182235;">Logout</a>
</div>
<div style="clear:both;"></div>
<div class="config">API: <?php echo h($cfg['api_base_url']); ?> | Webhook: <?php echo h($cfg['webhook_base_url']); ?></div>
<div class="config">Auth token present: <?php echo h(!empty($cfg['auth_token']) ? 'yes' : 'no'); ?> | API key present: <?php echo h(!empty($cfg['api_key']) ? 'yes' : 'no'); ?></div>
<div class="config">SSL verify: <?php echo h($cfg['ssl_verify'] ? 'true' : 'false'); ?></div>
</header>
<div class="layout">
<aside>
<nav class="nav" style="margin-bottom:12px;">
<a href="index.php?page=home">Home</a>
<a class="active" href="test.php">Test Harness</a>
</nav>
<div style="margin-top:12px; font-size:12px; color:#9ca3af;">Webhook base: <?php echo h($cfg['webhook_base_url']); ?></div>
</aside>
<div class="container">
<div class="card" style="margin-bottom:16px;">
<div class="hero hero-aws">
<div class="title">Comprehensive Feature Tests</div>
<div class="subtitle">Exercise workflows, executions, webhooks, and admin endpoints via the n8n REST API.</div>
<div class="cta-group">
<form method="post" style="display:inline-block;">
<input type="hidden" name="action" value="health_check">
<button class="button primary" type="submit">Run Health Check</button>
</form>
<a class="button secondary" href="#api">Jump to Generic API</a>
</div>
<ul class="bullets" style="margin-top:12px;">
<li>List workflows, toggle activation, and fetch details.</li>
<li>Trigger webhooks with HMAC signature support.</li>
<li>Inspect execution status and raw response payloads.</li>
<li>CRUD helpers: projects, tags, variables, users.</li>
</ul>
</div>
</div>
<?php if ($message): ?>
<div class="card"><div class="config">Action: <?php echo h($action); ?> — <?php echo h($message); ?></div></div>
<?php endif; ?>
<div class="grid" style="margin-bottom:16px;">
<div class="card">
<h2>Workflows</h2>
<form method="post" class="form">
<input type="hidden" name="action" value="list_workflows">
<div class="row">
<input type="number" name="limit" placeholder="Limit" value="10">
</div>
<button type="submit">List</button>
</form>
<form method="post" class="form" style="margin-top:10px;">
<input type="hidden" name="action" value="get_workflow">
<div class="row"><input type="text" name="workflow_id" placeholder="Workflow ID"></div>
<button type="submit">Get Details</button>
</form>
<form method="post" class="form" style="margin-top:10px; display:flex; gap:8px;">
<input type="hidden" name="action" value="activate_workflow">
<input type="text" name="workflow_id" placeholder="Workflow ID" style="flex:1;">
<button type="submit">Activate</button>
</form>
<form method="post" class="form" style="margin-top:6px; display:flex; gap:8px;">
<input type="hidden" name="action" value="deactivate_workflow">
<input type="text" name="workflow_id" placeholder="Workflow ID" style="flex:1;">
<button type="submit">Deactivate</button>
</form>
</div>
<div class="card">
<h2>Webhook Trigger</h2>
<form method="post" class="form">
<input type="hidden" name="action" value="trigger_webhook">
<div class="row"><input type="text" name="webhook_path" placeholder="Path (e.g., webhook/test)" required></div>
<div class="row">
<select name="webhook_method">
<option value="POST">POST</option>
<option value="GET">GET</option>
</select>
</div>
<div class="row"><textarea name="webhook_payload" placeholder='JSON payload'>{"hello":"world"}</textarea></div>
<button type="submit">Trigger</button>
<div class="config">Base: <?php echo h($cfg['webhook_base_url']); ?></div>
</form>
</div>
</div>
<div class="grid" style="margin-bottom:16px;">
<div class="card">
<h2>Execution Status</h2>
<form method="post" class="form">
<input type="hidden" name="action" value="execution_status">
<div class="row"><input type="text" name="execution_id" placeholder="Execution ID" required></div>
<div class="row"><label><input type="checkbox" name="include_data" value="1"> Include Data</label></div>
<button type="submit">Fetch</button>
</form>
</div>
<div class="card" id="api">
<h2>Generic API Request</h2>
<form method="post" class="form">
<input type="hidden" name="action" value="api_request">
<div class="two-col">
<div class="row">
<select name="method">
<option>GET</option>
<option>POST</option>
<option>PUT</option>
<option>PATCH</option>
<option>DELETE</option>
</select>
</div>
<div class="row"><input type="text" name="path" placeholder="/workflows"></div>
</div>
<div class="row"><textarea name="query" placeholder='Query (JSON), e.g. {"limit":25}'></textarea></div>
<div class="row"><textarea name="payload" placeholder='Payload (JSON)'></textarea></div>
<button type="submit">Send</button>
<div class="config">Base: <?php echo h($cfg['api_base_url']); ?></div>
</form>
</div>
</div>
<div class="grid">
<div class="card">
<h2>Projects</h2>
<form method="post" class="form">
<input type="hidden" name="action" value="create_project">
<div class="row"><input type="text" name="project_name" placeholder="Name" required></div>
<button type="submit">Create</button>
</form>
<form method="post" class="form" style="margin-top:10px;">
<input type="hidden" name="action" value="list_projects">
<div class="row"><input type="number" name="limit" placeholder="Limit" value="25"></div>
<button type="submit">List</button>
</form>
<form method="post" class="form" style="margin-top:10px; display:flex; gap:8px;">
<input type="hidden" name="action" value="delete_project">
<input type="text" name="project_id" placeholder="Project ID" style="flex:1;">
<button type="submit">Delete</button>
</form>
</div>
<div class="card">
<h2>Tags</h2>
<form method="post" class="form">
<input type="hidden" name="action" value="create_tag">
<div class="row"><input type="text" name="tag_name" placeholder="Name" required></div>
<button type="submit">Create</button>
</form>
<form method="post" class="form" style="margin-top:10px;">
<input type="hidden" name="action" value="list_tags">
<div class="two-col">
<div class="row"><input type="number" name="limit" placeholder="Limit" value="25"></div>
<div class="row"><input type="text" name="cursor" placeholder="Cursor"></div>
</div>
<button type="submit">List</button>
</form>
<form method="post" class="form" style="margin-top:10px; display:flex; gap:8px;">
<input type="hidden" name="action" value="delete_tag">
<input type="text" name="tag_id" placeholder="Tag ID" style="flex:1;">
<button type="submit">Delete</button>
</form>
</div>
</div>
<div class="grid" style="margin-top:16px;">
<div class="card">
<h2>Variables</h2>
<form method="post" class="form">
<input type="hidden" name="action" value="create_variable">
<div class="two-col">
<div class="row"><input type="text" name="var_key" placeholder="Key" required></div>
<div class="row"><input type="text" name="var_value" placeholder="Value" required></div>
</div>
<button type="submit">Create</button>
</form>
<form method="post" class="form" style="margin-top:10px;">
<input type="hidden" name="action" value="list_variables">
<div class="row"><input type="number" name="limit" placeholder="Limit" value="25"></div>
<button type="submit">List</button>
</form>
<form method="post" class="form" style="margin-top:10px; display:flex; gap:8px;">
<input type="hidden" name="action" value="delete_variable">
<input type="text" name="var_id" placeholder="Variable ID" style="flex:1;">
<button type="submit">Delete</button>
</form>
</div>
<div class="card">
<h2>Users</h2>
<form method="post" class="form">
<input type="hidden" name="action" value="list_users">
<div class="row"><textarea name="filters" placeholder='Optional filters JSON, e.g. {"limit":20}'></textarea></div>
<button type="submit">List</button>
</form>
<form method="post" class="form" style="margin-top:10px;">
<input type="hidden" name="action" value="create_users">
<div class="row"><textarea name="users_payload" placeholder='Array of users JSON, e.g. [{"email":"a@example.com","firstName":"A"}]'></textarea></div>
<button type="submit">Create</button>
</form>
<form method="post" class="form" style="margin-top:10px; display:flex; gap:8px;">
<input type="hidden" name="action" value="delete_user">
<input type="text" name="user_id" placeholder="User ID" style="flex:1;">
<button type="submit">Delete</button>
</form>
</div>
</div>
<div class="card" style="margin-top:16px;">
<h2>Result</h2>
<?php if ($result): ?>
<pre><?php echo h(json_encode($result, JSON_PRETTY_PRINT)); ?></pre>
<?php else: ?>
<p>No action executed yet. Submit any form above to see the result.</p>
<?php endif; ?>
</div>
<footer>
<div>API: <?php echo h($cfg['api_base_url']); ?> | Webhook: <?php echo h($cfg['webhook_base_url']); ?></div>
</footer>
</div>
</div>
</body>
</html>