Skip to main content

Testing & Credentials

Comprehensive guide for testing FlowCampaign functionality, managing credentials securely, and ensuring email deliverability.

Testing Environments​

Development Environment​

  • URL: http://localhost:5173 (Frontend), http://localhost:8787 (Backend)
  • Database: SQLite (local / Drizzle)
  • Email Provider: Mock SMTP / Sandbox (no actual emails sent)
  • Features: Full functionality with local data
  • Purpose: Local development and testing

Staging Environment​

  • URL: https://staging.mails.nssoftwaresolutions.in
  • Database: SQLite / Cloudflare D1 / Turso
  • Email Provider: Sandbox mode (emails logged but not sent)
  • Features: Production-like configuration
  • Purpose: Pre-production testing and QA

Production Environment​

  • URL: https://mails.nssoftwaresolutions.in
  • Database: Cloudflare D1 / Turso
  • Email Provider: ZeptoMail + SMTP (actual email delivery)
  • Features: Full production deployment
  • Purpose: Live application for end users

Test Credentials​

Default Admin Account​

EnvironmentEmailPasswordRole
Developmentadmin@flowcampaign.comadmin123Admin
Stagingadmin@flowcampaign.comStagingAdmin2024!Admin
ProductionCustom setup requiredCustom passwordAdmin

Test User Accounts​

EmailPasswordPurpose
marketing@test.comMarketingTest123!Marketing team testing
developer@test.comDeveloperTest456!Developer API testing
analyst@test.comAnalystTest789!Analytics dashboard testing

Testing Workflows​

1. Email Provider Testing​

Mock SMTP (Development)​

# Start mock SMTP server
npm run test:smtp

# View captured emails
# Visit http://localhost:1080

ZeptoMail Sandbox​

  1. Use test API key: sandbox_apikey_1234567890
  2. All emails are logged but not delivered
  3. Check logs at: logs/zeptomail-sandbox.log

SMTP Sandbox​

2. Campaign Testing​

Test Campaign Creation​

// Create test campaign
const testCampaign = {
name: "Test Campaign - " + Date.now(),
subject: "Test Email Subject",
content: "<h1>Test Email</h1><p>This is a test.</p>",
audience: {
type: "test",
test_emails: ["test@example.com"]
},
settings: {
send_test: true,
skip_actual_send: true
}
};

A/B Testing Setup​

{
"test_type": "subject_line",
"variations": [
{"subject": "Welcome to our platform!"},
{"subject": "Get started with our amazing service"}
],
"test_size": 100,
"winner_criteria": "highest_open_rate",
"test_duration_hours": 24
}

3. API Testing​

Test API Key​

# Environment variable
export FLOWCAMPAIGN_API_KEY="test_key_development_123"

# Test endpoint
curl -X GET http://localhost:3000/api/v1/health \
-H "Authorization: Bearer test_key_development_123"

Postman Collection​

Import the Postman collection from:

  • File: docs/postman/FlowCampaign.postman_collection.json
  • Environment: docs/postman/FlowCampaign-Dev.postman_environment.json

Automated Tests​

# Run unit tests
npm test

# Run integration tests
npm run test:integration

# Run E2E tests
npm run test:e2e

Credential Management​

Secure Storage​

Environment Variables​

# .env file (development)
ZEPTOMAIL_API_KEY=dev_key_1234567890
SMTP_PASSWORD=dev_smtp_password

# Production (encrypted)
ZEPTOMAIL_API_KEY=encrypted:jwe_encrypted_string_here

Cloudflare Secrets (Production)​

# Store secrets
wrangler secret put ZEPTOMAIL_API_KEY
wrangler secret put JWT_SECRET

# List secrets
wrangler secret list

Credential Rotation​

Automated Rotation Schedule​

Credential TypeRotation FrequencyAutomation
API Keys90 daysManual
JWT Secrets180 daysAutomated
Database Credentials365 daysManual
SMTP PasswordsWhen compromisedManual

Rotation Procedure​

  1. Prepare New Credentials:

    # Generate new API key
    openssl rand -base64 32

    # Update environment
    export NEW_API_KEY=$(openssl rand -base64 32)
  2. Update Configuration:

    # Update .env file
    sed -i '' "s/old_key_here/$NEW_API_KEY/" .env.production

    # Update Cloudflare secrets
    echo $NEW_API_KEY | wrangler secret put ZEPTOMAIL_API_KEY
  3. Verify Functionality:

    # Test with new credentials
    npm run test:credentials

    # Monitor for errors
    tail -f logs/application.log | grep -i "authentication"
  4. Revoke Old Credentials:

    # Revoke old API key
    curl -X DELETE https://zeptomail.com/api/v1/keys/old_key_id

Access Control​

API Key Scopes​

{
"key_id": "key_123456",
"name": "Marketing API Key",
"scopes": [
"campaigns:read",
"campaigns:write",
"contacts:read",
"email:send"
],
"restrictions": {
"rate_limit": "1000/hour",
"ip_whitelist": ["192.168.1.0/24"],
"expires_at": "2024-12-31T23:59:59Z"
}
}

User Role Permissions​

RoleCampaignsContactsTemplatesAnalyticsSettings
AdminCRUDCRUDCRUDRCRUD
ManagerCRUCRUCRURR
MarketerCRUCRUCRUR-
AnalystRR-R-
Developer----API only

Email Deliverability Testing​

Spam Testing​

Spam Score Analysis​

# Test email with spam analyzer
npm run test:spam -- --email test_email.html

# Expected score: < 5.0 (lower is better)

Common Spam Triggers to Avoid​

  1. Subject Line Issues:

    • Excessive punctuation (!!!)
    • ALL CAPS words
    • Spam trigger words: "Free", "Guaranteed", "Winner"
  2. Content Issues:

    • Too many images, too little text
    • Hidden text (white on white)
    • Suspicious links
  3. Technical Issues:

    • Missing unsubscribe link
    • No physical mailing address
    • Invalid DKIM/SPF signatures

Authentication Testing​

DKIM Verification​

# Check DKIM record
dig -t txt default._domainkey.yourdomain.com

# Expected format:
"v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC..."

SPF Verification​

# Check SPF record
dig -t txt yourdomain.com | grep spf

# Expected format:
"v=spf1 include:_spf.google.com include:_spf.zeptomail.com ~all"

DMARC Verification​

# Check DMARC record
dig -t txt _dmarc.yourdomain.com

# Expected format:
"v=DMARC1; p=quarantine; rua=mailto:dmarc@yourdomain.com"

Inbox Placement Testing​

Test with Multiple Providers​

{
"test_recipients": {
"gmail": "test@gmail.com",
"outlook": "test@outlook.com",
"yahoo": "test@yahoo.com",
"corporate": "test@company.com"
},
"monitor_for": 24,
"check_folders": ["inbox", "spam", "promotions"]
}

Warm-up Process for New IPs​

{
"day_1": {"volume": 50, "segments": ["engaged_users"]},
"day_2": {"volume": 100, "segments": ["engaged_users", "active_users"]},
"day_3": {"volume": 200, "segments": ["all_users"]},
"day_4_7": {"volume": 500, "segments": ["all_users"]},
"week_2": {"volume": 1000, "segments": ["all_users"]}
}

Load Testing​

Campaign Send Testing​

Small Scale Test​

# Send 100 test emails
npm run test:load -- --emails 100 --batch-size 10

# Monitor performance
# - API response times
# - Database query times
# - Email provider response times

Medium Scale Test​

# Send 10,000 test emails
npm run test:load -- --emails 10000 --batch-size 100 --parallel 5

# Monitor:
# - Memory usage
# - CPU utilization
# - Network bandwidth
# - Queue processing rate

Performance Benchmarks​

MetricTargetWarningCritical
API Response< 100ms100-500ms> 500ms
Email Send< 500ms500-2000ms> 2000ms
Queue Processing1000/hr500-1000/hr< 500/hr
Database Query< 50ms50-200ms> 200ms

Concurrent User Testing​

Simulated Users​

// Load test configuration
const loadTestConfig = {
users: 50,
duration: '5m',
scenarios: [
{
name: 'Campaign Creation',
weight: 30,
flow: ['login', 'create_campaign', 'preview', 'save']
},
{
name: 'Analytics View',
weight: 40,
flow: ['login', 'view_dashboard', 'filter_data', 'export']
},
{
name: 'Contact Management',
weight: 30,
flow: ['login', 'import_contacts', 'segment', 'tag']
}
]
};

Security Testing​

Authentication Testing​

Password Policy Testing​

# Test weak passwords
curl -X POST http://localhost:3000/api/v1/auth/register \
-d '{"password": "password123"}'
# Expected: Validation error

# Test strong passwords
curl -X POST http://localhost:3000/api/v1/auth/register \
-d '{"password": "Str0ngP@ssw0rd2024!"}'
# Expected: Success

Brute Force Protection​

# Test rate limiting
for i in {1..101}; do
curl -X POST http://localhost:3000/api/v1/auth/login \
-d '{"email": "test@test.com", "password": "wrong"}'
done
# Expected: Rate limited after 100 attempts

Authorization Testing​

Role-based Access Control​

// Test admin-only endpoint with user role
const userToken = getUserToken('user');
const adminToken = getUserToken('admin');

// Attempt to delete campaign as user
await fetch('/api/v1/campaigns/123', {
method: 'DELETE',
headers: { Authorization: `Bearer ${userToken}` }
});
// Expected: 403 Forbidden

// Same request as admin
await fetch('/api/v1/campaigns/123', {
method: 'DELETE',
headers: { Authorization: `Bearer ${adminToken}` }
});
// Expected: 200 OK

Data Validation Testing​

Input Validation​

// Test SQL injection
const maliciousInput = {
email: "test@example.com'; DROP TABLE users; --",
name: "<script>alert('xss')</script>"
};

// Test XSS
const xssPayload = {
content: "<img src=x onerror=alert(1)>"
};

// Test file upload
const maliciousFile = {
filename: "../../../etc/passwd",
content: "malicious content"
};

Compliance Testing​

GDPR Compliance Testing​

Data Export​

# Test data export
curl -X GET http://localhost:3000/api/v1/gdpr/export \
-H "Authorization: Bearer user_token"
# Expected: JSON file with all user data

Data Deletion​

# Test right to erasure
curl -X DELETE http://localhost:3000/api/v1/gdpr/delete \
-H "Authorization: Bearer user_token"
# Expected: All user data deleted
// Test consent tracking
await updateConsent(userId, {
marketing: true,
analytics: false,
necessary: true
});

// Verify consent is respected
const campaigns = await getCampaignsForUser(userId);
// Should only include campaigns user consented to

CAN-SPAM Compliance​

Required Elements Testing​

<!-- Test email for compliance -->
<html>
<body>
<!-- Physical address -->
<div>123 Main St, City, State ZIP</div>

<!-- Unsubscribe link -->
<a href="{{unsubscribe_url}}">Unsubscribe</a>

<!-- Subject line accuracy -->
<!-- Subject must match content -->
</body>
</html>

Monitoring & Alerting​

Test Monitoring Setup​

Health Checks​

# Configure health check endpoints
# File: src/health/checks.js
module.exports = [
{
name: 'database',
check: async () => await db.raw('SELECT 1'),
timeout: 5000
},
{
name: 'email_provider',
check: async () => await emailProvider.test(),
timeout: 10000
},
{
name: 'storage',
check: async () => checkDiskSpace('/uploads'),
threshold: 1073741824 // 1GB
}
];

Alert Configuration​

{
"alerts": {
"high_bounce_rate": {
"condition": "bounce_rate > 5%",
"notification": ["email", "slack"],
"recipients": ["admin@domain.com", "#alerts"]
},
"low_delivery_rate": {
"condition": "delivery_rate < 95%",
"notification": ["sms", "pagerduty"],
"severity": "critical"
},
"api_errors": {
"condition": "error_rate > 1% for 5 minutes",
"notification": ["slack"],
"severity": "warning"
}
}
}

Test Data Management​

Sample Data Generation​

Campaign Test Data​

// Generate test campaigns
const testCampaigns = generateTestData({
count: 100,
types: ['newsletter', 'promotion', 'transactional'],
dateRange: {
start: '2024-01-01',
end: '2024-12-31'
},
statuses: ['draft', 'scheduled', 'sent', 'cancelled']
});

Contact Test Data​

// Generate realistic test contacts
const testContacts = generateContacts({
count: 10000,
domains: ['gmail.com', 'yahoo.com', 'company.com'],
geographicDistribution: {
'US': 60,
'UK': 15,
'IN': 10,
'Other': 15
},
engagementLevels: {
'high': 20,
'medium': 50,
'low': 25,
'inactive': 5
}
});

Test Data Cleanup​

Automated Cleanup​

# Development cleanup script
npm run test:cleanup

# Options
npm run test:cleanup -- --age 7d # Clean data older than 7 days
npm run test:cleanup -- --type logs # Clean logs only
npm run test:cleanup -- --all # Clean all test data

Manual Cleanup Commands​

# Delete test campaigns
DELETE FROM campaigns WHERE name LIKE 'Test Campaign%';

# Delete test contacts
DELETE FROM contacts WHERE email LIKE '%@test.com';

# Reset sequences
UPDATE sqlite_sequence SET seq = 0 WHERE name IN ('campaigns', 'contacts');

Testing Checklist​

Pre-Deployment Checklist​

  • All unit tests pass
  • Integration tests pass
  • E2E tests pass
  • Load tests within limits
  • Security tests pass
  • GDPR compliance verified
  • Email deliverability tested
  • Backup/restore tested
  • Monitoring configured
  • Alerting tested

Post-Deployment Checklist​

  • Health checks passing
  • Real emails delivering
  • Analytics tracking
  • Error rate < 1%
  • Performance benchmarks met
  • User feedback collected
  • Security scans clean
  • Compliance verified

Testing Tools: Use our testing scripts for automated testing.

Thorough testing ensures FlowCampaign delivers reliable, secure, and high-performance email campaign management.