# frozen_string_literal: true

require 'rails_helper'

RSpec.describe 'Settings TwoFactorAuthentication RecoveryCodes' do
  describe 'Generating recovery codes' do
    let(:user) { Fabricate :user, otp_required_for_login: true }
    let(:backup_code) { +'147e7284c95bd260b91ed17820860019' }

    before do
      stub_code_generator
      sign_in(user)
    end

    it 'updates the codes and includes them in the view' do
      # Attempt to generate codes
      visit settings_two_factor_authentication_methods_path
      click_on I18n.t('two_factor_authentication.generate_recovery_codes')

      # Fill in challenge password
      fill_in 'form_challenge_current_password', with: user.password

      expect { click_on I18n.t('challenge.confirm') }
        .to(change { user.reload.otp_backup_codes })

      expect(page)
        .to have_text(I18n.t('two_factor_authentication.recovery_codes_regenerated'))
        .and have_title(I18n.t('settings.two_factor_authentication'))
        .and have_css('ol.recovery-codes')
        .and have_text(backup_code)
    end

    def stub_code_generator
      allow(SecureRandom).to receive(:hex).and_return(backup_code)
    end
  end
end
