001    // Copyright 2004, 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.services.impl;
016    
017    import org.apache.hivemind.service.ThreadLocale;
018    import org.apache.tapestry.BaseComponentTestCase;
019    import org.apache.tapestry.TapestryConstants;
020    import org.apache.tapestry.services.CookieSource;
021    import org.apache.tapestry.web.WebRequest;
022    import static org.easymock.EasyMock.expect;
023    import org.testng.annotations.Test;
024    
025    import java.util.Locale;
026    
027    /**
028     * Tests for {@link org.apache.tapestry.services.impl.RequestLocaleManagerImpl}.
029     * 
030     * @author Howard Lewis Ship
031     * @since 4.0
032     */
033    @Test
034    public class TestRequestLocaleManager extends BaseComponentTestCase
035    {
036        private ThreadLocale newThreadLocale()
037        {
038            return newMock(ThreadLocale.class);
039        }
040    
041        private ThreadLocale newThreadLocale(Locale locale)
042        {
043            ThreadLocale threadLocale = newMock(ThreadLocale.class);
044    
045            expect(threadLocale.getLocale()).andReturn(locale);
046    
047            return threadLocale;
048        }
049    
050        public void test_Supplied_By_Request()
051        {
052            CookieSource source = newMock(CookieSource.class);
053            
054            WebRequest request = newRequest();
055    
056            ThreadLocale tl = newThreadLocale();
057    
058            // Training
059    
060            expect(source.readCookieValue(TapestryConstants.LOCALE_COOKIE_NAME)).andReturn(null);
061    
062            expect(request.getLocale()).andReturn(Locale.JAPANESE);
063    
064            tl.setLocale(Locale.JAPANESE);
065    
066            replay();
067    
068            RequestLocaleManagerImpl manager = new RequestLocaleManagerImpl();
069            manager.setCookieSource(source);
070            manager.setRequest(request);
071            manager.setThreadLocale(tl);
072    
073            Locale actual = manager.extractLocaleForCurrentRequest();
074    
075            assertEquals(Locale.JAPANESE, actual);
076    
077            verify();
078        }
079    
080        private void attempt(String localeName, Locale expectedLocale)
081        {
082            CookieSource source = newMock(CookieSource.class);
083    
084            ThreadLocale tl = newThreadLocale();
085    
086            // Training
087    
088            expect(source.readCookieValue(TapestryConstants.LOCALE_COOKIE_NAME)).andReturn(localeName);
089    
090            tl.setLocale(expectedLocale);
091    
092            replay();
093    
094            RequestLocaleManagerImpl manager = new RequestLocaleManagerImpl();
095            manager.setCookieSource(source);
096            manager.setThreadLocale(tl);
097    
098            Locale actual = manager.extractLocaleForCurrentRequest();
099    
100            assertEquals(expectedLocale, actual);
101    
102            verify();
103        }
104    
105        public void test_Just_Language()
106        {
107            attempt("en", Locale.ENGLISH);
108        }
109    
110        public void test_Language_And_Country()
111        {
112            attempt("fr_FR", Locale.FRANCE);
113        }
114    
115        public void test_With_Variant()
116        {
117            attempt("en_US_Bahstohn", new Locale("en", "US", "Bahstohn"));
118        }
119    
120        public void test_Persist()
121        {
122            Locale locale = Locale.SIMPLIFIED_CHINESE;
123    
124            CookieSource source = newMock(CookieSource.class);
125            ThreadLocale threadLocale = newThreadLocale(locale);
126    
127            // Training
128    
129            source.writeCookieValue(TapestryConstants.LOCALE_COOKIE_NAME, locale.toString());
130    
131            replay();
132    
133            RequestLocaleManagerImpl m = new RequestLocaleManagerImpl();
134            m.setCookieSource(source);
135            m.setThreadLocale(threadLocale);
136    
137            m.persistLocale();
138    
139            verify();
140        }
141    
142        public void test_Persist_No_Change()
143        {
144            CookieSource source = newMock(CookieSource.class);
145            
146            WebRequest request = newRequest();
147            
148            ThreadLocale tl = newMock(ThreadLocale.class);
149    
150            // Training
151    
152            expect(source.readCookieValue(TapestryConstants.LOCALE_COOKIE_NAME)).andReturn(null);
153            
154            expect(request.getLocale()).andReturn(Locale.JAPANESE);
155    
156            tl.setLocale(Locale.JAPANESE);
157    
158            replay();
159    
160            RequestLocaleManagerImpl manager = new RequestLocaleManagerImpl();
161            manager.setCookieSource(source);
162            manager.setRequest(request);
163            manager.setThreadLocale(tl);
164    
165            Locale actual = manager.extractLocaleForCurrentRequest();
166    
167            assertEquals(Locale.JAPANESE, actual);
168    
169            verify();
170    
171            expect(tl.getLocale()).andReturn(Locale.JAPANESE);
172    
173            replay();
174    
175            // Should do nothing, beacuse it isn't a change.
176    
177            manager.persistLocale();
178    
179            verify();
180        }
181    
182        public void test_Get_Locale_Values_Are_Cached()
183        {
184            RequestLocaleManagerImpl manager = new RequestLocaleManagerImpl();
185    
186            Locale l1 = manager.getLocale("en");
187            Locale l2 = manager.getLocale("en");
188    
189            assertSame(l1, l2);
190        }
191    
192        /**
193         * Test when filtering of incoming locales is disabled.
194         */
195    
196        public void test_Filter_Disabled()
197        {
198            RequestLocaleManagerImpl manager = new RequestLocaleManagerImpl();
199    
200            Locale l = manager.filterRequestedLocale("en");
201    
202            assertEquals(Locale.ENGLISH, l);
203        }
204    
205        /**
206         * Test with filtering enabled.
207         */
208    
209        public void test_Filter_Enabled()
210        {
211            RequestLocaleManagerImpl manager = new RequestLocaleManagerImpl();
212            manager.setAcceptedLocales("en,fr");
213            manager.initializeService();
214    
215            assertEquals(manager.filterRequestedLocale("en"), Locale.ENGLISH);
216            assertEquals(manager.filterRequestedLocale("en_US"), Locale.ENGLISH);
217            assertEquals(manager.filterRequestedLocale("fr"), Locale.FRENCH);
218            assertEquals(manager.filterRequestedLocale("fr_FR"), Locale.FRENCH);
219    
220            // Unrecognized locales filter to the first accepted locale.
221    
222            assertEquals(manager.filterRequestedLocale("foo_bar_BAZ"), Locale.ENGLISH);
223        }
224    
225        public void test_Filter_Best_Guess()
226        {
227            RequestLocaleManagerImpl manager = new RequestLocaleManagerImpl();
228            manager.setAcceptedLocales("en_US,fr_FR");
229            manager.initializeService();
230    
231            assertEquals(manager.filterRequestedLocale("en"), Locale.US);
232            assertEquals(manager.filterRequestedLocale("en_GB"), Locale.US);
233            assertEquals(manager.filterRequestedLocale("fr"), Locale.FRANCE);
234            assertEquals(manager.filterRequestedLocale("fr_FR"), Locale.FRANCE);
235        }
236    }