001    // Copyright 2005 The Apache Software Foundation
002    //
003    // Licensed under the Apache License, Version 2.0 (the "License");
004    // you may not use this file except in compliance with the License.
005    // You may obtain a copy of the License at
006    //
007    //     http://www.apache.org/licenses/LICENSE-2.0
008    //
009    // Unless required by applicable law or agreed to in writing, software
010    // distributed under the License is distributed on an "AS IS" BASIS,
011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012    // See the License for the specific language governing permissions and
013    // limitations under the License.
014    
015    package org.apache.tapestry.portlet;
016    
017    import static org.easymock.EasyMock.checkOrder;
018    import static org.easymock.EasyMock.expect;
019    
020    import java.util.ArrayList;
021    import java.util.Collections;
022    import java.util.List;
023    
024    import org.apache.tapestry.BaseComponentTestCase;
025    import org.apache.tapestry.IPage;
026    import org.apache.tapestry.IRequestCycle;
027    import org.apache.tapestry.PageNotFoundException;
028    import org.testng.annotations.Test;
029    
030    import javax.portlet.PortletMode;
031    import javax.portlet.PortletRequest;
032    import javax.portlet.WindowState;
033    
034    /**
035     * Tests for {@link org.apache.tapestry.portlet.MatchingPortletPageResolver}.
036     * 
037     * @author Howard M. Lewis Ship
038     * @since 4.0
039     */
040    @Test
041    public class TestMatchingPortletPageResolver extends BaseComponentTestCase
042    {
043        
044        private IRequestCycle newCycle(String pageName)
045        {
046            IPage page = newPage();
047            
048            IRequestCycle cycle = newCycle();
049            checkOrder(cycle, false);
050            
051            expect(cycle.getPage(pageName)).andReturn(page);
052    
053            return cycle;
054        }
055    
056        private PageResolverContribution newContribution(String mimeType, String portletMode,
057                String windowState, String pageName)
058        {
059            PageResolverContribution result = new PageResolverContribution();
060            result.setMimeType(mimeType);
061            result.setPortletMode(portletMode);
062            result.setWindowState(windowState);
063            result.setPageName(pageName);
064    
065            return result;
066        }
067    
068        public void testNoMatchOnContentType()
069        {
070            IRequestCycle cycle = newCycle();
071            
072            PortletRequest request = newMock(PortletRequest.class);
073            
074            trainContentType(request, "text/xml");
075    
076            List l = Collections.singletonList(newContribution("text/html", null, "wierd", "Wierd"));
077    
078            replay();
079    
080            MatchingPortletPageResolver resolver = new MatchingPortletPageResolver();
081            resolver.setContributions(l);
082            resolver.initializeService();
083            resolver.setRequest(request);
084    
085            assertNull(resolver.getPageNameForRequest(cycle));
086    
087            verify();
088        }
089    
090        public void testNoMatchOnPortletMode()
091        {
092            IRequestCycle cycle = newCycle();
093            
094            PortletRequest request = newMock(PortletRequest.class);
095    
096            trainPortletMode(request, "edit");
097            
098            List l = Collections.singletonList(newContribution(null, "view", null, "Wierd"));
099    
100            replay();
101    
102            MatchingPortletPageResolver resolver = new MatchingPortletPageResolver();
103            resolver.setContributions(l);
104            resolver.initializeService();
105            resolver.setRequest(request);
106    
107            assertNull(resolver.getPageNameForRequest(cycle));
108    
109            verify();
110        }
111    
112        public void testNoMatchOnWindowState()
113        {
114            IRequestCycle cycle = newCycle();
115    
116            PortletRequest request = newMock(PortletRequest.class);
117    
118            trainWindowState(request, "huge");
119    
120            List l = Collections.singletonList(newContribution(null, null, "tiny", "Wierd"));
121    
122            replay();
123    
124            MatchingPortletPageResolver resolver = new MatchingPortletPageResolver();
125            resolver.setContributions(l);
126            resolver.initializeService();
127            resolver.setRequest(request);
128    
129            assertNull(resolver.getPageNameForRequest(cycle));
130    
131            verify();
132        }
133    
134        public void testSortingCounts()
135        {
136            IRequestCycle cycle = newCycle("EditHuge");
137    
138            PortletRequest request = newMock(PortletRequest.class);
139            
140            List l = new ArrayList();
141            l.add(newContribution(null, "edit", null, "EditNormal"));
142            l.add(newContribution(null, "edit", "huge", "EditHuge"));
143            
144            trainPortletMode(request, "edit");
145            trainWindowState(request, "huge");
146    
147            replay();
148    
149            MatchingPortletPageResolver resolver = new MatchingPortletPageResolver();
150            resolver.setContributions(l);
151            resolver.initializeService();
152            resolver.setRequest(request);
153    
154            assertEquals("EditHuge", resolver.getPageNameForRequest(cycle));
155    
156            verify();
157        }
158    
159        public void testPageMissing()
160        {
161            IPage page = newPage();
162            IRequestCycle cycle = newCycle();
163    
164            PortletRequest request = newMock(PortletRequest.class);
165    
166            List l = new ArrayList();
167            l.add(newContribution(null, "edit", null, "EditNormal"));
168            l.add(newContribution(null, "edit", "huge", "EditHuge"));
169    
170            trainPortletMode(request, "edit");
171            trainWindowState(request, "huge");
172    
173            expect(cycle.getPage("EditHuge")).andThrow(new PageNotFoundException("missing!"));
174            
175            trainPortletMode(request, "edit");
176    
177            expect(cycle.getPage("EditNormal")).andReturn(page);
178            
179            replay();
180    
181            MatchingPortletPageResolver resolver = new MatchingPortletPageResolver();
182            resolver.setContributions(l);
183            resolver.initializeService();
184            resolver.setRequest(request);
185    
186            assertEquals("EditNormal", resolver.getPageNameForRequest(cycle));
187    
188            verify();
189        }
190    
191        private void trainContentType(PortletRequest request, String contentType)
192        {
193            expect(request.getResponseContentType()).andReturn(contentType);
194        }
195    
196        private void trainPortletMode(PortletRequest request, String modeName)
197        {
198            PortletMode mode = new PortletMode(modeName);
199    
200            expect(request.getPortletMode()).andReturn(mode);
201        }
202    
203        private void trainWindowState(PortletRequest request, String stateName)
204        {
205            WindowState state = new WindowState(stateName);
206    
207            expect(request.getWindowState()).andReturn(state);
208        }
209    }