<?php
 
require_once 'PHPUnit/Autoload.php';
 
 
require_once dirname(__DIR__) . '/library/webservices/soap/salesnet/authentication.class.php';
 
 
use WebServices\Soap\SalesNet\Authentication;
 
/**
 
 * Test case for the SalesNet Authentication class
 
 * 
 
 * @author Jeremy Cook
 
 * @version 1.0
 
 */
 
class AuthenticationTest extends PHPUnit_Framework_TestCase {
 
    /**
 
     * Fixture instance of Authentication
 
     * 
 
     * @var Authentication
 
     */
 
    protected $auth;
 
    /**
 
     * Method to create the fixture for each test run
 
     * 
 
     * @return void
 
     */
 
    protected function setUp() {
 
        $this->auth = new Authentication();
 
    }
 
    /**
 
     * 
 
     * Method to test the constructor of the object
 
     * @param int $expiryString
 
     * @dataProvider ValidExpiryHours
 
     */
 
    public function testConstruct($expiryHours) {
 
        $this->auth->__construct($expiryHours);
 
        $this->assertAttributeEquals(sprintf('+%s hours', $expiryHours), 'TokenExpiryString', $this->auth);
 
    }
 
    /**
 
     * 
 
     * Tests that an invalid number of hours passed to the constructor raises an exception
 
     * @param mixed $expiryHours
 
     * @dataProvider InvalidExpiryHours
 
     */
 
    public function testBadExpiryHoursRaisesException($expiryHours) {
 
        $this->setExpectedException('InvalidArgumentException', sprintf('The number of hours for the token to be valid must be between 1 and 12, "%s" passed in WebServices\Soap\SalesNet\Authentication::__construct', $expiryHours));
 
        $this->auth->__construct($expiryHours);
 
    }
 
    /**
 
     * Method to test that setting the company login works
 
     * 
 
     * @dataProvider TestCredentialsData
 
     */
 
    public function testCompanyLogin($company) {
 
        $this->assertSame($this->auth, $this->auth->setCompanyLogin($company));
 
        $this->assertSame($company, $this->auth->getCompanyLogin());
 
    }
 
    /**
 
     * Method to test that setting the user login works.
 
     * 
 
     * @dataProvider TestCredentialsData
 
     */
 
    public function testUserLogin($user) {
 
        $this->assertSame($this->auth, $this->auth->setUserName($user));
 
        $this->assertSame($user, $this->auth->getUserName());
 
    }
 
    /**
 
     * Method to assert that setting the user password works
 
     * 
 
     * @dataProvider TestCredentialsData
 
     */
 
    public function testPassword($password) {
 
        $this->assertSame($this->auth, $this->auth->setPassword($password));
 
        $this->assertSame($password, $this->auth->getPassword());
 
    }
 
    /**
 
     * Test method for performing a login.
 
     * This test method uses real SalesNet credentials to test that the login works.
 
     * 
 
     * @dataProvider ValidCredentials
 
     */
 
    public function testLogin($company, $user, $password, array $opts = NULL) {
 
        if ($opts)
 
            $this->auth->setSoapOpts($opts);
 
        $this->auth->setCompanyLogin($company)->setUserName($user)->setPassword($password);
 
        $this->assertInstanceOf('SoapHeader', $this->auth->doLogin());
 
    }
 
    
 
    /**
 
     * Test method for asserting that the SoapHeader object returned from logging in is stored and used on subsequent requests.
 
     * It checks that two subsequent calls to doLogin returns the same SoapHeader instance.
 
     * @dataProvider ValidCredentials
 
     */
 
    public function testHeaderObjectsSame($company, $user, $password) {
 
        $this->auth->setCompanyLogin($company)->setUserName($user)->setPassword($password);
 
        $this->assertSame($this->auth->doLogin(), $this->auth->doLogin());
 
    }
 
    /**
 
     * Test method for asserting that the SoapHeader object returned from logging in is stored and used on subsequent requests.
 
     * 
 
     * @dataProvider ValidCredentials
 
     */
 
    public function testExpiryTime($company, $user, $password) {
 
        $this->auth->setCompanyLogin($company)->setUserName($user)->setPassword($password)->doLogin();
 
        $this->assertInstanceOf('DateTime', $this->auth->getExpiryTime());
 
        $date = new DateTime('+12 hours', new DateTimeZone('UTC'));
 
        $this->assertSame($date->format('G'), $this->auth->getExpiryTime()->format('G'));
 
    }
 
    /**
 
     * Tests setting an expiry time manually
 
     * @dataProvider ExpiryTimes
 
     */
 
    public function testSetExpiryTime(DateTime $time) {
 
        $this->auth->setExpiryTime($time);
 
        $this->assertSame($time, $this->auth->getExpiryTime());
 
    }
 
    /**
 
     * Tests that setting a new expiry time that has already past causes a new SoapHeader (and security token) to be set.
 
     * @dataProvider ValidCredentials
 
     */
 
    public function testNewExpiryTimeCausesNewSoapHeader($company, $user, $password) {
 
        $header = $this->auth->setCompanyLogin($company)->setUserName($user)->setPassword($password)->doLogin();
 
        $this->auth->setExpiryTime(new DateTime('-1 week', new DateTimeZone('UTC')));
 
        $this->assertThat($this->auth->doLogin(), $this->logicalNot($this->identicalTo($header)));
 
    }
 
    /**
 
     * Method to assert that attempting a login with no credentials raises an exception
 
     * 
 
     * @expectedException \BadMethodCallException
 
     */
 
    public function testLoginNoData() {
 
        $this->auth->doLogin();
 
    }
 
    /**
 
     * 
 
     * Test method for the serialization functionality
 
     * Asserts that when the object is serialized and unserialized it is equal to the unserialized instance
 
     */
 
    public function testSerialize() {
 
        $obj = serialize($this->auth);
 
        $this->assertEquals($this->auth, unserialize($obj));
 
    }
 
    /**
 
     * 
 
     * Tests that the reset method causes all properties available through getters to be reset to null
 
     */
 
    public function testReset() {
 
        $this->assertSame($this->auth, $this->auth->reset());
 
        $reflect = new ReflectionObject($this->auth);
 
        foreach ($reflect->getMethods(ReflectionMethod::IS_PUBLIC) as $method) {
 
            if (substr($method, 0, 3) === 'get') {
 
                $this->assertNull($this->auth->$method());
 
            }
 
        }
 
    }
 
    /**
 
     * Tests setting and retrieving soap options from the object.
 
     * @dataProvider SoapOpts
 
     */
 
    public function testSetSoapOpts(array $opts) {
 
        $this->assertSame($this->auth, $this->auth->setSoapOpts($opts));
 
        $this->assertSame($opts, $this->auth->getSoapOpts());
 
    }
 
    /**
 
     * Method to assert that a bad login results in a SoapFault.
 
     * 
 
     */
 
    public function testBadLogin() {
 
        $this->setExpectedException('SoapFault', 'An Error has occurred.');
 
        $this->auth->setCompanyLogin('foo')->setUserName('bar')->setPassword('baz')->doLogin();
 
    }
 
    /**
 
     * Assert that a non-string value passed to setCompanyLogin results in an exception
 
     * 
 
     * @dataProvider BadCredentialData
 
     */
 
    public function testBadCompany($company) {
 
        $this->setExpectedException('InvalidArgumentException', sprintf('Argument "%s" passed to WebServices\Soap\SalesNet\Authentication::setCompanyLogin must be a string', $company));
 
        $this->auth->setCompanyLogin($company);
 
    }
 
    /**
 
     * Assert that a non-string value passed to setUserName results in an exception
 
     * 
 
     * @dataProvider BadCredentialData
 
     */
 
    public function testBadUser($user) {
 
        $this->setExpectedException('InvalidArgumentException', sprintf('Argument "%s" passed to WebServices\Soap\SalesNet\Authentication::setUserName must be a string', $user));
 
        $this->auth->setUserName($user);
 
    }
 
    /**
 
     * Assert that a non-string value passed to setPassword results in an exception
 
     * 
 
     * @dataProvider BadCredentialData
 
     */
 
    public function testBadPassword($password) {
 
        $this->setExpectedException('InvalidArgumentException', sprintf('Argument "%s" passed to WebServices\Soap\SalesNet\Authentication::setPassword must be a string', $password));
 
        $this->auth->setPassword($password);
 
    }
 
    /**
 
     * 
 
     * Data Providers
 
     */
 
    
 
    static public function TestCredentialsData() {
 
        return array(
 
            array('foo'), 
 
            array('bar'), 
 
            array ('baz')
 
        );
 
    }
 
    /**
 
     * 
 
     * ENTER YOUR OWN SALESNET CREDENTIALS HERE TO RUN A SUCCESSFUL TEST
 
     */
 
    static public function ValidCredentials() {
 
        return array(
 
            array('COMPANY_NAME', 'USERNAME', 'PASSWORD', array('trace' => TRUE)),
 
            array('COMPANY_NAME', 'USERNAME', 'PASSWORD', array())
 
        );
 
    }
 
    
 
    static public function BadCredentialData() {
 
        return array(
 
            array (5), 
 
            array (3.7), 
 
            array(array ('foo', 'bar'))
 
        );
 
    }
 
    
 
    static public function ExpiryTimes() {
 
        $zone = new DateTimeZone('UTC');
 
        return array(
 
            array(new DateTime('now', $zone)),
 
            array(new DateTime('+1 hour', $zone)),
 
            array(new DateTime('last week', $zone))
 
        );
 
    }
 
    
 
    static public function SoapOpts() {
 
        return array(
 
            array(array('trace' => TRUE, 'exceptions' => FALSE)),
 
            array(array('foo')),
 
            array(array('bar'))
 
        );
 
    }
 
    
 
    static public function ValidExpiryHours() {
 
        return array(
 
            array(1),
 
            array(2),
 
            array(3),
 
            array(4),
 
            array(5),
 
            array(6),
 
            array(7),
 
            array(8),
 
            array(9),
 
            array(10),
 
            array(11),
 
            array(12),
 
        );
 
    }
 
    
 
    static public function InvalidExpiryHours() {
 
        return array(
 
            array(0),
 
            array(1.5),
 
            array(13),
 
            array('foo')
 
        );
 
    }
 
}
 
?>
 
 
 |