UNPKG

cordova-plugin-otp-retriever

Version:

Cordova plugin for automatic OTP reading using Android SMS User Consent API

404 lines (306 loc) 10.6 kB
# Testing Guide for Cordova OTP Reader Plugin This guide provides comprehensive instructions for testing the OTP Reader plugin in your Meteor mobile app. ## Pre-requisites 1. **Android Device or Emulator** with Google Play Services 2. **Physical Device Recommended** (SMS functionality works better on real devices) 3. **Active SIM Card** (for receiving actual SMS messages) 4. **Meteor Development Environment** set up ## Setup for Testing ### 1. Create Test Meteor App ```bash # Create new Meteor app meteor create otp-test-app cd otp-test-app # Add mobile platform meteor add-platform android # Install the plugin meteor add cordova:cordova-plugin-otp-retriever@file://path/to/cordova-plugin-otp-retriever ``` ### 2. Configure mobile-config.js ```javascript // mobile-config.js App.info({ id: 'com.test.otpreader', name: 'OTP Test App' }); App.addCordovaPlugin('cordova-plugin-otp-retriever'); ``` ### 3. Add Test Templates Copy the example files from the `examples/` directory into your Meteor app: ```bash # Copy example files to your Meteor app cp examples/otp-templates.html client/ cp examples/otp-client.js client/ cp examples/otp-server.js server/ cp examples/otp-styles.css client/ ``` ## Test Cases ### Test Case 1: Basic OTP Detection **Objective**: Verify that the plugin can detect and extract OTP from SMS messages. **Steps**: 1. Build and run the app on device: `meteor run android-device` 2. Navigate to OTP verification screen 3. Tap "Auto-fill from SMS" button 4. Grant SMS permissions when prompted 5. Send a test SMS to the device: "Your verification code is 123456" 6. Verify that the OTP "123456" is automatically filled **Expected Result**: OTP should be extracted and filled automatically. ### Test Case 2: Different OTP Formats **Objective**: Test various SMS formats to ensure robust OTP extraction. **Test SMS Messages**: ``` "Your OTP is 654321" "OTP: 789012" "Code 345678 expires in 10 minutes" "Use 901234 to verify your account" "Verification code: 567890" "234567 is your login code" ``` **Expected Result**: All OTPs should be correctly extracted. ### Test Case 3: Sender Filtering **Objective**: Test sender-specific OTP reading. **Steps**: 1. Modify code to specify sender: `startListening('+1234567890', callback, errorCallback)` 2. Send SMS from the specified number 3. Send SMS from a different number 4. Verify only SMS from specified sender triggers the callback **Expected Result**: Only SMS from specified sender should be processed. ### Test Case 4: User Consent Flow **Objective**: Verify the user consent dialog appears and works correctly. **Steps**: 1. Start listening for OTP 2. Send test SMS 3. Verify consent dialog appears 4. Test both "Allow" and "Deny" options 5. Check appropriate callbacks are triggered **Expected Result**: - "Allow": OTP should be extracted - "Deny": Error callback should be triggered with `userCancelled: true` ### Test Case 5: Timeout Handling **Objective**: Test timeout behavior when no SMS is received. **Steps**: 1. Start listening for OTP 2. Wait for 5+ minutes without sending SMS 3. Verify timeout callback is triggered **Expected Result**: Timeout callback should be triggered after 5 minutes. ### Test Case 6: Phone Number Access **Objective**: Test device phone number access functionality. **Steps**: 1. Call `getPhoneNumber()` method 2. Check if phone number is returned 3. Verify proper error handling if not available **Expected Result**: Device phone number should be returned if available and permitted. ### Test Case 7: Multiple OTP Sessions **Objective**: Test handling of multiple OTP requests. **Steps**: 1. Start listening for OTP 2. Start another OTP session 3. Verify proper error handling 4. Stop first session and start new one 5. Verify new session works correctly **Expected Result**: Should handle multiple sessions gracefully. ### Test Case 8: App Lifecycle **Objective**: Test plugin behavior during app lifecycle events. **Steps**: 1. Start OTP listening 2. Put app in background 3. Send SMS while app is in background 4. Bring app to foreground 5. Verify OTP is still detected **Expected Result**: OTP should be detected even when app is backgrounded. ## Manual Testing Script Create this test helper in your Meteor app: ```javascript // client/test-helper.js if (Meteor.isDevelopment) { window.testOTPReader = { // Test basic OTP reading testBasicOTP: function() { console.log('Starting basic OTP test...'); cordova.plugins.OTPReader.startListening( null, function(result) { console.log('✅ OTP Result:', result); if (result.success) { const otp = cordova.plugins.OTPReader.extractOTP(result.message, 6); console.log('✅ Extracted OTP:', otp); } }, function(error) { console.error('❌ OTP Error:', error); } ); }, // Test phone number access testPhoneNumber: function() { console.log('Testing phone number access...'); cordova.plugins.OTPReader.getPhoneNumber( function(phoneNumber) { console.log('✅ Device phone number:', phoneNumber); }, function(error) { console.error('❌ Phone number error:', error); } ); }, // Test OTP extraction patterns testOTPExtraction: function() { const testMessages = [ "Your verification code is 123456", "OTP: 654321", "Code 789012 expires soon", "Use 345678 to verify", "234567 is your code" ]; testMessages.forEach(message => { const otp = cordova.plugins.OTPReader.extractOTP(message, 6); console.log(`Message: "${message}" -> OTP: ${otp}`); }); }, // Stop listening stopListening: function() { cordova.plugins.OTPReader.stopListening( function() { console.log('✅ Stopped listening'); }, function(error) { console.error('❌ Stop error:', error); } ); } }; // Make it available globally console.log('OTP Reader test functions available:'); console.log('- testOTPReader.testBasicOTP()'); console.log('- testOTPReader.testPhoneNumber()'); console.log('- testOTPReader.testOTPExtraction()'); console.log('- testOTPReader.stopListening()'); } ``` ## Testing with Real SMS Services ### Using Twilio for Testing ```javascript // Send test SMS using Twilio (server-side) const twilio = require('twilio')(accountSid, authToken); // Test different OTP formats const testMessages = [ "Your verification code is 123456", "OTP: 654321", "Code 789012 expires in 5 minutes" ]; testMessages.forEach((message, index) => { setTimeout(() => { twilio.messages.create({ body: message, from: '+1234567890', to: '+your-test-number' }); }, index * 10000); // 10 second intervals }); ``` ## Debugging Issues ### Common Issues and Solutions 1. **Plugin not found** - Verify plugin is properly installed - Check `cordova plugin list` - Rebuild app completely 2. **SMS not detected** - Check device has Google Play Services - Verify SMS contains 4-10 alphanumeric characters with at least one number - Check sender number if filtering is enabled 3. **Consent dialog not appearing** - Ensure SMS User Consent was started before SMS arrival - Check for timeout (5 minutes max) - Verify device has internet connection 4. **OTP extraction failing** - Test with different OTP patterns - Check OTP length parameter - Verify SMS message format ### Debug Logging Enable debug logging in your app: ```javascript // Add to client code if (Meteor.isDevelopment) { // Log all cordova events document.addEventListener('deviceready', function() { console.log('Device ready - OTP Reader available:', !!cordova.plugins.OTPReader); }); } ``` ## Performance Testing ### Memory Usage Test ```javascript // Monitor memory usage during OTP operations function testMemoryUsage() { const startMemory = performance.memory?.usedJSHeapSize || 0; // Start OTP listening cordova.plugins.OTPReader.startListening(null, function(result) { const endMemory = performance.memory?.usedJSHeapSize || 0; console.log('Memory used:', (endMemory - startMemory) / 1024, 'KB'); }, function(error) { console.error('Memory test error:', error); } ); } ``` ### Battery Usage Test Monitor battery usage during extended OTP listening sessions to ensure the plugin doesn't drain battery excessively. ## Automated Testing For CI/CD integration, create automated tests: ```javascript // test/otp-reader.test.js describe('OTP Reader Plugin', function() { it('should be available after device ready', function(done) { document.addEventListener('deviceready', function() { expect(cordova.plugins.OTPReader).toBeDefined(); done(); }); }); it('should extract OTP from various message formats', function() { const testCases = [ { message: "Your code is 123456", expected: "123456" }, { message: "OTP: 654321", expected: "654321" }, { message: "Code 789012 expires soon", expected: "789012" } ]; testCases.forEach(testCase => { const result = cordova.plugins.OTPReader.extractOTP(testCase.message, 6); expect(result).toBe(testCase.expected); }); }); }); ``` ## Security Testing 1. **Test with malicious SMS**: Verify plugin doesn't crash with malformed SMS 2. **Test permission handling**: Ensure proper permission requests 3. **Test data validation**: Verify extracted OTP is properly validated ## Production Testing Checklist Before releasing to production: - [ ] Test on multiple Android devices - [ ] Test with different Android versions (API 21+) - [ ] Test with various OTP formats - [ ] Test sender filtering functionality - [ ] Test user consent flow - [ ] Test timeout handling - [ ] Test app lifecycle events - [ ] Test memory usage - [ ] Test battery usage - [ ] Verify proper error handling - [ ] Test with real SMS providers - [ ] Verify privacy compliance ## Troubleshooting Commands ```bash # Check Cordova version cordova --version # List installed plugins cordova plugin list # Check Android platform version cordova platform list # Clean and rebuild meteor reset meteor run android-device # Check device logs adb logcat | grep -i otp ``` This comprehensive testing guide should help you thoroughly validate the OTP Reader plugin functionality in your Meteor app.