methodmissing-scrooge 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +262 -0
- data/lib/scrooge/core/string.rb +29 -0
- data/lib/scrooge/core/symbol.rb +21 -0
- data/lib/scrooge/core/thread.rb +26 -0
- data/lib/scrooge/framework/base.rb +304 -0
- data/lib/scrooge/framework/rails.rb +107 -0
- data/lib/scrooge/middleware/tracker.rb +47 -0
- data/lib/scrooge/orm/active_record.rb +143 -0
- data/lib/scrooge/orm/base.rb +102 -0
- data/lib/scrooge/profile.rb +204 -0
- data/lib/scrooge/storage/base.rb +47 -0
- data/lib/scrooge/storage/memory.rb +25 -0
- data/lib/scrooge/tracker/app.rb +101 -0
- data/lib/scrooge/tracker/base.rb +56 -0
- data/lib/scrooge/tracker/model.rb +90 -0
- data/lib/scrooge/tracker/resource.rb +201 -0
- data/lib/scrooge.rb +62 -0
- data/spec/fixtures/config/scrooge/scopes/1234567891/scope.yml +2 -0
- data/spec/fixtures/config/scrooge.yml +12 -0
- data/spec/helpers/framework/rails/cache.rb +25 -0
- data/spec/spec_helper.rb +51 -0
- data/spec/units/scrooge/core/string_spec.rb +21 -0
- data/spec/units/scrooge/core/symbol_spec.rb +13 -0
- data/spec/units/scrooge/core/thread_spec.rb +15 -0
- data/spec/units/scrooge/framework/base_spec.rb +154 -0
- data/spec/units/scrooge/framework/rails_spec.rb +40 -0
- data/spec/units/scrooge/orm/base_spec.rb +61 -0
- data/spec/units/scrooge/profile_spec.rb +73 -0
- data/spec/units/scrooge/storage/base_spec.rb +35 -0
- data/spec/units/scrooge/storage/memory_spec.rb +20 -0
- data/spec/units/scrooge/tracker/app_spec.rb +62 -0
- data/spec/units/scrooge/tracker/base_spec.rb +21 -0
- data/spec/units/scrooge/tracker/model_spec.rb +50 -0
- data/spec/units/scrooge/tracker/resource_spec.rb +83 -0
- data/spec/units/scrooge_spec.rb +13 -0
- metadata +110 -0
@@ -0,0 +1,154 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
describe "Scrooge::Framework::Base singleton" do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@base = Scrooge::Framework::Base
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should be able to track all available frameworks" do
|
10
|
+
@base.frameworks.should include( Scrooge::Framework::Rails )
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should be able to infer the current active framework" do
|
14
|
+
lambda{ @base.which_framework? }.should raise_error( Scrooge::Framework::Base::NoSupportedFrameworks )
|
15
|
+
with_rails do
|
16
|
+
@base.which_framework?().should equal( Scrooge::Framework::Rails )
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should be able to instantiate the active framework" do
|
21
|
+
with_rails do
|
22
|
+
@base.instantiate.class.should equal( Scrooge::Framework::Rails )
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
describe Scrooge::Framework::Base do
|
29
|
+
|
30
|
+
before(:each) do
|
31
|
+
@base = Scrooge::Framework::Base.new
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should be able to yield it's environment" do
|
35
|
+
lambda{ @base.environment }.should raise_error( Scrooge::Framework::Base::NotImplemented )
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should be able to yield it's root path" do
|
39
|
+
lambda{ @base.root }.should raise_error( Scrooge::Framework::Base::NotImplemented )
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should be able to setup a resource tracker instance from given status, headers and body" do
|
43
|
+
lambda{ @base.resource( {} ) }.should raise_error( Scrooge::Framework::Base::NotImplemented )
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should be able to yield it's temp path" do
|
47
|
+
lambda{ @base.tmp }.should raise_error( Scrooge::Framework::Base::NotImplemented )
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should be able to yield it's configuration path" do
|
51
|
+
lambda{ @base.config }.should raise_error( Scrooge::Framework::Base::NotImplemented )
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should be able to yield it's logger" do
|
55
|
+
lambda{ @base.logger }.should raise_error( Scrooge::Framework::Base::NotImplemented )
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should be able to read from the framework's cache store" do
|
59
|
+
lambda{ @base.read_cache( 'storage' ) }.should raise_error( Scrooge::Framework::Base::NotImplemented )
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should be able to write to the framework's cache store" do
|
63
|
+
lambda{ @base.write_cache( 'storage', 'payload' ) }.should raise_error( Scrooge::Framework::Base::NotImplemented )
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should be able to yield a scopes path" do
|
67
|
+
with_rails do
|
68
|
+
@base.stub!(:config).and_return( CONFIG )
|
69
|
+
@base.scopes_path.should match( /config\/scrooge\/scopes/ )
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should be able to infer all available scopes" do
|
74
|
+
with_rails do
|
75
|
+
@base.stub!(:config).and_return( CONFIG )
|
76
|
+
@base.send( :ensure_scopes_path )
|
77
|
+
@signature = Time.now.to_i.to_s
|
78
|
+
FileUtils.mkdir_p( File.join( @base.scopes_path, @signature ) )
|
79
|
+
@base.scopes.should include( @signature )
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should be able to determine if there's any previously persisted scopes" do
|
84
|
+
with_rails do
|
85
|
+
@base.stub!(:config).and_return( CONFIG )
|
86
|
+
@base.send( :ensure_scopes_path )
|
87
|
+
@base.scopes?().should eql( true )
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should be able to infer the path to a given scope" do
|
92
|
+
with_rails do
|
93
|
+
@base.stub!(:config).and_return( CONFIG )
|
94
|
+
@base.scope_path( '1234567891' ).should match( /scopes\/1234567891/ )
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should be able to determine if a given scope is defined" do
|
99
|
+
with_rails do
|
100
|
+
@base.stub!(:config).and_return( CONFIG )
|
101
|
+
@base.scope?( 9876543211 ).should equal( false )
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should be able to dump the current application tracker to a scope" do
|
106
|
+
with_rails do
|
107
|
+
@base.stub!(:config).and_return( CONFIG )
|
108
|
+
::Rails.stub!(:env).and_return( "test" )
|
109
|
+
lambda{ @base.to_scope! }.should change( @base.scopes, :size )
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
it "should be able to restore a previous scope to the current app tracker" do
|
114
|
+
with_rails do
|
115
|
+
@base.stub!(:config).and_return( CONFIG )
|
116
|
+
::Rails.stub!(:env).and_return( "test" )
|
117
|
+
@scope = @base.to_scope!
|
118
|
+
lambda{ @base.from_scope!( @scope ) }.should change( Scrooge::Base.profile.tracker, :object_id )
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
it "should be able to validate previously saved scope signatures" do
|
123
|
+
@base.stub!(:scope?).and_return(false)
|
124
|
+
lambda{ @base.from_scope!( 'undefined' ) }.should raise_error( Scrooge::Framework::Base::InvalidScopeSignature )
|
125
|
+
end
|
126
|
+
|
127
|
+
it "should be able to interact with the framework's Rack middleware" do
|
128
|
+
lambda{ @base.middleware }.should raise_error( Scrooge::Framework::Base::NotImplemented )
|
129
|
+
end
|
130
|
+
|
131
|
+
it "should be able to install tracking middleware" do
|
132
|
+
lambda{ @base.install_tracking_middleware() }.should raise_error( Scrooge::Framework::Base::NotImplemented )
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should be able to install scoping middleware" do
|
136
|
+
lambda{ @base.install_scope_middleware( 'tracker' ) }.should raise_error( Scrooge::Framework::Base::NotImplemented )
|
137
|
+
end
|
138
|
+
|
139
|
+
it "should be able to register code blocks to run after the framework has been initialized" do
|
140
|
+
lambda{ @base.initialized() }.should raise_error( Scrooge::Framework::Base::NotImplemented )
|
141
|
+
end
|
142
|
+
|
143
|
+
it "should be able to map a resource instance to a controller constant" do
|
144
|
+
lambda{ @base.controller( 'resource' ) }.should raise_error( Scrooge::Framework::Base::NotImplemented )
|
145
|
+
end
|
146
|
+
|
147
|
+
it "should be able to return a full path to the scrooge configuration file" do
|
148
|
+
with_rails do
|
149
|
+
@base.stub!(:config).and_return( CONFIG )
|
150
|
+
@base.configuration_file.should match( /scrooge.yml/ )
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
describe Scrooge::Framework::Rails do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@framework = Scrooge::Framework::Rails.new
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should be able to yield it's current environment" do
|
10
|
+
with_rails do
|
11
|
+
@framework.environment.should eql( 'test' )
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should be able to yield a logger" do
|
16
|
+
with_rails do
|
17
|
+
::Rails.stub!(:logger).and_return('')
|
18
|
+
( @framework.logger << 'entry' ).should eql( 'entry' )
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should be able to yield it's configuration" do
|
23
|
+
with_rails do
|
24
|
+
@framework.config.should match( /scrooge\/spec\/config/ )
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should be able to yield it's root path" do
|
29
|
+
with_rails do
|
30
|
+
@framework.root.should match( /scrooge\/spec/ )
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should be able to yield it's tmp path" do
|
35
|
+
with_rails do
|
36
|
+
@framework.tmp.should match( /scrooge\/spec\/tmp/ )
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
describe "Scrooge::Orm::Base singleton" do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@base = Scrooge::Orm::Base
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should be able to instantiate a supported ORM from a given ORM signature" do
|
10
|
+
@base.instantiate( :active_record ).class.should equal(Scrooge::Orm::ActiveRecord)
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
describe Scrooge::Orm::Base do
|
16
|
+
|
17
|
+
before(:each) do
|
18
|
+
@tracker = mock('tracker')
|
19
|
+
@tracker.stub!(:signature).and_return( 'tracker' )
|
20
|
+
@base = Scrooge::Orm::Base.new
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should be able to scope to a given resource tracker" do
|
24
|
+
lambda{ @base.scope_to( 'resource_tracker_instance' ) }.should raise_error( Scrooge::Orm::Base::NotImplemented )
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should be able to generate a name for a given model" do
|
28
|
+
lambda{ @base.name( 'model' ) }.should raise_error( Scrooge::Orm::Base::NotImplemented )
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should be able to generate a table name for a given model" do
|
32
|
+
lambda{ @base.table_name( 'model' ) }.should raise_error( Scrooge::Orm::Base::NotImplemented )
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should be able to generate a primary key for a given model" do
|
36
|
+
lambda{ @base.primary_key( 'model' ) }.should raise_error( Scrooge::Orm::Base::NotImplemented )
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should be able to generate a per resource scope method" do
|
40
|
+
@base.resource_scope_method( @tracker ).should eql( :scope_to_tracker )
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should be able to determine if a given scope method has already been defined" do
|
44
|
+
@base.resource_scope_method?( @tracker, @tracker.class ).should equal( false )
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should be able to infer the current trackable resource" do
|
48
|
+
Thread.current[:scrooge_resource] = 'resource'
|
49
|
+
@base.resource().should eql( 'resource' )
|
50
|
+
Thread.current[:scrooge_resource] = nil
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should be able to determine if it's within the context of a trackable resource" do
|
54
|
+
@base.resource?().should eql( false )
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should be able to determine if it should track attribute access" do
|
58
|
+
@base.track?().should equal( false )
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
describe "Scrooge::Profile singleton" do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@profile = Scrooge::Profile
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should be able to instantiate it self from a given config path and environment" do
|
10
|
+
@profile.setup( File.join( FIXTURES, 'config', 'scrooge.yml' ), :production ).class.should equal( Scrooge::Profile )
|
11
|
+
@profile.setup( File.join( FIXTURES, 'config', 'scrooge.yml' ), :test ).options['orm'].should equal( :active_record )
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "Scrooge::Profile instance" do
|
17
|
+
|
18
|
+
before(:each) do
|
19
|
+
@profile = Scrooge::Profile.setup( File.join( FIXTURES, 'config', 'scrooge.yml' ), :production )
|
20
|
+
@profile.framework.stub!(:scopes).and_return( %w(1234567891) )
|
21
|
+
@profile.options = { 'scope' => '1234567891'}
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should return a valid ORM instance" do
|
25
|
+
@profile.orm.class.should equal( Scrooge::Orm::ActiveRecord )
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should return a valid storage instance" do
|
29
|
+
@profile.storage.class.should equal( Scrooge::Storage::Memory )
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should return a valid framework instance" do
|
33
|
+
with_rails do
|
34
|
+
@profile.framework.class.should equal( Scrooge::Framework::Rails )
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should return a valid tracker instance" do
|
39
|
+
@profile.tracker.class.should equal( Scrooge::Tracker::App )
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should be able to determine if the active profile should track or scope" do
|
43
|
+
@profile.track?().should equal( false )
|
44
|
+
@profile.scope?().should equal( false )
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should be able to infer the current scope" do
|
48
|
+
@profile.scope_to.should eql( "1234567891" )
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should be able to determine if it's enabled" do
|
52
|
+
@profile.enabled?().should eql( false )
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should neither track or scope if not enabled" do
|
56
|
+
@profile.should_receive(:track!).never
|
57
|
+
@profile.should_receive(:scope!).never
|
58
|
+
@profile.stub!(:enabled?).and_return(false)
|
59
|
+
@profile.track_or_scope!
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should be able to determine if it should raise on missing attributes" do
|
63
|
+
@profile.raise_on_missing_attribute?().should equal( false )
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should be able to fallback to scope from the environment if none given" do
|
67
|
+
@profile.framework.stub!(:scopes).and_return( [] )
|
68
|
+
ENV['scope'] = 'scope_from_env'
|
69
|
+
@profile.send(:configure!)
|
70
|
+
@profile.scope_to.should eql( 'scope_from_env' )
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
describe "Scrooge::Storage::Base singleton" do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@base = Scrooge::Storage::Base
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should be able to instantiate a storage backend from a given storage signature" do
|
10
|
+
@base.instantiate( :memory ).class.should equal(Scrooge::Storage::Memory)
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
describe Scrooge::Storage::Base do
|
16
|
+
|
17
|
+
before(:each) do
|
18
|
+
@base = Scrooge::Storage::Base.new
|
19
|
+
@tracker = mock('tracker')
|
20
|
+
@tracker.stub!(:signature).and_return('signature')
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should be able to read from the storage backend" do
|
24
|
+
lambda{ @base.read( @tracker ) }.should raise_error( Scrooge::Storage::Base::NotImplemented )
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should be able to write to the storage backend" do
|
28
|
+
lambda{ @base.write( @tracker ) }.should raise_error( Scrooge::Storage::Base::NotImplemented )
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should be able to yield a namespaced storage key" do
|
32
|
+
@base.expand_key( "signature" ).should eql( "scrooge_storage/signature" )
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
describe Scrooge::Storage::Memory do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@memory = Scrooge::Storage::Memory.new
|
7
|
+
@tracker = mock('tracker')
|
8
|
+
@tracker.stub!(:signature).and_return('signature')
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should be able to write a tracker to memory" do
|
12
|
+
lambda { @memory.write( @tracker ) }.should change( @memory.storage, :size ).from(0).to(1)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should be able to read itself from memory" do
|
16
|
+
@memory.write( @tracker )
|
17
|
+
@memory.read( @tracker ).should eql( @tracker )
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
describe Scrooge::Tracker::App do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@app = Scrooge::Tracker::App.new
|
7
|
+
@resource = Scrooge::Tracker::Resource.new do |resource|
|
8
|
+
resource.controller = 'products'
|
9
|
+
resource.action = 'show'
|
10
|
+
resource.method = :get
|
11
|
+
resource.format = :html
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should be able to determine if any resources has been tracked" do
|
16
|
+
@app.any?().should equal( false )
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should initialize with an empty set of resources" do
|
20
|
+
@app.resources.should eql( Set.new )
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should be able to accept resources" do
|
24
|
+
lambda { @app << 'a_resource' }.should change( @app.resources, :size ).from(0).to(1)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should be able to dump itself to a serializeable representation" do
|
28
|
+
@app << @resource
|
29
|
+
with_rails do
|
30
|
+
@app.marshal_dump().should eql( [ { "products_show_get" => { :method => :get,
|
31
|
+
:models => [],
|
32
|
+
:format => :html,
|
33
|
+
:action => "show",
|
34
|
+
:controller => "products" } } ] )
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should be able to restore itself from a serialized representation" do
|
39
|
+
@app << @resource
|
40
|
+
with_rails do
|
41
|
+
Marshal.load( Marshal.dump( @app ) ).should eql( @app )
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should be able to compare itself to other app trackers" do
|
46
|
+
with_rails do
|
47
|
+
@app.should eql( @app )
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should implemented a custom Object#inspect" do
|
52
|
+
@app << @resource
|
53
|
+
@app.inspect().should match( /GET/ )
|
54
|
+
@app.inspect().should match( /products/ )
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should be able to determine if a resource's been seen before" do
|
58
|
+
@app << @resource
|
59
|
+
@app.resource_for( @resource ).should eql( @resource )
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
describe Scrooge::Tracker::Base do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@base = Scrooge::Tracker::Base.new
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should have a numeric representation" do
|
10
|
+
@base.to_i.should equal(0)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should be able to dump itself to serializeable representation" do
|
14
|
+
lambda{ @base.marshal_dump }.should raise_error( Scrooge::Tracker::Base::NotImplemented )
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should be able to restore itself from a serializeable representation" do
|
18
|
+
lambda{ @base.marshal_load( '' ) }.should raise_error( Scrooge::Tracker::Base::NotImplemented )
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
describe Scrooge::Tracker::Model do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@model = Scrooge::Tracker::Model.new( 'Post' )
|
7
|
+
@model.stub!(:name).and_return( 'Product' )
|
8
|
+
@model.stub!(:table_name).and_return( 'products' )
|
9
|
+
@model.stub!(:primary_key).and_return( 'id' )
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should be able to determine if any attributes has been tracked" do
|
13
|
+
@model.any?().should equal( false )
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should initialize with an empty set of attributes" do
|
17
|
+
@model.attributes.should eql( Set.new )
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should be able to accept attributes" do
|
21
|
+
lambda { @model << :name }.should change( @model.attributes, :size ).from(0).to(1)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should be able to dump itself to a serializeable representation" do
|
25
|
+
@model << [:name, :description, :price]
|
26
|
+
@model.marshal_dump().should eql( { "Product" => [:price, :description, :name] } )
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should be able to restore itself from a serialized representation" do
|
30
|
+
@model << [:name, :description, :price]
|
31
|
+
lambda{ @model.marshal_load( { "Product" => [:price] } ) }.should change( @model.attributes, :size ).from(3).to(1)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should be able to render a attribute selection SQL snippet from it's referenced attributes" do
|
35
|
+
@model << [:name, :description, :price]
|
36
|
+
@model.to_sql().should eql( "products.id, products.price, products.description, products.name" )
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should be able to compare itself to other model trackers" do
|
40
|
+
@model << [:name, :description, :price]
|
41
|
+
@model.should eql( @model )
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should implemented a custom Object#inspect" do
|
45
|
+
@model << [:name, :description]
|
46
|
+
@model.inspect().should match( /Product/ )
|
47
|
+
@model.inspect().should match( /:name/ )
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
describe Scrooge::Tracker::Resource do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@resource = Scrooge::Tracker::Resource.new do |resource|
|
7
|
+
resource.controller = 'products'
|
8
|
+
resource.action = 'show'
|
9
|
+
resource.method = :get
|
10
|
+
resource.format = :html
|
11
|
+
end
|
12
|
+
@model = Scrooge::Tracker::Model.new( 'Class' )
|
13
|
+
@model.stub!(:name).and_return( 'Product' )
|
14
|
+
@model.stub!(:table_name).and_return( 'products' )
|
15
|
+
@model.stub!(:primary_key).and_return( 'id' )
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should be able to determine if any models has been tracked" do
|
19
|
+
@resource.any?().should equal( false )
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should initialize with an empty set of models" do
|
23
|
+
@resource.models.should eql( Set.new )
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should be able to accept models" do
|
27
|
+
lambda { @resource << @model }.should change( @resource.models, :size ).from(0).to(1)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should be able to wrap model objects" do
|
31
|
+
@resource << 'Model'
|
32
|
+
@resource.models.all?{|m| m.is_a?( Scrooge::Tracker::Model ) }.should equal( true )
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should be able to log an attribute access for a given model" do
|
36
|
+
@resource << ['Post', :title]
|
37
|
+
@resource.models.first.attributes.should eql( Set[:title] )
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should be able to determine if it's trackable" do
|
41
|
+
@resource.trackable?().should equal( true )
|
42
|
+
@resource.stub!(:method).and_return( :put )
|
43
|
+
@resource.trackable?().should equal( false )
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should be able to generate a lookup signature" do
|
47
|
+
@resource.signature().should eql( "products_show_get" )
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should be able to dump itself to a serializeable representation" do
|
51
|
+
@resource.marshal_dump().should eql( { "products_show_get" => { :models => [],
|
52
|
+
:method => :get,
|
53
|
+
:format => :html,
|
54
|
+
:action => "show",
|
55
|
+
:controller => "products"} } )
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should be able to restore itself from a serialized representation" do
|
59
|
+
Marshal.load( Marshal.dump( @resource ) ).should eql( @resource )
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should be able to compare itself to other resource trackers" do
|
63
|
+
@resource.should eql( @resource )
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should be able to setup Rack middleware" do
|
67
|
+
@resource.profile.orm.stub!(:resource_scope_method).and_return(:scoped_to_resource_method)
|
68
|
+
@resource << @model
|
69
|
+
@resource.middleware().class.should equal( Array )
|
70
|
+
@resource.middleware().first.class.should equal( Class )
|
71
|
+
@resource.middleware().first.inspect.should match( /Middleware/ )
|
72
|
+
@resource.middleware().first.inspect.should match( /Product/ )
|
73
|
+
@resource.middleware().first.new( @model ).should respond_to( :call )
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should implemented a custom Object#inspect" do
|
77
|
+
@resource << @model
|
78
|
+
@resource.inspect().should match( /GET/ )
|
79
|
+
@resource.inspect().should match( /products/ )
|
80
|
+
@resource.inspect().should match( /Product/ )
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|