diff --git a/src/main/java/org/olat/admin/UserAdminMainController.java b/src/main/java/org/olat/admin/UserAdminMainController.java index c0129f5f3dd563c93bb1d656b55d19f9e0997e99..933e587d3d49f303f920b00372a2a7789321dcb5 100644 --- a/src/main/java/org/olat/admin/UserAdminMainController.java +++ b/src/main/java/org/olat/admin/UserAdminMainController.java @@ -77,6 +77,7 @@ import org.olat.core.util.coordinate.LockResult; import org.olat.core.util.resource.OresHelper; import org.olat.user.UserManager; import org.olat.util.logging.activity.LoggingResourceable; +import org.springframework.beans.factory.annotation.Autowired; /** * <pre> @@ -94,7 +95,7 @@ import org.olat.util.logging.activity.LoggingResourceable; public class UserAdminMainController extends MainLayoutBasicController implements Activateable2 { public static final String EXTENSIONPOINT_MENU_MENUQUERIES = ".menu.menuqueries"; private static boolean extensionLogged = false; - OLog log = Tracing.createLoggerFor(this.getClass()); + private static final OLog log = Tracing.createLoggerFor(UserAdminMainController.class); private MenuTree olatMenuTree; private Panel content; @@ -106,7 +107,8 @@ public class UserAdminMainController extends MainLayoutBasicController implement private String activatePaneInDetailView = null; private LockResult lock; - private final UserManager userManager; + @Autowired + private UserManager userManager; /** * Constructor of the home main controller @@ -114,9 +116,7 @@ public class UserAdminMainController extends MainLayoutBasicController implement * @param wControl The current window controller */ public UserAdminMainController(UserRequest ureq, WindowControl wControl) { - super(ureq, wControl); - - userManager = UserManager.getInstance(); + super(ureq, wControl); olatMenuTree = new MenuTree("olatMenuTree"); olatMenuTree.setExpandSelectedNode(false); @@ -130,9 +130,7 @@ public class UserAdminMainController extends MainLayoutBasicController implement // allow closing of active menu tree element olatMenuTree.setExpandSelectedNode(false); - // we always start with a search controller - //fxdiff BAKS-7 Resume function OLATResourceable ores = OresHelper.createOLATResourceableInstance(firstNode.getUserObject().toString(), 0l); ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores)); WindowControl bwControl = addToHistory(ureq, ores, null); @@ -170,6 +168,7 @@ public class UserAdminMainController extends MainLayoutBasicController implement /** * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event) */ + @Override public void event(UserRequest ureq, Controller source, Event event) { if (source == contentCtr ) { if (event instanceof SingleIdentityChosenEvent) { @@ -178,7 +177,6 @@ public class UserAdminMainController extends MainLayoutBasicController implement // cleanup old userAdminCtr controller removeAsListenerAndDispose(userAdminCtr); - //fxdiff BAKS-7 Resume function OLATResourceable ores = OresHelper.createOLATResourceableInstance(Identity.class, identity.getKey()); ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores)); @@ -246,47 +244,43 @@ public class UserAdminMainController extends MainLayoutBasicController implement //first check if it is node which opens a subtree with further uobject.tree.commands if (uobject.equals("menuroles")) { - if (rolesVC == null) + if (rolesVC == null) { rolesVC = createVelocityContainer("systemroles"); - //fxdiff BAKS-7 Resume function + } addToHistory(ureq, bwControl); return rolesVC; } else if (uobject.equals("menuqueries")) { - if (queriesVC == null) + if (queriesVC == null) { queriesVC = createVelocityContainer("predefinedqueries"); - //fxdiff BAKS-7 Resume function + } addToHistory(ureq, bwControl); return queriesVC; } else if (uobject.equals("menuaccess")) { - if (queriesVC == null) + if (queriesVC == null) { queriesVC = createVelocityContainer("systemroles"); - //fxdiff BAKS-7 Resume function + } addToHistory(ureq, bwControl); return queriesVC; } else if (uobject.equals("userdelete")) { //creates the user deletin controller //if locking fails -> a contentCtrl is created //-> hence removeAsListenerAndDispose(contentCtr) is delegated to the method called! - //fxdiff BAKS-7 Resume function addToHistory(ureq, bwControl); return createAndLockUserDeleteController(ureq, bwControl); } else if (uobject.equals("userdelete_direct")) { //creates the user deletin controller //if locking fails -> a contentCtrl is created //-> hence removeAsListenerAndDispose(contentCtr) is delegated to the method called! - //fxdiff BAKS-7 Resume function addToHistory(ureq, bwControl); return createAndLockDirectUserDeleteController(ureq, bwControl); } //these nodes re-create (not stateful) content Controller (contentCtrl) - // removeAsListenerAndDispose(contentCtr); if (uobject.equals("usearch") || uobject.equals("useradmin")) { activatePaneInDetailView = null; - //fxdiff BAKS-7 Resume function contentCtr = new UsermanagerUserSearchController(ureq, bwControl); addToHistory(ureq, bwControl); listenTo(contentCtr); @@ -302,7 +296,6 @@ public class UserAdminMainController extends MainLayoutBasicController implement Boolean canCreatePwdByConfig = BaseSecurityModule.USERMANAGER_CAN_CREATE_PWD; canCreateOLATPassword = canCreatePwdByConfig.booleanValue(); } - //fxdiff BAKS-7 Resume function contentCtr = new UserCreateController(ureq, bwControl, canCreateOLATPassword); addToHistory(ureq, bwControl); listenTo(contentCtr); @@ -318,7 +311,6 @@ public class UserAdminMainController extends MainLayoutBasicController implement Boolean canCreatePwdByConfig = BaseSecurityModule.USERMANAGER_CAN_CREATE_PWD; canCreateOLATPassword = canCreatePwdByConfig.booleanValue(); } - //fxdiff BAKS-7 Resume function contentCtr = new UserImportController(ureq, bwControl, canCreateOLATPassword); addToHistory(ureq, bwControl); listenTo(contentCtr); @@ -327,7 +319,6 @@ public class UserAdminMainController extends MainLayoutBasicController implement else if (uobject.equals("admingroup")) { activatePaneInDetailView = ""; SecurityGroup[] secGroup = {BaseSecurityManager.getInstance().findSecurityGroupByName(Constants.GROUP_ADMIN)}; - //fxdiff BAKS-7 Resume function contentCtr = new UsermanagerUserSearchController(ureq, bwControl,secGroup, null, null, null, null, Identity.STATUS_VISIBLE_LIMIT, true); addToHistory(ureq, bwControl); listenTo(contentCtr); @@ -336,7 +327,6 @@ public class UserAdminMainController extends MainLayoutBasicController implement else if (uobject.equals("authorgroup")) { activatePaneInDetailView = "edit.uroles"; SecurityGroup[] secGroup = {BaseSecurityManager.getInstance().findSecurityGroupByName(Constants.GROUP_AUTHORS)}; - //fxdiff BAKS-7 Resume function contentCtr = new UsermanagerUserSearchController(ureq, bwControl,secGroup, null, null, null, null, Identity.STATUS_VISIBLE_LIMIT, true); addToHistory(ureq, bwControl); listenTo(contentCtr); @@ -346,7 +336,6 @@ public class UserAdminMainController extends MainLayoutBasicController implement activatePaneInDetailView = "edit.uroles"; // special case: use user search controller and search for all users that have author rights PermissionOnResourceable[] permissions = {new PermissionOnResourceable(Constants.PERMISSION_HASROLE, Constants.ORESOURCE_AUTHOR)}; - //fxdiff BAKS-7 Resume function UsermanagerUserSearchController myCtr = new UsermanagerUserSearchController(ureq, bwControl,null, permissions, null, null, null, Identity.STATUS_VISIBLE_LIMIT, true); addToHistory(ureq, bwControl); // now subtract users that are in the author group to get the co-authors @@ -360,7 +349,6 @@ public class UserAdminMainController extends MainLayoutBasicController implement else if (uobject.equals("resourceowners")) { activatePaneInDetailView = "edit.uroles"; PermissionOnResourceable[] permissions = {new PermissionOnResourceable(Constants.PERMISSION_HASROLE, Constants.ORESOURCE_AUTHOR)}; - //fxdiff BAKS-7 Resume function contentCtr = new UsermanagerUserSearchController(ureq, bwControl,null, permissions, null, null, null, Identity.STATUS_VISIBLE_LIMIT, true); addToHistory(ureq, bwControl); listenTo(contentCtr); @@ -369,7 +357,6 @@ public class UserAdminMainController extends MainLayoutBasicController implement else if (uobject.equals("groupmanagergroup")) { activatePaneInDetailView = "edit.uroles"; SecurityGroup[] secGroup = {BaseSecurityManager.getInstance().findSecurityGroupByName(Constants.GROUP_GROUPMANAGERS)}; - //fxdiff BAKS-7 Resume function contentCtr = new UsermanagerUserSearchController(ureq, bwControl,secGroup, null, null, null, null, Identity.STATUS_VISIBLE_LIMIT, true); addToHistory(ureq, bwControl); listenTo(contentCtr); @@ -378,7 +365,6 @@ public class UserAdminMainController extends MainLayoutBasicController implement else if (uobject.equals("usermanagergroup")) { activatePaneInDetailView = "edit.uroles"; SecurityGroup[] secGroup = {BaseSecurityManager.getInstance().findSecurityGroupByName(Constants.GROUP_USERMANAGERS)}; - //fxdiff BAKS-7 Resume function contentCtr = new UsermanagerUserSearchController(ureq, bwControl,secGroup, null, null, null, null, Identity.STATUS_VISIBLE_LIMIT, true); addToHistory(ureq, bwControl); listenTo(contentCtr); @@ -387,7 +373,6 @@ public class UserAdminMainController extends MainLayoutBasicController implement else if (uobject.equals("usergroup")) { activatePaneInDetailView = "edit.uroles"; SecurityGroup[] secGroup = {BaseSecurityManager.getInstance().findSecurityGroupByName(Constants.GROUP_OLATUSERS)}; - //fxdiff BAKS-7 Resume function contentCtr = new UsermanagerUserSearchController(ureq, bwControl,secGroup, null, null, null, null, Identity.STATUS_VISIBLE_LIMIT, true); addToHistory(ureq, bwControl); listenTo(contentCtr); @@ -396,7 +381,6 @@ public class UserAdminMainController extends MainLayoutBasicController implement else if (uobject.equals("anonymousgroup")) { activatePaneInDetailView = "edit.uroles"; SecurityGroup[] secGroup = {BaseSecurityManager.getInstance().findSecurityGroupByName(Constants.GROUP_ANONYMOUS)}; - //fxdiff BAKS-7 Resume function contentCtr = new UsermanagerUserSearchController(ureq, bwControl,secGroup, null, null, null, null, Identity.STATUS_VISIBLE_LIMIT, true); addToHistory(ureq, bwControl); listenTo(contentCtr); @@ -412,7 +396,6 @@ public class UserAdminMainController extends MainLayoutBasicController implement } else if (uobject.equals("logondeniedgroup")) { activatePaneInDetailView = "edit.uroles"; - //fxdiff BAKS-7 Resume function contentCtr = new UsermanagerUserSearchController(ureq, bwControl,null, null, null, null, null, Identity.STATUS_LOGIN_DENIED, true); addToHistory(ureq, bwControl); listenTo(contentCtr); @@ -420,7 +403,6 @@ public class UserAdminMainController extends MainLayoutBasicController implement } else if (uobject.equals("deletedusers")) { activatePaneInDetailView = "list.deletedusers"; - //fxdiff BAKS-7 Resume function contentCtr = new UsermanagerUserSearchController(ureq, bwControl,null, null, null, null, null, Identity.STATUS_DELETED, false); addToHistory(ureq, bwControl); listenTo(contentCtr); @@ -431,7 +413,6 @@ public class UserAdminMainController extends MainLayoutBasicController implement Calendar cal = Calendar.getInstance(); cal.add(Calendar.DAY_OF_MONTH, -7); Date time = cal.getTime(); - //fxdiff BAKS-7 Resume function contentCtr = new UsermanagerUserSearchController(ureq, bwControl, null, null, null, time, null, Identity.STATUS_VISIBLE_LIMIT, true); addToHistory(ureq, bwControl); listenTo(contentCtr); @@ -442,7 +423,6 @@ public class UserAdminMainController extends MainLayoutBasicController implement Calendar cal = Calendar.getInstance(); cal.add(Calendar.MONTH, -1); Date time = cal.getTime(); - //fxdiff BAKS-7 Resume function contentCtr = new UsermanagerUserSearchController(ureq, bwControl, null, null, null, time, null, Identity.STATUS_VISIBLE_LIMIT, true); addToHistory(ureq, bwControl); listenTo(contentCtr); @@ -453,7 +433,6 @@ public class UserAdminMainController extends MainLayoutBasicController implement Calendar cal = Calendar.getInstance(); cal.add(Calendar.MONTH, -6); Date time = cal.getTime(); - //fxdiff BAKS-7 Resume function contentCtr = new UsermanagerUserSearchController(ureq, bwControl, null, null, null, time, null, Identity.STATUS_VISIBLE_LIMIT, true); addToHistory(ureq, bwControl); listenTo(contentCtr); @@ -461,7 +440,6 @@ public class UserAdminMainController extends MainLayoutBasicController implement } else if (uobject.equals("created.newUsersNotification")) { activatePaneInDetailView = null; - //fxdiff BAKS-7 Resume function bwControl = addToHistory(ureq, ores, null); contentCtr = new NewUsersNotificationsController(ureq, bwControl); listenTo(contentCtr); @@ -470,7 +448,6 @@ public class UserAdminMainController extends MainLayoutBasicController implement else if (uobject.equals("noauthentication")) { activatePaneInDetailView = null; String[] auth = {null}; - //fxdiff BAKS-7 Resume function contentCtr = new UsermanagerUserSearchController(ureq, bwControl, null, null, auth, null, null, Identity.STATUS_VISIBLE_LIMIT, true); addToHistory(ureq, bwControl); listenTo(contentCtr); @@ -487,7 +464,6 @@ public class UserAdminMainController extends MainLayoutBasicController implement * @param ureq * @return */ - //fxdiff BAKS-7 Resume function private Component createAndLockDirectUserDeleteController(UserRequest ureq, WindowControl wControl) { Controller lockCtrl = acquireDeleteUserLock(ureq); if (lockCtrl == null) { @@ -508,7 +484,6 @@ public class UserAdminMainController extends MainLayoutBasicController implement * @param ureq * @return */ - //fxdiff BAKS-7 Resume function private Component createAndLockUserDeleteController(UserRequest ureq, WindowControl wControl) { Controller lockCtrl = acquireDeleteUserLock(ureq); @@ -559,12 +534,14 @@ public class UserAdminMainController extends MainLayoutBasicController implement admin = new GenericTreeNode(); admin.setTitle(translator.translate("menu.useradmin")); admin.setUserObject("useradmin"); + admin.setCssClass("o_sel_useradmin"); admin.setAltText(translator.translate("menu.useradmin.alt")); gtm.setRootNode(admin); gtnChild = new GenericTreeNode(); gtnChild.setTitle(translator.translate("menu.usearch")); gtnChild.setUserObject("usearch"); + gtnChild.setCssClass("o_sel_useradmin_search"); gtnChild.setAltText(translator.translate("menu.usearch.alt")); admin.setDelegate(gtnChild); admin.addChild(gtnChild); @@ -574,12 +551,14 @@ public class UserAdminMainController extends MainLayoutBasicController implement gtnChild = new GenericTreeNode(); gtnChild.setTitle(translator.translate("menu.ucreate")); gtnChild.setUserObject("ucreate"); + gtnChild.setCssClass("o_sel_useradmin_create"); gtnChild.setAltText(translator.translate("menu.ucreate.alt")); admin.addChild(gtnChild); gtnChild = new GenericTreeNode(); gtnChild.setTitle(translator.translate("menu.usersimport")); gtnChild.setUserObject("usersimport"); + gtnChild.setCssClass("o_sel_useradmin_import"); gtnChild.setAltText(translator.translate("menu.usersimport.alt")); admin.addChild(gtnChild); } @@ -588,12 +567,14 @@ public class UserAdminMainController extends MainLayoutBasicController implement gtnChild = new GenericTreeNode(); gtnChild.setTitle(translator.translate("menu.userdelete")); gtnChild.setUserObject("userdelete"); + gtnChild.setCssClass("o_sel_useradmin_delete"); gtnChild.setAltText(translator.translate("menu.userdelete.alt")); admin.addChild(gtnChild); gtnChild = new GenericTreeNode(); gtnChild.setTitle(translator.translate("menu.userdelete.direct")); gtnChild.setUserObject("userdelete_direct"); + gtnChild.setCssClass("o_sel_useradmin_direct_delete"); gtnChild.setAltText(translator.translate("menu.userdelete.direct.alt")); admin.addChild(gtnChild); } @@ -750,9 +731,7 @@ public class UserAdminMainController extends MainLayoutBasicController implement return gtm; } - @Override - //fxdiff BAKS-7 Resume function public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { if(entries == null || entries.isEmpty()) return; @@ -832,9 +811,9 @@ public class UserAdminMainController extends MainLayoutBasicController implement /** * @see org.olat.core.gui.control.DefaultController#doDispose(boolean) */ + @Override protected void doDispose() { // controllers disposed in BasicController releaseDeleteUserLock(); } - } diff --git a/src/main/java/org/olat/admin/user/UserCreateController.java b/src/main/java/org/olat/admin/user/UserCreateController.java index c2f394da1eef275ccc15249076a17162ec091b26..c342a67a8356b327a94a07934711da5e5e0c9d19 100644 --- a/src/main/java/org/olat/admin/user/UserCreateController.java +++ b/src/main/java/org/olat/admin/user/UserCreateController.java @@ -138,7 +138,7 @@ public class UserCreateController extends BasicController { class NewUserForm extends FormBasicController { - private OLog log = Tracing.createLoggerFor(this.getClass()); + private static final OLog log = Tracing.createLoggerFor(NewUserForm.class); private static final String formIdentifyer = NewUserForm.class.getCanonicalName(); private static final String PASSWORD_NEW1 = "passwordnew1"; @@ -174,10 +174,14 @@ class NewUserForm extends FormBasicController { @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { - uifactory.addStaticTextElement("heading1", null, translate("new.form.please.enter"), formLayout); + setFormTitle("title.newuser"); + setFormDescription("new.form.please.enter"); + formLayout.setElementCssClass("o_sel_id_create"); + usernameTextElement = uifactory.addTextElement(LOGINNAME, "username", 128, "", formLayout); usernameTextElement.setMandatory(true); usernameTextElement.setDisplaySize(30); + usernameTextElement.setElementCssClass("o_sel_id_username"); UserManager um = UserManager.getInstance(); userPropertyHandlers = um.getUserPropertyHandlersFor(formIdentifyer, true); @@ -189,6 +193,8 @@ class NewUserForm extends FormBasicController { if(userPropertyHandler.getName().equals(UserConstants.EMAIL)) { emailTextElement = (TextElement) formItem; } + + formItem.setElementCssClass("o_sel_id_" + userPropertyHandler.getName().toLowerCase()); } Map<String, String> languages = I18nManager.getInstance().getEnabledLanguagesTranslated(); @@ -216,11 +222,13 @@ class NewUserForm extends FormBasicController { psw1TextElement.setMandatory(true); psw1TextElement.setDisplaySize(30); psw1TextElement.setVisible(showPasswordFields); + psw1TextElement.setElementCssClass("o_sel_id_password1"); psw2TextElement = uifactory.addPasswordElement(PASSWORD_NEW2, "new.form.password.new2", 255, "", formLayout); psw2TextElement.setMandatory(true); psw2TextElement.setDisplaySize(30); psw2TextElement.setVisible(showPasswordFields); + psw2TextElement.setElementCssClass("o_sel_id_password2"); } uifactory.addFormSubmitButton("save", "submit.save", formLayout); diff --git a/src/main/java/org/olat/admin/user/UserSearchForm.java b/src/main/java/org/olat/admin/user/UserSearchForm.java index c8a9573793deb43e22db4f597fdaa73e85beb497..a35a2f27afa22886723c5dabae42ef4264d1fef8 100644 --- a/src/main/java/org/olat/admin/user/UserSearchForm.java +++ b/src/main/java/org/olat/admin/user/UserSearchForm.java @@ -157,8 +157,11 @@ public class UserSearchForm extends FormBasicController { @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + formLayout.setElementCssClass("o_sel_user_search_form"); + login = uifactory.addTextElement("login", "search.form.login", 128, "", formLayout); login.setVisible(isAdminProps); + login.setElementCssClass("o_sel_user_search_username"); UserManager um = UserManager.getInstance(); Translator tr = Util.createPackageTranslator( @@ -183,7 +186,8 @@ public class UserSearchForm extends FormBasicController { TextElement textElement = (TextElement)fi; textElement.setItemValidatorProvider(null); } - + + fi.setElementCssClass("o_sel_user_search_".concat(userPropertyHandler.getName().toLowerCase())); propFormItems.put(userPropertyHandler.getName(), fi); } @@ -193,6 +197,7 @@ public class UserSearchForm extends FormBasicController { // Don't use submit button, form should not be marked as dirty since this is // not a configuration form but only a search form (OLAT-5626) searchButton = uifactory.addFormLink("submit.search", buttonGroupLayout, Link.BUTTON); + searchButton.setElementCssClass("o_sel_user_search_button"); if (cancelButton) { uifactory.addFormCancelButton("cancel", buttonGroupLayout, ureq, getWindowControl()); } diff --git a/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java b/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java index 3d77275ea45d5b8050d1d5cd43e6b3691c399eed..b2f5a8c3677b9b8e036a31e9959bd9c25e0156f0 100644 --- a/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java +++ b/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java @@ -836,9 +836,11 @@ class UsermanagerUserSearchForm extends FormBasicController { @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + formLayout.setElementCssClass("o_sel_user_search_form"); login = uifactory.addTextElement("login", "search.form.login", 128, "", formLayout); login.setVisible(isAdministrativeUser); + login.setElementCssClass("o_sel_user_search_username"); items.put("login", login); Translator tr = Util.createPackageTranslator( @@ -867,7 +869,8 @@ class UsermanagerUserSearchForm extends FormBasicController { TextElement textElement = (TextElement) fi; textElement.setItemValidatorProvider(null); } - + + fi.setElementCssClass("o_sel_user_search_".concat(userPropertyHandler.getName().toLowerCase())); fi.setTranslator(tr); items.put(fi.getName(), fi); } diff --git a/src/main/java/org/olat/admin/user/imp/UserImportController.java b/src/main/java/org/olat/admin/user/imp/UserImportController.java index 42e5414513731d1c0f466aad71dc8ea44156ed26..86c284f1205229374cd563ba6c1c9e2f141b881f 100644 --- a/src/main/java/org/olat/admin/user/imp/UserImportController.java +++ b/src/main/java/org/olat/admin/user/imp/UserImportController.java @@ -106,6 +106,7 @@ public class UserImportController extends BasicController { this.canCreateOLATPassword = canCreateOLATPassword; mainVC = createVelocityContainer("importindex"); startLink = LinkFactory.createButton("import.start", mainVC, this); + startLink.setElementCssClass("o_sel_id_start_import_user_button"); startLink.setPrimary(true); putInitialPanel(mainVC); } diff --git a/src/test/java/org/olat/selenium/UserTest.java b/src/test/java/org/olat/selenium/UserTest.java index f40e0bf3a076e146993baa22545f9c1b0e8f82ac..7cd810c4e57e44749d1339fb67c30ff82ff5d5c2 100644 --- a/src/test/java/org/olat/selenium/UserTest.java +++ b/src/test/java/org/olat/selenium/UserTest.java @@ -40,9 +40,12 @@ import org.junit.runner.RunWith; import org.olat.restapi.support.vo.CourseVO; import org.olat.selenium.page.LoginPage; import org.olat.selenium.page.NavigationPage; +import org.olat.selenium.page.User; import org.olat.selenium.page.course.CoursePageFragment; import org.olat.selenium.page.graphene.OOGraphene; +import org.olat.selenium.page.user.ImportUserPage; import org.olat.selenium.page.user.PortalPage; +import org.olat.selenium.page.user.UserAdminPage; import org.olat.selenium.page.user.UserPasswordPage; import org.olat.selenium.page.user.UserPreferencesPageFragment; import org.olat.selenium.page.user.UserPreferencesPageFragment.ResumeOption; @@ -442,4 +445,97 @@ public class UserTest { //we are in "My courses", check OOGraphene.waitElement(NavigationPage.myCoursesAssertBy, browser); } + + /** + * The administrator create an user, the user log in. + * + * @param loginPage + * @throws IOException + * @throws URISyntaxException + */ + @Test + @RunAsClient + public void createUser(@InitialPage LoginPage loginPage, + @Drone @User WebDriver userBrowser) + throws IOException, URISyntaxException { + //login + loginPage + .assertOnLoginPage() + .loginAs("administrator", "openolat") + .resume(); + + String uuid = UUID.randomUUID().toString(); + String username = "miku-" + uuid; + UserVO userVo = UserAdminPage.createUserVO(username, "Miku", "Hatsune", "miku-" + uuid + "@openolat.com", "miku01"); + UserAdminPage userAdminPage = navBar + .openUserManagement() + .openCreateUser() + .fillUserForm(userVo) + .assertOnUserEditView(username); + + userAdminPage + .openSearchUser() + .searchByUsername(username) + .assertOnUserInList(username) + .selectByUsername(username) + .assertOnUserEditView(username); + + //user log in + LoginPage userLoginPage = LoginPage.getLoginPage(userBrowser, deploymentUrl); + //tools + userLoginPage + .loginAs(username, "miku01") + .resume() + .assertLoggedIn(userVo); + } + + /** + * Import 2 new users and check if the first can log in. + * + * @param loginPage + * @param userBrowser + * @throws IOException + * @throws URISyntaxException + */ + @Test + @RunAsClient + public void importUsers(@InitialPage LoginPage loginPage, + @Drone @User WebDriver userBrowser) + throws IOException, URISyntaxException { + //login + loginPage + .assertOnLoginPage() + .loginAs("administrator", "openolat") + .resume(); + + UserAdminPage userAdminPage = navBar + .openUserManagement() + .openImportUsers(); + //start import wizard + ImportUserPage importWizard = userAdminPage.startImport(); + + String uuid = UUID.randomUUID().toString(); + String username1 = "moka-" + uuid; + String username2 = "mizore-" + uuid; + + StringBuilder csv = new StringBuilder(); + importWizard.append(username1, "rosario01", "Moka", "Akashiya", csv); + importWizard.append(username2, "vampire01", "Mizore", "Shirayuki", csv); + importWizard + .fill(csv.toString()) + .next() // -> preview + .next() // -> groups + .next() // -> emails + .finish(); + + OOGraphene.waitAndCloseBlueMessageWindow(browser); + + //user log in + LoginPage userLoginPage = LoginPage.getLoginPage(userBrowser, deploymentUrl); + //tools + userLoginPage + .loginAs(username1, "rosario01") + .resume() + .assertLoggedIn(username1); + } } diff --git a/src/test/java/org/olat/selenium/page/LoginPage.java b/src/test/java/org/olat/selenium/page/LoginPage.java index c82430671da9255fe8d1f681531a7dde3ed3ac0f..3bbf05ff8bf8d246494cba4e2249f951d84ae841 100644 --- a/src/test/java/org/olat/selenium/page/LoginPage.java +++ b/src/test/java/org/olat/selenium/page/LoginPage.java @@ -79,6 +79,14 @@ public class LoginPage { Assert.assertTrue(name.contains(user.getLastName())); } + public void assertLoggedIn(String username) { + WebElement usernameEl = browser.findElement(usernameFooterBy); + Assert.assertNotNull(usernameEl); + Assert.assertTrue(usernameEl.isDisplayed()); + String value = usernameEl.getText(); + Assert.assertTrue(value.contains(username)); + } + /** * Login and accept the disclaimer if there is one. * diff --git a/src/test/java/org/olat/selenium/page/NavigationPage.java b/src/test/java/org/olat/selenium/page/NavigationPage.java index 1536a98fc7cdb4ac1f3314cfc3e579b9cef4978e..5426d067ea44330d24cc2b9d40a1bf3870938aa0 100644 --- a/src/test/java/org/olat/selenium/page/NavigationPage.java +++ b/src/test/java/org/olat/selenium/page/NavigationPage.java @@ -31,6 +31,7 @@ import org.olat.selenium.page.group.GroupsPage; import org.olat.selenium.page.repository.AuthoringEnvPage; import org.olat.selenium.page.repository.CatalogAdminPage; import org.olat.selenium.page.user.PortalPage; +import org.olat.selenium.page.user.UserAdminPage; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; @@ -97,8 +98,9 @@ public class NavigationPage { return new MyCoursesPage(browser); } - public void openUserManagement() { + public UserAdminPage openUserManagement() { navigate(userManagementBy); + return UserAdminPage.getUserAdminPage(browser); } public AdministrationPage openAdministration() { diff --git a/src/test/java/org/olat/selenium/page/user/ImportUserPage.java b/src/test/java/org/olat/selenium/page/user/ImportUserPage.java new file mode 100644 index 0000000000000000000000000000000000000000..74bca1f1fe5f7c91a6d703727837c59a1e041c2b --- /dev/null +++ b/src/test/java/org/olat/selenium/page/user/ImportUserPage.java @@ -0,0 +1,122 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.selenium.page.user; + +import java.awt.Toolkit; +import java.awt.datatransfer.StringSelection; + +import org.junit.Assert; +import org.olat.selenium.page.graphene.OOGraphene; +import org.openqa.selenium.By; +import org.openqa.selenium.Keys; +import org.openqa.selenium.Platform; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +/** + * + * Drive the user import wizard. + * + * Initial date: 04.05.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class ImportUserPage { + + public static final By nextBy = By.className("o_wizard_button_next"); + public static final By finishBy = By.className("o_wizard_button_finish"); + + private WebDriver browser; + + public ImportUserPage(WebDriver browser) { + this.browser = browser; + } + + public ImportUserPage fill(String csv) { + By importTextareaBy = By.cssSelector("div.o_wizard_steps_current_content textarea"); + WebElement importTextareaEl = browser.findElement(importTextareaBy); + Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(csv), null); + if(Platform.MAC.equals(Platform.getCurrent())) { + importTextareaEl.sendKeys(Keys.COMMAND + "v"); + } else { + importTextareaEl.sendKeys(Keys.CONTROL + "v"); + } + return this; + } + + /** + * Append a line in the form:<br/> + * Benutzername * Passwort Sprache Vorname * Nachname * E-Mail * Institution Institutionsnummer Institutions E-Mail<br/> + * demo olat4you de Peter Muster peter.muster@demo.ch Universität Zürich 08-123-987 peter.muster@uzh.ch<br/> + * + * + * + * @param username + * @param password + * @param firstName + * @param lastName + * @param sb + */ + public void append(String username, String password, String firstName, String lastName, StringBuilder sb) { + + String email = username.replace("-", "") + "@frentix.com"; + String institution = "frentix GmbH"; + String institutionNumber = "034-" + System.currentTimeMillis(); + String institutionEmail = username.replace("-", "") + "@openolat.org"; + + sb.append(username).append(" ") + .append(password).append(" ") + .append("de").append(" ") + .append(firstName).append(" ") + .append(lastName).append(" ") + .append(email).append(" ") + .append(institution).append(" ") + .append(institutionNumber).append(" ") + .append(institutionEmail).append('\n'); + } + + /** + * Next + * @return this + */ + public ImportUserPage next() { + WebElement next = browser.findElement(nextBy); + Assert.assertTrue(next.isDisplayed()); + Assert.assertTrue(next.isEnabled()); + next.click(); + OOGraphene.waitBusy(browser); + return this; + } + + /** + * Finish the wizard + * @return this + */ + public ImportUserPage finish() { + WebElement finish = browser.findElement(finishBy); + Assert.assertTrue(finish.isDisplayed()); + Assert.assertTrue(finish.isEnabled()); + finish.click(); + OOGraphene.waitBusy(browser); + OOGraphene.closeBlueMessageWindow(browser); + return this; + } + +} diff --git a/src/test/java/org/olat/selenium/page/user/UserAdminPage.java b/src/test/java/org/olat/selenium/page/user/UserAdminPage.java new file mode 100644 index 0000000000000000000000000000000000000000..1a0628b43c35f1a7cc57d8151c75e79dbdeb0dce --- /dev/null +++ b/src/test/java/org/olat/selenium/page/user/UserAdminPage.java @@ -0,0 +1,186 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.selenium.page.user; + +import java.util.List; + +import org.junit.Assert; +import org.olat.selenium.page.graphene.OOGraphene; +import org.olat.user.restapi.UserVO; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +/** + * + * Initial date: 30.04.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class UserAdminPage { + + public static final By menuTreeeBy = By.className("o_sel_useradmin_search"); + + private WebDriver browser; + + public UserAdminPage(WebDriver browser) { + this.browser = browser; + } + + public static UserAdminPage getUserAdminPage(WebDriver browser) { + OOGraphene.waitElement(menuTreeeBy, browser); + WebElement main = browser.findElement(By.id("o_main")); + Assert.assertTrue(main.isDisplayed()); + return new UserAdminPage(browser); + } + + public UserAdminPage openCreateUser() { + By createBy = By.cssSelector(".o_tree li.o_sel_useradmin_create>div>span.o_tree_link>a"); + WebElement createMenuItem = browser.findElement(createBy); + createMenuItem.click(); + OOGraphene.waitBusy(browser); + return this; + } + + public UserAdminPage openSearchUser() { + By createBy = By.cssSelector(".o_tree li.o_sel_useradmin_search>div>span.o_tree_link>a"); + browser.findElement(createBy).click(); + OOGraphene.waitBusy(browser); + return this; + } + + public UserAdminPage openImportUsers() { + By importBy = By.cssSelector(".o_tree li.o_sel_useradmin_import>div>span.o_tree_link>a"); + browser.findElement(importBy).click(); + OOGraphene.waitBusy(browser); + return this; + } + + public ImportUserPage startImport() { + By importBy = By.cssSelector("a.o_sel_id_start_import_user_button.btn-primary"); + browser.findElement(importBy).click(); + OOGraphene.waitBusy(browser); + return new ImportUserPage(browser); + } + + public static UserVO createUserVO(String username, String firstName, String lastName, String email, String password) { + UserVO userVo = new UserVO(); + userVo.setLogin(username); + userVo.setFirstName(firstName); + userVo.setLastName(lastName); + userVo.setEmail(email); + userVo.setPassword(password); + return userVo; + } + + public UserAdminPage fillUserForm(String username, String firstName, String lastName, String email, String password) { + UserVO userVo = createUserVO(username, firstName, lastName, email, password); + return fillUserForm(userVo); + } + + public UserAdminPage fillUserForm(UserVO userVo) { + By usernameBy = By.cssSelector(".o_sel_id_create .o_sel_id_username input[type='text']"); + WebElement usernameEl = browser.findElement(usernameBy); + usernameEl.sendKeys(userVo.getLogin()); + + By firstNameBy = By.cssSelector(".o_sel_id_create .o_sel_id_firstname input[type='text']"); + WebElement firstNameEL = browser.findElement(firstNameBy); + firstNameEL.sendKeys(userVo.getFirstName()); + + By lastNameBy = By.cssSelector(".o_sel_id_create .o_sel_id_lastname input[type='text']"); + WebElement lastNameEl = browser.findElement(lastNameBy); + lastNameEl.sendKeys(userVo.getLastName()); + + By emailBy = By.cssSelector(".o_sel_id_create .o_sel_id_email input[type='text']"); + WebElement emailEl = browser.findElement(emailBy); + emailEl.sendKeys(userVo.getEmail()); + + By password1By = By.cssSelector(".o_sel_id_create .o_sel_id_password1 input[type='password']"); + WebElement password1El = browser.findElement(password1By); + password1El.sendKeys(userVo.getPassword()); + + By password2By = By.cssSelector(".o_sel_id_create .o_sel_id_password2 input[type='password']"); + WebElement password2El = browser.findElement(password2By); + password2El.sendKeys(userVo.getPassword()); + + By saveBy = By.cssSelector(".o_sel_id_create button.btn-primary"); + browser.findElement(saveBy).click(); + OOGraphene.waitBusy(browser); + return this; + } + + public UserAdminPage assertOnUserEditView(String username) { + By userInfoTdBy = By.cssSelector(".o_user_infos table tr td"); + List<WebElement> tds = browser.findElements(userInfoTdBy); + boolean found = false; + for(WebElement td:tds) { + String text = td.getText(); + if(text != null && text.equals(username)) { + found = true; + break; + } + } + Assert.assertTrue(found); + return this; + } + + public UserAdminPage searchByUsername(String username) { + By usernameBy = By.cssSelector(".o_sel_user_search_form .o_sel_user_search_username input[type='text']"); + WebElement usernameEl = browser.findElement(usernameBy); + usernameEl.sendKeys(username); + + By searchBy = By.cssSelector(".o_sel_user_search_form a.btn-default"); + browser.findElement(searchBy).click(); + OOGraphene.waitBusy(browser); + + return this; + } + + public UserAdminPage assertOnUserInList(String username) { + By userLinksBy = By.xpath("//div[contains(@class,'o_table_wrapper')]//table//tr//td//a[text()[contains(.,'" + username + "')]]"); + List<WebElement> usernameEls = browser.findElements(userLinksBy); + Assert.assertFalse(usernameEls.isEmpty()); + return this; + } + + public UserAdminPage selectByUsername(String username) { + By rows = By.cssSelector("div.o_table_wrapper table tbody tr"); + By usernameLinksBy = By.xpath("td//a[text()[contains(.,'" + username + "')]]"); + By selectBy = By.xpath("td//a[contains(@href,'select.user')]"); + + WebElement selectEl = null; + List<WebElement> rowEls = browser.findElements(rows); + for(WebElement rowEl:rowEls) { + List<WebElement> usernameLinkEls = rowEl.findElements(usernameLinksBy); + if(usernameLinkEls.size() > 0) { + List<WebElement> selectEls = rowEl.findElements(selectBy); + if(selectEls.size() > 0) { + selectEl = selectEls.get(0); + } + + } + } + + Assert.assertNotNull(selectEl); + selectEl.click(); + OOGraphene.waitBusy(browser); + return this; + } +}