3 namespace Drupal\KernelTests\Core\Element;
5 use Drupal\Core\Form\FormInterface;
6 use Drupal\Core\Form\FormState;
7 use Drupal\Core\Form\FormStateInterface;
8 use Drupal\Core\Render\Element\PathElement;
10 use Drupal\KernelTests\KernelTestBase;
11 use Drupal\user\Entity\Role;
12 use Drupal\user\Entity\User;
15 * Tests PathElement validation and conversion functionality.
19 class PathElementFormTest extends KernelTestBase implements FormInterface {
24 * @var \Drupal\user\UserInterface
33 public static $modules = ['system', 'user'];
38 protected function setUp() {
40 $this->installSchema('system', ['sequences', 'key_value_expire']);
41 $this->installEntitySchema('user');
42 \Drupal::service('router.builder')->rebuild();
43 /** @var \Drupal\user\RoleInterface $role */
44 $role = Role::create([
48 $role->grantPermission('link to any page');
50 $this->testUser = User::create([
52 'mail' => 'foobar@example.com',
54 $this->testUser->addRole($role->id());
55 $this->testUser->save();
56 \Drupal::service('current_user')->setAccount($this->testUser);
62 public function getFormId() {
63 return 'test_path_element';
69 public function buildForm(array $form, FormStateInterface $form_state) {
70 // A required validated path.
71 $form['required_validate'] = [
74 '#title' => 'required_validate',
75 '#convert_path' => PathElement::CONVERT_NONE,
78 // A non validated required path.
79 $form['required_non_validate'] = [
82 '#title' => 'required_non_validate',
83 '#convert_path' => PathElement::CONVERT_NONE,
84 '#validate_path' => FALSE,
87 // A non required validated path.
88 $form['optional_validate'] = [
91 '#title' => 'optional_validate',
92 '#convert_path' => PathElement::CONVERT_NONE,
95 // A non required converted path.
96 $form['optional_validate'] = [
99 '#title' => 'optional_validate',
100 '#convert_path' => PathElement::CONVERT_ROUTE,
103 // A converted required validated path.
104 $form['required_validate_route'] = [
107 '#title' => 'required_validate_route',
110 // A converted required validated path.
111 $form['required_validate_url'] = [
114 '#title' => 'required_validate_url',
115 '#convert_path' => PathElement::CONVERT_URL,
120 '#value' => t('Submit'),
129 public function submitForm(array &$form, FormStateInterface $form_state) {}
132 * Form validation handler.
135 * An associative array containing the structure of the form.
136 * @param \Drupal\Core\Form\FormStateInterface $form_state
137 * The current state of the form.
139 public function validateForm(array &$form, FormStateInterface $form_state) {}
142 * Tests that default handlers are added even if custom are specified.
144 public function testPathElement() {
145 $form_state = (new FormState())
147 'required_validate' => 'user/' . $this->testUser->id(),
148 'required_non_validate' => 'magic-ponies',
149 'required_validate_route' => 'user/' . $this->testUser->id(),
150 'required_validate_url' => 'user/' . $this->testUser->id(),
152 $form_builder = $this->container->get('form_builder');
153 $form_builder->submitForm($this, $form_state);
156 $this->assertEqual(count($form_state->getErrors()), 0);
157 $this->assertEqual($form_state->getValue('required_validate_route'), [
158 'route_name' => 'entity.user.canonical',
159 'route_parameters' => [
160 'user' => $this->testUser->id(),
163 /** @var \Drupal\Core\Url $url */
164 $url = $form_state->getValue('required_validate_url');
165 $this->assertTrue($url instanceof Url);
166 $this->assertEqual($url->getRouteName(), 'entity.user.canonical');
167 $this->assertEqual($url->getRouteParameters(), [
168 'user' => $this->testUser->id(),
172 $form_state = (new FormState())
174 'required_non_validate' => 'magic-ponies',
175 'required_validate_route' => 'user/' . $this->testUser->id(),
176 'required_validate_url' => 'user/' . $this->testUser->id(),
178 $form_builder->submitForm($this, $form_state);
179 $errors = $form_state->getErrors();
180 // Should be missing 'required_validate' field.
181 $this->assertEqual(count($errors), 1);
182 $this->assertEqual($errors, ['required_validate' => t('@name field is required.', ['@name' => 'required_validate'])]);
184 // Test invalid parameters.
185 $form_state = (new FormState())
187 'required_validate' => 'user/74',
188 'required_non_validate' => 'magic-ponies',
189 'required_validate_route' => 'user/74',
190 'required_validate_url' => 'user/74',
192 $form_builder = $this->container->get('form_builder');
193 $form_builder->submitForm($this, $form_state);
196 $errors = $form_state->getErrors();
197 $this->assertEqual(count($errors), 3);
198 $this->assertEqual($errors, [
199 'required_validate' => t('This path does not exist or you do not have permission to link to %path.', ['%path' => 'user/74']),
200 'required_validate_route' => t('This path does not exist or you do not have permission to link to %path.', ['%path' => 'user/74']),
201 'required_validate_url' => t('This path does not exist or you do not have permission to link to %path.', ['%path' => 'user/74']),