ILIAS  trunk Revision v11.0_alpha-1769-g99a433fe2dc
All Data Structures Namespaces Files Functions Variables Enumerations Enumerator Modules Pages
ProvideDocumentTest.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
22 
23 use ilCtrl;
48 use ilLanguage;
51 use stdClass;
52 use ilObjUser;
53 
54 require_once __DIR__ . '/../ContainerMock.php';
55 
56 class ProvideDocumentTest extends TestCase
57 {
58  use ContainerMock;
59 
60  public function testConstruct(): void
61  {
62  $this->assertInstanceOf(ProvideDocument::class, new ProvideDocument(
63  'foo',
64  $this->mock(DocumentRepository::class),
65  new SelectionMap(),
66  [],
67  $this->mockTree(Container::class, ['user' => ['getTimeZone' => 'europe/berlin']])
68  ));
69  }
70 
71  public function testTableReadOnly(): void
72  {
73  $dummy_gui = new stdClass();
74 
75  $uri = 'http://myIlias/ilias.php?baseClass=iladministrationgui&cmdNode=2g:qo:gq&cmdClass=ilLegalDocumentsAdministrationGUI&cmd=documents&ref_id=50';
76 
77  $container = $this->mockTree(Container::class, [
78  'ui' => [
79  'factory' => [],
80  'mainTemplate' => [],
81  ],
82  'language' => [],
83  'http' => ['request' => ['getUri' => ['__toString' => $uri]]],
84  'ctrl' => [],
85  'user' => ['getTimeZone' => 'europe/berlin'],
86  ]);
87 
88  $instance = new ProvideDocument('foo', $this->mock(DocumentRepository::class), new SelectionMap(), [], $container);
89  $this->assertInstanceOf(DocumentTable::class, $instance->table($dummy_gui));
90  }
91 
92  public function testTableEditable(): void
93  {
94  if (!defined('ILIAS_HTTP_PATH')) {
95  define('ILIAS_HTTP_PATH', 'http://localhost');
96  }
97 
98  $dummy_gui = new stdClass();
99 
100  $uri = 'http://myIlias/ilias.php?baseClass=iladministrationgui&cmdNode=2g:qo:gq&cmdClass=ilLegalDocumentsAdministrationGUI&cmd=documents&ref_id=50';
101 
102  $container = $this->mockTree(Container::class, [
103  'ui' => [
104  'factory' => ['table' => ['action' => ['multi' => []]]],
105  'mainTemplate' => [],
106  ],
107  'language' => [],
108  'http' => ['request' => ['getUri' => ['__toString' => $uri]]],
109  'ctrl' => [],
110  'user' => ['getTimeZone' => 'europe/berlin'],
111  ]);
112 
113  $instance = new ProvideDocument('foo', $this->mock(DocumentRepository::class), new SelectionMap(), [], $container);
114  $this->assertInstanceOf(DocumentTable::class, $instance->table($dummy_gui, $this->mock(EditLinks::class)));
115  }
116 
117  public function testChooseDocumentFor(): void
118  {
119  $document = $this->mockMethod(Document::class, 'criteria', [], []);
120  $user = $this->mock(ilObjUser::class);
121 
122  $criterion = $this->mockTree(Criterion::class, ['content' => ['type' => 'bar']]);
123 
124  $repository = $this->mockMethod(DocumentRepository::class, 'all', [], [
125  $this->mockMethod(Document::class, 'criteria', [], [$criterion]),
126  $document,
127  ]);
128 
129  $instance = new ProvideDocument('foo', $repository, new SelectionMap([
130  'bar' => $this->mockMethod(ConditionDefinition::class, 'withCriterion', [$criterion->content()], $this->mockMethod(
131  Condition::class,
132  'eval',
133  [$user],
134  false
135  )),
136  ]), [], $this->mock(Container::class));
137  $result = $instance->chooseDocumentFor($user);
138  $this->assertTrue($result->isOk());
139  $this->assertSame($document, $result->value());
140  }
141 
142  public function testDocumentMatches(): void
143  {
144  $criterion = $this->mockTree(Criterion::class, ['content' => ['type' => 'bar']]);
145  $document = $this->mockMethod(Document::class, 'criteria', [], [$criterion]);
146  $user = $this->mock(ilObjUser::class);
147 
148  $instance = new ProvideDocument('doo', $this->mock(DocumentRepository::class), new SelectionMap([
149  'bar' => $this->mockMethod(ConditionDefinition::class, 'withCriterion', [$criterion->content()], $this->mockMethod(
150  Condition::class,
151  'eval',
152  [$user],
153  true
154  )),
155  ]), [], $this->mock(Container::class));
156 
157  $this->assertTrue($instance->documentMatches($document, $user));
158  }
159 
160  public function testRepository(): void
161  {
162  $repository = $this->mock(DocumentRepository::class);
163  $instance = new ProvideDocument('foo', $repository, new SelectionMap(), [], $this->mock(Container::class));
164  $this->assertSame($repository, $instance->repository());
165  }
166 
167  public function testHash(): void
168  {
169  $instance = new ProvideDocument('foo', $this->mock(DocumentRepository::class), new SelectionMap(), [], $this->mock(Container::class));
170  $hash = $instance->hash();
171  $this->assertTrue(is_string($hash));
172  $this->assertSame(254, strlen($hash));
173  }
174 
175  public function testToCondition(): void
176  {
177  $condition = $this->mock(Condition::class);
178  $content = $this->mockMethod(CriterionContent::class, 'type', [], 'bar');
179 
180  $instance = new ProvideDocument('foo', $this->mock(DocumentRepository::class), new SelectionMap([
181  'bar' => $this->mockMethod(ConditionDefinition::class, 'withCriterion', [$content], $condition),
182  ]), [], $this->mock(Container::class));
183 
184  $this->assertSame($condition, $instance->toCondition($content));
185  }
186 
187  public function testConditionGroupsWithoutContent(): void
188  {
189  $group = $this->mock(Group::class);
190 
191  $instance = new ProvideDocument('foo', $this->mock(DocumentRepository::class), new SelectionMap([
192  'bar' => $this->mockMethod(ConditionDefinition::class, 'formGroup', [[]], $group),
193  'baz' => $this->mockMethod(ConditionDefinition::class, 'formGroup', [[]], $group),
194  ]), [], $this->mock(Container::class));
195 
196  $this->assertSame(['bar' => $group, 'baz' => $group], $instance->conditionGroups()->choices());
197  }
198 
199  public function testConditionGroups(): void
200  {
201  $group = $this->mock(Group::class);
202  $content = $this->mockTree(CriterionContent::class, [
203  'type' => 'baz',
204  'arguments' => ['a', 'b', 'c'],
205  ]);
206 
207  $instance = new ProvideDocument('foo', $this->mock(DocumentRepository::class), new SelectionMap([
208  'bar' => $this->mockMethod(ConditionDefinition::class, 'formGroup', [[]], $group),
209  'baz' => $this->mockMethod(ConditionDefinition::class, 'formGroup', [$content->arguments()], $group),
210  ]), [], $this->mock(Container::class));
211 
212  $this->assertSame(['bar' => $group, 'baz' => $group], $instance->conditionGroups($content)->choices());
213  }
214 
215  public function testValidateCriteriaContent(): void
216  {
217  $content = new CriterionContent('foo', ['bar']);
218  $existing_content = new CriterionContent('hoo', ['haz']);
219  $other_existing_content = new CriterionContent('foo', ['baz']);
220 
221  $condition = $this->mock(Condition::class);
222  $condition->expects(self::exactly(2))->method('knownToNeverMatchWith')->with($condition)->willReturn(false);
223 
224  $definition = $this->mock(ConditionDefinition::class);
225  $consecutive = [$content, $other_existing_content, $content];
226  $definition->expects(self::exactly(3))->method('withCriterion')->with(
227  $this->callback(function ($value) use (&$consecutive) {
228  $this->assertSame(array_shift($consecutive), $value);
229  return true;
230  })
231  )->willReturn($condition);
232 
233  $instance = new ProvideDocument('foo', $this->mock(DocumentRepository::class), new SelectionMap([
234  'hoo' => $this->mockMethod(ConditionDefinition::class, 'withCriterion', [$existing_content], $condition),
235  'foo' => $definition,
236  ]), [], $this->mock(Container::class));
237 
238  $result = $instance->validateCriteriaContent([
239  $this->mockTree(Criterion::class, ['content' => $existing_content]),
240  $this->mockTree(Criterion::class, ['content' => $other_existing_content]),
241  ], $content);
242  $this->assertTrue($result->isOk());
243  $this->assertSame($content, $result->value());
244  }
245 
246  public function testDuplicateCriteriaContent(): void
247  {
248  $content = new CriterionContent('foo', ['bar']);
249 
250  $instance = new ProvideDocument('foo', $this->mock(DocumentRepository::class), new SelectionMap(), [], $this->mock(Container::class));
251  $result = $instance->validateCriteriaContent([
252  $this->mockTree(Criterion::class, ['content' => new CriterionContent('foo', ['bar'])])
253  ], $content);
254  $this->assertFalse($result->isOk());
255  $this->assertSame(ProvideDocument::CRITERION_ALREADY_EXISTS, $result->error());
256  }
257 
258  public function testNeverMatchingCriteriaContent(): void
259  {
260  $content = new CriterionContent('foo', ['bar']);
261  $existing_content = new CriterionContent('hoo', ['haz']);
262 
263  $condition = $this->mock(Condition::class);
264  $condition->expects(self::once())->method('knownToNeverMatchWith')->with($condition)->willReturn(true);
265 
266  $instance = new ProvideDocument('foo', $this->mock(DocumentRepository::class), new SelectionMap([
267  'hoo' => $this->mockMethod(ConditionDefinition::class, 'withCriterion', [$existing_content], $condition),
268  'foo' => $this->mockMethod(ConditionDefinition::class, 'withCriterion', [$content], $condition),
269  ]), [], $this->mock(Container::class));
270 
271  $result = $instance->validateCriteriaContent([
272  $this->mockTree(Criterion::class, ['content' => $existing_content]),
273  ], $content);
274  $this->assertFalse($result->isOk());
275  $this->assertSame(ProvideDocument::CRITERION_WOULD_NEVER_MATCH, $result->error());
276  }
277 
278  public function testContentAsComponent(): void
279  {
280  $content = $this->mockTree(DocumentContent::class, ['type' => 'html']);
281  $component = $this->mock(Component::class);
282 
283  $instance = new ProvideDocument('foo', $this->mock(DocumentRepository::class), new SelectionMap(), [
284  'html' => function (DocumentContent $c) use ($content, $component): Component {
285  $this->assertSame($content, $c);
286  return $component;
287  }
288  ], $this->mock(Container::class));
289 
290  $this->assertSame($component, $instance->contentAsComponent($content));
291  }
292 }
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
$c
Definition: deliver.php:25
$container
Definition: wac.php:36