mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-11-03 03:16:10 -06:00 
			
		
		
		
	
		
			
				
	
	
		
			182 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			182 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { ComponentFixture, TestBed } from '@angular/core/testing'
 | 
						|
 | 
						|
import {
 | 
						|
  HttpClient,
 | 
						|
  provideHttpClient,
 | 
						|
  withInterceptorsFromDi,
 | 
						|
} from '@angular/common/http'
 | 
						|
import { provideHttpClientTesting } from '@angular/common/http/testing'
 | 
						|
import { By } from '@angular/platform-browser'
 | 
						|
import { allIcons, NgxBootstrapIconsModule } from 'ngx-bootstrap-icons'
 | 
						|
import { of, throwError } from 'rxjs'
 | 
						|
import { SETTINGS_KEYS } from 'src/app/data/ui-settings'
 | 
						|
import { DocumentService } from 'src/app/services/rest/document.service'
 | 
						|
import { SettingsService } from 'src/app/services/settings.service'
 | 
						|
import { PreviewPopupComponent } from './preview-popup.component'
 | 
						|
 | 
						|
const doc = {
 | 
						|
  id: 10,
 | 
						|
  title: 'Document 10',
 | 
						|
  content: 'Cupcake ipsum dolor sit amet ice cream.',
 | 
						|
  original_file_name: 'sample.pdf',
 | 
						|
  archived_file_name: 'sample.pdf',
 | 
						|
  mime_type: 'application/pdf',
 | 
						|
}
 | 
						|
 | 
						|
describe('PreviewPopupComponent', () => {
 | 
						|
  let component: PreviewPopupComponent
 | 
						|
  let fixture: ComponentFixture<PreviewPopupComponent>
 | 
						|
  let settingsService: SettingsService
 | 
						|
  let documentService: DocumentService
 | 
						|
  let http: HttpClient
 | 
						|
 | 
						|
  beforeEach(() => {
 | 
						|
    TestBed.configureTestingModule({
 | 
						|
      imports: [NgxBootstrapIconsModule.pick(allIcons)],
 | 
						|
      providers: [
 | 
						|
        provideHttpClient(withInterceptorsFromDi()),
 | 
						|
        provideHttpClientTesting(),
 | 
						|
      ],
 | 
						|
    })
 | 
						|
    settingsService = TestBed.inject(SettingsService)
 | 
						|
    documentService = TestBed.inject(DocumentService)
 | 
						|
    http = TestBed.inject(HttpClient)
 | 
						|
    jest
 | 
						|
      .spyOn(documentService, 'getPreviewUrl')
 | 
						|
      .mockImplementation((id) => doc.original_file_name)
 | 
						|
    fixture = TestBed.createComponent(PreviewPopupComponent)
 | 
						|
    component = fixture.componentInstance
 | 
						|
    component.document = { ...doc }
 | 
						|
    jest.useFakeTimers()
 | 
						|
    fixture.detectChanges()
 | 
						|
  })
 | 
						|
 | 
						|
  it('should correctly report if document is pdf', () => {
 | 
						|
    expect(component.isPdf).toBeTruthy()
 | 
						|
    component.document.mime_type = 'application/msword'
 | 
						|
    expect(component.isPdf).toBeTruthy() // still has archive file
 | 
						|
    component.document.archived_file_name = undefined
 | 
						|
    expect(component.isPdf).toBeFalsy()
 | 
						|
  })
 | 
						|
 | 
						|
  it('should return settings for native PDF viewer', () => {
 | 
						|
    settingsService.set(SETTINGS_KEYS.USE_NATIVE_PDF_VIEWER, false)
 | 
						|
    expect(component.useNativePdfViewer).toBeFalsy()
 | 
						|
    settingsService.set(SETTINGS_KEYS.USE_NATIVE_PDF_VIEWER, true)
 | 
						|
    expect(component.useNativePdfViewer).toBeTruthy()
 | 
						|
  })
 | 
						|
 | 
						|
  it('should render object if native PDF viewer enabled', () => {
 | 
						|
    settingsService.set(SETTINGS_KEYS.USE_NATIVE_PDF_VIEWER, true)
 | 
						|
    component.popover.open()
 | 
						|
    fixture.detectChanges()
 | 
						|
    expect(fixture.debugElement.query(By.css('object'))).not.toBeNull()
 | 
						|
  })
 | 
						|
 | 
						|
  it('should render pngx viewer if native PDF viewer disabled', () => {
 | 
						|
    settingsService.set(SETTINGS_KEYS.USE_NATIVE_PDF_VIEWER, false)
 | 
						|
    component.popover.open()
 | 
						|
    fixture.detectChanges()
 | 
						|
    expect(fixture.debugElement.query(By.css('object'))).toBeNull()
 | 
						|
    expect(fixture.debugElement.query(By.css('pdf-viewer'))).not.toBeNull()
 | 
						|
  })
 | 
						|
 | 
						|
  it('should show lock icon on password error', () => {
 | 
						|
    settingsService.set(SETTINGS_KEYS.USE_NATIVE_PDF_VIEWER, false)
 | 
						|
    component.popover.open()
 | 
						|
    component.onError({ name: 'PasswordException' })
 | 
						|
    fixture.detectChanges()
 | 
						|
    expect(component.requiresPassword).toBeTruthy()
 | 
						|
    expect(fixture.debugElement.query(By.css('i-bs'))).not.toBeNull()
 | 
						|
  })
 | 
						|
 | 
						|
  it('should fall back to object for non-pdf', () => {
 | 
						|
    component.document.original_file_name = 'sample.png'
 | 
						|
    component.document.mime_type = 'image/png'
 | 
						|
    component.document.archived_file_name = undefined
 | 
						|
    component.popover.open()
 | 
						|
    fixture.detectChanges()
 | 
						|
    expect(fixture.debugElement.query(By.css('object'))).not.toBeNull()
 | 
						|
  })
 | 
						|
 | 
						|
  it('should show message on error', () => {
 | 
						|
    component.popover.open()
 | 
						|
    component.onError({})
 | 
						|
    fixture.detectChanges()
 | 
						|
    expect(
 | 
						|
      fixture.debugElement.query(By.css('.popover')).nativeElement.textContent
 | 
						|
    ).toContain('Error loading preview')
 | 
						|
  })
 | 
						|
 | 
						|
  it('should get text content from http if appropriate', () => {
 | 
						|
    component.document = {
 | 
						|
      ...doc,
 | 
						|
      original_file_name: 'sample.txt',
 | 
						|
      mime_type: 'text/plain',
 | 
						|
    }
 | 
						|
    const httpSpy = jest.spyOn(http, 'get')
 | 
						|
    httpSpy.mockReturnValueOnce(
 | 
						|
      throwError(() => new Error('Error getting preview'))
 | 
						|
    )
 | 
						|
    component.init()
 | 
						|
    expect(httpSpy).toHaveBeenCalled()
 | 
						|
    expect(component.error).toBeTruthy()
 | 
						|
    httpSpy.mockReturnValueOnce(of('Preview text'))
 | 
						|
    component.init()
 | 
						|
    expect(component.previewText).toEqual('Preview text')
 | 
						|
  })
 | 
						|
 | 
						|
  it('should show preview on mouseover after delay to preload content', () => {
 | 
						|
    component.mouseEnterPreview()
 | 
						|
    expect(component.popover.isOpen()).toBeTruthy()
 | 
						|
    jest.advanceTimersByTime(600)
 | 
						|
    component.close()
 | 
						|
    jest.advanceTimersByTime(600)
 | 
						|
  })
 | 
						|
 | 
						|
  it('should not show preview on mouseover if mouse no longer on preview', () => {
 | 
						|
    component.mouseEnterPreview()
 | 
						|
    jest.advanceTimersByTime(100)
 | 
						|
    component.mouseLeavePreview()
 | 
						|
    jest.advanceTimersByTime(600)
 | 
						|
    expect(component.popover.isOpen()).toBeFalsy()
 | 
						|
  })
 | 
						|
 | 
						|
  it('should not close preview on mouseleave if mouse back on preview', () => {
 | 
						|
    component.close()
 | 
						|
    component.mouseEnterPreview()
 | 
						|
    jest.advanceTimersByTime(300)
 | 
						|
    expect(component.popover.isOpen()).toBeTruthy()
 | 
						|
  })
 | 
						|
 | 
						|
  it('should support immediate close on mouseleave', () => {
 | 
						|
    component.mouseEnterPreview()
 | 
						|
    jest.advanceTimersByTime(600)
 | 
						|
    expect(component.popover.isOpen()).toBeTruthy()
 | 
						|
    component.mouseLeavePreview()
 | 
						|
    component.close(true)
 | 
						|
    jest.advanceTimersByTime(1)
 | 
						|
    expect(component.popover.isOpen()).toBeFalsy()
 | 
						|
  })
 | 
						|
 | 
						|
  it('should dispatch find event on viewer loaded if searchQuery set', () => {
 | 
						|
    documentService.searchQuery = 'test'
 | 
						|
    settingsService.set(SETTINGS_KEYS.USE_NATIVE_PDF_VIEWER, false)
 | 
						|
    component.popover.open()
 | 
						|
    jest.advanceTimersByTime(1000)
 | 
						|
    fixture.detectChanges()
 | 
						|
    // normally setup by pdf-viewer
 | 
						|
    jest.replaceProperty(component.pdfViewer, 'eventBus', {
 | 
						|
      dispatch: jest.fn(),
 | 
						|
    } as any)
 | 
						|
    const dispatchSpy = jest.spyOn(component.pdfViewer.eventBus, 'dispatch')
 | 
						|
    component.onViewerLoaded()
 | 
						|
    expect(dispatchSpy).toHaveBeenCalledWith('find', {
 | 
						|
      query: 'test',
 | 
						|
      caseSensitive: false,
 | 
						|
      highlightAll: true,
 | 
						|
      phraseSearch: true,
 | 
						|
    })
 | 
						|
  })
 | 
						|
})
 |