135 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
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<MarkdownViewerComponent>;
 | 
						|
  let markdownService: jasmine.SpyObj<MarkdownService>;
 | 
						|
 | 
						|
  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<MarkdownService>;
 | 
						|
    fixture = TestBed.createComponent(MarkdownViewerComponent);
 | 
						|
    component = fixture.componentInstance;
 | 
						|
  });
 | 
						|
 | 
						|
  it('should create', () => {
 | 
						|
    expect(component).toBeTruthy();
 | 
						|
  });
 | 
						|
 | 
						|
  it('should render markdown content', () => {
 | 
						|
    const testMarkdown = '# Hello World';
 | 
						|
    const expectedHtml = '<h1>Hello World</h1>';
 | 
						|
    
 | 
						|
    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('<p>Test</p>');
 | 
						|
    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('<p>Test</p>');
 | 
						|
    component.content = '# Test';
 | 
						|
    component.currentNote = currentNote;
 | 
						|
    
 | 
						|
    fixture.detectChanges();
 | 
						|
    
 | 
						|
    expect(markdownService.render).toHaveBeenCalledWith('# Test', [], currentNote);
 | 
						|
  });
 | 
						|
});
 |