ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
URLBuilderTest.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
21namespace ILIAS\UI;
22
23use PHPUnit\Framework\TestCase;
24
25class 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);
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);
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);
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);
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}
The scope of this class is split ilias-conform URI's into components.
Definition: URI.php:35
readonly ILIAS Data URI $URI_COMPLETE
const SEPARATOR
Separator for parts of a parameter's namespace.
Definition: URLBuilder.php:50
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
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Interface Observer \BackgroundTasks Contains several chained tasks and infos about them.
$url
Definition: shib_logout.php:68