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
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							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(); 
 |