Report abuse

require 'mocha'
require 'spam_cannon'
require 'test/unit'

class SpamCannonTest < Test::Unit::TestCase
  def setup
    setup_client
    setup_newsletters
    setup_users
  end

  def setup_client
    SpamCannon.client = mock
  end

  def setup_newsletters
    Object.const_set(:FakeNewsletter, Struct.new(:list_id, :title, :summary, :frequency)) unless defined? FakeNewsletter
    @letters = []
    @letters << [ 'n313', 'The Daily Rubyist', "A daily recap of what's hot and what's not.", 'daily'  ]
    @letters << [ 'n421', 'Gently Mockin', "A weekly reader on mocking and related stories.", 'weekly' ]
    @letters.map! { |s| FakeNewsletter.new(*s) }
    SpamCannon.client.stubs(:getNewsletters).returns(@letters)
  end

  def setup_users
    Object.const_set(:FakeUser, Struct.new(:email, :vitals, :subscriptions)) unless defined? FakeUser
    @users = {
      :err => [ 'err@theblog.com', { :age => 31, :state => 'CA' }, ['n313']  ],
      :nic => [ 'dr@nic.com', { :age => 19, :state => 'N/A' }, %w[n313 n421] ],
      :evn => [ 'evan@weaver.com', { :age => 37, :state => 'PA' }, ['n421']  ]
    }
    @users = @users.inject({}) { |hash, (name, user)| hash.merge(name => FakeUser.new(*user)) }
  end

  def test_get_user_does_something
    user = @users[:err]
    SpamCannon.client.expects(:getUser).with(user.email).returns(user)
    assert_equal user, SpamCannon.get_user(user.email)
  end

  def test_create_user_works
    user = @users[:nic]
    SpamCannon.client.expects(:createUser).with(user.email, user.vitals, user.subscriptions).returns(true)
    assert SpamCannon.create_user(user.email, user.vitals, user.subscriptions)
  end

  def test_update_user_is_okay
    user, unsubscribe = @users[:evn], %w[e353]
    SpamCannon.client.expects(:updateUser).with(user.email, user.vitals, user.subscriptions, unsubscribe).returns(true)
    assert SpamCannon.update_user(user.email, user.vitals, user.subscriptions, unsubscribe)
  end

  def test_newsletters_returns_hash
    assert_equal Hash, SpamCannon.newsletters.class
    assert_equal 2,    SpamCannon.newsletters.size
  end

  def test_newsletters_has_the_key
    assert_equal %w[n313 n421].sort, SpamCannon.newsletters.keys.sort
  end

  def test_newsletters_hash_is_properly_indexed
    assert_equal @letters.last, SpamCannon.newsletters[@letters.last.list_id]
  end

  def test_newsletters_hash_is_cached
    object_id = SpamCannon.newsletters.object_id
    assert_equal object_id, SpamCannon.newsletters.object_id
    assert_equal object_id, SpamCannon.newsletters.object_id
  end

  def test_user_exists_works
    email = 'err@theblog.com'
    SpamCannon.client.expects(:doesUserExist).with(email).returns(true)
    assert SpamCannon.user_exists?(email)
  end
end