Permalink
Browse files

Initial checkin

  • Loading branch information...
0 parents commit 8435d19a3abfb559f25c94928bd810aec20592c9 Jonas Nicklas and Kevin Fitzpatrick committed with jnicklas Nov 4, 2009
@@ -0,0 +1,4 @@
+=== 0.0.1 2009-11-04
+
+* 1 major enhancement:
+ * Initial release
@@ -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
@@ -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.
@@ -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]
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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"
@@ -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)
@@ -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)
@@ -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
@@ -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
@@ -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
@@ -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
Oops, something went wrong.

0 comments on commit 8435d19

Please sign in to comment.