/**
   * This test doesn't really test anything, and it should ALWAYS be the last method in this class.
   * <br>
   * <br>
   * This method just resets the current user's locale so that when things are run in batches all
   * tests still work.
   */
  @Test
  public void should_resetTheLocale() {
    // set user locale to nothing
    Context.setLocale(null);

    // clear out the caches
    GlobalProperty defaultLocale =
        new GlobalProperty(
            OpenmrsConstants.GLOBAL_PROPERTY_DEFAULT_LOCALE, "", "blanking out default locale");
    Context.getAdministrationService().saveGlobalProperty(defaultLocale);
  }
  /** @see {@link LocaleUtility#getLocalesInOrder()} */
  @Test
  @Verifies(
      value = "should have default locale as the first element if user has no preferred locale",
      method = "getLocalesInOrder()")
  public void getLocalesInOrder_shouldHaveDefaultLocaleAsTheFirstElementIfUserHasNoPreferredLocale()
      throws Exception {
    // make sure the user doesn't have a locale
    Context.setLocale(null);

    Set<Locale> localesInOrder = LocaleUtility.getLocalesInOrder();
    Assert.assertEquals(LocaleUtility.getDefaultLocale(), localesInOrder.iterator().next());
  }
 /** @see {@link LocaleUtility#getLocalesInOrder()} */
 @Test
 @Verifies(
     value = "should have default locale as the second element if user has a preferred locale",
     method = "getLocalesInOrder()")
 public void getLocalesInOrder_shouldHaveDefaultLocaleAsTheSecondElementIfUserHasAPreferredLocale()
     throws Exception {
   Locale lu_UG = new Locale("lu", "UG");
   Context.setLocale(lu_UG);
   Set<Locale> localesInOrder = LocaleUtility.getLocalesInOrder();
   Iterator<Locale> it = localesInOrder.iterator();
   Assert.assertEquals(lu_UG, it.next());
   Assert.assertEquals(LocaleUtility.getDefaultLocale(), it.next());
 }
 /** @see {@link LocaleUtility#getLocalesInOrder()} */
 @Test
 @Verifies(
     value = "should return a set of locales with no duplicates",
     method = "getLocalesInOrder()")
 public void getLocalesInOrder_shouldReturnASetOfLocalesWithNoDuplicates() throws Exception {
   GlobalProperty gp =
       new GlobalProperty(
           OpenmrsConstants.GLOBAL_PROPERTY_LOCALE_ALLOWED_LIST,
           "lu_UG, lu, sw_KE, en_US, en, en, sw_KE",
           "Test Allowed list of locales");
   Context.getAdministrationService().saveGlobalProperty(gp);
   GlobalProperty defaultLocale =
       new GlobalProperty(
           OpenmrsConstants.GLOBAL_PROPERTY_DEFAULT_LOCALE, "lu", "Test Allowed list of locales");
   Context.getAdministrationService().saveGlobalProperty(defaultLocale);
   Locale lu_UG = new Locale("lu", "UG");
   Context.setLocale(lu_UG);
   // note that unique list of locales should be lu_UG, lu, sw_KE, en_US, en
   Assert.assertEquals(6, LocaleUtility.getLocalesInOrder().size());
 }
 /** @see {@link LocaleUtility#getLocalesInOrder()} */
 @Test
 @Verifies(
     value = "should return a set of locales with a predictable order",
     method = "getLocalesInOrder()")
 public void getLocalesInOrder_shouldReturnASetOfLocalesWithAPredictableOrder() throws Exception {
   GlobalProperty gp =
       new GlobalProperty(
           OpenmrsConstants.GLOBAL_PROPERTY_LOCALE_ALLOWED_LIST,
           "lu, sw_KE, en_US, en",
           "Test Allowed list of locales");
   Context.getAdministrationService().saveGlobalProperty(gp);
   Locale lu_UG = new Locale("lu", "UG");
   Context.setLocale(lu_UG);
   Set<Locale> localesInOrder = LocaleUtility.getLocalesInOrder();
   Iterator<Locale> it = localesInOrder.iterator();
   Assert.assertEquals(new Locale("lu", "UG"), it.next());
   Assert.assertEquals(LocaleUtility.getDefaultLocale(), it.next());
   Assert.assertEquals(new Locale("lu"), it.next());
   Assert.assertEquals(new Locale("sw", "KE"), it.next());
   Assert.assertEquals(new Locale("en", "US"), it.next());
   Assert.assertEquals(new Locale("en"), it.next());
 }
  @RequestMapping(method = RequestMethod.POST)
  public String loginUser(
      ModelMap model,
      HttpSession session,
      HttpServletRequest request,
      HttpServletResponse response) {

    String redirect = null;

    try {
      String username = request.getParameter("uname");
      String password = request.getParameter("pw");

      // get the place to redirect: for touch screen this is simple
      redirect = determineRedirect(request);

      // only try to authenticate if they actually typed in a username
      if (username != null && username.length() > 0) {

        Context.authenticate(username, password);

        if (Context.isAuthenticated()) {

          User user = Context.getAuthenticatedUser();

          if (user.getUserProperties() != null
              && !user.getUserProperties().containsKey("keyboardType")) {
            user.getUserProperties().put("keyboardType", "QWERTY"); // ABC is the other option
            user = Context.getUserService().saveUser(user, null);
          }
          session.setAttribute("keyboardType", user.getUserProperty("keyboardType"));

          // load the user's default locale if possible
          if (user.getUserProperties() != null) {
            if (user.getUserProperties()
                .containsKey(OpenmrsConstants.USER_PROPERTY_DEFAULT_LOCALE)) {
              String localeString =
                  user.getUserProperty(OpenmrsConstants.USER_PROPERTY_DEFAULT_LOCALE);
              Locale locale = null;
              if (localeString.length() == 5) {
                // user's locale is language_COUNTRY (i.e. en_US)
                String lang = localeString.substring(0, 2);
                String country = localeString.substring(3, 5);
                locale = new Locale(lang, country);
              } else {
                // user's locale is only the language (language plus greater than 2 char country
                // code
                locale = new Locale(localeString);
              }
              OpenmrsCookieLocaleResolver oclr = new OpenmrsCookieLocaleResolver();
              oclr.setLocale(request, response, locale);
            }
          }

          // In case the user has no preferences, make sure that the context has some locale set
          if (Context.getLocale() == null) {
            Context.setLocale(OpenmrsConstants.GLOBAL_DEFAULT_LOCALE);
          }
        }

        if (log.isDebugEnabled()) {
          log.debug("Redirecting after login to: " + redirect);
          log.debug("Locale address: " + request.getLocalAddr());
        }

        response.sendRedirect(redirect);

        // return redirect;
      }
    } catch (ContextAuthenticationException e) {
      // set the error message for the user telling them
      // to try again
      // session.setAttribute(WebConstants.OPENMRS_ERROR_ATTR, "auth.password.invalid");
      log.error("failed to authenticate: ", e);
    } catch (Exception e) {
      log.error("Uexpected auth error", e);
    }

    // send the user back the login page because they either
    // had a bad password or are locked out

    session.setAttribute(
        WebConstants.OPENMRS_MSG_ATTR,
        Context.getMessageSourceService().getMessage("rwandaprimarycare.loginFailed"));
    session.setAttribute(WebConstants.OPENMRS_LOGIN_REDIRECT_HTTPSESSION_ATTR, redirect);

    return "/module/rwandaprimarycare/login";
  }