Skip to main content
Glama
test-config.js6.75 kB
/** * Test Configuration - Dual environment support for test and live * Enables safe testing without affecting production data */ export const testConfig = { environments: { test: { url: process.env.TEST_GF_URL || process.env.GRAVITY_FORMS_TEST_URL || 'http://localhost:10003', consumer_key: process.env.TEST_GF_CONSUMER_KEY || process.env.GRAVITY_FORMS_TEST_CONSUMER_KEY, consumer_secret: process.env.TEST_GF_CONSUMER_SECRET || process.env.GRAVITY_FORMS_TEST_CONSUMER_SECRET, wp_user: process.env.TEST_WP_USER || 'admin', wp_password: process.env.TEST_WP_PASSWORD, formPrefix: 'TEST_', autoCleanup: true, timeout: 30000, retries: 3 }, live: { url: process.env.GF_URL || process.env.GRAVITY_FORMS_BASE_URL, consumer_key: process.env.GF_CONSUMER_KEY || process.env.GRAVITY_FORMS_CONSUMER_KEY, consumer_secret: process.env.GF_CONSUMER_SECRET || process.env.GRAVITY_FORMS_CONSUMER_SECRET, formPrefix: '', autoCleanup: false, timeout: process.env.GRAVITY_FORMS_TIMEOUT || 30000, retries: process.env.GRAVITY_FORMS_MAX_RETRIES || 3 } }, /** * Get configuration for specified mode * @param {boolean} testMode - Use test configuration if true * @returns {object} Configuration object */ getConfig(testMode = false) { const envName = testMode ? 'test' : 'live'; const config = this.environments[envName]; // Validate required fields if (!config.url) { throw new Error(`Missing ${envName} URL configuration. Set ${testMode ? 'TEST_GF_URL' : 'GF_URL'} environment variable.`); } if (!config.consumer_key || !config.consumer_secret) { throw new Error(`Missing ${envName} authentication. Set consumer key and secret environment variables.`); } return config; }, /** * Check if test mode is enabled */ isTestMode() { return process.env.GRAVITYMCP_TEST_MODE === 'true' || process.env.NODE_ENV === 'test'; }, /** * Get current environment name */ getCurrentEnvironment() { return this.isTestMode() ? 'test' : 'live'; }, /** * Validate environment configuration */ validateEnvironment(testMode = false) { try { const config = this.getConfig(testMode); // Check URL format const url = new URL(config.url); if (!url.protocol.startsWith('http')) { throw new Error('URL must use HTTP or HTTPS protocol'); } // Check authentication if (config.consumer_key.length < 10 || config.consumer_secret.length < 10) { console.warn('Consumer key or secret seems too short. Verify your credentials.'); } return { valid: true, environment: testMode ? 'test' : 'live', url: config.url, hasAuth: true }; } catch (error) { return { valid: false, error: error.message, environment: testMode ? 'test' : 'live' }; } }, /** * Create test form name with prefix */ createTestFormName(baseName) { const config = this.getConfig(this.isTestMode()); return `${config.formPrefix}${baseName}`; }, /** * Check if form is a test form */ isTestForm(formTitle) { const config = this.getConfig(true); return formTitle.startsWith(config.formPrefix); }, /** * Get cleanup configuration */ getCleanupConfig() { const config = this.getConfig(this.isTestMode()); return { enabled: config.autoCleanup, prefix: config.formPrefix, olderThanHours: 24, // Clean up test forms older than 24 hours keepLatest: 10 // Keep latest 10 test forms }; } }; /** * Test Form Manager - Helper for test form lifecycle */ export class TestFormManager { constructor(apiClient, config = testConfig) { this.client = apiClient; this.config = config; this.trackedForms = new Set(); } /** * Create a test form with automatic tracking */ async createTestForm(name, fields = []) { const testName = this.config.createTestFormName(name); const form = await this.client.createForm({ title: testName, fields, is_active: true, description: `Automated test form created at ${new Date().toISOString()}` }); this.trackForm(form.form.id); return form.form; } /** * Delete a test form */ async deleteTestForm(formId) { try { await this.client.deleteForm({ id: formId, force: true }); this.untrackForm(formId); return true; } catch (error) { console.error(`Failed to delete test form ${formId}:`, error.message); return false; } } /** * Clean up all tracked test forms */ async cleanupTrackedForms() { const cleanupPromises = Array.from(this.trackedForms).map(formId => this.deleteTestForm(formId) ); const results = await Promise.allSettled(cleanupPromises); const succeeded = results.filter(r => r.status === 'fulfilled' && r.value).length; const failed = results.filter(r => r.status === 'rejected' || !r.value).length; return { succeeded, failed, total: this.trackedForms.size }; } /** * Clean up all test forms (not just tracked) */ async cleanupAllTestForms() { const cleanupConfig = this.config.getCleanupConfig(); if (!cleanupConfig.enabled) { console.log('Test form cleanup is disabled'); return { succeeded: 0, failed: 0, total: 0 }; } // Get all forms const forms = await this.client.listForms(); // Filter test forms const testForms = forms.forms.filter(form => this.config.isTestForm(form.title) ); // Sort by date created (oldest first) testForms.sort((a, b) => new Date(a.date_created) - new Date(b.date_created) ); // Keep latest N forms const formsToDelete = testForms.slice(0, -cleanupConfig.keepLatest); // Delete old test forms let succeeded = 0; let failed = 0; for (const form of formsToDelete) { const deleted = await this.deleteTestForm(form.id); if (deleted) { succeeded++; } else { failed++; } } return { succeeded, failed, total: formsToDelete.length, kept: cleanupConfig.keepLatest }; } /** * Track a form for cleanup */ trackForm(formId) { this.trackedForms.add(formId); } /** * Untrack a form */ untrackForm(formId) { this.trackedForms.delete(formId); } /** * Get tracked forms */ getTrackedForms() { return Array.from(this.trackedForms); } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/GravityKit/gravity-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server