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 ( [ ] )
} )