forked from jsnbuchanan/crowd-funder-for-time-pwa
feat: Add comprehensive mobile testing infrastructure
- Add test scripts for Android and iOS platforms - Create prerequisite checker for mobile development setup - Add device/simulator availability checks - Update test-all command to include mobile tests - Add granular test commands for web and mobile The changes improve testing by: 1. Adding structured mobile test runners 2. Validating development environment setup 3. Separating web and mobile test flows 4. Adding device availability checks 5. Providing detailed test documentation Added scripts: - check-prerequisites.js: Validates dev environment - test-android.js: Runs Android tests - test-ios.js: Runs iOS tests - run-available-mobile-tests.js: Smart platform detection
This commit is contained in:
132
scripts/run-available-mobile-tests.js
Normal file
132
scripts/run-available-mobile-tests.js
Normal file
@@ -0,0 +1,132 @@
|
||||
/**
|
||||
* @fileoverview Runs mobile tests based on available platforms and devices
|
||||
*
|
||||
* This script intelligently detects available mobile platforms and their
|
||||
* associated devices/simulators, then runs tests only for the available
|
||||
* configurations. This allows for flexible testing across different
|
||||
* development environments without failing when a platform is unavailable.
|
||||
*
|
||||
* Platform detection:
|
||||
* - Android: Checks for SDK and connected devices/emulators
|
||||
* - iOS: Checks for macOS, Xcode, and running simulators
|
||||
*
|
||||
* Features:
|
||||
* - Smart platform detection
|
||||
* - Graceful handling of unavailable platforms
|
||||
* - Clear logging of test execution
|
||||
* - Comprehensive error reporting
|
||||
*
|
||||
* Exit codes:
|
||||
* - 0: Tests completed successfully on available platforms
|
||||
* - 1: Tests failed or no platforms available
|
||||
*
|
||||
* @example
|
||||
* // Run directly
|
||||
* node scripts/run-available-mobile-tests.js
|
||||
*
|
||||
* // Run via npm script
|
||||
* npm run test:mobile:available
|
||||
*
|
||||
* @requires child_process
|
||||
* @requires fs
|
||||
*
|
||||
* @author TimeSafari Team
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
const { execSync } = require('child_process');
|
||||
const { existsSync } = require('fs');
|
||||
|
||||
/**
|
||||
* Executes mobile tests on available platforms
|
||||
*
|
||||
* This function performs the following steps:
|
||||
* 1. Checks Android environment and device availability
|
||||
* 2. Checks iOS environment and simulator availability (on macOS)
|
||||
* 3. Runs tests on available platforms
|
||||
* 4. Reports results and handles errors
|
||||
*
|
||||
* Platform-specific checks:
|
||||
* Android:
|
||||
* - ANDROID_HOME environment variable
|
||||
* - Android platform files existence
|
||||
* - Connected devices via ADB
|
||||
*
|
||||
* iOS:
|
||||
* - macOS operating system
|
||||
* - iOS platform files existence
|
||||
* - Running simulators via xcrun
|
||||
*
|
||||
* @async
|
||||
* @throws {Error} If tests fail or no platforms are available
|
||||
*
|
||||
* @example
|
||||
* runAvailableMobileTests().catch(error => {
|
||||
* console.error('Test execution failed:', error);
|
||||
* process.exit(1);
|
||||
* });
|
||||
*/
|
||||
async function runAvailableMobileTests() {
|
||||
try {
|
||||
// Check Android availability
|
||||
// Requires both SDK (ANDROID_HOME) and platform files
|
||||
const androidAvailable = existsSync('android') && process.env.ANDROID_HOME;
|
||||
let androidDeviceAvailable = false;
|
||||
|
||||
if (androidAvailable) {
|
||||
try {
|
||||
// Check for connected devices using ADB
|
||||
const devices = execSync('adb devices').toString();
|
||||
// Parse ADB output for actually connected devices
|
||||
// Filters out unauthorized or offline devices
|
||||
androidDeviceAvailable = devices.split('\n').slice(1).some(line => line.includes('device'));
|
||||
} catch (e) {
|
||||
console.log('⚠️ Android SDK available but no devices connected');
|
||||
}
|
||||
}
|
||||
|
||||
// Check iOS availability
|
||||
// Only possible on macOS with Xcode installed
|
||||
const iosAvailable = process.platform === 'darwin' && existsSync('ios');
|
||||
let iosSimulatorAvailable = false;
|
||||
|
||||
if (iosAvailable) {
|
||||
try {
|
||||
// Check for running simulators using xcrun
|
||||
const simulators = execSync('xcrun simctl list devices available').toString();
|
||||
// Look for 'Booted' state in simulator list
|
||||
iosSimulatorAvailable = simulators.includes('Booted');
|
||||
} catch (e) {
|
||||
console.log('⚠️ iOS platform available but no simulator running');
|
||||
}
|
||||
}
|
||||
|
||||
// Execute tests for available platforms
|
||||
if (androidDeviceAvailable) {
|
||||
console.log('🤖 Running Android tests...');
|
||||
// Run Android tests via npm script
|
||||
execSync('npm run test:android', { stdio: 'inherit' });
|
||||
}
|
||||
|
||||
if (iosSimulatorAvailable) {
|
||||
console.log('🍎 Running iOS tests...');
|
||||
// Run iOS tests via npm script
|
||||
execSync('npm run test:ios', { stdio: 'inherit' });
|
||||
}
|
||||
|
||||
// Error if no platforms are available for testing
|
||||
if (!androidDeviceAvailable && !iosSimulatorAvailable) {
|
||||
console.error('❌ No mobile platforms available for testing');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log('✅ Available mobile tests completed successfully');
|
||||
} catch (error) {
|
||||
// Handle any errors during test execution
|
||||
console.error('❌ Mobile tests failed:', error);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Execute the test runner
|
||||
runAvailableMobileTests();
|
||||
Reference in New Issue
Block a user