Repository: plone/plone.app.event (language: python)

Issue:
port robot tests
see https://github.com/plone/Products.CMFPlone/issues/3813


Discussion / hints:

Fix patch:
diff --git a/news/408.feature b/news/408.feature
new file mode 100644
index 00000000..0514ad7d
--- /dev/null
+++ b/news/408.feature
@@ -0,0 +1,2 @@
+Update robot framework tests to use `robotframework-browser` (`playwright` integration on robotframework).
+[1letter]
\ No newline at end of file


Test patch:
diff --git a/plone/app/event/testing.py b/plone/app/event/testing.py
index e6e83ecf..ef5c3610 100644
--- a/plone/app/event/testing.py
+++ b/plone/app/event/testing.py
@@ -1,5 +1,5 @@
 from plone.app.event.interfaces import IBrowserLayer
-from plone.app.robotframework.testing import AUTOLOGIN_LIBRARY_FIXTURE
+from plone.app.robotframework.testing import REMOTE_LIBRARY_BUNDLE_FIXTURE
 from plone.app.testing import FunctionalTesting
 from plone.app.testing import IntegrationTesting
 from plone.app.testing import PLONE_FIXTURE
@@ -123,7 +123,7 @@ def setUpPloneSite(self, portal):
 PAEventDX_ROBOT_TESTING = FunctionalTesting(
     bases=(
         PAEventDX_FIXTURE,
-        AUTOLOGIN_LIBRARY_FIXTURE,
+        REMOTE_LIBRARY_BUNDLE_FIXTURE,
         WSGI_SERVER_FIXTURE,
     ),
     name="plone.app.event.dx:Robot",
diff --git a/plone/app/event/tests/robot/test_event_roundtrip.robot b/plone/app/event/tests/robot/test_event_roundtrip.robot
index 884a4cb9..61df8455 100644
--- a/plone/app/event/tests/robot/test_event_roundtrip.robot
+++ b/plone/app/event/tests/robot/test_event_roundtrip.robot
@@ -1,49 +1,41 @@
 *** Settings ***
 
-Resource  plone/app/robotframework/selenium.robot
-Resource  plone/app/robotframework/keywords.robot
+Resource    plone/app/robotframework/browser.robot
 
-Library  Remote  ${PLONE_URL}/RobotRemote
+Library    Remote    ${PLONE_URL}/RobotRemote
 
-Test Setup  Open test browser
-Test Teardown  Close all browsers
+Test Setup    Run Keywords    Plone test setup
+Test Teardown    Run keywords    Plone test teardown
 
-Variables  plone/app/event/tests/robot/variables.py
+Variables    variables.py
 
 
-*** Variables ***
-
-
-*** Test Cases ***
+*** Test cases ***
 
 Scenario: Create and view an event
-  Given a site owner
-    and an event add form
-  Debug
-  When I select a date in calendar overlay
-  Then it should be filled in the form
-
-  When I click on Recurrence Add
-  Then I should see the recurrence overlay
+    Given a site owner
+      and an event add form
+     When I click on Recurrence Add
+     Then I should see the recurrence overlay
 
-  When I select weekly repeat
-  Then I should see the recurrence overlay in weeekly repeat mode
+     When I select weekly repeat
+     Then I should see the recurrence overlay in weeekly repeat mode
 
-  When I fill 3 occurrences
-  Then I should see 3 occurrences in the overlay
+     When I fill 3 occurrences
+     Then I should see 3 occurrences in the overlay
 
-  When I click save in the overlay
-  Then the overlay should be closed
-   And I should see 3 occurrences in the form
+     When I click save in the overlay
+     Then the overlay should be closed
+      and I should see 3 occurrences in the form
 
-  When I click save in the form
-  Then I should see the event detail view
+     When I click save in the form
+     Then I should see the event detail view
 
-  When I open an event occurrence
-  Then I should see the occurrence detail view
+     When I open an event occurrence
+     Then I should see the occurrence detail view
 
-  When I open the event listing
-  Then I should see the event listing view
+     When I open the event listing
+     Then I should see the event listing view
 
 
 *** Keywords ***
@@ -51,115 +43,111 @@ Scenario: Create and view an event
 # Given
 
 a site owner
-  Enable autologin as  Manager
+    Enable autologin as  Manager
 
 an event add form
-  Go to  ${PLONE_URL}/++add++Event
-  Wait until page contains  Add Event
-  Input text  name=form.widgets.IDublinCore.title  Testevent
-  Input text  id=form-widgets-IDublinCore-description  Test description
-  Input text  id=form-widgets-IEventLocation-location  Test location
-  Input text  id=form-widgets-IEventAttendees-attendees  Test attendee
-  Input text  id=form-widgets-IEventContact-contact_name  Test name
-  Input text  id=form-widgets-IEventContact-contact_email  test@email.com
-  Input text  id=form-widgets-IEventContact-contact_phone  +1234567890
-  Input text  id=form-widgets-IEventContact-event_url  http://test.url
+    Go to  ${PLONE_URL}/++add++Event
+    Type text    //input[@name="form.widgets.IDublinCore.title"]    Testevent
+    Type text    //textarea[@id="form-widgets-IDublinCore-description"]    Test description
+    Type text    //input[@id="form-widgets-IEventLocation-location"]    Test location
+    Type text    //textarea[@id="form-widgets-IEventAttendees-attendees"]    Test attendee
+    Type text    //input[@id="form-widgets-IEventContact-contact_name"]    Test name
+    Type text    //input[@id="form-widgets-IEventContact-contact_email"]    test@email.com
+    Type text    //input[@id="form-widgets-IEventContact-contact_phone"]    +1234567890
+    Type text    //input[@id="form-widgets-IEventContact-event_url"]    http://test.url
+
+  # we can't set safely the date in the test via native browser ui "date input" element
+  # reason 1: different ui's, depending on language of system browser
+  #         12 hours format with meridiem input (AM/PM) vs. 24 hours format
+  # reason 2: shadow root (user-agent) can't access via css or xpath selectors
+  #
+  # temporarily solution: set value via javascript
+
+    Evaluate JavaScript    //input[@name="form.widgets.IEventBasic.start"]
+ ...    (el, arg) => {
+ ...        el.setAttribute("value", arg)
+ ...    }
+ ...    all_elements=False
+ ...    arg=${EVENT_START_ISO}
+
+    Evaluate JavaScript    //input[@name="form.widgets.IEventBasic.start"]
+ ...    (el,arg) => {
+ ...        el.setAttribute("value", arg)
+ ...    }
+ ...    all_elements=False
+ ...    arg=${EVENT_END_ISO}
 
 # When
 
-I select a date in calendar overlay
-  Click Element  xpath=//div[@data-fieldname="form.widgets.IEventBasic.start"]//input[contains(@class,"pattern-pickadate-date")]
-  Wait until page contains  Sat
-# For Javascript: Month 1 = February.
-  Select from list by label  css=div[data-fieldname="form.widgets.IEventBasic.start"] .picker__select--month  ${EVENT_START_MONTHNAME}
-  Select from list by label  css=div[data-fieldname="form.widgets.IEventBasic.start"] select.picker__select--year  ${EVENT_START_YEAR}
-  Click Element  xpath=//div[@data-fieldname="form.widgets.IEventBasic.start"]//div[contains(@class, 'picker__day')][contains(text(), "${EVENT_START_DAY}")]
-# Select Times
-  Click Element  xpath=//div[@data-fieldname="form.widgets.IEventBasic.start"]//input[contains(@class,"pattern-pickadate-time")]
-  Click Element  xpath=//div[@data-fieldname="form.widgets.IEventBasic.start"]//div[contains(@class, 'picker--time')]//li[contains(@class, 'picker__list-item')][contains(text(), "${EVENT_START_HOUR}:00")]
-
-
 I click on Recurrence Add
-  Click Link  css=a[name='riedit']
-  Wait until page contains  Repeat
+    Click  //a[@name="riedit"]
 
 I select weekly repeat
-  Select From List by label  css=#rirtemplate  weekly
+    Select Options By  //div[contains(@class,"modal-wrapper")]//select[@id="rirtemplate"]    value    weekly
 
 I fill ${NUM} occurrences
-  Input text  name=rirangebyoccurrencesvalue  ${NUM}
-  Focus  css=.risavebutton
+    Type Text    //div[contains(@class,"modal-wrapper")]//form//input[@name="rirangebyoccurrencesvalue"]    ${NUM}
+    Keyboard Key    press    Tab
 
 I click save in the overlay
-  Click Button  css=.risavebutton
+    Click    //div[contains(@class,"modal-wrapper")]//div[@class="modal-footer"]//button[contains(@class,"risavebutton")]
 
 I click save in the form
-  Click Button  name=form.buttons.save
+    Click  //button[@name="form.buttons.save"]
 
 I open an event occurrence
-  Go to  ${PLONE_URL}/testevent/2014-02-17
+    ${url}=    Get Property    //*[@id="content-core"]/div/div/div/div[2]/div[1]/div/div/div[2]/p/span[2]/a    href
+    Go to  ${url}
 
 I open the event listing
-  Go to  ${PLONE_URL}/@@event_listing?mode=all
-
+    Go to  ${PLONE_URL}/@@event_listing?mode=all
 
 # Then
 
-it should be filled in the form
-  Textfield Value Should Be  css=#formfield-form-widgets-IEventBasic-start input.pattern-pickadate-date  ${EVENT_START_MONTHNAME} ${EVENT_START_DAY}, ${EVENT_START_YEAR}
-  Textfield Should Contain  css=#formfield-form-widgets-IEventBasic-start input.pattern-pickadate-time  ${EVENT_START_HOUR}:00
-  Textfield Value Should Be  css=#formfield-form-widgets-IEventBasic-end input.pattern-pickadate-date  ${EVENT_END_MONTHNAME} ${EVENT_END_DAY}, ${EVENT_END_YEAR}
-  Textfield Should Contain  css=#formfield-form-widgets-IEventBasic-end input.pattern-pickadate-time  ${EVENT_END_HOUR}:00
-
 I should see the recurrence overlay
-  Page Should Contain  Recurrence
-  Page Should Contain  Selected dates
-  Page Should Contain Element  //div[contains(@class, 'occurrence') and contains(@class, 'start')]  1
-  Page Should Contain Element  //div[contains(@class, 'occurrence') and contains(@class, 'rrule')]  6
+    Get Text    //div[contains(@class,"modal-wrapper")]//form/div[@class="rioccurrencesactions"]/div/h6/strong    should be    Selected dates
+    Get Element Count    //div[contains(@class, 'occurrence') and contains(@class, 'start')]    should be    1
+    Get Element Count    //div[contains(@class, 'occurrence') and contains(@class, 'rrule')]    should be    6
 
 I should see the recurrence overlay in weeekly repeat mode
-  Page Should Contain  Repeats every
-  Page Should Contain  Sun
-  Page Should Contain  Mon
-  Page Should Contain  Tue
-  Page Should Contain  Wed
-  Page Should Contain  Thu
-  Page Should Contain  Fri
-  Page Should Contain  Sat
-
-the overlay should be closed
-  Page Should Not Contain  class=.riform
-
-# About class matching with x-path, see:
-# http://stackoverflow.com/questions/1604471/how-can-i-find-an-element-by-css-class-with-xpath
+    Get Text    //div[contains(@class,"modal-wrapper")]//form//div[@id="riweeklyinterval"]    contains    Repeat every
+    Get Text    //div[contains(@class,"modal-wrapper")]//form//div[@id="riweeklyweekdays"]    contains    Sun
+    Get Text    //div[contains(@class,"modal-wrapper")]//form//div[@id="riweeklyweekdays"]    contains    Mon
+    Get Text    //div[contains(@class,"modal-wrapper")]//form//div[@id="riweeklyweekdays"]    contains    Tue
+    Get Text    //div[contains(@class,"modal-wrapper")]//form//div[@id="riweeklyweekdays"]    contains    Wed
+    Get Text    //div[contains(@class,"modal-wrapper")]//form//div[@id="riweeklyweekdays"]    contains    Thu
+    Get Text    //div[contains(@class,"modal-wrapper")]//form//div[@id="riweeklyweekdays"]    contains    Fri
+    Get Text    //div[contains(@class,"modal-wrapper")]//form//div[@id="riweeklyweekdays"]    contains    Sat
 
 I should see ${NUM} occurrences in the overlay
-  Page Should Contain Element  //div[contains(concat(' ', normalize-space(@class), ' '), ' rioccurrences ')]/div[contains(@class, 'occurrence')]  ${NUM}
+    Get Element Count    //div[contains(@class,"modal-wrapper")]//div[@class="rioccurrences"]/div[contains(@class, 'occurrence')]    should be    ${NUM}
+
+the overlay should be closed
+    Get Element Count    //div[contains(@class,"modal-wrapper")]//*[contains(@class,"riform")]    should be    0
 
 I should see ${NUM} occurrences in the form
-  Page Should Contain Element  //div[contains(concat(' ', normalize-space(@class), ' '), ' ridisplay ')]/div[contains(concat(' ', normalize-space(@class), ' '), ' rioccurrences ')]/div[contains(@class, 'occurrence')]  ${NUM}
+    Get Element Count    //div[contains(@class,"ridisplay")]//div[@class="rioccurrences"]/div[contains(@class, 'occurrence')]    should be    ${NUM}
 
 I should see the event detail view
-  Page Should Contain  Testevent
-  Page Should Contain  Test description
-  Page Should Contain  All dates
-  Page Should Contain  Test location
-  Page Should Contain  Test name
-  Page Should Contain  +1234567890
-  Page Should Contain  Test attendee
-  Page Should Contain  Visit external website
-  Page Should Contain  iCal
+    Get Text    //*[@id="global_statusmessage"]    contains   Item created
+    Get Text    //article[@id="content"]/header    contains   Testevent
+    Get Text    //article[@id="content"]/header    contains   Test description
+    Get Text    //div[@id="content-core"]//div[contains(@class,"event-summary")]    contains    Test location
+    Get Text    //div[@id="content-core"]//div[contains(@class,"event-summary")]    contains    Test name
+    Get Text    //div[@id="content-core"]//div[contains(@class,"event-summary")]    contains    +1234567890
+    Get Text    //div[@id="content-core"]//div[contains(@class,"event-summary")]    contains    Test attendee
+    Get Text    //div[@id="content-core"]//div[contains(@class,"event-summary")]    contains    Visit external website
+    Get Text    //div[@id="content-core"]//div[contains(@class,"event-summary")]    contains    iCal
 
 I should see the occurrence detail view
-  Page Should Contain  Testevent
-  Page Should Contain  Test description
-  Page Should Contain  All dates
-  Page Should Contain  Test location
-  Page Should Contain  Test name
-  Page Should Contain  +1234567890
-  Page Should Contain  Test attendee
-  Page Should Contain  Visit external website
-  Page Should Contain  iCal
+    Get Text    //article[@id="content"]/header    contains   Testevent
+    Get Text    //article[@id="content"]/header    contains   Test description
+    Get Text    //div[@id="content-core"]//div[contains(@class,"event-summary")]    contains    Test location
+    Get Text    //div[@id="content-core"]//div[contains(@class,"event-summary")]    contains    Test name
+    Get Text    //div[@id="content-core"]//div[contains(@class,"event-summary")]    contains    +1234567890
+    Get Text    //div[@id="content-core"]//div[contains(@class,"event-summary")]    contains    Test attendee
+    Get Text    //div[@id="content-core"]//div[contains(@class,"event-summary")]    contains    Visit external website
+    Get Text    //div[@id="content-core"]//div[contains(@class,"event-summary")]    contains    iCal
 
 I should see the event listing view
-  Page Should Contain Element  //article[@class="vevent"]  3
+    Get Element Count    //article[contains(@class,"vevent")]    should be    3
diff --git a/plone/app/event/tests/robot/variables.py b/plone/app/event/tests/robot/variables.py
index 4514b019..646e8704 100644
--- a/plone/app/event/tests/robot/variables.py
+++ b/plone/app/event/tests/robot/variables.py
@@ -1,23 +1,10 @@
-# setup dates
 from datetime import datetime
 from datetime import timedelta
 
-import locale
-
 
 # important for MONTHNAME
-locale.setlocale(locale.LC_ALL, "en_US")
-
 NOW = datetime.now() + timedelta(days=1)
-EVENT_START_YEAR = NOW.strftime("%Y")
-EVENT_START_MONTH = str(NOW.month - 1)
-EVENT_START_MONTHNAME = NOW.strftime("%B")
-EVENT_START_DAY = NOW.strftime("%d")
-EVENT_START_HOUR = str(int(NOW.strftime("%I")))
+EVENT_START_ISO = NOW.strftime("%Y-%m-%dT%H:00")
 
 END = NOW + timedelta(hours=1)
-EVENT_END_YEAR = END.strftime("%Y")
-EVENT_END_MONTH = str(END.month - 1)
-EVENT_END_MONTHNAME = END.strftime("%B")
-EVENT_END_DAY = END.strftime("%d")
-EVENT_END_HOUR = str(int(END.strftime("%I")))
+EVENT_END_ISO = END.strftime("%Y-%m-%dT%H:00")
diff --git a/plone/app/event/tests/INACTIVE_test_robot.py b/plone/app/event/tests/test_robot.py
similarity index 97%
rename from plone/app/event/tests/INACTIVE_test_robot.py
rename to plone/app/event/tests/test_robot.py
index 83e5c391..223699c4 100644
--- a/plone/app/event/tests/INACTIVE_test_robot.py
+++ b/plone/app/event/tests/test_robot.py
@@ -1,4 +1,3 @@
-# -*- conding: utf-8 -*-
 from plone.app.event.testing import PAEventDX_ROBOT_TESTING
 from plone.app.testing import ROBOT_TEST_LEVEL
 from plone.testing import layered