require 'assert' require 'mr/factory/model_stack' require 'mr/fake_record' require 'mr/model' require 'mr/factory/model_factory' require 'mr/factory/record_stack' class MR::Factory::ModelStack class UnitTests < Assert::Context desc "MR::Factory::ModelStack" setup do @record_stack_spy = nil Assert.stub(MR::Factory::RecordStack, :for_record) do |*args| @record_stack_spy = RecordStackSpy.new(*args) end @record_class = Class.new{ include MR::FakeRecord } @model_class = Class.new{ include MR::Model } @model_class.record_class(@record_class) @model = @model_class.new @factory_config = MR::Factory::ModelFactory::Config.new(@record_class) @stack_class = MR::Factory::ModelStack @stack = @stack_class.new(@model, @factory_config) end subject{ @stack } should have_readers :model should have_imeths :factory_config should have_imeths :create, :destroy should have_imeths :create_dependencies, :create_deps should have_imeths :destroy_dependencies, :destroy_deps should "know its model and factory config" do assert_equal @model, subject.model assert_equal @factory_config, subject.factory_config end should "build a record stack" do assert_not_nil @record_stack_spy assert_equal @model.record, @record_stack_spy.record assert_equal @factory_config, @record_stack_spy.factory_config end should "demeter its record stack" do assert_false @record_stack_spy.create_called subject.create assert_true @record_stack_spy.create_called assert_false @record_stack_spy.destroy_called subject.destroy assert_true @record_stack_spy.destroy_called assert_false @record_stack_spy.create_dependencies_called subject.create_dependencies assert_true @record_stack_spy.create_dependencies_called @record_stack_spy.create_dependencies_called = false subject.create_deps assert_true @record_stack_spy.create_dependencies_called assert_false @record_stack_spy.destroy_dependencies_called subject.destroy_dependencies assert_true @record_stack_spy.destroy_dependencies_called @record_stack_spy.destroy_dependencies_called = false subject.destroy_dependencies assert_true @record_stack_spy.destroy_dependencies_called end end class RecordStackSpy attr_reader :record, :factory_config attr_accessor :create_called, :destroy_called attr_accessor :create_dependencies_called, :destroy_dependencies_called def initialize(record, factory_config) @record = record @factory_config = factory_config @create_called = false @destroy_called = false @create_dependencies_called = false @destroy_dependencies_called = false end def create; @create_called = true; end def destroy; @destroy_called = true; end def create_dependencies; @create_dependencies_called = true; end def destroy_dependencies; @destroy_dependencies_called = true; end end end