qunit_for_rails 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. data/.gitignore +5 -0
  2. data/Gemfile +7 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.mdown +103 -0
  5. data/Rakefile +31 -0
  6. data/app/controllers/qunit_for_rails/qunit_tests_controller.rb +19 -0
  7. data/app/views/layouts/qunit_for_rails/main.haml +15 -0
  8. data/app/views/qunit_for_rails/qunit_tests/index.html.haml +15 -0
  9. data/config/routes.rb +3 -0
  10. data/lib/qunit_for_rails.rb +15 -0
  11. data/lib/qunit_for_rails/engine.rb +20 -0
  12. data/lib/qunit_for_rails/version.rb +3 -0
  13. data/lib/tasks/qunit_for_rails_tasks.rake +4 -0
  14. data/public/images/bg_diagonalDarkBlue.gif +0 -0
  15. data/public/images/bg_secondaryNav_left.gif +0 -0
  16. data/public/images/bg_secondaryNav_right.gif +0 -0
  17. data/public/images/i_loading_bar.gif +0 -0
  18. data/public/images/l_qunit.png +0 -0
  19. data/public/javascripts/qunit_for_rails/index.js +0 -0
  20. data/public/javascripts/qunit_for_rails/inject.js +191 -0
  21. data/public/javascripts/qunit_for_rails/jquery-1.6.4.min.js +4 -0
  22. data/public/javascripts/qunit_for_rails/qunit.js +1585 -0
  23. data/public/javascripts/qunit_for_rails/qunit.page_load.js +47 -0
  24. data/public/javascripts/qunit_for_rails/qunit.test_loader.js +98 -0
  25. data/public/javascripts/qunit_for_rails/qunit.test_page.js +55 -0
  26. data/public/javascripts/qunit_for_rails/qunit_for_rails.js +159 -0
  27. data/public/javascripts/tests/test.js +13 -0
  28. data/public/stylesheets/qunit.css +228 -0
  29. data/public/stylesheets/qunit_for_rails.css +255 -0
  30. data/qunit_for_rails.gemspec +29 -0
  31. data/test/dummy/Rakefile +7 -0
  32. data/test/dummy/app/controllers/application_controller.rb +3 -0
  33. data/test/dummy/app/helpers/application_helper.rb +2 -0
  34. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  35. data/test/dummy/config.ru +4 -0
  36. data/test/dummy/config/application.rb +43 -0
  37. data/test/dummy/config/boot.rb +10 -0
  38. data/test/dummy/config/database.yml +22 -0
  39. data/test/dummy/config/environment.rb +5 -0
  40. data/test/dummy/config/environments/development.rb +26 -0
  41. data/test/dummy/config/environments/production.rb +49 -0
  42. data/test/dummy/config/environments/test.rb +35 -0
  43. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  44. data/test/dummy/config/initializers/inflections.rb +10 -0
  45. data/test/dummy/config/initializers/mime_types.rb +5 -0
  46. data/test/dummy/config/initializers/secret_token.rb +7 -0
  47. data/test/dummy/config/initializers/session_store.rb +8 -0
  48. data/test/dummy/config/locales/en.yml +5 -0
  49. data/test/dummy/config/routes.rb +58 -0
  50. data/test/dummy/db/development.sqlite3 +0 -0
  51. data/test/dummy/log/development.log +4297 -0
  52. data/test/dummy/log/production.log +0 -0
  53. data/test/dummy/log/server.log +0 -0
  54. data/test/dummy/log/test.log +0 -0
  55. data/test/dummy/public/404.html +26 -0
  56. data/test/dummy/public/422.html +26 -0
  57. data/test/dummy/public/500.html +26 -0
  58. data/test/dummy/public/favicon.ico +0 -0
  59. data/test/dummy/public/javascripts/application.js +2 -0
  60. data/test/dummy/public/javascripts/controls.js +965 -0
  61. data/test/dummy/public/javascripts/dragdrop.js +974 -0
  62. data/test/dummy/public/javascripts/effects.js +1123 -0
  63. data/test/dummy/public/javascripts/prototype.js +6001 -0
  64. data/test/dummy/public/javascripts/rails.js +191 -0
  65. data/test/dummy/public/javascripts/test/example2_test.js +23 -0
  66. data/test/dummy/public/javascripts/test/example_test.js +23 -0
  67. data/test/dummy/public/stylesheets/.gitkeep +0 -0
  68. data/test/dummy/script/rails +6 -0
  69. data/test/integration/navigation_test.rb +7 -0
  70. data/test/qunit_for_rails_test.rb +33 -0
  71. data/test/support/integration_case.rb +5 -0
  72. data/test/test_helper.rb +3 -0
  73. metadata +224 -0
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ *.swp
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source "http://rubygems.org"
2
+
3
+ # To use debugger (ruby-debug for Ruby 1.8.7+, ruby-debug19 for Ruby 1.9.2+)
4
+ # gem 'ruby-debug'
5
+ # gem 'ruby-debug19'
6
+
7
+ gemspec
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 [name of plugin creator]
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,103 @@
1
+ QunitForRails
2
+ =============
3
+
4
+ QUnit for Rails provides an easy way to run JavaScript integration testing
5
+ against production rendered HTML using the QUnit testing framework.
6
+ QUnit for Rails simply adds an overlay menu at the top of an app's pages,
7
+ allowing developers to run JavaScript tests and view the results right in the
8
+ browser.
9
+
10
+ To read more about QUnit:
11
+ [http://docs.jquery.com/QUnit][]
12
+
13
+ The source for this plugin is located on Github:
14
+ [http://github.com/mkrisher/qunit_for_rails/][]
15
+
16
+ The plugin can be installed using:
17
+ `script/plugin install git@github.com:mkrisher/qunit_for_rails.git`
18
+
19
+ Details
20
+ =======
21
+
22
+ QUnit for Rails provides an easy way for developers to write JavaScript tests
23
+ and run those tests against HTML output in the browser. QUnit for Rails does
24
+ not run via the command line, it is run in the browser against the real HTML
25
+ output.
26
+
27
+ QUnit for Rails provides some necessary JavaScript and CSS files and places
28
+ them in your app's public directory. These files simply create the overlay
29
+ menu that gets added to your pages. The plugin also provides the latest QUnit
30
+ file. In case you ever want to change the version of QUnit, you would simply
31
+ replace the file in your public/javascript directory.
32
+
33
+ The overlay provides a number of things. First, all your JavaScript tests are
34
+ stored in /public/javascript/tests. Any JavaScript test added to the directory
35
+ will appear in a dropdown in the overlay. Simply selecting a test from the
36
+ dropdown runs it against the current page. Or there is an option to run all
37
+ tests against a page.
38
+
39
+ In much the same way Rails unit testing and functional testing work, you could
40
+ easily create a JavaScript test for each controller and action of your app.
41
+
42
+ During the plugin install process, the tests directory is created and an
43
+ example test file is included. Follow the test file's formatting to create
44
+ additional tests.
45
+
46
+ The plugin also provides some handy keypress functionality. For example, hiding
47
+ the overlay you simply press 'shift+h'. All keypress options are
48
+ shown by press 'shift+?'.
49
+
50
+ The QUnit overlay looks like this in the browser:
51
+
52
+ [![](http://farm3.static.flickr.com/2603/4014493975_cfc0c2af3d_o.png)](http://farm3.static.flickr.com/2603/4014493975_cfc0c2af3d_o.png)
53
+
54
+ Running a test pushes the page down and reveals the test results:
55
+
56
+ [![](http://farm3.static.flickr.com/2464/4015257542_d6c759682f_o.png)](http://farm3.static.flickr.com/2464/4015257542_d6c759682f_o.png)
57
+
58
+ Requirements
59
+ =======
60
+
61
+ The QUnit for Rails plugin requires jQuery at this time. You can include
62
+ jQuery easily by adding to the head of your document layout:
63
+
64
+ <script type="text/javascript" src="http://www.google.com/jsapi"></script>
65
+ <script type="text/javascript">
66
+ google.load("jquery", "1.3.2");
67
+ </script>
68
+
69
+
70
+ Usage
71
+ =====
72
+
73
+ To include the QUnit testing overlay on your page simply add
74
+ `<%= include_qunit %>` to the head of your document layout.
75
+
76
+ If you would like to include qunit_for_rails but not have it show on the top
77
+ of the page automatically, you can hide it on load using:
78
+ `<%= include_qunit({:autohide => true}) %>`.
79
+
80
+ After adding the `<%= include_qunit %>` to the head of your document layout,
81
+ you simply need to add some test files to the
82
+ `/public/javascript/tests directory`.
83
+
84
+ The tests are written in JSON and follow a pattern such as:
85
+
86
+ var localtests = {
87
+ test_another_example : function()
88
+ {
89
+ module("Module Example Tests");
90
+ test("simple passing example", function()
91
+ {
92
+ var value = "foo";
93
+ equals( "foo", value, "We expect value to be foo" );
94
+ });
95
+ }
96
+ };
97
+ $().extend(tests, localtests);
98
+
99
+
100
+ Copyright (c) 2009 Michael Krisher, released under the MIT license
101
+
102
+ [http://docs.jquery.com/QUnit]: http://docs.jquery.com/QUnit
103
+ [http://github.com/mkrisher/qunit_for_rails/]: http://github.com/mkrisher/qunit_for_rails/
@@ -0,0 +1,31 @@
1
+ # encoding: UTF-8
2
+ require 'rubygems'
3
+
4
+ begin
5
+ require 'bundler/setup'
6
+ require "bundler/gem_tasks"
7
+ rescue LoadError
8
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
9
+ end
10
+
11
+ require 'rake'
12
+ require 'rake/rdoctask'
13
+
14
+ require 'rake/testtask'
15
+
16
+ Rake::TestTask.new(:test) do |t|
17
+ t.libs << 'lib'
18
+ t.libs << 'test'
19
+ t.pattern = 'test/**/*_test.rb'
20
+ t.verbose = false
21
+ end
22
+
23
+ task :default => :test
24
+
25
+ Rake::RDocTask.new(:rdoc) do |rdoc|
26
+ rdoc.rdoc_dir = 'rdoc'
27
+ rdoc.title = 'TestForRails'
28
+ rdoc.options << '--line-numbers' << '--inline-source'
29
+ rdoc.rdoc_files.include('README.rdoc')
30
+ rdoc.rdoc_files.include('lib/**/*.rb')
31
+ end
@@ -0,0 +1,19 @@
1
+ module QunitForRails
2
+ class QunitTestsController < ApplicationController
3
+ skip_before_filter :authorize
4
+ layout "qunit_for_rails/main"
5
+
6
+ def index
7
+ test_files = []
8
+
9
+ Dir.glob(::Rails.root.to_s + "/public/javascripts/test/*").each { |file|
10
+ if file.end_with?('_test.js')
11
+ test_files << file.split('/').last
12
+ end
13
+ }
14
+
15
+ render :index, :locals => { :test_files => test_files, :root_url => ENV['RAILS_RELATIVE_URL_ROOT'] }
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ !!!
2
+ %html
3
+ %head
4
+ %meta(http-equiv="Content-Type" content="text/html; charset=UTF-8")
5
+ = favicon_link_tag 'favicon.png'
6
+
7
+ %title
8
+ = "QUnit Tests Index"
9
+
10
+ = yield :stylesheets
11
+
12
+ = yield :javascripts
13
+
14
+ %body
15
+ = yield :content
@@ -0,0 +1,15 @@
1
+ = content_for(:stylesheets) do
2
+ %link(rel="stylesheet" type="text/css" href="#{root_url}/stylesheets/qunit.css")
3
+ %link(rel="stylesheet" type="text/css" href="#{root_url}/stylesheets/qunit_for_rails.css")
4
+
5
+ = content_for(:javascripts) do
6
+ %script{:type => "text/javascript", :src => "#{root_url}/javascripts/qunit_for_rails/jquery-1.6.4.min.js"}
7
+ %script{:type => "text/javascript", :src => "#{root_url}/javascripts/qunit_for_rails/qunit.js"}
8
+ %script{:type => "text/javascript", :src => "#{root_url}/javascripts/qunit_for_rails/qunit.test_loader.js"}
9
+ %script{:type => "text/javascript", :src => "#{root_url}/javascripts/qunit_for_rails/qunit_for_rails.js"}
10
+
11
+ :javascript
12
+ var QFR = {};
13
+ var test_list = #{test_files.to_json};
14
+
15
+ QFR.root_url = "#{root_url}";
@@ -0,0 +1,3 @@
1
+ Rails.application.routes.draw do
2
+ get "test/qunit/" => "qunit_for_rails/qunit_tests#index", :as => "qunit_tests"
3
+ end
@@ -0,0 +1,15 @@
1
+ require "active_support/core_ext/module/attribute_accessors"
2
+ require "haml"
3
+
4
+
5
+ module QunitForRails
6
+
7
+ mattr_accessor :app_root
8
+
9
+ def self.setup
10
+ yield self
11
+ end
12
+
13
+ end
14
+
15
+ require "qunit_for_rails/engine" if defined?(Rails)
@@ -0,0 +1,20 @@
1
+ require "rails/engine"
2
+ require "qunit_for_rails"
3
+
4
+ module QunitForRails
5
+
6
+ class Engine < Rails::Engine
7
+
8
+ initializer "load_app_instance_data" do |app|
9
+ QunitForRails.setup do |config|
10
+ config.app_root = app.root
11
+ end
12
+ end
13
+
14
+ initializer "static assets" do |app|
15
+ app.middleware.use ::ActionDispatch::Static, "#{root}/public"
16
+ end
17
+
18
+ end
19
+
20
+ end
@@ -0,0 +1,3 @@
1
+ module QunitForRails
2
+ VERSION = "0.0.4"
3
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :qunit_for_rails do
3
+ # # Task goes here
4
+ # end
Binary file
@@ -0,0 +1,191 @@
1
+ (function(){
2
+
3
+ var DEBUG = false;
4
+ // hold each test run as row
5
+ var testresults = [];
6
+
7
+ var doPost = false;
8
+
9
+ try {
10
+ doPost = !!window.top.postMessage;
11
+ } catch(e){}
12
+
13
+ var search = window.location.search,
14
+ url, index;
15
+ if( ( index = search.indexOf( "swarmURL=" ) ) != -1 )
16
+ url = decodeURIComponent( search.slice( index + 9 ) );
17
+
18
+ if ( !DEBUG && (!url || url.indexOf("http") !== 0) ) {
19
+ return;
20
+ }
21
+
22
+ var submitTimeout = 5;
23
+
24
+ var curHeartbeat;
25
+ var beatRate = 20;
26
+
27
+ // Expose the TestSwarm API
28
+ window.TestSwarm = {
29
+ submit: submit,
30
+ heartbeat: function(){
31
+ if ( curHeartbeat ) {
32
+ clearTimeout( curHeartbeat );
33
+ }
34
+
35
+ curHeartbeat = setTimeout(function(){
36
+ submit({ fail: -1, total: -1 });
37
+ }, beatRate * 1000);
38
+ },
39
+ serialize: function(){
40
+ return trimSerialize();
41
+ }
42
+ };
43
+
44
+ // Prevent careless things from executing
45
+ window.print = window.confirm = window.alert = window.open = function(){};
46
+
47
+ window.onerror = function(e){
48
+ document.body.appendChild( document.createTextNode( "ERROR: " + e ));
49
+ submit({ fail: 0, error: 1, total: 1 });
50
+ return false;
51
+ };
52
+
53
+ // QUnit callbacks - shughes
54
+ if ( typeof QUnit !== "undefined" ) {
55
+ QUnit.done = function(results){
56
+ submit({
57
+ fail: results.failed,
58
+ error: 0,
59
+ time: results.runtime,
60
+ total: results.total,
61
+ results: JSON.stringify(testresults)
62
+ });
63
+ };
64
+ QUnit.testDone = function(results){
65
+ testresults.push(results);
66
+ };
67
+
68
+ QUnit.log = window.TestSwarm.heartbeat;
69
+ window.TestSwarm.heartbeat();
70
+
71
+ window.TestSwarm.serialize = function(){
72
+ // Clean up the HTML (remove any un-needed test markup)
73
+ remove("nothiddendiv");
74
+ remove("loadediframe");
75
+ remove("dl");
76
+ remove("main");
77
+
78
+ // Show any collapsed results
79
+ var ol = document.getElementsByTagName("ol");
80
+ for ( var i = 0; i < ol.length; i++ ) {
81
+ ol[i].style.display = "block";
82
+ }
83
+
84
+ return trimSerialize();
85
+ };
86
+ }
87
+
88
+ function trimSerialize(doc) {
89
+ doc = doc || document;
90
+
91
+ var scripts = doc.getElementsByTagName("script");
92
+ while ( scripts.length ) {
93
+ remove( scripts[0] );
94
+ }
95
+
96
+ var root = window.location.href.replace(/(https?:\/\/.*?)\/.*/, "$1");
97
+ var cur = window.location.href.replace(/[^\/]*$/, "");
98
+
99
+ var links = doc.getElementsByTagName("link");
100
+ for ( var i = 0; i < links.length; i++ ) {
101
+ var href = links[i].href;
102
+ if ( href.indexOf("/") === 0 ) {
103
+ href = root + href;
104
+ } else if ( !/^https?:\/\//.test( href ) ) {
105
+ href = cur + href;
106
+ }
107
+ links[i].href = href;
108
+ }
109
+
110
+ return ("<html>" + doc.documentElement.innerHTML + "</html>")
111
+ .replace(/\s+/g, " ");
112
+ }
113
+
114
+ function remove(elem){
115
+ if ( typeof elem === "string" ) {
116
+ elem = document.getElementById( elem );
117
+ }
118
+
119
+ if ( elem ) {
120
+ elem.parentNode.removeChild( elem );
121
+ }
122
+ }
123
+
124
+ function submit(params){
125
+ if ( curHeartbeat ) {
126
+ clearTimeout( curHeartbeat );
127
+ }
128
+
129
+ var paramItems = (url.split("?")[1] || "").split("&");
130
+
131
+ for ( var i = 0; i < paramItems.length; i++ ) {
132
+ if ( paramItems[i] ) {
133
+ var parts = paramItems[i].split("=");
134
+ if ( !params[ parts[0] ] ) {
135
+ params[ parts[0] ] = parts[1];
136
+ }
137
+ }
138
+ }
139
+
140
+ if ( !params.state ) {
141
+ params.state = "saverun";
142
+ }
143
+
144
+ if ( !params.results ) {
145
+ params.results = window.TestSwarm.serialize();
146
+ }
147
+
148
+ if ( doPost ) {
149
+ // Build Query String
150
+ var query = "";
151
+
152
+ for ( var i in params ) {
153
+ query += ( query ? "&" : "" ) + i + "=" +
154
+ encodeURIComponent(params[i]);
155
+ }
156
+
157
+ if ( DEBUG ) {
158
+ alert( query );
159
+ } else {
160
+ window.top.postMessage( query, "*" );
161
+ }
162
+
163
+ } else {
164
+ var form = document.createElement("form");
165
+ form.action = url;
166
+ form.method = "POST";
167
+
168
+ for ( var i in params ) {
169
+ var input = document.createElement("input");
170
+ input.type = "hidden";
171
+ input.name = i;
172
+ input.value = params[i];
173
+ form.appendChild( input );
174
+ }
175
+
176
+ if ( DEBUG ) {
177
+ alert( form.innerHTML );
178
+ } else {
179
+
180
+ // Watch for the result submission timing out
181
+ setTimeout(function(){
182
+ submit( params );
183
+ }, submitTimeout * 1000);
184
+
185
+ document.body.appendChild( form );
186
+ form.submit();
187
+ }
188
+ }
189
+ }
190
+
191
+ })();