test_model.rb 3.36 KB
$:.unshift File.join(File.dirname(__FILE__), "..", "app")

require 'test/unit'
require 'mocha'

require 'ds_admin'

class ModelStub
  include DsAdmin::Model

  attr_accessor :data

  def initialize(args = {})
    return if args.empty?
    super(args)

    @data = args[:data]
  end
end

class ModelTest < Test::Unit::TestCase
  # def setup
  # end

  # def teardown
  # end

  def test_initialize
    model = ModelStub.new
    assert_instance_of(ModelStub, model)
    assert_kind_of(DsAdmin::Model, model)

    model = ModelStub.new({:data => 'data'})
    assert_instance_of(ModelStub, model)
    assert_kind_of(DsAdmin::Model, model)
    assert_equal('data', model.data)
    assert_nil(model.id)
  end

  def test_config_key
    assert_equal(:ModelStub, ModelStub.new.config_key)
  end

  def test_to_h
    model_hash = ModelStub.new({:data => 'data'}).to_h
    assert_instance_of(Hash, model_hash)
    assert_equal('data', model_hash[:data])
  end

  def test_all_and_each
    model = ModelStub.new

    storage_config_mock = mock(:model= => model)

    storage_mock = mock(:config => storage_config_mock)
    storage_mock.extend(Enumerable).
      expects(:each).multiple_yields(
        [{:id => 1, :data => 'data1'}],
        [{:id => 2, :data => 'data2'}])

    DsAdmin::Model.storage = storage_mock
    all = model.all

    assert_nil(model.id)
    assert_nil(model.data)
    assert_instance_of(Array, all)
    assert_instance_of(ModelStub, all[0])
    assert_instance_of(ModelStub, all[1])
    assert_equal(1, all[0].id)
    assert_equal('data1', all[0].data)
    assert_equal(2, all[1].id)
    assert_equal('data2', all[1].data)

    found = Array.new
    ids   = Array.new
    all.each do |a|
      assert_instance_of(ModelStub, a)
      found << a.data
      ids   << a.id
    end

    assert_equal([1, 2], ids)
    assert_equal(['data1', 'data2'], found)
  end

  def test_load
    model = ModelStub.new

    storage_config_mock = mock
    storage_config_mock.expects(:model=).twice.returns(model)

    storage_mock = mock().extend(Enumerable)
    storage_mock.expects(:config).twice.returns(storage_config_mock)
    storage_mock.expects(:each).twice.multiple_yields(
        [{:id => 1, :data => 'data1'}],
        [{:id => 2, :data => 'data2'}])

    DsAdmin::Model.storage = storage_mock
    loaded = model.load(2)

    assert_instance_of(ModelStub, model)
    assert_instance_of(ModelStub, loaded)
    assert_not_equal(model, loaded)
    assert_nil(model.data)
    assert_equal('data2', loaded.data)

    assert_raise RuntimeError do
      loaded = model.load(3)
    end
  end

  def test_load!
    model = ModelStub.new

    storage_config_mock = mock
    storage_config_mock.expects(:model=).twice.returns(model)

    storage_mock = mock().extend(Enumerable)
    storage_mock.expects(:config).twice.returns(storage_config_mock)
    storage_mock.expects(:each).twice.multiple_yields(
        [{:id => 1, :data => 'data1'}],
        [{:id => 2, :data => 'data2'}])

    DsAdmin::Model.storage = storage_mock
    model.load!(1)

    assert_instance_of(ModelStub, model)
    assert_equal('data1', model.data)

    assert_raise RuntimeError do
      model.load!(3)
    end
  end

  def test_save_stores_new_id
    model = ModelStub.new({:data => 'data'})

    storage_mock = mock()
    storage_mock.expects(:write).returns(3)

    DsAdmin::Model.storage = storage_mock
    model.save

    assert_equal(3, model.id)
  end
end