import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MarkdownViewerComponent } from './markdown-viewer.component'; import { MarkdownService } from '../../services/markdown.service'; import { DomSanitizer } from '@angular/platform-browser'; describe('MarkdownViewerComponent', () => { let component: MarkdownViewerComponent; let fixture: ComponentFixture; let markdownService: jasmine.SpyObj; beforeEach(async () => { const markdownServiceSpy = jasmine.createSpyObj('MarkdownService', ['render']); await TestBed.configureTestingModule({ imports: [MarkdownViewerComponent], providers: [ { provide: MarkdownService, useValue: markdownServiceSpy } ] }).compileComponents(); markdownService = TestBed.inject(MarkdownService) as jasmine.SpyObj; fixture = TestBed.createComponent(MarkdownViewerComponent); component = fixture.componentInstance; }); it('should create', () => { expect(component).toBeTruthy(); }); it('should render markdown content', () => { const testMarkdown = '# Hello World'; const expectedHtml = '

Hello World

'; markdownService.render.and.returnValue(expectedHtml); component.content = testMarkdown; fixture.detectChanges(); expect(markdownService.render).toHaveBeenCalledWith(testMarkdown, [], undefined); }); it('should detect excalidraw files', () => { component.filePath = 'test.excalidraw.md'; fixture.detectChanges(); expect(component.isExcalidrawFile()).toBe(true); }); it('should not detect regular markdown as excalidraw', () => { component.filePath = 'test.md'; fixture.detectChanges(); expect(component.isExcalidrawFile()).toBe(false); }); it('should toggle fullscreen mode', () => { expect(component.isFullscreen()).toBe(false); component.toggleFullscreen(); expect(component.isFullscreen()).toBe(true); component.toggleFullscreen(); expect(component.isFullscreen()).toBe(false); }); it('should handle render errors gracefully', () => { const testMarkdown = '# Test'; markdownService.render.and.throwError('Render error'); component.content = testMarkdown; fixture.detectChanges(); expect(component.error()).toContain('Erreur de rendu'); }); it('should clear error on content change', () => { component.error.set('Previous error'); component.content = 'New content'; component.ngOnChanges({ content: { currentValue: 'New content', previousValue: 'Old content', firstChange: false, isFirstChange: () => false } }); expect(component.error()).toBeNull(); }); it('should show toolbar when showToolbar is true', () => { component.showToolbar = true; fixture.detectChanges(); const toolbar = fixture.nativeElement.querySelector('.markdown-viewer__toolbar'); expect(toolbar).toBeTruthy(); }); it('should hide toolbar when showToolbar is false', () => { component.showToolbar = false; fixture.detectChanges(); const toolbar = fixture.nativeElement.querySelector('.markdown-viewer__toolbar'); expect(toolbar).toBeFalsy(); }); it('should pass allNotes to markdown service', () => { const testNotes = [ { id: '1', title: 'Note 1', content: 'Content 1' }, { id: '2', title: 'Note 2', content: 'Content 2' } ] as any[]; markdownService.render.and.returnValue('

Test

'); component.content = '# Test'; component.allNotes = testNotes; fixture.detectChanges(); expect(markdownService.render).toHaveBeenCalledWith('# Test', testNotes, undefined); }); it('should pass currentNote to markdown service', () => { const currentNote = { id: '1', title: 'Current', content: 'Content' } as any; markdownService.render.and.returnValue('

Test

'); component.content = '# Test'; component.currentNote = currentNote; fixture.detectChanges(); expect(markdownService.render).toHaveBeenCalledWith('# Test', [], currentNote); }); });