zammad/zammad

View on GitHub
app/frontend/shared/entities/ticket-article/action/plugins/__tests__/action-articleDelete.spec.ts

Summary

Maintainability
D
1 day
Test Coverage
// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/

import { mockApplicationConfig } from '#tests/support/mock-applicationConfig.ts'
import { setupView } from '#tests/support/mock-user.ts'

import type { TicketView } from '#shared/entities/ticket/types.ts'

import {
  createTicketArticle,
  createTestArticleActions,
  createTicket,
} from './utils.ts'

const createDeletableArticle = (
  userId = '123',
  isCommunication = false,
  isInternal = true,
  createdAt: Date = new Date(),
) => {
  const article = createTicketArticle()
  article.author!.id = userId
  article.type!.communication = isCommunication
  article.internal = isInternal
  article.createdAt = createdAt.toISOString()
  return article
}

describe('article delete action', () => {
  it('returns article delete for editable ticket', () => {
    setupView('agent')
    const ticket = createTicket({ policy: { update: true } })
    const article = createDeletableArticle()
    const actions = createTestArticleActions(ticket, article)
    expect(actions.find((a) => a.name === 'articleDelete')).toBeDefined()
  })

  it('does not return article delete for article created by another user', () => {
    setupView('agent')
    const ticket = createTicket({ policy: { update: true } })
    const article = createDeletableArticle('456')
    const actions = createTestArticleActions(ticket, article)
    expect(actions.find((a) => a.name === 'articleDelete')).toBeUndefined()
  })

  it('does not return article delete for communication article', () => {
    setupView('agent')
    const ticket = createTicket({ policy: { update: true } })
    const article = createDeletableArticle('123', true, false)
    const actions = createTestArticleActions(ticket, article)
    expect(actions.find((a) => a.name === 'articleDelete')).toBeUndefined()
  })

  it('returns article delete for internal communication article', () => {
    setupView('agent')
    const ticket = createTicket({ policy: { update: true } })
    const article = createDeletableArticle('123', true, true)
    const actions = createTestArticleActions(ticket, article)
    expect(actions.find((a) => a.name === 'articleDelete')).toBeDefined()
  })

  it('does not return article delete for old article', () => {
    mockApplicationConfig({ ui_ticket_zoom_article_delete_timeframe: 600 })
    setupView('agent')
    const ticket = createTicket({ policy: { update: true } })
    const article = createDeletableArticle(
      '123',
      false,
      false,
      new Date('1999 12 31'),
    )
    const actions = createTestArticleActions(ticket, article)
    expect(actions.find((a) => a.name === 'articleDelete')).toBeUndefined()
  })

  it('returns article delete for old article if delete timeframe is disabled', () => {
    mockApplicationConfig({
      ui_ticket_zoom_article_delete_timeframe: undefined,
    })
    setupView('agent')
    const ticket = createTicket({ policy: { update: true } })
    const article = createDeletableArticle(
      '123',
      false,
      false,
      new Date('1999 12 31'),
    )
    const actions = createTestArticleActions(ticket, article)
    expect(actions.find((a) => a.name === 'articleDelete')).toBeDefined()
  })

  const views: TicketView[] = ['agent', 'customer']
  it.each(views)(
    "doesn't return article delete for non-editable tickets %s",
    (view) => {
      setupView(view)
      const ticket = createTicket({ policy: { update: false } })
      const article = createDeletableArticle()
      const actions = createTestArticleActions(ticket, article)
      expect(actions.find((a) => a.name === 'articleDelete')).toBeUndefined()
    },
  )

  it("doesn't return article delete for customer", () => {
    setupView('customer')
    const ticket = createTicket({ policy: { update: true } })
    const article = createTicketArticle()
    const actions = createTestArticleActions(ticket, article)
    expect(actions.find((a) => a.name === 'articleDelete')).toBeUndefined()
  })
})