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.
5.8 KiB
5.8 KiB
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.2
instead oflocalhost
- iOS simulator: Use
localhost
or127.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.