Skip to content

Commit

Permalink
Initial checkin
Browse files Browse the repository at this point in the history
  • Loading branch information
Jonas Nicklas and Kevin Fitzpatrick authored and jnicklas committed Nov 4, 2009
0 parents commit 8435d19
Show file tree
Hide file tree
Showing 19 changed files with 423 additions and 0 deletions.
4 changes: 4 additions & 0 deletions History.txt
@@ -0,0 +1,4 @@
=== 0.0.1 2009-11-04

* 1 major enhancement:
* Initial release
19 changes: 19 additions & 0 deletions Manifest.txt
@@ -0,0 +1,19 @@
History.txt
Manifest.txt
README.rdoc
Rakefile
examples/webcat.rb
lib/webcat.rb
lib/webcat/culerity_driver.rb
lib/webcat/rack_test_driver.rb
lib/webcat/server.rb
script/console
script/destroy
script/generate
spec/culerity_driver_spec.rb
spec/drivers_spec.rb
spec/rack_test_driver_spec.rb
spec/spec_helper.rb
spec/webcat_spec.rb
test/test_helper.rb
test/test_webcat.rb
49 changes: 49 additions & 0 deletions README.rdoc
@@ -0,0 +1,49 @@
= webcat

* http://github.com/jnicklas/webcat

== DESCRIPTION:

Webcat is a fledgeling replacement for webrat which aims to work with all
browser simulators as well as rack-test.

== FEATURES/PROBLEMS:

* FIX (list of features or problems)

== SYNOPSIS:

FIX (code sample of usage)

== REQUIREMENTS:

* FIX (list of requirements)

== INSTALL:

* FIX (sudo gem install, anything else)

== LICENSE:

(The MIT License)

Copyright (c) 2009 Jonas Nicklas

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
'Software'), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 changes: 26 additions & 0 deletions Rakefile
@@ -0,0 +1,26 @@
require 'rubygems'
gem 'hoe', '>= 2.1.0'
require 'hoe'
require 'fileutils'
require './lib/webcat'

Hoe.plugin :newgem
# Hoe.plugin :website
# Hoe.plugin :cucumberfeatures

# Generate all the Rake tasks
# Run 'rake -T' to see list of generated tasks (from gem root directory)
$hoe = Hoe.spec 'webcat' do
self.developer 'Jonas Nicklas', 'jonas.nicklas@gmail.com'
self.rubyforge_name = self.name # TODO this is default value

self.extra_deps = [['activesupport','>= 2.0.2']]

end

require 'newgem/tasks'
Dir['tasks/**/*.rake'].each { |t| load t }

# TODO - want other tests/tasks run by default? Add them to the list
# remove_task :default
# task :default => [:spec, :features]
36 changes: 36 additions & 0 deletions examples/webcat.rb
@@ -0,0 +1,36 @@
session = Webcat::Session.new('http://localhost:3000')

session.visit '/'

session.driver.trigger :click, '//div[@id=foo]//a'
session.driver.trigger :mouseover, '#foo a.bar' # will be ignored by drivers who do not support it

nodelist = session.find 'li#foo a'
nodelist.empty?
nodelist.first.tag_name # => 'a'
nodelist.first.text # => 'a cute link'
nodelist.first.html # => 'a <em>cute</em> link'
nodelist.first.attributes # => { :href => '/blah' }
nodelist.first.trigger :click

session.request.url # => '/blah'
session.response.ok? # => true

# fancy stuff, just builds on the stuff above!

session.click_link 'a cute link'
session.click_button 'an awesome button'
session.within '#foo' do
click_link 'a cute link'
end
session.fill_in 'foo', :with => 'bar'
session.choose 'Monkey'
session.check 'I am awesome'
session.wait_for '#fooo"
# In cuke:
When 'I am awesome' do
page.check 'I am awesome'
page.click_button 'FooBar'
end
37 changes: 37 additions & 0 deletions lib/webcat.rb
@@ -0,0 +1,37 @@
module Webcat
class << self
attr_accessor :debug

def log(message)
puts message if debug
end
end

class Session
attr_reader :mode, :app

def initialize(mode, app)
@mode = mode
@app = app
end

def driver
@driver ||= Webcat::Driver::RackTest.new(app)
end

def get(path)
driver.get(path)
end

def body
driver.response.body
end
end

autoload :Server, 'webcat/server'

module Driver
autoload :RackTest, 'webcat/rack_test_driver'
autoload :Culerity, 'webcat/culerity_driver'
end
end
50 changes: 50 additions & 0 deletions lib/webcat/culerity_driver.rb
@@ -0,0 +1,50 @@
require 'culerity'
require 'rack'
require 'net/http'

class Webcat::Driver::Culerity
Response = Struct.new(:body)

attr_reader :app, :rack_server

def initialize(app)
@app = app
@rack_server = Webcat::Server.new(@app)
@rack_server.boot
end

def get(path)
browser.goto(url(path))
end

def body
browser.text
end

private

def url(path)
rack_server.url(path)
end

def server
unless @_server
@_server = ::Culerity::run_server
at_exit do
@_server.close
end
end
@_server
end

def browser
unless @_browser
@_browser = ::Culerity::RemoteBrowserProxy.new server, {:browser => :firefox, :log_level => :off}
at_exit do
@_browser.exit
end
end
@_browser
end

end
17 changes: 17 additions & 0 deletions lib/webcat/rack_test_driver.rb
@@ -0,0 +1,17 @@
require 'rack/test'

class Webcat::Driver::RackTest
include ::Rack::Test::Methods
attr_reader :app

alias_method :response, :last_response
alias_method :request, :last_request

def initialize(app)
@app = app
end

def body
response.body
end
end
48 changes: 48 additions & 0 deletions lib/webcat/server.rb
@@ -0,0 +1,48 @@
class Webcat::Server
attr_reader :app

def initialize(app)
@app = app
end

def port
9081
end

def host
'localhost'
end

def url(path)
"http://#{host}:#{port}#{path}"
end

def boot
Webcat.log "[webcat] Booting Rack applicartion on port #{port}"
start_time = Time.now
Thread.new do
Rack::Handler::Mongrel.run @app, :Port => port
end
Webcat.log "[webcat] checking if application has booted"
loop do
begin
res = Net::HTTP.start(host, port) { |http| http.get('/') }

if res.is_a?(Net::HTTPSuccess) or res.is_a?(Net::HTTPRedirection)
Webcat.log "[webcat] application has booted"
break
end
rescue Errno::ECONNREFUSED
end

if Time.now - start_time > 5
puts "[webcat] Rack application timed out during boot"
exit
end

Webcat.log '.'
sleep 1
end
end

end
10 changes: 10 additions & 0 deletions script/console
@@ -0,0 +1,10 @@
#!/usr/bin/env ruby
# File: script/console
irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'

libs = " -r irb/completion"
# Perhaps use a console_lib to store any extra methods I may want available in the cosole
# libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
libs << " -r #{File.dirname(__FILE__) + '/../lib/webcat.rb'}"
puts "Loading webcat gem"
exec "#{irb} #{libs} --simple-prompt"
14 changes: 14 additions & 0 deletions script/destroy
@@ -0,0 +1,14 @@
#!/usr/bin/env ruby
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))

begin
require 'rubigen'
rescue LoadError
require 'rubygems'
require 'rubigen'
end
require 'rubigen/scripts/destroy'

ARGV.shift if ['--help', '-h'].include?(ARGV[0])
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
RubiGen::Scripts::Destroy.new.run(ARGV)
14 changes: 14 additions & 0 deletions script/generate
@@ -0,0 +1,14 @@
#!/usr/bin/env ruby
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))

begin
require 'rubigen'
rescue LoadError
require 'rubygems'
require 'rubigen'
end
require 'rubigen/scripts/generate'

ARGV.shift if ['--help', '-h'].include?(ARGV[0])
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
RubiGen::Scripts::Generate.new.run(ARGV)
10 changes: 10 additions & 0 deletions spec/culerity_driver_spec.rb
@@ -0,0 +1,10 @@
require File.expand_path('spec_helper', File.dirname(__FILE__))
require 'drivers_spec'

describe Webcat::Driver::Culerity do
before do
@driver = Webcat::Driver::Culerity.new(TestApp)
end

it_should_behave_like "driver"
end
14 changes: 14 additions & 0 deletions spec/drivers_spec.rb
@@ -0,0 +1,14 @@
require File.expand_path('spec_helper', File.dirname(__FILE__))

shared_examples_for 'driver' do

describe '#get' do
it "should fetch a response" do
@driver.get('/')
@driver.body.should == 'Hello world!'
@driver.get('/foo')
@driver.body.should == 'Another World'
end
end

end
10 changes: 10 additions & 0 deletions spec/rack_test_driver_spec.rb
@@ -0,0 +1,10 @@
require File.expand_path('spec_helper', File.dirname(__FILE__))
require 'drivers_spec'

describe Webcat::Driver::RackTest do
before do
@driver = Webcat::Driver::RackTest.new(TestApp)
end

it_should_behave_like "driver"
end
16 changes: 16 additions & 0 deletions spec/spec_helper.rb
@@ -0,0 +1,16 @@
$:.unshift(File.expand_path('../lib', File.dirname(__FILE__)))

require 'rubygems'
require 'webcat'
require 'sinatra/base'
require 'rack'

class TestApp < Sinatra::Base
get '/' do
'Hello world!'
end

get '/foo' do
'Another World'
end
end

0 comments on commit 8435d19

Please sign in to comment.