mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-05-01 11:19:32 -05:00
279 lines
7.9 KiB
TypeScript
279 lines
7.9 KiB
TypeScript
import { TestBed } from '@angular/core/testing'
|
|
import {
|
|
ConsumerStatusService,
|
|
FILE_STATUS_MESSAGES,
|
|
FileStatusPhase,
|
|
} from './consumer-status.service'
|
|
import {
|
|
HttpClientTestingModule,
|
|
HttpTestingController,
|
|
} from '@angular/common/http/testing'
|
|
import { environment } from 'src/environments/environment'
|
|
import { DocumentService } from './rest/document.service'
|
|
import { HttpEventType, HttpResponse } from '@angular/common/http'
|
|
import WS from 'jest-websocket-mock'
|
|
|
|
describe('ConsumerStatusService', () => {
|
|
let httpTestingController: HttpTestingController
|
|
let consumerStatusService: ConsumerStatusService
|
|
let documentService: DocumentService
|
|
const server = new WS(
|
|
`${environment.webSocketProtocol}//${environment.webSocketHost}${environment.webSocketBaseUrl}status/`,
|
|
{ jsonProtocol: true }
|
|
)
|
|
|
|
beforeEach(() => {
|
|
TestBed.configureTestingModule({
|
|
providers: [ConsumerStatusService, DocumentService],
|
|
imports: [HttpClientTestingModule],
|
|
})
|
|
|
|
httpTestingController = TestBed.inject(HttpTestingController)
|
|
consumerStatusService = TestBed.inject(ConsumerStatusService)
|
|
documentService = TestBed.inject(DocumentService)
|
|
})
|
|
|
|
afterEach(() => {
|
|
httpTestingController.verify()
|
|
})
|
|
|
|
it('should update status on websocket processing progress', () => {
|
|
const task_id = '1234'
|
|
const status = consumerStatusService.newFileUpload('file.pdf')
|
|
expect(status.getProgress()).toEqual(0)
|
|
|
|
consumerStatusService.connect()
|
|
|
|
consumerStatusService
|
|
.onDocumentConsumptionFinished()
|
|
.subscribe((filestatus) => {
|
|
expect(filestatus.phase).toEqual(FileStatusPhase.SUCCESS)
|
|
})
|
|
|
|
consumerStatusService.onDocumentDetected().subscribe((filestatus) => {
|
|
expect(filestatus.phase).toEqual(FileStatusPhase.STARTED)
|
|
})
|
|
|
|
server.send({
|
|
task_id,
|
|
filename: 'file.pdf',
|
|
current_progress: 50,
|
|
max_progress: 100,
|
|
document_id: 12,
|
|
status: 'WORKING',
|
|
})
|
|
|
|
expect(status.getProgress()).toBeCloseTo(0.6) // (0.8 * 50/100) + .2
|
|
expect(consumerStatusService.getConsumerStatusNotCompleted()).toEqual([
|
|
status,
|
|
])
|
|
|
|
server.send({
|
|
task_id,
|
|
filename: 'file.pdf',
|
|
current_progress: 100,
|
|
max_progress: 100,
|
|
document_id: 12,
|
|
status: 'SUCCESS',
|
|
message: FILE_STATUS_MESSAGES.finished,
|
|
})
|
|
|
|
expect(status.getProgress()).toEqual(1)
|
|
expect(consumerStatusService.getConsumerStatusNotCompleted()).toHaveLength(
|
|
0
|
|
)
|
|
expect(consumerStatusService.getConsumerStatusCompleted()).toHaveLength(1)
|
|
|
|
consumerStatusService.disconnect()
|
|
})
|
|
|
|
it('should update status on websocket failed progress', () => {
|
|
const task_id = '1234'
|
|
const status = consumerStatusService.newFileUpload('file.pdf')
|
|
status.taskId = task_id
|
|
consumerStatusService.connect()
|
|
|
|
consumerStatusService
|
|
.onDocumentConsumptionFailed()
|
|
.subscribe((filestatus) => {
|
|
expect(filestatus.phase).toEqual(FileStatusPhase.FAILED)
|
|
})
|
|
|
|
server.send({
|
|
task_id,
|
|
filename: 'file.pdf',
|
|
current_progress: 50,
|
|
max_progress: 100,
|
|
document_id: 12,
|
|
})
|
|
|
|
expect(consumerStatusService.getConsumerStatusNotCompleted()).toEqual([
|
|
status,
|
|
])
|
|
|
|
server.send({
|
|
task_id,
|
|
filename: 'file.pdf',
|
|
current_progress: 50,
|
|
max_progress: 100,
|
|
document_id: 12,
|
|
status: 'FAILED',
|
|
message: FILE_STATUS_MESSAGES.document_already_exists,
|
|
})
|
|
|
|
expect(consumerStatusService.getConsumerStatusNotCompleted()).toHaveLength(
|
|
0
|
|
)
|
|
expect(consumerStatusService.getConsumerStatusCompleted()).toHaveLength(1)
|
|
})
|
|
|
|
it('should update status on upload progress', () => {
|
|
const task_id = '1234'
|
|
const status = consumerStatusService.newFileUpload('file.pdf')
|
|
|
|
documentService.uploadDocument({}).subscribe((event) => {
|
|
if (event.type === HttpEventType.Response) {
|
|
status.taskId = event.body['task_id']
|
|
status.message = $localize`Upload complete, waiting...`
|
|
} else if (event.type === HttpEventType.UploadProgress) {
|
|
status.updateProgress(
|
|
FileStatusPhase.UPLOADING,
|
|
event.loaded,
|
|
event.total
|
|
)
|
|
}
|
|
})
|
|
|
|
const req = httpTestingController.expectOne(
|
|
`${environment.apiBaseUrl}documents/post_document/`
|
|
)
|
|
|
|
req.event(
|
|
new HttpResponse({
|
|
body: {
|
|
task_id,
|
|
},
|
|
})
|
|
)
|
|
|
|
req.event({
|
|
type: HttpEventType.UploadProgress,
|
|
loaded: 100,
|
|
total: 300,
|
|
})
|
|
|
|
expect(
|
|
consumerStatusService.getConsumerStatus(FileStatusPhase.UPLOADING)
|
|
).toEqual([status])
|
|
expect(consumerStatusService.getConsumerStatus()).toEqual([status])
|
|
expect(consumerStatusService.getConsumerStatusNotCompleted()).toEqual([
|
|
status,
|
|
])
|
|
|
|
req.event({
|
|
type: HttpEventType.UploadProgress,
|
|
loaded: 300,
|
|
total: 300,
|
|
})
|
|
|
|
expect(status.getProgress()).toEqual(0.2) // 0.2 * 300/300
|
|
})
|
|
|
|
it('should support dismiss completed', () => {
|
|
consumerStatusService.connect()
|
|
server.send({
|
|
task_id: '1234',
|
|
filename: 'file.pdf',
|
|
current_progress: 100,
|
|
max_progress: 100,
|
|
document_id: 12,
|
|
status: 'SUCCESS',
|
|
message: 'finished',
|
|
})
|
|
|
|
expect(consumerStatusService.getConsumerStatusCompleted()).toHaveLength(1)
|
|
consumerStatusService.dismissCompleted()
|
|
expect(consumerStatusService.getConsumerStatusCompleted()).toHaveLength(0)
|
|
consumerStatusService.disconnect()
|
|
})
|
|
|
|
it('should support dismiss', () => {
|
|
const task_id = '1234'
|
|
const status = consumerStatusService.newFileUpload('file.pdf')
|
|
status.taskId = task_id
|
|
status.updateProgress(FileStatusPhase.UPLOADING, 50, 100)
|
|
|
|
const status2 = consumerStatusService.newFileUpload('file2.pdf')
|
|
status2.updateProgress(FileStatusPhase.UPLOADING, 50, 100)
|
|
|
|
expect(
|
|
consumerStatusService.getConsumerStatus(FileStatusPhase.UPLOADING)
|
|
).toEqual([status, status2])
|
|
expect(consumerStatusService.getConsumerStatus()).toEqual([status, status2])
|
|
expect(consumerStatusService.getConsumerStatusNotCompleted()).toEqual([
|
|
status,
|
|
status2,
|
|
])
|
|
|
|
consumerStatusService.dismiss(status)
|
|
expect(consumerStatusService.getConsumerStatus()).toEqual([status2])
|
|
|
|
consumerStatusService.dismiss(status2)
|
|
expect(consumerStatusService.getConsumerStatus()).toHaveLength(0)
|
|
})
|
|
|
|
it('should support fail', () => {
|
|
const task_id = '1234'
|
|
const status = consumerStatusService.newFileUpload('file.pdf')
|
|
status.taskId = task_id
|
|
status.updateProgress(FileStatusPhase.UPLOADING, 50, 100)
|
|
expect(consumerStatusService.getConsumerStatusNotCompleted()).toHaveLength(
|
|
1
|
|
)
|
|
expect(consumerStatusService.getConsumerStatusCompleted()).toHaveLength(0)
|
|
consumerStatusService.fail(status, 'fail')
|
|
expect(consumerStatusService.getConsumerStatusNotCompleted()).toHaveLength(
|
|
0
|
|
)
|
|
expect(consumerStatusService.getConsumerStatusCompleted()).toHaveLength(1)
|
|
})
|
|
|
|
it('should notify of document created on status message without upload', () => {
|
|
let detected = false
|
|
consumerStatusService.onDocumentDetected().subscribe((filestatus) => {
|
|
expect(filestatus.phase).toEqual(FileStatusPhase.STARTED)
|
|
detected = true
|
|
})
|
|
|
|
consumerStatusService.connect()
|
|
server.send({
|
|
task_id: '1234',
|
|
filename: 'file.pdf',
|
|
current_progress: 0,
|
|
max_progress: 100,
|
|
message: 'new_file',
|
|
status: 'STARTED',
|
|
})
|
|
|
|
consumerStatusService.disconnect()
|
|
expect(detected).toBeTruthy()
|
|
})
|
|
|
|
it('should notify of document in progress without upload', () => {
|
|
consumerStatusService.connect()
|
|
server.send({
|
|
task_id: '1234',
|
|
filename: 'file.pdf',
|
|
current_progress: 50,
|
|
max_progress: 100,
|
|
docuement_id: 12,
|
|
status: 'WORKING',
|
|
})
|
|
|
|
consumerStatusService.disconnect()
|
|
expect(consumerStatusService.getConsumerStatusNotCompleted()).toHaveLength(
|
|
1
|
|
)
|
|
})
|
|
})
|