// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/ /* eslint-disable no-irregular-whitespace */ import { describe, it, assert } from 'vitest' import { htmlCleanup } from '../htmlCleanup.ts' // htmlCleanup describe('htmlCleanup utility', () => { it('removes comments', () => { const source = '
test
' const should = '
test
' const result = htmlCleanup(source) assert.equal(result, should, source) }) it('keeps text as is', () => { const source = 'some link to somewhere' const should = 'some link to somewhere' const result = htmlCleanup(source) assert.equal(result, should, source) }) it('keeps lists as is', () => { const source = '
  • a
  • b
  • ' const should = '
  • a
  • b
  • ' const result = htmlCleanup(source) assert.equal(result, should, source) }) it('keeps link', () => { const source = '

    some link to somewhere

    ' const should = '

    some link to somewhere

    ' const result = htmlCleanup(source) assert.equal(result, should, source) }) // This is done on backend // source = '

    some link to somewhere

    ' // should = '

    some link to somewhere

    ' // result = htmlCleanup(source) // assert.equal(result, should, source) it('removes "small" tag', () => { const source = 'some link to somewhere' const should = 'some link to somewhere' const result = htmlCleanup(source) assert.equal(result, should, source) }) it('removes "time" tag', () => { const source = '
    ' const should = '
    some link to somewhere
    ' const result = htmlCleanup(source) assert.equal(result, should, source) }) it('removes wrapper for several children', () => { const source = '

    some h1 for somewhere


    ' const should = '

    some h1 for somewhere


    ' const result = htmlCleanup(source) assert.equal(result, should, source) }) it('removes wrapper for "br"', () => { const source = '

    ' const should = '

    ' const result = htmlCleanup(source) assert.equal(result, should, source) }) it('keeps inner div', () => { const source = '

    ' const should = '

    ' const result = htmlCleanup(source) assert.equal(result, should, source) }) it('removes form', () => { const source = '
    test 123
    ' const should = 'test 123' const result = htmlCleanup(source) assert.equal(result, should, source) }) it('removes subform', () => { const source = '
    test 123
    some other value' const should = 'test 123 some other value' const result = htmlCleanup(source) assert.equal(result, should, source) }) it('removes form tag and input', () => { const source = '
    test 123
    some other value' const should = 'test 123 some other value' const result = htmlCleanup(source) assert.equal(result, should, source) }) it('removes svg', () => { const source = 'This is some text!' const should = 'This is some text!' const result = htmlCleanup(source) assert.equal(result, should, source) }) it('removes "w" an "o" tags', () => { const source = '

    some link to somewhere from wordabc

    ' // should = "

    some link to somewhere from wordabc

    " const should = '

    some link to somewhere from wordabc

    ' const result = htmlCleanup(source) assert.equal(result, should, source) }) it('clears external tags', () => { const source = '
    \n' const should = '
    Gruppe *
    Besitzer
    Status *
    ' const result = htmlCleanup(source) assert.equal(result, should, source) }) it('clears html head', () => { const source = '\n\n\n \n \n \n \n\n\n

    1.\nGehe auf https://www.pferdiathek.ge

    \n


    \n\n

    \n

    2.\nMelde Dich mit folgende Zugangsdaten an:

    \n

    Benutzer:\nme@xxx.net

    \n

    Passwort:\nxxx.

    \n\n' const should = '

    1.\nGehe auf https://www.pferdiathek.ge

    2.\nMelde Dich mit folgende Zugangsdaten an:

    Benutzer:\nme@xxx.net

    Passwort:\nxxx.

    \n' const result = htmlCleanup(source) assert.equal(result, should, source) }) it('clears table', () => { const source = '
    aaa
    value
    ' const should = '
    aaa
    value
    ' const result = htmlCleanup(source) assert.equal(result, should, source) }) it('clears lists and new lines', () => { const source = `
    Wir führen eine (Produktiv-) Freshdesk Migratione für hosted Kunden kostenfrei durch.

    Ablauf der Migration:

    • Abstimmung zum Projektablauf und Zeitplan
    • Produktivmigration zum gewünschten Zeitpunkt. Dabei werden folgende Attribute übertragen:
      • Companys
      • User (Agenten+Kontakte)
      • Gruppen
      • Tickets (inkl. aller Artikel und Anhänge)
      • Individuelle Felder (User, Ticket, Company)
      • Time-Accounting der Tickets (sofern im Freshdesk-Plan enthalten)
    • Nach erfolgreicher Migration ist direkt die Anmeldung durch den hinterlegten User möglich
    • Passwörter von anderen Usern können nicht mit übergeben werden, daher müssen sich weitere User über Standard Authentifizierung, wie z.B. der Passwort-zurücksetzen Funktion am System anmelden
    • Zum gewünschten Zeitpunkt werden die Postfächer aktiviert (durch uns)
    • Manuelle Zuweisung des Postfaches (durch den Kunden)

    Weiteres Vorgehen:

    Während der Migration kommt es zu einer Downtime, in der keine Tickets erstellt werden können. Die Downtime kann vorab abgeschätzt werden. Dafür brauchen wir folgende Informationen:
    Außerdem benötigen wir:
    Sobald wir alle Informationen haben, werden wir Ihnen die Downtime zukommen lassen und danach mit dem Kunden alle weiteren Termine abstimmen.

    zusätzliche Testmigration?

    Möchte der Kunde auf Nummer Sicher gehen und eine Testmigration durchführen, damit er genügend Zeit hat sich mit dem Zammad System und den dazugehörigen Einstellungen vertraut machen? Das ist kein Problem! Über den kostenfreien Migrationsservice in Form der oben beschriebenen Produktiv-Migration hinaus, bieten wir eine zusätzliche Testmigration für 1.450€ an. Dieses Migrationspaket beinhaltet eine zusätzliche Testmigration sowie eventuelle Anpassungswünsche (vgl. Checkliste OTRS Migration). Je nachdem, ob sich weitere Anpassungswünsche aus der Checkliste ergeben, können die Kosten steigen.
    ` const should = '
    Wir führen eine (Produktiv-) Freshdesk Migratione für hosted Kunden kostenfrei durch.

    Ablauf der Migration:

    • Abstimmung zum Projektablauf und Zeitplan
    • Produktivmigration zum gewünschten Zeitpunkt. Dabei werden folgende Attribute übertragen:
      • Companys
      • User (Agenten+Kontakte)
      • Gruppen
      • Tickets (inkl. aller Artikel und Anhänge)
      • Individuelle Felder (User, Ticket, Company)
      • Time-Accounting der Tickets (sofern im Freshdesk-Plan enthalten)
    • Nach erfolgreicher Migration ist direkt die Anmeldung durch den hinterlegten User möglich
    • Passwörter von anderen Usern können nicht mit übergeben werden, daher müssen sich weitere User über Standard Authentifizierung, wie z.B. der Passwort-zurücksetzen Funktion am System anmelden
    • Zum gewünschten Zeitpunkt werden die Postfächer aktiviert (durch uns)
    • Manuelle Zuweisung des Postfaches (durch den Kunden)

    Weiteres Vorgehen:

    Während der Migration kommt es zu einer Downtime, in der keine Tickets erstellt werden können. Die Downtime kann vorab abgeschätzt werden. Dafür brauchen wir folgende Informationen:
    Außerdem benötigen wir:
    Sobald wir alle Informationen haben, werden wir Ihnen die Downtime zukommen lassen und danach mit dem Kunden alle weiteren Termine abstimmen.

    zusätzliche Testmigration?

    Möchte der Kunde auf Nummer Sicher gehen und eine Testmigration durchführen, damit er genügend Zeit hat sich mit dem Zammad System und den dazugehörigen Einstellungen vertraut machen? Das ist kein Problem! Über den kostenfreien Migrationsservice in Form der oben beschriebenen Produktiv-Migration hinaus, bieten wir eine zusätzliche Testmigration für 1.450€ an. Dieses Migrationspaket beinhaltet eine zusätzliche Testmigration sowie eventuelle Anpassungswünsche (vgl. Checkliste OTRS Migration). Je nachdem, ob sich weitere Anpassungswünsche aus der Checkliste ergeben, können die Kosten steigen.
    ' const result = htmlCleanup(source) assert.equal(result, should, source) }) test("doesn't remove extra break lines", () => { const source = `

    This is a note

    On .+, #{article.created_by.fullname} wrote:

    \n


    #{article.body}

    \n


    ` const should = '

    This is a note

    On .+, #{article.created_by.fullname} wrote:


    #{article.body}


    ' const result = htmlCleanup(source) assert.equal(result, should, source) }) // strip out browser-inserted (broken) link (see https://github.com/zammad/zammad/issues/2019) // should not be possible in the new tech stack // source = // '
    test
    ' // should = // 'test' // result = htmlCleanup(source) // assert.equal(result, should, source) // this is done on the backend now // source = // '
    aaa
    value
    ' // should = // '
    aaa
    value
    ' // result = htmlCleanup(source) // result.get(0).outerHTML // // equal(result.get(0).outerHTML, should, source) / string order is different on browsers // assert.equal(result.first().attr('bgcolor'), 'green') // assert.equal(result.first().attr('style'), 'color:red;') // assert.equal(result.first().attr('aaa'), undefined) // assert.equal(result.find('tr').first().attr('style'), 'margin-top:10px;') // assert.equal(result.find('th').first().attr('colspan'), '2') // assert.equal(result.find('th').first().attr('abc'), undefined) // assert.equal(result.find('th').first().attr('style'), 'margin-top:12px;') // source = // '
    aaa
    value
    ' // should = // '
    aaa
    value
    ' // result = htmlCleanup(source) // // equal(result.get(0).outerHTML, should, source) / string order is different on browsers // assert.equal(result.first().attr('bgcolor'), 'green') // assert.equal(result.first().attr('style'), 'color:red;') // assert.equal(result.first().attr('aaa'), undefined) // assert.equal(result.find('tr').first().attr('style'), undefined) // assert.equal(result.find('th').first().attr('colspan'), '2') // assert.equal(result.find('th').first().attr('abc'), undefined) // assert.equal(result.find('th').first().attr('style'), undefined) // https://github.com/zammad/zammad/issues/4445 // source = // 'This is a black font colour with white background' // should = 'This is a black font colour with white background' // result = htmlCleanup(source) // assert.equal(result, should, source) // source = // '
    This is a black font colour with white background
    ' // should = // '
    This is a black font colour with white background
    ' // result = htmlCleanup(source) // assert.equal(result, should, source) })