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.
Files changed (74) hide show
  1. data/lib/sapphire.rb +30 -0
  2. data/lib/sapphire/DSL/Browser/Browser.rb +13 -0
  3. data/lib/sapphire/DSL/Browser/Check.rb +12 -0
  4. data/lib/sapphire/DSL/Browser/Clear.rb +15 -0
  5. data/lib/sapphire/DSL/Browser/Click.rb +12 -0
  6. data/lib/sapphire/DSL/Browser/Close.rb +12 -0
  7. data/lib/sapphire/DSL/Browser/Complete.rb +15 -0
  8. data/lib/sapphire/DSL/Browser/CurrentUrl.rb +11 -0
  9. data/lib/sapphire/DSL/Browser/Error.rb +12 -0
  10. data/lib/sapphire/DSL/Browser/ExecuteAgainstControl.rb +45 -0
  11. data/lib/sapphire/DSL/Browser/Exists.rb +22 -0
  12. data/lib/sapphire/DSL/Browser/For.rb +10 -0
  13. data/lib/sapphire/DSL/Browser/Hide.rb +10 -0
  14. data/lib/sapphire/DSL/Browser/IsHidden.rb +28 -0
  15. data/lib/sapphire/DSL/Browser/IsVisible.rb +25 -0
  16. data/lib/sapphire/DSL/Browser/MouseOver.rb +12 -0
  17. data/lib/sapphire/DSL/Browser/Navigate.rb +11 -0
  18. data/lib/sapphire/DSL/Browser/Reload.rb +11 -0
  19. data/lib/sapphire/DSL/Browser/Set.rb +12 -0
  20. data/lib/sapphire/DSL/Browser/Should.rb +10 -0
  21. data/lib/sapphire/DSL/Browser/Show.rb +26 -0
  22. data/lib/sapphire/DSL/Browser/Start.rb +16 -0
  23. data/lib/sapphire/DSL/Browser/To.rb +10 -0
  24. data/lib/sapphire/DSL/Browser/Tracker.rb +15 -0
  25. data/lib/sapphire/DSL/Browser/Transition.rb +10 -0
  26. data/lib/sapphire/DSL/Browser/Uncheck.rb +12 -0
  27. data/lib/sapphire/DSL/Browser/With.rb +10 -0
  28. data/lib/sapphire/DSL/Configuration/ConfiguredBrowser.rb +13 -0
  29. data/lib/sapphire/DSL/Configuration/ConfiguredUser.rb +11 -0
  30. data/lib/sapphire/DSL/Configuration/Use.rb +15 -0
  31. data/lib/sapphire/DSL/Data/Exist.rb +11 -0
  32. data/lib/sapphire/DSL/Data/Find.rb +10 -0
  33. data/lib/sapphire/DSL/Data/GetPageField.rb +17 -0
  34. data/lib/sapphire/DSL/Data/Underscore.rb +9 -0
  35. data/lib/sapphire/DSL/Data/Validate.rb +16 -0
  36. data/lib/sapphire/DSL/Data/Verify.rb +10 -0
  37. data/lib/sapphire/DSL/Scenarios/Is.rb +9 -0
  38. data/lib/sapphire/DSL/Scenarios/Pending.rb +29 -0
  39. data/lib/sapphire/DSL/Scenarios/and.rb +25 -0
  40. data/lib/sapphire/DSL/Scenarios/background.rb +23 -0
  41. data/lib/sapphire/DSL/Scenarios/dsl.rb +60 -0
  42. data/lib/sapphire/DSL/Scenarios/finally.rb +32 -0
  43. data/lib/sapphire/DSL/Scenarios/given.rb +57 -0
  44. data/lib/sapphire/DSL/Scenarios/runner.rb +30 -0
  45. data/lib/sapphire/DSL/Scenarios/scenario.rb +51 -0
  46. data/lib/sapphire/DSL/Scenarios/then.rb +34 -0
  47. data/lib/sapphire/DSL/Scenarios/when.rb +47 -0
  48. data/lib/sapphire/DataAbstractions/Database.rb +57 -0
  49. data/lib/sapphire/DataAbstractions/Query.rb +20 -0
  50. data/lib/sapphire/Testing/Executable.rb +30 -0
  51. data/lib/sapphire/Testing/RSpecRunner.rb +85 -0
  52. data/lib/sapphire/Testing/RakeTask.rb +109 -0
  53. data/lib/sapphire/Testing/ResultList.rb +19 -0
  54. data/lib/sapphire/Testing/ResultTree.rb +37 -0
  55. data/lib/sapphire/Testing/ScenarioResult.rb +31 -0
  56. data/lib/sapphire/Testing/TestResult.rb +24 -0
  57. data/lib/sapphire/Testing/TestRunnerAdapter.rb +62 -0
  58. data/lib/sapphire/WebAbstractions/Controls/Base/Control.rb +74 -0
  59. data/lib/sapphire/WebAbstractions/Controls/Base/Page.rb +47 -0
  60. data/lib/sapphire/WebAbstractions/Controls/Base/WebBrowser.rb +74 -0
  61. data/lib/sapphire/WebAbstractions/Controls/Button.rb +9 -0
  62. data/lib/sapphire/WebAbstractions/Controls/CheckBox.rb +28 -0
  63. data/lib/sapphire/WebAbstractions/Controls/Chrome.rb +21 -0
  64. data/lib/sapphire/WebAbstractions/Controls/DropDown.rb +25 -0
  65. data/lib/sapphire/WebAbstractions/Controls/FireFox.rb +22 -0
  66. data/lib/sapphire/WebAbstractions/Controls/Hyperlink.rb +8 -0
  67. data/lib/sapphire/WebAbstractions/Controls/Image.rb +9 -0
  68. data/lib/sapphire/WebAbstractions/Controls/InternetExplorer.rb +21 -0
  69. data/lib/sapphire/WebAbstractions/Controls/Label.rb +8 -0
  70. data/lib/sapphire/WebAbstractions/Controls/RadioButton.rb +18 -0
  71. data/lib/sapphire/WebAbstractions/Controls/TextBox.rb +31 -0
  72. data/lib/sapphire/WebAbstractions/Controls/Title.rb +12 -0
  73. data/lib/sapphire/version.rb +3 -0
  74. 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
+