diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/BaseQRIdentifierWidget.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/BaseQRIdentifierWidget.java index e2c9a1ab941..95a397bb33c 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/BaseQRIdentifierWidget.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/BaseQRIdentifierWidget.java @@ -57,6 +57,7 @@ public abstract class BaseQRIdentifierWidget implements IsWidget { error = new Label(); error.setStyleName("errorLabel"); url = new Label(); + url.ensureDebugId("QRIdentifierURL"); VerticalPanel panel = new VerticalPanel(); panel.add(inputGrid); panel.add(qrCodeComposite); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationDetailComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationDetailComposite.java index 39372282bb9..2c09f30cc05 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationDetailComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationDetailComposite.java @@ -111,6 +111,7 @@ public class DeviceConfigurationDetailComposite extends Composite { fillCourseAreaListBox(eventsById.get(selectedValue==null||selectedValue.isEmpty() ? null : UUID.fromString(selectedValue))); }); captionPanel = new CaptionPanel(stringMessages.configuration()); + captionPanel.ensureDebugId("DeviceConfigurationDetailComposite"); VerticalPanel verticalPanel = new VerticalPanel(); contentPanel = new VerticalPanel(); cloneButton = new Button(stringMessages.save() + " + " + stringMessages.clone()); @@ -426,6 +427,7 @@ public class DeviceConfigurationDetailComposite extends Composite { private Button createQrCodeButton() { Button qrCodeButton = new Button(stringMessages.qrSync()); + qrCodeButton.ensureDebugId("DeviceConfigurationDetailsQrCodeButton"); qrCodeButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationListComposite.java index 67cdeef334a..9ac9f655b4c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationListComposite.java @@ -120,6 +120,7 @@ public class DeviceConfigurationListComposite extends Composite { CellTable table = new BaseCelltable( /* pageSize */10000, tableResource); configurationsDataProvider.addDataDisplay(table); + table.ensureDebugId("DeviceConfigurationList"); table.setWidth("100%"); ListHandler columnSortHandler = new ListHandler( configurationsDataProvider.getList()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java index a12ed737bbe..bde0ca68da2 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java @@ -79,6 +79,7 @@ public class DeviceConfigurationPanel extends SimplePanel implements DeviceConfi HorizontalPanel deviceManagementControlPanel = new HorizontalPanel(); deviceManagementControlPanel.setSpacing(5); addConfigurationButton = new Button(stringMessages.addConfiguration()); + addConfigurationButton.ensureDebugId("addDeviceConfigurationButton"); addConfigurationButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationQRIdentifierDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationQRIdentifierDialog.java index 2f71091fb2a..d0ba0944edd 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationQRIdentifierDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationQRIdentifierDialog.java @@ -90,6 +90,7 @@ public class DeviceConfigurationQRIdentifierDialog extends DialogBox { panel.add(widget); panel.add(actionPanel); setWidget(panel); + this.ensureDebugId("DeviceConfigurationQRIdentifierDialog"); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SelectNameForNewDeviceConfigurationDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SelectNameForNewDeviceConfigurationDialog.java index 050c3fe7930..4d4d31a3523 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SelectNameForNewDeviceConfigurationDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SelectNameForNewDeviceConfigurationDialog.java @@ -42,8 +42,10 @@ public class SelectNameForNewDeviceConfigurationDialog extends DataEntryDialog validator, com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback callback) { super(stringMessages.createDeviceConfiguration(), stringMessages.forWhichDeviceShouldConfigurationApply(), stringMessages.create(), stringMessages.cancel(), validator, callback); + this.ensureDebugId("SelectNameForNewDeviceConfigurationDialog"); this.stringMessages = stringMessages; this.identifierBox = createTextBox(""); + this.identifierBox.ensureDebugId("raceManagerDeviceName"); } @Override diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/AdminConsolePage.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/AdminConsolePage.java index 044dcb6390b..63803c707bf 100755 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/AdminConsolePage.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/AdminConsolePage.java @@ -22,6 +22,7 @@ import com.sap.sailing.selenium.pages.adminconsole.event.EventConfigurationPanel import com.sap.sailing.selenium.pages.adminconsole.igtimi.IgtimiAccountsManagementPanelPO; import com.sap.sailing.selenium.pages.adminconsole.leaderboard.LeaderboardConfigurationPanelPO; import com.sap.sailing.selenium.pages.adminconsole.leaderboard.LeaderboardGroupConfigurationPanelPO; +import com.sap.sailing.selenium.pages.adminconsole.racemanagementapp.RaceManagementAppPanelPO; import com.sap.sailing.selenium.pages.adminconsole.regatta.RegattaStructureManagementPanelPO; import com.sap.sailing.selenium.pages.adminconsole.roles.RoleDefinitionsPanelPO; import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesBoatsPanelPO; @@ -49,6 +50,9 @@ public class AdminConsolePage extends HostPageWithAuthentication { private static final String EVENTS_TAB_LABEL = "Events"; //$NON-NLS-1$ private static final String EVENTS_TAB_IDENTIFIER = "EventManagement"; //$NON-NLS-1$ + private static final String RACE_MANAGER_APP_TAB_LABEL = "Race Manager App"; //$NON-NLS-1$ + private static final String RACE_MANAGER_APP_TAB_IDENTIFIER = "RaceCommiteeAppPanel"; //$NON-NLS-1$ + private static final String REGATTA_STRUCTURE_TAB_LABEL = "Regattas"; //$NON-NLS-1$ private static final String REGATTA_STRUCTURE_TAB_IDENTIFIER = "RegattaStructureManagement"; //$NON-NLS-1$ @@ -160,6 +164,10 @@ public class AdminConsolePage extends HostPageWithAuthentication { return new EventConfigurationPanelPO(this.driver, goToTab(EVENTS_TAB_LABEL, EVENTS_TAB_IDENTIFIER, true)); } + public RaceManagementAppPanelPO goToRaceManagerApp() { + return new RaceManagementAppPanelPO(this.driver, goToTab(RACE_MANAGER_APP_TAB_LABEL, RACE_MANAGER_APP_TAB_IDENTIFIER, true)); + } + public UserManagementPanelPO goToUserManagement() { goToTab(ADVANCED_PARENT_LABEL, ADVANCED_TAB_PARENT_IDENTIFIER, true); return new UserManagementPanelPO(this.driver, diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/racemanagementapp/DeviceConfigurationCreateDialogPO.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/racemanagementapp/DeviceConfigurationCreateDialogPO.java new file mode 100644 index 00000000000..131938d3129 --- /dev/null +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/racemanagementapp/DeviceConfigurationCreateDialogPO.java @@ -0,0 +1,23 @@ +package com.sap.sailing.selenium.pages.adminconsole.racemanagementapp; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +import com.sap.sailing.selenium.core.BySeleniumId; +import com.sap.sailing.selenium.core.FindBy; +import com.sap.sailing.selenium.pages.common.DataEntryDialogPO; + +public class DeviceConfigurationCreateDialogPO extends DataEntryDialogPO { + + @FindBy(how = BySeleniumId.class, using = "raceManagerDeviceName") + private WebElement nameField; + + protected DeviceConfigurationCreateDialogPO(WebDriver driver, WebElement element) { + super(driver, element); + } + + public void setDeviceName(String name) { + nameField.sendKeys(name); + } + +} diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/racemanagementapp/DeviceConfigurationDetailsAreaPO.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/racemanagementapp/DeviceConfigurationDetailsAreaPO.java new file mode 100644 index 00000000000..9b0540efa8b --- /dev/null +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/racemanagementapp/DeviceConfigurationDetailsAreaPO.java @@ -0,0 +1,26 @@ +package com.sap.sailing.selenium.pages.adminconsole.racemanagementapp; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +import com.sap.sailing.selenium.core.BySeleniumId; +import com.sap.sailing.selenium.core.FindBy; +import com.sap.sailing.selenium.pages.PageArea; + +public class DeviceConfigurationDetailsAreaPO extends PageArea { + + public static final String DEVICE_CONFIGURATION_QR_CODE_DIALOG_ID = "DeviceConfigurationQRIdentifierDialog"; + + @FindBy(how = BySeleniumId.class, using = "DeviceConfigurationDetailsQrCodeButton") + private WebElement deviceConfigurationDetailsQrCodeButton; + + public DeviceConfigurationDetailsAreaPO(WebDriver driver, WebElement element) { + super(driver, element); + } + + public DeviceConfigurationQRCodeDialogPO openQRCodeDialog() { + deviceConfigurationDetailsQrCodeButton.click(); + return getPO(DeviceConfigurationQRCodeDialogPO::new, DEVICE_CONFIGURATION_QR_CODE_DIALOG_ID); + } + +} diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/racemanagementapp/DeviceConfigurationQRCodeDialogPO.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/racemanagementapp/DeviceConfigurationQRCodeDialogPO.java new file mode 100644 index 00000000000..51213e87962 --- /dev/null +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/racemanagementapp/DeviceConfigurationQRCodeDialogPO.java @@ -0,0 +1,23 @@ +package com.sap.sailing.selenium.pages.adminconsole.racemanagementapp; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +import com.sap.sailing.selenium.core.BySeleniumId; +import com.sap.sailing.selenium.core.FindBy; +import com.sap.sailing.selenium.pages.common.DataEntryDialogPO; + +public class DeviceConfigurationQRCodeDialogPO extends DataEntryDialogPO { + + @FindBy(how = BySeleniumId.class, using = "QRIdentifierURL") + private WebElement url; + + protected DeviceConfigurationQRCodeDialogPO(WebDriver driver, WebElement element) { + super(driver, element); + } + + public String getUrl() { + return url.getText(); + } + +} diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/racemanagementapp/DeviceConfigurationsTablePO.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/racemanagementapp/DeviceConfigurationsTablePO.java new file mode 100644 index 00000000000..9deeff924e9 --- /dev/null +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/racemanagementapp/DeviceConfigurationsTablePO.java @@ -0,0 +1,34 @@ +package com.sap.sailing.selenium.pages.adminconsole.racemanagementapp; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +import com.sap.sailing.selenium.pages.gwt.CellTablePO; +import com.sap.sailing.selenium.pages.gwt.DataEntryPO; +import com.sap.sailing.selenium.pages.gwt.GenericCellTablePO; + +public class DeviceConfigurationsTablePO extends GenericCellTablePO { + + public static class DeviceConfigurationEntryPO extends DataEntryPO { + + public DeviceConfigurationEntryPO(CellTablePO table, WebElement element) { + super(table, element); + } + + @Override + public Object getIdentifier() { + return getColumnContent("Device"); + } + + } + + public DeviceConfigurationsTablePO(WebDriver driver, WebElement element) { + super(driver, element, DeviceConfigurationEntryPO.class); + } + + @Override + protected DeviceConfigurationEntryPO createDataEntry(WebElement element) { + return new DeviceConfigurationEntryPO(this, element); + } + +} diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/racemanagementapp/RaceManagementAppPanelPO.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/racemanagementapp/RaceManagementAppPanelPO.java new file mode 100644 index 00000000000..7e9f6d241f8 --- /dev/null +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/racemanagementapp/RaceManagementAppPanelPO.java @@ -0,0 +1,44 @@ +package com.sap.sailing.selenium.pages.adminconsole.racemanagementapp; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +import com.sap.sailing.selenium.core.BySeleniumId; +import com.sap.sailing.selenium.core.FindBy; +import com.sap.sailing.selenium.pages.PageArea; +import com.sap.sailing.selenium.pages.adminconsole.racemanagementapp.DeviceConfigurationsTablePO.DeviceConfigurationEntryPO; +import com.sap.sailing.selenium.pages.gwt.CellTablePO; +import com.sap.sailing.selenium.pages.gwt.GenericCellTablePO; + +public class RaceManagementAppPanelPO extends PageArea { + + private static final String DEVICE_CONGIGURATION_DETAILS_AREA_ID = "DeviceConfigurationDetailComposite"; + private static final String NEW_DEVICE_CONFIGURATION_DIALOG_ID = "SelectNameForNewDeviceConfigurationDialog"; + + @FindBy(how = BySeleniumId.class, using = "addDeviceConfigurationButton") + private WebElement addDeviceConfigurationButton; + + @FindBy(how = BySeleniumId.class, using = "DeviceConfigurationList") + private WebElement deviceConfigurationListTable; + + public RaceManagementAppPanelPO(WebDriver driver, WebElement element) { + super(driver, element); + } + + public DeviceConfigurationCreateDialogPO createDeviceConfiguration() { + addDeviceConfigurationButton.click(); + return getPO(DeviceConfigurationCreateDialogPO::new, NEW_DEVICE_CONFIGURATION_DIALOG_ID); + } + + public DeviceConfigurationDetailsAreaPO getDeviceConfigurationDetails() { + DeviceConfigurationEntryPO deviceConfiguration = getLeaderboardTable().getEntries().get(0); + deviceConfiguration.select(); + return getPO(DeviceConfigurationDetailsAreaPO::new, DEVICE_CONGIGURATION_DETAILS_AREA_ID); + } + + + public CellTablePO getLeaderboardTable() { + return new GenericCellTablePO<>(this.driver, this.deviceConfigurationListTable, DeviceConfigurationEntryPO.class); + } + +} diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestLinkCreation.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestLinkCreation.java index 8d889cfa1b7..cca963202b8 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestLinkCreation.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestLinkCreation.java @@ -4,6 +4,9 @@ import java.util.Date; import javax.xml.bind.DatatypeConverter; +import org.hamcrest.Matcher; +import org.hamcrest.MatcherAssert; +import org.hamcrest.Matchers; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -16,6 +19,10 @@ import org.openqa.selenium.support.ui.WebDriverWait; import com.sap.sailing.selenium.pages.adminconsole.AdminConsolePage; import com.sap.sailing.selenium.pages.adminconsole.event.EventConfigurationPanelPO; +import com.sap.sailing.selenium.pages.adminconsole.racemanagementapp.DeviceConfigurationCreateDialogPO; +import com.sap.sailing.selenium.pages.adminconsole.racemanagementapp.DeviceConfigurationDetailsAreaPO; +import com.sap.sailing.selenium.pages.adminconsole.racemanagementapp.DeviceConfigurationQRCodeDialogPO; +import com.sap.sailing.selenium.pages.adminconsole.racemanagementapp.RaceManagementAppPanelPO; import com.sap.sailing.selenium.pages.adminconsole.regatta.RegattaDetailsCompositePO; import com.sap.sailing.selenium.pages.adminconsole.regatta.RegattaEditDialogPO; import com.sap.sailing.selenium.pages.adminconsole.regatta.RegattaListCompositePO.RegattaDescriptor; @@ -29,6 +36,7 @@ import com.sap.sailing.selenium.test.AbstractSeleniumTest; */ public class TestLinkCreation extends AbstractSeleniumTest { + private static final String DEVICE_CONFIG_NAME = "Test"; private static final String BMW_CUP_EVENT = "BMW Cup"; private static final String BMW_CUP_BOAT_CLASS = "J80"; private static final String AUDI_CUP_BOAT_CLASS = "J70"; @@ -46,6 +54,11 @@ public class TestLinkCreation extends AbstractSeleniumTest { private static final String EXPECTED_QR_CODE_TITLE = "Welcome to the public regatta Audi Business Cup (J70) (J70)!"; private static final String EXPECTED_QR_CODE_LINK_TEXT = "Please scan this QR Code with your mobile device to proceed with the registration"; + private static final String CHECK_RACE_APP_URL_REGEX = "^https:\\/\\/racemanager-app.sapsailing.com\\/invite\\" + + "?server_url=http:\\/\\/localhost(:\\d{0,5})?" + + "&device_config_identifier=" + DEVICE_CONFIG_NAME + + "&device_config_uuid=(\\w|\\d|-)*"; + @Override @Before public void setUp() { @@ -56,9 +69,9 @@ public class TestLinkCreation extends AbstractSeleniumTest { /** * Test the creation of an invitation link. *

- * Please notice, that the test checks the created invitation link by calling it and checking over the - * redirects from branch.io over production environment (my.sapsailing.com) back to localhost. The link back - * to localhost need an additional confirmation on production server. + * Please notice, that the test checks the created invitation link by calling it and checking over the redirects + * from branch.io over production environment (my.sapsailing.com) back to localhost. The link back to localhost need + * an additional confirmation on production server. */ @Test public void testRegattaOverviewInvitationLinkCreation() { @@ -101,4 +114,20 @@ public class TestLinkCreation extends AbstractSeleniumTest { Assert.assertTrue(qrCodeLink.getAttribute("href").contains("secret=" + secret)); Assert.assertTrue(qrCodeLink.getAttribute("href").contains("server=http%3A%2F%2Flocalhost%3A")); } + + /** + * Testing the generation of an invitation QR code for the Race Manager App. + */ + @Test + public void testRaceManagerAppInvitationLink() { + AdminConsolePage adminConsole = AdminConsolePage.goToPage(getWebDriver(), getContextRoot()); + RaceManagementAppPanelPO raceManagerApp = adminConsole.goToRaceManagerApp(); + DeviceConfigurationCreateDialogPO createDeviceConfiguration = raceManagerApp.createDeviceConfiguration(); + createDeviceConfiguration.setDeviceName(DEVICE_CONFIG_NAME); + createDeviceConfiguration.clickOkButtonOrThrow(); + DeviceConfigurationDetailsAreaPO deviceConfigurationDetails = raceManagerApp.getDeviceConfigurationDetails(); + DeviceConfigurationQRCodeDialogPO qrCodeDialog = deviceConfigurationDetails.openQRCodeDialog(); + Matcher matcher = Matchers.matchesRegex(CHECK_RACE_APP_URL_REGEX); + MatcherAssert.assertThat("Check URL", matcher.matches(qrCodeDialog.getUrl())); + } }