fixjour 0.5.1 → 0.5.2

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.
@@ -0,0 +1,48 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe Fixjour::MergingProxy do
4
+ attr_reader :merger
5
+
6
+ before(:each) do
7
+ @merger = Fixjour::MergingProxy.new(Foo, :name => "MERGED!")
8
+ end
9
+
10
+ describe "#new" do
11
+ it "merges options with overrides" do
12
+ mock.proxy(defaults = { :name => "Pat" }).merge(:name => "MERGED!")
13
+ merger.new(defaults)
14
+ end
15
+
16
+ it "returns an instance of the klass with the merged options" do
17
+ merger.new(:name => "Pat").should be_kind_of(Foo)
18
+ end
19
+ end
20
+
21
+ describe "protected" do
22
+ it "stores the protected attributes" do
23
+ @merger.protected :name
24
+ @merger.protected.should == Set.new([:name])
25
+ end
26
+
27
+ it "sends values to instance" do
28
+ mock.proxy(Foo).new(:name => "MERGED!").never
29
+ mock.proxy(Foo).new({ }).once
30
+ @merger.protected :name
31
+ @merger.new(:name => "MERGED!").name.should == "MERGED!"
32
+ end
33
+ end
34
+
35
+ describe "proxying to klass" do
36
+ it "proxies other methods to klass" do
37
+ merger.superclass.should == ActsAsFu::Connection
38
+ end
39
+
40
+ it "proxies respond_to? to klass" do
41
+ merger.should respond_to(:superclass)
42
+ end
43
+
44
+ it "should keep its own inspect method" do
45
+ merger.inspect.should_not == Foo.inspect
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,61 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe Fixjour::OverridesHash do
4
+ attr_reader :overrides
5
+
6
+ before(:each) do
7
+ @overrides = Fixjour::OverridesHash.new(:name => "Pat")
8
+ end
9
+
10
+ it "inherits from Hash" do
11
+ Fixjour::OverridesHash.superclass.should == Hash
12
+ end
13
+
14
+ describe "#process" do
15
+ context "when the option isn't present" do
16
+ it "doesn't do anything" do
17
+ called = false
18
+ overrides.process(:not_there) do
19
+ called = true
20
+ end
21
+ called.should_not be
22
+ end
23
+
24
+ it "returns nil" do
25
+ overrides.process(:not_there).should be_nil
26
+ end
27
+ end
28
+
29
+ context "when the option is present" do
30
+ it "deletes the option from the hash" do
31
+ overrides.process(:name)
32
+ overrides.should_not have_key(:name)
33
+ end
34
+
35
+ it "passes the value to the block" do
36
+ overrides.process(:name) do |value|
37
+ value.should == "Pat"
38
+ end
39
+ end
40
+
41
+ it "allows values to be re-assigned in hash" do
42
+ overrides.process(:name) do |value|
43
+ overrides[:result] = value
44
+ end
45
+ overrides[:result].should == "Pat"
46
+ end
47
+
48
+ it "returns the value" do
49
+ overrides.process(:name).should == "Pat"
50
+ end
51
+ end
52
+ end
53
+
54
+ describe "#delete" do
55
+ it "is private" do
56
+ proc {
57
+ overrides.delete(:name)
58
+ }.should raise_error(NoMethodError, /private/)
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,90 @@
1
+ require 'rubygems'
2
+ require 'cgi'
3
+ require 'spec'
4
+ require 'faker'
5
+ require 'rr'
6
+
7
+ begin
8
+ require 'acts_as_fu'
9
+ rescue LoadError
10
+ puts "You need the acts_as_fu gem to run the specs."
11
+ exit!
12
+ end
13
+
14
+ require File.dirname(__FILE__) + '/../lib/fixjour'
15
+
16
+ def pre(*args)
17
+ args.each { |arg|
18
+ puts '<pre>' + CGI.escapeHTML(arg.is_a?(String) ? arg : arg.inspect) + '</pre>'
19
+ }
20
+ end
21
+
22
+ Spec::Runner.configure do |c|
23
+ c.mock_with(:rr)
24
+ end
25
+
26
+ include ActsAsFu
27
+
28
+ build_model(:foos) do
29
+ attr_accessor :bizzle
30
+
31
+ string :name
32
+ integer :age
33
+ integer :bar_id
34
+ integer :person_id
35
+
36
+ belongs_to :bar
37
+ belongs_to :owner, :foreign_key => :person_id, :class_name => 'Person'
38
+
39
+ validates_presence_of :bar, :message => "BAR AIN'T THURR"
40
+ validates_presence_of :name
41
+ end
42
+
43
+ build_model(:bars) do
44
+ string :name
45
+
46
+ has_many :people
47
+ has_many :foos
48
+ end
49
+
50
+ build_model(:bazzs) do
51
+ string :name
52
+ integer :bar_id
53
+
54
+ belongs_to :bar
55
+ end
56
+
57
+ build_model(:foo_bars) do
58
+ string :name
59
+ end
60
+
61
+ build_model(:people) do
62
+ string :first_name
63
+ string :last_name
64
+ integer :bar_id
65
+ end
66
+
67
+ def define_all_builders
68
+ Fixjour.builders.clear
69
+ Fixjour do
70
+ define_builder(Foo) do |klass, overrides|
71
+ klass.new({ :name => 'Foo Namery', :bar => new_bar, :owner => new_person }.merge(overrides))
72
+ end
73
+
74
+ define_builder(Bar) do |klass, overrides|
75
+ klass.new({ :name => "Bar Namery", :people => [new_person] }.merge(overrides))
76
+ end
77
+
78
+ define_builder(FooBar) do |klass, overrides|
79
+ klass.new(:name => "foobar-#{counter(:foobar)}")
80
+ end
81
+
82
+ define_builder(Bazz) do |klass|
83
+ klass.new(:name => "Bazz Namery")
84
+ end
85
+
86
+ define_builder Person do |klass|
87
+ klass.new
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,136 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe Fixjour, ".verify!" do
4
+ before(:each) do
5
+ define_all_builders
6
+ Fixjour.builders.clear
7
+ end
8
+
9
+ it "can take verify as an option" do
10
+ mock(Fixjour).verify!.once
11
+ Fixjour(:verify => true) { }
12
+ end
13
+
14
+ describe "clearing the transaction" do
15
+ before(:each) do
16
+ Fixjour do
17
+ define_builder(Foo) { |overrides| Foo.new(:name => 'ok', :bar => new_bar) }
18
+ end
19
+ end
20
+
21
+ it "rolls back the transaction" do
22
+ proc {
23
+ Fixjour.verify!
24
+ }.should_not change(Foo, :count)
25
+ end
26
+ end
27
+
28
+ context "when the builder returns an invalid object" do
29
+ context "when the validations are not related to uniqueness" do
30
+ before(:each) do
31
+ Fixjour do
32
+ define_builder(Foo) { |overrides| Foo.new(:bar => nil) }
33
+ end
34
+ end
35
+
36
+ it "raises InvalidBuilder" do
37
+ proc {
38
+ Fixjour.verify!
39
+ }.should raise_error(Fixjour::InvalidBuilder)
40
+ end
41
+
42
+ it "includes information about the failure" do
43
+ proc {
44
+ Fixjour.verify!
45
+ }.should raise_error(/BAR AIN'T THURR/)
46
+ end
47
+ end
48
+
49
+ context "when the validations are related to uniqueness" do
50
+ before(:each) do
51
+ Bar.delete_all
52
+ Bar.validates_uniqueness_of :name
53
+ Fixjour do
54
+ define_builder(Bar) { |overrides| Bar.new(:name => "percy") }
55
+ end
56
+ end
57
+
58
+ it "raises DangerousBuilder" do
59
+ proc {
60
+ Fixjour.verify!
61
+ }.should raise_error(Fixjour::DangerousBuilder)
62
+ end
63
+
64
+ it "includes information about the failure" do
65
+ proc {
66
+ Fixjour.verify!
67
+ }.should raise_error(/uniqueness/)
68
+ end
69
+ end
70
+ end
71
+
72
+ context "when the builder returns an object that cannot be saved" do
73
+ before(:each) do
74
+ Fixjour.builders.clear
75
+
76
+ klass = build_model(:bars) {
77
+ string :name
78
+ has_many :people
79
+ }
80
+
81
+ bar_bomb = Object.new
82
+ stub(bar_bomb).save! { raise ActiveRecord::StatementInvalid.new("oops!") }
83
+ stub(bar_bomb).valid? { true }
84
+ stub(bar_bomb).new_record? { true }
85
+ stub(bar_bomb).is_a?(Bar) { true }
86
+
87
+ stub(Fixjour).new_record(anything) { bar_bomb }
88
+
89
+ Fixjour do
90
+ define_builder(klass) { |overrides| klass.new }
91
+ end
92
+ end
93
+
94
+ it "raises UnsavableBuilder" do
95
+ proc {
96
+ Fixjour.verify!
97
+ }.should raise_error(Fixjour::UnsavableBuilder)
98
+ end
99
+
100
+ it "includes information about the failure" do
101
+ proc {
102
+ Fixjour.verify!
103
+ }.should raise_error(/ActiveRecord::StatementInvalid/)
104
+ end
105
+ end
106
+
107
+ context "when the builder saves the object" do
108
+ before(:each) do
109
+ Fixjour do
110
+ define_builder(Foo) do |overrides|
111
+ Foo.create(:name => 'saved!', :bar => new_bar)
112
+ end
113
+ end
114
+ end
115
+
116
+ it "raises BuilderSavedRecord" do
117
+ proc {
118
+ Fixjour.verify!
119
+ }.should raise_error(Fixjour::BuilderSavedRecord)
120
+ end
121
+ end
122
+
123
+ context "when the object is not the correct type" do
124
+ before(:each) do
125
+ Fixjour do
126
+ define_builder(Foo) { |overrides| Bar.new(:name => 'saved!') }
127
+ end
128
+ end
129
+
130
+ it "raises WrongBuilderType" do
131
+ proc {
132
+ Fixjour.verify!
133
+ }.should raise_error(Fixjour::WrongBuilderType)
134
+ end
135
+ end
136
+ end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fixjour
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 15
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
8
  - 5
8
- - 1
9
- version: 0.5.1
9
+ - 2
10
+ version: 0.5.2
10
11
  platform: ruby
11
12
  authors:
12
13
  - Pat Nakajima
@@ -21,9 +22,11 @@ dependencies:
21
22
  name: activerecord
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
27
  - - ">="
26
28
  - !ruby/object:Gem::Version
29
+ hash: 3
27
30
  segments:
28
31
  - 0
29
32
  version: "0"
@@ -33,9 +36,11 @@ dependencies:
33
36
  name: faker
34
37
  prerelease: false
35
38
  requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
36
40
  requirements:
37
41
  - - ">="
38
42
  - !ruby/object:Gem::Version
43
+ hash: 3
39
44
  segments:
40
45
  - 0
41
46
  version: "0"
@@ -45,9 +50,11 @@ dependencies:
45
50
  name: acts_as_fu
46
51
  prerelease: false
47
52
  requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
48
54
  requirements:
49
55
  - - ">="
50
56
  - !ruby/object:Gem::Version
57
+ hash: 3
51
58
  segments:
52
59
  - 0
53
60
  version: "0"
@@ -62,21 +69,33 @@ extensions: []
62
69
  extra_rdoc_files: []
63
70
 
64
71
  files:
72
+ - README.textile
73
+ - Rakefile
74
+ - fixjour.gemspec
65
75
  - lib/core_ext/hash.rb
66
76
  - lib/core_ext/object.rb
77
+ - lib/fixjour.rb
67
78
  - lib/fixjour/builder.rb
68
79
  - lib/fixjour/builders.rb
69
80
  - lib/fixjour/counter.rb
81
+ - lib/fixjour/define.rb
70
82
  - lib/fixjour/definitions.rb
71
83
  - lib/fixjour/deprecation.rb
72
- - lib/fixjour/define.rb
73
84
  - lib/fixjour/errors.rb
74
85
  - lib/fixjour/generator.rb
75
86
  - lib/fixjour/merging_proxy.rb
76
87
  - lib/fixjour/overrides_hash.rb
77
88
  - lib/fixjour/redundant_check.rb
78
89
  - lib/fixjour/verify.rb
79
- - lib/fixjour.rb
90
+ - spec/builder_spec.rb
91
+ - spec/define_spec.rb
92
+ - spec/dev.rip
93
+ - spec/edge_cases_spec.rb
94
+ - spec/fixjour_spec.rb
95
+ - spec/merging_proxy_spec.rb
96
+ - spec/overrides_hash_spec.rb
97
+ - spec/spec_helper.rb
98
+ - spec/verify_spec.rb
80
99
  has_rdoc: true
81
100
  homepage: http://github.com/nakajima/fixjour
82
101
  licenses: []
@@ -87,23 +106,27 @@ rdoc_options: []
87
106
  require_paths:
88
107
  - lib
89
108
  required_ruby_version: !ruby/object:Gem::Requirement
109
+ none: false
90
110
  requirements:
91
111
  - - ">="
92
112
  - !ruby/object:Gem::Version
113
+ hash: 3
93
114
  segments:
94
115
  - 0
95
116
  version: "0"
96
117
  required_rubygems_version: !ruby/object:Gem::Requirement
118
+ none: false
97
119
  requirements:
98
120
  - - ">="
99
121
  - !ruby/object:Gem::Version
122
+ hash: 3
100
123
  segments:
101
124
  - 0
102
125
  version: "0"
103
126
  requirements: []
104
127
 
105
128
  rubyforge_project:
106
- rubygems_version: 1.3.6
129
+ rubygems_version: 1.3.7
107
130
  signing_key:
108
131
  specification_version: 2
109
132
  summary: Object creation methods everyone already has