# frozen_string_literal: true

require 'rails_helper'

RSpec.describe 'Settings aliases page' do
  let!(:user) { Fabricate(:user) }
  let(:account) { user.account }

  before { sign_in user }

  describe 'Viewing aliases' do
    it 'shows index page with private cache control headers' do
      visit settings_aliases_path

      # View index page
      expect(page)
        .to have_text(I18n.t('settings.aliases'))
        .and have_private_cache_control
    end
  end

  describe 'Creating an alias' do
    context 'with valid alias value' do
      before { stub_resolver }

      it 'creates an alias for the user' do
        visit settings_aliases_path

        fill_in 'account_alias_acct',
                with: 'new@host.example'
        expect { submit_form }
          .to change(AccountAlias, :count).by(1)
        expect(page)
          .to have_text(I18n.t('aliases.created_msg'))
      end
    end

    context 'with invalid value' do
      it 'does not create an alias for the user' do
        visit settings_aliases_path

        fill_in 'account_alias_acct',
                with: 'invalid-value'
        expect { submit_form }
          .to not_change(AccountAlias, :count)
        expect(page)
          .to have_text(I18n.t('settings.aliases'))
      end
    end

    def submit_form
      click_on I18n.t('aliases.add_new')
    end
  end

  describe 'Removing an alias' do
    let!(:account_alias) do
      AccountAlias.new(account: user.account, acct: 'new@example.com').tap do |account_alias|
        account_alias.save(validate: false)
      end
    end

    it 'removes an alias' do
      visit settings_aliases_path
      expect { click_on I18n.t('aliases.remove') }
        .to change(AccountAlias, :count).by(-1)

      expect(page)
        .to have_text(I18n.t('settings.aliases'))
        .and have_text(I18n.t('aliases.deleted_msg'))
      expect { account_alias.reload }
        .to raise_error(ActiveRecord::RecordNotFound)
    end
  end

  private

  def stub_resolver
    resolver = instance_double(ResolveAccountService, call: Fabricate(:account))
    allow(ResolveAccountService).to receive(:new).and_return(resolver)
  end
end
