import { describe, expect, it } from 'vitest'; import { NextcloudFormError } from '@/lib/nextcloud-status-api'; import { CLOUD_FORM_ERROR_CODES, cloudFormErrorKey, isAllowedLogoFileType, validateCloudForm, } from './cloud-form-errors'; const OK = { customerName: 'Kunde', baseUrl: 'https://cloud.example.de', logoMode: 'none' as const, logoUrl: '', }; describe('validateCloudForm', () => { it('gueltige Eingaben -> null', () => { expect(validateCloudForm(OK)).toBeNull(); }); it('Name: leer und zu lang', () => { expect(validateCloudForm({ ...OK, customerName: ' ' })).toBe('customerNameRequired'); expect(validateCloudForm({ ...OK, customerName: 'x'.repeat(121) })).toBe('customerNameTooLong'); }); it('Adresse: leer, ohne Schema, falsches Schema', () => { expect(validateCloudForm({ ...OK, baseUrl: '' })).toBe('baseUrlRequired'); expect(validateCloudForm({ ...OK, baseUrl: 'cloud.example.de' })).toBe('baseUrlInvalid'); expect(validateCloudForm({ ...OK, baseUrl: 'ftp://x' })).toBe('baseUrlInvalid'); }); it('Bildadresse nur im Modus url geprueft', () => { for (const logoUrl of ['ftp://x', 'kein link', 'http://u:p@a.de/x.png']) { expect(validateCloudForm({ ...OK, logoMode: 'url', logoUrl })).toBe('logoUrlInvalid'); } for (const logoUrl of ['http://logo.example.de/a.png', 'https://logo.example.de/a.png', '']) { expect(validateCloudForm({ ...OK, logoMode: 'url', logoUrl })).toBeNull(); } expect(validateCloudForm({ ...OK, logoMode: 'none', logoUrl: 'ftp://x' })).toBeNull(); expect(validateCloudForm({ ...OK, logoMode: 'upload', logoUrl: 'ftp://x' })).toBeNull(); }); }); describe('isAllowedLogoFileType', () => { it('nur PNG, JPEG, GIF, WebP', () => { for (const t of ['image/png', 'image/jpeg', 'image/gif', 'image/webp']) { expect(isAllowedLogoFileType(t)).toBe(true); } expect(isAllowedLogoFileType('image/svg+xml')).toBe(false); expect(isAllowedLogoFileType('')).toBe(false); }); }); describe('cloudFormErrorKey', () => { it('bekannte Kennungen -> errors.', () => { for (const code of CLOUD_FORM_ERROR_CODES) { expect(cloudFormErrorKey(new NextcloudFormError(400, code, 'x'), 'saveError')).toBe( `errors.${code}`, ); } }); it('413 und 404 ohne Kennung', () => { expect( cloudFormErrorKey(new NextcloudFormError(413, null, 'File too large'), 'saveError'), ).toBe('errors.logoFileTooLarge'); expect(cloudFormErrorKey(new NextcloudFormError(404, null, 'Not Found'), 'deleteError')).toBe( 'errors.notFound', ); }); it('unbekannte Kennung, englischer Text oder einfacher Fehler -> allgemeiner Text', () => { expect(cloudFormErrorKey(new NextcloudFormError(400, 'whatever', 'x'), 'saveError')).toBe( 'saveError', ); expect( cloudFormErrorKey( new NextcloudFormError(400, null, 'logoUrl must be a URL address'), 'saveError', ), ).toBe('saveError'); expect(cloudFormErrorKey(new Error('boom'), 'deleteError')).toBe('deleteError'); }); });