001/** 002 * Copyright 2011-2013 The Kuali Foundation Licensed under the 003 * Educational Community License, Version 2.0 (the "License"); you may 004 * not use this file except in compliance with the License. You may 005 * obtain a copy of the License at 006 * 007 * http://www.osedu.org/licenses/ECL-2.0 008 * 009 * Unless required by applicable law or agreed to in writing, 010 * software distributed under the License is distributed on an "AS IS" 011 * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 012 * or implied. See the License for the specific language governing 013 * permissions and limitations under the License. 014 */ 015package org.kuali.mobility.push.controller; 016 017import static org.junit.Assert.assertTrue; 018import static org.mockito.Matchers.any; 019import static org.mockito.Mockito.when; 020 021import java.sql.Timestamp; 022import java.util.ArrayList; 023import java.util.Calendar; 024import java.util.List; 025import java.util.TimeZone; 026 027import net.sf.json.JSONSerializer; 028 029import org.apache.log4j.Logger; 030import org.junit.Before; 031import org.junit.BeforeClass; 032import org.junit.Test; 033import org.junit.runner.RunWith; 034import org.kuali.mobility.push.controllers.PreferencesController; 035import org.kuali.mobility.push.entity.Preference; 036import org.kuali.mobility.push.entity.Sender; 037import org.kuali.mobility.push.service.PreferenceService; 038import org.kuali.mobility.push.service.SenderService; 039import org.kuali.mobility.security.authn.util.AuthenticationConstants; 040import org.kuali.mobility.security.user.api.User; 041import org.kuali.mobility.security.user.api.UserDao; 042import org.kuali.mobility.security.user.entity.UserImpl; 043import org.mockito.Mock; 044import org.springframework.http.HttpStatus; 045import org.springframework.http.ResponseEntity; 046import org.springframework.mock.web.MockHttpServletRequest; 047import org.springframework.mock.web.MockHttpServletResponse; 048import org.springframework.mock.web.MockHttpSession; 049import org.springframework.mock.web.MockServletContext; 050import org.springframework.ui.ExtendedModelMap; 051import org.springframework.ui.Model; 052 053/** 054 * @author Kuali Mobility Team (mobility.collab@kuali.org) 055 */ 056/** 057 * @author mtwagner 058 * 059 */ 060@RunWith(org.mockito.runners.MockitoJUnitRunner.class) 061public class PreferencesControllerTest { 062 063 /** A reference to a logger */ 064 private static final Logger LOG = Logger.getLogger(PreferencesControllerTest.class); 065 066 private static MockServletContext servletContext; 067 private PreferencesController controller; 068 @Mock 069 private PreferenceService prefService; 070 071 @Mock 072 private SenderService senderService; 073 074 private MockHttpServletRequest request; 075 private MockHttpServletResponse response; 076 private Model uiModel; 077 078 @Mock 079 private Preference preference; 080 @Mock 081 private User user; 082 @Mock 083 private UserDao userDao; 084 085 086 @BeforeClass 087 public static void setUpClass() throws Exception { 088 servletContext = new MockServletContext(); 089 } 090 091 @Before 092 public void preTest() { 093 this.setController(new PreferencesController()); 094 this.getController().setPreferenceService(prefService); 095 this.getController().setSenderService(senderService); 096 this.setRequest(new MockHttpServletRequest(servletContext)); 097 this.setResponse(new MockHttpServletResponse()); 098 this.setUiModel(new ExtendedModelMap()); 099 this.getRequest().setSession(new MockHttpSession(servletContext)); 100 this.getRequest().getSession().setAttribute(AuthenticationConstants.KME_USER_KEY, getUser()); 101 } 102 103 @Test 104 public void testPing() { 105 ResponseEntity <String> responseEntity = getController().ping(); 106 ResponseEntity<String> expectedEntity = new ResponseEntity<String>(HttpStatus.OK); 107 assertTrue("Expected response of OK was not found.",(expectedEntity.getStatusCode()).equals(responseEntity.getStatusCode())); 108 } 109 110 @Test 111 public void testLogin() { 112 String viewName = getController().login(getRequest(), getUiModel(), "key"); 113 List<Sender> senders = new ArrayList<Sender>(); 114 when(getSenderService().findAllSenders()).thenReturn(senders); 115 assertTrue("View name does not match expected value.","redirect:/pushprefs".equals(viewName)); 116 } 117 118 @Test 119 public void testGetPreferencesWithNullUsername(){ 120 String expected = "{\"preferences\":[]}"; 121 User user = new UserImpl(); 122 List<Preference> preferences = new ArrayList<Preference>(); 123 when(getPrefService().findPreferencesByUsername("")).thenReturn(preferences); 124 125 String output = getController().getPreferences(getUiModel(), getRequest(), ""); 126 LOG.info("expected: [" + expected + "]"); 127 LOG.info("output: [" + output + "]"); 128 assertTrue("Output does not match expected value.", expected.equals(output)); 129 } 130 131 @Test 132 public void testGetPreferencesWithUsername(){ 133 Timestamp ts = new Timestamp(123456789L); 134 String timestampJson = new JSONSerializer().toJSON(ts).toString(); 135 String expected = "{\"preferences\":[{\"enabled\":false,\"id\":1,\"postedTimestamp\":"+timestampJson+",\"pushSenderID\":1,\"senderBlocked\":true,\"username\":\"userA\",\"versionNumber\":0}]}"; 136 Preference preference = new Preference(); 137 preference.setId(1L); 138 preference.setPushSenderID(1L); 139 preference.setUsername("userA"); 140 141 preference.setPostedTimestamp(ts); 142 List<Preference> preferences = new ArrayList<Preference>(); 143 preferences.add(preference); 144 145 when(getPrefService().findPreferencesByUsername("userA")).thenReturn(preferences); 146 String output = getController().getPreferences(getUiModel(), getRequest(), "userA"); 147 LOG.info("expected: [" + expected + "]"); 148 LOG.info("output: [" + output + "]"); 149 150 assertTrue("Output does not match expected value.", expected.equals(output)); 151 } 152 153 @Test 154 public void testRegisterNewPreferences() { 155 String data = "{\"enabled\":true,\"username\":\"bob\",\"senderId\":1}"; 156 when(getPrefService().findPreference(any(String.class), any(Sender.class))).thenReturn(null); 157 ResponseEntity<String> responseEntity = getController().register(data); 158 ResponseEntity<String> expectedEntity = new ResponseEntity<String>(HttpStatus.OK); 159 assertTrue("Expected response of OK was not found.", (expectedEntity.getStatusCode()).equals(responseEntity.getStatusCode())); 160 } 161 162 @Test 163 public void testRegisterPreferencesWithInvalidData() { 164 String data = "{\"enabled:true,\"username\":\"bob\",\"senderId\":1}"; 165 when(getPrefService().findPreference(any(String.class), any(Sender.class))).thenReturn(null); 166 ResponseEntity<String> responseEntity = getController().register(data); 167 ResponseEntity<String> expectedEntity = new ResponseEntity<String>(HttpStatus.BAD_REQUEST); 168 assertTrue("Expected response of BAD_REQUEST was not found.", (expectedEntity.getStatusCode()).equals(responseEntity.getStatusCode())); 169 } 170 171 @Test 172 public void testRegisterPreferencesWithNullData() { 173 when(getPrefService().findPreference(any(String.class), any(Sender.class))).thenReturn(null); 174 ResponseEntity<String> responseEntity = getController().register(null); 175 ResponseEntity<String> expectedEntity = new ResponseEntity<String>(HttpStatus.NO_CONTENT); 176 assertTrue("Expected response of NO_CONTENT was not found.", (expectedEntity.getStatusCode()).equals(responseEntity.getStatusCode())); 177 } 178 179 /** 180 * @return the servletContext 181 */ 182 public static MockServletContext getServletContext() { 183 return servletContext; 184 } 185 /** 186 * @param servletContext the servletContext to set 187 */ 188 public static void setServletContext(MockServletContext servletContext) { 189 PreferencesControllerTest.servletContext = servletContext; 190 } 191 /** 192 * @return the controller 193 */ 194 public PreferencesController getController() { 195 return controller; 196 } 197 /** 198 * @param controller the controller to set 199 */ 200 public void setController(PreferencesController controller) { 201 this.controller = controller; 202 } 203 204 205 206 /** 207 * @return the prefService 208 */ 209 public PreferenceService getPrefService() { 210 return prefService; 211 } 212 213 /** 214 * @param prefService the prefService to set 215 */ 216 public void setPrefService(PreferenceService prefService) { 217 this.prefService = prefService; 218 } 219 220 /** 221 * @return the senderService 222 */ 223 public SenderService getSenderService() { 224 return senderService; 225 } 226 227 /** 228 * @param senderService the senderService to set 229 */ 230 public void setSenderService(SenderService senderService) { 231 this.senderService = senderService; 232 } 233 234 /** 235 * @return the request 236 */ 237 public MockHttpServletRequest getRequest() { 238 return request; 239 } 240 /** 241 * @param request the request to set 242 */ 243 public void setRequest(MockHttpServletRequest request) { 244 this.request = request; 245 } 246 /** 247 * @return the response 248 */ 249 public MockHttpServletResponse getResponse() { 250 return response; 251 } 252 /** 253 * @param response the response to set 254 */ 255 public void setResponse(MockHttpServletResponse response) { 256 this.response = response; 257 } 258 /** 259 * @return the uiModel 260 */ 261 public Model getUiModel() { 262 return uiModel; 263 } 264 /** 265 * @param uiModel the uiModel to set 266 */ 267 public void setUiModel(Model uiModel) { 268 this.uiModel = uiModel; 269 } 270 /** 271 * @return the preference 272 */ 273 public Preference getPreference() { 274 return preference; 275 } 276 277 /** 278 * @param preference the preference to set 279 */ 280 public void setPreference(Preference preference) { 281 this.preference = preference; 282 } 283 284 /** 285 * @return the user 286 */ 287 public User getUser() { 288 return user; 289 } 290 /** 291 * @param user the user to set 292 */ 293 public void setUser(User user) { 294 this.user = user; 295 } 296 /** 297 * @return the userDao 298 */ 299 public UserDao getUserDao() { 300 return userDao; 301 } 302 /** 303 * @param userDao the userDao to set 304 */ 305 public void setUserDao(UserDao userDao) { 306 this.userDao = userDao; 307 } 308 309 310}