ProtectionsTest.php #1

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

namespace P4Test\Spec;

use P4Test\TestCase;
use P4\Spec\Protections;

class ProtectionsTest extends TestCase
{
    /**
     * Test getting values
     */
    public function testGet()
    {
        // Test in-memory default values
        $protections = new Protections;
        $this->assertSame(
            array('Protections' => array()),
            $protections->get(),
            'Expected in-memory default values to match'
        );

        // Test server default values
        $protections = Protections::fetch();
        $expected = array (
            'Protections' => array (
                0 => array (
                    'mode' => 'write',
                    'type' => 'user',
                    'name' => '*',
                    'host' => '*',
                    'path' => '//...',
                ),
                1 => array (
                    'mode' => 'super',
                    'type' => 'user',
                    'name' => 'tester',
                    'host' => '*',
                    'path' => '//...',
                ),
            ),
        );

        $this->assertSame(
            $expected,
            $protections->get(),
            'Expected default values to match'
        );

        // set new values.
        $values = array(
            array(
                'mode'  => 'super',
                'type'  => 'user',
                'name'  => '*',
                'host'  => '*',
                'path'  => '//...'
            )
        );

        $protections->setProtections($values);

        // Verify instance reflects updated values via accessor
        $this->assertSame(
            $values,
            $protections->getProtections(),
            'Expected instance values to match'
        );

        // Verify field and accessor give same result
        $this->assertSame(
            $protections->get('Protections'),
            $protections->getProtections(),
            'Expected instance values in field to match accessor'
        );

        $this->assertSame(
            array('Protections' => $values),
            $protections->get(),
            'Expected instance values array to match'
        );

        // test save.
        $protections->save();

        $protections = Protections::fetch();

        $this->assertSame(
            $values,
            $protections->getProtections(),
            'Expected saved values to match'
        );

        // Verify field and accessor give same result
        $this->assertSame(
            $protections->get('Protections'),
            $protections->getProtections(),
            'Expected saved values in field to match accessor'
        );

        $this->assertSame(
            array('Protections' => $values),
            $protections->get(),
            'Expected saved values array to match'
        );
    }

    /**
     * Test setting valid and invalid values.
     */
    public function testSet()
    {
        $tests = array(
            array(
                'label' => __LINE__ . " string input",
                'value' => "write user * * //...",
                'error' => true
            ),
            array(
                'label' => __LINE__ . " bool input",
                'value' => true,
                'error' => true
            ),
            array(
                'label' => __LINE__ . " string input, doubled-up space",
                'value' => array("writer  user * * //..."),
                'error' => true
            ),
            array(
                'label' => __LINE__ . " string input, space in field",
                'value' => array("writ er user * * //..."),
                'error' => true
            ),
            array(
                'label' => __LINE__ . " string input, missing field",
                'value' => array("writer * * //..."),
                'error' => true
            ),
            array(
                'label' => __LINE__ . " string input, space in unquoted path",
                'value' => array("writ er user * * //test path/..."),
                'error' => true
            ),
            array(
                'label' => __LINE__ . " array input, name has space",
                'value' => array (
                    0 => array (
                        'mode' => "write",
                        'type' => "user",
                        'name' => "* ",
                        'host' => "*",
                        'path' => "//test with spaces/..."
                    )
                ),
                'error' => true,
            ),
            array(
                'label' => __LINE__ . " array input, missing type",
                'value' => array (
                    0 => array (
                        'mode' => "write ",
                        'name' => "*",
                        'host' => "*",
                        'path' => "//test with spaces/..."
                    )
                ),
                'error' => true,
            ),
            array(
                'label' => __LINE__ . " array input, missing path",
                'value' => array (
                    0 => array (
                        'mode' => "write",
                        'type' => "user",
                        'name' => "*",
                        'host' => "*",
                    )
                ),
                'error' => true,
            ),
            array(
                'label' => __LINE__ . " one string input, path has spaces.",
                'value' => array('write user * * "//test with spaces/..."'),
                'error' => false,
                'out'   => array (
                    0 => array (
                        'mode' => "write",
                        'type' => "user",
                        'name' => "*",
                        'host' => "*",
                        'path' => "//test with spaces/..."
                    )
                )
            ),
            array(
                'label' => __LINE__ . " one array input, path has spaces.",
                'value'   => array (
                    0 => array (
                        'mode' => "write",
                        'type' => "user",
                        'name' => "*",
                        'host' => "*",
                        'path' => "//test with spaces/..."
                    )
                ),
                'error' => false,
            ),
            array(
                'label' => __LINE__ . " one string input.",
                'value' => array("write user * * //..."),
                'error' => false,
                'out'   => array (
                    0 => array (
                        'mode' => "write",
                        'type' => "user",
                        'name' => "*",
                        'host' => "*",
                        'path' => "//..."
                    )
                )
            ),
            array(
                'label' => __LINE__ . " four string input",
                'value' => array(
                    "write user * * //...",
                    "read user bob * //test1/...",
                    "review group testGroup * //test2/...",
                    "open user * example.com //test3/..."
                ),
                'out'   => array (
                    0 => array (
                        'mode' => "write",
                        'type' => "user",
                        'name' => "*",
                        'host' => "*",
                        'path' => "//..."
                    ),
                    1 => array (
                        'mode' => "read",
                        'type' => "user",
                        'name' => "bob",
                        'host' => "*",
                        'path' => "//test1/..."
                    ),
                    2 => array (
                        'mode' => "review",
                        'type' => "group",
                        'name' => "testGroup",
                        'host' => "*",
                        'path' => "//test2/..."
                    ),
                    3 => array (
                        'mode' => "open",
                        'type' => "user",
                        'name' => "*",
                        'host' => "example.com",
                        'path' => "//test3/..."
                    )
                ),
                'error' => false
            ),
            array(
                'label' => __LINE__ . " four array input",
                'value'   => array (
                    0 => array (
                        'mode' => "write",
                        'type' => "user",
                        'name' => "*",
                        'host' => "*",
                        'path' => "//..."
                    ),
                    1 => array (
                        'mode' => "read",
                        'type' => "user",
                        'name' => "bob",
                        'host' => "*",
                        'path' => "//test1/..."
                    ),
                    2 => array (
                        'mode' => "review",
                        'type' => "group",
                        'name' => "testGroup",
                        'host' => "*",
                        'path' => "//test2/..."
                    ),
                    3 => array (
                        'mode' => "open",
                        'type' => "user",
                        'name' => "*",
                        'host' => "example.com",
                        'path' => "//test3/..."
                    )
                ),
                'error' => false
            ),
            array(
                'label' => __LINE__ . " mixed string/array input",
                'value' => array(
                    "write user * * //...",
                    array (
                        'mode' => "read",
                        'type' => "user",
                        'name' => "bob",
                        'host' => "*",
                        'path' => "//test1/..."
                    ),
                    'review group testGroup * "//test2 with spaces/..."',
                    3 => array (
                        'mode' => "open",
                        'type' => "user",
                        'name' => "*",
                        'host' => "example.com",
                        'path' => "//test3/..."
                    )
                ),
                'out'   => array (
                    0 => array (
                        'mode' => "write",
                        'type' => "user",
                        'name' => "*",
                        'host' => "*",
                        'path' => "//..."
                    ),
                    1 => array (
                        'mode' => "read",
                        'type' => "user",
                        'name' => "bob",
                        'host' => "*",
                        'path' => "//test1/..."
                    ),
                    2 => array (
                        'mode' => "review",
                        'type' => "group",
                        'name' => "testGroup",
                        'host' => "*",
                        'path' => "//test2 with spaces/..."
                    ),
                    3 => array (
                        'mode' => "open",
                        'type' => "user",
                        'name' => "*",
                        'host' => "example.com",
                        'path' => "//test3/..."
                    )
                ),
                'error' => false
            ),
        );

        foreach ($tests as $test) {
            $label = $test['label'];

            $protect = new Protections;

            try {
                $protect->setProtections($test['value']);

                if ($test['error']) {
                    $this->fail("$label: Unexpected success.");
                }

                $expected = array_key_exists('out', $test) ? $test['out'] : $test['value'];

                $this->assertSame(
                    $expected,
                    $protect->getProtections(),
                    "$label: Unexpected Output"
                );
            } catch (\InvalidArgumentException $e) {
                if (!$test['error']) {
                    $this->fail("$label: Unexpected failure.");
                } else {
                    $this->assertTrue(true, "$label: Expected exception found");
                }
            } catch (\PHPUnit\Framework\AssertionFailedError $e) {
                $this->fail($e->getMessage());
            } catch (\Exception $e) {
                $this->fail(
                    "$label: Unexpected Exception (" . get_class($e) . '): ' . $e->getMessage()
                );
            }
        }
    }

    /**
     * Test removing values
     */
    public function testRemove()
    {
        $values = array (
            0 => array (
                'mode' => 'write',
                'type' => 'user',
                'name' => '*',
                'host' => '*',
                'path' => '//...',
            ),
            1 => array (
                'mode' => 'super',
                'type' => 'user',
                'name' => 'tester',
                'host' => '*',
                'path' => '//...',
            ),
            2 => array(
                'mode'  => 'super',
                'type'  => 'user',
                'name'  => '*',
                'host'  => '*',
                'path'  => '//...'
            ),
        );
        $expected = array_slice($values, 0, 2);

        $protections = Protections::fetch();
        $protections->setProtections($values);
        $protections->removeProtection('super', 'user', '*', '*', '"//..."');

        // Verify instance reflects updated values via accessor
        $this->assertSame(
            $expected,
            $protections->getProtections(),
            'Expected instance values to match'
        );

        // test save.
        $protections->save();

        $protections = Protections::fetch();

        $this->assertSame(
            $expected,
            $protections->getProtections(),
            'Expected saved values to match'
        );
    }

    /**
     * Test adding values
     */
    public function testAdd()
    {
        $protections = Protections::fetch();
        $expected = array (
            0 => array (
                'mode' => 'write',
                'type' => 'user',
                'name' => '*',
                'host' => '*',
                'path' => '//...',
            ),
            1 => array (
                'mode' => 'super',
                'type' => 'user',
                'name' => 'tester',
                'host' => '*',
                'path' => '//...',
            ),
            2 => array(
                'mode'  => 'super',
                'type'  => 'user',
                'name'  => '*',
                'host'  => '*',
                'path'  => '//...'
            ),
        );

        $protections->addProtection('super', 'user', '*', '*', '//...');

        // Verify instance reflects updated values via accessor
        $this->assertSame(
            $expected,
            $protections->getProtections(),
            'Expected instance values to match'
        );

        // test save.
        $protections->save();

        $protections = Protections::fetch();

        $this->assertSame(
            $expected,
            $protections->getProtections(),
            'Expected saved values to match'
        );
    }
}
# Change User Description Committed
#1 18730 Liz Lam clean up code and move things around