Skip to content

Instantly share code, notes, and snippets.

@cpetersen
Created October 16, 2011 03:27
Show Gist options
  • Save cpetersen/1290469 to your computer and use it in GitHub Desktop.
Save cpetersen/1290469 to your computer and use it in GitHub Desktop.
A simple script for generating merb specs based on the router (the specs obviously need to be edited).
@@route_to_name = { }
Merb::Router.named_routes.each { |name, route| @@route_to_name[route] = name }
controllers = { }
Merb::Router.routes.each do |route|
controller = route.params[:controller]
if controller
unless controller =~ /(path\d)/
controller = controller.gsub("\"","")
if route.params[:namespace]
namespace = route.params[:namespace].gsub("\"","")
controller = "#{namespace}_#{controller}"
end
controllers[controller] = [] unless controllers[controller]
controllers[controller] << route
end
end
end && nil
def spec_start(controller)
spec_start =<<EOF
require File.join(File.dirname(__FILE__), '..', 'spec_helper.rb')
describe "#{controller}" do
before(:all) do
# INITIALIZE
end
EOF
end
def spec_end
spec_end =<<EOF
end
EOF
end
def url_string(route)
name = @@route_to_name[route]
if name
params = route.params.reject { |k,v| [:format, :controller, :action].include?(k) }
param_str = params.collect { |k,v| ":#{k} => \"#{v.gsub(/\"/,'')}\"" }.join(", ")
if param_str.blank?
result = "url(:#{name})"
else
result = "url(:#{name}, #{param_str})"
end
else
result = "\"#{route.to_s}\""
end
result
end
def spec_name(method)
case method
when "post"
"should create object"
when "put"
"should update object"
when "delete"
"should delete object"
end
end
def spec(route)
method = route.conditions[:method] || "get"
controller = route.params[:controller]
action = route.params[:action]
if action
action = action.gsub("\"","")
params = route.params.reject { |k,v| [:controller, :action, :format].include?(k) }
if method == "get"
spec =<<EOF
it "#{action} should return 200" do
response = request(#{url_string(route)})
#response.body.should have_selector("input[type='text'][name='email']")
response.status.should be_successful
end
EOF
else
spec =<<EOF
it "#{action} #{spec_name(method)}" do
params = {}
response = request(#{url_string(route)}, :method => :#{method}, :params => { })
response.status.should be_redirect
end
EOF
end
end
end
controllers.each do |controller, routes|
unless controller.blank?
filename = "spec/requests/#{controller.gsub("/","_")}_spec.rb"
puts filename
File.open(filename, "w") do |file|
file.write(spec_start(controller))
routes.each do |route|
method = route.conditions[:method] || "get"
action = route.params[:action]
params = route.params.reject { |k,v| [:controller, :action, :format].include?(k) }
file.write(spec(route))
end
file.write(spec_end)
end
end
end && nil
#
# JUST SOME HELPER METHODS I USED FOR DEBUGGING, NOT ACTUALLY USED
#
# Merb::Router.routes.each do |route|
# puts route.params.collect { |k,v| ":#{k} => \"#{v.gsub(/\"/,'')}\"" }.join(", ")
# end && nil
#
# controllers["backoffice_notes"].each do |route|
# puts route
# puts @@route_to_name[route]
# puts route.conditions.inspect
# puts route.params.inspect
# puts
# puts
# end
#
# controllers["notes"].each do |route|
# puts route
# puts @@route_to_name[route]
# puts route.conditions.inspect
# puts route.params.inspect
# puts
# puts
# end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment