mirror of
https://github.com/iptv-org/epg
synced 2026-09-06 03:49:49 -04:00
123 lines
4.4 KiB
JavaScript
123 lines
4.4 KiB
JavaScript
const fs = require('fs')
|
|
const path = require('path')
|
|
const axios = require('axios')
|
|
const dayjs = require('dayjs')
|
|
const utc = require('dayjs/plugin/utc')
|
|
const customParseFormat = require('dayjs/plugin/customParseFormat')
|
|
const { channels, parser, url } = require('./dazn.com.config.js')
|
|
|
|
dayjs.extend(utc)
|
|
dayjs.extend(customParseFormat)
|
|
|
|
jest.mock('axios')
|
|
|
|
const date = dayjs.utc('2026-07-19', 'YYYY-MM-DD').startOf('day')
|
|
const channel = { site_id: 'bj5o60qt6uoe1clfdsev239pr' }
|
|
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'), 'utf8')
|
|
|
|
it('can generate valid url', () => {
|
|
expect(url({ channel })).toBe(
|
|
'https://rail-router.discovery.indazn.com/eu/v10/Rail?platform=web&id=Livetvschedule&country=de&brand=dazn&languageCode=de'
|
|
)
|
|
})
|
|
|
|
it('can generate regional url', () => {
|
|
expect(url({ channel: { site_id: 'es#asset-id', lang: 'es' } })).toBe(
|
|
'https://rail-router.discovery.indazn.com/eu/v10/Rail?platform=web&id=Livetvschedule&country=es&brand=dazn&languageCode=es'
|
|
)
|
|
})
|
|
|
|
it('can parse response', () => {
|
|
const results = parser({ content, channel, date })
|
|
|
|
expect(results).toHaveLength(3)
|
|
expect(results[0]).toMatchObject({
|
|
title: 'Spanish Copa del Rey Soccer',
|
|
subTitle: 'Atlético Madrid - FC Barcelona',
|
|
description: 'Aus dem Riyadh Air Metropolitano in Madrid, Spanien.',
|
|
categories: ['Soccer', 'Sports event'],
|
|
date: '2026',
|
|
start: '2026-07-19T15:00:00Z',
|
|
stop: '2026-07-19T17:00:00Z',
|
|
icon: 'https://image.discovery.indazn.com/eu/v3/linear-channel/none/111745_2026-07-19_EP037460110300_108429740567_2026-02-13T20%3A01%3A23Z_GNLZZGG002QL9SB/fill/center/center/none/80/856/481/webp/image?brand=dazn'
|
|
})
|
|
expect(results[2]).toMatchObject({
|
|
title: 'Best of DAZN - Highlights',
|
|
description: 'Bei Best of DAZN erwarten euch ausgewählte Highlights.',
|
|
categories: ['Entertainment', 'Sports non-event'],
|
|
start: '2026-07-19T17:50:00Z',
|
|
stop: '2026-07-19T18:10:00Z'
|
|
})
|
|
})
|
|
|
|
it('can filter response by date', () => {
|
|
const results = parser({ content, channel, date: date.add(1, 'day') })
|
|
|
|
expect(results).toHaveLength(1)
|
|
expect(results[0]).toMatchObject({
|
|
title: 'Bundesliga Soccer',
|
|
start: '2026-07-20T06:00:00Z',
|
|
stop: '2026-07-20T07:05:00Z'
|
|
})
|
|
})
|
|
|
|
it('can handle empty guide', () => {
|
|
expect(parser({ content: '', channel, date })).toEqual([])
|
|
expect(parser({ content, channel: { site_id: '9dmerrb96eue11mjxhgbnyjho' }, date })).toEqual([])
|
|
})
|
|
|
|
it('can create channel list', async () => {
|
|
axios.get.mockResolvedValue({ data: JSON.parse(content) })
|
|
|
|
const results = await channels({ country: 'de' })
|
|
|
|
expect(results).toHaveLength(2)
|
|
expect(results[0]).toMatchObject({
|
|
lang: 'de',
|
|
site_id: 'bj5o60qt6uoe1clfdsev239pr',
|
|
name: 'DAZN 1',
|
|
logo: 'https://image.discovery.indazn.com/eu/v3/linear-channel/none/Logo_LTV_DAZN_1/contain/center/center/none/80/68/56/png/image?brand=dazn'
|
|
})
|
|
expect(results[0]).not.toHaveProperty('xmltv_id')
|
|
})
|
|
|
|
it('can create one deduplicated channel list', async () => {
|
|
axios.get.mockClear()
|
|
axios.get.mockResolvedValue({ data: JSON.parse(content) })
|
|
|
|
const results = await channels()
|
|
|
|
expect(axios.get).toHaveBeenCalledTimes(235)
|
|
expect(results).toHaveLength(18)
|
|
expect(results).toEqual(
|
|
expect.arrayContaining([
|
|
expect.objectContaining({ lang: 'de', site_id: 'bj5o60qt6uoe1clfdsev239pr' }),
|
|
expect.objectContaining({ lang: 'es', site_id: 'es#bj5o60qt6uoe1clfdsev239pr' }),
|
|
expect.objectContaining({ lang: 'en', site_id: 'gb#bj5o60qt6uoe1clfdsev239pr' })
|
|
])
|
|
)
|
|
|
|
const keys = results.map(result => {
|
|
const assetId = result.site_id.includes('#') ? result.site_id.split('#')[1] : result.site_id
|
|
|
|
return `${assetId}#${result.lang}`
|
|
})
|
|
expect(new Set(keys).size).toBe(results.length)
|
|
})
|
|
|
|
it('can create regional channel list', async () => {
|
|
axios.get.mockResolvedValue({ data: JSON.parse(content) })
|
|
|
|
const results = await channels({ country: 'es', lang: 'es' })
|
|
|
|
expect(axios.get).toHaveBeenCalledWith(
|
|
'https://rail-router.discovery.indazn.com/eu/v10/Rail?platform=web&id=Livetvschedule&country=es&brand=dazn&languageCode=es',
|
|
expect.any(Object)
|
|
)
|
|
expect(results[0]).toMatchObject({
|
|
lang: 'es',
|
|
site_id: 'es#bj5o60qt6uoe1clfdsev239pr',
|
|
name: 'DAZN 1'
|
|
})
|
|
})
|