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.
 
 
 
 

132 lines
4.4 KiB

/**
* @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();