<?php

class ContextReactionBlockTest extends DrupalWebTestCase {
  protected $profile = 'testing';

  public static function getInfo() {
    return array(
      'name' => 'Reaction: block',
      'description' => 'Test block reaction.',
      'group' => 'Context',
    );
  }

  function setUp() {
    parent::setUp('context', 'ctools', 'block');
    $admin_user = $this->drupalCreateUser(array(
      'administer site configuration',
      'administer blocks'
    ));
    $this->drupalLogin($admin_user);
  }

  function test() {
    ctools_include('export');
    $context = ctools_export_new_object('context');
    $context->name = 'testcontext';
    $context->conditions = array('sitewide' => array('values' => array(1)));
    $context->reactions = array('block' => array('blocks' => array(
      'user-online' => array(
        'module' => 'user',
        'delta' => 'online',
        'region' => 'sidebar_first',
        'weight' => 0,
      ),
    )));
    $saved = context_save($context);
    $this->assertTrue($saved, "Context 'testcontext' saved.");

    theme_enable(array('bartik'));
    variable_set('theme_default', 'bartik');
    $this->refreshVariables();

    $this->drupalGet('node');
    $this->assertText('Who\'s online');

    // Test title override of code provided block
    $edit = array('title' => 'Context Online Block');
    $this->drupalPost('admin/structure/block/manage/user/online/configure', $edit, t('Save block'));
    $this->drupalPost('admin/config/development/performance', array(), t('Clear all caches'));
    $this->drupalGet('node');
    $this->assertText('Context Online Block');

    // Test title of custom block
    $edit = array(
      'info' => 'Context Custom Block Info',
      'title' => 'Context Custom Block Title',
      'body[value]' => $this->randomName(32),
    );
    $this->drupalPost('admin/structure/block/add', $edit, t('Save block'));
    $bid = db_query("SELECT bid FROM {block_custom} WHERE info = :info", array(':info' => $edit['info']))->fetchField();

    $context->reactions['block']['blocks']["block-{$bid}"] = array(
      'module' => 'block',
      'delta' => $bid,
      'region' => 'sidebar_first',
      'weight' => 2,      
    );
    $saved = context_save($context);
    $this->assertTrue($saved, "Context 'testcontext' saved.");

    $this->drupalGet('node');
    $this->assertText('Context Custom Block Title');

    // Cleanup
    context_delete($context);
  }
}

class ContextReactionBlockAjaxTest extends DrupalWebTestCase {
  protected $profile = 'testing';

  public static function getInfo() {
    return array(
      'name' => 'Reaction: block ajax',
      'description' => 'Test block reaction ajax behavior.',
      'group' => 'Context',
    );
  }

  function setUp() {
    parent::setUp('context', 'context_ui', 'ctools');
    $admin_user = $this->drupalCreateUser(array('context ajax block access'));
    $this->drupalLogin($admin_user);
  }

  function test() {
    $this->drupalGet('node', array(
      'query' => array('context_block' => 'user-online,testcontext')
    ));

    $this->assertText('"status":1', 'Successful return status.');
    $this->assertText('Who\\u0027s online', 'Expected text in block data.');
  }
}

class ContextReactionBlockAjaxAccessTest extends DrupalWebTestCase {
  protected $profile = 'testing';

  public static function getInfo() {
    return array(
      'name' => 'Reaction: block ajax access',
      'description' => 'Test block reaction ajax access behavior.',
      'group' => 'Context',
    );
  }

  function setUp() {
    parent::setUp('context', 'ctools');
    $admin_user = $this->drupalCreateUser();
    $this->drupalLogin($admin_user);
  }

  function test() {
    $this->drupalGet('node', array(
      'query' => array('context_block' => 'user-online,testcontext')
    ));

    $this->assertText('"status":0', 'Failed return status.');
  }
}

class ContextReactionMenuTest extends DrupalWebTestCase {
  protected $profile = 'testing';

  public static function getInfo() {
    return array(
      'name' => 'Reaction: menu',
      'description' => 'Test menu reaction.',
      'group' => 'Context',
    );
  }

  function setUp() {
    parent::setUp('context', 'ctools', 'menu', 'blog');
    $admin_user = $this->drupalCreateUser(array(
      'administer menu',
      'administer nodes',
      'administer site configuration',
      'create blog content',
    ));
    $this->drupalLogin($admin_user);
  }

  function test() {
    ctools_include('export');
    $context = ctools_export_new_object('context');
    $context->name = 'testcontext';
    $context->conditions = array('sitewide' => array('values' => array(1)));
    $context->reactions = array('menu' => 'node/add');
    $saved = context_save($context);
    $this->assertTrue($saved, "Context 'testcontext' saved.");

    $this->drupalPost('admin/structure/menu/settings', array('menu_main_links_source' => 'navigation'), 'Save configuration');
    theme_enable(array('bartik'));
    variable_set('theme_default', 'bartik');
    $this->refreshVariables();

    $output = $this->drupalGet('user');
    $url = url('node/add');
    $active = $this->xpath('//li[contains(@class, "active")]/a[@href="' . $url . '"]');
    $this->assertTrue(!empty($active), t('Active menu item found.'));

    // Cleanup
    context_delete($context);
  }
}

class ContextReactionBreadcrumbTest extends DrupalWebTestCase {
  protected $profile = 'testing';

  public static function getInfo() {
    return array(
      'name' => 'Reaction: breadcrumb',
      'description' => 'Test breadcrumb reaction.',
      'group' => 'Context',
    );
  }

  function setUp() {
    parent::setUp('context', 'ctools');
    $admin_user = $this->drupalCreateUser(array(
      'access administration pages',
      'administer nodes',
      'administer site configuration'
    ));
    $this->drupalLogin($admin_user);
  }

  function test() {
    ctools_include('export');
    $context = ctools_export_new_object('context');
    $context->name = 'testcontext';
    $context->conditions = array('path' => array('values' => array('node')));
    $context->reactions = array('breadcrumb' => 'admin/structure');
    $saved = context_save($context);
    $this->assertTrue($saved, "Context 'testcontext' saved.");

    theme_enable(array('bartik'));
    variable_set('theme_default', 'bartik');
    $this->refreshVariables();

    $output = $this->drupalGet('node');
    $this->assertText('Home » Administration » Structure');
    $output = $this->drupalGet('user');
    $this->assertNoText('Home » Administration » Structure');

    // Cleanup
    context_delete($context);
  }
}

class ContextReactionThemeHtmlTest extends DrupalWebTestCase {
  protected $profile = 'testing';

  public static function getInfo() {
    return array(
      'name' => 'Reaction: theme html',
      'description' => 'Test theme html reaction.',
      'group' => 'Context',
    );
  }

  function setUp() {
    parent::setUp('context', 'ctools');
    $admin_user = $this->drupalCreateUser(array(
      'access administration pages',
      'administer nodes',
      'administer site configuration'
    ));
    $this->drupalLogin($admin_user);
  }

  function test() {
    ctools_include('export');
    $context = ctools_export_new_object('context');
    $context->name = 'testcontext';
    $context->conditions = array('sitewide' => array('values' => array(1)));
    $context->reactions = array('theme_html' => array('class' => 'context-test-class'));
    $saved = context_save($context);
    $this->assertTrue($saved, "Context 'testcontext' saved.");

    $output = $this->drupalGet('node');
    $this->assertRaw('context-test-class');

    // Cleanup
    context_delete($context);
  }
}

class ContextReactionRegionTest extends DrupalWebTestCase {
  protected $profile = 'testing';

  public static function getInfo() {
    return array(
      'name' => 'Reaction: Region',
      'description' => 'Test Region disable reaction.',
      'group' => 'Context',
    );
  }

  function setUp() {
    parent::setUp('context', 'ctools');
    $admin_user = $this->drupalCreateUser(array(
      'access administration pages',
      'administer nodes',
      'administer site configuration'
    ));
    $this->drupalLogin($admin_user);
  }

  function test() {
    ctools_include('export');
    theme_enable(array('bartik'));
    variable_set('theme_default', 'bartik');
    global $theme;
    $context = ctools_export_new_object('context');
    $context->name = 'testcontext';
    $context->conditions = array('sitewide' => array('values' => array(1)));
    $context->reactions = array(
      'block' => array(
        'blocks' => array(
          'user-online' => array(
            'module' => 'user',
            'delta' => 'online',
            'region' => 'sidebar_first',
            'weight' => '-10',
          ),
        ),
      ),
      'region' => array('bartik' => array('disable' => array('sidebar_first' => 'sidebar_first')))
    );
    $saved = context_save($context);
    $this->assertTrue($saved, "Context 'testcontext' saved.");

    $output = $this->drupalGet('node');
    $this->assertNoText("Who's online");

    // Cleanup
    context_delete($context);
  }
}
