rackamole 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +4 -0
- data/README.txt +93 -0
- data/Rakefile +28 -0
- data/aaa.txt +36 -0
- data/bin/rackamole +8 -0
- data/images/mole_logo.png +0 -0
- data/images/mole_logo.psd +0 -0
- data/images/mole_logo_small.png +0 -0
- data/images/mole_logo_small.psd +0 -0
- data/lib/rackamole.rb +46 -0
- data/lib/rackamole/interceptor.rb +20 -0
- data/lib/rackamole/logger.rb +121 -0
- data/lib/rackamole/mole.rb +134 -0
- data/lib/rackamole/store/log.rb +55 -0
- data/lib/rackamole/store/mongo.rb +104 -0
- data/samples/rails/moled/README +243 -0
- data/samples/rails/moled/Rakefile +10 -0
- data/samples/rails/moled/app/controllers/application_controller.rb +13 -0
- data/samples/rails/moled/app/controllers/fred_controller.rb +4 -0
- data/samples/rails/moled/app/helpers/application_helper.rb +3 -0
- data/samples/rails/moled/app/views/fred/index.html.erb +1 -0
- data/samples/rails/moled/config/boot.rb +110 -0
- data/samples/rails/moled/config/database.yml +22 -0
- data/samples/rails/moled/config/environment.rb +45 -0
- data/samples/rails/moled/config/environments/development.rb +17 -0
- data/samples/rails/moled/config/environments/production.rb +28 -0
- data/samples/rails/moled/config/environments/test.rb +28 -0
- data/samples/rails/moled/config/initializers/backtrace_silencers.rb +7 -0
- data/samples/rails/moled/config/initializers/inflections.rb +10 -0
- data/samples/rails/moled/config/initializers/mime_types.rb +5 -0
- data/samples/rails/moled/config/initializers/new_rails_defaults.rb +19 -0
- data/samples/rails/moled/config/initializers/session_store.rb +15 -0
- data/samples/rails/moled/config/locales/en.yml +5 -0
- data/samples/rails/moled/config/routes.rb +43 -0
- data/samples/rails/moled/db/development.sqlite3 +0 -0
- data/samples/rails/moled/doc/README_FOR_APP +2 -0
- data/samples/rails/moled/log/development.log +30 -0
- data/samples/rails/moled/log/production.log +0 -0
- data/samples/rails/moled/log/server.log +0 -0
- data/samples/rails/moled/log/test.log +0 -0
- data/samples/rails/moled/public/404.html +30 -0
- data/samples/rails/moled/public/422.html +30 -0
- data/samples/rails/moled/public/500.html +30 -0
- data/samples/rails/moled/public/favicon.ico +0 -0
- data/samples/rails/moled/public/images/rails.png +0 -0
- data/samples/rails/moled/public/index.html +275 -0
- data/samples/rails/moled/public/javascripts/application.js +2 -0
- data/samples/rails/moled/public/javascripts/controls.js +963 -0
- data/samples/rails/moled/public/javascripts/dragdrop.js +973 -0
- data/samples/rails/moled/public/javascripts/effects.js +1128 -0
- data/samples/rails/moled/public/javascripts/prototype.js +4320 -0
- data/samples/rails/moled/public/robots.txt +5 -0
- data/samples/rails/moled/script/about +4 -0
- data/samples/rails/moled/script/console +3 -0
- data/samples/rails/moled/script/dbconsole +3 -0
- data/samples/rails/moled/script/destroy +3 -0
- data/samples/rails/moled/script/generate +3 -0
- data/samples/rails/moled/script/performance/benchmarker +3 -0
- data/samples/rails/moled/script/performance/profiler +3 -0
- data/samples/rails/moled/script/plugin +3 -0
- data/samples/rails/moled/script/runner +3 -0
- data/samples/rails/moled/script/server +3 -0
- data/samples/rails/moled/test/performance/browsing_test.rb +9 -0
- data/samples/rails/moled/test/test_helper.rb +38 -0
- data/samples/sinatra/moled.rb +20 -0
- data/spec/expected_results/mole_exception.log +17 -0
- data/spec/expected_results/mole_feature.log +15 -0
- data/spec/expected_results/mole_perf.log +16 -0
- data/spec/rackamole/interceptor_spec.rb +33 -0
- data/spec/rackamole/logger_spec.rb +55 -0
- data/spec/rackamole/mole_spec.rb +90 -0
- data/spec/rackamole/store/log_spec.rb +54 -0
- data/spec/rackamole/store/mongo_spec.rb +120 -0
- data/spec/rackamole_spec.rb +20 -0
- data/spec/spec_helper.rb +8 -0
- data/tasks/ann.rake +80 -0
- data/tasks/bones.rake +20 -0
- data/tasks/gem.rake +201 -0
- data/tasks/git.rake +40 -0
- data/tasks/notes.rake +27 -0
- data/tasks/post_load.rake +34 -0
- data/tasks/rdoc.rake +51 -0
- data/tasks/rubyforge.rake +55 -0
- data/tasks/setup.rb +292 -0
- data/tasks/spec.rake +54 -0
- data/tasks/svn.rake +47 -0
- data/tasks/test.rake +40 -0
- data/tasks/zentest.rake +36 -0
- metadata +198 -0
@@ -0,0 +1,38 @@
|
|
1
|
+
ENV["RAILS_ENV"] = "test"
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
|
3
|
+
require 'test_help'
|
4
|
+
|
5
|
+
class ActiveSupport::TestCase
|
6
|
+
# Transactional fixtures accelerate your tests by wrapping each test method
|
7
|
+
# in a transaction that's rolled back on completion. This ensures that the
|
8
|
+
# test database remains unchanged so your fixtures don't have to be reloaded
|
9
|
+
# between every test method. Fewer database queries means faster tests.
|
10
|
+
#
|
11
|
+
# Read Mike Clark's excellent walkthrough at
|
12
|
+
# http://clarkware.com/cgi/blosxom/2005/10/24#Rails10FastTesting
|
13
|
+
#
|
14
|
+
# Every Active Record database supports transactions except MyISAM tables
|
15
|
+
# in MySQL. Turn off transactional fixtures in this case; however, if you
|
16
|
+
# don't care one way or the other, switching from MyISAM to InnoDB tables
|
17
|
+
# is recommended.
|
18
|
+
#
|
19
|
+
# The only drawback to using transactional fixtures is when you actually
|
20
|
+
# need to test transactions. Since your test is bracketed by a transaction,
|
21
|
+
# any transactions started in your code will be automatically rolled back.
|
22
|
+
self.use_transactional_fixtures = true
|
23
|
+
|
24
|
+
# Instantiated fixtures are slow, but give you @david where otherwise you
|
25
|
+
# would need people(:david). If you don't want to migrate your existing
|
26
|
+
# test cases which use the @david style and don't mind the speed hit (each
|
27
|
+
# instantiated fixtures translates to a database query per test method),
|
28
|
+
# then set this back to true.
|
29
|
+
self.use_instantiated_fixtures = false
|
30
|
+
|
31
|
+
# Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
|
32
|
+
#
|
33
|
+
# Note: You'll currently still have to declare fixtures explicitly in integration tests
|
34
|
+
# -- they do not yet inherit this setting
|
35
|
+
fixtures :all
|
36
|
+
|
37
|
+
# Add more helper methods to be used by all tests here...
|
38
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'sinatra'
|
3
|
+
require 'rackamole'
|
4
|
+
|
5
|
+
configure do
|
6
|
+
set :sessions, true
|
7
|
+
set :environment, :development
|
8
|
+
use Rack::Reloader
|
9
|
+
use Rack::Mole, { :app_name => "My Sinatra App", :user_key => :user_name }
|
10
|
+
end
|
11
|
+
|
12
|
+
before do
|
13
|
+
session[:user_name] = "Fernand"
|
14
|
+
end
|
15
|
+
|
16
|
+
get '/fred' do
|
17
|
+
@blee = "No shit"
|
18
|
+
session[:fred] = "duh me"
|
19
|
+
"<h1>Hello World</h1>"
|
20
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
----------------------------------------------------------------------------------------------------
|
2
|
+
MOLED EXCEPTION
|
3
|
+
App_name : "Test app"
|
4
|
+
Environment : :test
|
5
|
+
Perf_issue : false
|
6
|
+
Ip : "1.1.1.1"
|
7
|
+
Browser : "Ibrowse"
|
8
|
+
User_id : 100
|
9
|
+
User_name : "Fernand"
|
10
|
+
Request_time : 1.0
|
11
|
+
Url : "http://test_me/"
|
12
|
+
Path : "/fred"
|
13
|
+
Method : "GET"
|
14
|
+
Params : {:blee=>"\"duh\""}
|
15
|
+
Session : {:fred=>"10"}
|
16
|
+
Stack : ["Oh snap!"]
|
17
|
+
Ruby_version : "ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-darwin8.10.1]"
|
@@ -0,0 +1,15 @@
|
|
1
|
+
----------------------------------------------------------------------------------------------------
|
2
|
+
MOLED FEATURE
|
3
|
+
App_name : "Test app"
|
4
|
+
Environment : :test
|
5
|
+
Perf_issue : false
|
6
|
+
Ip : "1.1.1.1"
|
7
|
+
Browser : "Ibrowse"
|
8
|
+
User_id : 100
|
9
|
+
User_name : "Fernand"
|
10
|
+
Request_time : 1.0
|
11
|
+
Url : "http://test_me/"
|
12
|
+
Path : "/fred"
|
13
|
+
Method : "GET"
|
14
|
+
Params : {:blee=>"\"duh\""}
|
15
|
+
Session : {:fred=>"10"}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
----------------------------------------------------------------------------------------------------
|
2
|
+
MOLED PERFORMANCE
|
3
|
+
App_name : "Test app"
|
4
|
+
Environment : :test
|
5
|
+
Perf_issue : false
|
6
|
+
Ip : "1.1.1.1"
|
7
|
+
Browser : "Ibrowse"
|
8
|
+
User_id : 100
|
9
|
+
User_name : "Fernand"
|
10
|
+
Request_time : 1.0
|
11
|
+
Url : "http://test_me/"
|
12
|
+
Path : "/fred"
|
13
|
+
Method : "GET"
|
14
|
+
Params : {:blee=>"\"duh\""}
|
15
|
+
Session : {:fred=>"10"}
|
16
|
+
Performance : true
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), %w[.. spec_helper])
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
describe Rackamole::Interceptor do
|
5
|
+
before( :all ) do
|
6
|
+
class Fred
|
7
|
+
def rescue_action_in_public( exception )
|
8
|
+
end
|
9
|
+
|
10
|
+
def request
|
11
|
+
@request ||= OpenStruct.new( :env => {} )
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.alias_method_chain(target, feature)
|
15
|
+
alias_method "#{target}_without_#{feature}", target
|
16
|
+
alias_method target, "#{target}_with_#{feature}"
|
17
|
+
end
|
18
|
+
|
19
|
+
include Rackamole::Interceptor
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should include the correct methods" do
|
24
|
+
Fred.instance_methods.should be_include( 'rescue_action_in_public_without_mole' )
|
25
|
+
Fred.private_instance_methods.should be_include( 'rescue_action_in_public_with_mole' )
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should set the env correctly when an exception is raised" do
|
29
|
+
fred = Fred.new
|
30
|
+
fred.send( :rescue_action_in_public, "Fred" )
|
31
|
+
fred.request.env['mole.exception'].should == "Fred"
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), %w[.. spec_helper] )
|
2
|
+
|
3
|
+
require 'stringio'
|
4
|
+
|
5
|
+
describe Rackamole::Logger do
|
6
|
+
it "raises an error if the email addresses passed in is empty" do
|
7
|
+
lambda { Rackamole::Logger.new( { :email_alerts_to => [] } ) }.should raise_error( Rackamole::Logger::ConfigurationError )
|
8
|
+
end
|
9
|
+
|
10
|
+
it "configures an email appender if :email_alerts is set" do
|
11
|
+
l = Rackamole::Logger.new( { :logger_name => "Test2", :email_alerts_to => "fernand@invalid.address", :email_alert_level => :off })
|
12
|
+
l.email_appender.should_not == nil
|
13
|
+
end
|
14
|
+
|
15
|
+
it "does not configure an email appender if :email_alerts is not set" do
|
16
|
+
l = Rackamole::Logger.new( { :logger_name => "Test3" })
|
17
|
+
lambda { l.email_appender }.should raise_error( Rackamole::Logger::ConfigurationError )
|
18
|
+
end
|
19
|
+
|
20
|
+
it "raises an error if an invalid object is passed in for the :log_file" do
|
21
|
+
lambda { l = Rackamole::Logger.new( { :log_file => Object.new } ) }.should raise_error( Rackamole::Logger::ConfigurationError )
|
22
|
+
end
|
23
|
+
|
24
|
+
it "logs to an IO stream if given" do
|
25
|
+
io = StringIO.new
|
26
|
+
l = Rackamole::Logger.new( { :log_file => io, :logger_name => "Test4" })
|
27
|
+
l.info "This is a test io message"
|
28
|
+
io.string.split("\n").should have(1).item
|
29
|
+
io.string.should =~ /This is a test io message/
|
30
|
+
io.string.should =~ /INFO/
|
31
|
+
end
|
32
|
+
|
33
|
+
it "logs to a file if given a file name to log to" do
|
34
|
+
log_file = "/tmp/mole_logger_test.log"
|
35
|
+
FileUtils.rm( log_file ) if File.exists?( log_file )
|
36
|
+
l = Rackamole::Logger.new({ :log_file => log_file, :logger_name => "Test5" })
|
37
|
+
l.info "This is a test log file message"
|
38
|
+
|
39
|
+
log_lines = IO.readlines(log_file)
|
40
|
+
|
41
|
+
log_lines.should have(1).items
|
42
|
+
log_lines.first.should =~ /This is a test log file message/
|
43
|
+
log_lines.first.should =~ /INFO/
|
44
|
+
end
|
45
|
+
|
46
|
+
it "creates a logger from another logger" do
|
47
|
+
io = StringIO.new
|
48
|
+
l = Rackamole::Logger.new( { :log_file => io, :logger_name => 'Mole' } )
|
49
|
+
child_l = l.for(Rack::Mole)
|
50
|
+
|
51
|
+
child_l.info "This is a child log message"
|
52
|
+
io.string.should =~ /This is a child log message/
|
53
|
+
io.string.should =~ /INFO/
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), %w[.. spec_helper])
|
2
|
+
require 'actionpack'
|
3
|
+
|
4
|
+
describe Rack::Mole do
|
5
|
+
include Rack::Test::Methods
|
6
|
+
|
7
|
+
before :each do
|
8
|
+
@response = [ 200, {"Content-Type" => "text/plain"}, ["success"] ]
|
9
|
+
end
|
10
|
+
|
11
|
+
class TestStore
|
12
|
+
attr_accessor :mole_result
|
13
|
+
|
14
|
+
def mole( args )
|
15
|
+
@mole_result = args
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def app( opts={} )
|
20
|
+
response = @response
|
21
|
+
@app ||= Rack::Builder.new do
|
22
|
+
use Rack::Lint
|
23
|
+
use Rack::Mole, opts
|
24
|
+
run lambda { |env| response }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe 'moling a request' do
|
29
|
+
before :each do
|
30
|
+
@test_store = TestStore.new
|
31
|
+
@test_env = { 'rack.session' => { :user_id => 100 }, 'HTTP_X_FORWARDED_FOR' => '1.1.1.1', 'HTTP_USER_AGENT' => "IBrowse" }
|
32
|
+
app(
|
33
|
+
:app_name => "Test App",
|
34
|
+
:environment => :test,
|
35
|
+
:perf_threshold => 0.1,
|
36
|
+
:user_key => { :session_key => :user_id, :extractor => lambda{ |k| "Test user #{k}"} },
|
37
|
+
:store => @test_store )
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should set the mole meta correctly" do
|
41
|
+
get "/", nil, @test_env
|
42
|
+
@test_store.mole_result[:app_name].should == "Test App"
|
43
|
+
@test_store.mole_result[:environment].should == :test
|
44
|
+
@test_store.mole_result[:user_id].should == 100
|
45
|
+
@test_store.mole_result[:user_name].should == 'Test user 100'
|
46
|
+
@test_store.mole_result[:ip].should == '1.1.1.1'
|
47
|
+
@test_store.mole_result[:browser].should == 'IBrowse'
|
48
|
+
@test_store.mole_result[:method].should == 'GET'
|
49
|
+
@test_store.mole_result[:url].should == 'http://example.org/'
|
50
|
+
@test_store.mole_result[:path].should == '/'
|
51
|
+
@test_store.mole_result[:perf_issue].should == false
|
52
|
+
@test_store.mole_result[:params].should be_nil
|
53
|
+
@test_store.mole_result[:session].should_not be_nil
|
54
|
+
@test_store.mole_result[:session].should == { :user_id => '100' }
|
55
|
+
end
|
56
|
+
|
57
|
+
it "mole an exception correctly" do
|
58
|
+
begin
|
59
|
+
raise 'Oh snap!'
|
60
|
+
rescue => boom
|
61
|
+
get "/", nil, { 'mole.exception' => boom, 'rack.session' => { :user_id => 100 }, 'HTTP_X_FORWARDED_FOR' => '1.1.1.1', 'HTTP_USER_AGENT' => "IBrowse" }
|
62
|
+
@test_store.mole_result[:stack].should have(4).items
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should capture request parameters correctly" do
|
67
|
+
get "/", { :blee => 'duh' }, @test_env
|
68
|
+
@test_store.mole_result[:params].should == { :blee => "duh".to_json }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe 'username in session' do
|
73
|
+
before :each do
|
74
|
+
@test_store = TestStore.new
|
75
|
+
@test_env = { 'rack.session' => { :user_name => "Fernand" } }
|
76
|
+
app(
|
77
|
+
:app_name => "Test App",
|
78
|
+
:environment => :test,
|
79
|
+
:perf_threshold => 0.1,
|
80
|
+
:user_key => :user_name,
|
81
|
+
:store => @test_store )
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should mole the user correctly" do
|
85
|
+
get "/", nil, @test_env
|
86
|
+
@test_store.mole_result[:user_id].should be_nil
|
87
|
+
@test_store.mole_result[:user_name].should == 'Fernand'
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), %w[.. .. spec_helper])
|
2
|
+
require 'mongo/util/ordered_hash'
|
3
|
+
|
4
|
+
describe Rackamole::Store::Log do
|
5
|
+
describe "#mole" do
|
6
|
+
before( :each ) do
|
7
|
+
@test_file = '/tmp/test_mole.log'
|
8
|
+
File.delete( @test_file ) if File.exists?( @test_file )
|
9
|
+
|
10
|
+
@store = Rackamole::Store::Log.new( @test_file )
|
11
|
+
|
12
|
+
@args = OrderedHash.new
|
13
|
+
@args[:app_name] = "Test app"
|
14
|
+
@args[:environment] = :test
|
15
|
+
@args[:perf_issue] = false
|
16
|
+
@args[:ip] = "1.1.1.1"
|
17
|
+
@args[:browser] = "Ibrowse"
|
18
|
+
@args[:user_id] = 100
|
19
|
+
@args[:user_name] = "Fernand"
|
20
|
+
@args[:request_time] = 1.0
|
21
|
+
@args[:url] = "http://test_me/"
|
22
|
+
@args[:path] = "/fred"
|
23
|
+
@args[:method] = 'GET'
|
24
|
+
@args[:params] = { :blee => "duh".to_json }
|
25
|
+
@args[:session] = { :fred => 10.to_json }
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should mole a feature correctly" do
|
29
|
+
@store.mole( @args )
|
30
|
+
results = File.read( @test_file ).gsub( /.* Mole \:\s/, '' )
|
31
|
+
expected = File.read( File.join( File.dirname(__FILE__), %w[.. .. expected_results mole_feature.log] ) )
|
32
|
+
expected.should == results
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should mole an exception correctly" do
|
36
|
+
@args[:stack] = [ 'Oh snap!' ]
|
37
|
+
@args[:ruby_version] = 'ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-darwin8.10.1]'
|
38
|
+
|
39
|
+
@store.mole( @args )
|
40
|
+
results = File.read( @test_file ).gsub( /.* Mole \:\s/, '' )
|
41
|
+
expected = File.read( File.join( File.dirname(__FILE__), %w[.. .. expected_results mole_exception.log] ) )
|
42
|
+
expected.should == results
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should mole a performance issue correctly" do
|
46
|
+
@args[:performance] = true
|
47
|
+
@store.mole( @args )
|
48
|
+
results = File.read( @test_file ).gsub( /.* Mole \:\s/, '' )
|
49
|
+
expected = File.read( File.join( File.dirname(__FILE__), %w[.. .. expected_results mole_perf.log] ) )
|
50
|
+
expected.should == results
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), %w[.. .. spec_helper])
|
2
|
+
require 'mongo/util/ordered_hash'
|
3
|
+
|
4
|
+
describe Rackamole::Store::Log do
|
5
|
+
|
6
|
+
describe "#mole" do
|
7
|
+
before( :each ) do
|
8
|
+
@store = Rackamole::Store::Mongo.new( :host => 'localhost', :port => 27017, :database => 'test_mole_mdb' )
|
9
|
+
@store.reset!
|
10
|
+
|
11
|
+
@args = OrderedHash.new
|
12
|
+
@args[:app_name] = "Test app"
|
13
|
+
@args[:environment] = :test
|
14
|
+
@args[:perf_issue] = false
|
15
|
+
@args[:ip] = "1.1.1.1"
|
16
|
+
@args[:browser] = "Ibrowse"
|
17
|
+
@args[:user_id] = 100
|
18
|
+
@args[:user_name] = "Fernand"
|
19
|
+
@args[:request_time] = 1.0
|
20
|
+
@args[:url] = "http://test_me/"
|
21
|
+
@args[:path] = "/fred"
|
22
|
+
@args[:method] = 'GET'
|
23
|
+
@args[:params] = { :blee => "duh".to_json }
|
24
|
+
@args[:session] = { :fred => 10.to_json }
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should mole a feature correctly" do
|
28
|
+
@store.mole( @args )
|
29
|
+
@store.features.count.should == 1
|
30
|
+
@store.logs.count.should == 1
|
31
|
+
|
32
|
+
feature = @store.features.find_one( {} )
|
33
|
+
feature.should_not be_nil
|
34
|
+
feature['app_name'].should == 'Test app'
|
35
|
+
feature['context'].should == '/fred'
|
36
|
+
feature['created_at'].should_not be_nil
|
37
|
+
feature['updated_at'].should_not be_nil
|
38
|
+
|
39
|
+
log = @store.logs.find_one( {} )
|
40
|
+
log.should_not be_nil
|
41
|
+
log['params'].should == { 'blee' => 'duh'.to_json }
|
42
|
+
log['ip'].should == '1.1.1.1'
|
43
|
+
log['browser'].should == 'Ibrowse'
|
44
|
+
log['environment'].should == :test
|
45
|
+
log['path'].should == '/fred'
|
46
|
+
log['url'].should == 'http://test_me/'
|
47
|
+
log['method'].should == 'GET'
|
48
|
+
log['session'].should == { 'fred' => '10' }
|
49
|
+
log['user_name'].should == 'Fernand'
|
50
|
+
log['user_id'].should == 100
|
51
|
+
log['request_time'].should == 1.0
|
52
|
+
log['perf_issue'].should == false
|
53
|
+
log['created_at'].should_not be_nil
|
54
|
+
log['updated_at'].should_not be_nil
|
55
|
+
@store.connection.dereference( log['feature'] )['app_name'].should == 'Test app'
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should mole a rails feature correctly" do
|
59
|
+
@args[:path] = '/fred/blee/duh'
|
60
|
+
@args[:route_info] = { :controller => 'fred', :action => 'blee', :id => 'duh' }
|
61
|
+
@store.mole( @args )
|
62
|
+
|
63
|
+
@store.features.count.should == 1
|
64
|
+
@store.logs.count.should == 1
|
65
|
+
|
66
|
+
feature = @store.features.find_one( {} )
|
67
|
+
feature.should_not be_nil
|
68
|
+
feature['controller'].should == 'fred'
|
69
|
+
feature['action'].should == 'blee'
|
70
|
+
feature['context'].should be_nil
|
71
|
+
|
72
|
+
log = @store.logs.find_one( {} )
|
73
|
+
log.should_not be_nil
|
74
|
+
log['route_info'].should_not be_nil
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should reuse an existing feature" do
|
78
|
+
@store.mole( @args )
|
79
|
+
@store.mole( @args )
|
80
|
+
|
81
|
+
@store.features.count.should == 1
|
82
|
+
@store.logs.count.should == 2
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should mole perf correctly" do
|
86
|
+
@args[:perf_issue] = true
|
87
|
+
@store.mole( @args )
|
88
|
+
|
89
|
+
@store.features.count.should == 1
|
90
|
+
@store.logs.count.should == 1
|
91
|
+
|
92
|
+
feature = @store.features.find_one( {} )
|
93
|
+
feature.should_not be_nil
|
94
|
+
|
95
|
+
log = @store.logs.find_one( {} )
|
96
|
+
log.should_not be_nil
|
97
|
+
log['perf_issue'].should == true
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'should mole an exception correctly' do
|
101
|
+
@args[:exception] = ['fred']
|
102
|
+
@store.mole( @args )
|
103
|
+
|
104
|
+
@store.features.count.should == 1
|
105
|
+
@store.logs.count.should == 1
|
106
|
+
|
107
|
+
feature = @store.features.find_one( {} )
|
108
|
+
feature.should_not be_nil
|
109
|
+
|
110
|
+
log = @store.logs.find_one( {} )
|
111
|
+
log.should_not be_nil
|
112
|
+
log['exception'].should == ['fred']
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'should keep count an similar exceptions or perf issues' do
|
116
|
+
pending "NYI"
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|