blueprints_boy 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +20 -0
  5. data/Appraisals +37 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE +20 -0
  8. data/README.md +26 -0
  9. data/Rakefile +76 -0
  10. data/blueprints_boy.gemspec +27 -0
  11. data/gemfiles/ar3.1.gemfile +8 -0
  12. data/gemfiles/ar3.2.gemfile +8 -0
  13. data/gemfiles/ar4.0.gemfile +8 -0
  14. data/gemfiles/ar4.1.gemfile +8 -0
  15. data/gemfiles/mongoid2.gemfile +8 -0
  16. data/gemfiles/mongoid3.gemfile +8 -0
  17. data/gemfiles/mongoid4.gemfile +8 -0
  18. data/gemfiles/noorm.gemfile +5 -0
  19. data/integration/active_record/active_record_spec.rb +38 -0
  20. data/integration/active_record/active_record_truncation_spec.rb +26 -0
  21. data/integration/active_record/blueprints.rb +1 -0
  22. data/integration/active_record/setup.rb +8 -0
  23. data/integration/cucumber/blueprints.feature +20 -0
  24. data/integration/cucumber/step_definitions/blueprints_steps.rb +17 -0
  25. data/integration/cucumber/support/env.rb +11 -0
  26. data/integration/minitest/blueprints.rb +11 -0
  27. data/integration/minitest/test_minispec.rb +41 -0
  28. data/integration/minitest/test_minitest.rb +28 -0
  29. data/integration/mongoid/blueprints.rb +1 -0
  30. data/integration/mongoid/mongoid_spec.rb +50 -0
  31. data/integration/rspec/blueprints.rb +13 -0
  32. data/integration/rspec/rspec_spec.rb +113 -0
  33. data/integration/shared.rb +9 -0
  34. data/lib/blueprints_boy/blueprint.rb +59 -0
  35. data/lib/blueprints_boy/configuration.rb +48 -0
  36. data/lib/blueprints_boy/context.rb +53 -0
  37. data/lib/blueprints_boy/dependency.rb +23 -0
  38. data/lib/blueprints_boy/errors.rb +10 -0
  39. data/lib/blueprints_boy/factories.rb +18 -0
  40. data/lib/blueprints_boy/helper.rb +47 -0
  41. data/lib/blueprints_boy/integration/active_record.rb +11 -0
  42. data/lib/blueprints_boy/integration/cucumber.rb +9 -0
  43. data/lib/blueprints_boy/integration/minitest.rb +23 -0
  44. data/lib/blueprints_boy/integration/mongoid.rb +11 -0
  45. data/lib/blueprints_boy/integration/rspec.rb +20 -0
  46. data/lib/blueprints_boy/manager.rb +87 -0
  47. data/lib/blueprints_boy/railtie.rb +24 -0
  48. data/lib/blueprints_boy/registry.rb +28 -0
  49. data/lib/blueprints_boy/version.rb +3 -0
  50. data/lib/blueprints_boy.rb +62 -0
  51. data/spec/spec_helper.rb +25 -0
  52. data/spec/support/empty_file.rb +0 -0
  53. data/spec/support/fixtures.rb +41 -0
  54. data/spec/support/manager_fixture.rb +3 -0
  55. data/spec/unit/blueprint_spec.rb +102 -0
  56. data/spec/unit/blueprints_boy_spec.rb +15 -0
  57. data/spec/unit/configuration_spec.rb +41 -0
  58. data/spec/unit/context_spec.rb +145 -0
  59. data/spec/unit/dependency_spec.rb +56 -0
  60. data/spec/unit/factories_spec.rb +27 -0
  61. data/spec/unit/manager_spec.rb +122 -0
  62. data/spec/unit/registry_spec.rb +47 -0
  63. metadata +189 -0
@@ -0,0 +1,25 @@
1
+ require 'rspec'
2
+ require 'blueprints_boy'
3
+
4
+ ROOT = Pathname.new('../../').expand_path(__FILE__)
5
+
6
+ require_relative 'support/fixtures'
7
+
8
+ RSpec.configure do |config|
9
+ config.include Fixtures
10
+
11
+ config.after do
12
+ BlueprintsBoy.instance_eval do
13
+ @manager = nil
14
+ @config = nil
15
+ @factories = nil
16
+ end
17
+ end
18
+
19
+ config.expect_with :rspec do |c|
20
+ c.syntax = :should, :expect
21
+ end
22
+ config.mock_with :rspec do |c|
23
+ c.syntax = :should, :expect
24
+ end
25
+ end
File without changes
@@ -0,0 +1,41 @@
1
+ module Fixtures
2
+ def self.fixture(name, &block)
3
+ iv_name = :"@#{name}"
4
+ define_method(name) do |*args|
5
+ instance_variable_set(iv_name, instance_exec(*args, &block)) unless instance_variable_defined?(iv_name)
6
+ instance_variable_get(iv_name)
7
+ end
8
+ end
9
+
10
+ def create_env(klass)
11
+ klass.new.tap do |object|
12
+ object.extend(BlueprintsBoy::Helper)
13
+ object.instance_variable_set(:@_blueprint_data, {})
14
+ end
15
+ end
16
+
17
+ def create_blueprint(name, &block)
18
+ BlueprintsBoy::Blueprint.new(empty_context, name, &block)
19
+ end
20
+
21
+ fixture :env do
22
+ create_env(Object)
23
+ end
24
+
25
+ [1, 2, 3].each do |n|
26
+ fixture("mock#{n}") { "mock#{n}" }
27
+
28
+ fixture "blueprint#{n}" do |result|
29
+ result ||= send("mock#{n}")
30
+ create_blueprint("blueprint#{n}") { result }
31
+ end
32
+ end
33
+
34
+ fixture :manager do
35
+ BlueprintsBoy::Manager.new
36
+ end
37
+
38
+ fixture :empty_context do
39
+ BlueprintsBoy::Context.new(ROOT.join('spec/support/empty_file.rb').to_s)
40
+ end
41
+ end
@@ -0,0 +1,3 @@
1
+ blueprint :test do
2
+ nil
3
+ end
@@ -0,0 +1,102 @@
1
+ require 'spec_helper'
2
+
3
+ describe BlueprintsBoy::Blueprint do
4
+ describe "name" do
5
+ it "should return name" do
6
+ blueprint1.name.should == :blueprint1
7
+ end
8
+ end
9
+
10
+ describe "build" do
11
+ it "should build blueprint" do
12
+ blueprint1.build(env, :create)
13
+ env.blueprint1.should == mock1
14
+ end
15
+
16
+ it "should not replace existing method" do
17
+ env.set :blueprint1, :correct
18
+ blueprint1.build(env, :create)
19
+ env.blueprint1.should == :correct
20
+ end
21
+ end
22
+
23
+ describe "depends_on" do
24
+ it "should return blueprint" do
25
+ blueprint1.depends_on(:blueprint2).should equal(blueprint1)
26
+ end
27
+
28
+ it "should allow setting dependencies" do
29
+ blueprint1.depends_on(:blueprint2)
30
+ blueprint1.context.dependencies.should == [:blueprint2]
31
+ end
32
+ end
33
+
34
+ describe "attributes & options" do
35
+ it "should allow creating blueprint with attributes" do
36
+ blueprint = described_class.new(empty_context, :blueprint, attr: 'value')
37
+ blueprint.context.attrs.should == {attr: 'value'}
38
+ end
39
+
40
+ it "should adding attributes to blueprint later" do
41
+ blueprint = described_class.new(empty_context, :blueprint).attributes(attr: 'value')
42
+ blueprint.context.attrs.should == {attr: 'value'}
43
+ end
44
+
45
+ it "should allow passing options" do
46
+ blueprint = described_class.new(empty_context, :blueprint) { |data| data.options }
47
+ blueprint.build(env, :create, attr: 'value')
48
+ env.blueprint.should == {attr: 'value'}
49
+ end
50
+
51
+ it "should allow using attributes with merged options in blueprint" do
52
+ blueprint = described_class.new(empty_context, :blueprint, attr1: 'value1', attr2: 'value2') { |data| data.attributes }
53
+ blueprint.build(env, :create, attr2: 'v2', attr3: 'v3')
54
+ env.blueprint.should == {attr1: 'value1', attr2: 'v2', attr3: 'v3'}
55
+ end
56
+
57
+ it "should use normalized attributes when building" do
58
+ BlueprintsBoy.manager.add blueprint1
59
+ BlueprintsBoy.manager.setup(env)
60
+ blueprint = described_class.new(empty_context, :blueprint, attr: empty_context.blueprint1) { |data| data.attributes }
61
+ blueprint.build(env, :create)
62
+ env.blueprint.should == {attr: mock1}
63
+ end
64
+ end
65
+
66
+ describe "name" do
67
+ it "should put name in data" do
68
+ blueprint = create_blueprint(:blueprint1) { |data| data.name }
69
+ blueprint.build(env, :create)
70
+ env.blueprint1.should == :blueprint1
71
+ end
72
+ end
73
+
74
+ describe "strategies" do
75
+ it "should allow having multiple strategies" do
76
+ blueprint1.blueprint(:options) { |data| data.options }
77
+ blueprint1.build(env, :options, option: 'val')
78
+ env.blueprint1.should == {option: 'val'}
79
+ end
80
+
81
+ it "should have attributes strategy" do
82
+ blueprint1.attributes(attr: 'val')
83
+ blueprint1.build(env, :attributes)
84
+ env.blueprint1.should == {attr: 'val'}
85
+ end
86
+
87
+ it "should raise error if blueprint doesn't define strategy" do
88
+ expect {
89
+ blueprint1.build(env, :not_existing_strategy)
90
+ }.to raise_error(BlueprintsBoy::StrategyNotFound, 'Blueprint :blueprint1 does not define strategy :not_existing_strategy')
91
+ end
92
+ end
93
+
94
+ describe "factory" do
95
+ it "should use factory when building blueprint" do
96
+ BlueprintsBoy.factories.add(Array, :create) { |data| data.factory.new(data.attributes[:size]) }
97
+ blueprint = create_blueprint('blueprint1').factory(Array)
98
+ blueprint.build(env, :create, size: 3)
99
+ env.blueprint1.should == Array.new(3)
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe BlueprintsBoy do
4
+ it "should return manager" do
5
+ BlueprintsBoy.manager.should be_instance_of(BlueprintsBoy::Manager)
6
+ end
7
+
8
+ it "should return configuration" do
9
+ BlueprintsBoy.config.should be_instance_of(BlueprintsBoy::Configuration)
10
+ end
11
+
12
+ it "should return factories" do
13
+ BlueprintsBoy.factories.should be_instance_of(BlueprintsBoy::Factories)
14
+ end
15
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe BlueprintsBoy::Configuration do
4
+ it "should have filename with default value" do
5
+ subject.filenames.should == %w{blueprints.rb blueprints/*.rb spec/blueprints.rb spec/blueprints/*.rb test/blueprints.rb test/blueprints/*.rb}.collect do |f|
6
+ Pathname.new(f)
7
+ end
8
+ end
9
+
10
+ it "should have correct attribute values" do
11
+ subject.prebuild.should == []
12
+ subject.transactions.should be_truthy
13
+ subject.root.should == Pathname.pwd
14
+ end
15
+
16
+ it "should use Rails root for root if it's defined" do
17
+ module Rails
18
+ def self.root
19
+ Pathname.new('rails/root')
20
+ end
21
+ end
22
+ subject.root.should == Pathname.new('rails/root')
23
+ Object.send(:remove_const, :Rails)
24
+ end
25
+
26
+ it "should set root to pathname" do
27
+ subject.root = "root"
28
+ subject.root.should == Pathname.new("root")
29
+ end
30
+
31
+ it "should automatically set filename to array of path names" do
32
+ subject.filenames = "my_file.rb"
33
+ subject.filenames.should == [Pathname.new("my_file.rb")]
34
+ end
35
+
36
+ it "should set global to array of global blueprints" do
37
+ subject.global.should == []
38
+ subject.global = :cherry
39
+ subject.global.should == [:cherry]
40
+ end
41
+ end
@@ -0,0 +1,145 @@
1
+ require 'spec_helper'
2
+
3
+ describe BlueprintsBoy::Context do
4
+ let :manager do
5
+ BlueprintsBoy::Manager.new
6
+ end
7
+
8
+ describe "initialize" do
9
+ it "should read file and callback for each blueprint" do
10
+ blueprints = []
11
+ described_class.new(ROOT.join('spec/support/manager_fixture.rb').to_s) { |blueprint| blueprints << blueprint }
12
+ blueprints.size.should == 1
13
+ blueprints.first.name.should == :test
14
+ end
15
+ end
16
+
17
+ describe "blueprint" do
18
+ it "should add new blueprint" do
19
+ blueprint = empty_context.blueprint(:blueprint1) {}
20
+ blueprint.should be_instance_of(BlueprintsBoy::Blueprint)
21
+ blueprint.name.should == :blueprint1
22
+ end
23
+
24
+ it "should set context" do
25
+ blueprint = empty_context.depends_on(:blueprint2).blueprint(:blueprint1) {}
26
+ blueprint.context.should be_instance_of(BlueprintsBoy::Context)
27
+ blueprint.context.dependencies.should == [:blueprint2]
28
+ end
29
+ end
30
+
31
+ describe "depends_on" do
32
+ it "should set dependencies to empty array" do
33
+ empty_context.dependencies.should == []
34
+ end
35
+
36
+ it "should create new context with dependencies set" do
37
+ context = empty_context.depends_on(:blueprint, :blueprint2)
38
+ context.should be_instance_of(BlueprintsBoy::Context)
39
+ context.should_not equal(empty_context)
40
+ context.dependencies.should == [:blueprint, :blueprint2]
41
+ end
42
+
43
+ it "should allow chaining dependencies" do
44
+ context = empty_context.depends_on(:blueprint).depends_on(:blueprint2)
45
+ context.dependencies.should == [:blueprint, :blueprint2]
46
+ end
47
+
48
+ it "should allow using block form to chain dependencies" do
49
+ context = nil
50
+ empty_context.depends_on(:blueprint) do
51
+ context = depends_on(:blueprint2)
52
+ end
53
+ context.dependencies.should == [:blueprint, :blueprint2]
54
+ end
55
+
56
+ it "should only keep uniq dependencies" do
57
+ context = empty_context.depends_on(:blueprint).depends_on(:blueprint)
58
+ context.dependencies.should == [:blueprint]
59
+ end
60
+
61
+ it "should not modify original dependencies" do
62
+ empty_context.depends_on(:blueprint)
63
+ empty_context.dependencies.should == []
64
+ end
65
+ end
66
+
67
+ describe "attributes" do
68
+ it "should set attributes to empty hash" do
69
+ empty_context.attrs.should == {}
70
+ end
71
+
72
+ it "should create new context with attributes set" do
73
+ context = empty_context.attributes(attr: 'val')
74
+ context.should be_instance_of(BlueprintsBoy::Context)
75
+ context.should_not equal(empty_context)
76
+ context.attrs.should == {attr: 'val'}
77
+ end
78
+
79
+ it "should allow chaining attributes using block form" do
80
+ context = nil
81
+ empty_context.attributes(attr1: 'val1', attr2: 'val2') do
82
+ context = attributes(attr2: 'v2', attr3: 'v3')
83
+ end
84
+ context.attrs.should == {attr1: 'val1', attr2: 'v2', attr3: 'v3'}
85
+ end
86
+
87
+ it "should not modify original attributes" do
88
+ empty_context.attributes(attr: 'val')
89
+ empty_context.attrs.should == {}
90
+ end
91
+ end
92
+
93
+ describe "factories" do
94
+ it "should set block to nil" do
95
+ empty_context.factory_class.should be_nil
96
+ end
97
+
98
+ it "should create new context with block" do
99
+ context = empty_context.factory(Fixnum)
100
+ context.factory_class.should == Fixnum
101
+ end
102
+
103
+ it "should allow chaining after factory" do
104
+ context = empty_context.factory(Fixnum).attributes(attr: 'value')
105
+ context.factory_class.should == Fixnum
106
+ end
107
+ end
108
+
109
+ describe "creating dependencies" do
110
+ it "should allow dependencies in attributes" do
111
+ dependency = empty_context.blueprint1
112
+ dependency.should be_a(BlueprintsBoy::Dependency)
113
+ end
114
+
115
+ it "should pass blueprint_name and options" do
116
+ dependency = empty_context.blueprint1(:blueprint_name, option: 'value')
117
+ dependency.instance_eval do
118
+ @name.should == :blueprint1
119
+ @blueprint_name.should == :blueprint_name
120
+ @options.should == {option: 'value'}
121
+ end
122
+ end
123
+ end
124
+
125
+ describe "group" do
126
+ before do
127
+ BlueprintsBoy.manager.add blueprint1
128
+ BlueprintsBoy.manager.add blueprint2
129
+ BlueprintsBoy.manager.setup env
130
+ end
131
+
132
+ it "should allow grouping blueprints" do
133
+ group, = empty_context.group(:blueprints => [:blueprint1, :blueprint2])
134
+ group.build(env, :create)
135
+ env.blueprints.should == [mock1, mock2]
136
+ end
137
+
138
+ it "should allow multiple groups" do
139
+ BlueprintsBoy.manager.add blueprint3
140
+ _, group2 = empty_context.group(:group1 => [:blueprint1, :blueprint2], :group2 => [:blueprint2, :blueprint3])
141
+ group2.build(env, :create)
142
+ env.group2.should == [mock2, mock3]
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ describe BlueprintsBoy::Dependency do
4
+ before do
5
+ BlueprintsBoy.manager.add blueprint1
6
+ BlueprintsBoy.manager.setup env
7
+ end
8
+
9
+ def value(dep)
10
+ env.instance_eval(&dep)
11
+ end
12
+
13
+ it "should allow getting instance variable value" do
14
+ value(described_class.new(:blueprint1)).should == mock1
15
+ end
16
+
17
+ it "should allow getting another instance variable" do
18
+ preset_mock = double
19
+ env.set(:preset_key, preset_mock)
20
+ value(described_class.new(:preset_key, :blueprint1)).should == preset_mock
21
+ end
22
+
23
+ it "should allow passing options for building" do
24
+ BlueprintsBoy.manager.add(create_blueprint(:options_blueprint) { |data| data.options })
25
+ value(described_class.new(:options_blueprint, :option => 'value')).should == {:option => 'value'}
26
+ end
27
+
28
+ describe "missing methods" do
29
+ subject { described_class.new(:blueprint1) }
30
+
31
+ it "should record all missing methods" do
32
+ subject.missing_method
33
+ mock1.should_receive(:missing_method).and_return(mock2)
34
+ value(subject).should == mock2
35
+ end
36
+
37
+ it "should allow chaining methods" do
38
+ subject.missing_method.another_missing_method
39
+ mock1.should_receive(:missing_method).and_return(mock2)
40
+ mock2.should_receive(:another_missing_method).and_return(mock3)
41
+ value(subject).should == mock3
42
+ end
43
+
44
+ it "should remember parameters" do
45
+ subject.missing_method(1, 2)
46
+ mock1.should_receive(:missing_method).with(1, 2).and_return(mock2)
47
+ value(subject).should == mock2
48
+ end
49
+
50
+ it "should remember block" do
51
+ subject.missing_method { |value| value + 2 }
52
+ mock1.should_receive(:missing_method).and_yield(1)
53
+ value(subject).should == 3
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,27 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe BlueprintsBoy::Factories do
4
+ describe "finding" do
5
+ before do
6
+ subject.add(Integer, :create) { 5 }
7
+ end
8
+
9
+ it "should allow defining and finding a factory" do
10
+ factory = subject[Integer, :create]
11
+ factory.should be_instance_of(Proc)
12
+ factory.call.should == 5
13
+ end
14
+
15
+ it "should find factory for child class" do
16
+ factory = subject[Fixnum, :create]
17
+ factory.should be_instance_of(Proc)
18
+ factory.call.should == 5
19
+ end
20
+
21
+ it "should raise error if factory can't be found" do
22
+ expect {
23
+ subject[Float, :create]
24
+ }.to raise_error(BlueprintsBoy::FactoryNotFound, "Factory for Float can't be located")
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,122 @@
1
+ require 'spec_helper'
2
+
3
+ describe BlueprintsBoy::Manager do
4
+ describe "add" do
5
+ it "should add blueprint" do
6
+ subject.add(blueprint1)
7
+ subject.blueprints.should == {:blueprint1 => blueprint1}
8
+ end
9
+ end
10
+
11
+ describe "find" do
12
+ it "should find added blueprint" do
13
+ subject.add(blueprint1)
14
+ subject.find(:blueprint1).should equal(blueprint1)
15
+ subject[:blueprint1].should equal(blueprint1)
16
+ end
17
+
18
+ it "should raise error if blueprint is not found" do
19
+ expect {
20
+ subject.find(:blueprint_not_existing)
21
+ }.to raise_error(BlueprintsBoy::BlueprintNotFound, 'Blueprint :blueprint_not_existing cannot be found')
22
+ end
23
+ end
24
+
25
+ describe "build" do
26
+ before do
27
+ subject.add(blueprint1)
28
+ subject.push_registry
29
+ end
30
+
31
+ it "should build blueprint" do
32
+ subject.build(env, [:blueprint1])
33
+ env.blueprint1.should == mock1
34
+ end
35
+
36
+ it "should add blueprint to built blueprints" do
37
+ subject.build(env, [:blueprint1])
38
+ subject.registry.built.should include(:blueprint1)
39
+ end
40
+
41
+ it "should not build same blueprint twice" do
42
+ env.should_receive(:autoset).once
43
+ subject.build(env, [:blueprint1, :blueprint1])
44
+ end
45
+
46
+ it "should use update strategy if options are present and blueprint is already built" do
47
+ mock1.should_receive(:update)
48
+ blueprint1.blueprint(:update) { blueprint1.update }
49
+ subject.build(env, [:blueprint1, {:blueprint1 => {option: 'value'}}])
50
+ end
51
+
52
+ it "should build dependencies of blueprint" do
53
+ subject.add blueprint2.depends_on(:blueprint1)
54
+ subject.build env, [:blueprint2]
55
+ subject.registry.built.to_a.should == [:blueprint2, :blueprint1]
56
+ end
57
+
58
+ it "should allow passing options" do
59
+ subject.add(create_blueprint(:options_blueprint) { |data| data.options[:name] })
60
+ subject.build(env, [{:options_blueprint => {name: 'success'}}])
61
+ env.options_blueprint.should == 'success'
62
+ end
63
+
64
+ it "should return results" do
65
+ subject.add(blueprint2)
66
+ subject.build(env, [:blueprint1, :blueprint2 => {attr: 'val'}]).should == [mock1, mock2]
67
+ end
68
+
69
+ it "should return 1 result if only one blueprint was built" do
70
+ subject.build(env, [:blueprint1]).should == mock1
71
+ end
72
+
73
+ it "should return results for already built blueprints" do
74
+ subject.build(env, [:blueprint1])
75
+ subject.build(env, [:blueprint1]).should == mock1
76
+ end
77
+
78
+ it "should allow passing strategy" do
79
+ blueprint1.blueprint(:new) { :new_strat }
80
+ subject.build(env, [:blueprint1], strategy: :new)
81
+ env.blueprint1.should == :new_strat
82
+ end
83
+
84
+ it "does not overwrite strategy with :update" do
85
+ counter = 0
86
+ blueprint1.blueprint(:counter) { counter += 1 }
87
+ 2.times { subject.build(env, [:blueprint1], strategy: :counter) }
88
+ counter.should == 2
89
+ end
90
+ end
91
+
92
+ describe "setup" do
93
+ it "should set @_blueprint_data to {}" do
94
+ subject.setup(env)
95
+ env.instance_variable_get(:@_blueprint_data).should == {}
96
+ end
97
+
98
+ it "should restore blueprints from registry to @_blueprint_data" do
99
+ blueprint1
100
+ blueprint2
101
+ subject.add(blueprint1)
102
+ subject.add(blueprint2)
103
+
104
+ subject.push_registry([:blueprint1])
105
+ subject.push_registry([:blueprint2])
106
+
107
+ subject.setup(env)
108
+ env.instance_variable_get(:@_blueprint_data).should == {blueprint1: mock1, blueprint2: mock2}
109
+ end
110
+ end
111
+
112
+ describe "teardown" do
113
+ it "should pop registry" do
114
+ subject.add(blueprint1)
115
+ subject.push_registry
116
+ subject.build(env, [:blueprint1])
117
+
118
+ subject.teardown
119
+ subject.registry.should be_nil
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ describe BlueprintsBoy::Registry do
4
+ let :names do
5
+ [:mock1, :mock2]
6
+ end
7
+
8
+ subject do
9
+ described_class.new(names, nil)
10
+ end
11
+
12
+ describe "built" do
13
+ it "should initialize built with empty set" do
14
+ subject.built.should == Set.new
15
+ end
16
+
17
+ it "should inherit built from parent" do
18
+ subject.built.add :blueprint1
19
+ child = described_class.new(names, subject)
20
+ child.built.should == Set.new([:blueprint1])
21
+ end
22
+ end
23
+
24
+ describe "store/restore" do
25
+ it "should return {} by default" do
26
+ subject.restore.should == {}
27
+ end
28
+
29
+ it "should restore results of blueprints" do
30
+ subject.store mock1: mock1, mock2: mock2
31
+ subject.restore.should == {mock1: mock1, mock2: mock2}
32
+ end
33
+
34
+ it "should revert changes to restored objects" do
35
+ subject.store mock1: mock1, mock2: mock2
36
+ mock1 << ' has failed us'
37
+ subject.restore[:mock1].should == 'mock1'
38
+ end
39
+
40
+ it "should restore parent objects too" do
41
+ child = described_class.new([], subject)
42
+ subject.store mock1: mock1
43
+ child.store mock2: mock2
44
+ child.restore.should == {mock1: mock1, mock2: mock2}
45
+ end
46
+ end
47
+ end