jenkins-bot has submitted this change and it was merged. Change subject: Selenium Tests for Time UI ......................................................................
Selenium Tests for Time UI Bug: 48577 Change-Id: I855c41080d108d6b549cdf6a3cd99aad787f8ad1 --- A repo/tests/selenium/statements/statements_time_spec.rb M selenium/Rakefile M selenium/lib/modules/statement_module.rb A selenium/lib/modules/time_module.rb M selenium/lib/pages/entity_page.rb 5 files changed, 330 insertions(+), 13 deletions(-) Approvals: Henning Snater: Looks good to me, approved jenkins-bot: Verified diff --git a/repo/tests/selenium/statements/statements_time_spec.rb b/repo/tests/selenium/statements/statements_time_spec.rb new file mode 100644 index 0000000..2a12750 --- /dev/null +++ b/repo/tests/selenium/statements/statements_time_spec.rb @@ -0,0 +1,236 @@ +# -*- encoding : utf-8 -*- +# Wikidata UI tests +# +# Author:: Tobias Gritschacher ([email protected]) +# License:: GNU GPL v2+ +# +# tests for time type statements + +require 'spec_helper' + +item_label = generate_random_string(10) +item_description = generate_random_string(20) +prop_label = generate_random_string(10) +prop_description = generate_random_string(20) +prop_datatype = "Time" +not_recognized = "no valid value recognized" +time_values = Array.new +time_values.push({ + "input" => "1 1 1", + "precision" => "auto", + "calendar" => "auto", + "expected_precision" => "day", + "expected_preview" => "January 1, 1", + "expected_calendarhint" => "" +}) +time_values.push({ + "input" => "12.11.1981", + "precision" => "auto", + "calendar" => "auto", + "expected_precision" => "day", + "expected_preview" => "December 11, 1981", + "expected_calendarhint" => "" +}) +time_values.push({ + "input" => "12.11.1929", + "precision" => "auto", + "calendar" => "auto", + "expected_precision" => "day", + "expected_preview" => "December 11, 1929", + "expected_calendarhint" => "(Gregorian calendar)" +}) +time_values.push({ + "input" => "5.20.1582", + "precision" => "auto", + "calendar" => "auto", + "expected_precision" => "day", + "expected_preview" => "May 20, 1582", + "expected_calendarhint" => "(Julian calendar)" +}) +time_values.push({ + "input" => "5.20.2000", + "precision" => "month", + "calendar" => "auto", + "expected_precision" => "month", + "expected_preview" => "May 2000", + "expected_calendarhint" => "" +}) +time_values.push({ + "input" => "5 2000", + "precision" => "auto", + "calendar" => "auto", + "expected_precision" => "month", + "expected_preview" => "May 2000", + "expected_calendarhint" => "" +}) +time_values.push({ + "input" => "5.20.2000", + "precision" => "year", + "calendar" => "auto", + "expected_precision" => "year", + "expected_preview" => "2000", + "expected_calendarhint" => "" +}) +time_values.push({ + "input" => "19.12.1981", + "precision" => "century", + "calendar" => "auto", + "expected_precision" => "century", + "expected_preview" => "20. century", + "expected_calendarhint" => "" +}) +time_values.push({ + "input" => "19.12.1981", + "precision" => "decade", + "calendar" => "auto", + "expected_precision" => "decade", + "expected_preview" => "1980s", + "expected_calendarhint" => "" +}) +time_values.push({ + "input" => "19.12.1981", + "precision" => "million years", + "calendar" => "auto", + "expected_precision" => "million years", + "expected_preview" => "in 1 million years", + "expected_calendarhint" => "" +}) +time_values.push({ + "input" => "19.12.1981", + "precision" => "century", + "calendar" => "auto", + "expected_precision" => "century", + "expected_preview" => "20. century", + "expected_calendarhint" => "" +}) +time_values.push({ + "input" => "April 12 1900", + "precision" => "auto", + "calendar" => "Julian", + "expected_precision" => "day", + "expected_preview" => "April 12, 1900", + "expected_calendarhint" => "(Julian calendar)" +}) +time_values.push({ + "input" => "stuff", + "precision" => "auto", + "calendar" => "auto", + "expected_precision" => "day", + "expected_preview" => not_recognized, + "expected_calendarhint" => "" +}) + +describe "Check time statements UI" do + before :all do + # set up: create item & properties + visit_page(CreateItemPage) do |page| + page.create_new_item(item_label, item_description) + end + visit_page(NewPropertyPage) do |page| + page.create_new_property(prop_label, prop_description, prop_datatype) + end + end + + context "Check time UI" do + it "should check time input extender behaviour" do + on_page(ItemPage) do |page| + page.navigate_to_item + page.wait_for_entity_to_load + page.addStatement + page.entitySelectorInput = prop_label + ajax_wait + page.wait_for_entity_selector_list + page.wait_for_property_value_box + page.statementValueInputField = time_values[0]["input"] + page.timeInputExtender_element.when_visible + page.timeInputExtender_element.visible?.should be_true + page.timeInputExtenderClose_element.click + page.timeInputExtender_element.when_not_visible + page.timeInputExtender_element.visible?.should be_false + page.statementValueInputField_element.click + page.timeInputExtender_element.when_visible + page.timeInputExtender_element.visible?.should be_true + page.timePreviewValue_element.visible?.should be_true + page.timeInputExtenderAdvanced_element.visible?.should be_true + page.timeInputExtenderAdvanced + page.timePrecision_element.when_visible + page.timePrecision_element.visible?.should be_true + page.timeCalendar_element.visible?.should be_true + page.timePrecisionRotatorSelect?.should be_true + page.timeCalendarRotatorSelect?.should be_true + page.timeInputExtenderAdvanced + page.timePrecision_element.when_not_visible + page.timePrecision_element.visible?.should be_false + page.timeCalendar_element.visible?.should be_false + page.timeInputExtenderAdvanced + page.timePrecision_element.when_visible + page.timePrecisionRotatorSelect + page.timePrecisionMenu_element.when_visible + page.timePrecisionMenu_element.visible?.should be_true + page.timePrecisionRotatorSelect + page.timePrecisionMenu_element.when_not_visible + page.timePrecisionMenu_element.visible?.should be_false + page.timeCalendarRotatorSelect + page.timeCalendarMenu_element.when_visible + page.timeCalendarMenu_element.visible?.should be_true + page.timeCalendarRotatorSelect + page.timeCalendarMenu_element.when_not_visible + page.timeCalendarMenu_element.visible?.should be_false + end + end + + time_values.each do |time| + it "should check preview for '" + time["input"] + "'/" + time["precision"] + '/' + time["calendar"] do + on_page(ItemPage) do |page| + page.navigate_to_item + page.wait_for_entity_to_load + page.addStatement + page.entitySelectorInput = prop_label + ajax_wait + page.wait_for_entity_selector_list + page.wait_for_property_value_box + page.statementValueInputField_element.clear + page.statementValueInputField = time["input"] + page.timeInputExtender_element.when_visible + page.select_precision time["precision"] + page.select_calendar time["calendar"] + page.timePreviewValue.should == time["expected_preview"] + page.timePrecisionRotatorSelect_element.text.should == time["expected_precision"] + if time["expected_calendarhint"] == "" + page.timeCalendarHint_element.visible?.should be_false + else + page.timeCalendarHint_element.visible?.should be_true + page.timeCalendarHintMessage.should == time["expected_calendarhint"] + end + page.cancelStatement + end + end + end + + it "should check saving of time" do + on_page(ItemPage) do |page| + page.navigate_to_item + page.wait_for_entity_to_load + page.addStatement + page.entitySelectorInput = prop_label + ajax_wait + page.wait_for_entity_selector_list + page.wait_for_property_value_box + page.statementValueInputField = time_values[0]["input"] + page.saveStatement?.should be_true + page.saveStatement + ajax_wait + page.wait_for_statement_request_finished + page.statement1ClaimValue1Nolink.should == time_values[0]["expected_preview"] + @browser.refresh + page.wait_for_entity_to_load + page.statement1ClaimValue1Nolink.should == time_values[0]["expected_preview"] + end + end + end + + after :all do + # tear down + end + +end \ No newline at end of file diff --git a/selenium/Rakefile b/selenium/Rakefile index 314e800..1198a24 100644 --- a/selenium/Rakefile +++ b/selenium/Rakefile @@ -220,7 +220,7 @@ RSpec::Core::RakeTask.new(:statements) do |spec| spec.ruby_opts = "-I lib:spec" - spec.pattern = '../repo/tests/selenium/statements/{statements_spec.rb,statements_cm_spec.rb,statements_item_spec.rb,statements_string_spec.rb,references_spec.rb,qualifiers_spec.rb,statements_deleted_prop_spec.rb,statements_deleted_item_spec.rb}' + spec.pattern = '../repo/tests/selenium/statements/{statements_spec.rb,statements_cm_spec.rb,statements_item_spec.rb,statements_string_spec.rb,statements_time_spec.rb,references_spec.rb,qualifiers_spec.rb,statements_deleted_prop_spec.rb,statements_deleted_item_spec.rb}' end RSpec::Core::RakeTask.new(:statements_basic) do |spec| @@ -243,6 +243,11 @@ spec.pattern = '../repo/tests/selenium/statements/statements_string_spec.rb' end +RSpec::Core::RakeTask.new(:statements_time) do |spec| + spec.ruby_opts = "-I lib:spec" + spec.pattern = '../repo/tests/selenium/statements/statements_time_spec.rb' +end + RSpec::Core::RakeTask.new(:statements_bugs) do |spec| spec.ruby_opts = "-I lib:spec" spec.pattern = '../repo/tests/selenium/statements/statements_bugs_spec.rb' diff --git a/selenium/lib/modules/statement_module.rb b/selenium/lib/modules/statement_module.rb index 4f792a5..7f065d4 100644 --- a/selenium/lib/modules/statement_module.rb +++ b/selenium/lib/modules/statement_module.rb @@ -11,6 +11,7 @@ include EntitySelectorPage include ReferencePage include QualifierPage + # statements UI elements link(:addStatement, :xpath => "//div[contains(@class, 'wb-claimlist')]/span[contains(@class, 'wb-addtoolbar')]/div/span/span/a") link(:addClaimToFirstStatement, :xpath => "//div[contains(@class, 'wb-claim-section')][1]/span[contains(@class, 'wb-addtoolbar')]/div/span/span/a") @@ -18,9 +19,8 @@ link(:saveStatement, :xpath => "//span[contains(@class, 'wb-edittoolbar')]/span/span/span[contains(@class, 'wb-ui-toolbar-editgroup-ineditmode')]/span/a[text()='save']") link(:cancelStatement, :xpath => "//span[contains(@class, 'wb-edittoolbar')]/span/span/span[contains(@class, 'wb-ui-toolbar-editgroup-ineditmode')]/span/a[text()='cancel']") link(:removeClaimButton, :xpath => "//span[contains(@class, 'wb-edittoolbar')]/span/span/span[contains(@class, 'wb-ui-toolbar-editgroup-ineditmode')]/span/a[text()='remove']") - # TODO: could this lead to problems? for CM & item type properties there is an additional "a" element around the textbox; this is not the case for string type properies - #text_area(:statementValueInput, :xpath => "//div[contains(@class, 'valueview-ineditmode')]/div/a/textarea[contains(@class, 'valueview-input')]") text_area(:statementValueInput, :class => "valueview-input") + text_field(:statementValueInputField, :class => "valueview-input") div(:claimEditMode, :xpath => "//div[contains(@class, 'wb-claim-section')]/div[contains(@class, 'wb-edit')]") div(:statement1Name, :xpath => "//div[contains(@class, 'wb-claim-section')][1]/div[contains(@class, 'wb-claim-section-name')]/div[contains(@class, 'wb-claim-name')]") div(:statement2Name, :xpath => "//div[contains(@class, 'wb-claim-section')][2]/div[contains(@class, 'wb-claim-section-name')]/div[contains(@class, 'wb-claim-name')]") @@ -40,7 +40,7 @@ def wait_for_property_value_box wait_until do - self.statementValueInput? + self.statementValueInput? || self.statementValueInputField? end end @@ -59,6 +59,9 @@ if self.statementValueInput? self.statementValueInput = statement_value ajax_wait + elsif self.statementValueInputField? + self.statementValueInputField = statement_value + ajax_wait end saveStatement ajax_wait @@ -66,15 +69,15 @@ end def edit_first_statement(statement_value) - editFirstStatement - self.wait_for_property_value_box - self.statementValueInput_element.clear - self.statementValueInput = statement_value - ajax_wait - saveStatement - ajax_wait - self.wait_for_statement_request_finished - end + editFirstStatement + self.wait_for_property_value_box + self.statementValueInput_element.clear + self.statementValueInput = statement_value + ajax_wait + saveStatement + ajax_wait + self.wait_for_statement_request_finished + end def add_claim_to_first_statement(statement_value) addClaimToFirstStatement diff --git a/selenium/lib/modules/time_module.rb b/selenium/lib/modules/time_module.rb new file mode 100644 index 0000000..3ffd10e --- /dev/null +++ b/selenium/lib/modules/time_module.rb @@ -0,0 +1,72 @@ +# -*- encoding : utf-8 -*- +# Wikidata UI tests +# +# Author:: Tobias Gritschacher ([email protected]) +# License:: GNU GPL v2+ +# +# module for time page object + +module TimePage + include PageObject + # time UI elements + div(:timeInputExtender, :class => "ui-inputextender-extension") + div(:timeInputExtenderClose, :class => "ui-inputextender-extension-close") + div(:timePreview, :xpath => "//div[contains(@class, 'ui-inputextender-extension')]/div[contains(@class, 'valueview-preview')]") + div(:timePreviewLabel, :xpath => "//div[contains(@class, 'ui-inputextender-extension')]/div[contains(@class, 'valueview-preview')]/div[contains(@class, 'valueview-preview-label')]") + div(:timePreviewValue, :xpath => "//div[contains(@class, 'ui-inputextender-extension')]/div[contains(@class, 'valueview-preview')]/div[contains(@class, 'valueview-preview-value')]") + div(:timeCalendarHint, :xpath => "//div[contains(@class, 'ui-inputextender-extension')]/div[contains(@class, 'valueview-expert-timeinput-calendarhint')]") + span(:timeCalendarHintMessage, :xpath => "//div[contains(@class, 'ui-inputextender-extension')]/div[contains(@class, 'valueview-expert-timeinput-calendarhint')]/span[contains(@class, 'valueview-expert-timeinput-calendarhint-message')]") + link(:timeCalendarHintSwitch, :xpath => "//div[contains(@class, 'ui-inputextender-extension')]/div[contains(@class, 'valueview-expert-timeinput-calendarhint')]/span[contains(@class, 'valueview-expert-timeinput-calendarhint-switch')]") + link(:timeInputExtenderAdvanced, :xpath => "//div[contains(@class, 'ui-inputextender-extension')]/a[contains(@class, 'valueview-expert-timeinput-advancedtoggler')]") + div(:timePrecision, :xpath => "//div[contains(@class, 'ui-inputextender-extension')]/div[contains(@class, 'valueview-expert-timeinput-precisioncontainer')]") + link(:timePrecisionRotatorAuto, :xpath => "//div[contains(@class, 'ui-inputextender-extension')]/div[contains(@class, 'valueview-expert-timeinput-precisioncontainer')]/div[contains(@class, 'valueview-expert-timeinput-precision')]/a[contains(@class, 'ui-listrotator-auto')]") + link(:timePrecisionRotatorPrev, :xpath => "//div[contains(@class, 'ui-inputextender-extension')]/div[contains(@class, 'valueview-expert-timeinput-precisioncontainer')]/div[contains(@class, 'valueview-expert-timeinput-precision')]/a[contains(@class, 'ui-listrotator-prev')]") + link(:timePrecisionRotatorNext, :xpath => "//div[contains(@class, 'ui-inputextender-extension')]/div[contains(@class, 'valueview-expert-timeinput-precisioncontainer')]/div[contains(@class, 'valueview-expert-timeinput-precision')]/a[contains(@class, 'ui-listrotator-next')]") + link(:timePrecisionRotatorSelect, :xpath => "//div[contains(@class, 'ui-inputextender-extension')]/div[contains(@class, 'valueview-expert-timeinput-precisioncontainer')]/div[contains(@class, 'valueview-expert-timeinput-precision')]/a[contains(@class, 'ui-listrotator-curr')]") + div(:timeCalendar, :xpath => "//div[contains(@class, 'ui-inputextender-extension')]/div[contains(@class, 'valueview-expert-timeinput-calendarcontainer')]") + link(:timeCalendarRotatorAuto, :xpath => "//div[contains(@class, 'ui-inputextender-extension')]/div[contains(@class, 'valueview-expert-timeinput-calendarcontainer')]/div[contains(@class, 'ui-listrotator')]/a[contains(@class, 'ui-listrotator-auto')]") + link(:timeCalendarRotatorPrev, :xpath => "//div[contains(@class, 'ui-inputextender-extension')]/div[contains(@class, 'valueview-expert-timeinput-calendarcontainer')]/div[contains(@class, 'ui-listrotator')]/a[contains(@class, 'ui-listrotator-prev')]") + link(:timeCalendarRotatorNext, :xpath => "//div[contains(@class, 'ui-inputextender-extension')]/div[contains(@class, 'valueview-expert-timeinput-calendarcontainer')]/div[contains(@class, 'ui-listrotator')]/a[contains(@class, 'ui-listrotator-next')]") + link(:timeCalendarRotatorSelect, :xpath => "//div[contains(@class, 'ui-inputextender-extension')]/div[contains(@class, 'valueview-expert-timeinput-calendarcontainer')]/div[contains(@class, 'ui-listrotator')]/a[contains(@class, 'ui-listrotator-curr')]") + unordered_list(:timePrecisionMenu, :class => "ui-listrotator-menu", :index => 0) + unordered_list(:timeCalendarMenu, :class => "ui-listrotator-menu", :index => 1) + # methods + def select_precision prec + self.show_advanced_time_settings + if prec == "auto" + self.timePrecisionRotatorAuto + return + end + self.timePrecisionRotatorSelect + self.timePrecisionMenu_element.when_visible + self.timePrecisionMenu_element.each do |item| + if item.text == prec + item.click + return + end + end + end + + def select_calendar cal + self.show_advanced_time_settings + if cal == "auto" + self.timeCalendarRotatorAuto + return + end + self.timeCalendarRotatorSelect + self.timeCalendarMenu_element.when_visible + self.timeCalendarMenu_element.each do |item| + if item.text == cal + item.click + return + end + end + end + + def show_advanced_time_settings + if !self.timePrecision_element.visible? + self.timeInputExtenderAdvanced + self.timePrecision_element.when_visible + end + end +end diff --git a/selenium/lib/pages/entity_page.rb b/selenium/lib/pages/entity_page.rb index 06a1e02..86c36f2 100644 --- a/selenium/lib/pages/entity_page.rb +++ b/selenium/lib/pages/entity_page.rb @@ -13,6 +13,7 @@ include SitelinkPage include AliasPage include StatementPage + include TimePage include ULSPage @@property_url = "" -- To view, visit https://gerrit.wikimedia.org/r/67961 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I855c41080d108d6b549cdf6a3cd99aad787f8ad1 Gerrit-PatchSet: 5 Gerrit-Project: mediawiki/extensions/Wikibase Gerrit-Branch: master Gerrit-Owner: Tobias Gritschacher <[email protected]> Gerrit-Reviewer: Henning Snater <[email protected]> Gerrit-Reviewer: jenkins-bot _______________________________________________ MediaWiki-commits mailing list [email protected] https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits
