ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
URLBuilderTest.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
21 namespace ILIAS\UI;
22 
24 
25 class URLBuilderTest extends TestCase
26 {
27  private readonly \ILIAS\Data\URI $URI_COMPLETE;
28 
29  protected function setUp(): void
30  {
31  $this->URI_COMPLETE = new \ILIAS\Data\URI('https://www.ilias.de/foo/bar?var1=42&var2=foo#12345');
32  }
33 
34  public function testGetUrl(): void
35  {
36  $url = new URLBuilder($this->URI_COMPLETE);
37  $this->assertInstanceOf(\ILIAS\Data\URI::class, $url->buildURI());
38  $this->assertEquals('https://www.ilias.de/foo/bar?var1=42&var2=foo#12345', (string) $url->buildURI());
39  }
40 
41  public function testAcquireParam(): void
42  {
43  $url = new URLBuilder($this->URI_COMPLETE);
44  $result = $url->acquireParameter(['test'], 'title');
45  $this->assertInstanceOf(URLBuilder::class, $result[0]);
46  $this->assertEquals(
47  'https://www.ilias.de/foo/bar?var1=42&var2=foo&test' . URLBuilder::SEPARATOR . 'title=#12345',
48  (string) $result[0]->buildURI()
49  );
50  $this->assertInstanceOf(URLBuilderToken::class, $result[1]);
51  $this->assertEquals('test' . URLBuilder::SEPARATOR . 'title', $result[1]->getName());
52  $this->assertNotEmpty($result[1]->getToken());
53  }
54 
55  public function testAcquireParamWithLongNamespace(): void
56  {
57  $url = new URLBuilder($this->URI_COMPLETE);
58  $result = $url->acquireParameter(['test', 'object', 'metadata'], 'title');
59  $this->assertInstanceOf(URLBuilder::class, $result[0]);
60  $this->assertEquals(
61  'https://www.ilias.de/foo/bar?var1=42&var2=foo&test' . URLBuilder::SEPARATOR .
62  'object' . URLBuilder::SEPARATOR .
63  'metadata' . URLBuilder::SEPARATOR .
64  'title=#12345',
65  (string) $result[0]->buildURI()
66  );
67  $this->assertInstanceOf(URLBuilderToken::class, $result[1]);
68  $this->assertEquals(
69  'test' . URLBuilder::SEPARATOR .
70  'object' . URLBuilder::SEPARATOR .
71  'metadata' . URLBuilder::SEPARATOR .
72  'title',
73  $result[1]->getName()
74  );
75  $this->assertNotEmpty($result[1]->getToken());
76  }
77 
78  public function testAcquireParamWithValue(): void
79  {
80  $url = new URLBuilder($this->URI_COMPLETE);
81  $sep = URLBuilder::SEPARATOR;
82  $result = $url->acquireParameter(['test'], 'title', 'bar');
83  $this->assertInstanceOf(URLBuilder::class, $result[0]);
84  $this->assertEquals(
85  'https://www.ilias.de/foo/bar?var1=42&var2=foo&test' . $sep . 'title=bar#12345',
86  (string) $result[0]->buildURI()
87  );
88  $this->assertInstanceOf(URLBuilderToken::class, $result[1]);
89  $this->assertEquals('test' . $sep . 'title', $result[1]->getName());
90  $this->assertNotEmpty($result[1]->getToken());
91  }
92 
93  public function testAcquireParamWithSameName(): void
94  {
95  $url = new URLBuilder($this->URI_COMPLETE);
96  $sep = URLBuilder::SEPARATOR;
97  $result = $url->acquireParameter(['test'], 'title', 'foo');
98  $this->assertEquals(
99  'https://www.ilias.de/foo/bar?var1=42&var2=foo&test' . $sep . 'title=foo#12345',
100  (string) $result[0]->buildURI()
101  );
102  $this->assertEquals('test' . $sep . 'title', $result[1]->getName());
103 
104  $result2 = $result[0]->acquireParameter(['notatest'], 'title', 'bar');
105  $this->assertEquals(
106  'https://www.ilias.de/foo/bar?var1=42&var2=foo&test' . $sep . 'title=foo&notatest' . $sep . 'title=bar#12345',
107  (string) $result2[0]->buildURI()
108  );
109  $this->assertEquals('notatest' . $sep . 'title', $result2[1]->getName());
110  $this->assertNotEquals($result[1]->getToken(), $result2[1]->getToken());
111  }
112 
113  public function testWriteParam(): void
114  {
115  $url = new URLBuilder($this->URI_COMPLETE);
116  $sep = URLBuilder::SEPARATOR;
117  $result = $url->acquireParameter(['test'], 'title', 'bar');
118  $this->assertEquals(
119  'https://www.ilias.de/foo/bar?var1=42&var2=foo&test' . $sep . 'title=bar#12345',
120  (string) $result[0]->buildURI()
121  );
122 
123  $url = $result[0]->withParameter($result[1], 'foobar');
124  $this->assertInstanceOf(URLBuilder::class, $url);
125  $this->assertEquals(
126  'https://www.ilias.de/foo/bar?var1=42&var2=foo&test' . $sep . 'title=foobar#12345',
127  (string) $url->buildURI()
128  );
129 
130  $url = $result[0]->withParameter($result[1], ['foo', 'bar']);
131  $this->assertInstanceOf(URLBuilder::class, $url);
132  $this->assertEquals(
133  'https://www.ilias.de/foo/bar?var1=42&var2=foo'
134  . '&test' . $sep . urlencode('title[]') . '=foo'
135  . '&test' . $sep . urlencode('title[]') . '=bar'
136  . '#12345',
137  (string) $url->buildURI()
138  );
139  }
140 
141  public function testDeleteParam(): void
142  {
143  $url = new URLBuilder($this->URI_COMPLETE);
144  $sep = URLBuilder::SEPARATOR;
145  $result = $url->acquireParameter(['test'], 'title', 'bar');
146  $this->assertEquals(
147  'https://www.ilias.de/foo/bar?var1=42&var2=foo&test' . $sep . 'title=bar#12345',
148  (string) $result[0]->buildURI()
149  );
150 
151  $url = $result[0]->deleteParameter($result[1]);
152  $this->assertEquals('https://www.ilias.de/foo/bar?var1=42&var2=foo#12345', (string) $url->buildURI());
153  }
154 
155  public function testUrlTooLong(): void
156  {
157  $url = new URLBuilder($this->URI_COMPLETE);
158  $result = $url->acquireParameter(['test'], 'p0', random_bytes(URLBuilder::URL_MAX_LENGTH / 4));
159  $result = $result[0]->acquireParameter(['test'], 'p1', random_bytes(URLBuilder::URL_MAX_LENGTH / 4));
160  $result = $result[0]->acquireParameter(['test'], 'p2', random_bytes(URLBuilder::URL_MAX_LENGTH / 4));
161  $result = $result[0]->acquireParameter(['test'], 'p3', random_bytes(URLBuilder::URL_MAX_LENGTH / 4));
162  $this->expectException(\LengthException::class);
163  $output = $result[0]->buildURI();
164  }
165 
166  public function testRemoveAndAddFragment(): void
167  {
168  $url = new URLBuilder($this->URI_COMPLETE);
169  $url = $url->withFragment(''); // set fragment to empty
170  $this->assertInstanceOf(URLBuilder::class, $url);
171  $this->assertEquals('https://www.ilias.de/foo/bar?var1=42&var2=foo', (string) $url->buildURI());
172  $url = $url->withFragment(null); // unset fragment, use fragment from base URL if present
173  $this->assertInstanceOf(URLBuilder::class, $url);
174  $this->assertEquals('https://www.ilias.de/foo/bar?var1=42&var2=foo#12345', (string) $url->buildURI());
175  $url = $url->withFragment('54321'); // set fragment to value
176  $this->assertInstanceOf(URLBuilder::class, $url);
177  $this->assertEquals('https://www.ilias.de/foo/bar?var1=42&var2=foo#54321', (string) $url->buildURI());
178  }
179 
180  public function testWithUri(): void
181  {
182  $url = new URLBuilder($this->URI_COMPLETE);
183  $result = $url->acquireParameter(['test'], 'title', 'bar');
184  $url = $result[0]->withURI(
185  new \ILIAS\Data\URI('http://test.ilias.de/bar/foo?test' . URLBuilder::SEPARATOR . 'title=foo&var1=46#12345')
186  );
187  $this->assertEquals(
188  'http://test.ilias.de/bar/foo?test' . URLBuilder::SEPARATOR . 'title=bar&var1=46#12345',
189  (string) $url->buildURI()
190  );
191  }
192 
193  public function testRenderTokens(): void
194  {
195  $url = new URLBuilder($this->URI_COMPLETE);
196 
197  // One parameter
198  $result1 = $url->acquireParameter(['test', 'object'], 'title', 'bar');
199  $url = $result1[0];
200  $expected_token = 'new Map([["' . $result1[1]->getName() . '",'
201  . 'new il.UI.core.URLBuilderToken(["test","object"], "title", "' . $result1[1]->getToken() . '")]])';
202  $this->assertEquals($expected_token, $url->renderTokens([$result1[1]]));
203 
204  // Two parameters, but just rendered with one
205  $result2 = $url->acquireParameter(['test'], 'description', 'foo');
206  $url = $result2[0];
207  $this->assertEquals($expected_token, $url->renderTokens([$result1[1]]));
208 
209  // Two parameters with full render
210  $expected_token = 'new Map([["' . $result1[1]->getName() . '",'
211  . 'new il.UI.core.URLBuilderToken(["test","object"], "title", "' . $result1[1]->getToken() . '")],'
212  . '["' . $result2[1]->getName() . '",'
213  . 'new il.UI.core.URLBuilderToken(["test"], "description", "' . $result2[1]->getToken() . '")]])';
214  $this->assertEquals($expected_token, $url->renderTokens([$result1[1], $result2[1]]));
215  }
216 
217  public function testRenderObject(): void
218  {
219  $url = new URLBuilder($this->URI_COMPLETE);
220 
221  // One parameter
222  $result1 = $url->acquireParameter(['test', 'object'], 'title', 'bar');
223  $url = $result1[0];
224  $expected_token = 'new Map([["' . $result1[1]->getName() . '",'
225  . 'new il.UI.core.URLBuilderToken(["test","object"], "title", "' . $result1[1]->getToken() . '")]])';
226  $expected_object = 'new il.UI.core.URLBuilder(new URL("https://www.ilias.de/foo/bar?var1=42&var2=foo&'
227  . 'test' . URLBuilder::SEPARATOR . 'object' . URLBuilder::SEPARATOR . 'title=bar#12345"), ' . $expected_token . ')';
228  $this->assertEquals($expected_object, $url->renderObject([$result1[1]]));
229 
230  // Two parameters, but just rendered with one
231  $result2 = $url->acquireParameter(['test'], 'description', 'foo');
232  $url = $result2[0];
233  $expected_object = 'new il.UI.core.URLBuilder(new URL("https://www.ilias.de/foo/bar?var1=42&var2=foo&'
234  . 'test' . URLBuilder::SEPARATOR . 'object' . URLBuilder::SEPARATOR . 'title=bar&'
235  . 'test' . URLBuilder::SEPARATOR . 'description=foo#12345"), ' . $expected_token . ')';
236  $this->assertEquals($expected_object, $url->renderObject([$result1[1]]));
237 
238  // Two parameters with full render
239  $expected_token = 'new Map([["' . $result1[1]->getName() . '",'
240  . 'new il.UI.core.URLBuilderToken(["test","object"], "title", "' . $result1[1]->getToken() . '")],'
241  . '["' . $result2[1]->getName() . '",'
242  . 'new il.UI.core.URLBuilderToken(["test"], "description", "' . $result2[1]->getToken() . '")]])';
243  $expected_object = 'new il.UI.core.URLBuilder(new URL("https://www.ilias.de/foo/bar?var1=42&var2=foo&'
244  . 'test' . URLBuilder::SEPARATOR . 'object' . URLBuilder::SEPARATOR . 'title=bar&'
245  . 'test' . URLBuilder::SEPARATOR . 'description=foo#12345"), ' . $expected_token . ')';
246  $this->assertEquals($expected_object, $url->renderObject([$result1[1], $result2[1]]));
247  }
248 }
const URL_MAX_LENGTH
A maximum length of 8192 characters should be safe to use in most browsers, even though longer URLs w...
Definition: URLBuilder.php:46
Interface Observer Contains several chained tasks and infos about them.
const SEPARATOR
Separator for parts of a parameter&#39;s namespace.
Definition: URLBuilder.php:50
$url
Definition: shib_logout.php:68
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
readonly ILIAS Data URI $URI_COMPLETE
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
URLBuilder.
Definition: URLBuilder.php:40