Test.php #1

  • //
  • guest/
  • thomas_gray/
  • jambox/
  • main/
  • swarm/
  • tests/
  • phpunit/
  • P4Test/
  • Key/
  • Test.php
  • View
  • Commits
  • Open Download .zip Download (15 KB)
<?php
/**
 * Test methods for the P4 Key class.
 *
 * @copyright   2012 Perforce Software. All rights reserved.
 * @license     Please see LICENSE.txt in top-level folder of this distribution.
 * @version     <release>/<patch>
 */

namespace P4Test\Key;

use P4Test\TestCase;
use P4\Key\Key;
use P4\Counter\Counter;
use P4\Connection\Connection;
use P4\Connection\Exception\CommandException;

class Test extends TestCase
{
    /**
     * Verify keys don't mingle with counters
     */
    public function testNoCounterOverlap()
    {
        $key = new Key;
        $key->setId('k1')->set('test');
        $key->setId('k2')->set('test');

        $counter = new Counter;
        $counter->setId('c1')->set('test');
        $counter->setId('c2')->set('test');

        $this->assertSame(
            array('k1', 'k2'),
            Key::fetchAll()->invoke('getId'),
            'Expected to see all keys but nothing else'
        );
    }

    /**
     * Test fetchAll method
     */
    public function testFetchAll()
    {
        $entries = array(
            'test1' => 'value1',
            'test2' => 'value2',
            'test3' => 'value3',
            'test4' => 'value4',
            'test5' => 'value5',
            'test6' => 'value6',
        );

        $this->assertSame(
            0,
            count(Key::fetchAll()),
            'Expected matching number of entries to start'
        );

        // prime the data
        foreach ($entries as $id => $value) {
            $key = new Key;
            $key->setId($id)->set($value);
        }

        // run a fetch all and validate result
        $keys = Key::fetchAll();
        foreach ($keys as $key) {
            $this->assertTrue(
                array_key_exists($key->getId(), $entries),
                'Expected key '.$key->getId().' to exist in our entries array'
            );

            $this->assertSame(
                $entries[$key->getId()],
                $key->get(),
                'Expected matching key value for entry '.$key->getId()
            );
        }

        // Verify fetchAll with made up option works
        $this->assertSame(
            count($entries),
            count(Key::fetchAll(array('fooBar' => true))),
            'Expected fetch all with made up option to match'
        );

        // Verify full FETCH_MAXIMUM works
        $this->assertSame(
            array_slice(array_keys($entries), 0, 3),
            Key::fetchAll(array(Key::FETCH_MAXIMUM => '3'))->invoke('getId'),
            'Expected fetch all with Maximum to match'
        );
    }

    /**
     * Ensure calling fetchAll() with FETCH_BY_NAME flag works.
     */
    public function testFetchAllWithOptions()
    {
        // add keys to test
        $keys = array(
            'testkey1',
            'testkey2',
            'testkey3',
            'testa',
            'testb',
            'testk',
            'key1',
            'key2',
            'testkey4'
        );

        foreach ($keys as $id) {
            $key = new Key;
            $key->setId($id)
                ->set(1);
        }

        // define tests
        $tests = array(
            array(
                'pattern'   => 'testk',
                'expected'  => array(
                    'testk'
                )
            ),
            array(
                'pattern'   => 'testk*',
                'expected'  => array(
                    'testkey1',
                    'testkey2',
                    'testkey3',
                    'testk',
                    'testkey4'
                )
            ),
            array(
                'pattern'   => '*stk*',
                'expected'  => array(
                    'testkey1',
                    'testkey2',
                    'testkey3',
                    'testkey4',
                    'testk'
                )
            )
        );

        // run tests
        foreach ($tests as $test) {
            $options = array(
                Key::FETCH_BY_NAME => $test['pattern']
            );

            $result = Key::fetchAll($options)->invoke('getId');

            // sort resulting arrays as keys may come in different order
            // from the server
            sort($result);
            sort($test['expected']);

            $this->assertSame(
                $test['expected'],
                $result,
                'for pattern ' . $test['pattern']
            );
        }
    }

    /**
     * Test fetchAll by ids
     */
    public function testFetchAllByIds()
    {
        $entries = array(
            'test1' => 'value1',
            'test2' => 'value2',
            'test3' => 'value3',
            'test4' => 'value4',
            'test5' => 'value5',
            'test6' => 'value6',
        );

        // prime the data
        foreach ($entries as $id => $value) {
            $key = new Key;
            $key->setId($id)->set($value);
        }

        $this->assertSame(
            array('test1', 'test3', 'test4', 'test6'),
            Key::fetchAll(
                array(Key::FETCH_BY_IDS => array('test1', 'test3', 'test4', 'test6', 'test-bad'))
            )->invoke('getId'),
            'expected matching ids'
        );
    }

    /**
     * Test calling set without an ID
     */
    public function testSetNoId()
    {
        try {
            $key = new Key;
            $key->set('test');

            $this->fail('unexpected success');
        } catch (\PHPUnit\Framework\AssertionFailedError $e) {
            $this->fail($e->getMessage());
        } catch (\P4\Exception $e) {
            $this->assertSame(
                "Cannot set value. No id has been set.",
                $e->getMessage(),
                'unexpected exception message'
            );
        } catch (\Exception $e) {
            $this->fail(': unexpected exception ('. get_class($e) .') '. $e->getMessage());
        }
    }

    /**
     * Test the get value function
     */
    public function testGetSet()
    {
        $key = new Key();
        $key->setId('test')->set('testValue');

        $key = Key::fetch('test');

        $this->assertSame(
            'test',
            $key->getId(),
            'Expected matching Id'
        );

        $this->assertSame(
            'testValue',
            $key->get(),
            'Expected matching value'
        );

        Key::fetch('test')->set('testValue2');

        $this->assertSame(
            'testValue',
            $key->get(),
            'Expected cached value after outside modification'
        );

        $this->assertSame(
            'testValue2',
            $key->get(true),
            'Expected matching value after outside modification'
        );

        $key = new Key;
        $this->assertSame(
            null,
            $key->get(),
            'Expected no-id key value to match'
        );

        $key->setId('newKey');
        $this->assertSame(
            null,
            $key->get(),
            'Expected non-existent key value to match'
        );
    }

    /**
     * Test a good call to fetch
     */
    public function testFetch()
    {
        $key = new Key();
        $key->setId('test')->set('testValue');

        $key = Key::fetch('test');

        $this->assertSame(
            'test',
            $key->getId(),
            'Expected matching Id'
        );

        $this->assertSame(
            'testValue',
            $key->get(),
            'Expected matching value'
        );
    }

    /**
     * Test fetch of non-existent record
     */
    public function testNonExistentFetch()
    {
        // ensure fetch fails for a non-existant key.
        try {
            Key::fetch('alskdfj2134');
            $this->fail("Fetch should fail for a non-existant key.");
        } catch (\PHPUnit\Framework\AssertionFailedError $e) {
            $this->fail($e->getMessage());
        } catch (\P4\Exception $e) {
            $this->assertSame(
                "Cannot fetch entry. Id does not exist.",
                $e->getMessage(),
                'unexpected exception message'
            );
        } catch (\Exception $e) {
            $this->fail(': unexpected exception ('. get_class($e) .') '. $e->getMessage());
        }
    }

    /**
     * Test fetch of bad id record
     */
    public function testBadIdFetch()
    {
        // ensure fetch fails for a bad Id.
        try {
            Key::fetch('te/st');
            $this->fail("Fetch should fail for a il-formated key.");
        } catch (\PHPUnit\Framework\AssertionFailedError $e) {
            $this->fail($e->getMessage());
        } catch (\InvalidArgumentException $e) {
            $this->assertSame(
                "Must supply a valid id to fetch.",
                $e->getMessage(),
                'unexpected exception message'
            );
        } catch (\Exception $e) {
            $this->fail(': unexpected exception ('. get_class($e) .') '. $e->getMessage());
        }
    }

    /**
     * test bad values for setId
     */
    public function testBadSetId()
    {
        $tests = array(
            array(
                'title' => __LINE__." leading minus",
                'value' => '-test'
            ),
            array(
                'title' => __LINE__." forward slash",
                'value' => 'te/st'
            ),
            array(
                'title' => __LINE__." all numeric",
                'value' => '1234'
            ),
        );

        foreach ($tests as $test) {
            // ensure fetch fails for a non-existant key.
            try {
                $key = new Key;
                $key->setId($test['value']);
                $this->fail($test['title'].': unexpected success');
            } catch (\PHPUnit\Framework\AssertionFailedError $e) {
                $this->fail($e->getMessage());
            } catch (\InvalidArgumentException $e) {
                $this->assertSame(
                    "Cannot set id. Id is invalid.",
                    $e->getMessage(),
                    $test['title'].': unexpected exception message'
                );
            } catch (\Exception $e) {
                $this->fail($test['title'].': : unexpected exception ('. get_class($e) .') '. $e->getMessage());
            }
        }
    }

    /**
     * Test exists
     */
    public function testExists()
    {
        // ensure id-exists returns false for ill formatted key
        $this->assertFalse(Key::exists("-alsdjf"), "Leading - key id should not exist.");
        $this->assertFalse(Key::exists("als/djf"), "Forward slash key id should not exist.");

        // ensure id-exists returns false for non-existant key
        $this->assertFalse(Key::exists("alsdjf"), "Given key id should not exist.");

        // create key and ensure it exists.
        $group = new Key;
        $group->setId('test')
            ->set('tester');
        $this->assertTrue(Key::exists("test"), "Given key id should exist.");
    }

    /**
     * Test the increment function
     */
    public function testIncrement()
    {
        $key = new Key;

        // Test key that already exists, starting at 0
        $key->setId('existing')->set(0);
        $this->assertSame(
            "1",
            $key->increment(),
            'Expected matching value when starting at 0'
        );
        $this->assertSame(
            "1",
            Key::fetch('existing')->get(),
            'Expected matching value when starting at 0 on independent fetch'
        );
        $this->assertSame(
            "2",
            $key->increment(),
            'Expected matching value after second increment'
        );
        $this->assertSame(
            "2",
            Key::fetch('existing')->get(),
            'Expected matching value after second increment on independent fetch'
        );

        // Test key that already exists starting at 1
        $key->set(1);
        $this->assertSame(
            "2",
            $key->increment(),
            'Expected matching value when starting at 2'
        );

        // Test increment will create a key if it doesn't exist
        $key = new Key;
        $key->setId('newKey');
        $this->assertSame(
            "1",
            $key->increment(),
            'Expected matching value for new key'
        );
        $this->assertSame(
            "1",
            Key::fetch('newKey')->get(),
            'Expected matching value for new key on independent fetch'
        );
    }

    /**
     * Test the increment function with bad starting value
     */
    public function testBadIncrement()
    {
        // Test key that already exists, starting at 'bad'
        try {
            $key = new Key;
            $key->setId('existing')->set('bad');
            $key->increment();
            $this->fail("Increment should fail for a il-valued key.");
        } catch (\PHPUnit\Framework\AssertionFailedError $e) {
            $this->fail($e->getMessage());
        } catch (\P4\Exception $e) {
            $this->assertSame(
                "Command failed: Can't increment counter 'existing' - value is not numeric.",
                $e->getMessage(),
                'unexpected exception message'
            );
        } catch (\Exception $e) {
            $this->fail(': unexpected exception ('. get_class($e) .') '. $e->getMessage());
        }
    }

    /**
     * Test the delete function
     */
    public function testDelete()
    {
        $key = new Key;
        $key->setId('test')->set('testValue');

        $this->assertTrue(Key::exists('test'), 'expected test entry to exist');

        $key->delete('test');
        $this->assertFalse(Key::exists('test'), 'expected test entry was deleted');

        $keys = Key::fetchAll();
        $this->assertFalse(
            in_array('test', $keys->invoke('getId')),
            'expected deleted entry would not be returned by fetchall'
        );
    }

    /**
     * Test the delete function with non-existent id
     */
    public function testMissingIdDelete()
    {
        try {
            $key = new Key;
            $key->setId('missing')->delete();
            $this->fail("Delete should fail for a missing key.");
        } catch (\PHPUnit\Framework\AssertionFailedError $e) {
            $this->fail($e->getMessage());
        } catch (\P4\Exception $e) {
            $this->assertSame(
                "Cannot delete entry. Id does not exist.",
                $e->getMessage(),
                'unexpected exception message'
            );
        } catch (\Exception $e) {
            $this->fail(': unexpected exception ('. get_class($e) .') '. $e->getMessage());
        }
    }

    /**
     * Test the delete function with no id
     */
    public function testNoIdDelete()
    {
        try {
            $key = new Key;
            $key->delete();
            $this->fail("Delete should fail when no id is set.");
        } catch (\PHPUnit\Framework\AssertionFailedError $e) {
            $this->fail($e->getMessage());
        } catch (\P4\Exception $e) {
            $this->assertSame(
                "Cannot delete. No id has been set.",
                $e->getMessage(),
                'unexpected exception message'
            );
        } catch (\Exception $e) {
            $this->fail(': unexpected exception ('. get_class($e) .') '. $e->getMessage());
        }
    }
}
# Change User Description Committed
#1 18730 Liz Lam clean up code and move things around