You are here

public function IpAddressBlockingTest::testIpAddressValidation in Advanced ban 8

Tests various user input to confirm correct validation and saving of data.

File

tests/src/Functional/IpAddressBlockingTest.php, line 32

Class

IpAddressBlockingTest
Tests IP address banning.

Namespace

Drupal\Tests\advban\Functional

Code

public function testIpAddressValidation() {

  // Create user.
  $admin_user = $this
    ->drupalCreateUser([
    'advanced ban IP addresses',
  ]);
  $this
    ->drupalLogin($admin_user);
  $this
    ->drupalGet('admin/config/people/advban');

  /** @var $storage \Drupal\advban\AdvbanIpManager */
  $ipManagerService = $this->container
    ->get('advban.ip_manager');

  /** @var $connection \Drupal\Core\Database\Connection */
  $connection = $this->container
    ->get('database');

  // Ban a valid IP address.
  $edit = [];
  $edit['ip'] = '1.2.3.3';
  $post = $this
    ->drupalGet('admin/config/people/advban');
  $this
    ->submitForm($edit, $this
    ->t('Add'));
  $this
    ->verbose($post);
  $ip = $connection
    ->query("SELECT iid from {advban_ip} WHERE ip = :ip", [
    ':ip' => $edit['ip'],
  ])
    ->fetchField();
  $this
    ->assertNotEmpty($ip, 'IP address found in database.');
  $ban_result = $ipManagerService
    ->isBanned($edit['ip'], [
    'expiry_check' => TRUE,
    'info_output' => TRUE,
  ]);
  $this
    ->assertNotEmpty($ban_result['is_banned'], 'IP address found in database.');

  // Ban range IP addresses.
  $edit = [];
  $edit['ip'] = '1.2.4.1';
  $edit['ip_end'] = '1.2.4.9';
  $this
    ->drupalGet('admin/config/people/advban');
  $this
    ->submitForm($edit, $this
    ->t('Add'));
  $ip_test = '1.2.4.3';
  $ip_long = ip2long($ip_test);
  $ip = $connection
    ->query("SELECT iid FROM {advban_ip} WHERE ip_end <> '' AND ip <= :ip AND ip_end >= :ip LIMIT 1", [
    ':ip' => $ip_long,
  ])
    ->fetchField();
  $this
    ->assertNotEmpty($ip, 'IP address found in database.');
  $ban_result = $ipManagerService
    ->isBanned($ip_test, [
    'expiry_check' => TRUE,
    'info_output' => TRUE,
  ]);
  $this
    ->assertNotEmpty($ban_result['is_banned'], 'IP address is banned.');
  $edit = [];
  $edit['ip'] = '1.1.1.1';
  $edit['ip_end'] = '2.2.2.2';
  $this
    ->drupalGet('admin/config/people/advban');
  $this
    ->submitForm($edit, $this
    ->t('Add'));
  $ip_test = '127.0.0.1';
  $ip_long = ip2long($ip_test);
  $ip = $connection
    ->query("SELECT iid FROM {advban_ip} WHERE ip_end <> '' AND ip <= {$ip_long} AND ip_end >= {$ip_long} LIMIT 1")
    ->fetchField();
  $this
    ->assertEmpty($ip, 'IP address not found in database.');
  $ban_result = $ipManagerService
    ->isBanned($ip_test, [
    'expiry_check' => TRUE,
    'info_output' => TRUE,
  ]);
  $this
    ->assertEmpty($ban_result['is_banned'], 'IP address is not banned.');

  // Try to block an IP address that's already blocked.
  $edit = [];
  $edit['ip'] = '1.2.3.3';
  $this
    ->drupalGet('admin/config/people/advban');
  $this
    ->submitForm($edit, $this
    ->t('Add'));
  $this
    ->assertText($this
    ->t('This IP address is already banned.'));

  // Try to block an IP address that's already blocked (by range).
  $edit = [];
  $edit['ip'] = '1.2.4.3';
  $this
    ->drupalGet('admin/config/people/advban');
  $this
    ->submitForm($edit, $this
    ->t('Add'));
  $this
    ->assertText($this
    ->t('This IP address is already banned.'));

  // Try to block a reserved IP address.
  $edit = [];
  $edit['ip'] = '255.255.255.255';
  $this
    ->drupalGet('admin/config/people/advban');
  $this
    ->submitForm($edit, $this
    ->t('Add'));
  $this
    ->assertText($this
    ->t('Enter a valid IP address.'));

  // Try to block a reserved IP address.
  $edit = [];
  $edit['ip'] = 'test.example.com';
  $this
    ->drupalGet('admin/config/people/advban');
  $this
    ->submitForm($edit, $this
    ->t('Add'));
  $this
    ->assertText($this
    ->t('Enter a valid IP address.'));

  // Submit an empty form.
  $edit = [];
  $edit['ip'] = '';
  $edit['ip_end'] = '';
  $this
    ->drupalGet('admin/config/people/advban');
  $this
    ->submitForm($edit, $this
    ->t('Add'));
  $this
    ->assertText($this
    ->t('Enter a valid IP address.'));

  // Submit your own IP address. This fails, although it works when testing
  // manually.
  // TODO: On some systems this test fails due to a bug/inconsistency in cURL.
  // $edit = array();
  // $edit['ip'] = \Drupal::request()->getClientIP();
  // $this->drupalGet('admin/config/people/advban');
  // $this->submitForm($edit, $this->t('Save'));
  // $this->assertText(t('You may not ban your own IP address.'));
  // Test duplicate ip address are not present in the 'blocked_ips' table.
  // when they are entered programmatically.
  $ip = '1.0.0.0';
  $ipManagerService
    ->banIp($ip);
  $ipManagerService
    ->banIp($ip);
  $ipManagerService
    ->banIp($ip);
  $query = $connection
    ->select('advban_ip', 'bip');
  $query
    ->fields('bip', [
    'iid',
  ]);
  $query
    ->condition('bip.ip', $ip);
  $ip_count = $query
    ->execute()
    ->fetchAll();
  $this
    ->assertEquals(1, count($ip_count));
  $ip = '';
  $ipManagerService
    ->banIp($ip);
  $ipManagerService
    ->banIp($ip);
  $query = $connection
    ->select('advban_ip', 'bip');
  $query
    ->fields('bip', [
    'iid',
  ]);
  $query
    ->condition('bip.ip', $ip);
  $ip_count = $query
    ->execute()
    ->fetchAll();
  $this
    ->assertEquals(1, count($ip_count));
}