require_relative '../test_helper'

class TestPasswordModifyIntegration < LDAPIntegrationTestCase
  def setup
    super
    @admin_account = {dn: 'cn=admin,dc=example,dc=org', password: 'admin', method: :simple}
    @ldap.authenticate @admin_account[:dn], @admin_account[:password]

    @dn = 'uid=modify-password-user1,ou=People,dc=example,dc=org'

    attrs = {
      objectclass: %w(top inetOrgPerson organizationalPerson person),
      uid: 'modify-password-user1',
      cn: 'modify-password-user1',
      sn: 'modify-password-user1',
      mail: 'modify-password-user1@rubyldap.com',
      userPassword: 'admin',
    }
    unless @ldap.search(base: @dn, scope: Net::LDAP::SearchScope_BaseObject)
      assert @ldap.add(dn: @dn, attributes: attrs), @ldap.get_operation_result.inspect
    end
    assert @ldap.search(base: @dn, scope: Net::LDAP::SearchScope_BaseObject)

    @auth = {
      method: :simple,
      username: @dn,
      password: 'admin',
    }
  end

  def test_password_modify
    assert @ldap.password_modify(dn: @dn,
                                 auth: @auth,
                                 old_password: 'admin',
                                 new_password: 'passworD2')

    assert @ldap.get_operation_result.extended_response.nil?,
      'Should not have generated a new password'

    refute @ldap.bind(username: @dn, password: 'admin', method: :simple),
      'Old password should no longer be valid'

    assert @ldap.bind(username: @dn, password: 'passworD2', method: :simple),
      'New password should be valid'
  end

  def test_password_modify_generate
    assert @ldap.password_modify(dn: @dn,
                                 auth: @auth,
                                 old_password: 'admin')

    generated_password = @ldap.get_operation_result.extended_response[0][0]

    assert generated_password, 'Should have generated a password'

    refute @ldap.bind(username: @dn, password: 'admin', method: :simple),
      'Old password should no longer be valid'

    assert @ldap.bind(username: @dn, password: generated_password, method: :simple),
      'New password should be valid'
  end

  def test_password_modify_generate_no_old_password
    assert @ldap.password_modify(dn: @dn,
                                 auth: @auth)

    generated_password = @ldap.get_operation_result.extended_response[0][0]

    assert generated_password, 'Should have generated a password'

    refute @ldap.bind(username: @dn, password: 'admin', method: :simple),
      'Old password should no longer be valid'

    assert @ldap.bind(username: @dn, password: generated_password, method: :simple),
      'New password should be valid'
  end

  def test_password_modify_overwrite_old_password
    assert @ldap.password_modify(dn: @dn,
                                 auth: @admin_account,
                                 new_password: 'passworD3')

    refute @ldap.bind(username: @dn, password: 'admin', method: :simple),
      'Old password should no longer be valid'

    assert @ldap.bind(username: @dn, password: 'passworD3', method: :simple),
      'New password should be valid'
  end

  def teardown
    @ldap.delete dn: @dn
  end
end
