saturnflyer/surrounded

View on GitHub
test/initialization_test.rb

Summary

Maintainability
A
0 mins
Test Coverage
require "test_helper"

class KeywordContext
  extend Surrounded::Context

  keyword_initialize(:user, :other_user) do
    @defined_by_initializer_block = "yup"
  end
end

describe Surrounded::Context, ".initialize" do
  it "applies a provided block to the instance" do
    context = KeywordContext.new(user: User.new("Jim"), other_user: User.new("Amy"))
    assert_equal "yup", context.instance_variable_get(:@defined_by_initializer_block)
  end

  it "keeps track of the original initialize arguments" do
    jim = User.new("Jim")
    amy = User.new("Amy")
    context = KeywordContext.new(user: jim, other_user: amy)
    tracked = context.send(:initializer_arguments)
    assert_equal jim, tracked[:user]
    assert_equal amy, tracked[:other_user]
  end

  it "raises errors with missing keywords" do
    err = assert_raises(ArgumentError) {
      KeywordContext.new(other_user: User.new("Amy"))
    }
    assert_match(/missing keyword: :?user/, err.message)
  end
end

class NonKeyworder
  extend Surrounded::Context

  initialize_without_keywords :this, :that do
    instance_variable_set(:@defined_by_initializer_block, "yes")
  end

  trigger :access_other_object do
    that.name
  end
end

describe Surrounded::Context, "non-keyword initializers" do
  it "defines an initialize method accepting the same arguments" do
    assert_equal 2, NonKeyworder.instance_method(:initialize).arity
  end

  it "works without keyword arguments" do
    assert NonKeyworder.new(User.new("Jim"), User.new("Guille"))
  end

  it "evaluates a given block" do
    assert_equal "yes", NonKeyworder.new(User.new("Jim"), User.new("Guille")).instance_variable_get(:@defined_by_initializer_block)
  end

  it "allows rebinding with a hash" do
    context = NonKeyworder.new(User.new("Jim"), User.new("Guille"))
    expect(context.access_other_object).must_equal "Guille"
    context.rebind(this: User.new("Amy"), that: User.new("Elizabeth"))
    expect(context.access_other_object).must_equal "Elizabeth"
  end
end