More updates to stop using dev or alpha or beta versions.
[yaffs-website] / web / core / tests / Drupal / Tests / Core / Entity / EntityConstraintViolationListTest.php
1 <?php
2
3 namespace Drupal\Tests\Core\Entity;
4
5 use Drupal\Core\Entity\EntityConstraintViolationList;
6 use Drupal\Core\Entity\FieldableEntityInterface;
7 use Drupal\Core\Session\AccountInterface;
8 use Drupal\entity_test\Plugin\Validation\Constraint\EntityTestCompositeConstraint;
9 use Drupal\Tests\UnitTestCase;
10 use Symfony\Component\Validator\ConstraintViolation;
11
12 /**
13  * @coversDefaultClass \Drupal\Core\Entity\EntityConstraintViolationList
14  * @group entity
15  */
16 class EntityConstraintViolationListTest extends UnitTestCase {
17
18   /**
19    * @covers ::filterByFields
20    */
21   public function testFilterByFields() {
22     $account = $this->prophesize('\Drupal\Core\Session\AccountInterface')->reveal();
23     $entity = $this->setupEntity($account);
24
25     $constraint_list = $this->setupConstraintListWithoutCompositeConstraint($entity);
26     $violations = iterator_to_array($constraint_list);
27
28     $this->assertSame($constraint_list->filterByFields(['name']), $constraint_list);
29     $this->assertCount(4, $constraint_list);
30     $this->assertArrayEquals(array_values(iterator_to_array($constraint_list)), [$violations[2], $violations[3], $violations[4], $violations[5]]);
31   }
32
33   /**
34    * @covers ::filterByFields
35    */
36   public function testFilterByFieldsWithCompositeConstraints() {
37     $account = $this->prophesize('\Drupal\Core\Session\AccountInterface')->reveal();
38     $entity = $this->setupEntity($account);
39
40     $constraint_list = $this->setupConstraintListWithCompositeConstraint($entity);
41     $violations = iterator_to_array($constraint_list);
42
43     $this->assertSame($constraint_list->filterByFields(['name']), $constraint_list);
44     $this->assertCount(4, $constraint_list);
45     $this->assertArrayEquals(array_values(iterator_to_array($constraint_list)), [$violations[2], $violations[3], $violations[4], $violations[5]]);
46   }
47
48   /**
49    * @covers ::filterByFieldAccess
50    */
51   public function testFilterByFieldAccess() {
52     $account = $this->prophesize('\Drupal\Core\Session\AccountInterface')->reveal();
53     $entity = $this->setupEntity($account);
54
55     $constraint_list = $this->setupConstraintListWithoutCompositeConstraint($entity);
56     $violations = iterator_to_array($constraint_list);
57
58     $this->assertSame($constraint_list->filterByFieldAccess($account), $constraint_list);
59     $this->assertCount(4, $constraint_list);
60     $this->assertArrayEquals(array_values(iterator_to_array($constraint_list)), [$violations[2], $violations[3], $violations[4], $violations[5]]);
61   }
62
63   /**
64    * @covers ::filterByFieldAccess
65    */
66   public function testFilterByFieldAccessWithCompositeConstraint() {
67     $account = $this->prophesize('\Drupal\Core\Session\AccountInterface')->reveal();
68     $entity = $this->setupEntity($account);
69
70     $constraint_list = $this->setupConstraintListWithCompositeConstraint($entity);
71     $violations = iterator_to_array($constraint_list);
72
73     $this->assertSame($constraint_list->filterByFieldAccess($account), $constraint_list);
74     $this->assertCount(4, $constraint_list);
75     $this->assertArrayEquals(array_values(iterator_to_array($constraint_list)), [$violations[2], $violations[3], $violations[4], $violations[5]]);
76   }
77
78   /**
79    * Builds the entity.
80    *
81    * @param \Drupal\Core\Session\AccountInterface $account
82    *   An account.
83    *
84    * @return \Drupal\Core\Field\FieldItemListInterface
85    *   A fieldable entity.
86    */
87   protected function setupEntity(AccountInterface $account) {
88     $prophecy = $this->prophesize('\Drupal\Core\Field\FieldItemListInterface');
89     $prophecy->access('edit', $account)
90       ->willReturn(FALSE);
91     $name_field_item_list = $prophecy->reveal();
92
93     $prophecy = $this->prophesize('\Drupal\Core\Field\FieldItemListInterface');
94     $prophecy->access('edit', $account)
95       ->willReturn(TRUE);
96     $type_field_item_list = $prophecy->reveal();
97
98     $prophecy = $this->prophesize('\Drupal\Core\Entity\FieldableEntityInterface');
99     $prophecy->hasField('name')
100       ->willReturn(TRUE);
101     $prophecy->hasField('type')
102       ->willReturn(TRUE);
103     $prophecy->get('name')
104       ->willReturn($name_field_item_list);
105     $prophecy->get('type')
106       ->willReturn($type_field_item_list);
107
108     return $prophecy->reveal();
109   }
110
111   /**
112    * Builds an entity constraint violation list without composite constraints.
113    *
114    * @param \Drupal\Core\Entity\FieldableEntityInterface $entity
115    *   A fieldable entity.
116    *
117    * @return \Drupal\Core\Entity\EntityConstraintViolationList
118    *   The entity constraint violation list.
119    */
120   protected function setupConstraintListWithoutCompositeConstraint(FieldableEntityInterface $entity) {
121     $violations = [];
122
123     // Add two violations to two specific fields.
124     $violations[] = new ConstraintViolation('test name violation', '', [], '', 'name', 'invalid');
125     $violations[] = new ConstraintViolation('test name violation2', '', [], '', 'name', 'invalid');
126
127     $violations[] = new ConstraintViolation('test type violation', '', [], '', 'type', 'invalid');
128     $violations[] = new ConstraintViolation('test type violation2', '', [], '', 'type', 'invalid');
129
130     // Add two entity level specific violations.
131     $violations[] = new ConstraintViolation('test entity violation', '', [], '', '', 'invalid');
132     $violations[] = new ConstraintViolation('test entity violation2', '', [], '', '', 'invalid');
133
134     return new EntityConstraintViolationList($entity, $violations);
135   }
136
137   /**
138    * Builds an entity constraint violation list with composite constraints.
139    *
140    * @param \Drupal\Core\Entity\FieldableEntityInterface $entity
141    *   A fieldable entity.
142    *
143    * @return \Drupal\Core\Entity\EntityConstraintViolationList
144    *   The entity constraint violation list.
145    */
146   protected function setupConstraintListWithCompositeConstraint(FieldableEntityInterface $entity) {
147     $violations = [];
148
149     // Add two violations to two specific fields.
150     $violations[] = new ConstraintViolation('test name violation', '', [], '', 'name', 'invalid');
151     $violations[] = new ConstraintViolation('test name violation2', '', [], '', 'name', 'invalid');
152
153     $violations[] = new ConstraintViolation('test type violation', '', [], '', 'type', 'invalid');
154     $violations[] = new ConstraintViolation('test type violation2', '', [], '', 'type', 'invalid');
155
156     // Add two entity level specific violations with a compound constraint.
157     $composite_constraint = new EntityTestCompositeConstraint();
158     $violations[] = new ConstraintViolation('test composite violation', '', [], '', '', 'invalid', NULL, NULL, $composite_constraint);
159     $violations[] = new ConstraintViolation('test composite violation2', '', [], '', '', 'invalid', NULL, NULL, $composite_constraint);
160     return new EntityConstraintViolationList($entity, $violations);
161   }
162
163 }