1   /*******************************************************************************
2    *   Gisgraphy Project 
3    * 
4    *   This library is free software; you can redistribute it and/or
5    *   modify it under the terms of the GNU Lesser General Public
6    *   License as published by the Free Software Foundation; either
7    *   version 2.1 of the License, or (at your option) any later version.
8    * 
9    *   This library is distributed in the hope that it will be useful,
10   *   but WITHOUT ANY WARRANTY; without even the implied warranty of
11   *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12   *   Lesser General Public License for more details.
13   * 
14   *   You should have received a copy of the GNU Lesser General Public
15   *   License along with this library; if not, write to the Free Software
16   *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
17   * 
18   *  Copyright 2008  Gisgraphy project 
19   *  David Masclet <davidmasclet@gisgraphy.com>
20   *  
21   *  
22   *******************************************************************************/
23  package com.gisgraphy.webapp.action;
24  
25  import static org.junit.Assert.assertEquals;
26  import static org.junit.Assert.assertFalse;
27  import static org.junit.Assert.assertNull;
28  import static org.junit.Assert.assertTrue;
29  
30  import java.util.ArrayList;
31  import java.util.Arrays;
32  import java.util.List;
33  
34  import org.apache.struts2.ServletActionContext;
35  import org.easymock.classextension.EasyMock;
36  import org.junit.Assert;
37  import org.junit.Before;
38  import org.junit.Test;
39  import org.springframework.mock.web.MockHttpServletRequest;
40  
41  import com.gisgraphy.domain.geoloc.service.geoloc.GeolocQuery;
42  import com.gisgraphy.domain.geoloc.service.geoloc.IGeolocSearchEngine;
43  import com.gisgraphy.domain.valueobject.GeolocResultsDto;
44  import com.gisgraphy.domain.valueobject.GisFeatureDistance;
45  import com.gisgraphy.domain.valueobject.GisgraphyConfig;
46  import com.gisgraphy.domain.valueobject.GisgraphyServiceType;
47  import com.gisgraphy.domain.valueobject.Output.OutputFormat;
48  import com.gisgraphy.servlet.GeolocServlet;
49  
50  public class GeolocSearchActionTest {
51  
52      GeolocSearchAction action;
53      List<GisFeatureDistance> results;
54      IGeolocSearchEngine mockSearchEngine;
55      GeolocResultsDto mockResultDTO;
56  
57      @SuppressWarnings("unchecked")
58      @Before
59      public void setup() {
60  	BaseActionTestCase.setUpActionContext();
61  	results = new ArrayList<GisFeatureDistance>();
62  	action = new GeolocSearchAction();
63  	mockSearchEngine = EasyMock.createMock(IGeolocSearchEngine.class);
64  	action.setGeolocSearchEngine(mockSearchEngine);
65  	mockResultDTO = EasyMock.createMock(GeolocResultsDto.class);
66  	EasyMock.expect(mockResultDTO.getResult()).andReturn(results);
67      }
68  
69      @Test
70      public void search() throws Exception {
71  	MockHttpServletRequest request = new MockHttpServletRequest("GET",
72  		"/search.html");
73  	ServletActionContext.setRequest(request);
74  	request.setParameter(GeolocServlet.LAT_PARAMETER.toString(), "3.5");
75  	request.setParameter(GeolocServlet.LONG_PARAMETER.toString(), "4.5");
76  	GisFeatureDistance mockGisFeatureDistance = EasyMock
77  		.createMock(GisFeatureDistance.class);
78  	EasyMock.replay(mockGisFeatureDistance);
79  	results.add(mockGisFeatureDistance);
80  	EasyMock.replay(mockResultDTO);
81  	EasyMock.expect(
82  		mockSearchEngine.executeQuery((GeolocQuery) EasyMock
83  			.anyObject())).andReturn(mockResultDTO);
84  	EasyMock.replay(mockSearchEngine);
85  	String returnAction = action.search();
86  	assertEquals(FulltextSearchAction.SUCCESS, returnAction);
87  	assertEquals(mockResultDTO, action.getResponseDTO());
88      }
89  
90      @Test
91      public void isDisplayResults() throws Exception {
92  	MockHttpServletRequest request = new MockHttpServletRequest("GET",
93  		"/search.html");
94  	ServletActionContext.setRequest(request);
95  	request.setParameter(GeolocServlet.LAT_PARAMETER.toString(), "3.5");
96  	request.setParameter(GeolocServlet.LONG_PARAMETER.toString(), "4.5");
97  	GisFeatureDistance mockGisFeatureDistance = EasyMock
98  		.createMock(GisFeatureDistance.class);
99  	EasyMock.replay(mockGisFeatureDistance);
100 	results.add(mockGisFeatureDistance);
101 	EasyMock.replay(mockResultDTO);
102 	EasyMock.expect(
103 		mockSearchEngine.executeQuery((GeolocQuery) EasyMock
104 			.anyObject())).andReturn(mockResultDTO);
105 	EasyMock.replay(mockSearchEngine);
106 	String returnAction = action.search();
107 	assertEquals(FulltextSearchAction.SUCCESS, returnAction);
108 	assertEquals(mockResultDTO, action.getResponseDTO());
109 	assertTrue(action.isDisplayResults());
110     }
111 
112     @Test
113     public void searchWhenFailed() throws Exception {
114 	String errorMessage = "message";
115 	MockHttpServletRequest request = new MockHttpServletRequest("GET",
116 		"/search.html");
117 	ServletActionContext.setRequest(request);
118 	request.setParameter(GeolocServlet.LAT_PARAMETER.toString(), "3.5");
119 	request.setParameter(GeolocServlet.LONG_PARAMETER.toString(), "4.5");
120 	EasyMock.replay(mockResultDTO);
121 	EasyMock.expect(
122 		mockSearchEngine.executeQuery((GeolocQuery) EasyMock
123 			.anyObject())).andThrow(
124 		new RuntimeException(errorMessage));
125 	EasyMock.replay(mockSearchEngine);
126 	String returnAction = action.search();
127 	assertEquals(FulltextSearchAction.SUCCESS, returnAction);
128 	assertEquals(errorMessage, action.getErrorMessage());
129 	assertNull(action.getResponseDTO());
130 	assertFalse(action.isDisplayResults());
131     }
132 
133     @Test
134     public void searchPopupShouldReturnPopupView() throws Exception {
135 	MockHttpServletRequest request = new MockHttpServletRequest("GET",
136 		"/search.html");
137 	ServletActionContext.setRequest(request);
138 	request.setParameter(GeolocServlet.LAT_PARAMETER.toString(), "3.5");
139 	request.setParameter(GeolocServlet.LONG_PARAMETER.toString(), "4.5");
140 	GisFeatureDistance mockGisFeatureDistance = EasyMock
141 		.createMock(GisFeatureDistance.class);
142 	EasyMock.replay(mockGisFeatureDistance);
143 	results.add(mockGisFeatureDistance);
144 	EasyMock.replay(mockResultDTO);
145 	EasyMock.expect(
146 		mockSearchEngine.executeQuery((GeolocQuery) EasyMock
147 			.anyObject())).andReturn(mockResultDTO);
148 	EasyMock.replay(mockSearchEngine);
149 	String returnAction = action.searchpopup();
150 	assertEquals(FulltextSearchAction.POPUP_VIEW, returnAction);
151 	assertEquals(mockResultDTO, action.getResponseDTO());
152     }
153 
154     @Test
155     public void getStyleShouldReturnStyle() throws Exception {
156 	MockHttpServletRequest request = new MockHttpServletRequest("GET",
157 		"/search.html");
158 	ServletActionContext.setRequest(request);
159 	request.setParameter(GeolocServlet.LAT_PARAMETER.toString(), "3.5");
160 	request.setParameter(GeolocServlet.LONG_PARAMETER.toString(), "4.5");
161 	action.setPlacetype("GisFeature");
162 	assertEquals("GisFeature", action.getPlacetype());
163     }
164 
165     @Test
166     public void getStyleShouldReturnDefaultStyle() throws Exception {
167 	MockHttpServletRequest request = new MockHttpServletRequest("GET",
168 		"/search.html");
169 	ServletActionContext.setRequest(request);
170 	request.setParameter(GeolocServlet.LAT_PARAMETER.toString(), "3.5");
171 	request.setParameter(GeolocServlet.LONG_PARAMETER.toString(), "4.5");
172 	action.setPlacetype(null);
173 	assertEquals(GisgraphyConfig.defaultGeolocSearchPlaceTypeClass, action
174 		.getPlacetype());
175     }
176 
177     @Test
178     public void getFormatsShouldReturnFormatForGeoloc() {
179 	Assert.assertEquals(Arrays.asList(OutputFormat
180 		.listByService(GisgraphyServiceType.GEOLOC)), Arrays
181 		.asList(action.getFormats()));
182 
183     }
184 
185 }