<?php
// $Id$
/**
 * @file
 * 
 * @see http://drupal.org/node/278126
 * @see http://developers.facebook.com/docs/test_users
 * @see http://developers.facebook.com/docs/authentication/#authenticating-as-an-application
 *
 */

class FbconnectTestCase extends DrupalWebTestCase {
  
  /**
   * Implementation of getInfo().
   */
  public static function getInfo() {
    return array(
      'name' => t('FBConnect functionality'),
      'description' => t('Test FBConnect.'),
      'group' => t('FBConnect'),
    );
  }
  
  protected $_fb_users = array();
  
  function _createFbTestUser($installed = 'true', $permissions = '') {
    $conf = fbconnect_get_config();
    
    facebook_client()->setSession(null, false);
    $url = "/$conf[app_id]/accounts/test-users?installed=$installed&permissions=$permissions";
    
    $fb_user = fbconnect_graph_query($url, 'POST');
    $this->_fb_users[] = $fb_user;
    
    $this->verbose('_createFbTestUser: fb_user='. var_export($fb_user, TRUE));
    $this->assertTrue(isset($fb_user['id']), 'created test FB user', 'FBConnect');
    
    return $fb_user;
  }  

  /**
   * Implementation of setUp().
   */
  function setUp() {
    if (!facebook_client()) {
      $this->error('fbconnect is not properly installed. See README.txt');
      return;
    }
    
    $this->settings_keys = array('fbconnect_appid', 'fbconnect_skey');
    foreach ($this->settings_keys as $key) {
      $this->settings[$key] = variable_get($key, NULL);
    }
    
    parent::setUp('libraries', 'fbconnect', 'fbconnect_test');
    
    foreach ($this->settings as $key => $value) {
      variable_set($key, $value);
    }
  }
  
  function tearDown() {
    parent::tearDown();
    
    facebook_client()->setSession(null, false);
    foreach ($this->_fb_users as $fb_user) {
      $this->assertEqual(fbconnect_graph_query('/'. $fb_user['id'], 'DELETE'), '1', 'deleted test FB user', 'FBConnect');
    }
    
    $this->_fb_users = array();
  }
  
  function testLogin() {
    $account = $this->drupalCreateUser();
    $fb_user = $this->_createFbTestUser();
    
    $edit = array(
      'fbuid' => $fb_user['id'],
      'access_token' => $fb_user['access_token'],
    );
    $this->drupalPost('fbconnect-test/init-fb-session', $edit, 'Submit');
    $this->assertFieldByName('fbuid', $fb_user['id'], 'FB Session inited', 'FBConnect');
    
    $this->assertTrue(fbconnect_register($account->uid, $fb_user['id']), 'fbconnect_register returned true', 'FBConnect');
    $this->assertNotNull(_get_user_fbuid($account->uid), 'FB Account is connected', 'FBConnect');
    
    $this->drupalPost('', array(), 'Connect');
    $this->assertLink('My account', 0, 'User is logged in', 'FBConnect');
  }
  
  function testLinking() {
    $account = $this->drupalCreateUser();
    $fb_user = $this->_createFbTestUser('true');
    
    $edit = array(
      'fbuid' => $fb_user['id'],
      'access_token' => $fb_user['access_token'],
    );
    $this->drupalPost('fbconnect-test/init-fb-session', $edit, 'Submit');
    $this->assertFieldByName('fbuid', $fb_user['id'], 'FB Session inited', 'FBConnect');
    
    $edit = array(
      'name' => $account->name,
      'pass' => $account->pass_raw,
    );
    $this->drupalPost('user', $edit, 'Log in', array('query' => 'destination=fbconnect/link'));
    $this->assertLink('My account', 0, 'User is logged in', 'FBConnect');
  }  
  
  function testRegistration() {
    variable_set('fbconnect_reg_options', 1);
    
    $fb_user = $this->_createFbTestUser('true');
    $edit = array(
      'fbuid' => $fb_user['id'],
      'access_token' => $fb_user['access_token'],
    );
    $this->drupalPost('fbconnect-test/init-fb-session', $edit, 'Submit');
    $this->assertFieldByName('fbuid', $fb_user['id'], 'FB Session inited', 'FBConnect');
    
    $edit = array(
      'mail' => $this->randomName().'@example.com', 
    );
    $this->drupalPost('fbconnect/register/create', $edit, 'Create new account');
    $this->assertLink('My account', 0, 'User is logged in', 'FBConnect');
  }
  
  function testFastRegistration() {
    variable_set('fbconnect_fast_reg', 1);
    variable_set('fbconnect_reg_options', 1);
    
    $fb_user = $this->_createFbTestUser('true', 'email');
    
    $edit = array(
      'fbuid' => $fb_user['id'],
      'access_token' => $fb_user['access_token'],
    );
    $this->drupalPost('fbconnect-test/init-fb-session', $edit, 'Submit');
    $this->assertFieldByName('fbuid', $fb_user['id'], 'FB Session inited', 'FBConnect');
    $this->drupalPost('', array(), 'Connect');
    $this->assertLink('My account', 0, 'User is logged in', 'FBConnect');
    
//    $this->assertNotNull(_get_user_fbuid($account->uid), 'FB Account is connected', 'FBConnect');
  }
  
}