# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/

require 'rails_helper'

RSpec.describe 'iCal endpoints', type: :request do
  context 'with no existing session' do
    it 'gives HTTP Basic auth prompt (#3064)' do
      get '/ical/tickets'

      expect(response.body).to eq("HTTP Basic: Access denied.\n")
    end
  end

  describe 'time zone', authenticated_as: :user do
    let(:group) { create(:group) }
    let(:user)  { create(:agent) }

    before do
      user.groups << group

      create(:ticket, group: group, owner: user, state_name: 'open', pending_time: 1.day.ago)
    end

    it 'returns zero offset time if no time zone set' do
      get '/ical/tickets'

      expect(response.body).to match %r{DTSTART:\d{8}T0{6}Z}
    end

    it 'returns selected time zone' do
      Setting.set 'timezone_default', 'Europe/Vilnius'

      get '/ical/tickets'

      expect(response.body).to match %r{DTSTART;TZID=Europe/Vilnius:\d{8}T0{6}}
    end
  end

  # https://github.com/zammad/zammad/issues/3962
  context 'with request method PROPFIND', authenticated_as: :user do
    let(:user) { create(:agent) }

    it 'contains correct request method' do
      get '/ical/tickets', headers: { 'REQUEST_METHOD' => 'PROPFIND' }

      expect(response.request.request_method).to eq('PROPFIND')
    end

    it 'returns the desired calendar file' do
      get '/ical/tickets', headers: { 'REQUEST_METHOD' => 'PROPFIND' }

      expect(response.body).to match(%r{BEGIN:VCALENDAR})
    end
  end

  describe 'methods', authenticated_as: :user do
    let(:group)    { create(:group) }
    let(:user)     { create(:agent) }
    let(:ticket_1) { create(:ticket, title: SecureRandom.uuid, group: group, owner: user, state_name: 'open') }
    let(:ticket_2) { create(:ticket, title: SecureRandom.uuid, group: group, owner: user, state_name: 'pending reminder', pending_time: 1.day.from_now) }

    before do
      user.groups << group
      ticket_1
      ticket_2
    end

    it 'returns open tickets', :aggregate_failures do
      get '/ical/tickets/new_open'

      expect(response.body).to include(ticket_1.title)
      expect(response.body).not_to include(ticket_2.title)
    end

    it 'returns pending tickets', :aggregate_failures do
      get '/ical/tickets/pending'

      expect(response.body).not_to include(ticket_1.title)
      expect(response.body).to include(ticket_2.title)
    end

    it 'raises error on unknown method', :aggregate_failures do
      get '/ical/tickets/xxx'

      expect(json_response['error']).to eq('An unknown method name was requested.')
      expect(response).to have_http_status(:unprocessable_entity)
    end
  end
end