300 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			300 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| require_once 'Tests/Auth/OpenID/TestUtil.php';
 | |
| 
 | |
| require_once 'Auth/OpenID/Association.php';
 | |
| require_once 'Auth/OpenID/Consumer.php';
 | |
| 
 | |
| class AuthRequest_DummyEndpoint {
 | |
|     var $preferred_namespace = null;
 | |
|     var $local_id = null;
 | |
|     var $server_url = null;
 | |
|     var $is_op_identifier = false;
 | |
| 
 | |
|     function preferredNamespace()
 | |
|     {
 | |
|         return $this->preferred_namespace;
 | |
|     }
 | |
| 
 | |
|     function getLocalID()
 | |
|     {
 | |
|         return $this->local_id;
 | |
|     }
 | |
| 
 | |
|     function isOPIdentifier()
 | |
|     {
 | |
|         return $this->is_op_identifier;
 | |
|     }
 | |
| }
 | |
| 
 | |
| class AuthRequest_DummyAssoc {
 | |
|     var $handle = "assoc-handle";
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Base for AuthRequest tests for OpenID 1 and 2.
 | |
|  */
 | |
| class TestAuthRequestMixin extends OpenIDTestMixin {
 | |
| 
 | |
|     var $preferred_namespace = null;
 | |
|     var $immediate = false;
 | |
|     var $expected_mode = 'checkid_setup';
 | |
| 
 | |
|     function setUp()
 | |
|     {
 | |
|         $this->endpoint = new AuthRequest_DummyEndpoint();
 | |
|         $this->endpoint->local_id = 'http://server.unittest/joe';
 | |
|         $this->endpoint->claimed_id = 'http://joe.vanity.example/';
 | |
|         $this->endpoint->server_url = 'http://server.unittest/';
 | |
|         $this->endpoint->preferred_namespace = $this->preferred_namespace;
 | |
|         $this->realm = 'http://example/';
 | |
|         $this->return_to = 'http://example/return/';
 | |
|         $this->assoc = new AuthRequest_DummyAssoc();
 | |
|         $this->authreq = new Auth_OpenID_AuthRequest($this->endpoint, $this->assoc);
 | |
|     }
 | |
| 
 | |
|     function failUnlessAnonymous($msg)
 | |
|     {
 | |
|         foreach (array('claimed_id', 'identity') as $key) {
 | |
|             $this->failIfOpenIDKeyExists($msg, $key);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     function failUnlessHasRequiredFields($msg)
 | |
|     {
 | |
|         $this->assertEquals($this->preferred_namespace,
 | |
|                                $this->authreq->message->getOpenIDNamespace());
 | |
| 
 | |
|         $this->assertEquals($this->preferred_namespace,
 | |
|                                $msg->getOpenIDNamespace());
 | |
| 
 | |
|         $this->failUnlessOpenIDValueEquals($msg, 'mode',
 | |
|                                            $this->expected_mode);
 | |
| 
 | |
|         // Implement these in subclasses because they depend on
 | |
|         // protocol differences!
 | |
|         $this->failUnlessHasRealm($msg);
 | |
|         $this->failUnlessIdentifiersPresent($msg);
 | |
|     }
 | |
| 
 | |
|     // TESTS
 | |
| 
 | |
|     function test_checkNoAssocHandle()
 | |
|     {
 | |
|         $this->authreq->assoc = null;
 | |
|         $msg = $this->authreq->getMessage($this->realm, $this->return_to,
 | |
|                                           $this->immediate);
 | |
| 
 | |
|         $this->failIfOpenIDKeyExists($msg, 'assoc_handle');
 | |
|     }
 | |
| 
 | |
|     function test_checkWithAssocHandle()
 | |
|     {
 | |
|         $msg = $this->authreq->getMessage($this->realm, $this->return_to,
 | |
|                                          $this->immediate);
 | |
| 
 | |
|         $this->failUnlessOpenIDValueEquals($msg, 'assoc_handle',
 | |
|                                            $this->assoc->handle);
 | |
|     }
 | |
| 
 | |
|     function test_addExtensionArg()
 | |
|     {
 | |
|         $this->authreq->addExtensionArg('bag:', 'color', 'brown');
 | |
|         $this->authreq->addExtensionArg('bag:', 'material', 'paper');
 | |
|         $this->assertTrue($this->authreq->message->namespaces->contains('bag:'));
 | |
|         $this->assertEquals($this->authreq->message->getArgs('bag:'),
 | |
|                             array('color' => 'brown',
 | |
|                                   'material' => 'paper'));
 | |
|         $msg = $this->authreq->getMessage($this->realm, $this->return_to,
 | |
|                                           $this->immediate);
 | |
| 
 | |
|         // XXX: this depends on the way that Message assigns
 | |
|         // namespaces. Really it doesn't care that it has alias "0",
 | |
|         // but that is tested anyway
 | |
|         $post_args = $msg->toPostArgs();
 | |
|         $this->assertEquals('brown', $post_args['openid.ext0.color']);
 | |
|         $this->assertEquals('paper', $post_args['openid.ext0.material']);
 | |
|     }
 | |
| 
 | |
|     function test_standard()
 | |
|     {
 | |
|         $msg = $this->authreq->getMessage($this->realm, $this->return_to,
 | |
|                                          $this->immediate);
 | |
| 
 | |
|         $this->failUnlessHasIdentifiers(
 | |
|              $msg, $this->endpoint->local_id,
 | |
|              $this->endpoint->claimed_id);
 | |
|     }
 | |
| }
 | |
| 
 | |
| class TestAuthRequestOpenID2 extends TestAuthRequestMixin {
 | |
|     var $preferred_namespace = Auth_OpenID_OPENID2_NS;
 | |
| 
 | |
|     function failUnlessHasRealm($msg)
 | |
|     {
 | |
|         // check presence of proper realm key and absence of the wrong
 | |
|         // one.
 | |
|         $this->failUnlessOpenIDValueEquals($msg, 'realm', $this->realm);
 | |
|         $this->failIfOpenIDKeyExists($msg, 'trust_root');
 | |
|     }
 | |
| 
 | |
|     function failUnlessIdentifiersPresent($msg)
 | |
|     {
 | |
|         $identity_present = $msg->hasKey(Auth_OpenID_OPENID_NS, 'identity');
 | |
|         $claimed_present = $msg->hasKey(Auth_OpenID_OPENID_NS, 'claimed_id');
 | |
| 
 | |
|         $this->assertEquals($claimed_present, $identity_present);
 | |
|     }
 | |
| 
 | |
|     function failUnlessHasIdentifiers($msg, $op_specific_id, $claimed_id)
 | |
|     {
 | |
|         $this->failUnlessOpenIDValueEquals($msg, 'identity', $op_specific_id);
 | |
|         $this->failUnlessOpenIDValueEquals($msg, 'claimed_id', $claimed_id);
 | |
|     }
 | |
| 
 | |
|     // TESTS
 | |
| 
 | |
|     function test_markup_checkidImmediate()
 | |
|     {
 | |
|         $result = $this->authreq->formMarkup($this->realm,
 | |
|                                              null, true);
 | |
|         $this->assertTrue(Auth_OpenID::isFailure($result));
 | |
|     }
 | |
| 
 | |
|     function test_markup_returnToArgs()
 | |
|     {
 | |
|         $this->authreq->return_to_args = array('extra' => 'args');
 | |
|         $result = $this->authreq->formMarkup($this->realm,
 | |
|                                              null, false);
 | |
|         $this->assertTrue(Auth_OpenID::isFailure($result));
 | |
|     }
 | |
| 
 | |
|     function test_setAnonymousWorksForOpenID2()
 | |
|     {
 | |
|         // OpenID AuthRequests should be able to set 'anonymous' to true.
 | |
|         $this->assertTrue($this->authreq->message->isOpenID2());
 | |
|         $this->assertTrue($this->authreq->setAnonymous(true));
 | |
|         $this->assertTrue($this->authreq->setAnonymous(false));
 | |
|     }
 | |
| 
 | |
|     function test_userAnonymousIgnoresIdentfier()
 | |
|     {
 | |
|         $this->authreq->setAnonymous(true);
 | |
|         $msg = $this->authreq->getMessage($this->realm, $this->return_to,
 | |
|                                           $this->immediate);
 | |
|         $this->failUnlessHasRequiredFields($msg);
 | |
|         $this->failUnlessAnonymous($msg);
 | |
|     }
 | |
| 
 | |
|     function test_opAnonymousIgnoresIdentifier()
 | |
|     {
 | |
|         $this->endpoint->is_op_identifier = true;
 | |
|         $this->authreq->setAnonymous(true);
 | |
|         $msg = $this->authreq->getMessage($this->realm, $this->return_to,
 | |
|                                           $this->immediate);
 | |
|         $this->failUnlessHasRequiredFields($msg);
 | |
|         $this->failUnlessAnonymous($msg);
 | |
|     }
 | |
| 
 | |
|     function test_opIdentifierSendsIdentifierSelect()
 | |
|     {
 | |
|         $this->endpoint->is_op_identifier = true;
 | |
|         $msg = $this->authreq->getMessage($this->realm, $this->return_to,
 | |
|                                           $this->immediate);
 | |
|         $this->failUnlessHasRequiredFields($msg);
 | |
|         $this->failUnlessHasIdentifiers($msg,
 | |
|                                         Auth_OpenID_IDENTIFIER_SELECT,
 | |
|                                         Auth_OpenID_IDENTIFIER_SELECT);
 | |
|     }
 | |
| }
 | |
| 
 | |
| class TestAuthRequestOpenID1 extends TestAuthRequestMixin {
 | |
|     var $preferred_namespace = Auth_OpenID_OPENID1_NS;
 | |
| 
 | |
|     function setUpEndpoint()
 | |
|     {
 | |
|         parent::setUpEndpoint();
 | |
|         $this->endpoint->preferred_namespace = Auth_OpenID_OPENID1_NS;
 | |
|     }
 | |
| 
 | |
|     function failUnlessHasIdentifiers($msg, $op_specific_id, $claimed_id)
 | |
|     {
 | |
|         // Make sure claimed_is is *absent* in request.
 | |
|         $this->failUnlessOpenIDValueEquals($msg, 'identity', $op_specific_id);
 | |
|         $this->failIfOpenIDKeyExists($msg, 'claimed_id');
 | |
|     }
 | |
| 
 | |
|     function failUnlessIdentifiersPresent($msg)
 | |
|     {
 | |
|         $this->failIfOpenIDKeyExists($msg, 'claimed_id');
 | |
|         $this->assertTrue($msg->hasKey(Auth_OpenID_OPENID_NS, 'identity'));
 | |
|     }
 | |
| 
 | |
|     function failUnlessHasRealm($msg)
 | |
|     {
 | |
|         // check presence of proper realm key and absence of the wrong
 | |
|         // one.
 | |
|         $this->failUnlessOpenIDValueEquals($msg, 'trust_root', $this->realm);
 | |
|         $this->failIfOpenIDKeyExists($msg, 'realm');
 | |
|     }
 | |
| 
 | |
|     // TESTS
 | |
| 
 | |
|     function test_markup_missingReturnTo()
 | |
|     {
 | |
|         $result = $this->authreq->formMarkup($this->realm,
 | |
|                                              null, false);
 | |
|         $this->assertTrue(Auth_OpenID::isFailure($result));
 | |
|     }
 | |
| 
 | |
|     function test_setAnonymousFailsForOpenID1()
 | |
|     {
 | |
|         // OpenID 1 requests MUST NOT be able to set anonymous to True
 | |
|         $this->assertTrue($this->authreq->message->isOpenID1());
 | |
|         $this->assertFalse($this->authreq->setAnonymous(true));
 | |
|         $this->assertTrue($this->authreq->setAnonymous(false));
 | |
|     }
 | |
| 
 | |
|     function test_identifierSelect()
 | |
|     {
 | |
|         // Identfier select SHOULD NOT be sent, but this pathway is in
 | |
|         // here in case some special discovery stuff is done to
 | |
|         // trigger it with OpenID 1. If it is triggered, it will send
 | |
|         // identifier_select just like OpenID 2.
 | |
|         $this->endpoint->is_op_identifier = true;
 | |
|         $msg = $this->authreq->getMessage($this->realm, $this->return_to,
 | |
|                                           $this->immediate);
 | |
|         $this->failUnlessHasRequiredFields($msg);
 | |
|         $this->assertEquals(Auth_OpenID_IDENTIFIER_SELECT,
 | |
|                             $msg->getArg(Auth_OpenID_OPENID1_NS,
 | |
|                                          'identity'));
 | |
|     }
 | |
| }
 | |
| 
 | |
| class TestAuthRequestOpenID1Immediate extends TestAuthRequestOpenID1 {
 | |
|     var $immediate = true;
 | |
|     var $expected_mode = 'checkid_immediate';
 | |
| }
 | |
| 
 | |
| class TestAuthRequestOpenID2Immediate extends TestAuthRequestOpenID2 {
 | |
|     var $immediate = true;
 | |
|     var $expected_mode = 'checkid_immediate';
 | |
| }
 | |
| 
 | |
| class Tests_Auth_OpenID_AuthRequest extends PHPUnit_Framework_TestSuite {
 | |
| 
 | |
|     function getName()
 | |
|     {
 | |
|         return "Tests_Auth_OpenID_AuthRequest";
 | |
|     }
 | |
| 
 | |
|     function Tests_Auth_OpenID_AuthRequest()
 | |
|     {
 | |
|         $this->addTestSuite('TestAuthRequestOpenID1');
 | |
|         $this->addTestSuite('TestAuthRequestOpenID1Immediate');
 | |
|         $this->addTestSuite('TestAuthRequestOpenID2');
 | |
|         $this->addTestSuite('TestAuthRequestOpenID2Immediate');
 | |
|     }
 | |
| }
 | |
| 
 |