methodmissing-scrooge 1.0.0
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/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
|