Skip to content

Commit

Permalink
Add Facebook auth error notification inside plugin settings and add t…
Browse files Browse the repository at this point in the history
…ests
  • Loading branch information
ginatrapani committed Jul 6, 2012
1 parent 258994c commit 4685605
Show file tree
Hide file tree
Showing 6 changed files with 86 additions and 40 deletions.
25 changes: 24 additions & 1 deletion tests/TestOfDashboardController.php
Expand Up @@ -208,6 +208,27 @@ public function testLoggedInPostsFacebook() {
$this->assertPattern('/Export/', $results);
}

public function testFacebookAuthError() {
$builders = $this->buildData();
//required params
$_GET['u'] ="Joe O\'Malley";
$_GET['n'] = 'facebook';
$_GET['v'] = '';
$controller = new DashboardController(true);

//not logged in, shouldn't show auth error alert
$results = $controller->go();
$this->debug($results);
$this->assertNoPattern('/ThinkUp can\'t connect to your Facebook account./', $results);

//logged in, should show auth error alert
$this->simulateLogin('me@example.com');

$results = $controller->go();
$this->debug($results);
$this->assertPattern('/ThinkUp can\'t connect to your Facebook account./', $results);
}

public function testLoggedInPostsGooglePlus() {
$builders = $this->buildData();
$this->simulateLogin('me@example.com');
Expand Down Expand Up @@ -335,7 +356,9 @@ private function buildData($with_xss = false) {
//Add instance_owner
$instance_owner_builder_1 = FixtureBuilder::build('owner_instances', array('owner_id'=>1, 'instance_id'=>1));
$instance_owner_builder_2 = FixtureBuilder::build('owner_instances', array('owner_id'=>1, 'instance_id'=>2));
$instance_owner_builder_3 = FixtureBuilder::build('owner_instances', array('owner_id'=>1, 'instance_id'=>3));
$instance_owner_builder_3 = FixtureBuilder::build('owner_instances', array('owner_id'=>1, 'instance_id'=>3,
'auth_error'=>'Error validating access token: Session has expired at unix time SOME_TIME. The current unix '.
'time is SOME_TIME.'));

//Insert test data into test table
$user_builders = array();
Expand Down
7 changes: 4 additions & 3 deletions webapp/_lib/controller/class.DashboardController.php
Expand Up @@ -143,11 +143,12 @@ private function setInstance() {
}
$owner_instance = $owner_instance_dao->get($owner->id, $this->instance->id);
if (isset($owner_instance) && $owner_instance->auth_error != '') {
$this->addErrorMessage("ThinkUp is having trouble accessing your ".
ucwords($this->instance->network). " data. To fix this problem, in <a href=\"account/?p=".
$this->addErrorMessage("ThinkUp can't connect to your ". ucwords($this->instance->network).
" account. This is probably normal - the connection expires after a certain amount of time. ".
"To fix it, in <a href=\"account/?p=".
(($this->instance->network=='facebook page')?'facebook':$this->instance->network)."\">".
ucwords($this->instance->network).
" settings</a>, re-add your account.", null, true);
" settings</a>, re-add this account.", null, true);
}
$this->addToView('instances', $instance_dao->getByOwner($owner));
} else {
Expand Down
2 changes: 1 addition & 1 deletion webapp/_lib/model/class.OwnerInstanceMySQLDAO.php
Expand Up @@ -229,7 +229,7 @@ public function setAuthError($owner_id, $instance_id, $auth_error="") {

public function getOAuthTokens($id) {
$q = "SELECT
oauth_access_token, oauth_access_token_secret
oauth_access_token, oauth_access_token_secret, auth_error
FROM
#prefix#owner_instances
WHERE
Expand Down
Expand Up @@ -134,13 +134,13 @@ protected function setUpFacebookInteractions($options) {
$user_pages = array();
$user_admin_pages = array();
$instance_dao = DAOFactory::getDAO('InstanceDAO');
$owner_instances = $instance_dao->getByOwnerAndNetwork($this->owner, 'facebook');
$instances = $instance_dao->getByOwnerAndNetwork($this->owner, 'facebook');

$ownerinstance_dao = DAOFactory::getDAO('OwnerInstanceDAO');
foreach ($owner_instances as $instance) {
$owner_instance_dao = DAOFactory::getDAO('OwnerInstanceDAO');
foreach ($instances as $instance) {
// TODO: figure out if the scope has changed since this instance last got its tokens,
// and we need to get re-request permission with the new scope
$tokens = $ownerinstance_dao->getOAuthTokens($instance->id);
$tokens = $owner_instance_dao->getOAuthTokens($instance->id);
$access_token = $tokens['oauth_access_token'];
if ($instance->network == 'facebook') { //not a page
$pages = FacebookGraphAPIAccessor::apiRequest('/'.$instance->network_user_id.'/likes', $access_token);
Expand All @@ -159,6 +159,9 @@ protected function setUpFacebookInteractions($options) {
}
}
}
if (isset($tokens['auth_error']) && $tokens['auth_error'] != '') {
$instance->auth_error = $tokens['auth_error'];
}
}
$this->addToView('user_pages', $user_pages);
$this->addToView('user_admin_pages', $user_admin_pages);
Expand All @@ -167,8 +170,7 @@ protected function setUpFacebookInteractions($options) {
if (count($owner_instance_pages) > 0) {
$this->addToView('owner_instance_pages', $owner_instance_pages);
}

$this->addToView('owner_instances', $owner_instances);
$this->addToView('instances', $instances);
}
/**
* Process actions based on $_GET parameters. Authorize FB user or add FB page.
Expand Down
Expand Up @@ -73,7 +73,7 @@ private function buildInstanceData() {

//Add owner instance_owner
$owner_instance_builder = FixtureBuilder::build('owner_instances', array('owner_id'=>1, 'instance_id'=>1,
'oauth_access_token'=>'faux-access-token1'));
'oauth_access_token'=>'faux-access-token1', 'auth_error'=>'Token has expired.'));
array_push($this->builders, $owner_instance_builder);

//Add second instance
Expand All @@ -83,7 +83,7 @@ private function buildInstanceData() {

//Add second owner instance_owner
$owner_instance2_builder = FixtureBuilder::build('owner_instances', array('owner_id'=>2, 'instance_id'=>2,
'oauth_access_token'=>'faux-access-token2'));
'oauth_access_token'=>'faux-access-token2', 'auth_error'=>''));
array_push($this->builders, $owner_instance2_builder);
}

Expand Down Expand Up @@ -134,14 +134,14 @@ public function testOutputNoParams() {
$controller = new FacebookPluginConfigurationController($owner);
$output = $controller->go();
$v_mgr = $controller->getViewManager();
$this->assertIsA($v_mgr->getTemplateDataItem('owner_instances'), 'array', 'Owner instances set');
$this->assertIsA($v_mgr->getTemplateDataItem('instances'), 'array', 'Owner instances set');
$this->assertTrue($v_mgr->getTemplateDataItem('fbconnect_link') != '', 'Authorization link set');
}

public function testConfigOptionsNotAdmin() {
self::buildInstanceData();
// build some options data
$options_arry = $this->buildPluginOptions();
$options_array = $this->buildPluginOptions();
$this->simulateLogin('me@example.com');
$owner_dao = DAOFactory::getDAO('OwnerDAO');
$owner = $owner_dao->getByEmail(Session::getLoggedInUser());
Expand All @@ -167,7 +167,7 @@ public function testConfigOptionsNotAdmin() {
public function testConfigOptionsIsAdmin() {
self::buildInstanceData();
// build some options data
$options_arry = $this->buildPluginOptions();
$options_array = $this->buildPluginOptions();
$this->simulateLogin('me@example.com', true);
$owner_dao = DAOFactory::getDAO('OwnerDAO');
$owner = $owner_dao->getByEmail(Session::getLoggedInUser());
Expand Down Expand Up @@ -196,7 +196,7 @@ public function testConfigOptionsIsAdminWithSSL() {
self::buildInstanceData();
// build some options data
$_SERVER['HTTPS'] = true;
$options_arry = $this->buildPluginOptions();
$options_array = $this->buildPluginOptions();
$this->simulateLogin('me@example.com', true);
$owner_dao = DAOFactory::getDAO('OwnerDAO');
$owner = $owner_dao->getByEmail(Session::getLoggedInUser());
Expand All @@ -211,10 +211,10 @@ public function testConfigOptionsIsAdminWithSSL() {
$this->assertPattern($expected_pattern, $output);
}

public function testConfiguredPluginWithOneFacebookUserWithSeveralLikedAndManagedPages() {
public function testConfiguredPluginWithOneFacebookUserWithSeveralLikedAndManagedPagesWithAuthError() {
self::buildInstanceData();
// build some options data
$options_arry = $this->buildPluginOptions();
$options_array = $this->buildPluginOptions();
$this->simulateLogin('me@example.com', true);
$owner_dao = DAOFactory::getDAO('OwnerDAO');
$owner = $owner_dao->getByEmail(Session::getLoggedInUser());
Expand All @@ -227,8 +227,8 @@ public function testConfiguredPluginWithOneFacebookUserWithSeveralLikedAndManage
$this->assertIsA($liked_pages, 'Array');
$this->assertEqual($liked_pages[606837591][0]->name, 'jenny o.');
$this->assertNull($v_mgr->getTemplateDataItem('owner_instance_pages'));
$this->assertIsA($v_mgr->getTemplateDataItem('owner_instances'), 'Array');
$this->assertEqual(sizeof($v_mgr->getTemplateDataItem('owner_instances')), 1);
$this->assertIsA($v_mgr->getTemplateDataItem('instances'), 'Array');
$this->assertEqual(sizeof($v_mgr->getTemplateDataItem('instances')), 1);
$this->assertPattern("/Pages You Like/", $output);
$this->assertPattern("/The Wire/", $output);
$this->assertPattern("/Glee/", $output);
Expand All @@ -240,12 +240,16 @@ public function testConfiguredPluginWithOneFacebookUserWithSeveralLikedAndManage
$this->assertEqual($managed_pages[606837591][0]->name, 'Sample Cause');
$this->assertPattern("/Pages You Manage/", $output);
$this->assertPattern("/Sample Cause/", $output);

//with auth error
$this->assertPattern('/facebook-auth-error"/', $output);

}

public function testConfiguredPluginWithOneFacebookUserNoLikedPages() {
public function testConfiguredPluginWithOneFacebookUserNoLikedPagesNoAuthError() {
self::buildInstanceData();
// build some options data
$options_arry = $this->buildPluginOptions();
$options_array = $this->buildPluginOptions();
$this->simulateLogin('me2@example.com', true);
$owner_dao = DAOFactory::getDAO('OwnerDAO');
$owner = $owner_dao->getByEmail(Session::getLoggedInUser());
Expand All @@ -258,14 +262,18 @@ public function testConfiguredPluginWithOneFacebookUserNoLikedPages() {
$this->assertIsA($liked_pages, 'Array');
$this->assertEqual(sizeof($liked_pages), 0);
$this->assertNull($v_mgr->getTemplateDataItem('owner_instance_pages'), 'Array');
$this->assertIsA($v_mgr->getTemplateDataItem('owner_instances'), 'Array');
$this->assertEqual(sizeof($v_mgr->getTemplateDataItem('owner_instances')), 1);
$this->assertIsA($v_mgr->getTemplateDataItem('instances'), 'Array');
$this->assertEqual(sizeof($v_mgr->getTemplateDataItem('instances')), 1);

//no auth error
$this->debug($output);
$this->assertNoPattern('/facebook-auth-error/', $output);
}

public function testConfiguredPluginWithOneFacebookUserOneLikedPageOneManagedPage() {
self::buildInstanceData();
// build some options data
$options_arry = $this->buildPluginOptions();
$options_array = $this->buildPluginOptions();
$this->simulateLogin('me@example.com', true);
$owner_dao = DAOFactory::getDAO('OwnerDAO');
$owner = $owner_dao->getByEmail(Session::getLoggedInUser());
Expand All @@ -286,7 +294,7 @@ public function testConfiguredPluginWithOneFacebookUserOneLikedPageOneManagedPag
public function testConfiguredPluginWithOneFacebookUserNoLikedPagesNoManagedPages() {
self::buildInstanceData();
// build some options data
$options_arry = $this->buildPluginOptions();
$options_array = $this->buildPluginOptions();
$this->simulateLogin('me2@example.com', true);
$owner_dao = DAOFactory::getDAO('OwnerDAO');
$owner = $owner_dao->getByEmail(Session::getLoggedInUser());
Expand Down Expand Up @@ -329,14 +337,14 @@ public function testAddPage() {
$_GET['p'] = 'facebook';
$_GET['owner_id'] = '';

$options_arry = $this->buildPluginOptions();
$options_array = $this->buildPluginOptions();
$this->simulateLogin('me2@example.com', true);
$owner = $owner_dao->getByEmail(Session::getLoggedInUser());
$controller = new FacebookPluginConfigurationController($owner, 'facebook');
$output = $controller->go();

$v_mgr = $controller->getViewManager();
$this->assertIsA($v_mgr->getTemplateDataItem('owner_instances'), 'array', 'Owner instances set');
$this->assertIsA($v_mgr->getTemplateDataItem('instances'), 'array', 'Owner instances set');
$this->assertTrue($v_mgr->getTemplateDataItem('fbconnect_link') != '', 'Authorization link set');

$msgs = $v_mgr->getTemplateDataItem('success_msgs');
Expand Down Expand Up @@ -374,7 +382,7 @@ public function testConnectAccountSuccessful() {
$_GET['code'] = '456';
$_GET['state'] = '123';

$options_arry = $this->buildPluginOptions();
$options_array = $this->buildPluginOptions();
$this->simulateLogin('me@example.com', true);

$instance = $instance_dao->getByUserIdOnNetwork('606837591', 'facebook');
Expand Down Expand Up @@ -416,7 +424,7 @@ public function testConnectAccountSuccessfulNoServerName() {
$_GET['code'] = '789';
$_GET['state'] = '123';

$options_arry = $this->buildPluginOptions();
$options_array = $this->buildPluginOptions();
$this->simulateLogin('me@example.com', true);

$instance = $instance_dao->getByUserIdOnNetwork('606837591', 'facebook');
Expand Down Expand Up @@ -456,7 +464,7 @@ public function testConnectAccountHTTPSSuccessful() {
$_GET['code'] = '789';
$_GET['state'] = '123';

$options_arry = $this->buildPluginOptions();
$options_array = $this->buildPluginOptions();
$this->simulateLogin('me@example.com', true);

$instance = $instance_dao->getByUserIdOnNetwork('606837591', 'facebook');
Expand Down Expand Up @@ -495,7 +503,7 @@ public function testConnectAccountInvalidCSRFToken() {
$_GET['code'] = '456';
$_GET['state'] = 'NOT123';

$options_arry = $this->buildPluginOptions();
$options_array = $this->buildPluginOptions();
$this->simulateLogin('me@example.com', true);

$instance = $instance_dao->getByUserIdOnNetwork('606837591', 'facebook');
Expand Down Expand Up @@ -529,9 +537,17 @@ public function testConnectAccountThatAlreadyExists() {
$_GET['code'] = '456';
$_GET['state'] = '123';

$options_arry = $this->buildPluginOptions();
$options_array = $this->buildPluginOptions();
$this->simulateLogin('me@example.com', true);
$owner = $owner_dao->getByEmail(Session::getLoggedInUser());

$instance = $instance_dao->getByUserIdOnNetwork('606837591', 'facebook');
$this->assertNotNull($instance);

//assert there is an auth error
$owner_instance = $owner_instance_dao->get($owner->id, $instance->id);
$this->assertEqual($owner_instance->auth_error, 'Token has expired.');

$controller = new FacebookPluginConfigurationController($owner, 'facebook');
$output = $controller->go();

Expand All @@ -547,6 +563,9 @@ public function testConnectAccountThatAlreadyExists() {
$owner_instance = $owner_instance_dao->get($owner->id, $instance->id);
$this->assertNotNull($owner_instance);
$this->assertEqual($owner_instance->oauth_access_token, 'newfauxaccesstoken11234567890');

//assert the auth error got reset to an empty string on successful reconnection
$this->assertEqual($owner_instance->auth_error, '');
}

public function testForDeleteCSRFToken() {
Expand All @@ -556,7 +575,7 @@ public function testForDeleteCSRFToken() {
$instance_dao = new InstanceMySQLDAO();
$owner_dao = new OwnerMySQLDAO();

$options_arry = $this->buildPluginOptions();
$options_array = $this->buildPluginOptions();
$this->simulateLogin('me@example.com', true, true);
$owner = $owner_dao->getByEmail(Session::getLoggedInUser());
$controller = new FacebookPluginConfigurationController($owner, 'facebook');
Expand Down
11 changes: 6 additions & 5 deletions webapp/plugins/facebook/view/facebook.account.index.tpl
Expand Up @@ -24,16 +24,17 @@

</div>

{if count($owner_instances) > 0 }{include file="_usermessage.tpl" field="user_add"}{/if}
{if count($instances) > 0 }{include file="_usermessage.tpl" field="user_add"}{/if}

{if count($owner_instances) > 0 }
{if count($instances) > 0 }
<div class="section">
<h2>Facebook User Profiles</h2>

{foreach from=$owner_instances key=iid item=i name=foo}
{foreach from=$instances key=iid item=i name=foo}
<div class="clearfix article">
<div class="grid_4 right" style="padding-top:.5em;">
<a href="{$site_root_path}?u={$i->network_username|urlencode}&n={$i->network|urlencode}">{$i->network_username}</a>
{if $i->auth_error}<span class="ui-icon ui-icon-alert" style="float: left; margin:0.25em 0 0 0;" id="facebook-auth-error"></span>{/if}
<a href="{$site_root_path}?u={$i->network_username|urlencode}&n={$i->network|urlencode}">{$i->network_username}</a>
</div>
<div class="grid_4 right">
<span id="div{$i->id}"><input type="submit" name="submit" id="{$i->id}" class="linkbutton {if $i->is_public}btnPriv{else}btnPub{/if}" value="{if $i->is_public}set private{else}set public{/if}" /></span>
Expand Down Expand Up @@ -81,7 +82,7 @@

<div class="section">
<h2>Add a Facebook Page</h2>
{foreach from=$owner_instances key=iid item=i name=foo}
{foreach from=$instances key=iid item=i name=foo}
{assign var='facebook_user_id' value=$i->network_user_id}
{if $user_pages.$facebook_user_id or $user_admin_pages.$facebook_user_id}
<div class="clearfix article">
Expand Down

0 comments on commit 4685605

Please sign in to comment.