sapphire 0.0.2
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/lib/sapphire.rb +30 -0
- data/lib/sapphire/DSL/Browser/Browser.rb +13 -0
- data/lib/sapphire/DSL/Browser/Check.rb +12 -0
- data/lib/sapphire/DSL/Browser/Clear.rb +15 -0
- data/lib/sapphire/DSL/Browser/Click.rb +12 -0
- data/lib/sapphire/DSL/Browser/Close.rb +12 -0
- data/lib/sapphire/DSL/Browser/Complete.rb +15 -0
- data/lib/sapphire/DSL/Browser/CurrentUrl.rb +11 -0
- data/lib/sapphire/DSL/Browser/Error.rb +12 -0
- data/lib/sapphire/DSL/Browser/ExecuteAgainstControl.rb +45 -0
- data/lib/sapphire/DSL/Browser/Exists.rb +22 -0
- data/lib/sapphire/DSL/Browser/For.rb +10 -0
- data/lib/sapphire/DSL/Browser/Hide.rb +10 -0
- data/lib/sapphire/DSL/Browser/IsHidden.rb +28 -0
- data/lib/sapphire/DSL/Browser/IsVisible.rb +25 -0
- data/lib/sapphire/DSL/Browser/MouseOver.rb +12 -0
- data/lib/sapphire/DSL/Browser/Navigate.rb +11 -0
- data/lib/sapphire/DSL/Browser/Reload.rb +11 -0
- data/lib/sapphire/DSL/Browser/Set.rb +12 -0
- data/lib/sapphire/DSL/Browser/Should.rb +10 -0
- data/lib/sapphire/DSL/Browser/Show.rb +26 -0
- data/lib/sapphire/DSL/Browser/Start.rb +16 -0
- data/lib/sapphire/DSL/Browser/To.rb +10 -0
- data/lib/sapphire/DSL/Browser/Tracker.rb +15 -0
- data/lib/sapphire/DSL/Browser/Transition.rb +10 -0
- data/lib/sapphire/DSL/Browser/Uncheck.rb +12 -0
- data/lib/sapphire/DSL/Browser/With.rb +10 -0
- data/lib/sapphire/DSL/Configuration/ConfiguredBrowser.rb +13 -0
- data/lib/sapphire/DSL/Configuration/ConfiguredUser.rb +11 -0
- data/lib/sapphire/DSL/Configuration/Use.rb +15 -0
- data/lib/sapphire/DSL/Data/Exist.rb +11 -0
- data/lib/sapphire/DSL/Data/Find.rb +10 -0
- data/lib/sapphire/DSL/Data/GetPageField.rb +17 -0
- data/lib/sapphire/DSL/Data/Underscore.rb +9 -0
- data/lib/sapphire/DSL/Data/Validate.rb +16 -0
- data/lib/sapphire/DSL/Data/Verify.rb +10 -0
- data/lib/sapphire/DSL/Scenarios/Is.rb +9 -0
- data/lib/sapphire/DSL/Scenarios/Pending.rb +29 -0
- data/lib/sapphire/DSL/Scenarios/and.rb +25 -0
- data/lib/sapphire/DSL/Scenarios/background.rb +23 -0
- data/lib/sapphire/DSL/Scenarios/dsl.rb +60 -0
- data/lib/sapphire/DSL/Scenarios/finally.rb +32 -0
- data/lib/sapphire/DSL/Scenarios/given.rb +57 -0
- data/lib/sapphire/DSL/Scenarios/runner.rb +30 -0
- data/lib/sapphire/DSL/Scenarios/scenario.rb +51 -0
- data/lib/sapphire/DSL/Scenarios/then.rb +34 -0
- data/lib/sapphire/DSL/Scenarios/when.rb +47 -0
- data/lib/sapphire/DataAbstractions/Database.rb +57 -0
- data/lib/sapphire/DataAbstractions/Query.rb +20 -0
- data/lib/sapphire/Testing/Executable.rb +30 -0
- data/lib/sapphire/Testing/RSpecRunner.rb +85 -0
- data/lib/sapphire/Testing/RakeTask.rb +109 -0
- data/lib/sapphire/Testing/ResultList.rb +19 -0
- data/lib/sapphire/Testing/ResultTree.rb +37 -0
- data/lib/sapphire/Testing/ScenarioResult.rb +31 -0
- data/lib/sapphire/Testing/TestResult.rb +24 -0
- data/lib/sapphire/Testing/TestRunnerAdapter.rb +62 -0
- data/lib/sapphire/WebAbstractions/Controls/Base/Control.rb +74 -0
- data/lib/sapphire/WebAbstractions/Controls/Base/Page.rb +47 -0
- data/lib/sapphire/WebAbstractions/Controls/Base/WebBrowser.rb +74 -0
- data/lib/sapphire/WebAbstractions/Controls/Button.rb +9 -0
- data/lib/sapphire/WebAbstractions/Controls/CheckBox.rb +28 -0
- data/lib/sapphire/WebAbstractions/Controls/Chrome.rb +21 -0
- data/lib/sapphire/WebAbstractions/Controls/DropDown.rb +25 -0
- data/lib/sapphire/WebAbstractions/Controls/FireFox.rb +22 -0
- data/lib/sapphire/WebAbstractions/Controls/Hyperlink.rb +8 -0
- data/lib/sapphire/WebAbstractions/Controls/Image.rb +9 -0
- data/lib/sapphire/WebAbstractions/Controls/InternetExplorer.rb +21 -0
- data/lib/sapphire/WebAbstractions/Controls/Label.rb +8 -0
- data/lib/sapphire/WebAbstractions/Controls/RadioButton.rb +18 -0
- data/lib/sapphire/WebAbstractions/Controls/TextBox.rb +31 -0
- data/lib/sapphire/WebAbstractions/Controls/Title.rb +12 -0
- data/lib/sapphire/version.rb +3 -0
- metadata +152 -0
@@ -0,0 +1,34 @@
|
|
1
|
+
class Then
|
2
|
+
include Sapphire::Testing::Executable
|
3
|
+
|
4
|
+
attr_reader :value
|
5
|
+
attr_accessor :text
|
6
|
+
attr_reader :block
|
7
|
+
attr_reader :and
|
8
|
+
attr_reader :parent
|
9
|
+
attr_reader :results
|
10
|
+
|
11
|
+
def initialize(parent, pre, text, &block)
|
12
|
+
@block = block
|
13
|
+
@value = text
|
14
|
+
@text = pre + text.to_s
|
15
|
+
@and = []
|
16
|
+
@parent = parent
|
17
|
+
@results = []
|
18
|
+
end
|
19
|
+
|
20
|
+
def add_and(pre, text, &block)
|
21
|
+
if(!self.value.instance_of? Pending)
|
22
|
+
x = Then.new(self, pre, text, &block)
|
23
|
+
self.and << x
|
24
|
+
else
|
25
|
+
self.and << Then.new(self, pre, Pending.new(pre + text), &block)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def AddResult(result)
|
30
|
+
@results << result
|
31
|
+
self.parent.results.last.AddChild(result)
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
class When
|
2
|
+
include Sapphire::Testing::Executable
|
3
|
+
|
4
|
+
attr_reader :value
|
5
|
+
attr_accessor :text
|
6
|
+
attr_reader :block
|
7
|
+
attr_reader :then
|
8
|
+
attr_reader :and
|
9
|
+
attr_reader :parent
|
10
|
+
attr_reader :results
|
11
|
+
|
12
|
+
def initialize(parent, pre, text, &block)
|
13
|
+
@block = block
|
14
|
+
@value = text
|
15
|
+
@text = pre + text.to_s
|
16
|
+
@then = []
|
17
|
+
@and = []
|
18
|
+
@parent = parent
|
19
|
+
@results = []
|
20
|
+
end
|
21
|
+
|
22
|
+
def add_then(pre, text, &block)
|
23
|
+
if(self.value.is_a? Pending)
|
24
|
+
@then << Then.new(self, pre, Pending.new(text), &block)
|
25
|
+
else
|
26
|
+
@then << Then.new(self, pre, text, &block)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_and(pre, text, &block)
|
31
|
+
if(self.value.is_a? Pending)
|
32
|
+
self.and << And.new(self, Pending.new(pre + text), &block)
|
33
|
+
else
|
34
|
+
self.and << And.new(self, pre + text, &block)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def last_then
|
39
|
+
@then.last
|
40
|
+
end
|
41
|
+
|
42
|
+
def AddResult(result)
|
43
|
+
@results << result
|
44
|
+
self.parent.results.last.AddChild(result)
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Sapphire
|
4
|
+
module DataAbstractions
|
5
|
+
class Database
|
6
|
+
|
7
|
+
def Open(connection_string)
|
8
|
+
@connection = WIN32OLE.new('ADODB.Connection')
|
9
|
+
@connection.Open(connection_string)
|
10
|
+
end
|
11
|
+
|
12
|
+
def query(sql)
|
13
|
+
recordset = WIN32OLE.new('ADODB.Recordset')
|
14
|
+
recordset.Open(sql, @connection, 0 , 1)
|
15
|
+
|
16
|
+
fields = []
|
17
|
+
|
18
|
+
recordset.Fields.each do |field|
|
19
|
+
fields << field.Name
|
20
|
+
end
|
21
|
+
begin
|
22
|
+
recordset.MoveFirst
|
23
|
+
data = recordset.GetRows
|
24
|
+
rescue
|
25
|
+
data = []
|
26
|
+
end
|
27
|
+
|
28
|
+
if(recordset.State != 0)
|
29
|
+
recordset.Close
|
30
|
+
end
|
31
|
+
|
32
|
+
data = data.transpose
|
33
|
+
records = []
|
34
|
+
|
35
|
+
data.each do |row|
|
36
|
+
y = 0
|
37
|
+
record = Hash.new
|
38
|
+
row.each do |column|
|
39
|
+
if(column != nil)
|
40
|
+
record.store fields[y].underscore.intern, column.to_s
|
41
|
+
else
|
42
|
+
record.store fields[y].underscore.intern, column
|
43
|
+
end
|
44
|
+
y += 1
|
45
|
+
end
|
46
|
+
records << record
|
47
|
+
end
|
48
|
+
records
|
49
|
+
end
|
50
|
+
|
51
|
+
def close
|
52
|
+
@connection.Close
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Sapphire
|
2
|
+
module DataAbstractions
|
3
|
+
module Query
|
4
|
+
def Execute(block)
|
5
|
+
x = self.Database.new
|
6
|
+
|
7
|
+
x.Open $config[x.Connection]
|
8
|
+
|
9
|
+
path = File.expand_path(self.Script, __FILE__)
|
10
|
+
file = File.open(path)
|
11
|
+
contents = file.read
|
12
|
+
self.Tokenize(contents)
|
13
|
+
|
14
|
+
results = x.query(contents)
|
15
|
+
block.call results
|
16
|
+
x.close
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Sapphire
|
2
|
+
module Testing
|
3
|
+
module Executable
|
4
|
+
def execute(id)
|
5
|
+
start = Time.now
|
6
|
+
begin
|
7
|
+
if(self.value.is_a? Pending)
|
8
|
+
self.AddResult(ResultTree.new(self.text, TestResult.new("pending", self.text, "Pending", "", Time.now - start, id)))
|
9
|
+
puts "(pending) " + self.text + " (" + (Time.now - start).to_s + "s)"
|
10
|
+
return
|
11
|
+
end
|
12
|
+
self.block.call
|
13
|
+
self.AddResult(ResultTree.new(self.text, TestResult.new("pass", self.text, "Success", "", Time.now - start, id)))
|
14
|
+
puts "(pass) " + self.text + " (" + (Time.now - start).to_s + "s)"
|
15
|
+
rescue => msg
|
16
|
+
|
17
|
+
stack = ""
|
18
|
+
msg.backtrace.each do |line|
|
19
|
+
stack += "\r\n" + line
|
20
|
+
end
|
21
|
+
|
22
|
+
self.AddResult(ResultTree.new(self.text, TestResult.new("fail", self.text, msg.message, stack, Time.now - start, id)))
|
23
|
+
puts "(fail) " + self.text + ": " + msg.message + " (" + (Time.now - start).to_s + "s)"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
@result
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module Sapphire
|
2
|
+
module Testing
|
3
|
+
module RSpecRunner
|
4
|
+
def execute(id)
|
5
|
+
@block.call
|
6
|
+
s = self
|
7
|
+
x = @givens
|
8
|
+
y = @backgrounds
|
9
|
+
background_pending = false
|
10
|
+
|
11
|
+
y.each do |background|
|
12
|
+
if(background.value.instance_of? Pending)
|
13
|
+
background_pending = true
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
x.each do |g|
|
18
|
+
describe g.text do
|
19
|
+
|
20
|
+
before :all do
|
21
|
+
y.each do |b|
|
22
|
+
if(!b.value.instance_of? Pending and !s.value.instance_of? Pending)
|
23
|
+
b.block.call()
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
before :each do
|
29
|
+
if(!g.value.instance_of? Pending and !s.value.instance_of? Pending and !background_pending)
|
30
|
+
g.block.call()
|
31
|
+
g.and.each do |a|
|
32
|
+
a.block.call()
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
g.when.each do |w|
|
38
|
+
describe w.text do
|
39
|
+
before do
|
40
|
+
if(!w.value.instance_of? Pending and !s.value.instance_of? Pending and !background_pending)
|
41
|
+
w.block.call()
|
42
|
+
|
43
|
+
if (w.and.count > 0)
|
44
|
+
w.and.each do |a|
|
45
|
+
a.block.call()
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
if (w.then.count > 0)
|
52
|
+
w.then.each do |t|
|
53
|
+
if(!t.value.instance_of? Pending and !w.value.instance_of? Pending and !g.value.instance_of? Pending and !s.value.instance_of? Pending and !background_pending)
|
54
|
+
it t.text do
|
55
|
+
t.block.call()
|
56
|
+
t.and.each do |a|
|
57
|
+
if(!a.value.instance_of? Pending)
|
58
|
+
a.block.call()
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
else
|
63
|
+
pending t.text
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
after :all do
|
71
|
+
if(g.finally and !g.finally.value.instance_of? Pending and !s.value.instance_of? Pending and !background_pending)
|
72
|
+
g.finally.block.call()
|
73
|
+
|
74
|
+
g.finally.and.each do |a|
|
75
|
+
a.block.call()
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Sapphire
|
5
|
+
module Testing
|
6
|
+
class RakeTask
|
7
|
+
attr_accessor :pattern
|
8
|
+
attr_accessor :verbose
|
9
|
+
attr_accessor :fail_on_error
|
10
|
+
attr_accessor :name
|
11
|
+
|
12
|
+
|
13
|
+
def test_outcome(result)
|
14
|
+
|
15
|
+
result.results.each do |r|
|
16
|
+
|
17
|
+
if(r.type == 'fail')
|
18
|
+
return 'fail'
|
19
|
+
end
|
20
|
+
|
21
|
+
if(r.type == 'pending')
|
22
|
+
return 'pending'
|
23
|
+
end
|
24
|
+
|
25
|
+
if(!r.results.empty?)
|
26
|
+
return test_outcome(r)
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
return 'pass'
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
def initialize(*args)
|
36
|
+
|
37
|
+
@name = args.shift || :spec
|
38
|
+
@pattern = nil
|
39
|
+
@verbose, @fail_on_error = true, true
|
40
|
+
|
41
|
+
yield self if block_given?
|
42
|
+
|
43
|
+
Rake::Task.define_task name do
|
44
|
+
RakeFileUtils.send(:verbose, verbose) do
|
45
|
+
files_to_run = FileList[ pattern ].map { |f|
|
46
|
+
y = nil
|
47
|
+
x = nil
|
48
|
+
x = f.gsub(/"/, '\"') if f != nil
|
49
|
+
y = x.gsub(/'/, "\\\\'") if x != nil
|
50
|
+
y
|
51
|
+
}
|
52
|
+
if files_to_run.empty?
|
53
|
+
puts "No examples matching #{pattern} could be found"
|
54
|
+
else
|
55
|
+
begin
|
56
|
+
|
57
|
+
files_to_run.each do |f|
|
58
|
+
next unless f != nil
|
59
|
+
require File.expand_path("../../" + f.to_s, __FILE__) unless File.directory? f
|
60
|
+
end
|
61
|
+
|
62
|
+
success_array = []
|
63
|
+
pending_array = []
|
64
|
+
failure_array = []
|
65
|
+
|
66
|
+
i = 3
|
67
|
+
|
68
|
+
Runner.instance.scenarios.each do |scenario|
|
69
|
+
i += 1
|
70
|
+
scenario.execute i
|
71
|
+
scenario.result.set_id i
|
72
|
+
scenario.result.set_type test_outcome(scenario.result)
|
73
|
+
|
74
|
+
success_array << scenario.result if scenario.result.type == "pass"
|
75
|
+
pending_array << scenario.result if scenario.result.type == "pending"
|
76
|
+
failure_array << scenario.result if scenario.result.type == "fail"
|
77
|
+
end
|
78
|
+
|
79
|
+
item_array = []
|
80
|
+
item_array << ResultsList.new("Passing", success_array, 1)
|
81
|
+
item_array << ResultsList.new("Pending", pending_array, 2)
|
82
|
+
item_array << ResultsList.new("Failing", failure_array, 3)
|
83
|
+
|
84
|
+
|
85
|
+
File.open(File.dirname(__FILE__) + "/../ReportGenerator/output.json", "w") do |file|
|
86
|
+
file.puts ActiveSupport::JSON.encode item_array
|
87
|
+
end
|
88
|
+
|
89
|
+
Runner.instance.scenarios.each do |scenario|
|
90
|
+
File.open(File.dirname(__FILE__) + "/../ReportGenerator/" + scenario.result.myId.to_s + ".json", "w") do |file|
|
91
|
+
file.puts ActiveSupport::JSON.encode scenario.result
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
rescue => e
|
96
|
+
stack = ""
|
97
|
+
e.backtrace.each do |line|
|
98
|
+
stack += "\r\n" + line
|
99
|
+
end
|
100
|
+
|
101
|
+
raise("Some tests have failed: " + e.message + " : " + stack) if fail_on_error
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Sapphire
|
2
|
+
module Testing
|
3
|
+
class ResultsList
|
4
|
+
|
5
|
+
attr_reader :myId
|
6
|
+
attr_reader :text
|
7
|
+
attr_reader :children
|
8
|
+
|
9
|
+
def initialize(text, results, id)
|
10
|
+
@myId = id
|
11
|
+
@text = text
|
12
|
+
@children = results
|
13
|
+
@expanded = true
|
14
|
+
@count = results.length
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Sapphire
|
2
|
+
module Testing
|
3
|
+
class ResultTree
|
4
|
+
|
5
|
+
attr_accessor :results
|
6
|
+
attr_accessor :type
|
7
|
+
|
8
|
+
def initialize(text, result)
|
9
|
+
|
10
|
+
@type = 'pass'
|
11
|
+
@execution_time = 0
|
12
|
+
|
13
|
+
if(result != nil)
|
14
|
+
self.type = result.type
|
15
|
+
@iconCls = "accept" if result.type == "pass"
|
16
|
+
@iconCls = "delete" if result.type == "fail"
|
17
|
+
@iconCls = "error" if result.type == "pending"
|
18
|
+
@execution_time = result.execution_time
|
19
|
+
@expanded = true
|
20
|
+
@message = result.message
|
21
|
+
@stack = result.stack
|
22
|
+
end
|
23
|
+
@text = text
|
24
|
+
@results = []
|
25
|
+
@leaf = true
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
def AddChild(node)
|
30
|
+
@results << node
|
31
|
+
@leaf = false
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|