# frozen_string_literal: true

require 'rails_helper'

describe Doorkeeper::OpenidConnect::OAuth::PreAuthorization do
  subject { Doorkeeper::OAuth::PreAuthorization.new server, attrs }

  let(:server) { double }
  let(:attrs) {}

  describe '#initialize' do
    context 'with nonce parameter' do
      let(:attrs) { { nonce: '123456' } }

      it 'stores the nonce attribute' do
        expect(subject.nonce).to eq '123456'
      end
    end
  end

  describe '#error_response' do
    context 'with response_type = code' do
      let(:attrs) { { response_type: 'code', redirect_uri: 'client.com/callback' } }

      it 'redirects to redirect_uri with query parameter' do
        expect(subject.error_response.redirect_uri).to match(/#{attrs[:redirect_uri]}\?/)
      end
    end

    context 'with response_type = token' do
      let(:attrs) { { response_type: 'token', redirect_uri: 'client.com/callback' } }

      it 'redirects to redirect_uri with fragment' do
        expect(subject.error_response.redirect_uri).to match(/#{attrs[:redirect_uri]}#/)
      end
    end

    context 'with response_type = id_token' do
      let(:attrs) { { response_type: 'id_token', redirect_uri: 'client.com/callback' } }

      it 'redirects to redirect_uri with fragment' do
        expect(subject.error_response.redirect_uri).to match(/#{attrs[:redirect_uri]}#/)
      end
    end

    context 'with response_type = id_token token' do
      let(:attrs) { { response_type: 'id_token token', redirect_uri: 'client.com/callback' } }

      it 'redirects to redirect_uri with fragment' do
        expect(subject.error_response.redirect_uri).to match(/#{attrs[:redirect_uri]}#/)
      end
    end
  end
end
