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

Reply via email to