diff --git a/src/applications/phortune/__tests__/PhabricatorPhortuneTestCase.php b/src/applications/phortune/__tests__/PhabricatorPhortuneTestCase.php index b4d6a0e89d..7be37483be 100644 --- a/src/applications/phortune/__tests__/PhabricatorPhortuneTestCase.php +++ b/src/applications/phortune/__tests__/PhabricatorPhortuneTestCase.php @@ -1,26 +1,43 @@ true, ); } public function testNewPhortuneAccount() { $user = $this->generateNewTestUser(); $content_source = $this->newContentSource(); $accounts = PhortuneAccountQuery::loadAccountsForUser( $user, $content_source); $this->assertEqual( 1, count($accounts), pht('Creation of default account for users with no accounts.')); + + // Reload the account. The user should be able to view and edit it, and + // should be a member. + + $account = head($accounts); + $account = id(new PhortuneAccountQuery()) + ->setViewer($user) + ->withPHIDs(array($account->getPHID())) + ->requireCapabilities( + array( + PhabricatorPolicyCapability::CAN_VIEW, + PhabricatorPolicyCapability::CAN_EDIT, + )) + ->executeOne(); + + $this->assertEqual(true, ($account instanceof PhortuneAccount)); + $this->assertEqual(array($user->getPHID()), $account->getMemberPHIDs()); } } diff --git a/src/applications/phortune/editor/PhortuneAccountEditor.php b/src/applications/phortune/editor/PhortuneAccountEditor.php index 8672c62417..50a71c476f 100644 --- a/src/applications/phortune/editor/PhortuneAccountEditor.php +++ b/src/applications/phortune/editor/PhortuneAccountEditor.php @@ -1,81 +1,82 @@ requireActor(); + switch ($type) { case PhabricatorTransactions::TYPE_EDGE: foreach ($xactions as $xaction) { switch ($xaction->getMetadataValue('edge:type')) { case PhortuneAccountHasMemberEdgeType::EDGECONST: - $actor_phid = $this->requireActor()->getPHID(); - $new = $xaction->getNewValue(); $old = $object->getMemberPHIDs(); + $new = $this->getPHIDTransactionNewValue($xaction, $old); - // Check if user is trying to not set themselves on creation - if (!$old) { - $set = idx($new, '+', array()); - $actor_set = false; - foreach ($set as $phid) { - if ($actor_phid == $phid) { - $actor_set = true; - } - } - if (!$actor_set) { - $error = new PhabricatorApplicationTransactionValidationError( - $type, - pht('Invalid'), - pht('You can not remove yourself as an account manager.'), - $xaction); - $errors[] = $error; + $old = array_fuse($old); + $new = array_fuse($new); + foreach ($new as $new_phid) { + if (isset($old[$new_phid])) { + continue; } - } - // Check if user is trying to remove themselves on edit - $set = idx($new, '-', array()); - foreach ($set as $phid) { - if ($actor_phid == $phid) { + $user = id(new PhabricatorPeopleQuery()) + ->setViewer($viewer) + ->withPHIDs(array($new_phid)) + ->executeOne(); + if (!$user) { $error = new PhabricatorApplicationTransactionValidationError( $type, pht('Invalid'), - pht('You can not remove yourself as an account manager.'), - $xaction); + pht( + 'Account managers must be valid users, "%s" is not.', + $new_phid)); $errors[] = $error; - + continue; } } + + $actor_phid = $this->getActingAsPHID(); + if (!isset($new[$actor_phid])) { + $error = new PhabricatorApplicationTransactionValidationError( + $type, + pht('Invalid'), + pht('You can not remove yourself as an account manager.'), + $xaction); + $errors[] = $error; + } break; } } break; } return $errors; } }