diff --git a/modules/sms_valid/sms_valid.info b/modules/sms_valid/sms_valid.info index f48e18a..dc568ea 100644 --- a/modules/sms_valid/sms_valid.info +++ b/modules/sms_valid/sms_valid.info @@ -8,4 +8,5 @@ dependencies[] = sms files[] = sms_valid.admin.inc files[] = sms_valid.install files[] = sms_valid.module +files[] = sms_valid.test diff --git a/modules/sms_valid/sms_valid.module b/modules/sms_valid/sms_valid.module index cb69561..99ad63e 100644 --- a/modules/sms_valid/sms_valid.module +++ b/modules/sms_valid/sms_valid.module @@ -176,19 +176,20 @@ function sms_valid_get_ruleset_for_number($number) { } $best_ruleset = NULL; - $last_prefix = NULL; - $query = db_select('sms_valid_rules', 'u') - ->fields('u', array('prefix', 'name', 'rules', 'dirs_enabled', 'iso2')) - ->condition('prefix', $potential_prefixes, 'IN'); - $result = $query->execute(); - while ($row = $result->fetchAssoc()) { - if ($row['prefix'] > $last_prefix) { - $best_ruleset = $row; - $best_ruleset['rules'] = unserialize($best_ruleset['rules']); - $last_prefix = $row['prefix']; + if ($potential_prefixes) { + $last_prefix = NULL; + $query = db_select('sms_valid_rules', 'u') + ->fields('u', array('prefix', 'name', 'rules', 'dirs_enabled', 'iso2')) + ->condition('prefix', $potential_prefixes, 'IN'); + $result = $query->execute(); + while ($row = $result->fetchAssoc()) { + if ($row['prefix'] > $last_prefix) { + $best_ruleset = $row; + $best_ruleset['rules'] = unserialize($best_ruleset['rules']); + $last_prefix = $row['prefix']; + } } } - return $best_ruleset; } @@ -468,7 +469,7 @@ function sms_valid_is_local_number($number) { * - log: Array of log messages. The last record is the most significant. * - errors: Array of error messages. The last record is the most significant. */ -function sms_valid_validate(&$number, &$options = array()) { +function sms_valid_validate($number, $options = array()) { $result = array( 'pass' => NULL, 'log' => array(), @@ -501,7 +502,7 @@ function sms_valid_validate(&$number, &$options = array()) { return $result; } - // Remove all whitespace + // Remove all non-numeric characters. $number = preg_replace('/[^\d]/', '', $number); // Check if we should use a specific ruleset. diff --git a/modules/sms_valid/sms_valid.test b/modules/sms_valid/sms_valid.test new file mode 100644 index 0000000..472967b --- /dev/null +++ b/modules/sms_valid/sms_valid.test @@ -0,0 +1,215 @@ + 'SMS Valid Web Test', + 'description' => 'Tests for the SMS Valid module.', + 'group' => 'SMS Framework', + ); + } + + public function setUp() { + parent::setUp('sms', 'sms_valid'); + $this->adminUser = $this->drupalCreateUser(array('administer smsframework')); + } + + public function testSmsValidValidate() { + // Test that the default rulesets are added already. + $this->drupalLogin($this->adminUser); + $this->drupalGet('admin/smsframework/validation/rulesets'); + $this->assertText('New Zealand', 'Test ruleset found in list view.'); + + // Create a basic ruleset. + sms_valid_save_ruleset($this->getTestRuleset()); + + $test_numbers = array( + '1234567890' => false, + '123458767890' => false, + '64219427-9238' => true, + '6425=-,x2-4n292' => false, + '6429;ajklf a/s,MFA' => true, + '] W[OPQIRW' => false, + '6429996789065' => true, + '6428156789098765' => true, + ); + + // Test direct validation. + $options = array('test' => true); + foreach ($test_numbers as $number => $valid) { + $result = sms_valid_validate($number, $options); + $this->assertEqual($valid, empty($result['errors']), 'Direct test: Number validation ok for ' . $number); + } + + // Test through hook_sms_validate_number(). + foreach ($test_numbers as $number => $valid) { + $errors = sms_validate_number($number, $options); + $this->assertEqual($valid, empty($errors), 'Hook test: Number validation ok for ' . $number); + } + } + + public function testCrudSmsValidRulesets() { + $this->drupalLogin($this->adminUser); + + // Create a new ruleset. + $edit = array( + 'prefix' => rand(1, 999), + 'name' => $this->randomName(15), + 'iso2' => 'XX', + 'out' => true, + 'in' => true, + 'rules' => "80+\n90-\n70\n65+\n", + ); + $this->drupalPost('admin/smsframework/validation/ruleset', $edit, t('Save Ruleset')); + + // Confirm that ruleset was correctly saved. + $ruleset = sms_valid_get_ruleset($edit['prefix']); + $original = array( + 'rules' => sms_valid_text_to_rules($edit['rules']), + 'dirs_enabled' => sms_dir($edit['out'], $edit['in']), + ) + $edit; + unset($original['in'], $original['out']); + $this->assertEqual($original, $ruleset, 'Ruleset ' . $edit['prefix'] . ' correctly saved.'); + + // Update ruleset. + $edit['in'] = false; + $edit['out'] = false; + $this->drupalPost('admin/smsframework/validation/ruleset/' . $edit['prefix'], $edit, t('Save Ruleset')); + $ruleset = sms_valid_get_ruleset($edit['prefix']); + $this->assertEqual('0', $ruleset['dirs_enabled'], 'Ruleset ' . $edit['prefix'] . ' updated'); + + // Add another test ruleset and then check the ruleset load button. + $edit1 = array( + 'prefix' => rand(1, 999), + 'name' => $this->randomName(15) + ) + $edit; + $this->drupalPost('admin/smsframework/validation/ruleset', $edit1, t('Save Ruleset')); + $this->drupalPost('admin/smsframework/validation/ruleset', array('select_prefix' => $edit1['prefix']), t('Refresh Editor (below)')); + $this->assertText($edit1['name'], 'Editor refresh button works.'); + + // Delete ruleset. + $delete = array( + $edit['prefix'] . '_delete' => true, + + ); + $this->drupalPost('admin/smsframework/validation/rulesets', $delete, t('Save Changes')); + $this->assertFalse(sms_valid_get_ruleset($edit['prefix']), 'Ruleset ' . $edit['prefix'] . ' deleted'); + + } + + public function testSmsValidSettingsForm() { + $edit = array( + 'mode' => 1, + 'global_ruleset' => '64', + 'local_number_prefix' => '0', + 'local_number_ruleset' => '64', + 'last_resort_enabled' => true, + 'last_resort_ruleset' => '64', + ); + + // Update settings. + $this->drupalLogin($this->adminUser); + $this->drupalPost('admin/smsframework/validation', $edit, t('Save settings')); + + // Test local number validation. + $this->assertTrue(sms_valid_is_local_number('08032149857'), 'Local number check passes.'); + $this->assertFalse(sms_valid_is_local_number('8032149857'), 'Local number check passes.'); + } + + public function testSmsValidFunctions() { + // Clear all rulesets. + $count = count(sms_valid_get_all_rulesets()); + + $prefix1 = rand(1, 999); + $rulesets[$prefix1] = array( + 'prefix' => $prefix1, + 'name' => $this->randomName(), + 'dirs_enabled' => rand(0, 4), + 'iso2' => 'XX', + 'rules' => sms_valid_text_to_rules("80- # Test 1\n90+ # Test 2"), + ); + sms_valid_save_ruleset($rulesets[$prefix1]); + + $prefix2 = rand(1, 999); + $rulesets[$prefix2] = array( + 'prefix' => $prefix2, + 'name' => $this->randomName(), + 'dirs_enabled' => rand(0, 4), + 'iso2' => 'XX', + 'rules' => sms_valid_text_to_rules("81- # Test 1\n91+ # Test 2"), + ); + sms_valid_save_ruleset($rulesets[$prefix2]); + + $new_rulesets = sms_valid_get_all_rulesets(); + $this->assertEqual(2, count($new_rulesets) - $count, 'All new rulesets found.'); + $this->assertEqual($rulesets[$prefix2], (array) $new_rulesets[$prefix2], 'sms_valid_get_all_rulesets() functional.'); + $this->assertEqual(sms_valid_get_ruleset($prefix1), $rulesets[$prefix1], 'sms_valid_get_ruleset() functional.'); + + $rules = sms_valid_rules_to_text($rulesets[$prefix2]['rules']); + $this->assertEqual($rules, "81- # Test 1\n91+ # Test 2", 'Rules converted to text.'); + $rules = sms_valid_text_to_rules($rules); + $this->assertEqual($rules, $rulesets[$prefix2]['rules'], 'Rules converted from text.'); + + $this->assertEqual($rulesets[$prefix2], sms_valid_get_ruleset_for_number($prefix2 . '98765432'), 'Found right ruleset for ' . $prefix2 . '98765432'); + // @todo This test may fail at random times. + $this->assertFalse(sms_valid_get_ruleset_for_number('876298765432'), 'No ruleset for 876298765432'); + + $this->assertEqual(array("$prefix1", "$prefix2"), sms_valid_get_prefixes_for_iso2('XX'), 'sms_valid_get_prefixes_for_iso2() functional.'); + + // Set status. + sms_valid_ruleset_set_status($prefix1, SMS_DIR_ALL); + $ruleset = sms_valid_get_ruleset($prefix1); + $this->assertEqual(SMS_DIR_ALL, $ruleset['dirs_enabled'], 'sms_valid_ruleset_set_status() functional.'); + } + + protected function getTestRuleset() { + return array( + 'prefix' => 64, + 'name' => 'New Zealand', + 'dirs_enabled' => 4, + 'iso2' => 'NZ', + 'rules' => array( + '21' => array( + 'allow' => true, + 'comment' => 'Vodafone', + ), + '22' => array( + 'allow' => true, + 'comment' => 'Two Degrees Mobile', + ), + '25' => array( + 'allow' => false, + 'comment' => 'Telecom AMPS+TDMA (old)', + ), + '26' => array( + 'allow' => false, + 'comment' => 'Telecom pager network', + ), + '27' => array( + 'allow' => true, + 'comment' => 'Telecom CDMA', + ), + '28' => array( + 'allow' => true, + 'comment' => 'Slingshot', + ), + '29' => array( + 'allow' => true, + 'comment' => 'TelstraClear', + ), + ), + ); + } + +} \ No newline at end of file diff --git a/tests/sms.module.test b/tests/sms.module.test index db990ff..3422f17 100644 --- a/tests/sms.module.test +++ b/tests/sms.module.test @@ -94,7 +94,7 @@ class SmsFrameworkWebTest extends DrupalWebTestCase { ';ajklf a/s,MFA' => false, '] W[OPQIRW' => false, '9996789065' => true, - '123456789098765' => true, + '1234567890987654' => true, ); // Test validation with default gateway (log). @@ -108,7 +108,7 @@ class SmsFrameworkWebTest extends DrupalWebTestCase { '389427-9238' => false, '=-,x2-4n292' => false, '9996789065' => false, - '123456789098765' => false, + '1234567890987654' => false, ) + $test_numbers; // Test validation with test gateway that has custom validation. diff --git a/tests/sms_test_gateway/sms_test_gateway.module b/tests/sms_test_gateway/sms_test_gateway.module index 0eb16bb..e871726 100644 --- a/tests/sms_test_gateway/sms_test_gateway.module +++ b/tests/sms_test_gateway/sms_test_gateway.module @@ -156,8 +156,8 @@ function sms_test_gateway_validate_number($number) { if (preg_match('/[^0-9]/', $number)) { $errors[] = t('Non-numeric character found in number.'); } - if (strlen($number) > 13 || strlen($number) < 10) { - $errors[] = t('Number longer than 13 digits or shorter than 10 digits.'); + if (strlen($number) > 15 || strlen($number) < 10) { + $errors[] = t('Number longer than 15 digits or shorter than 10 digits.'); } if ($code == '990' || $code == '997' || $code == '999') { $errors[] = t('Country code not allowed');