gricer 0.0.1
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.
- data/MIT-LICENSE +20 -0
- data/README.rdoc +84 -0
- data/Rakefile +49 -0
- data/app/assets/images/gricer/fluid/breadcrumb.png +0 -0
- data/app/assets/javascripts/gricer.js.coffee +85 -0
- data/app/assets/javascripts/gricer_backend_jquery.js.coffee +352 -0
- data/app/assets/javascripts/jquery.flot.js +2599 -0
- data/app/assets/javascripts/jquery.flot.pie.js +750 -0
- data/app/assets/javascripts/jquery.flot.resize.js +60 -0
- data/app/assets/javascripts/jquery.flot.symbol.js +70 -0
- data/app/assets/javascripts/worldmap.js +146 -0
- data/app/assets/stylesheets/gricer/fluid-jquery-ui.css.scss +1298 -0
- data/app/assets/stylesheets/gricer/fluid.css.scss +240 -0
- data/app/assets/stylesheets/gricer/helpers/css3.css.scss +21 -0
- data/app/controllers/gricer/base_controller.rb +141 -0
- data/app/controllers/gricer/capture_controller.rb +42 -0
- data/app/controllers/gricer/dashboard_controller.rb +18 -0
- data/app/controllers/gricer/requests_controller.rb +42 -0
- data/app/controllers/gricer/sessions_controller.rb +24 -0
- data/app/helpers/gricer/base_helper.rb +22 -0
- data/app/models/gricer/agent.rb +789 -0
- data/app/models/gricer/request.rb +239 -0
- data/app/models/gricer/session.rb +433 -0
- data/app/views/gricer/capture/index.html.erb +1 -0
- data/app/views/gricer/dashboard/_menu.html.erb +10 -0
- data/app/views/gricer/dashboard/_overview.html.erb +33 -0
- data/app/views/gricer/dashboard/index.html.erb +19 -0
- data/config/routes.rb +51 -0
- data/lib/gricer.rb +36 -0
- data/lib/gricer/action_controller/base.rb +28 -0
- data/lib/gricer/action_controller/track.rb +132 -0
- data/lib/gricer/active_model/statistics.rb +167 -0
- data/lib/gricer/config.rb +125 -0
- data/lib/gricer/engine.rb +9 -0
- data/lib/gricer/localization.rb +3 -0
- data/lib/tasks/gricer_tasks.rake +92 -0
- data/spec/controllers/gricer/base_controller_spec.rb +207 -0
- data/spec/controllers/gricer/capture_controller_spec.rb +44 -0
- data/spec/controllers/gricer/dashboard_controller_spec.rb +44 -0
- data/spec/controllers/gricer/requests_controller_spec.rb +36 -0
- data/spec/controllers/gricer/sessions_controller_spec.rb +37 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +9 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/assets/stylesheets/dashboard.css +4 -0
- data/spec/dummy/app/assets/stylesheets/scaffold.css +56 -0
- data/spec/dummy/app/assets/stylesheets/sessions.css +4 -0
- data/spec/dummy/app/controllers/application_controller.rb +23 -0
- data/spec/dummy/app/controllers/dashboard_controller.rb +19 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/helpers/dashboard_helper.rb +2 -0
- data/spec/dummy/app/views/dashboard/index.html.erb +236 -0
- data/spec/dummy/app/views/layouts/application.html.erb +16 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +48 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/cucumber.yml +9 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +27 -0
- data/spec/dummy/config/environments/production.rb +51 -0
- data/spec/dummy/config/environments/test.rb +39 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +10 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +12 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +11 -0
- data/spec/dummy/db/schema.rb +241 -0
- data/spec/dummy/log/development.log +0 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +26 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/helpers/gricer/base_helper_spec.rb +28 -0
- data/spec/lib/gricer/action_controller/track_spec.rb +63 -0
- data/spec/models/gricer/agent_spec.rb +829 -0
- data/spec/models/gricer/request_spec.rb +145 -0
- data/spec/models/gricer/session_spec.rb +209 -0
- data/spec/routing/capture_routes_spec.rb +6 -0
- data/spec/routing/dashboard_routes_spec.rb +9 -0
- data/spec/routing/requests_routes_spec.rb +90 -0
- data/spec/routing/sessions_routes_spec.rb +115 -0
- data/spec/spec_helper.rb +23 -0
- metadata +185 -0
@@ -0,0 +1,125 @@
|
|
1
|
+
module Gricer
|
2
|
+
# The configuration object for Gricer
|
3
|
+
#
|
4
|
+
#
|
5
|
+
class Config
|
6
|
+
attr_writer :table_name_prefix, :admin_prefix, :admin_layout
|
7
|
+
attr_writer :max_session_duration
|
8
|
+
attr_writer :geoip_db, :geoip_dat
|
9
|
+
attr_writer :exclude_paths
|
10
|
+
attr_writer :admin_menu
|
11
|
+
|
12
|
+
# A new instance of Gricer::Config.
|
13
|
+
#
|
14
|
+
# Configure options can be passed in a block.
|
15
|
+
#
|
16
|
+
# @see #configure
|
17
|
+
#
|
18
|
+
# @return [Gricer::Config]
|
19
|
+
def initialize(&block)
|
20
|
+
configure(&block) if block_given?
|
21
|
+
end
|
22
|
+
|
23
|
+
# Configure your Gricer Rails Engine with the given parameters in
|
24
|
+
# the block. For possible options see Instance Attributes.
|
25
|
+
#
|
26
|
+
# @yield (config) The actual configuration instance
|
27
|
+
# @return [Gricer::Config] The actual configuration instance
|
28
|
+
def configure(&block)
|
29
|
+
yield(self)
|
30
|
+
end
|
31
|
+
|
32
|
+
# The prefix for table names of gricer database tables.
|
33
|
+
#
|
34
|
+
# Default value is 'gricer_'
|
35
|
+
# @return [String]
|
36
|
+
def table_name_prefix
|
37
|
+
@table_name_prefix ||= 'gricer_'
|
38
|
+
end
|
39
|
+
|
40
|
+
# Configure the prefix for admin pages paths
|
41
|
+
#
|
42
|
+
# Default value is 'gricer'
|
43
|
+
# @return [String]
|
44
|
+
def admin_prefix
|
45
|
+
@admin_prefix.blank? ? 'gricer' : @admin_prefix
|
46
|
+
end
|
47
|
+
|
48
|
+
# Configure to use another layout than the application default for Gricer controllers
|
49
|
+
#
|
50
|
+
# Default value is nil
|
51
|
+
# @return [String]
|
52
|
+
def admin_layout
|
53
|
+
@admin_layout
|
54
|
+
end
|
55
|
+
|
56
|
+
# Configure the structure of Gricer's admin menu
|
57
|
+
#
|
58
|
+
# Default value see source
|
59
|
+
# @return [Array]
|
60
|
+
def admin_menu
|
61
|
+
@admin_menu ||= [
|
62
|
+
['Overview', :dashboard, {controller: 'gricer/dashboard', action: 'overview'}],
|
63
|
+
['Visitors', :menu, [
|
64
|
+
['Entry Pages', :spread, {controller: 'gricer/requests', action: 'spread_stats', field: 'entry_path'}],
|
65
|
+
['Referers', :spread, {controller: 'gricer/requests', action: 'spread_stats', field: 'referer_host'}],
|
66
|
+
['Search Engines', :spread, {controller: 'gricer/requests', action: 'spread_stats', field: 'search_engine'}],
|
67
|
+
['Search Terms', :spread, {controller: 'gricer/requests', action: 'spread_stats', field: 'search_query'}],
|
68
|
+
['Countries', :spread, {controller: 'gricer/sessions', action: 'spread_stats', field: 'country'}],
|
69
|
+
['Domains', :spread, {controller: 'gricer/sessions', action: 'spread_stats', field: 'domain'}],
|
70
|
+
['Locales', :spread, {controller: 'gricer/sessions', action: 'spread_stats', field: 'requested_locale_major'}]
|
71
|
+
] ],
|
72
|
+
['Pages', :menu, [
|
73
|
+
['Views', :spread, {controller: 'gricer/requests', action: 'spread_stats', field: 'path'}],
|
74
|
+
['Hosts', :spread, {controller: 'gricer/requests', action: 'spread_stats', field: 'host'}],
|
75
|
+
['Methods', :spread, {controller: 'gricer/requests', action: 'spread_stats', field: 'method'}],
|
76
|
+
['Protocols', :spread, {controller: 'gricer/requests', action: 'spread_stats', field: 'protocol'}],
|
77
|
+
] ],
|
78
|
+
['Browsers', :menu, [
|
79
|
+
['Browsers', :spread, {controller: 'gricer/sessions', action: 'spread_stats', field: 'agent.name'}],
|
80
|
+
['Operating Systems', :spread, {controller: 'gricer/sessions', action: 'spread_stats', field: 'agent.os'}],
|
81
|
+
['Engines', :spread, {controller: 'gricer/sessions', action: 'spread_stats', field: 'agent.engine_name'}],
|
82
|
+
['JavaScript', :spread, {controller: 'gricer/sessions', action: 'spread_stats', field: 'javascript'}],
|
83
|
+
['Java', :spread, {controller: 'gricer/sessions', action: 'spread_stats', field: 'java'}],
|
84
|
+
['Silverlight', :spread, {controller: 'gricer/sessions', action: 'spread_stats', field: 'silverlight_major_version'}],
|
85
|
+
['Flash', :spread, {controller: 'gricer/sessions', action: 'spread_stats', field: 'flash_major_version'}],
|
86
|
+
['Screen Size', :spread, {controller: 'gricer/sessions', action: 'spread_stats', field: 'screen_size'}],
|
87
|
+
['Color Depth', :spread, {controller: 'gricer/sessions', action: 'spread_stats', field: 'screen_depth'}]
|
88
|
+
] ]
|
89
|
+
]
|
90
|
+
end
|
91
|
+
|
92
|
+
# Configure page urls matching this Expression to be excluded from being tracked in Gricer statistics
|
93
|
+
# Default is to exclude the admin pages
|
94
|
+
# @return [Regexp]
|
95
|
+
def exclude_paths
|
96
|
+
@exclude_actions ||= /^#{admin_prefix}$/
|
97
|
+
end
|
98
|
+
|
99
|
+
# Configure the data file used by GeoIP
|
100
|
+
# If you configure #geoip_db this property will be ignored.
|
101
|
+
#
|
102
|
+
# Default is no data file given.
|
103
|
+
# @return [String]
|
104
|
+
def geoip_dat
|
105
|
+
@geoip_dat
|
106
|
+
end
|
107
|
+
|
108
|
+
# Configure the database instance used by GeoIP
|
109
|
+
#
|
110
|
+
# Default is none GeoIP database configured
|
111
|
+
# @return [GeoIP::City]
|
112
|
+
def geoip_db
|
113
|
+
@geoip_db ||= geoip_dat ? GeoIP::City.new(geoip_dat, :index, false) : nil
|
114
|
+
end
|
115
|
+
|
116
|
+
# Configure after which time of inactivity the Gricer::Session should expire
|
117
|
+
#
|
118
|
+
# Default is 15 minutes
|
119
|
+
# @return [Integer]
|
120
|
+
def max_session_duration
|
121
|
+
@max_session_duration ||= 15.minutes
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
namespace :gricer do
|
2
|
+
namespace :db do
|
3
|
+
desc "Migrate the database through scripts in db/migrate and update db/schema.rb by invoking db:schema:dump. Target specific version with VERSION=x. Turn off output with VERBOSE=false."
|
4
|
+
task :migrate => [:environment, :prepare_namespace] do
|
5
|
+
ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
|
6
|
+
ActiveRecord::Migrator.migrate("#{File.dirname(__FILE__)}/../../db/migrate/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
|
7
|
+
Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
|
8
|
+
end
|
9
|
+
|
10
|
+
task :prepare_namespace do
|
11
|
+
require 'active_record'
|
12
|
+
puts 'prepage gricer table_name_prefix'
|
13
|
+
# ActiveRecord::Base.configurations = Rails::Application.config.database_configuration
|
14
|
+
|
15
|
+
class ActiveRecord::Base
|
16
|
+
self.table_name_prefix = "#{::ActiveRecord::Base.table_name_prefix}#{Gricer::config.table_name_prefix}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
task :remove_namespace do
|
21
|
+
puts 'remove gricer table_name_prefix'
|
22
|
+
|
23
|
+
class ActiveRecord::Base
|
24
|
+
self.table_name_prefix = "#{::ActiveRecord::Base.table_name_prefix[Gricer::config.table_name_prefix.length,1000]}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
namespace :migrate do
|
29
|
+
desc 'Rollbacks the database one migration and re migrate up. If you want to rollback more than one step, define STEP=x. Target specific version with VERSION=x.'
|
30
|
+
task :redo => [:environment, :prepare_namespace] do
|
31
|
+
if ENV["VERSION"]
|
32
|
+
Rake::Task["gricer:db:migrate:down"].invoke
|
33
|
+
Rake::Task["gricer:db:migrate:up"].invoke
|
34
|
+
else
|
35
|
+
Rake::Task["gricer:db:rollback"].invoke
|
36
|
+
Rake::Task["gricer:db:migrate"].invoke
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
desc 'Runs the "up" for a given migration VERSION.'
|
41
|
+
task :up => [:environment, :prepare_namespace] do
|
42
|
+
version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
|
43
|
+
raise "VERSION is required" unless version
|
44
|
+
ActiveRecord::Migrator.run(:up, "#{File.dirname(__FILE__)}/../../db/migrate/", version)
|
45
|
+
Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
|
46
|
+
end
|
47
|
+
|
48
|
+
desc 'Runs the "down" for a given migration VERSION.'
|
49
|
+
task :down => [:environment, :prepare_namespace] do
|
50
|
+
version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
|
51
|
+
raise "VERSION is required" unless version
|
52
|
+
ActiveRecord::Migrator.run(:down, "#{File.dirname(__FILE__)}/../../db/migrate/", version)
|
53
|
+
Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
desc 'Rolls the schema back to the previous version. Specify the number of steps with STEP=n'
|
58
|
+
task :rollback => [:environment, :prepare_namespace] do
|
59
|
+
step = ENV['STEP'] ? ENV['STEP'].to_i : 1
|
60
|
+
ActiveRecord::Migrator.rollback("#{File.dirname(__FILE__)}/../../db/migrate/", step)
|
61
|
+
Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
|
62
|
+
end
|
63
|
+
|
64
|
+
desc 'Pushes the schema to the next version. Specify the number of steps with STEP=n'
|
65
|
+
task :forward => [:environment, :prepare_namespace] do
|
66
|
+
step = ENV['STEP'] ? ENV['STEP'].to_i : 1
|
67
|
+
ActiveRecord::Migrator.forward("#{File.dirname(__FILE__)}/../../db/migrate/", step)
|
68
|
+
Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
|
69
|
+
end
|
70
|
+
|
71
|
+
desc "Retrieves the current schema version number"
|
72
|
+
task :version => [:environment, :prepare_namespace] do
|
73
|
+
puts "Current version: #{ActiveRecord::Migrator.current_version}"
|
74
|
+
end
|
75
|
+
|
76
|
+
desc "Raises an error if there are pending migrations"
|
77
|
+
task :abort_if_pending_migrations => [:environment, :prepare_namespace] do
|
78
|
+
if defined? ActiveRecord
|
79
|
+
pending_migrations = ActiveRecord::Migrator.new(:up, "#{File.dirname(__FILE__)}/../../db/migrate/").pending_migrations
|
80
|
+
if pending_migrations.any?
|
81
|
+
puts "You have #{pending_migrations.size} pending migrations:"
|
82
|
+
pending_migrations.each do |pending_migration|
|
83
|
+
puts ' %4d %s' % [pending_migration.version, pending_migration.name]
|
84
|
+
end
|
85
|
+
abort %{Run "rake gricer:db:migrate" to update your database then try again.}
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
task :'db:migrate' => [:'gricer:db:migrate', :'gricer:db:remove_namespace']
|
@@ -0,0 +1,207 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Gricer::BaseController do
|
4
|
+
context 'process_stats' do
|
5
|
+
let(:collection) { mock_model('MyStatClass') }
|
6
|
+
|
7
|
+
before do
|
8
|
+
controller.params = {
|
9
|
+
field: 'my_field',
|
10
|
+
filters: nil,
|
11
|
+
from: '2011-04-01',
|
12
|
+
thru: '2011-04-05'
|
13
|
+
}
|
14
|
+
controller.send(:guess_from_thru)
|
15
|
+
controller.stub(:basic_collection) {collection}
|
16
|
+
|
17
|
+
controller.stub(:url_for).with(action: "spread_stats", field: 'my_field', filters: nil, only_path: true) { 'my_alt_url' }
|
18
|
+
|
19
|
+
collection.stub(:stat) { {some: :values} }
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should render ajax' do
|
23
|
+
controller.stub(:render).with(json: {
|
24
|
+
alternatives: [
|
25
|
+
{type: "spread", uri: "my_alt_url"},
|
26
|
+
{type: "process"}
|
27
|
+
],
|
28
|
+
from: 1301608800000,
|
29
|
+
thru: 1301954400000,
|
30
|
+
step: 3600000,
|
31
|
+
data: {some: :values}
|
32
|
+
})
|
33
|
+
|
34
|
+
controller.send(:process_stats)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should render ajax with filter' do
|
38
|
+
controller.stub(:url_for).with(action: "spread_stats", field: 'my_field', filters: {"filter"=>"some_value"}, only_path: true) { 'my_filtered_alt_url' }
|
39
|
+
|
40
|
+
controller.params[:filters] = {'filter' => 'some_value'}
|
41
|
+
|
42
|
+
controller.stub(:render).with(json: {
|
43
|
+
alternatives: [
|
44
|
+
{type: "spread", uri: "my_filtered_alt_url"},
|
45
|
+
{type: "process"}
|
46
|
+
],
|
47
|
+
from: 1301608800000,
|
48
|
+
thru: 1301954400000,
|
49
|
+
step: 3600000,
|
50
|
+
data: {some: :values}
|
51
|
+
})
|
52
|
+
|
53
|
+
controller.send(:process_stats)
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should render ajax with further details' do
|
57
|
+
controller.stub(:further_details) { {'my_field' => 'my_detail_field'} }
|
58
|
+
controller.stub(:url_for).with({:action=>"process_stats", :field=>"my_detail_field", :filters=>{"my_field"=>"%{self}"}, :only_path=>true}) {'my_detail_url'}
|
59
|
+
|
60
|
+
controller.stub(:render).with(json: {
|
61
|
+
alternatives: [
|
62
|
+
{type: "spread", uri: "my_alt_url"},
|
63
|
+
{type: "process"}
|
64
|
+
],
|
65
|
+
from: 1301608800000,
|
66
|
+
thru: 1301954400000,
|
67
|
+
step: 3600000,
|
68
|
+
data: {some: :values},
|
69
|
+
detail_uri: 'my_detail_url'
|
70
|
+
})
|
71
|
+
|
72
|
+
controller.send(:process_stats)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context 'spread_stats' do
|
77
|
+
let(:collection) { mock_model('MyStatClass') }
|
78
|
+
let(:items) { {some: :values} }
|
79
|
+
|
80
|
+
before do
|
81
|
+
controller.params = {
|
82
|
+
field: 'my_field',
|
83
|
+
filters: nil,
|
84
|
+
from: '2011-04-01',
|
85
|
+
thru: '2011-04-05'
|
86
|
+
}
|
87
|
+
controller.send(:guess_from_thru)
|
88
|
+
controller.stub(:basic_collection) {collection}
|
89
|
+
|
90
|
+
controller.stub(:url_for).with(action: "process_stats", field: 'my_field', filters: nil, only_path: true) { 'my_alt_url' }
|
91
|
+
|
92
|
+
collection.stub(:between_dates) { items }
|
93
|
+
items.stub(:count).with(:id) { 42 }
|
94
|
+
items.stub(:count_by).with('my_field') { [['Item 1', 23], ['Item 2', 19]]}
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'should render ajax' do
|
98
|
+
controller.stub(:render).with(json: {
|
99
|
+
alternatives: [
|
100
|
+
{type: "spread"},
|
101
|
+
{type: "process", uri: "my_alt_url"}
|
102
|
+
],
|
103
|
+
from: 1301608800000,
|
104
|
+
thru: 1301954400000,
|
105
|
+
total: 42,
|
106
|
+
data: [["Item 1", 23], ["Item 2", 19]]
|
107
|
+
})
|
108
|
+
|
109
|
+
controller.send(:spread_stats)
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'should render ajax with filter' do
|
113
|
+
controller.stub(:url_for).with(action: "process_stats", field: 'my_field', filters: {"filter"=>"some_value"}, only_path: true) { 'my_filtered_alt_url' }
|
114
|
+
|
115
|
+
controller.params[:filters] = {'filter' => 'some_value'}
|
116
|
+
|
117
|
+
controller.stub(:render).with(json: {
|
118
|
+
alternatives: [
|
119
|
+
{type: "spread"},
|
120
|
+
{type: "process", uri: "my_filtered_alt_url"}
|
121
|
+
],
|
122
|
+
from: 1301608800000,
|
123
|
+
thru: 1301954400000,
|
124
|
+
total: 42,
|
125
|
+
data: [["Item 1", 23], ["Item 2", 19]]
|
126
|
+
})
|
127
|
+
|
128
|
+
controller.send(:spread_stats)
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'should render ajax with further details' do
|
132
|
+
controller.stub(:further_details) { {'my_field' => 'my_detail_field'} }
|
133
|
+
controller.stub(:url_for).with({:action=>"spread_stats", :field=>"my_detail_field", :filters=>{"my_field"=>"%{self}"}, :only_path=>true}) {'my_detail_url'}
|
134
|
+
|
135
|
+
controller.stub(:render).with(json: {
|
136
|
+
alternatives: [
|
137
|
+
{type: "spread"},
|
138
|
+
{type: "process", uri: "my_alt_url"}
|
139
|
+
],
|
140
|
+
from: 1301608800000,
|
141
|
+
thru: 1301954400000,
|
142
|
+
total: 42,
|
143
|
+
data: [["Item 1", 23], ["Item 2", 19]],
|
144
|
+
detail_uri: 'my_detail_url'
|
145
|
+
})
|
146
|
+
|
147
|
+
controller.send(:spread_stats)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
context 'basic_collection' do
|
152
|
+
it 'should raise error (as it has to be implemented in child classes)' do
|
153
|
+
proc{ controller.send(:basic_collection) }.should raise_error('basic_collection must be defined')
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
context 'handle_special_fields' do
|
158
|
+
it 'should do nothing' do
|
159
|
+
controller.send(:handle_special_fields).should be_nil
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
context 'further_details' do
|
164
|
+
it 'should return empty hash' do
|
165
|
+
controller.send(:further_details).should == {}
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
context 'guess_from_thru' do
|
170
|
+
it 'should assign sane values' do
|
171
|
+
Time.stub(:now) {'2011-04-01 12:42:23'.to_time}
|
172
|
+
|
173
|
+
controller.send(:guess_from_thru)
|
174
|
+
assigns[:stat_from].should == '2011-03-25'.to_date
|
175
|
+
assigns[:stat_thru].should == '2011-03-31'.to_date
|
176
|
+
assigns[:stat_step].should == 1.hour
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'should assign given values' do
|
180
|
+
controller.params[:from] = '2010-06-15'
|
181
|
+
controller.params[:thru] = '2011-06-15'
|
182
|
+
|
183
|
+
controller.send(:guess_from_thru)
|
184
|
+
assigns[:stat_from].should == '2010-06-15'.to_date
|
185
|
+
assigns[:stat_thru].should == '2011-06-15'.to_date
|
186
|
+
assigns[:stat_step].should == 1.day
|
187
|
+
end
|
188
|
+
|
189
|
+
it 'should assign sane values with from given' do
|
190
|
+
controller.params[:from] = '2011-03-15'
|
191
|
+
|
192
|
+
controller.send(:guess_from_thru)
|
193
|
+
assigns[:stat_from].should == '2011-03-15'.to_date
|
194
|
+
assigns[:stat_thru].should == '2011-03-21'.to_date
|
195
|
+
assigns[:stat_step].should == 1.hour
|
196
|
+
end
|
197
|
+
|
198
|
+
it 'should assign sane values with from thru' do
|
199
|
+
controller.params[:thru] = '2009-08-15'
|
200
|
+
|
201
|
+
controller.send(:guess_from_thru)
|
202
|
+
assigns[:stat_from].should == '2009-08-09'.to_date
|
203
|
+
assigns[:stat_thru].should == '2009-08-15'.to_date
|
204
|
+
assigns[:stat_step].should == 1.hour
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Gricer::CaptureController do
|
4
|
+
context 'index' do
|
5
|
+
it 'should handle proper request' do
|
6
|
+
gricer_session = mock_model(Gricer::Session)
|
7
|
+
gricer_request = mock_model(Gricer::Request, session: gricer_session)
|
8
|
+
controller.stub(:session) { { gricer_session: 42 } }
|
9
|
+
Gricer::Session.should_receive(:find_by_id).with(42) { gricer_session }
|
10
|
+
Gricer::Request.should_receive(:find_by_id).with('23') { gricer_request }
|
11
|
+
|
12
|
+
gricer_session.should_receive(:javascript=).with(true)
|
13
|
+
gricer_session.should_receive(:java=).with('true')
|
14
|
+
gricer_session.should_receive(:flash_version=).with('10.0 r45')
|
15
|
+
gricer_session.should_receive(:silverlight_version=).with('4.0.51204.0')
|
16
|
+
gricer_session.should_receive(:screen_width=).with('1024')
|
17
|
+
gricer_session.should_receive(:screen_height=).with('768')
|
18
|
+
gricer_session.should_receive(:screen_size=).with('1024x768')
|
19
|
+
gricer_session.should_receive(:screen_depth=).with('8')
|
20
|
+
|
21
|
+
gricer_session.should_receive(:save) { true }
|
22
|
+
|
23
|
+
gricer_request.should_receive(:javascript=).with(true)
|
24
|
+
gricer_request.should_receive(:window_width=).with('800')
|
25
|
+
gricer_request.should_receive(:window_height=).with('600')
|
26
|
+
|
27
|
+
gricer_request.should_receive(:save) { true }
|
28
|
+
|
29
|
+
xhr(
|
30
|
+
:post,
|
31
|
+
:index,
|
32
|
+
id: '23',
|
33
|
+
f: '10.0 r45',
|
34
|
+
j: 'true',
|
35
|
+
sl: '4.0.51204.0',
|
36
|
+
sx: '1024',
|
37
|
+
sy: '768',
|
38
|
+
sd: '8',
|
39
|
+
wx: '800',
|
40
|
+
wy: '600'
|
41
|
+
)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|