/* eslint-env jest */
import React from 'react'
import { Route } from 'react-router-dom'
import { jsonApiJobSpecs } from 'factories/jsonApiJobSpecs'
import { jsonApiOcrJobSpecs } from 'factories/jsonApiOcrJobSpecs'
import { syncFetch } from 'test-helpers/syncFetch'
import globPath from 'test-helpers/globPath'
import { mountWithProviders } from 'test-helpers/mountWithTheme'
import JobsIndex, { simpleJobFilter, CombinedJobs } from './JobsIndex'
import { partialAsFull } from 'support/test-helpers/partialAsFull'
import { Initiator, InitiatorType } from 'core/store/models'
import { INDEX_ENDPOINT as JSON_ENDPOINT } from 'api/proxy/v2/specs'
import { ENDPOINT as OCR_ENDPOINT } from 'api/proxy/v2/ocrSpecs'
describe('pages/JobsIndex/JobsIndex', () => {
it('renders the list of jobs', async () => {
global.fetch.getOnce(
globPath(JSON_ENDPOINT),
jsonApiJobSpecs([
{
id: 'JsonId',
createdAt: new Date().toISOString(),
},
]),
)
global.fetch.getOnce(
globPath(OCR_ENDPOINT),
jsonApiOcrJobSpecs([
{
id: '1000000',
createdAt: new Date().toISOString(),
},
]),
)
const wrapper = mountWithProviders()
await syncFetch(wrapper)
expect(wrapper.text()).toContain('JsonId')
expect(wrapper.text()).toContain('1000000')
expect(wrapper.text()).toContain('web')
expect(wrapper.text()).toContain('just now')
})
it('allows searching', async () => {
global.fetch.getOnce(
globPath(JSON_ENDPOINT),
jsonApiJobSpecs([
{
initiators: [
partialAsFull({ type: 'web' as InitiatorType.WEB }),
],
},
{
initiators: [
partialAsFull({ type: 'cron' as InitiatorType.CRON }),
],
},
{
initiators: [
partialAsFull({
type: 'run_log' as InitiatorType.RUN_LOG,
}),
],
},
]),
)
global.fetch.getOnce(
globPath(OCR_ENDPOINT),
jsonApiOcrJobSpecs([
{
id: 'OcrId',
createdAt: new Date().toISOString(),
},
]),
)
const wrapper = mountWithProviders()
await syncFetch(wrapper)
// Expect to have 3 jobs initially
expect(wrapper.find('tbody').children().length).toEqual(4)
wrapper
.find('input[name="search"]')
.simulate('change', { target: { value: 'web' } })
expect(wrapper.find('tbody').children().length).toEqual(1)
})
describe('simpleJobFilter', () => {
it('filters by name', () => {
const jobs = jsonApiJobSpecs([
{
name: 'Coinmarketcap job',
},
{
name: 'Kaiko job',
},
{
name: 'Coinapi job',
},
]).data
const search = 'Kaiko'
expect(jobs.filter(simpleJobFilter(search)).length).toEqual(1)
})
it('filters by initiator', () => {
const jobs = jsonApiJobSpecs([
{
initiators: [
partialAsFull({ type: 'web' as InitiatorType.WEB }),
],
},
{
initiators: [
partialAsFull({ type: 'cron' as InitiatorType.CRON }),
],
},
]).data
const search = 'cr'
expect(jobs.filter(simpleJobFilter(search)).length).toEqual(1)
})
it('filters by ID', () => {
const jobs = jsonApiJobSpecs([
{
id: 'id-1a',
},
{
id: 'id-1b',
},
{
id: 'id-1c',
},
{
id: 'id-2c',
},
]).data
expect(jobs.filter(simpleJobFilter('i')).length).toEqual(4)
expect(jobs.filter(simpleJobFilter('id')).length).toEqual(4)
expect(jobs.filter(simpleJobFilter('id-')).length).toEqual(4)
expect(jobs.filter(simpleJobFilter('id-1')).length).toEqual(3)
expect(jobs.filter(simpleJobFilter('id-1c')).length).toEqual(1)
})
it('filters by job type', () => {
let jobs: CombinedJobs[] = jsonApiJobSpecs([
{
id: 'id-1a',
},
{
id: 'id-1b',
},
]).data
jobs = jobs.concat(
jsonApiOcrJobSpecs([
{
id: '1',
},
]).data,
)
expect(jobs.filter(simpleJobFilter('direct')).length).toEqual(2)
expect(jobs.filter(simpleJobFilter('off')).length).toEqual(1)
expect(jobs.filter(simpleJobFilter('chain')).length).toEqual(1)
})
})
})