domkey 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,8 +1,10 @@
1
1
  require 'spec_helper'
2
- module DomkeyExample
3
- class DomIsWatirproc
2
+
3
+ describe Domkey::View do
4
+
5
+ class DomIspackage
4
6
  include Domkey::View
5
- #pageobject is watirproc
7
+ #pageobject is package
6
8
  dom(:street) { text_field(id: 'street1') }
7
9
  dom(:city) { text_field(id: 'city1') }
8
10
  end
@@ -37,16 +39,14 @@ module DomkeyExample
37
39
  # dom(:city) { text_field(id: 'city') }
38
40
  #end
39
41
  end
40
- end
41
42
 
42
- describe Domkey::View do
43
43
 
44
44
  before :all do
45
- Domkey.browser.goto("file://" + __dir__ + "/html/test.html")
45
+ goto_html("test.html")
46
46
  end
47
47
 
48
- it 'domw is watirproc' do
49
- view = DomkeyExample::DomIsWatirproc.new
48
+ it 'dom is package' do
49
+ view = DomIspackage.new
50
50
  view.should respond_to(:street)
51
51
  view.street.should be_kind_of(Domkey::View::PageObject)
52
52
 
@@ -56,14 +56,14 @@ describe Domkey::View do
56
56
  end
57
57
 
58
58
  it 'dom is hash of dom' do
59
- view = DomkeyExample::DomIsHashOfDom.new
59
+ view = DomIsHashOfDom.new
60
60
 
61
61
  view.should respond_to(:address)
62
62
 
63
- view.address.watirproc.should respond_to(:each_pair)
64
- view.address.watirproc.should_not be_empty
63
+ view.address.package.should respond_to(:each_pair)
64
+ view.address.package.should_not be_empty
65
65
 
66
- view.address.watirproc.each_pair do |k, v|
66
+ view.address.package.each_pair do |k, v|
67
67
  k.should be_kind_of(Symbol)
68
68
  v.should be_kind_of(Domkey::View::PageObject) #should respond to set and value
69
69
  end
@@ -0,0 +1,85 @@
1
+ require 'spec_helper'
2
+
3
+ describe Domkey::View::RadioGroup do
4
+
5
+ class CollectionAsPageObjectRadioGroupView
6
+ include Domkey::View
7
+
8
+ # one named radio group
9
+ def group
10
+ RadioGroup.new -> { radios(name: 'tool') }
11
+ end
12
+
13
+ # no good. collection resolves to more than one coherent group
14
+ def groups
15
+ RadioGroup.new -> { radios(name: /^group/) }
16
+ end
17
+ end
18
+
19
+ before :all do
20
+ goto_html("test.html")
21
+ end
22
+
23
+ it 'two groups example' do
24
+ v = CollectionAsPageObjectRadioGroupView.new
25
+ expect { v.groups.to_a.size }.to raise_error
26
+ expect { v.groups.map { |e| e } }.to raise_error
27
+ expect { v.groups.count }.to raise_error
28
+ end
29
+
30
+ context "OptionSelectable object single" do
31
+ # OptionSelectable object is an object that responds to options and is selectable by its optioins;
32
+ # RadioGroup, Select, CheckboxGroup. CheckboxGroup acts like Multi Select, RadioGroup acts like Single Select
33
+
34
+ before :each do
35
+ goto_html("test.html")
36
+
37
+ @v = CollectionAsPageObjectRadioGroupView.new
38
+ @v.group.count.should == 3
39
+ @v.group.to_a.each { |e| e.should be_kind_of(Domkey::View::PageObject) }
40
+ end
41
+
42
+ it 'initial value on test page' do
43
+ @v.group.value.should eql ['other']
44
+ end
45
+
46
+ it 'set value attribute by default. value returns that value attribute' do
47
+ @v.group.set 'tomato'
48
+ @v.group.value.should eql ['tomato']
49
+ @v.group.set /^oth/
50
+ @v.group.value.should eql ['other']
51
+ end
52
+
53
+ it 'set array of value attribute. last value wins' do
54
+ @v.group.set ['tomato']
55
+ @v.group.value.should eql ['tomato']
56
+
57
+ @v.group.set ['other', 'tomato', /cucu/]
58
+ @v.group.value.should eql ['cucumber']
59
+ end
60
+
61
+ it 'set false has no effect. value is initial value on the page' do
62
+ @v.group.set false
63
+ @v.group.value.should eql ['other']
64
+ end
65
+
66
+ it 'set empty array clears all. value is empty array' do
67
+ @v.group.set []
68
+ @v.group.value.should eql ['other']
69
+ end
70
+
71
+ it 'set value string not found error' do
72
+ expect { @v.group.set 'foobar' }.to raise_error
73
+ end
74
+
75
+ it 'set value regexp not found error' do
76
+ expect { @v.group.set /balaba/ }.to raise_error
77
+ end
78
+
79
+ it 'options' do
80
+ @v.group.options.should eql ["cucumber", "tomato", "other"]
81
+ end
82
+
83
+ end
84
+
85
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ # Watir API is the Bee's Knees
4
+ # but you can use lower level Selenium::WebDriver API for container and package definitions
5
+ # you will need to override set and value methods to delegate to Selenium::WebDriver::Element
6
+
7
+ describe 'Selenium::WebDriver API Example' do
8
+
9
+ before :all do
10
+ Domkey.browser.goto("file://" + __dir__ + "/../html/test.html")
11
+ @driverpackage = -> { Domkey.browser.driver }
12
+ end
13
+
14
+ context 'when container is selenium webdriver and' do
15
+
16
+ it 'package is package' do
17
+ package = lambda { find_element(id: 'street1') }
18
+ street = Domkey::View::PageObject.new package, @driverpackage
19
+
20
+ street.package.should be_kind_of(Proc)
21
+ street.element.should be_kind_of(Selenium::WebDriver::Element) #one default element
22
+
23
+ street.element.send_keys 'Lamar'
24
+ street.element.attribute('value').should eql 'Lamar'
25
+ end
26
+
27
+ it 'package is pageobject' do
28
+ # setup
29
+ webdriver_element = lambda { find_element(id: 'street1') }
30
+
31
+ pageobject = Domkey::View::PageObject.new webdriver_element, @driverpackage
32
+ street = Domkey::View::PageObject.new pageobject, @driverpackage
33
+
34
+ street.package.should be_kind_of(Proc)
35
+ street.element.should be_kind_of(Selenium::WebDriver::Element)
36
+
37
+ street.element.clear
38
+ street.element.send_keys 'zooom'
39
+ street.element.attribute('value').should eql 'zooom'
40
+ end
41
+ end
42
+ end
@@ -7,7 +7,24 @@ end
7
7
  require 'domkey'
8
8
  SimpleCov.command_name "test:units"
9
9
 
10
+ module DomkeySpecHelper
11
+
12
+ def goto_watirspec file
13
+ goto("file://" + __dir__ + "/watirspec/html/#{file}")
14
+ end
15
+
16
+ def goto_html file
17
+ goto("file://" + __dir__ + "/html/#{file}")
18
+ end
19
+
20
+ def goto path
21
+ Domkey.browser.goto path
22
+ end
23
+
24
+ end
25
+
10
26
  RSpec.configure do |config|
27
+ config.include DomkeySpecHelper
11
28
  config.after :all do
12
29
  Domkey.browser.close
13
30
  end
@@ -0,0 +1,106 @@
1
+ require 'spec_helper'
2
+
3
+ describe Domkey::View::Cargo do
4
+
5
+ class AddressView
6
+ include Domkey::View
7
+ dom(:city) { text_field(id: 'city1') }
8
+ dom(:street) { text_field(id: 'street1') }
9
+
10
+ # semantic descriptor that returns another view
11
+ # the other view has PageObjects that participate in this view
12
+ def shipping
13
+ ShippingAddressView.new
14
+ end
15
+
16
+ # semantic descriptor that returns PageObject
17
+ def fruit
18
+ CheckboxGroup.new -> { checkboxes(name: 'fruit') }
19
+ end
20
+
21
+ end
22
+
23
+ class ShippingAddressView
24
+ include Domkey::View
25
+ dom(:city) { text_field(id: 'city2') }
26
+ dom(:street) { text_field(id: 'street2') }
27
+
28
+ def delivery_date
29
+ DateView.new
30
+ end
31
+ end
32
+
33
+ class DateView
34
+ include Domkey::View
35
+ dom(:month) { text_field(id: 'month_field') }
36
+ end
37
+
38
+ before :each do
39
+ goto_html("test.html")
40
+ end
41
+
42
+ it 'view within pageobject' do
43
+ model = {city: 'Austin',
44
+ street: 'Lamar'}
45
+
46
+ cargo = Domkey::View::Cargo.new model: model, view: AddressView.new
47
+ cargo.set
48
+ extracted = cargo.value
49
+ extracted.should eql model
50
+ end
51
+
52
+ it 'view within view' do
53
+ model = {city: 'Austin',
54
+ street: 'Lamar',
55
+ shipping: {city: 'Georgetown',
56
+ street: 'Austin'}
57
+ }
58
+
59
+ cargo = Domkey::View::Cargo.new model: model, view: AddressView.new
60
+ cargo.set
61
+ extracted = cargo.value
62
+ extracted.should eql model
63
+ end
64
+
65
+ it 'view view view' do
66
+ model = {city: 'Austin',
67
+ street: 'Lamar',
68
+ shipping: {city: 'Georgetown',
69
+ street: 'Austin',
70
+ # this is view within a view within original view
71
+ delivery_date: {month: 'delivery thing'}}
72
+ }
73
+
74
+ cargo = Domkey::View::Cargo.new model: model, view: AddressView.new
75
+ cargo.set
76
+ extracted = cargo.value
77
+ extracted.should eql model
78
+ end
79
+
80
+ it 'cargo' do
81
+ model = {city: 'Mordor'}
82
+
83
+ view = AddressView.new
84
+ cargo = Domkey::View::Cargo.new view: view, model: model
85
+ cargo.set
86
+ scraped_model = cargo.value
87
+
88
+ scraped_model.should eql model
89
+ end
90
+
91
+ it 'pageobject' do
92
+
93
+ model = {city: 'Austin', fruit: ['tomato', 'other']}
94
+ cargo = AddressView.cargo model
95
+
96
+ # default values when page loads before setting the values
97
+ default_page_values = {:city=>"id city class city", :fruit=>["other"]}
98
+ cargo.value.should eql default_page_values
99
+ cargo.set
100
+
101
+ extracted_model = cargo.value
102
+ extracted_model.should eql model
103
+
104
+ end
105
+
106
+ end
@@ -1,5 +1,6 @@
1
1
  require 'spec_helper'
2
- module DomkeyExample
2
+
3
+ describe Domkey::View do
3
4
 
4
5
  class SingleDom
5
6
  include Domkey::View
@@ -15,32 +16,65 @@ module DomkeyExample
15
16
  dom(:street) { text_field(class: 'street1') }
16
17
  end
17
18
 
18
- end
19
-
20
- describe Domkey::View do
21
-
22
19
  before :all do
23
- Domkey.browser.goto("file://" + __dir__ + "/html/test.html")
20
+ goto_html("test.html")
24
21
  end
25
22
 
26
- it 'dom single element' do
27
- view = DomkeyExample::SingleDom.new
28
- view.should respond_to(:street)
29
- view.street.should be_kind_of(Domkey::View::PageObject)
30
- view.street.value.should == ''
31
- view.street.set 'bla'
32
- view.street.value.should == 'bla'
33
- view.container.street.value.should == ''
34
- view
23
+ context 'dom for single element' do
24
+
25
+ before :all do
26
+ @view = SingleDom.new
27
+ end
28
+
29
+ it 'view responds to dom' do
30
+ @view.should respond_to(:street)
31
+ end
32
+
33
+ it 'dom returns PageObject' do
34
+ @view.street.should be_kind_of(Domkey::View::PageObject)
35
+ end
36
+
37
+ it 'dom set and value' do
38
+ @view.street.value.should == ''
39
+ @view.street.set 'bla'
40
+ @view.street.value.should == 'bla'
41
+ end
35
42
  end
36
43
 
44
+ context 'view method returns view that acts like pageobject' do
45
+ before :all do
46
+ @view = SingleDom.new
47
+ end
48
+
49
+ it 'view semantic descriptor returns view' do
50
+ @view.container.should be_kind_of(Domkey::View)
51
+ end
52
+
53
+ it 'view within view is a page object' do
54
+ @view.container.street.should be_kind_of(Domkey::View::PageObject)
55
+ end
56
+
57
+ it 'value requires args' do
58
+ expect { @view.container.value }.to raise_error
59
+ end
60
+
61
+ it 'setting and value args' do
62
+ @view.container.set street: 'Nowy Świat'
63
+
64
+ v = @view.container.value :street
65
+ v.should eql({:street=>"Nowy Świat"})
66
+
67
+ v = @view.container.value [:street]
68
+ v.should eql({:street=>"Nowy Świat"})
69
+ end
70
+ end
37
71
  end
38
72
 
39
73
  #require 'benchmark'
40
74
  #Benchmark.bm do |bm|
41
75
  # howmany = 50
42
76
  # # setup browser
43
- # Domkey.browser.goto("file://" + __dir__ + "/html/test.html")
77
+ # goto_html("test.html")
44
78
  # view = DomkeyExample::SingleDom.new Domkey.browser
45
79
  # bm.report('domkey') do
46
80
  # howmany.times do
@@ -1,19 +1,19 @@
1
1
  require 'spec_helper'
2
- module DomkeyExample
3
- class Doms
2
+
3
+ describe Domkey::View do
4
+
5
+ class DomsExample
4
6
  include Domkey::View
5
7
  doms(:streets) { text_fields(class: 'street1') }
6
8
  end
7
- end
8
9
 
9
- describe Domkey::View do
10
10
 
11
11
  before :all do
12
- Domkey.browser.goto("file://" + __dir__ + "/html/test.html")
12
+ goto_html("test.html")
13
13
  end
14
14
 
15
15
  it 'doms collection' do
16
- view = DomkeyExample::Doms.new
16
+ view = DomsExample.new
17
17
  view.should respond_to(:streets)
18
18
  view.streets.should be_kind_of(Domkey::View::PageObjectCollection)
19
19
  view.streets.each { |e| e.should be_kind_of(Domkey::View::PageObject) }
@@ -32,7 +32,7 @@ end
32
32
  #Benchmark.bm do |bm|
33
33
  # howmany = 50
34
34
  # # setup browser
35
- # Domkey.browser.goto("file://" + __dir__ + "/html/test.html")
35
+ # goto_html("test.html")
36
36
  # view = DomkeyExample::Doms.new Domkey.browser
37
37
  # bm.report('domkey') do
38
38
  # howmany.times do
@@ -0,0 +1,176 @@
1
+ require 'spec_helper'
2
+
3
+ describe Domkey::View::WatirWidget do
4
+
5
+ context Watir::Select do
6
+
7
+ context "Multi" do
8
+
9
+ before :all do
10
+ @object = Domkey.browser.select(id: 'multiselect')
11
+ @widget = Domkey::View::WatirWidget.new(@object)
12
+ end
13
+
14
+ before :each do
15
+ goto_html("test.html")
16
+ end
17
+
18
+ it 'initial value on the test page' do
19
+ @widget.value.should eql ["English", "Norwegian"]
20
+ end
21
+
22
+ it 'set array of strings clears all. sets text items provided. value is array of visible texts' do
23
+ # texts are items visible to the user [text or label of select list option]
24
+ @widget.set ['Polish', 'Norwegian']
25
+ @widget.value.should eql ["Norwegian", "Polish"]
26
+ end
27
+
28
+ it 'set false clears all. value is empty array' do
29
+ @widget.set false
30
+ @widget.value.should eql []
31
+ end
32
+
33
+ it 'set empty array clears all. value is empty array' do
34
+ @widget.set []
35
+ @widget.value.should eql []
36
+ end
37
+
38
+ it 'set string clears all. sets one text item. value is one item' do
39
+ @widget.set 'Polish'
40
+ @widget.value.should eql ["Polish"]
41
+ end
42
+
43
+ it 'set by text' do
44
+ @widget.set text: 'Polish'
45
+ @widget.value.should eql ["Polish"]
46
+ end
47
+
48
+ it 'set by array of texts' do
49
+ # client would not usually do this.
50
+ # Client would simply call set ['Polish', 'Norwegian']
51
+ # becuase text: qualifer is a default way of setting select list by visible text
52
+ @widget.set text: ['Polish', 'Norwegian']
53
+ @widget.value.should eql ["Norwegian", "Polish"]
54
+ end
55
+
56
+ it 'set index by option position' do
57
+ @widget.set index: 1
58
+ @widget.value.should eql ['English']
59
+ end
60
+
61
+ it 'set index array of option positions' do
62
+ @widget.set index: [0, 2]
63
+ @widget.value.should eql ["Danish", "Norwegian"]
64
+ end
65
+
66
+ it 'set value attribute string' do
67
+ @widget.set value: '2'
68
+ @widget.value.should eql ['English']
69
+ end
70
+
71
+ it 'set value attribute array of strings' do
72
+ @widget.set value: ['2', '1']
73
+ @widget.value.should eql ["Danish", "English"]
74
+ end
75
+
76
+ it 'set by many qualifiers at once' do
77
+ @widget.set value: ['2', '1'],
78
+ text: 'Swedish',
79
+ index: 3
80
+ @widget.value.should eql ['Danish', 'English', 'Polish', 'Swedish']
81
+ end
82
+
83
+ it 'options' do
84
+ @widget.options.should eql [{:text=>"Danish", :value=>"1"},
85
+ {:text=>"English", :value=>"2"},
86
+ {:text=>"Norwegian", :value=>"3"},
87
+ {:text=>"Polish", :value=>""},
88
+ {:text=>"Swedish", :value=>"Swedish"}]
89
+ end
90
+
91
+ end
92
+
93
+ context "Single" do
94
+
95
+ before :all do
96
+ object = Domkey.browser.select(id: 'fruit_list')
97
+ @widget = Domkey::View::WatirWidget.new(object)
98
+ end
99
+
100
+ before :each do
101
+ goto_html("test.html")
102
+ end
103
+
104
+ it 'initial value on the test page visible text to the user' do
105
+ @widget.value.should eql ['Default']
106
+ end
107
+
108
+ it 'set string selects visible text. value is visible text to the user' do
109
+ # option text
110
+ @widget.set 'Tomato'
111
+ @widget.value.should eql ['Tomato'] # not value attribute, visible text [text, label]
112
+
113
+ # option label attribute text
114
+ @widget.set 'Other'
115
+ @widget.value.should eql ['Other']
116
+ end
117
+
118
+ it 'set array of text or label' do
119
+ @widget.set ['Other', 'Tomato'] #cycle on single select list
120
+ @widget.value.should eql ['Tomato'] # the last one set
121
+ end
122
+
123
+ it 'set by array of text' do
124
+ @widget.set text: ['Other', 'Tomato']
125
+ @widget.value.should eql ['Tomato']
126
+ end
127
+
128
+ it 'set false has no effect. value is selected item text' do
129
+ @widget.set false
130
+ @widget.value.should eql ['Default']
131
+ end
132
+
133
+ it 'set empty array has no effect. value is selected item text' do
134
+ @widget.set []
135
+ @widget.value.should eql ['Default']
136
+ end
137
+
138
+ it 'set index position' do
139
+ @widget.set index: 1
140
+ @widget.value.should eql ['Cucumber']
141
+ end
142
+
143
+ it 'set index array' do
144
+ @widget.set index: [0, 2]
145
+ @widget.value.should eql ['Other'] # the last one wins
146
+ end
147
+
148
+ it 'set value attribute string' do
149
+ @widget.set value: 'tomato'
150
+ @widget.value.should eql ['Tomato']
151
+ end
152
+
153
+ it 'set value attribute array of strings' do
154
+ @widget.set value: ['tomato', 'gurken']
155
+ @widget.value.should eql ['Cucumber']
156
+ end
157
+
158
+ it 'set by many qualifiers at once' do
159
+ @widget.set value: ['gurken'],
160
+ text: 'Tomato',
161
+ index: 2
162
+ @widget.value.should eql ['Other']
163
+ end
164
+
165
+ it 'options' do
166
+ @widget.options.should eql [{:text=>"Tomato", :value=>"tomato"},
167
+ {:text=>"Cucumber", :value=>"gurken"},
168
+ {:text=>"Other", :value=>""},
169
+ {:text=>"Default", :value=>"Default"}]
170
+ end
171
+
172
+ end
173
+
174
+ end
175
+
176
+ end