blueprints_boy 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.
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