123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- require 'rails_helper'
- RSpec.describe Gql::Mutations::Ticket::Checklist::Add, type: :graphql do
- let(:group) { create(:group) }
- let(:agent) { create(:agent, groups: [group]) }
- let(:ticket) { create(:ticket, group: group) }
- let(:query) do
- <<~QUERY
- mutation ticketChecklistAdd($ticketId: ID!, $templateId: ID) {
- ticketChecklistAdd(ticketId: $ticketId, templateId: $templateId) {
- checklist {
- id
- name
- items {
- id
- text
- checked
- }
- }
- errors {
- message
- }
- }
- }
- QUERY
- end
- let(:variables) { { ticketId: gql.id(ticket) } }
- let(:response) do
- {
- 'id' => a_kind_of(String),
- 'name' => '',
- 'items' => include(
- include(
- 'id' => a_kind_of(String),
- 'text' => '',
- 'checked' => false,
- )
- ),
- }
- end
- before do
- gql.execute(query, variables: variables)
- end
- shared_examples 'creating the ticket checklist' do
- it 'creates the ticket checklist' do
- expect(gql.result.data['checklist']).to include(response)
- end
- end
- shared_examples 'raising an error' do |error_type|
- it 'raises an error' do
- expect(gql.result.error_type).to eq(error_type)
- end
- end
- shared_examples 'returning an error message' do |error_message|
- it 'returns an error message' do
- expect(gql.result.data['errors']).to include(include('message' => error_message))
- end
- end
- context 'with authenticated session', authenticated_as: :agent do
- it_behaves_like 'creating the ticket checklist'
- context 'without access to the ticket' do
- let(:agent) { create(:agent) }
- it_behaves_like 'raising an error', Exceptions::Forbidden
- end
- context 'when ticket checklist already exists', authenticated_as: :authenticate do
- let(:checklist) { create(:checklist, ticket: ticket) }
- def authenticate
- checklist
- agent
- end
- it_behaves_like 'returning an error message', 'This field has already been taken'
- end
- context 'when creating from a checklist template', authenticated_as: :authenticate do
- let(:template) { create(:checklist_template) }
- let(:variables) { { ticketId: gql.id(ticket), templateId: gql.id(template) } }
- let(:response) do
- {
- 'id' => a_kind_of(String),
- 'name' => template.name,
- 'items' => include(
- include(
- 'text' => satisfy { |text| template.items.pluck(:text).include? text },
- 'checked' => false,
- ),
- ),
- }
- end
- def authenticate
- template
- agent
- end
- it_behaves_like 'creating the ticket checklist'
- context 'with ticket read permission' do
- let(:agent) { create(:agent, groups: [group], group_names_access_map: { group.name => 'read' }) }
- it_behaves_like 'raising an error', Pundit::NotAuthorizedError
- end
- context 'with ticket read+change permissions' do
- let(:agent) { create(:agent, groups: [group], group_names_access_map: { group.name => %w[read change] }) }
- it_behaves_like 'creating the ticket checklist'
- end
- end
- end
- it_behaves_like 'graphql responds with error if unauthenticated'
- end
|