2025-09-28 17:55:05 +03:00
const { parser , url , request } = require ( './mncvision.id.config.js' )
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' )
dayjs . extend ( customParseFormat )
dayjs . extend ( utc )
jest . mock ( 'axios' )
const date = dayjs . utc ( '2023-11-19' ). startOf ( 'd' )
const channel = {
site_id : '154' ,
xmltv_id : 'AXN.id' ,
lang : 'id'
}
const indonesiaHeaders = {
'set-cookie' : [
's1nd0vL=uo6gsashc1rmloqbb50m6b13qkglfvpl; expires=Sat, 18-Nov-2023 20:45:02 GMT; Max-Age=7200; path=/; HttpOnly'
]
}
const englishHeaders = {
'set-cookie' : [
's1nd0vL=imtot2v1cs0pbemaohj9fee3hlbqo699; expires=Sat, 18-Nov-2023 20:38:31 GMT; Max-Age=7200; path=/; HttpOnly'
]
}
axios . get . mockImplementation (( url , opts ) => {
if ( url === 'https://www.mncvision.id/language_switcher/setlang/indonesia/' ) {
return Promise . resolve ({
headers : indonesiaHeaders
})
}
if ( url === 'https://www.mncvision.id/language_switcher/setlang/english/' ) {
return Promise . resolve ({
headers : englishHeaders
})
}
if (
url === 'https://www.mncvision.id/schedule/detail/20231119001500154/Blue-Bloods-S13-Ep-19/1'
) {
const getCookie = headers => {
if ( Array . isArray ( headers [ 'set-cookie' ])) {
return headers [ 'set-cookie' ][ 0 ]. split ( '; ' )[ 0 ]
}
}
if ( opts . headers [ 'Cookie' ] === getCookie ( indonesiaHeaders )) {
return Promise . resolve ({
data : fs . readFileSync ( path . resolve ( __dirname , '__data__/program_id.html' ))
})
}
if ( opts . headers [ 'Cookie' ] === getCookie ( englishHeaders )) {
return Promise . resolve ({
data : fs . readFileSync ( path . resolve ( __dirname , '__data__/program_en.html' ))
})
}
}
return Promise . resolve ({ data : '' })
})
it ( 'can generate valid url' , () => {
expect ( url ). toBe ( 'https://www.mncvision.id/schedule/table' )
})
it ( 'can generate valid request method' , () => {
expect ( request . method ). toBe ( 'POST' )
})
it ( 'can generate valid request headers' , async () => {
expect ( await request . headers ({ channel })). toMatchObject ({
'Content-Type' : 'application/x-www-form-urlencoded'
})
})
it ( 'can generate valid request data' , () => {
const data = request . data ({ channel , date })
expect ( data . get ( 'search_model' )). toBe ( 'channel' )
expect ( data . get ( 'af0rmelement' )). toBe ( 'aformelement' )
expect ( data . get ( 'fdate' )). toBe ( '2023-11-19' )
expect ( data . get ( 'fchannel' )). toBe ( '154' )
expect ( data . get ( 'submit' )). toBe ( 'Search' )
})
it ( 'can parse response' , async () => {
const content = fs . readFileSync ( path . resolve ( __dirname , '__data__/content.html' ))
const indonesiaResults = (
await parser ({ date , content , channel , headers : indonesiaHeaders })
). map ( p => {
p . start = p . start . toJSON ()
p . stop = p . stop . toJSON ()
return p
})
expect ( indonesiaResults [ 0 ]). toMatchObject ({
start : '2023-11-18T17:15:00.000Z' ,
stop : '2023-11-18T18:05:00.000Z' ,
title : 'Blue Bloods S13, Ep 19' ,
episode : 19 ,
description :
'Jamie bekerja sama dengan FDNY untuk menemukan pelaku pembakaran yang bertanggung jawab atas kebakaran hebat yang terjadi di fasilitas penyimpanan bukti milik NYPD.'
})
const englishResults = (
await parser ({ date , content , channel : { ... channel , lang : 'en' }, headers : englishHeaders })
). map ( p => {
p . start = p . start . toJSON ()
p . stop = p . stop . toJSON ()
return p
})
expect ( englishResults [ 0 ]). toMatchObject ({
start : '2023-11-18T17:15:00.000Z' ,
stop : '2023-11-18T18:05:00.000Z' ,
title : 'Blue Bloods S13, Ep 19' ,
episode : 19 ,
description :
'Jamie partners with the FDNY to find the arsonist responsible for a massive fire at an NYPD evidence storage facility.'
})
})
it ( 'can handle empty guide' , async () => {
const content = fs . readFileSync ( path . resolve ( __dirname , '__data__/no_content.html' ))
const results = await parser ({
date ,
channel ,
content ,
headers : indonesiaHeaders
})
expect ( results ). toMatchObject ([])
})