# frozen_string_literal: true

require 'rails_helper'

RSpec.describe 'Users controller specs' do
  include_context 'with graphql schema test'

  let(:schema)          { DummySchema }
  let(:user)            { create(:user, :confirmed) }
  let(:field)           { 'privateField' }
  let(:public_message)  { 'Field does not require authentication' }
  let(:private_message) { 'Field will always require authentication' }
  let(:private_error) do
    {
      message:    "#{field} field requires authentication",
      extensions: { code: 'AUTHENTICATION_ERROR' }
    }
  end

  describe 'publicField' do
    let(:query) do
      <<-GRAPHQL
        query {
          publicField
        }
      GRAPHQL
    end

    context 'when using a regular schema' do
      it 'does not require authentication' do
        expect(response[:data][:publicField]).to eq(public_message)
      end
    end
  end

  describe 'privateField' do
    let(:query) do
      <<-GRAPHQL
        query {
          privateField
        }
      GRAPHQL
    end

    context 'when using a regular schema' do
      context 'when user is authenticated' do
        let(:resource) { user }

        it 'allows to perform the query' do
          expect(response[:data][:privateField]).to eq(private_message)
        end

        context 'when using a SchemaUser' do
          let(:resource) { create(:schema_user, :confirmed) }

          it 'allows to perform the query' do
            expect(response[:data][:privateField]).to eq(private_message)
          end
        end
      end
    end

    context 'when using an interpreter schema' do
      let(:schema) { InterpreterSchema }

      context 'when user is authenticated' do
        let(:resource) { user }

        it 'allows to perform the query' do
          expect(response[:data][:privateField]).to eq(private_message)
        end
      end
    end
  end

  describe 'user' do
    let(:user_data) { { email: user.email, id: user.id } }
    let(:query) do
      <<-GRAPHQL
        query {
          user(id: #{user.id}) {
            id
            email
          }
        }
      GRAPHQL
    end

    context 'when using a regular schema' do
      context 'when user is authenticated' do
        let(:resource) { user }

        it 'allows to perform the query' do
          expect(response[:data][:user]).to match(**user_data)
        end
      end
    end

    context 'when using an interpreter schema' do
      let(:schema) { InterpreterSchema }

      context 'when user is authenticated' do
        let(:resource) { user }

        it 'allows to perform the query' do
          expect(response[:data][:user]).to match(**user_data)
        end
      end

      context 'when user is not authenticated' do
        # Interpreter schema fields are public unless specified otherwise (plugin setting)
        it 'allows to perform the query' do
          expect(response[:data][:user]).to match(**user_data)
        end
      end
    end
  end
end
