Completed
Push — master ( 6f6131...7b9880 )
by Artem
02:11
created

Tests/Form/EnumTypeGuesserTest.php (10 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
/*
3
 * This file is part of the FreshDoctrineEnumBundle
4
 *
5
 * (c) Artem Genvald <[email protected]>
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
11
namespace Fresh\DoctrineEnumBundle\Tests\DForm;
12
13
use Fresh\DoctrineEnumBundle\Form\EnumTypeGuesser;
14
use Fresh\DoctrineEnumBundle\Tests\Fixtures\DBAL\Types\BasketballPositionType;
15
use Fresh\DoctrineEnumBundle\Tests\Fixtures\DBAL\Types\NotAChildType;
16
use Fresh\DoctrineEnumBundle\Util\LegacyFormHelper;
17
use Symfony\Component\Form\Guess\Guess;
18
use Symfony\Component\Form\Guess\TypeGuess;
19
20
/**
21
 * EnumTypeGuesserTest.
22
 *
23
 * @author Artem Genvald <[email protected]>
24
 */
25
class EnumTypeGuesserTest extends \PHPUnit_Framework_TestCase
26
{
27
    public function testNullResultWhenClassMetadataNotFound()
28
    {
29
        /** @var EnumTypeGuesser|\PHPUnit_Framework_MockObject_MockObject $enumTypeGuesser */
30
        $enumTypeGuesser = $this->getMockBuilder('\Fresh\DoctrineEnumBundle\Form\EnumTypeGuesser')
31
            ->disableOriginalConstructor()
32
            ->setMethods(['getMetadata'])
33
            ->getMock();
34
35
        $enumTypeGuesser->expects($this->once())
0 ignored issues
show
The method expects does only exist in PHPUnit_Framework_MockObject_MockObject, but not in Fresh\DoctrineEnumBundle\Form\EnumTypeGuesser.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
36
            ->method('getMetadata')
37
            ->willReturn(null);
38
39
        $this->assertNull($enumTypeGuesser->guessType('\stdClass', 'position'));
0 ignored issues
show
The method guessType does only exist in Fresh\DoctrineEnumBundle\Form\EnumTypeGuesser, but not in PHPUnit_Framework_MockObject_MockObject.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
40
    }
41
42
    public function testNullResultWhenEnumTypeNotRegistered()
43
    {
44
        /** @var EnumTypeGuesser|\PHPUnit_Framework_MockObject_MockObject $enumTypeGuesser */
45
        $enumTypeGuesser = $this->getMockBuilder('\Fresh\DoctrineEnumBundle\Form\EnumTypeGuesser')
46
                                ->disableOriginalConstructor()
47
                                ->setMethods(['getMetadata'])
48
                                ->getMock();
49
50
        $metadata = $this->getMockBuilder('\Doctrine\ORM\Mapping\ClassMetadataInfo')
51
            ->disableOriginalConstructor()
52
            ->setMethods(['getTypeOfField'])
53
            ->getMock();
54
55
        $metadata->expects($this->once())
56
                 ->method('getTypeOfField')
57
                 ->willReturn('unregistered_enum_type');
58
59
        $enumTypeGuesser->expects($this->once())
0 ignored issues
show
The method expects does only exist in PHPUnit_Framework_MockObject_MockObject, but not in Fresh\DoctrineEnumBundle\Form\EnumTypeGuesser.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
60
                        ->method('getMetadata')
61
                        ->willReturn([$metadata]);
62
63
        $this->assertNull($enumTypeGuesser->guessType('\stdClass', 'position'));
0 ignored issues
show
The method guessType does only exist in Fresh\DoctrineEnumBundle\Form\EnumTypeGuesser, but not in PHPUnit_Framework_MockObject_MockObject.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
64
    }
65
66
    /**
67
     * @expectedException \Fresh\DoctrineEnumBundle\Exception\EnumTypeIsRegisteredButClassDoesNotExistException
68
     */
69 View Code Duplication
    public function testExceptionWhenClassDoesNotExist()
70
    {
71
        $managerRegistry = $this->getMockBuilder('\Doctrine\Common\Persistence\ManagerRegistry')
72
                                ->disableOriginalConstructor()
73
                                ->getMock();
74
        $registeredTypes = [
75
            'stub' => [
76
                'class' => '\Acme\Foo\Bar\Baz',
77
            ]
78
        ];
79
80
        /** @var EnumTypeGuesser|\PHPUnit_Framework_MockObject_MockObject $enumTypeGuesser */
81
        $enumTypeGuesser = $this->getMockBuilder('\Fresh\DoctrineEnumBundle\Form\EnumTypeGuesser')
82
                                ->setConstructorArgs([$managerRegistry, $registeredTypes])
83
                                ->setMethods(['getMetadata'])
84
                                ->getMock();
85
86
        $metadata = $this->getMockBuilder('\Doctrine\ORM\Mapping\ClassMetadataInfo')
87
                         ->disableOriginalConstructor()
88
                         ->setMethods(['getTypeOfField'])
89
                         ->getMock();
90
91
        $metadata->expects($this->once())
92
                 ->method('getTypeOfField')
93
                 ->willReturn('stub');
94
95
        $enumTypeGuesser->expects($this->once())
0 ignored issues
show
The method expects does only exist in PHPUnit_Framework_MockObject_MockObject, but not in Fresh\DoctrineEnumBundle\Form\EnumTypeGuesser.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
96
                        ->method('getMetadata')
97
                        ->willReturn([$metadata]);
98
99
        $this->assertNull($enumTypeGuesser->guessType('\stdClass', 'position'));
0 ignored issues
show
The method guessType does only exist in Fresh\DoctrineEnumBundle\Form\EnumTypeGuesser, but not in PHPUnit_Framework_MockObject_MockObject.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
100
    }
101
102 View Code Duplication
    public function testNullResultWhenIsNotChildOfAbstractEnumType()
103
    {
104
        $managerRegistry = $this->getMockBuilder('\Doctrine\Common\Persistence\ManagerRegistry')
105
                                ->disableOriginalConstructor()
106
                                ->getMock();
107
        $registeredTypes = [
108
            'NotAChildType' => [
109
                'class' => NotAChildType::class,
110
            ]
111
        ];
112
113
        /** @var EnumTypeGuesser|\PHPUnit_Framework_MockObject_MockObject $enumTypeGuesser */
114
        $enumTypeGuesser = $this->getMockBuilder('\Fresh\DoctrineEnumBundle\Form\EnumTypeGuesser')
115
                                ->setConstructorArgs([$managerRegistry, $registeredTypes])
116
                                ->setMethods(['getMetadata'])
117
                                ->getMock();
118
119
        $metadata = $this->getMockBuilder('\Doctrine\ORM\Mapping\ClassMetadataInfo')
120
                         ->disableOriginalConstructor()
121
                         ->setMethods(['getTypeOfField'])
122
                         ->getMock();
123
124
        $metadata->expects($this->once())
125
                 ->method('getTypeOfField')
126
                 ->willReturn('NotAChildType');
127
128
        $enumTypeGuesser->expects($this->once())
0 ignored issues
show
The method expects does only exist in PHPUnit_Framework_MockObject_MockObject, but not in Fresh\DoctrineEnumBundle\Form\EnumTypeGuesser.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
129
                        ->method('getMetadata')
130
                        ->willReturn([$metadata]);
131
132
        $this->assertNull($enumTypeGuesser->guessType('\stdClass', 'position'));
0 ignored issues
show
The method guessType does only exist in Fresh\DoctrineEnumBundle\Form\EnumTypeGuesser, but not in PHPUnit_Framework_MockObject_MockObject.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
133
    }
134
135
    public function testSuccessfulTypeGuessing()
136
    {
137
        $managerRegistry = $this->getMockBuilder('\Doctrine\Common\Persistence\ManagerRegistry')
138
                                ->disableOriginalConstructor()
139
                                ->getMock();
140
        $registeredTypes = [
141
            'BasketballPositionType' => [
142
                'class' => BasketballPositionType::class,
143
            ]
144
        ];
145
146
        /** @var EnumTypeGuesser|\PHPUnit_Framework_MockObject_MockObject $enumTypeGuesser */
147
        $enumTypeGuesser = $this->getMockBuilder('\Fresh\DoctrineEnumBundle\Form\EnumTypeGuesser')
148
                                ->setConstructorArgs([$managerRegistry, $registeredTypes])
149
                                ->setMethods(['getMetadata'])
150
                                ->getMock();
151
152
        $metadata = $this->getMockBuilder('\Doctrine\ORM\Mapping\ClassMetadataInfo')
153
                         ->disableOriginalConstructor()
154
                         ->setMethods(['getTypeOfField', 'isNullable'])
155
                         ->getMock();
156
157
        $metadata->expects($this->once())
158
                 ->method('getTypeOfField')
159
                 ->willReturn('BasketballPositionType');
160
161
        $metadata->expects($this->once())
162
                 ->method('isNullable')
163
                 ->willReturn(true);
164
165
        $enumTypeGuesser->expects($this->once())
0 ignored issues
show
The method expects does only exist in PHPUnit_Framework_MockObject_MockObject, but not in Fresh\DoctrineEnumBundle\Form\EnumTypeGuesser.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
166
                        ->method('getMetadata')
167
                        ->willReturn([$metadata]);
168
169
        $typeGuess = new TypeGuess(
170
            LegacyFormHelper::getType('Symfony\Component\Form\Extension\Core\Type\ChoiceType'),
171
            [
172
                'choices'  => BasketballPositionType::getChoices(),
173
                'required' => false,
174
            ],
175
            Guess::VERY_HIGH_CONFIDENCE
176
        );
177
178
        $this->assertEquals($typeGuess, $enumTypeGuesser->guessType('\stdClass', 'position'));
0 ignored issues
show
The method guessType does only exist in Fresh\DoctrineEnumBundle\Form\EnumTypeGuesser, but not in PHPUnit_Framework_MockObject_MockObject.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
179
    }
180
}
181