diff --git a/tracks/vendor/plugins/arts/README b/tracks/vendor/plugins/arts/README new file mode 100644 index 00000000..a15c6d21 --- /dev/null +++ b/tracks/vendor/plugins/arts/README @@ -0,0 +1,28 @@ +ARTS is Another RJS Test System + +For a complete tutorial, see http://glu.ttono.us/articles/2006/05/29/guide-test-driven-rjs-with-arts. + +Usage: + assert_rjs :alert, 'Hi!' + assert_rjs :assign, 'a', '2' + assert_rjs :call, 'foo', 'bar', 'baz' + assert_rjs :draggable, 'draggable_item' + assert_rjs :drop_receiving, 'receiving_item' + assert_rjs :hide, "post_1", "post_2", "post_3" + assert_rjs :insert_html, :bottom, 'posts' + assert_rjs :redirect_to, :action => 'list' + assert_rjs :remove, "post_1", "post_2", "post_3" + assert_rjs :replace, 'completely_replaced_div' + assert_rjs :replace, 'completely_replaced_div', '
This replaced the div
' + assert_rjs :replace, 'completely_replaced_div', /replaced the div/ + assert_rjs :replace_html, 'replaceable_div', "This goes inside the div" + assert_rjs :show, "post_1", "post_2", "post_3" + assert_rjs :sortable, 'sortable_item' + assert_rjs :toggle, "post_1", "post_2", "post_3" + assert_rjs :visual_effect, :highlight, "posts", :duration => '1.0' + +For the square bracket syntax (page['some_id'].toggle) use :page followed by the id and then subsequent method calls. Assignment requires a '=' at the end of the method name followed by the value. + + assert_rjs :page, 'some_id', :toggle + assert_rjs :page, 'some_id', :style, :color=, 'red' + diff --git a/tracks/vendor/plugins/arts/about.yml b/tracks/vendor/plugins/arts/about.yml new file mode 100644 index 00000000..5b8d9848 --- /dev/null +++ b/tracks/vendor/plugins/arts/about.yml @@ -0,0 +1,7 @@ +author: Kevin Clark +summary: RJS Assertion Plugin +homepage: http://glu.ttono.us +plugin: +version: 0.5 +license: MIT +rails_version: 1.1.2+ \ No newline at end of file diff --git a/tracks/vendor/plugins/arts/init.rb b/tracks/vendor/plugins/arts/init.rb new file mode 100644 index 00000000..f43aa1e2 --- /dev/null +++ b/tracks/vendor/plugins/arts/init.rb @@ -0,0 +1,3 @@ +# Give testing some culture +require 'test/unit/testcase' +Test::Unit::TestCase.send :include, Arts diff --git a/tracks/vendor/plugins/arts/install.rb b/tracks/vendor/plugins/arts/install.rb new file mode 100644 index 00000000..a63be40f --- /dev/null +++ b/tracks/vendor/plugins/arts/install.rb @@ -0,0 +1 @@ +puts IO.read(File.join(File.dirname(__FILE__), 'README')) \ No newline at end of file diff --git a/tracks/vendor/plugins/arts/lib/arts.rb b/tracks/vendor/plugins/arts/lib/arts.rb new file mode 100644 index 00000000..6bc232ef --- /dev/null +++ b/tracks/vendor/plugins/arts/lib/arts.rb @@ -0,0 +1,133 @@ +module Arts + include ActionView::Helpers::PrototypeHelper + include ActionView::Helpers::ScriptaculousHelper + include ActionView::Helpers::JavaScriptHelper + + include ActionView::Helpers::UrlHelper + include ActionView::Helpers::TagHelper + + def assert_rjs(action, *args, &block) + respond_to?("assert_rjs_#{action}") ? + send("assert_rjs_#{action}", *args) : + assert(lined_response.include?(create_generator.send(action, *args, &block)), + generic_error(action, args)) + end + + def assert_no_rjs(action, *args, &block) + assert_raises(Test::Unit::AssertionFailedError) { assert_rjs(action, *args, &block) } + end + + def assert_rjs_insert_html(*args) + position = args.shift + item_id = args.shift + + content = extract_matchable_content(args) + + unless content.blank? + case content + when Regexp + assert_match Regexp.new("new Insertion\.#{position.to_s.camelize}(.*#{item_id}.*,.*#{content.source}.*);"), + @response.body + when String + assert lined_response.include?("new Insertion.#{position.to_s.camelize}(\"#{item_id}\", #{content});"), + "No insert_html call found for \n" + + " position: '#{position}' id: '#{item_id}' \ncontent: \n" + + "#{content}\n" + + "in response:\n#{lined_response}" + else + raise "Invalid content type" + end + else + assert_match Regexp.new("new Insertion\.#{position.to_s.camelize}(.*#{item_id}.*,.*?);"), + @response.body + end + end + + def assert_rjs_replace_html(*args) + div = args.shift + content = extract_matchable_content(args) + + unless content.blank? + case content + when Regexp + assert_match Regexp.new("Element.update(.*#{div}.*,.*#{content.source}.*);"), + @response.body + when String + assert lined_response.include?("Element.update(\"#{div}\", #{content});"), + "No replace_html call found on div: '#{div}' and content: \n#{content}\n" + + "in response:\n#{lined_response}" + else + raise "Invalid content type" + end + else + assert_match Regexp.new("Element.update(.*#{div}.*,.*?);"), @response.body + end + end + + def assert_rjs_replace(*args) + div = args.shift + content = extract_matchable_content(args) + + unless content.blank? + case content + when Regexp + assert_match Regexp.new("Element.replace(.*#{div}.*,.*#{content.source}.*);"), + @response.body + when String + assert lined_response.include?("Element.replace(\"#{div}\", #{content});"), + "No replace call found on div: '#{div}' and content: \n#{content}\n" + + "in response:\n#{lined_response}" + else + raise "Invalid content type" + end + else + assert_match Regexp.new("Element.replace(.*#{div}.*,.*?);"), @response.body + end + end + + # To deal with [] syntax. I hate JavaScriptProxy so.. SO very much + def assert_rjs_page(*args) + content = build_method_chain!(args) + assert_match Regexp.new(Regexp.escape(content)), @response.body, + "Content did not include:\n #{content.to_s}" + end + + protected + + def build_method_chain!(args) + content = create_generator.send(:[], args.shift) # start $('some_id').... + + while !args.empty? + if (method = args.shift.to_s) =~ /(.*)=$/ + content = content.__send__(method, args.shift) + break + else + content = content.__send__(method) + content = content.__send__(:function_chain).first if args.empty? + end + end + + content + end + + def lined_response + @response.body.split("\n") + end + + def create_generator + block = Proc.new { |*args| yield *args if block_given? } + JavaScriptGenerator.new self, &block + end + + def generic_error(action, args) + "#{action} with args [#{args.join(" ")}] does not show up in response:\n#{lined_response}" + end + + def extract_matchable_content(args) + if args.size == 1 and args.first.is_a? Regexp + return args.first + else + return create_generator.send(:arguments_for_call, args) + end + end +end \ No newline at end of file diff --git a/tracks/vendor/plugins/arts/test/arts_test.rb b/tracks/vendor/plugins/arts/test/arts_test.rb new file mode 100644 index 00000000..fad2be37 --- /dev/null +++ b/tracks/vendor/plugins/arts/test/arts_test.rb @@ -0,0 +1,402 @@ +$:.unshift(File.dirname(__FILE__) + '/../lib') + +require File.dirname(__FILE__) + '/../../../../config/environment' +require 'test/unit' +require 'rubygems' +require 'breakpoint' + +require 'action_controller/test_process' + +ActionController::Base.logger = nil +ActionController::Base.ignore_missing_templates = false +ActionController::Routing::Routes.reload rescue nil + +class ArtsController < ActionController::Base + def alert + render :update do |page| + page.alert 'This is an alert' + end + end + + def assign + render :update do |page| + page.assign 'a', '2' + end + end + + def call + render :update do |page| + page.call 'foo', 'bar', 'baz' + end + end + + def draggable + render :update do |page| + page.draggable 'my_image', :revert => true + end + end + + def drop_receiving + render :update do |page| + page.drop_receiving "my_cart", :url => { :controller => "cart", :action => "add" } + end + end + + def hide + render :update do |page| + page.hide 'some_div' + end + end + + def insert_html + render :update do |page| + page.insert_html :bottom, 'content', 'Stuff in the content div' + end + end + + def redirect + render :update do |page| + page.redirect_to :controller => 'sample', :action => 'index' + end + end + + def remove + render :update do |page| + page.remove 'offending_div' + end + end + + def replace + render :update do |page| + page.replace 'person_45', '