akephalos 0.0.5 → 0.1.0

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 (39) hide show
  1. data/MIT_LICENSE +20 -0
  2. data/README.md +55 -0
  3. data/bin/akephalos +56 -8
  4. data/lib/akephalos.rb +5 -0
  5. data/lib/akephalos/client.rb +4 -1
  6. data/lib/akephalos/console.rb +1 -1
  7. data/lib/akephalos/htmlunit.rb +12 -16
  8. data/lib/akephalos/remote_client.rb +40 -10
  9. data/lib/akephalos/server.rb +5 -4
  10. data/lib/akephalos/version.rb +3 -0
  11. data/src/{commons-codec-1.4.jar → htmlunit/commons-codec-1.4.jar} +0 -0
  12. data/src/{commons-collections-3.2.1.jar → htmlunit/commons-collections-3.2.1.jar} +0 -0
  13. data/src/{commons-httpclient-3.1.jar → htmlunit/commons-httpclient-3.1.jar} +0 -0
  14. data/src/{commons-io-1.4.jar → htmlunit/commons-io-1.4.jar} +0 -0
  15. data/src/{commons-lang-2.4.jar → htmlunit/commons-lang-2.4.jar} +0 -0
  16. data/src/{commons-logging-1.1.1.jar → htmlunit/commons-logging-1.1.1.jar} +0 -0
  17. data/src/{cssparser-0.9.5.jar → htmlunit/cssparser-0.9.5.jar} +0 -0
  18. data/src/{htmlunit-2.7.jar → htmlunit/htmlunit-2.7.jar} +0 -0
  19. data/src/{htmlunit-core-js-2.7.jar → htmlunit/htmlunit-core-js-2.7.jar} +0 -0
  20. data/src/{nekohtml-1.9.14.jar → htmlunit/nekohtml-1.9.14.jar} +0 -0
  21. data/src/{sac-1.3.jar → htmlunit/sac-1.3.jar} +0 -0
  22. data/src/{serializer-2.7.1.jar → htmlunit/serializer-2.7.1.jar} +0 -0
  23. data/src/{xalan-2.7.1.jar → htmlunit/xalan-2.7.1.jar} +0 -0
  24. data/src/{xercesImpl-2.9.1.jar → htmlunit/xercesImpl-2.9.1.jar} +0 -0
  25. data/src/{xml-apis-1.3.04.jar → htmlunit/xml-apis-1.3.04.jar} +0 -0
  26. metadata +59 -60
  27. data/.gitignore +0 -4
  28. data/README +0 -23
  29. data/Rakefile +0 -37
  30. data/TODO.txt +0 -33
  31. data/VERSION +0 -1
  32. data/akephalos.gemspec +0 -97
  33. data/spec/driver/akephalos_driver_spec.rb +0 -12
  34. data/spec/filter_spec.rb +0 -24
  35. data/spec/session/akephalos_session_spec.rb +0 -26
  36. data/spec/slow_page_loads_spec.rb +0 -66
  37. data/spec/spec.opts +0 -2
  38. data/spec/spec_helper.rb +0 -12
  39. data/src/jruby-complete-1.5.0.jar +0 -0
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Bernerd Schaefer
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,55 @@
1
+ # Akephalos
2
+ Akephalos is a full-stack headless browser for integration testing with
3
+ Capybara. It is built on top of [HtmlUnit](http://htmlunit.sourceforge.com),
4
+ a GUI-less browser for the Java platform, but can be run on both JRuby and
5
+ MRI with no need for JRuby to be installed on the system.
6
+
7
+ ## Installation
8
+
9
+ gem install akephalos
10
+
11
+ ## Setup
12
+
13
+ Configuring akephalos is as simple as requiring it and setting Capybara's
14
+ javascript driver:
15
+
16
+ require 'akephalos'
17
+ Capybara.javascript_driver = :akephalos
18
+
19
+ ## Basic Usage
20
+
21
+ Akephalos provides a driver for Capybara, so using Akephalos is no
22
+ different than using Selenium or Rack::Test. For a full usage guide, check
23
+ out Capybara's DSL [documentation](http://github.com/jnicklas/capybara). It
24
+ makes no assumptions about the testing framework being used, and works with
25
+ RSpec, Cucumber, and Test::Unit.
26
+
27
+ Here's some sample RSpec code:
28
+
29
+ describe "Home Page" do
30
+ before { visit "/" }
31
+ context "searching" do
32
+ before do
33
+ fill_in "Search", :with => "akephalos"
34
+ click_button "Go"
35
+ end
36
+ it "returns results" { page.should have_css("#results") }
37
+ it "includes the search term" { page.should have_content("akephalos") }
38
+ end
39
+ end
40
+
41
+ ## More
42
+
43
+ * [bin/akephalos](http://bernerdschaefer.github.com/akephalos/akephalos-bin.html)
44
+ allows you to start an interactive shell or DRb server, as well as perform
45
+ other maintenance features.
46
+
47
+ * [Filters](http://bernerdschaefer.github.com/akephalos/filters.html) allows
48
+ you to declare mock responses for external resources and services requested
49
+ by the browser.
50
+
51
+ ## Resources
52
+
53
+ * [Source code](http://github.com/bernerdschaefer/akephalos) and
54
+ [issues](http://github.com/bernerdschaefer/akephalos/issues) are hosted on
55
+ github.
@@ -7,9 +7,10 @@ require "optparse"
7
7
  options = { :interactive => false }
8
8
 
9
9
  parser = OptionParser.new do |opts|
10
- opts.banner = "Usage: akephalos [--interactive] | [--server] <socket_file>"
10
+ opts.banner = "Usage: akephalos [--interactive, --use-htmlunit-snapshot] | [--server] <socket_file>"
11
11
  opts.on("-s", "--server", "Run in server mode (default)")
12
12
  opts.on("-i", "--interactive", "Run in interactive mode") { options[:interactive] = true }
13
+ opts.on("--use-htmlunit-snapshot", "Use the snapshot of htmlunit") { options[:use_htmlunit_snapshot] = true }
13
14
 
14
15
  opts.on_tail("-h", "--help", "Show this message") { puts opts; exit }
15
16
  end
@@ -17,11 +18,33 @@ parser.parse!
17
18
 
18
19
  root = Pathname(__FILE__).expand_path.dirname.parent
19
20
  lib = root + 'lib'
20
- jruby = root + "src/jruby-complete-1.5.0.jar"
21
- jruby_cmd = %Q(java -Xmx2048M -jar #{jruby} -I#{lib})
21
+ src = root + 'src'
22
22
 
23
- if options[:interactive]
24
- $:.unshift(lib)
23
+ case
24
+ when options[:use_htmlunit_snapshot]
25
+ require "fileutils"
26
+
27
+ FileUtils.mkdir_p("vendor/htmlunit")
28
+ Dir["vendor/htmlunit/*.jar"].each { |jar| File.unlink(jar) }
29
+
30
+ Dir.chdir("vendor") do
31
+ $stdout.print "Downloading latest snapshot... "
32
+ $stdout.flush
33
+ %x[curl -O http://build.canoo.com/htmlunit/artifacts/htmlunit-2.8-SNAPSHOT-with-dependencies.zip &> /dev/null]
34
+ puts "done"
35
+
36
+ $stdout.print "Extracting dependencies... "
37
+ $stdout.flush
38
+ %x[unzip -j -d htmlunit htmlunit-2.8-SNAPSHOT-with-dependencies.zip htmlunit-2.8-SNAPSHOT/lib htmlunit-2.8-SNAPSHOT/lib/* &> /dev/null]
39
+ puts "done"
40
+
41
+ File.unlink "htmlunit-2.8-SNAPSHOT-with-dependencies.zip"
42
+ end
43
+
44
+ $stdout.puts "="*40
45
+ $stdout.puts "The latest HtmlUnit snapshot has been extracted to vendor/htmlunit!"
46
+ when options[:interactive]
47
+ $:.unshift('vendor', lib, src)
25
48
  require 'rubygems'
26
49
  require 'akephalos'
27
50
  require 'akephalos/console'
@@ -32,8 +55,33 @@ else
32
55
  exit
33
56
  end
34
57
 
35
- server = 'akephalos/server'
58
+ if RUBY_PLATFORM == "java"
59
+ $:.unshift("vendor", lib, src)
60
+ require 'akephalos/server'
61
+ Akephalos::Server.start!(socket_file)
62
+ else
63
+ require 'rubygems'
64
+ require 'jruby-jars'
65
+
66
+ jruby = JRubyJars.core_jar_path
67
+ jruby_stdlib = JRubyJars.stdlib_jar_path
36
68
 
37
- command = %Q(#{jruby_cmd} -r#{server} -e 'Akephalos::Server.start!(%s)')
38
- exec command % socket_file.inspect
69
+ java_args = [
70
+ "-Xmx128M",
71
+ "-cp", [JRubyJars.core_jar_path, JRubyJars.stdlib_jar_path].join(":"),
72
+ "org.jruby.Main"
73
+ ]
74
+ ruby_args = [
75
+ "-I", "vendor:#{lib}:#{src}",
76
+ "-r", "akephalos/server",
77
+ "-e", "Akephalos::Server.start!(#{socket_file.inspect})"
78
+ ]
79
+
80
+ # Bundler sets ENV["RUBYOPT"] to automatically load bundler/setup.rb, but
81
+ # since the akephalos server doesn't have any gem dependencies and is
82
+ # always executed with the same context, we clear RUBYOPT before running
83
+ # exec.
84
+ ENV["RUBYOPT"] = ""
85
+ exec("java", *(java_args + ruby_args))
86
+ end
39
87
  end
@@ -1,3 +1,8 @@
1
+ # **Akephalos** is a cross-platform Ruby interface for *HtmlUnit*, a headless
2
+ # browser for the Java platform.
3
+ #
4
+ # The only requirement is that a Java runtime is available.
5
+ #
1
6
  require 'java' if RUBY_PLATFORM == 'java'
2
7
  require 'capybara'
3
8
 
@@ -40,6 +40,7 @@ else
40
40
 
41
41
  def visit(url)
42
42
  client.getPage(url)
43
+ page
43
44
  end
44
45
 
45
46
  def page=(_page)
@@ -51,7 +52,9 @@ else
51
52
 
52
53
  private
53
54
  def client
54
- @client ||= @_client.get
55
+ @client ||= @_client.get.tap do |client|
56
+ client.getCurrentWindow.getHistory.ignoreNewPages_.set(true)
57
+ end
55
58
  end
56
59
  end
57
60
  end
@@ -1,5 +1,5 @@
1
1
  def session
2
- Capybara.app_host = "http://localhost:8070"
2
+ Capybara.app_host = "http://localhost:3000"
3
3
  @session ||= Capybara::Session.new(:Akephalos)
4
4
  end
5
5
  alias page session
@@ -1,22 +1,13 @@
1
1
  require "pathname"
2
2
  require "java"
3
3
 
4
- $:.unshift((Pathname(__FILE__).dirname + "../../src").expand_path)
5
- require "commons-codec-1.4.jar"
6
- require "commons-collections-3.2.1.jar"
7
- require "commons-httpclient-3.1.jar"
8
- require "commons-io-1.4.jar"
9
- require "commons-lang-2.4.jar"
10
- require "commons-logging-1.1.1.jar"
11
- require "cssparser-0.9.5.jar"
12
- require "htmlunit-2.7.jar"
13
- require "htmlunit-core-js-2.7.jar"
14
- require "nekohtml-1.9.14.jar"
15
- require "sac-1.3.jar"
16
- require "serializer-2.7.1.jar"
17
- require "xalan-2.7.1.jar"
18
- require "xercesImpl-2.9.1.jar"
19
- require "xml-apis-1.3.04.jar"
4
+ dependency_directory = $:.detect { |path| Dir[File.join(path, 'htmlunit/htmlunit-*.jar')].any? }
5
+
6
+ raise "Could not find htmlunit/htmlunit-VERSION.jar in load path:\n [ #{$:.join(",\n ")}\n ]" unless dependency_directory
7
+
8
+ Dir[File.join(dependency_directory, "htmlunit/*.jar")].each do |jar|
9
+ require jar
10
+ end
20
11
 
21
12
  java.lang.System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog")
22
13
  java.lang.System.setProperty("org.apache.commons.logging.simplelog.defaultlog", "fatal")
@@ -26,6 +17,11 @@ java_import "com.gargoylesoftware.htmlunit.WebClient"
26
17
  java_import "com.gargoylesoftware.htmlunit.util.WebConnectionWrapper"
27
18
  java_import 'com.gargoylesoftware.htmlunit.HttpMethod'
28
19
 
20
+
21
+ # Disable history tracking
22
+ com.gargoylesoftware.htmlunit.History.field_reader :ignoreNewPages_
23
+
24
+ # Run in Firefox compatibility mode
29
25
  com.gargoylesoftware.htmlunit.BrowserVersion.setDefault(
30
26
  com.gargoylesoftware.htmlunit.BrowserVersion::FIREFOX_3
31
27
  )
@@ -1,27 +1,57 @@
1
1
  require 'drb/drb'
2
2
 
3
- class NativeException < StandardError; end
3
+ # We need to define our own NativeException class for the cases when a native
4
+ # exception is raised by the JRuby DRb server.
5
+ class NativeException < StandardError; end # :nodoc:
4
6
 
5
7
  module Akephalos
8
+ ##
9
+ # The +RemoteClient+ class provides an interface to an +Akephalos::Client+
10
+ # isntance on a remote DRb server.
11
+ #
12
+ # == Usage
13
+ # client = Akephalos::RemoteClient.new
14
+ # client.visit "http://www.oinopa.com"
15
+ # client.page.source # => "<!DOCTYPE html PUBLIC..."
6
16
  class RemoteClient
7
17
  @socket_file = "/tmp/akephalos.#{Process.pid}.sock"
8
18
 
19
+ ##
20
+ # Starts a remote akephalos server and returns the remote Akephalos::Client
21
+ # instance.
22
+ def self.new
23
+ start!
24
+ DRb.start_service
25
+ client = DRbObject.new_with_uri("drbunix://#{@socket_file}")
26
+ # We want to share our local configuration with the remote server
27
+ # process, so we share an undumped version of our configuration. This
28
+ # lets us continue to make changes locally and have them reflected in the
29
+ # remote process.
30
+ client.configuration = Akephalos.configuration.extend(DRbUndumped)
31
+ client
32
+ end
33
+
34
+ ##
35
+ # Start a remote server process, returning when it is available for use.
9
36
  def self.start!
10
37
  remote_client = fork do
11
38
  exec("#{Akephalos::BIN_DIR + 'akephalos'} #{@socket_file}")
12
39
  end
13
40
 
14
- sleep 1 until File.exists?(@socket_file)
41
+ # Set up a monitor thread to detect if the forked server exits
42
+ # prematurely.
43
+ server_monitor = Thread.new { Thread.current[:exited] = Process.wait }
15
44
 
16
- at_exit { Process.kill(:INT, remote_client); File.unlink(@socket_file) }
17
- end
45
+ # Wait for the server to be accessible on the socket we specified.
46
+ until File.exists?(@socket_file)
47
+ exit!(1) if server_monitor[:exited]
48
+ sleep 1
49
+ end
50
+ server_monitor.kill
18
51
 
19
- def self.new
20
- start!
21
- DRb.start_service
22
- client = DRbObject.new_with_uri("drbunix://#{@socket_file}")
23
- client.configuration = Akephalos.configuration.extend(DRbUndumped)
24
- client
52
+ # Ensure that the remote server shuts down gracefully when we are
53
+ # finished.
54
+ at_exit { Process.kill(:INT, remote_client); File.unlink(@socket_file) }
25
55
  end
26
56
  end
27
57
  end
@@ -1,17 +1,18 @@
1
+ # This file runs a JRuby DRb server, and is run by `akephalos --server`.
1
2
  require "pathname"
2
3
  require "drb/drb"
3
4
  require "akephalos/client"
4
5
 
6
+ # In ruby-1.8.7 and later, the message for a NameError exception is lazily
7
+ # evaluated. There are, however, different implementations of this between ruby
8
+ # and jrby, so we realize these messages when sending over DRb.
5
9
  class NameError::Message
6
10
  def _dump
7
11
  to_s
8
12
  end
9
13
  end
10
14
 
11
- [
12
- Akephalos::Page,
13
- Akephalos::Node
14
- ].each { |klass| klass.send(:include, DRbUndumped) }
15
+ [Akephalos::Page, Akephalos::Node].each { |klass| klass.send(:include, DRbUndumped) }
15
16
 
16
17
  module Akephalos
17
18
  class Server
@@ -0,0 +1,3 @@
1
+ module Akephalos #:nodoc
2
+ VERSION = "0.1.0"
3
+ end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
+ - 1
7
8
  - 0
8
- - 5
9
- version: 0.0.5
9
+ version: 0.1.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Bernerd Schaefer
@@ -14,8 +14,8 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-06-24 00:00:00 -05:00
18
- default_executable: akephalos
17
+ date: 2010-07-26 00:00:00 -05:00
18
+ default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: capybara
@@ -32,7 +32,7 @@ dependencies:
32
32
  type: :runtime
33
33
  version_requirements: *id001
34
34
  - !ruby/object:Gem::Dependency
35
- name: sinatra
35
+ name: jruby-jars
36
36
  prerelease: false
37
37
  requirement: &id002 !ruby/object:Gem::Requirement
38
38
  requirements:
@@ -41,83 +41,84 @@ dependencies:
41
41
  segments:
42
42
  - 0
43
43
  version: "0"
44
- type: :development
44
+ type: :runtime
45
45
  version_requirements: *id002
46
46
  - !ruby/object:Gem::Dependency
47
- name: rspec
47
+ name: sinatra
48
48
  prerelease: false
49
49
  requirement: &id003 !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - "="
51
+ - - ">="
52
52
  - !ruby/object:Gem::Version
53
53
  segments:
54
- - 1
55
- - 3
56
54
  - 0
57
- version: 1.3.0
55
+ version: "0"
58
56
  type: :development
59
57
  version_requirements: *id003
60
- description: ""
58
+ - !ruby/object:Gem::Dependency
59
+ name: rspec
60
+ prerelease: false
61
+ requirement: &id004 !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - "="
64
+ - !ruby/object:Gem::Version
65
+ segments:
66
+ - 1
67
+ - 30
68
+ version: "1.30"
69
+ type: :development
70
+ version_requirements: *id004
71
+ description: Headless Browser for Integration Testing with Capybara
61
72
  email: bj.schaefer@gmail.com
62
73
  executables:
63
74
  - akephalos
64
75
  extensions: []
65
76
 
66
- extra_rdoc_files:
67
- - README
77
+ extra_rdoc_files: []
78
+
68
79
  files:
69
- - .gitignore
70
- - README
71
- - Rakefile
72
- - TODO.txt
73
- - VERSION
74
- - akephalos.gemspec
75
- - bin/akephalos
76
- - lib/akephalos.rb
77
80
  - lib/akephalos/capybara.rb
78
- - lib/akephalos/client.rb
79
81
  - lib/akephalos/client/filter.rb
80
82
  - lib/akephalos/client/listener.rb
83
+ - lib/akephalos/client.rb
81
84
  - lib/akephalos/configuration.rb
82
85
  - lib/akephalos/console.rb
83
86
  - lib/akephalos/cucumber.rb
84
- - lib/akephalos/htmlunit.rb
85
87
  - lib/akephalos/htmlunit/ext/http_method.rb
88
+ - lib/akephalos/htmlunit.rb
86
89
  - lib/akephalos/node.rb
87
90
  - lib/akephalos/page.rb
88
91
  - lib/akephalos/remote_client.rb
89
92
  - lib/akephalos/server.rb
90
- - spec/driver/akephalos_driver_spec.rb
91
- - spec/filter_spec.rb
92
- - spec/session/akephalos_session_spec.rb
93
- - spec/slow_page_loads_spec.rb
94
- - spec/spec.opts
95
- - spec/spec_helper.rb
96
- - src/commons-codec-1.4.jar
97
- - src/commons-collections-3.2.1.jar
98
- - src/commons-httpclient-3.1.jar
99
- - src/commons-io-1.4.jar
100
- - src/commons-lang-2.4.jar
101
- - src/commons-logging-1.1.1.jar
102
- - src/cssparser-0.9.5.jar
103
- - src/htmlunit-2.7.jar
104
- - src/htmlunit-core-js-2.7.jar
105
- - src/jruby-complete-1.5.0.jar
106
- - src/nekohtml-1.9.14.jar
107
- - src/sac-1.3.jar
108
- - src/serializer-2.7.1.jar
109
- - src/xalan-2.7.1.jar
110
- - src/xercesImpl-2.9.1.jar
111
- - src/xml-apis-1.3.04.jar
93
+ - lib/akephalos/version.rb
94
+ - lib/akephalos.rb
95
+ - src/htmlunit/commons-codec-1.4.jar
96
+ - src/htmlunit/commons-collections-3.2.1.jar
97
+ - src/htmlunit/commons-httpclient-3.1.jar
98
+ - src/htmlunit/commons-io-1.4.jar
99
+ - src/htmlunit/commons-lang-2.4.jar
100
+ - src/htmlunit/commons-logging-1.1.1.jar
101
+ - src/htmlunit/cssparser-0.9.5.jar
102
+ - src/htmlunit/htmlunit-2.7.jar
103
+ - src/htmlunit/htmlunit-core-js-2.7.jar
104
+ - src/htmlunit/nekohtml-1.9.14.jar
105
+ - src/htmlunit/sac-1.3.jar
106
+ - src/htmlunit/serializer-2.7.1.jar
107
+ - src/htmlunit/xalan-2.7.1.jar
108
+ - src/htmlunit/xercesImpl-2.9.1.jar
109
+ - src/htmlunit/xml-apis-1.3.04.jar
110
+ - README.md
111
+ - MIT_LICENSE
112
112
  has_rdoc: true
113
- homepage: http://github.com/bernerdschaefer/akephalos
113
+ homepage: http://bernerdschaefer.github.com/akephalos
114
114
  licenses: []
115
115
 
116
116
  post_install_message:
117
- rdoc_options:
118
- - --charset=UTF-8
117
+ rdoc_options: []
118
+
119
119
  require_paths:
120
- - lib
120
+ - - lib
121
+ - src
121
122
  required_ruby_version: !ruby/object:Gem::Requirement
122
123
  requirements:
123
124
  - - ">="
@@ -130,18 +131,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
131
  - - ">="
131
132
  - !ruby/object:Gem::Version
132
133
  segments:
133
- - 0
134
- version: "0"
134
+ - 1
135
+ - 3
136
+ - 6
137
+ version: 1.3.6
135
138
  requirements: []
136
139
 
137
- rubyforge_project:
140
+ rubyforge_project: akephalos
138
141
  rubygems_version: 1.3.6
139
142
  signing_key:
140
143
  specification_version: 3
141
- summary: ""
142
- test_files:
143
- - spec/driver/akephalos_driver_spec.rb
144
- - spec/filter_spec.rb
145
- - spec/session/akephalos_session_spec.rb
146
- - spec/slow_page_loads_spec.rb
147
- - spec/spec_helper.rb
144
+ summary: Headless Browser for Integration Testing with Capybara
145
+ test_files: []
146
+
data/.gitignore DELETED
@@ -1,4 +0,0 @@
1
- .rvmrc
2
- burn
3
- pkg
4
- tags
data/README DELETED
@@ -1,23 +0,0 @@
1
- Akephalos is an interface for HTMLUnit, exposing it's headless browsing power
2
- to Capybara. The only assumption made is that you are using Capybara and have
3
- a java runtime available.
4
-
5
- When running tests with ruby (1.8.7, 1.9.1), akephalos will expose its client
6
- over DRb from a java server. When running with jruby the client will be
7
- embedded in process.
8
-
9
- Setup
10
- =====
11
-
12
- Using akephalos is as simple as requiring it and setting Capybara's javascript
13
- driver:
14
-
15
- require 'akephalos'
16
- Capybara.default_javascript_driver = :akephalos
17
-
18
- Running for Cucumber
19
- ====================
20
-
21
- When akephalos is required from a cucumber environment, it will only run for
22
- features tagged with @akephalos. Set Capybara's default_javascript_driver to
23
- also use akephalos for features tagged as @javascript.
data/Rakefile DELETED
@@ -1,37 +0,0 @@
1
- require 'rubygems'
2
- require 'rake'
3
-
4
- begin
5
- require 'jeweler'
6
- Jeweler::Tasks.new do |gem|
7
- gem.name = "akephalos"
8
- gem.summary = ""
9
- gem.description = ""
10
- gem.email = "bj.schaefer@gmail.com"
11
- gem.homepage = "http://github.com/bernerdschaefer/akephalos"
12
- gem.authors = ["Bernerd Schaefer"]
13
-
14
- gem.add_dependency "capybara", '0.3.8'
15
-
16
- gem.add_development_dependency "sinatra"
17
- gem.add_development_dependency "rspec", '1.3.0'
18
- end
19
- rescue LoadError
20
- puts "Jeweler not available. Install it with: gem install jeweler"
21
- end
22
-
23
- require 'spec/rake/spectask'
24
- Spec::Rake::SpecTask.new(:spec) do |spec|
25
- spec.libs << 'lib' << 'spec'
26
- spec.spec_files = FileList['spec/**/*_spec.rb']
27
- end
28
-
29
- Spec::Rake::SpecTask.new(:rcov) do |spec|
30
- spec.libs << 'lib' << 'spec'
31
- spec.pattern = 'spec/**/*_spec.rb'
32
- spec.rcov = true
33
- end
34
-
35
- task :spec => :check_dependencies
36
-
37
- task :default => :spec
data/TODO.txt DELETED
@@ -1,33 +0,0 @@
1
- 0.0.5
2
- =======================================================================================
3
- * Upgrade to htmlunit-2.7
4
- * Fix DRb recycled object errors
5
- * Define NativeException on ruby side so that uncaught exceptions are displayed with
6
- a proper backtrace.
7
- * Add Akephalos.filter() for enabling FakeWeb style request/response mocking in the
8
- HtmlUnit browser.
9
-
10
- 0.0.4
11
- =======================================================================================
12
- - Update to jruby 1.5
13
- - bin/akephalos for interactive mode
14
- - use internally managed java threading instead of capybara's own wait methods
15
-
16
- 0.0.3
17
- =======================================================================================
18
-
19
- - Update for compatibility with capybara 0.3.8
20
-
21
- 0.0.2 - 10 May 2010
22
- =======================================================================================
23
-
24
- - Ensure users cannot accidently call non-existant methods on DRb objects
25
- - Refactor akephalos classes to expose HTMLUnit behavior, instead of shipping
26
- objects directly to remote process.
27
-
28
-
29
- 0.0.1 - 03 May 2010
30
- =======================================================================================
31
- - DRb server starts automatically when needed
32
- - DRb objects are undumped, and references are kept on the server
33
- - All capybara provided specs pass.
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.0.5
@@ -1,97 +0,0 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
- # -*- encoding: utf-8 -*-
5
-
6
- Gem::Specification.new do |s|
7
- s.name = %q{akephalos}
8
- s.version = "0.0.5"
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Bernerd Schaefer"]
12
- s.date = %q{2010-06-24}
13
- s.default_executable = %q{akephalos}
14
- s.description = %q{}
15
- s.email = %q{bj.schaefer@gmail.com}
16
- s.executables = ["akephalos"]
17
- s.extra_rdoc_files = [
18
- "README"
19
- ]
20
- s.files = [
21
- ".gitignore",
22
- "README",
23
- "Rakefile",
24
- "TODO.txt",
25
- "VERSION",
26
- "akephalos.gemspec",
27
- "bin/akephalos",
28
- "lib/akephalos.rb",
29
- "lib/akephalos/capybara.rb",
30
- "lib/akephalos/client.rb",
31
- "lib/akephalos/client/filter.rb",
32
- "lib/akephalos/client/listener.rb",
33
- "lib/akephalos/configuration.rb",
34
- "lib/akephalos/console.rb",
35
- "lib/akephalos/cucumber.rb",
36
- "lib/akephalos/htmlunit.rb",
37
- "lib/akephalos/htmlunit/ext/http_method.rb",
38
- "lib/akephalos/node.rb",
39
- "lib/akephalos/page.rb",
40
- "lib/akephalos/remote_client.rb",
41
- "lib/akephalos/server.rb",
42
- "spec/driver/akephalos_driver_spec.rb",
43
- "spec/filter_spec.rb",
44
- "spec/session/akephalos_session_spec.rb",
45
- "spec/slow_page_loads_spec.rb",
46
- "spec/spec.opts",
47
- "spec/spec_helper.rb",
48
- "src/commons-codec-1.4.jar",
49
- "src/commons-collections-3.2.1.jar",
50
- "src/commons-httpclient-3.1.jar",
51
- "src/commons-io-1.4.jar",
52
- "src/commons-lang-2.4.jar",
53
- "src/commons-logging-1.1.1.jar",
54
- "src/cssparser-0.9.5.jar",
55
- "src/htmlunit-2.7.jar",
56
- "src/htmlunit-core-js-2.7.jar",
57
- "src/jruby-complete-1.5.0.jar",
58
- "src/nekohtml-1.9.14.jar",
59
- "src/sac-1.3.jar",
60
- "src/serializer-2.7.1.jar",
61
- "src/xalan-2.7.1.jar",
62
- "src/xercesImpl-2.9.1.jar",
63
- "src/xml-apis-1.3.04.jar"
64
- ]
65
- s.homepage = %q{http://github.com/bernerdschaefer/akephalos}
66
- s.rdoc_options = ["--charset=UTF-8"]
67
- s.require_paths = ["lib"]
68
- s.rubygems_version = %q{1.3.6}
69
- s.summary = %q{}
70
- s.test_files = [
71
- "spec/driver/akephalos_driver_spec.rb",
72
- "spec/filter_spec.rb",
73
- "spec/session/akephalos_session_spec.rb",
74
- "spec/slow_page_loads_spec.rb",
75
- "spec/spec_helper.rb"
76
- ]
77
-
78
- if s.respond_to? :specification_version then
79
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
80
- s.specification_version = 3
81
-
82
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
83
- s.add_runtime_dependency(%q<capybara>, ["= 0.3.8"])
84
- s.add_development_dependency(%q<sinatra>, [">= 0"])
85
- s.add_development_dependency(%q<rspec>, ["= 1.3.0"])
86
- else
87
- s.add_dependency(%q<capybara>, ["= 0.3.8"])
88
- s.add_dependency(%q<sinatra>, [">= 0"])
89
- s.add_dependency(%q<rspec>, ["= 1.3.0"])
90
- end
91
- else
92
- s.add_dependency(%q<capybara>, ["= 0.3.8"])
93
- s.add_dependency(%q<sinatra>, [">= 0"])
94
- s.add_dependency(%q<rspec>, ["= 1.3.0"])
95
- end
96
- end
97
-
@@ -1,12 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Capybara::Driver::Akephalos do
4
-
5
- before do
6
- @driver = Capybara::Driver::Akephalos.new(TestApp)
7
- end
8
-
9
- it_should_behave_like "driver"
10
- it_should_behave_like "driver with javascript support"
11
-
12
- end
@@ -1,24 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "Filters" do
4
- before do
5
- @session = Capybara::Session.new(:akephalos, TestApp)
6
- end
7
-
8
- context "with no filter" do
9
- it "returns the page's source" do
10
- @session.visit "/"
11
- @session.source.should == "Hello world!"
12
- end
13
- end
14
-
15
- context "with a filter" do
16
- after { Akephalos.filters.clear }
17
-
18
- it "returns the filter's source" do
19
- Akephalos.filter :get, %r{.*}, :body => "Howdy!"
20
- @session.visit "/"
21
- @session.source.should == "Howdy!"
22
- end
23
- end
24
- end
@@ -1,26 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Capybara::Session do
4
- context 'with akephalos driver' do
5
-
6
- before do
7
- @session = Capybara::Session.new(:akephalos, TestApp)
8
- end
9
-
10
- describe '#driver' do
11
- it "should be a headless driver" do
12
- @session.driver.should be_an_instance_of(Capybara::Driver::Akephalos)
13
- end
14
- end
15
-
16
- describe '#mode' do
17
- it "should remember the mode" do
18
- @session.mode.should == :akephalos
19
- end
20
- end
21
-
22
- it_should_behave_like "session"
23
- it_should_behave_like "session with javascript support"
24
-
25
- end
26
- end
@@ -1,66 +0,0 @@
1
- require 'spec_helper'
2
-
3
- class SlowApp < TestApp
4
- get '/slow_page' do
5
- sleep 1
6
- "<p>Loaded!</p>"
7
- end
8
-
9
- get '/really_slow_page' do
10
- sleep 5
11
- end
12
-
13
- get '/slow_ajax_load' do
14
- <<-HTML
15
- <head>
16
- <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
17
- <title>with_js</title>
18
- <script src="/jquery.js" type="text/javascript" charset="utf-8"></script>
19
- <script type="text/javascript">
20
- $(function() {
21
- $('#ajax_load').click(function() {
22
- // $('body').html("<p>Loaded!</p>");
23
- $('body').load('/slow_page');
24
- return false;
25
- });
26
- });
27
- </script>
28
- </head>
29
- <body>
30
- <a href="#" id="ajax_load">Click me</a>
31
- </body>
32
- HTML
33
- end
34
- end
35
-
36
- if $0 == __FILE__
37
- if __FILE__ == $0
38
- Rack::Handler::Mongrel.run SlowApp, :Port => 8070
39
- end
40
- end
41
-
42
- describe Capybara::Session do
43
- context 'with akephalos driver' do
44
-
45
- before do
46
- @session = Capybara::Session.new(:akephalos, SlowApp)
47
- end
48
-
49
- context "slow page load" do
50
- it "should wait for the page to finish loading" do
51
- @session.visit('/slow_page')
52
- @session.current_url.should include('/slow_page')
53
- end
54
- end
55
-
56
- context "slow ajax load" do
57
- it "should wait for ajax to load" do
58
- @session.visit('/slow_ajax_load')
59
- @session.click_link('Click me')
60
- @session.should have_xpath("//p[contains(.,'Loaded!')]")
61
- end
62
- end
63
-
64
- end
65
- end
66
-
@@ -1,2 +0,0 @@
1
- --colour
2
- --format nested
@@ -1,12 +0,0 @@
1
- require 'rubygems'
2
- require 'akephalos'
3
-
4
- spec_dir = nil
5
- $:.detect do |dir|
6
- if File.exists? File.join(dir, "capybara.rb")
7
- spec_dir = File.expand_path(File.join(dir,"..","spec"))
8
- $:.unshift( spec_dir )
9
- end
10
- end
11
-
12
- require File.join(spec_dir,"spec_helper")
Binary file