change_password_test.rb 5.16 KB
require File.dirname(__FILE__) + '/../test_helper'

class ChangePasswordTest < ActiveSupport::TestCase

  fixtures :environments

  should 'validate' do
    data = ChangePassword.new(:environment_id => Environment.default)
    assert !data.valid?
  end

  should 'validate field is login or email' do
    data = ChangePassword.new(:environment_id => Environment.default)
    data.field = 'anything'
    data.valid?
    assert data.errors.invalid?(:field)

    data.field = 'login'
    data.valid?
    assert !data.errors.invalid?(:field)

    data.field = 'email'
    data.valid?
    assert !data.errors.invalid?(:field)
  end

  should 'refuse invalid field' do
    User.destroy_all

    data = ChangePassword.new
    data.environment_id = Environment.default.id

    data.field = 'login'
    data.value = 'unexisting'
    data.valid?
    assert data.errors.invalid?(:value)

    data.field = 'email'
    data.value = 'example@example.com'
    data.valid?
    assert data.errors.invalid?(:value)
  end

  should 'require only a valid field-value' do
    User.destroy_all
    create_user('testuser', :email => 'test@example.com')

    data = ChangePassword.new
    data.environment_id = Environment.default.id
    assert !data.valid?
    assert data.errors.invalid?(:value)

    data.field = 'login'
    data.value = 'testuser'
    data.valid?
    assert data.valid?

    data.field = 'email'
    data.value = 'test@example.com'
    assert data.valid?
  end

  should 'require correct passsword confirmation' do
    create_user('testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com')

    change = ChangePassword.new
    change.environment_id = Environment.default.id
    change.field = 'login'
    change.value = 'testuser'
    change.save!

    change.status = Task::Status::FINISHED
    change.password = 'right'
    change.password_confirmation = 'wrong'
    assert !change.valid?
    assert change.errors.invalid?(:password)


    change.password_confirmation = 'right'
    assert change.valid?
  end

  should 'actually change password' do
    User.destroy_all
    person = create_user('testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com').person

    change = ChangePassword.new
    change.environment_id = Environment.default.id
    change.field = 'login'
    change.value = 'testuser'
    change.save!

    change.expects(:requestor).returns(person).at_least_once

    change.password = 'newpass'
    change.password_confirmation = 'newpass'
    change.finish

    assert User.find(person.user.id).authenticated?('newpass')
  end

  should 'not require password and password confirmation when cancelling' do
    User.destroy_all
    person = create_user('testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com').person

    change = ChangePassword.new
    change.environment_id = Environment.default.id
    change.field = 'login'
    change.value = 'testuser'
    change.save!

    assert_nothing_raised do
      change.cancel
    end
  end

  should 'has default permission' do
    t1 = Task.new
    t2 = ChangePassword.new
    assert_equal t1.permission, t2.permission
  end

  should 'search for user in the correct environment' do
    e1 = Environment.default
    e2 = fast_create(Environment)

    p1 = create_user('sample-user', :password => 'test', :password_confirmation => 'test', :email => 'sample-user@test.com', :environment => e1).person
    p2 = create_user('sample-user', :password => 'test', :password_confirmation => 'test', :email => 'sample-user@test.com', :environment => e2).person

    c1 = ChangePassword.create!(:field => 'login', :value => 'sample-user', :environment_id => e1.id)
    c2 = ChangePassword.create!(:field => 'login', :value => 'sample-user', :environment_id => e2.id)

    assert_equal c1.requestor, p1
    assert_equal c2.requestor, p2
  end

  should 'have target notification description' do
    person = create_user('testuser').person

    change = ChangePassword.create(:field => 'login', :value => 'testuser', :environment_id => Environment.default.id)

    assert_match(/#{change.requestor.name} wants to change its password/, change.target_notification_description)
  end

  should 'deliver task created message' do
    person = create_user('testuser').person

    task = ChangePassword.create(:field => 'login', :value => 'testuser', :environment_id => Environment.default.id)

    email = TaskMailer.deliver_task_created(task)
    assert_match(/#{task.requestor.name} wants to change its password/, email.subject)
  end

  should 'allow extra fields provided by plugins' do
    class Plugin1 < Noosfero::Plugin
      def change_password_fields
        {:f1 => 'F1'}
      end
    end
    class Plugin2 < Noosfero::Plugin
      def change_password_fields
        {:f2 => 'F2', :f3 => 'F3'}
      end
    end

    environment = Environment.default
    environment.enable_plugin(Plugin1)
    environment.enable_plugin(Plugin2)
    person = create_user('testuser').person

    change_password = ChangePassword.new(:environment_id => environment.id)

    assert_includes change_password.fields, 'f1'
    assert_includes change_password.fields, 'f2'
    assert_includes change_password.fields, 'f3'
  end

end