You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			| 
				
					
						 | 
			2 months ago | |
|---|---|---|
| .. | ||
| .gitignore | 2 months ago | |
| README.md | 2 months ago | |
| SETUP.md | 2 months ago | |
| client.ts | 2 months ago | |
| package-lock.json | 2 months ago | |
| package.json | 2 months ago | |
| server.js | 2 months ago | |
| test-demo.js | 2 months ago | |
		
			
				
				README.md
			
		
		
	
	Test API Server
A mock REST API server for testing the Daily Notification Plugin's network functionality, ETag support, and error handling capabilities.
Features
- Content Endpoints: Generate mock notification content for different time slots
 - ETag Support: Full HTTP caching with conditional requests (304 Not Modified)
 - Error Simulation: Test various error scenarios (timeout, server error, rate limiting)
 - Metrics: Monitor API usage and performance
 - CORS Enabled: Cross-origin requests supported for web testing
 
Quick Start
# Install dependencies
npm install
# Start server
npm start
# Development mode with auto-restart
npm run dev
API Endpoints
Health Check
GET /health
Response:
{
  "status": "healthy",
  "timestamp": 1703123456789,
  "version": "1.0.0",
  "endpoints": {
    "content": "/api/content/:slotId",
    "health": "/health",
    "metrics": "/api/metrics",
    "error": "/api/error/:type"
  }
}
Get Notification Content
GET /api/content/:slotId
Parameters:
slotId: Slot identifier in formatslot-HH:MM(e.g.,slot-08:00)
Headers:
If-None-Match: ETag for conditional requests
Response (200 OK):
{
  "id": "abc12345",
  "slotId": "slot-08:00",
  "title": "Daily Update - 08:00",
  "body": "Your personalized content for 08:00. Content ID: abc12345",
  "timestamp": 1703123456789,
  "priority": "high",
  "category": "daily",
  "actions": [
    { "id": "view", "title": "View Details" },
    { "id": "dismiss", "title": "Dismiss" }
  ],
  "metadata": {
    "source": "test-api",
    "version": "1.0.0",
    "generated": "2023-12-21T08:00:00.000Z"
  }
}
Response (304 Not Modified):
When If-None-Match header matches current ETag.
Update Content
PUT /api/content/:slotId
Body:
{
  "content": {
    "title": "Custom Title",
    "body": "Custom body content"
  }
}
Clear All Content
DELETE /api/content
Simulate Errors
GET /api/error/:type
Error Types:
timeout- Simulates request timeout (15 seconds)server-error- Returns 500 Internal Server Errornot-found- Returns 404 Not Foundrate-limit- Returns 429 Rate Limit Exceededunauthorized- Returns 401 Unauthorized
API Metrics
GET /api/metrics
Response:
{
  "timestamp": 1703123456789,
  "contentStore": {
    "size": 5,
    "slots": ["slot-08:00", "slot-12:00", "slot-18:00"]
  },
  "etagStore": {
    "size": 5,
    "etags": [["slot-08:00", "\"abc123\""]]
  },
  "uptime": 3600,
  "memory": {
    "rss": 50331648,
    "heapTotal": 20971520,
    "heapUsed": 15728640,
    "external": 1048576
  }
}
Usage Examples
Basic Content Fetch
curl http://localhost:3001/api/content/slot-08:00
ETag Conditional Request
# First request
curl -v http://localhost:3001/api/content/slot-08:00
# Second request with ETag (should return 304)
curl -v -H "If-None-Match: \"abc123\"" http://localhost:3001/api/content/slot-08:00
Error Testing
# Test timeout
curl http://localhost:3001/api/error/timeout
# Test server error
curl http://localhost:3001/api/error/server-error
# Test rate limiting
curl http://localhost:3001/api/error/rate-limit
Integration with Test Apps
Android Test App
// In your Android test app
const API_BASE_URL = 'http://10.0.2.2:3001'; // Android emulator localhost
const fetchContent = async (slotId: string) => {
  const response = await fetch(`${API_BASE_URL}/api/content/${slotId}`);
  return response.json();
};
iOS Test App
// In your iOS test app
const API_BASE_URL = 'http://localhost:3001'; // iOS simulator localhost
const fetchContent = async (slotId: string) => {
  const response = await fetch(`${API_BASE_URL}/api/content/${slotId}`);
  return response.json();
};
Electron Test App
// In your Electron test app
const API_BASE_URL = 'http://localhost:3001';
const fetchContent = async (slotId: string) => {
  const response = await fetch(`${API_BASE_URL}/api/content/${slotId}`);
  return response.json();
};
Configuration
Environment Variables
PORT: Server port (default: 3001)NODE_ENV: Environment mode (development/production)
CORS Configuration
The server is configured to allow cross-origin requests from any origin for testing purposes.
Testing Scenarios
1. Basic Content Fetching
- Test successful content retrieval
 - Verify content structure and format
 - Check timestamp accuracy
 
2. ETag Caching
- Test conditional requests with 
If-None-Match - Verify 304 Not Modified responses
 - Test cache invalidation
 
3. Error Handling
- Test timeout scenarios
 - Test server error responses
 - Test rate limiting behavior
 - Test network failure simulation
 
4. Performance Testing
- Test concurrent requests
 - Monitor memory usage
 - Test long-running scenarios
 
Development
Running in Development Mode
npm run dev
This uses nodemon for automatic server restart on file changes.
Adding New Endpoints
- Add route handler in 
server.js - Update health check endpoint list
 - Add documentation to this README
 - Add test cases if applicable
 
Testing
npm test
Troubleshooting
Common Issues
- 
Port Already in Use
# Kill process using port 3001 lsof -ti:3001 | xargs kill -9 - 
CORS Issues
- Server is configured to allow all origins
 - Check browser console for CORS errors
 
 - 
Network Connectivity
- Android emulator: Use 
10.0.2.2instead oflocalhost - iOS simulator: Use 
localhostor127.0.0.1 - Physical devices: Use your computer's IP address
 
 - Android emulator: Use 
 
Logs
The server logs all requests with timestamps and response codes for debugging.
License
MIT License - See LICENSE file for details.