1. Project Clover database Tue Dec 20 2016 21:24:09 CET
  2. Package org.xwiki.rendering.internal.resolver

File DefaultResourceReferenceEntityReferenceResolverTest.java

 

Code metrics

0
77
11
1
390
267
11
0.14
7
11
1

Classes

Class Line # Actions
DefaultResourceReferenceEntityReferenceResolverTest 88 77 0% 11 0
1.0100%
 

Contributing tests

This file is covered by 6 tests. .

Source view

1    /*
2    * See the NOTICE file distributed with this work for additional
3    * information regarding copyright ownership.
4    *
5    * This is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU Lesser General Public License as
7    * published by the Free Software Foundation; either version 2.1 of
8    * the License, or (at your option) any later version.
9    *
10    * This software is distributed in the hope that it will be useful,
11    * but WITHOUT ANY WARRANTY; without even the implied warranty of
12    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13    * Lesser General Public License for more details.
14    *
15    * You should have received a copy of the GNU Lesser General Public
16    * License along with this software; if not, write to the Free
17    * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
18    * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
19    */
20    package org.xwiki.rendering.internal.resolver;
21   
22    import java.util.Arrays;
23    import java.util.HashSet;
24    import java.util.Set;
25   
26    import javax.inject.Provider;
27   
28    import org.junit.Before;
29    import org.junit.Rule;
30    import org.junit.Test;
31    import org.mockito.invocation.InvocationOnMock;
32    import org.mockito.stubbing.Answer;
33    import org.xwiki.bridge.DocumentAccessBridge;
34    import org.xwiki.component.internal.ContextComponentManagerProvider;
35    import org.xwiki.component.manager.ComponentLookupException;
36    import org.xwiki.component.util.DefaultParameterizedType;
37    import org.xwiki.model.EntityType;
38    import org.xwiki.model.internal.reference.DefaultReferenceAttachmentReferenceResolver;
39    import org.xwiki.model.internal.reference.DefaultReferenceDocumentReferenceResolver;
40    import org.xwiki.model.internal.reference.DefaultReferenceEntityReferenceResolver;
41    import org.xwiki.model.internal.reference.DefaultStringAttachmentReferenceResolver;
42    import org.xwiki.model.internal.reference.DefaultStringDocumentReferenceResolver;
43    import org.xwiki.model.internal.reference.DefaultStringEntityReferenceResolver;
44    import org.xwiki.model.internal.reference.DefaultStringSpaceReferenceResolver;
45    import org.xwiki.model.internal.reference.DefaultSymbolScheme;
46    import org.xwiki.model.internal.reference.RelativeStringEntityReferenceResolver;
47    import org.xwiki.model.reference.AttachmentReference;
48    import org.xwiki.model.reference.DocumentReference;
49    import org.xwiki.model.reference.EntityReference;
50    import org.xwiki.model.reference.EntityReferenceProvider;
51    import org.xwiki.model.reference.EntityReferenceResolver;
52    import org.xwiki.model.reference.SpaceReference;
53    import org.xwiki.rendering.listener.reference.AttachmentResourceReference;
54    import org.xwiki.rendering.listener.reference.DocumentResourceReference;
55    import org.xwiki.rendering.listener.reference.ResourceReference;
56    import org.xwiki.rendering.listener.reference.ResourceType;
57    import org.xwiki.rendering.listener.reference.SpaceResourceReference;
58    import org.xwiki.test.annotation.ComponentList;
59    import org.xwiki.test.mockito.MockitoComponentMockingRule;
60   
61    import static org.junit.Assert.assertEquals;
62    import static org.junit.Assert.assertNull;
63    import static org.mockito.ArgumentMatchers.any;
64    import static org.mockito.ArgumentMatchers.eq;
65    import static org.mockito.Mockito.when;
66   
67    /**
68    * Validate {@link DefaultResourceReferenceEntityReferenceResolver}.
69    *
70    * @version $Id: 2d1127c0030f5cf096d2cb21eaf34e0259256b88 $
71    */
72    @ComponentList({
73    DefaultResourceReferenceEntityReferenceResolver.class,
74    AttachmentResourceReferenceEntityReferenceResolver.class,
75    DocumentResourceReferenceEntityReferenceResolver.class,
76    DefaultStringAttachmentReferenceResolver.class,
77    DefaultStringDocumentReferenceResolver.class,
78    SpaceResourceReferenceEntityReferenceResolver.class,
79    DefaultReferenceEntityReferenceResolver.class,
80    DefaultStringEntityReferenceResolver.class,
81    RelativeStringEntityReferenceResolver.class,
82    DefaultReferenceAttachmentReferenceResolver.class,
83    DefaultReferenceDocumentReferenceResolver.class,
84    DefaultStringSpaceReferenceResolver.class,
85    ContextComponentManagerProvider.class,
86    DefaultSymbolScheme.class
87    })
 
88    public class DefaultResourceReferenceEntityReferenceResolverTest
89    {
90    private static final String DEFAULT_PAGE = "defaultpage";
91   
92    private static final String CURRENT_PAGE = "currentpage";
93   
94    private static final String CURRENT_SPACE = "currentspace";
95   
96    private static final String CURRENT_SUBSPACE = "currentsubspace";
97   
98    private static final String CURRENT_WIKI = "currentwiki";
99   
100    private static final String WIKI = "Wiki";
101   
102    private static final String SPACE = "Space";
103   
104    private static final String PAGE = "Page";
105   
106    private static final String ATTACHMENT = "file.ext";
107   
108    private static final DocumentReference CURRENT_DOCUMENT_REFERENCE =
109    new DocumentReference(CURRENT_WIKI, CURRENT_SPACE, CURRENT_PAGE);
110   
111    @Rule
112    public MockitoComponentMockingRule<EntityReferenceResolver<ResourceReference>> mocker =
113    new MockitoComponentMockingRule<EntityReferenceResolver<ResourceReference>>(
114    DefaultResourceReferenceEntityReferenceResolver.class);
115   
116    private EntityReferenceResolver<String> currentEntityReferenceResolver;
117   
118    private Provider<DocumentReference> currentDocumentProvider;
119   
120    private DocumentAccessBridge bridge;
121   
122    private EntityReferenceProvider defaultEntityProvider;
123   
124    private final Set<DocumentReference> existingDocuments = new HashSet<>();
125   
 
126  6 toggle @Before
127    public void before() throws Exception
128    {
129  6 this.currentEntityReferenceResolver =
130    this.mocker.registerMockComponent(EntityReferenceResolver.TYPE_STRING, "current");
131   
132  6 this.currentDocumentProvider = this.mocker.registerMockComponent(
133    new DefaultParameterizedType(null, Provider.class, DocumentReference.class), "current");
134  6 when(this.currentDocumentProvider.get())
135    .thenReturn(new DocumentReference(CURRENT_WIKI, CURRENT_SPACE, CURRENT_PAGE));
136   
137  6 this.bridge = this.mocker.registerMockComponent(DocumentAccessBridge.class);
138  6 when(this.bridge.exists(any(DocumentReference.class))).then(new Answer<Boolean>()
139    {
 
140  35 toggle @Override
141    public Boolean answer(InvocationOnMock invocation) throws Throwable
142    {
143  35 return existingDocuments.contains(invocation.getArguments()[0]);
144    }
145    });
146   
147  6 this.defaultEntityProvider = this.mocker.registerMockComponent(EntityReferenceProvider.class);
148  6 when(this.defaultEntityProvider.getDefaultReference(EntityType.DOCUMENT))
149    .thenReturn(new EntityReference(DEFAULT_PAGE, EntityType.DOCUMENT));
150    }
151   
 
152  29 toggle private DocumentResourceReference documentResource(String referenceString, boolean typed)
153    {
154  29 DocumentResourceReference reference = new DocumentResourceReference(referenceString);
155   
156  29 reference.setTyped(typed);
157   
158  29 return reference;
159    }
160   
 
161  5 toggle private SpaceResourceReference spaceResource(String referenceString, boolean typed)
162    {
163  5 SpaceResourceReference reference = new SpaceResourceReference(referenceString);
164   
165  5 reference.setTyped(typed);
166   
167  5 return reference;
168    }
169   
 
170  8 toggle private AttachmentResourceReference attachmentResource(String referenceString, boolean typed)
171    {
172  8 AttachmentResourceReference reference = new AttachmentResourceReference(referenceString);
173   
174  8 reference.setTyped(typed);
175   
176  8 return reference;
177    }
178    // Tests
179   
 
180  1 toggle @Test
181    public void resolve() throws ComponentLookupException
182    {
183  1 assertNull(this.mocker.getComponentUnderTest().resolve(null, null));
184  1 assertNull(this.mocker.getComponentUnderTest().resolve(new ResourceReference("path", ResourceType.PATH), null));
185    }
186   
 
187  1 toggle @Test
188    public void resolveTypeDocument() throws ComponentLookupException
189    {
190  1 assertEquals(new DocumentReference(WIKI, SPACE, PAGE),
191    this.mocker.getComponentUnderTest().resolve(documentResource(WIKI + ':' + SPACE + '.' + PAGE, true), null));
192   
193  1 assertEquals(new DocumentReference(CURRENT_WIKI, SPACE, PAGE),
194    this.mocker.getComponentUnderTest().resolve(documentResource(SPACE + '.' + PAGE, true), null));
195   
196  1 assertEquals(new DocumentReference(CURRENT_WIKI, CURRENT_SPACE, PAGE),
197    this.mocker.getComponentUnderTest().resolve(documentResource(PAGE, true), null));
198   
199  1 assertEquals(new DocumentReference(CURRENT_WIKI, CURRENT_SPACE, CURRENT_PAGE),
200    this.mocker.getComponentUnderTest().resolve(documentResource("", true), null));
201   
202  1 when(this.currentEntityReferenceResolver.resolve(eq(WIKI + ':' + SPACE + '.' + PAGE), eq(EntityType.DOCUMENT),
203    any())).thenReturn(new DocumentReference(WIKI, SPACE, PAGE));
204   
205  1 ResourceReference withBaseReference = documentResource("", true);
206  1 withBaseReference.addBaseReference(WIKI + ':' + SPACE + '.' + PAGE);
207  1 assertEquals(new DocumentReference(WIKI, SPACE, PAGE),
208    this.mocker.getComponentUnderTest().resolve(withBaseReference, null));
209   
210  1 assertEquals(new DocumentReference(WIKI, SPACE, PAGE), this.mocker.getComponentUnderTest()
211    .resolve(documentResource("", true), null, new DocumentReference(WIKI, SPACE, PAGE)));
212    }
213   
 
214  1 toggle @Test
215    public void resolveUntypeDocument() throws ComponentLookupException
216    {
217    // When the page does not exist
218   
219  1 assertEquals(new DocumentReference(WIKI, Arrays.asList(SPACE, PAGE), DEFAULT_PAGE), this.mocker
220    .getComponentUnderTest().resolve(documentResource(WIKI + ':' + SPACE + '.' + PAGE, false), null));
221  1 assertEquals(new DocumentReference(CURRENT_WIKI, Arrays.asList(SPACE, PAGE), DEFAULT_PAGE),
222    this.mocker.getComponentUnderTest().resolve(documentResource(SPACE + '.' + PAGE, false), null));
223  1 assertEquals(new DocumentReference(CURRENT_WIKI, Arrays.asList(CURRENT_SPACE, PAGE), DEFAULT_PAGE),
224    this.mocker.getComponentUnderTest().resolve(documentResource(PAGE, false), null));
225   
226    // Already ends with default page name
227   
228  1 assertEquals(new DocumentReference(WIKI, SPACE, DEFAULT_PAGE), this.mocker.getComponentUnderTest()
229    .resolve(documentResource(WIKI + ':' + SPACE + '.' + DEFAULT_PAGE, false), null));
230  1 assertEquals(new DocumentReference(CURRENT_WIKI, SPACE, DEFAULT_PAGE),
231    this.mocker.getComponentUnderTest().resolve(documentResource(SPACE + '.' + DEFAULT_PAGE, false), null));
232  1 assertEquals(new DocumentReference(CURRENT_WIKI, CURRENT_SPACE, DEFAULT_PAGE),
233    this.mocker.getComponentUnderTest().resolve(documentResource(DEFAULT_PAGE, false), null));
234   
235    // When the page exist
236   
237  1 this.existingDocuments.add(new DocumentReference(WIKI, SPACE, PAGE));
238  1 assertEquals(new DocumentReference(WIKI, SPACE, PAGE), this.mocker.getComponentUnderTest()
239    .resolve(documentResource(WIKI + ':' + SPACE + '.' + PAGE, false), null));
240  1 this.existingDocuments.add(new DocumentReference(CURRENT_WIKI, SPACE, PAGE));
241  1 assertEquals(new DocumentReference(CURRENT_WIKI, SPACE, PAGE),
242    this.mocker.getComponentUnderTest().resolve(documentResource(SPACE + '.' + PAGE, false), null));
243  1 this.existingDocuments.add(new DocumentReference(CURRENT_WIKI, CURRENT_SPACE, PAGE));
244  1 assertEquals(new DocumentReference(CURRENT_WIKI, CURRENT_SPACE, PAGE),
245    this.mocker.getComponentUnderTest().resolve(documentResource(PAGE, false), null));
246   
247    // When the page is current page
248   
249  1 assertEquals(new DocumentReference(CURRENT_WIKI, CURRENT_SPACE, CURRENT_PAGE),
250    this.mocker.getComponentUnderTest().resolve(documentResource(CURRENT_PAGE, false), null));
251   
252  1 assertEquals(new DocumentReference(CURRENT_WIKI, CURRENT_SPACE, CURRENT_PAGE),
253    this.mocker.getComponentUnderTest().resolve(documentResource("", false), null));
254    }
255   
 
256  1 toggle @Test
257    public void resolveUntypeDocumentWhenCurrentPageIsSpace() throws ComponentLookupException
258    {
259    // Current is top level space
260   
261  1 when(this.currentDocumentProvider.get())
262    .thenReturn(new DocumentReference(CURRENT_WIKI, CURRENT_SPACE, DEFAULT_PAGE));
263   
264  1 assertEquals(new DocumentReference(CURRENT_WIKI, Arrays.asList(CURRENT_SPACE, PAGE), DEFAULT_PAGE),
265    this.mocker.getComponentUnderTest().resolve(documentResource(PAGE, false), null));
266   
267  1 assertEquals(new DocumentReference(CURRENT_WIKI, Arrays.asList(SPACE, PAGE), DEFAULT_PAGE),
268    this.mocker.getComponentUnderTest().resolve(documentResource(SPACE + '.' + PAGE, false), null));
269   
270  1 assertEquals(new DocumentReference(CURRENT_WIKI, Arrays.asList(CURRENT_SPACE, PAGE), DEFAULT_PAGE),
271    this.mocker.getComponentUnderTest().resolve(documentResource('.' + PAGE, false), null));
272   
273  1 assertEquals(new DocumentReference(CURRENT_WIKI, Arrays.asList(CURRENT_SPACE, PAGE), DEFAULT_PAGE), this.mocker
274    .getComponentUnderTest().resolve(documentResource('.' + PAGE + '.' + DEFAULT_PAGE, false), null));
275   
276    // Current is subspace
277   
278    // When sibling page does not exist
279   
280  1 when(this.currentDocumentProvider.get()).thenReturn(
281    new DocumentReference(CURRENT_WIKI, Arrays.asList(CURRENT_SPACE, CURRENT_SUBSPACE), DEFAULT_PAGE));
282   
283  1 assertEquals(new DocumentReference(CURRENT_WIKI, Arrays.asList(CURRENT_SPACE, CURRENT_SUBSPACE, PAGE),
284    DEFAULT_PAGE),
285    this.mocker.getComponentUnderTest().resolve(documentResource(PAGE, false), null));
286   
287  1 assertEquals(new DocumentReference(CURRENT_WIKI, Arrays.asList(SPACE, PAGE), DEFAULT_PAGE),
288    this.mocker.getComponentUnderTest().resolve(documentResource(SPACE + '.' + PAGE, false), null));
289   
290  1 assertEquals(new DocumentReference(CURRENT_WIKI, Arrays.asList(CURRENT_SPACE, CURRENT_SUBSPACE, PAGE),
291    DEFAULT_PAGE),
292    this.mocker.getComponentUnderTest().resolve(documentResource('.' + PAGE, false), null));
293   
294  1 assertEquals(
295    new DocumentReference(CURRENT_WIKI, Arrays.asList(CURRENT_SPACE, CURRENT_SUBSPACE, PAGE), DEFAULT_PAGE),
296    this.mocker.getComponentUnderTest().resolve(documentResource('.' + PAGE + '.' + DEFAULT_PAGE, false),
297    null));
298   
299    // When sibling page exist
300   
301  1 this.existingDocuments.add(new DocumentReference(CURRENT_WIKI, CURRENT_SPACE, PAGE));
302   
303  1 assertEquals(new DocumentReference(CURRENT_WIKI, CURRENT_SPACE, PAGE),
304    this.mocker.getComponentUnderTest().resolve(documentResource(PAGE, false), null));
305   
306  1 assertEquals(new DocumentReference(CURRENT_WIKI, Arrays.asList(SPACE, PAGE), DEFAULT_PAGE),
307    this.mocker.getComponentUnderTest().resolve(documentResource(SPACE + '.' + PAGE, false), null));
308   
309    // FIXME: This should always be resolved to a child (terminal or non-terminal) page and never to a sibling.
310  1 assertEquals(new DocumentReference(CURRENT_WIKI, CURRENT_SPACE, PAGE),
311    this.mocker.getComponentUnderTest().resolve(documentResource('.' + PAGE, false), null));
312   
313  1 assertEquals(
314    new DocumentReference(CURRENT_WIKI, Arrays.asList(CURRENT_SPACE, CURRENT_SUBSPACE, PAGE), DEFAULT_PAGE),
315    this.mocker.getComponentUnderTest().resolve(documentResource('.' + PAGE + '.' + DEFAULT_PAGE, false),
316    null));
317    }
318   
 
319  1 toggle @Test
320    public void resolveTypeSpace() throws ComponentLookupException
321    {
322  1 assertEquals(new SpaceReference(WIKI, SPACE),
323    this.mocker.getComponentUnderTest().resolve(spaceResource(WIKI + ':' + SPACE, true), null));
324   
325  1 assertEquals(new SpaceReference(CURRENT_WIKI, SPACE),
326    this.mocker.getComponentUnderTest().resolve(spaceResource(SPACE, true), null));
327   
328  1 assertEquals(new SpaceReference(CURRENT_WIKI, CURRENT_SPACE),
329    this.mocker.getComponentUnderTest().resolve(spaceResource("", true), null));
330   
331  1 when(this.currentEntityReferenceResolver.resolve(eq(WIKI + ':' + SPACE + '.' + PAGE), eq(EntityType.DOCUMENT),
332    any())).thenReturn(new DocumentReference(WIKI, SPACE, PAGE));
333   
334  1 ResourceReference withBaseReference = spaceResource("", true);
335  1 withBaseReference.addBaseReference(WIKI + ':' + SPACE + '.' + PAGE);
336  1 assertEquals(new SpaceReference(WIKI, SPACE),
337    this.mocker.getComponentUnderTest().resolve(withBaseReference, null));
338   
339  1 assertEquals(new SpaceReference(WIKI, SPACE), this.mocker.getComponentUnderTest()
340    .resolve(spaceResource("", true), null, new DocumentReference(WIKI, SPACE, PAGE)));
341    }
342   
 
343  1 toggle @Test
344    public void resolveTypeAttachment() throws ComponentLookupException
345    {
346    // When the page does not exist
347   
348  1 assertEquals(
349    new AttachmentReference(ATTACHMENT, new DocumentReference(WIKI, Arrays.asList(SPACE, PAGE), DEFAULT_PAGE)),
350    this.mocker.getComponentUnderTest()
351    .resolve(attachmentResource(WIKI + ':' + SPACE + '.' + PAGE + '@' + ATTACHMENT, true), null));
352   
353  1 assertEquals(
354    new AttachmentReference(ATTACHMENT,
355    new DocumentReference(CURRENT_WIKI, Arrays.asList(SPACE, PAGE), DEFAULT_PAGE)),
356    this.mocker.getComponentUnderTest().resolve(attachmentResource(SPACE + '.' + PAGE + '@' + ATTACHMENT, true),
357    null));
358   
359  1 assertEquals(
360    new AttachmentReference(ATTACHMENT,
361    new DocumentReference(CURRENT_WIKI, Arrays.asList(CURRENT_SPACE, PAGE), DEFAULT_PAGE)),
362    this.mocker.getComponentUnderTest().resolve(attachmentResource(PAGE + '@' + ATTACHMENT, true), null));
363   
364    // When the page exist
365   
366  1 this.existingDocuments.add(new DocumentReference(WIKI, SPACE, PAGE));
367  1 assertEquals(new AttachmentReference(ATTACHMENT, new DocumentReference(WIKI, SPACE, PAGE)),
368    this.mocker.getComponentUnderTest()
369    .resolve(attachmentResource(WIKI + ':' + SPACE + '.' + PAGE + '@' + ATTACHMENT, true), null));
370   
371  1 this.existingDocuments.add(new DocumentReference(CURRENT_WIKI, SPACE, PAGE));
372  1 assertEquals(new AttachmentReference(ATTACHMENT, new DocumentReference(CURRENT_WIKI, SPACE, PAGE)), this.mocker
373    .getComponentUnderTest().resolve(attachmentResource(SPACE + '.' + PAGE + '@' + ATTACHMENT, true), null));
374   
375  1 this.existingDocuments.add(new DocumentReference(CURRENT_WIKI, CURRENT_SPACE, PAGE));
376  1 assertEquals(new AttachmentReference(ATTACHMENT, new DocumentReference(CURRENT_WIKI, CURRENT_SPACE, PAGE)),
377    this.mocker.getComponentUnderTest().resolve(attachmentResource(PAGE + '@' + ATTACHMENT, true), null));
378   
379    // When page is current page
380   
381  1 assertEquals(
382    new AttachmentReference(ATTACHMENT, new DocumentReference(CURRENT_WIKI, CURRENT_SPACE, CURRENT_PAGE)),
383    this.mocker.getComponentUnderTest().resolve(attachmentResource(ATTACHMENT, true), null));
384   
385  1 this.existingDocuments.add(new DocumentReference(CURRENT_WIKI, CURRENT_SPACE, CURRENT_PAGE));
386  1 assertEquals(
387    new AttachmentReference(ATTACHMENT, new DocumentReference(CURRENT_WIKI, CURRENT_SPACE, CURRENT_PAGE)),
388    this.mocker.getComponentUnderTest().resolve(attachmentResource(ATTACHMENT, true), null));
389    }
390    }