uptime_monitor 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.0
4
+ - 1.9.3
5
+ - jruby-19mode # JRuby in 1.9 mode
6
+
7
+ script: bundle exec rspec -fd spec
data/Gemfile ADDED
@@ -0,0 +1,19 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+ gem 'headless'
6
+ gem 'watir-webdriver'
7
+ gem 'watir-webdriver-performance'
8
+ gem 'activesupport'
9
+
10
+ # Add dependencies to develop your gem here.
11
+ # Include everything needed to run rake, tests, features, etc.
12
+ group :development do
13
+ gem "rspec"
14
+ gem "rdoc", "~> 3.12"
15
+ gem "bundler", "~> 1.0"
16
+ gem "jeweler", "~> 1.8.7"
17
+ #gem "rcov", ">= 0"
18
+ gem "pry"
19
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,102 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ activesupport (4.0.2)
5
+ i18n (~> 0.6, >= 0.6.4)
6
+ minitest (~> 4.2)
7
+ multi_json (~> 1.3)
8
+ thread_safe (~> 0.1)
9
+ tzinfo (~> 0.3.37)
10
+ addressable (2.3.5)
11
+ atomic (1.1.14)
12
+ builder (3.2.2)
13
+ childprocess (0.4.0)
14
+ ffi (~> 1.0, >= 1.0.11)
15
+ coderay (1.1.0)
16
+ diff-lcs (1.2.4)
17
+ faraday (0.8.8)
18
+ multipart-post (~> 1.2.0)
19
+ ffi (1.9.3)
20
+ git (1.2.6)
21
+ github_api (0.10.1)
22
+ addressable
23
+ faraday (~> 0.8.1)
24
+ hashie (>= 1.2)
25
+ multi_json (~> 1.4)
26
+ nokogiri (~> 1.5.2)
27
+ oauth2
28
+ hashie (2.0.5)
29
+ headless (1.0.1)
30
+ highline (1.6.20)
31
+ httpauth (0.2.0)
32
+ i18n (0.6.9)
33
+ jeweler (1.8.8)
34
+ builder
35
+ bundler (~> 1.0)
36
+ git (>= 1.2.5)
37
+ github_api (= 0.10.1)
38
+ highline (>= 1.6.15)
39
+ nokogiri (= 1.5.10)
40
+ rake
41
+ rdoc
42
+ json (1.8.1)
43
+ jwt (0.1.8)
44
+ multi_json (>= 1.5)
45
+ method_source (0.8.2)
46
+ minitest (4.7.5)
47
+ multi_json (1.8.2)
48
+ multi_xml (0.5.5)
49
+ multipart-post (1.2.0)
50
+ nokogiri (1.5.10)
51
+ oauth2 (0.9.2)
52
+ faraday (~> 0.8)
53
+ httpauth (~> 0.2)
54
+ jwt (~> 0.1.4)
55
+ multi_json (~> 1.0)
56
+ multi_xml (~> 0.5)
57
+ rack (~> 1.2)
58
+ pry (0.9.12.4)
59
+ coderay (~> 1.0)
60
+ method_source (~> 0.8)
61
+ slop (~> 3.4)
62
+ rack (1.5.2)
63
+ rake (10.1.0)
64
+ rdoc (3.12.2)
65
+ json (~> 1.4)
66
+ rspec (2.14.1)
67
+ rspec-core (~> 2.14.0)
68
+ rspec-expectations (~> 2.14.0)
69
+ rspec-mocks (~> 2.14.0)
70
+ rspec-core (2.14.6)
71
+ rspec-expectations (2.14.3)
72
+ diff-lcs (>= 1.1.3, < 2.0)
73
+ rspec-mocks (2.14.4)
74
+ rubyzip (1.1.0)
75
+ selenium-webdriver (2.39.0)
76
+ childprocess (>= 0.2.5)
77
+ multi_json (~> 1.0)
78
+ rubyzip (~> 1.0)
79
+ websocket (~> 1.0.4)
80
+ slop (3.4.7)
81
+ thread_safe (0.1.3)
82
+ atomic
83
+ tzinfo (0.3.38)
84
+ watir-webdriver (0.6.6)
85
+ selenium-webdriver (>= 2.18.0)
86
+ watir-webdriver-performance (0.2.3)
87
+ watir-webdriver
88
+ websocket (1.0.7)
89
+
90
+ PLATFORMS
91
+ ruby
92
+
93
+ DEPENDENCIES
94
+ activesupport
95
+ bundler (~> 1.0)
96
+ headless
97
+ jeweler (~> 1.8.7)
98
+ pry
99
+ rdoc (~> 3.12)
100
+ rspec
101
+ watir-webdriver
102
+ watir-webdriver-performance
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Obi Akubue
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,110 @@
1
+ uptime_monitor (Hercules)
2
+ ==========================
3
+ [![Build Status](https://travis-ci.org/obi-a/uptime_monitor.png?branch=master)](https://travis-ci.org/obi-a/uptime_monitor)
4
+
5
+ Using a real web browser, this plugin checks pages of a website at the specified time intervals, to ensure that the specified elements of the pages and features of the site are still working correctly.
6
+
7
+ ##Specification:
8
+
9
+ <pre lang="ruby">
10
+ monitor = {monitor: "My Website",
11
+ url: "http://mysite.com",
12
+ every: "5m",
13
+ contact: "admin@mail.com",
14
+ via: "email_notifier",
15
+ plugin: "uptime_monitor",
16
+ exists?: [
17
+ [:title, [text: "Welcome to my site"]],
18
+ [{div: {id:"test", class: "test-section"}}, [text: "this is a test"]],
19
+ [a: {href: "/aboutus" }],
20
+ [:h1],
21
+ [:h2,[text: "Login"]],
22
+ [form: {action: "/signup", method: "get"}],
23
+ [{element: {css: "#submit-button"}}, [:click]],
24
+ [{text_field: {id: "username"}}, [set: "admin"]],
25
+ [{text_field: {id: "password"}}, [set: "pass"]],
26
+ [link: {text: "Contact Us"}],
27
+ [wait_until_exists?: [div: {id:"open-section"}]]
28
+ ],
29
+ browser: ["firefox", headless: true]
30
+ }
31
+ ragios.add [monitor]
32
+ </pre>
33
+
34
+ ###Monitor login process of a real site
35
+ <pre lang="ruby">
36
+ login_process = [
37
+ [:title, [text: "Website Uptime Monitoring | SouthMunn.com"]],
38
+ [{link: {text:"Login"}}, [:click]],
39
+ [:title, [text: "Sign in - Website Uptime Monitoring | SouthMunn.com"]],
40
+ [{text_field: {id: "username"}}, [set: "admin"]],
41
+ [{text_field: {id: "password"}}, [set: "pass"]],
42
+ [:button, [:click]],
43
+ [:title, [text: "Dashboard - Website Uptime Monitoring | SouthMunn.com"]]
44
+ ]
45
+
46
+ monitor = {monitor: "My Website",
47
+ url: "https:/southmunn.com",
48
+ every: "5m",
49
+ contact: "admin@mail.com",
50
+ via: "email_notifier",
51
+ plugin: "uptime_monitor",
52
+ exists?: login_process,
53
+ browser: ["firefox", headless: true]
54
+ }
55
+ ragios.add [monitor]
56
+ </pre>
57
+
58
+ ###Real site test:
59
+ <pre lang="ruby">
60
+ monitor = {monitor: "About Us page",
61
+ url: "https://www.southmunn.com/aboutus",
62
+ browser: ["firefox", headless: false],
63
+ exists?: [
64
+ [{div: {class: "box_content"}}, [includes_text: "SouthMunn is a Website Uptime Monitoring SASS created and maintained by"]],
65
+ [img: {src: "https://fc03.deviantart.net/fs14/f/2007/047/f/2/Street_Addiction_by_gizmodus.jpg"}],
66
+ ],
67
+ }
68
+
69
+ u = Ragios::Plugin::UptimeMonitor.new
70
+ u.init monitor
71
+ u.test_command?
72
+ #=> true
73
+ u.test_result
74
+ #=> {[{:div=>{:class=>"box_content"}},
75
+ # [{:includes_text=>
76
+ # "SouthMunn is a Website Uptime Monitoring SASS created and maintained by"}]]=>
77
+ # :exists_as_expected,
78
+ # [{:img=>
79
+ # {:src=>
80
+ # "https://fc03.deviantart.net/fs14/f/2007/047/f/2/Street_Addiction_by_gizmodus.jpg"}}]=>
81
+ # :exists_as_expected}
82
+
83
+
84
+ #test result during downtime
85
+ u.test_command?
86
+ #=> false
87
+ u.test_result
88
+ #=> {[{:div=>{:class=>"box_content"}},
89
+ # [{:includes_text=>
90
+ # "SouthMunn is a Website Uptime Monitoring SASS created and maintained by"}]]=>
91
+ # :does_not_exist_as_expected,
92
+ # [{:img=>
93
+ # {:src=>
94
+ # "https://fc03.deviantart.net/fs14/f/2007/047/f/2/Street_Addiction_by_gizmodus.jpg"}}]=>
95
+ # :does_not_exist_as_expected}
96
+ </pre>
97
+
98
+ ###Supported browsers:
99
+ Firefox, Chrome, Safari, Phantomjs
100
+
101
+ ### Browser Format:
102
+ <pre lang="ruby">
103
+ browser: ["firefox", headless: true]
104
+ browser: ["firefox", headless: false]
105
+ browser: ["firefox"]
106
+ browser: ["chrome"]
107
+ </pre>
108
+ Running a browser headless requires xvfb installed.
109
+
110
+ ###More details coming soon
data/Rakefile ADDED
@@ -0,0 +1,61 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "uptime_monitor"
18
+ gem.homepage = "http://github.com/obi-a/uptime_monitor"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{Real browser website uptime monitoring plugin for Ragios}
21
+ gem.description = %Q{Uses a real web browser to monitor a web app for uptime}
22
+ gem.email = "obioraakubue@yahoo.com"
23
+ gem.authors = ["obi-a"]
24
+ # dependencies defined in Gemfile
25
+ end
26
+ Jeweler::RubygemsDotOrgTasks.new
27
+
28
+ require 'rake/testtask'
29
+ Rake::TestTask.new(:test) do |test|
30
+ test.libs << 'lib' << 'test'
31
+ test.pattern = 'test/**/test_*.rb'
32
+ test.verbose = true
33
+ end
34
+
35
+ #require 'rcov/rcovtask'
36
+ #Rcov::RcovTask.new do |test|
37
+ # test.libs << 'test'
38
+ # test.pattern = 'test/**/test_*.rb'
39
+ # test.verbose = true
40
+ # test.rcov_opts << '--exclude "gems/*"'
41
+ #end
42
+
43
+ task :repl do
44
+ uptime_monitor_file = File.expand_path(File.join(File.dirname(__FILE__), '..', 'uptime_monitor/lib/uptime_monitor'))
45
+ irb = "bundle exec pry -r #{uptime_monitor_file}"
46
+ sh irb
47
+ end
48
+
49
+ task :r => :repl
50
+
51
+ task :default => :test
52
+
53
+ require 'rdoc/task'
54
+ Rake::RDocTask.new do |rdoc|
55
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
56
+
57
+ rdoc.rdoc_dir = 'rdoc'
58
+ rdoc.title = "uptime_monitor #{version}"
59
+ rdoc.rdoc_files.include('README*')
60
+ rdoc.rdoc_files.include('lib/**/*.rb')
61
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,13 @@
1
+ require 'headless'
2
+ require 'watir-webdriver'
3
+ require 'watir-webdriver-performance'
4
+ require 'ostruct'
5
+ require 'active_support'
6
+
7
+ def require_all(path)
8
+ Dir.glob(File.dirname(__FILE__) + path + '/*.rb') do |file|
9
+ require File.dirname(__FILE__) + path + '/' + File.basename(file, File.extname(file))
10
+ end
11
+ end
12
+
13
+ require_all '/uptime_monitor'
@@ -0,0 +1,144 @@
1
+ module Hercules
2
+ module UptimeMonitor
3
+ class Browser
4
+ def initialize(url, browser_name = "firefox", is_headless = false)
5
+ start_headless if is_headless
6
+ goto(url,browser_name)
7
+ end
8
+ def close
9
+ @browser.close
10
+ @headless.destroy if @headless
11
+ end
12
+ def rest(page_element)
13
+ page_element[1..-1]
14
+ end
15
+ def exists?(page_element)
16
+ message = "Invalid page element format: #{page_element.inspect}"
17
+ raise(Hercules::UptimeMonitor::InvalidPageElementForm.new(error: message), message) unless page_element.is_a?(Array)
18
+ is_wait_until?(page_element.first) ? apply_wait_until?(page_element.first[:wait_until_exists?]) : page_element_exists?(page_element)
19
+ end
20
+ def page_element_exists?(page_element)
21
+ element = get_element(page_element.first)
22
+ begin
23
+ first_exists = element.exists?
24
+ rescue Exception => e
25
+ message = "Cannot find page element in this form: #{page_element.first.inspect}, you may use a css query form"
26
+ raise(Hercules::UptimeMonitor::UnknownPageElement.new(error: message), message)
27
+ end
28
+ if first_exists && !rest(page_element).empty?
29
+ rest_exists?(element, rest(page_element))
30
+ else
31
+ first_exists
32
+ end
33
+ end
34
+ def get_element(first)
35
+ if first.is_a? Symbol
36
+ @browser.send(first)
37
+ elsif first.is_a? Hash
38
+ key, value = first.first
39
+ @browser.send(key, value)
40
+ else
41
+ message = "Invalid page element #{first.inspect}"
42
+ raise(Hercules::UptimeMonitor::InvalidPageElement.new(error: message), message)
43
+ end
44
+ end
45
+ def rest_exists?(element, array)
46
+ results = array.map { |e| apply_rest?(element, e) }
47
+ results.include?(false) ? false : true
48
+ end
49
+ def apply_rest?(element, array)
50
+ if is_a_text?(array)
51
+ apply_text?(element.text, array.first)
52
+ elsif is_an_action?(array)
53
+ apply_action?(element, array.first)
54
+ else
55
+ message = "Invalid options: #{array.inspect}"
56
+ raise(Hercules::UptimeMonitor::InvalidRest.new(error: message), message)
57
+ end
58
+ end
59
+ def is_a_text?(text_array)
60
+ if text_array.is_a? Array
61
+ if text_array.first.is_a? Hash
62
+ text_hash = text_array.first
63
+ key, value = text_hash.first
64
+ if (([:text, :includes_text].include?(key)) && (value.is_a? String))
65
+ return true
66
+ end
67
+ end
68
+ end
69
+ return false
70
+ end
71
+ def is_an_action?(array)
72
+ if array.is_a? Array
73
+ if array.first.is_a?(Symbol) || array.first.is_a?(Hash)
74
+ return true
75
+ end
76
+ end
77
+ return false
78
+ end
79
+ def is_wait_until?(hash)
80
+ return false unless hash.is_a? Hash
81
+ key, value = hash.first
82
+ key == :wait_until_exists?
83
+ end
84
+ def apply_text?(assert_eq_text, text_hash)
85
+ if text_hash[:text]
86
+ text_hash[:text] == assert_eq_text
87
+ elsif text_hash[:includes_text]
88
+ assert_eq_text.include? text_hash[:includes_text]
89
+ else
90
+ message = "Could not evaluate page_element text: #{text_hash.inspect}"
91
+ raise(Hercules::UptimeMonitor::InvalidText.new(error: message), message)
92
+ end
93
+ end
94
+ def apply_action?(element, action)
95
+ if action.is_a? Symbol
96
+ element.send(action)
97
+ elsif action.is_a? Hash
98
+ key, value = action.first
99
+ element.send(key, value)
100
+ else
101
+ message = "Cannot apply action: #{action.inspect}"
102
+ raise(Hercules::UptimeMonitor::InvalidAction.new(error: message), message)
103
+ end
104
+ true
105
+ end
106
+ def apply_wait_until?(page_element)
107
+ Watir::Wait.until { page_element_exists?(page_element) }
108
+ true
109
+ rescue Watir::Wait::TimeoutError
110
+ false
111
+ end
112
+ private
113
+ def goto(url, browser_name)
114
+ @browser = Watir::Browser.new browser_name
115
+ @browser.goto url
116
+ end
117
+ def start_headless
118
+ @headless = Headless.new
119
+ @headless.start
120
+ @headless
121
+ end
122
+ end
123
+ end
124
+ end
125
+
126
+ class String
127
+ def exists?
128
+ true
129
+ end
130
+ def text
131
+ self
132
+ end
133
+ end
134
+
135
+ module Hercules
136
+ module UptimeMonitor
137
+ class InvalidAction < StandardError; end
138
+ class InvalidText < StandardError; end
139
+ class InvalidRest < StandardError; end
140
+ class InvalidPageElement < StandardError; end
141
+ class UnknownPageElement < StandardError; end
142
+ class InvalidPageElementForm < StandardError; end
143
+ end
144
+ end
@@ -0,0 +1,41 @@
1
+ module Hercules
2
+ module UptimeMonitor
3
+ class BrowserReader
4
+ attr_reader :browser
5
+ attr_reader :browser_name
6
+ def initialize(browser)
7
+ @browser = browser
8
+ @browser_name = eval
9
+ end
10
+ def headless
11
+ @browser[1] ? @browser[1][:headless] : false
12
+ end
13
+ private
14
+ #browser form
15
+ #["firefox", headless: true]
16
+ #["firefox", headless: false]
17
+ #["firefox"]
18
+ def read
19
+ message = "Invalid Browser: #{@browser.inspect}"
20
+ raise(Hercules::UptimeMonitor::InvalidBrowserForm.new(error: message), message) unless @browser.is_a? Array
21
+ raise(Hercules::UptimeMonitor::InvalidBrowserForm.new(error: message), message) unless @browser.first.is_a? String
22
+ if browser.length > 1
23
+ error_message = "Invalid setting for headless browser in #{@browser.inspect}"
24
+ raise(Hercules::UptimeMonitor::InvalidHeadlessForm.new(error: message), message) unless @browser[1].is_a? Hash
25
+ raise(Hercules::UptimeMonitor::InvalidHeadlessForm.new(error: message), message) unless [TrueClass, FalseClass].include? @browser[1][:headless].class
26
+ end
27
+ end
28
+ def eval
29
+ read
30
+ @browser.first
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ module Hercules
37
+ module UptimeMonitor
38
+ class InvalidBrowserForm < StandardError; end
39
+ class InvalidHeadlessForm < StandardError; end
40
+ end
41
+ end
@@ -0,0 +1,62 @@
1
+ module Ragios
2
+ module Plugin
3
+ class UptimeMonitor
4
+ attr_reader :monitor
5
+ attr_reader :test_result
6
+ attr_reader :success
7
+
8
+ def initialize
9
+ @test_result = ActiveSupport::OrderedHash.new
10
+ end
11
+
12
+ def init(monitor)
13
+ @monitor = OpenStruct.new(monitor)
14
+ message = "A url must be provided for uptime_monitor: #{@monitor.monitor}"
15
+ raise(Hercules::UptimeMonitor::NoUrlProvided.new(error: message), message) if @monitor.url.nil?
16
+ message = "A browser must be provided for uptime_monitor: #{@monitor.monitor}"
17
+ raise(Hercules::UptimeMonitor::NoBrowserProvided.new(error: message), message) if @monitor.browser.nil?
18
+ message = "A validation (exists?) must be provided for uptime_monitor: #{@monitor.monitor}"
19
+ raise(Hercules::UptimeMonitor::NoValidationProvided.new(error: message), message) if @monitor.exists?.nil?
20
+ end
21
+
22
+ def test_command?
23
+ @success = true
24
+ browser_reader = Hercules::UptimeMonitor::BrowserReader.new(@monitor.browser)
25
+ start_browser(@monitor.url, browser_reader.browser_name, browser_reader.headless)
26
+ exists(@monitor.exists?)
27
+ close_browser
28
+ @success
29
+ rescue Exception => e
30
+ close_browser
31
+ raise e
32
+ end
33
+
34
+ def close_browser
35
+ @browser.close
36
+ end
37
+
38
+ def start_browser(url, browser_name, headless)
39
+ @browser = Hercules::UptimeMonitor::Browser.new(url, browser_name, headless)
40
+ end
41
+
42
+ def exists(page_elements)
43
+ page_elements.each do |page_element|
44
+ @browser.exists?(page_element) ? result!(page_element, true) : result!(page_element, false)
45
+ end
46
+ end
47
+
48
+ def result!(page_element, state)
49
+ @success = state
50
+ result = state ? {page_element => :exists_as_expected} : {page_element => :does_not_exist_as_expected}
51
+ @test_result.merge!(result)
52
+ end
53
+ end
54
+ end
55
+ end
56
+ module Hercules
57
+ module UptimeMonitor
58
+ class NoUrlProvided < StandardError; end
59
+ class NoValidationProvided < StandardError; end
60
+ class NoBrowserProvided < StandardError; end
61
+ end
62
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hercules::UptimeMonitor::BrowserReader do
4
+ before(:each) do
5
+ @browser = "safari"
6
+ end
7
+ it "reads a browser with no headless option" do
8
+ reader = Hercules::UptimeMonitor::BrowserReader.new([@browser])
9
+ reader.browser_name.should == @browser
10
+ reader.headless.should == false
11
+ end
12
+ it "reads a browser with headless false" do
13
+ browser = [@browser, headless: false]
14
+ reader = Hercules::UptimeMonitor::BrowserReader.new(browser)
15
+ reader.browser_name.should == @browser
16
+ reader.headless.should == false
17
+ end
18
+ it "reads a browser with headless true" do
19
+ browser = [@browser, headless: true]
20
+ reader = Hercules::UptimeMonitor::BrowserReader.new(browser)
21
+ reader.browser_name.should == @browser
22
+ reader.headless.should == true
23
+ end
24
+ it "cannot read a browser in wrong form" do
25
+ browser = 1
26
+ expect{Hercules::UptimeMonitor::BrowserReader.new(browser)}.to raise_error(Hercules::UptimeMonitor::InvalidBrowserForm)
27
+ browser = [1]
28
+ expect{Hercules::UptimeMonitor::BrowserReader.new(browser)}.to raise_error(Hercules::UptimeMonitor::InvalidBrowserForm)
29
+ browser = [@browser, 1]
30
+ expect{Hercules::UptimeMonitor::BrowserReader.new(browser)}.to raise_error(Hercules::UptimeMonitor::InvalidHeadlessForm)
31
+ browser = [@browser, something: :wrong]
32
+ expect{Hercules::UptimeMonitor::BrowserReader.new(browser)}.to raise_error(Hercules::UptimeMonitor::InvalidHeadlessForm)
33
+ browser = [@browser, something: true]
34
+ expect{Hercules::UptimeMonitor::BrowserReader.new(browser)}.to raise_error(Hercules::UptimeMonitor::InvalidHeadlessForm)
35
+ browser = [@browser, headless: "true"]
36
+ expect{Hercules::UptimeMonitor::BrowserReader.new(browser)}.to raise_error(Hercules::UptimeMonitor::InvalidHeadlessForm)
37
+ browser = [@browser, "headless" => true]
38
+ expect{Hercules::UptimeMonitor::BrowserReader.new(browser)}.to raise_error(Hercules::UptimeMonitor::InvalidHeadlessForm)
39
+ end
40
+ end
@@ -0,0 +1,170 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hercules::UptimeMonitor::Browser do
4
+ before(:all) do
5
+ url= "http://obi-akubue.org"
6
+ headless = true
7
+ browser_name = "firefox"
8
+ @browser = Hercules::UptimeMonitor::Browser.new(url, browser_name, headless)
9
+ end
10
+ it "can wait until a page element exists" do
11
+ @browser.apply_wait_until?([:title]).should == true
12
+ end
13
+ it "times out if the page element never exists after 30 secs" do
14
+ @browser.apply_wait_until?([{text_field: {id: "abc_dont_exist"}}]).should == false
15
+ end
16
+
17
+ it "can apply an action" do
18
+ element = @browser.get_element({text_field: {id: "s"}})
19
+ element.exists?.should == true
20
+ @browser.apply_action?(element, {set: "github"}).should == true
21
+ element = @browser.get_element({button: {id: "searchsubmit"}})
22
+ element.exists?.should == true
23
+ @browser.apply_action?(element, :click).should == true
24
+ element = @browser.get_element({link: {text:"Obi Akubue"}})
25
+ element.exists?.should == true
26
+ @browser.apply_action?(element, :click).should == true
27
+ end
28
+ it "cannot apply an action with unknown element" do
29
+ element = @browser.get_element({text_field: {id: "abc_dont_exist"}})
30
+ expect{@browser.apply_action?(element, {set: "github"})}.to raise_error(Watir::Exception::UnknownObjectException)
31
+ end
32
+ it "cannot apply an action on element that can't respond to it " do
33
+ element = @browser.get_element({button: {id: "searchsubmit"}})
34
+ element.exists?.should == true
35
+ expect{@browser.apply_action?(element, {set: "github"})}.to raise_error
36
+ end
37
+ it "cannot apply action in wrong form" do
38
+ element = @browser.get_element({text_field: {id: "s"}})
39
+ element.exists?.should == true
40
+ expect{@browser.apply_action?(element, "wrong form action")}.to raise_error(Hercules::UptimeMonitor::InvalidAction)
41
+ end
42
+ it "returns true for matching text form" do
43
+ @browser.apply_text?("hello world", {text: "hello world"}).should == true
44
+ end
45
+ it "returns false for non-matching text form" do
46
+ @browser.apply_text?("hello world", {text: "something else"}).should == false
47
+ end
48
+ it "returns true for matching includes_text form" do
49
+ @browser.apply_text?("hello world", {includes_text: "hello"}).should == true
50
+ end
51
+ it "returns false for non-matching includes_text form" do
52
+ @browser.apply_text?("hello world", {includes_text: "something else"}).should == false
53
+ end
54
+ it "cannot match unknown text form" do
55
+ expect{@browser.apply_text?("hello world", {something_else: "something else"})}.to raise_error(Hercules::UptimeMonitor::InvalidText)
56
+ end
57
+ it "can detect correct wait_until form" do
58
+ @browser.is_wait_until?({wait_until_exists?: :anything}).should == true
59
+ end
60
+ it "can detect incorrect wait_until form" do
61
+ @browser.is_wait_until?({something_else: :anything}).should == false
62
+ @browser.is_wait_until?("something_else").should == false
63
+ end
64
+ it "can detect a valid action form" do
65
+ @browser.is_an_action?([set: "admin"]).should == true
66
+ @browser.is_an_action?([:click]).should == true
67
+ end
68
+ it "can detect invalid action form" do
69
+ @browser.is_an_action?("something_else").should == false
70
+ @browser.is_an_action?(["something_else"]).should == false
71
+ end
72
+ it "can detect valid text form" do
73
+ @browser.is_a_text?([{text: "hello world"}]).should == true
74
+ @browser.is_a_text?([{includes_text: "hello world"}]).should == true
75
+ end
76
+ it "can detect invalid text form" do
77
+ @browser.is_a_text?("something_else").should == false
78
+ @browser.is_a_text?(["something_else"]).should == false
79
+ @browser.is_a_text?([{"something_else"=> :anything}]).should == false
80
+ @browser.is_a_text?([{something_else: :anything}]).should == false
81
+ @browser.is_a_text?([{text: :anything}]).should == false
82
+ end
83
+ it "can apply rest to text form" do
84
+ @browser.apply_rest?("hello world",[{text: "hello world"}]).should == true
85
+ end
86
+ it "can apply rest to action form" do
87
+ element = @browser.get_element({text_field: {id: "s"}})
88
+ element.exists?.should == true
89
+ @browser.apply_rest?(element,[{set: "github"}]).should == true
90
+ end
91
+ it "cannot apply rest for unknown form" do
92
+ expect{@browser.apply_rest?(:element,:something_else)}.to raise_error(Hercules::UptimeMonitor::InvalidRest)
93
+ end
94
+ it "returns true when all expressions are true for rest exists" do
95
+ element = @browser.get_element(:title)
96
+ element.exists?.should == true
97
+ @browser.rest_exists?(element, [[{text: "Obi Akubue"}],[{includes_text: "Akubue"}]]).should == true
98
+ end
99
+ it "returns false when any expression is false for rest exists" do
100
+ element = @browser.get_element(:title)
101
+ element.exists?.should == true
102
+ @browser.rest_exists?(element, [[{text: "Obi Akubue"}],[{includes_text: "something_else"}]]).should == false
103
+ end
104
+ it "returns an element from symbol" do
105
+ element = @browser.get_element(:div)
106
+ element.exists?.should == true
107
+ end
108
+ it "returns an element from hash with element and attributes" do
109
+ element = @browser.get_element({a: {href:"http://obi-akubue.org/?feed=rss", id: "rss-link"}})
110
+ element.exists?.should == true
111
+ end
112
+ it "returns false for an element doesn't exist" do
113
+ element = @browser.get_element({div: {class: "something_else", id: "something_else"}})
114
+ element.exists?.should == false
115
+ end
116
+ it "cannot check an element exists using unusual attributes unless its a css query" do
117
+ element = @browser.get_element({div: {unusual_attribute: "something_else", id: "something_else"}})
118
+ expect{element.exists?}.to raise_error(Watir::Exception::MissingWayOfFindingObjectException)
119
+ end
120
+ it "can check an element exists using unusual attributes with css query" do
121
+ element = @browser.get_element({element: {css: '[data-name="message"]'}})
122
+ element.exists?.should == false
123
+ element = @browser.get_element({element: {css: '[something_else="something_else"]'}})
124
+ element.exists?.should == false
125
+ end
126
+ it "can use css query to check an element exists" do
127
+ element = @browser.get_element({element: {css: '#rss-link'}})
128
+ element.exists?.should == true
129
+ end
130
+ it "cannot check if an element exists if element has incorrect form" do
131
+ expect{@browser.get_element("something_else")}.to raise_error(Hercules::UptimeMonitor::InvalidPageElement)
132
+ end
133
+ it "can check if a symbol form page element exists" do
134
+ @browser.page_element_exists?([:title]).should == true
135
+ end
136
+ it "can check if an array form page element exists" do
137
+ @browser.page_element_exists?([{a: {href:"http://obi-akubue.org/?feed=rss", id: "rss-link"}}]).should == true
138
+ end
139
+ it "can check if element exists with rest options in text and/or action form and applies any action form" do
140
+ element = {link: {text:"Obi Akubue"}}, [:click], [text: "Obi Akubue"], [includes_text: "Obi"], [:click]
141
+ @browser.page_element_exists?(element).should == true
142
+ element = {link: {text:"something_else"}}, [:click], [text: "Obi Akubue"], [includes_text: "Obi"], [:click]
143
+ @browser.page_element_exists?(element).should == false
144
+ element = {link: {text:"Obi Akubue"}}, [text: "something_else"], [includes_text: "Obi"], [:click]
145
+ @browser.page_element_exists?(element).should == false
146
+ element = {link: {text:"Obi Akubue"}}, [:click], [text: "Obi Akubue"], [includes_text: "something_else"], [:click]
147
+ @browser.page_element_exists?(element).should == false
148
+ end
149
+ it "cannot check if page_element_exists if first is in wrong form" do
150
+ element = [{div: {unusual_attribute: "something_else", id: "something_else"}}]
151
+ expect{@browser.page_element_exists?(element)}.to raise_error(Hercules::UptimeMonitor::UnknownPageElement)
152
+ end
153
+ it "can check if page_element_exists" do
154
+ @browser.exists?([{text_field: {id: "s"}}]).should == true
155
+ @browser.exists?([{wait_until_exists?: [{text_field: {id: "s"}}]}]).should == true
156
+ @browser.exists?([{text_field: {id: "something_else"}}]).should == false
157
+ #returns false if element doesn't exist after waiting for 30 seconds
158
+ @browser.exists?([{wait_until_exists?: [{text_field: {id: "something_else"}}]}]).should == false
159
+ end
160
+ it "cannot check if page_element_exists when in a wrong form" do
161
+ expect{@browser.exists?("something_else")}.to raise_error(Hercules::UptimeMonitor::InvalidPageElementForm)
162
+ end
163
+ it "returns the cdr of an array" do
164
+ @browser.rest((1..5).to_a).should == (2..5).to_a
165
+ end
166
+
167
+ after(:all) do
168
+ @browser.close
169
+ end
170
+ end
@@ -0,0 +1,2 @@
1
+ require 'rubygems'
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib/uptime_monitor'))
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ragios::Plugin::UptimeMonitor do
4
+ before(:each) do
5
+ @uptime_monitor = Ragios::Plugin::UptimeMonitor.new
6
+ end
7
+ it "sets the correct test result for success" do
8
+ @uptime_monitor.result!("page_element", state = true)
9
+ @uptime_monitor.test_result.should == {"page_element" => :exists_as_expected}
10
+ @uptime_monitor.success.should == true
11
+ end
12
+ it "sets the correct test result for failure" do
13
+ @uptime_monitor.result!(:page_element, state = false)
14
+ @uptime_monitor.test_result.should == {:page_element => :does_not_exist_as_expected}
15
+ @uptime_monitor.success.should == false
16
+ end
17
+ it "must include a url" do
18
+ monitor = {exists?: :exists, browser: :browser}
19
+ expect{@uptime_monitor.init(monitor)}.to raise_error(Hercules::UptimeMonitor::NoUrlProvided)
20
+ end
21
+ it "must include a browser" do
22
+ monitor = {exists?: :exists, url: :url}
23
+ expect{@uptime_monitor.init(monitor)}.to raise_error(Hercules::UptimeMonitor::NoBrowserProvided)
24
+ end
25
+ it "must include a validation" do
26
+ monitor = {browser: :browser, url: :url}
27
+ expect{@uptime_monitor.init(monitor)}.to raise_error(Hercules::UptimeMonitor::NoValidationProvided)
28
+ end
29
+ it "returns true if page element exists" do
30
+ monitor = {browser: :browser, exists?: :exists, url: :url}
31
+ @uptime_monitor.init(monitor)
32
+ @uptime_monitor.start_browser("http://obi-akubue.org","firefox", headless = true)
33
+ page_element = [:title]
34
+ @uptime_monitor.exists([page_element])
35
+ @uptime_monitor.test_result.should == {page_element => :exists_as_expected}
36
+ @uptime_monitor.success.should == true
37
+ @uptime_monitor.close_browser
38
+ end
39
+ it "returns false if page element don't exists" do
40
+ monitor = {browser: :browser, exists?: :exists, url: :url}
41
+ @uptime_monitor.init(monitor)
42
+ @uptime_monitor.start_browser("http://obi-akubue.org","firefox", headless = true)
43
+ page_element = [:title, [text: "dont_exist"]]
44
+ @uptime_monitor.exists([page_element])
45
+ @uptime_monitor.test_result.should == {page_element => :does_not_exist_as_expected}
46
+ @uptime_monitor.success.should == false
47
+ @uptime_monitor.close_browser
48
+ end
49
+ it "runs a test that passes" do
50
+ page_element = [:title]
51
+ monitor = {url: "http://obi-akubue.org",
52
+ browser: ["firefox", headless: true],
53
+ exists?: [page_element]
54
+ }
55
+ @uptime_monitor.init(monitor)
56
+ @uptime_monitor.test_command?.should == true
57
+ @uptime_monitor.test_result.should == {page_element => :exists_as_expected}
58
+ end
59
+ it "runs a test that fails" do
60
+ page_element = [:title, [text: "dont_exist"]]
61
+ monitor = {url: "http://obi-akubue.org",
62
+ browser: ["firefox", headless: true],
63
+ exists?: [page_element]
64
+ }
65
+ @uptime_monitor.init(monitor)
66
+ @uptime_monitor.test_command?.should == false
67
+ @uptime_monitor.test_result.should == {page_element => :does_not_exist_as_expected}
68
+ end
69
+ end
metadata ADDED
@@ -0,0 +1,210 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: uptime_monitor
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - obi-a
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-03-22 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: headless
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: watir-webdriver
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: watir-webdriver-performance
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: activesupport
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rspec
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: rdoc
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: '3.12'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: '3.12'
110
+ - !ruby/object:Gem::Dependency
111
+ name: bundler
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: '1.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: '1.0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: jeweler
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ~>
132
+ - !ruby/object:Gem::Version
133
+ version: 1.8.7
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ version: 1.8.7
142
+ - !ruby/object:Gem::Dependency
143
+ name: pry
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ description: Uses a real web browser to monitor a web app for uptime
159
+ email: obioraakubue@yahoo.com
160
+ executables: []
161
+ extensions: []
162
+ extra_rdoc_files:
163
+ - LICENSE
164
+ - README.md
165
+ files:
166
+ - .document
167
+ - .travis.yml
168
+ - Gemfile
169
+ - Gemfile.lock
170
+ - LICENSE
171
+ - README.md
172
+ - Rakefile
173
+ - VERSION
174
+ - lib/uptime_monitor.rb
175
+ - lib/uptime_monitor/browser.rb
176
+ - lib/uptime_monitor/browser_reader.rb
177
+ - lib/uptime_monitor/uptime_monitor.rb
178
+ - spec/browser_reader_spec.rb
179
+ - spec/browser_spec.rb
180
+ - spec/spec_helper.rb
181
+ - spec/uptime_monitor_spec.rb
182
+ homepage: http://github.com/obi-a/uptime_monitor
183
+ licenses:
184
+ - MIT
185
+ post_install_message:
186
+ rdoc_options: []
187
+ require_paths:
188
+ - lib
189
+ required_ruby_version: !ruby/object:Gem::Requirement
190
+ none: false
191
+ requirements:
192
+ - - ! '>='
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ segments:
196
+ - 0
197
+ hash: -845472848363939348
198
+ required_rubygems_version: !ruby/object:Gem::Requirement
199
+ none: false
200
+ requirements:
201
+ - - ! '>='
202
+ - !ruby/object:Gem::Version
203
+ version: '0'
204
+ requirements: []
205
+ rubyforge_project:
206
+ rubygems_version: 1.8.24
207
+ signing_key:
208
+ specification_version: 3
209
+ summary: Real browser website uptime monitoring plugin for Ragios
210
+ test_files: []