Files
lmnp-organizer/frontend/src/app/components/guarantee-deed-list/guarantee-deed-list.spec.ts
T
nessar 878da155bd chore: add husky pre-commit hook and lint-staged configuration
- Created a pre-commit hook in .husky to run lint-staged.
- Added .lintstagedrc.mjs to format frontend files with Prettier and apply Spotless to backend Java files.
- Introduced .prettierignore to exclude specific directories from formatting.
2026-08-17 14:18:16 +02:00

117 lines
3.8 KiB
TypeScript

import { TestBed } from '@angular/core/testing';
import { Subject, throwError } from 'rxjs';
import { vi } from 'vitest';
import {
GuaranteeDeed,
GuaranteeRequirement,
LeaseFinalizationService,
} from '../../services/lease-finalization.service';
import { GuaranteeDeedList } from './guarantee-deed-list';
describe('GuaranteeDeedList', () => {
const requirement: GuaranteeRequirement = {
guarantorId: 'guarantor-1',
guarantorName: 'Alex Durand',
tenantId: 'tenant-1',
tenantName: 'Camille Martin',
deed: null,
};
const deed: GuaranteeDeed = {
guarantorId: 'guarantor-1',
tenantId: 'tenant-1',
fileName: 'cautionnement.pdf',
sha256: 'sha256',
authorId: 'owner-1',
uploadedAt: '2026-07-19T10:00:00Z',
};
const uploadGuaranteeDeed = vi.fn();
beforeEach(() => {
vi.clearAllMocks();
TestBed.configureTestingModule({
providers: [{ provide: LeaseFinalizationService, useValue: { uploadGuaranteeDeed } }],
});
});
function createList(requirements = [requirement]) {
const fixture = TestBed.createComponent(GuaranteeDeedList);
fixture.componentRef.setInput('leaseId', 'lease-1');
fixture.componentRef.setInput('requirements', requirements);
fixture.componentRef.setInput('simulatorUrl', 'https://www.service-public.fr/simulateur');
fixture.detectChanges();
return fixture;
}
it('shows each pair and an accessible official simulator link', () => {
const fixture = createList();
const link: HTMLAnchorElement = fixture.nativeElement.querySelector('details a');
expect(fixture.nativeElement.textContent).toContain('Alex Durand garantit Camille Martin');
expect(link.href).toBe('https://www.service-public.fr/simulateur');
expect(link.target).toBe('_blank');
expect(link.rel).toContain('noopener');
expect(fixture.nativeElement.textContent).toContain('sans vérifier les signatures');
});
it('requires both a PDF and the attestation, with local pending feedback', () => {
const response = new Subject<GuaranteeDeed>();
uploadGuaranteeDeed.mockReturnValue(response);
const fixture = createList();
const component = fixture.componentInstance;
const file = new File(['deed'], 'cautionnement.pdf', { type: 'application/pdf' });
const uploaded = vi.fn();
component.deedUploaded.subscribe(uploaded);
const button: HTMLButtonElement = fixture.nativeElement.querySelector('button');
expect(button.disabled).toBe(true);
component.selectedFiles.set({ 'guarantor-1:tenant-1': file });
component.setAttestation(requirement, true);
fixture.detectChanges();
button.click();
fixture.detectChanges();
expect(uploadGuaranteeDeed).toHaveBeenCalledWith(
'lease-1',
file,
'guarantor-1',
'tenant-1',
);
expect(fixture.nativeElement.textContent).toContain('Téléversement…');
response.next(deed);
response.complete();
expect(uploaded).toHaveBeenCalledWith({
guarantorId: 'guarantor-1',
tenantId: 'tenant-1',
deed,
});
});
it('keeps an upload failure local to its pair', () => {
uploadGuaranteeDeed.mockReturnValue(
throwError(() => ({ error: { message: 'Acte refusé' } })),
);
const fixture = createList();
const component = fixture.componentInstance;
component.selectedFiles.set({
'guarantor-1:tenant-1': new File(['deed'], 'cautionnement.pdf', {
type: 'application/pdf',
}),
});
component.setAttestation(requirement, true);
component.upload(requirement);
fixture.detectChanges();
expect(fixture.nativeElement.textContent).toContain('Acte refusé');
expect(fixture.nativeElement.querySelector('[role=alert]')).not.toBeNull();
});
it('renders an already uploaded deed without another upload form', () => {
const fixture = createList([{ ...requirement, deed }]);
expect(fixture.nativeElement.textContent).toContain('cautionnement.pdf');
expect(fixture.nativeElement.querySelector('input[type=file]')).toBeNull();
});
});