Move scripts to subfolders

This commit is contained in:
Aleksandr Statciuk 2022-02-26 23:21:44 +03:00
parent f0c64a55e4
commit b1a0bcf4b9
36 changed files with 204 additions and 222 deletions

View File

@ -8,12 +8,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Download channels from API
- name: Download data from API
run: |
mkdir -p scripts/data
curl -L -o scripts/data/channels.json https://iptv-org.github.io/api/channels.json
- id: files
uses: jitterbit/get-changed-files@v1
- run: npm install
- run: npm run lint -- ${{ steps.files.outputs.added_modified }}
- run: npm run validate -- ${{ steps.files.outputs.added_modified }}
- run: npm run channels:lint -- ${{ steps.files.outputs.added_modified }}
- run: npm run channels:validate -- ${{ steps.files.outputs.added_modified }}

View File

@ -22,10 +22,10 @@ jobs:
curl -L -o scripts/data/channels.json https://iptv-org.github.io/api/channels.json
- uses: FedericoCarboni/setup-ffmpeg@v1
- run: npm install
- run: CHANNELS_PATH=sites/${{inputs.site}}/*.channels.xml node scripts/commands/create-queue.js --max-clusters=1 --days=2
- run: NODE_OPTIONS=--insecure-http-parser node scripts/commands/load-cluster.js --timeout=30000 --cluster-id=1
- run: node scripts/commands/save-results.js
- run: node scripts/commands/update-guides.js
- run: CHANNELS_PATH=sites/${{inputs.site}}/*.channels.xml npm run queue:create -- --max-clusters=1 --days=2
- run: NODE_OPTIONS=--insecure-http-parser npm run cluster:load -- --timeout=30000 --cluster-id=1
- run: npm run results:save
- run: npm run guides:update
- uses: tibdex/github-app-token@v1
if: ${{ !env.ACT }}
id: create-app-token

View File

@ -9,7 +9,7 @@ jobs:
steps:
- uses: actions/checkout@v2
- run: npm install
- run: node scripts/commands/update-api.js
- run: npm run api:update
- uses: tibdex/github-app-token@v1
if: ${{ !env.ACT }}
id: create-app-token

74
package-lock.json generated
View File

@ -16,6 +16,7 @@
"epg-grabber": "^0.20.0",
"epg-parser": "^0.1.6",
"form-data": "^4.0.0",
"fs-extra": "^10.0.1",
"glob": "^7.2.0",
"iconv-lite": "^0.4.24",
"jest": "^27.3.1",
@ -2377,6 +2378,27 @@
"node": ">= 6"
}
},
"node_modules/fs-extra": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz",
"integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/fs-extra/node_modules/universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/fs-minipass": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
@ -3614,6 +3636,25 @@
"node": ">=6"
}
},
"node_modules/jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/jsonfile/node_modules/universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/keyv": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.4.tgz",
@ -7382,6 +7423,23 @@
"mime-types": "^2.1.12"
}
},
"fs-extra": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz",
"integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==",
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"dependencies": {
"universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
}
}
},
"fs-minipass": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
@ -8308,6 +8366,22 @@
"minimist": "^1.2.5"
}
},
"jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"requires": {
"graceful-fs": "^4.1.6",
"universalify": "^2.0.0"
},
"dependencies": {
"universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
}
}
},
"keyv": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.4.tgz",

View File

@ -1,13 +1,18 @@
{
"name": "epg",
"scripts": {
"lint": "node scripts/commands/lint.js",
"validate": "node scripts/commands/validate.js",
"channels:validate": "node scripts/commands/channels/validate.js",
"channels:lint": "node scripts/commands/channels/lint.js",
"queue:create": "node scripts/commands/queue/create.js",
"cluster:load": "node scripts/commands/cluster/load.js",
"programs:save": "node scripts/commands/programs/save.js",
"guides:update": "node scripts/commands/guides/update.js",
"api:update": "node scripts/commands/api/update.js",
"readme:update": "node scripts/commands/readme/update.js",
"test": "npx jest --runInBand",
"test:commands": "npx jest --runInBand -- commands",
"test:sites": "npx jest --runInBand -- sites",
"act": "act workflow_dispatch",
"update-readme": "node scripts/commands/update-readme.js"
"act": "act workflow_dispatch"
},
"private": true,
"author": "Arhey",
@ -25,6 +30,7 @@
"epg-grabber": "^0.20.0",
"epg-parser": "^0.1.6",
"form-data": "^4.0.0",
"fs-extra": "^10.0.1",
"glob": "^7.2.0",
"iconv-lite": "^0.4.24",
"jest": "^27.3.1",

View File

@ -1,4 +1,4 @@
const { file, parser, logger } = require('../core')
const { file, parser, logger } = require('../../core')
const { program } = require('commander')
const _ = require('lodash')

View File

@ -1,7 +1,7 @@
const _ = require('lodash')
const grabber = require('epg-grabber')
const { program } = require('commander')
const { db, logger, timer, file, parser } = require('../core')
const { db, logger, timer, file, parser } = require('../../core')
const options = program
.requiredOption('-c, --cluster-id <cluster-id>', 'The ID of cluster to load', parser.parseNumber)
@ -16,7 +16,7 @@ const options = program
.opts()
const LOGS_DIR = process.env.LOGS_DIR || 'scripts/logs'
const CLUSTER_PATH = `${LOGS_DIR}/load-cluster/cluster_${options.clusterId}.log`
const CLUSTER_PATH = `${LOGS_DIR}/cluster/load/cluster_${options.clusterId}.log`
async function main() {
logger.info('Starting...')

View File

@ -1,16 +0,0 @@
const { logger, db } = require('../core')
async function main() {
await db.queue.load()
const docs = await db.queue.find({}).sort({ cluster_id: 1 })
const cluster_id = docs.reduce((acc, curr) => {
if (!acc.includes(curr.cluster_id)) acc.push(curr.cluster_id)
return acc
}, [])
const matrix = { cluster_id }
const output = `::set-output name=matrix::${JSON.stringify(matrix)}`
logger.info(output)
}
main()

View File

@ -1,10 +1,10 @@
const { db, logger, file, api } = require('../core')
const { db, logger, file, api } = require('../../core')
const grabber = require('epg-grabber')
const _ = require('lodash')
const LOGS_DIR = process.env.LOGS_DIR || 'scripts/logs'
const PUBLIC_DIR = process.env.PUBLIC_DIR || '.gh-pages'
const GUIDES_PATH = `${LOGS_DIR}/guides.log`
const GUIDES_PATH = `${LOGS_DIR}/guides/update.log`
async function main() {
await setUp()

View File

@ -1,4 +1,4 @@
const { db, logger, file, parser } = require('../core')
const { db, logger, file, parser } = require('../../core')
const _ = require('lodash')
const LOGS_DIR = process.env.LOGS_DIR || 'scripts/logs'
@ -7,7 +7,7 @@ async function main() {
await db.queue.load()
await db.programs.load()
await db.programs.reset()
const files = await file.list(`${LOGS_DIR}/load-cluster/cluster_*.log`)
const files = await file.list(`${LOGS_DIR}/cluster/load/cluster_*.log`)
for (const filepath of files) {
logger.info(`Parsing "${filepath}"...`)
const results = await parser.parseLogs(filepath)

View File

@ -1,4 +1,4 @@
const { db, file, parser, logger, date, api } = require('../core')
const { db, file, parser, logger, date, api } = require('../../core')
const { program } = require('commander')
const _ = require('lodash')

View File

@ -1,4 +1,4 @@
const { file, markdown, parser, logger, api, table } = require('../core')
const { file, markdown, parser, logger, api, table } = require('../../core')
const { program } = require('commander')
const _ = require('lodash')

View File

View File

@ -16,9 +16,13 @@ To load a program guide, all you need to do is copy the link to one or more of t
</tbody>
</table>
## EPG Codes
## API
📋&nbsp;&nbsp;[iptv-org.github.io](https://iptv-org.github.io/)
The API documentation can be found in the [iptv-org/api](https://github.com/iptv-org/api) repository.
## Resources
Links to other useful IPTV-related resources can be found in the [iptv-org/awesome-iptv](https://github.com/iptv-org/awesome-iptv) repository.
## API

View File

@ -1 +0,0 @@
{"xmltv_id":"CNNInternationalEurope2.us","site":"example.com","site_id":"141","lang":"en","error":"The channel has the wrong xmltv_id"}

View File

@ -1 +0,0 @@
{"xmltv_id":"CNNInternationalEurope.us","site":"magticom.ge","site_id":"140","lang":"ru","date":"2022-01-21T00:00:00Z","error":"Programs not found"}

View File

@ -1 +0,0 @@
{"xmltv_id":"Perviykanal.ru","site":"yandex.ru","site_id":"1","lang":"ru","date":"2022-01-21T00:00:00Z","error":"Some error"}

View File

@ -1 +0,0 @@
{"xmltv_id":"BravoEast.us","site":"directv.com","site_id":"237","lang":"en","date":"2022-01-21T00:00:00Z","error":"Invalid header value char"}

View File

@ -1 +0,0 @@
{"lang":"en","xmltv_id":"BravoEast.us","site_id":"237","site":"directv.com","configPath":"sites/directv.com/directv.com.config.js","groups":["us/directv.com"],"cluster_id":84,"_id":"00AluKCrCnfgrl8W","date":"2022-01-21T00:00:00Z","error":"Invalid header value char"}

View File

@ -1,22 +1,20 @@
const fs = require('fs')
const path = require('path')
const { execSync } = require('child_process')
const fs = require('fs-extra')
const path = require('path')
beforeEach(() => {
fs.rmdirSync('tests/__data__/output', { recursive: true })
fs.mkdirSync('tests/__data__/output')
fs.emptyDirSync('tests/__data__/output')
const stdout = execSync(
'CHANNELS_PATH=tests/__data__/input/sites/**.channels.xml OUTPUT_DIR=tests/__data__/output/api node scripts/commands/update-api.js',
'CHANNELS_PATH=tests/__data__/input/sites/**.channels.xml OUTPUT_DIR=tests/__data__/output/api npm run api:update',
{ encoding: 'utf8' }
)
})
it('can generate guides.json', () => {
const output = content('tests/__data__/output/api/guides.json')
const expected = content('tests/__data__/expected/api/guides.json')
expect(output).toBe(expected)
expect(content('tests/__data__/output/api/guides.json')).toBe(
content('tests/__data__/expected/api/guides.json')
)
})
function content(filepath) {

View File

@ -0,0 +1,32 @@
const { execSync } = require('child_process')
const fs = require('fs-extra')
const path = require('path')
beforeEach(() => {
fs.emptyDirSync('tests/__data__/output')
fs.copyFileSync('tests/__data__/input/database/queue.db', 'tests/__data__/output/queue.db')
execSync(
'DB_DIR=tests/__data__/output LOGS_DIR=tests/__data__/output/logs npm run cluster:load -- --cluster-id=1 --timeout=10000',
{ encoding: 'utf8' }
)
})
it('can load cluster', () => {
expect(content('tests/__data__/output/logs/cluster/load/cluster_1.log')).toEqual(
content('tests/__data__/expected/logs/cluster/load/cluster_1.log')
)
})
function content(filepath) {
const data = fs.readFileSync(path.resolve(filepath), {
encoding: 'utf8'
})
return data
.split('\n')
.filter(l => l)
.map(l => {
return JSON.parse(l)
})
}

View File

@ -1,25 +0,0 @@
const fs = require('fs')
const path = require('path')
const { execSync } = require('child_process')
beforeEach(() => {
fs.rmdirSync('tests/__data__/output', { recursive: true })
fs.mkdirSync('tests/__data__/output')
fs.mkdirSync('tests/__data__/temp/database', { recursive: true })
fs.copyFileSync('tests/__data__/input/database/queue.db', 'tests/__data__/temp/database/queue.db')
})
afterEach(() => {
fs.rmdirSync('tests/__data__/temp', { recursive: true })
})
it('can create valid matrix', () => {
const result = execSync(
'DB_DIR=tests/__data__/temp/database node scripts/commands/create-matrix.js',
{
encoding: 'utf8'
}
)
expect(result).toBe('::set-output name=matrix::{"cluster_id":[1,4,84,120]}\n')
})

View File

@ -0,0 +1,38 @@
const { execSync } = require('child_process')
const fs = require('fs-extra')
const path = require('path')
beforeEach(() => {
fs.emptyDirSync('tests/__data__/output')
fs.copyFileSync('tests/__data__/input/database/queue.db', 'tests/__data__/output/queue.db')
fs.copyFileSync('tests/__data__/input/database/programs.db', 'tests/__data__/output/programs.db')
const stdout = execSync(
'DB_DIR=tests/__data__/output DATA_DIR=tests/__data__/input/data PUBLIC_DIR=tests/__data__/output LOGS_DIR=tests/__data__/output/logs npm run guides:update',
{ encoding: 'utf8' }
)
})
it('can generate /guides', () => {
expect(content('tests/__data__/output/guides/fr/chaines-tv.orange.fr.epg.xml')).toBe(
content('tests/__data__/expected/guides/fr/chaines-tv.orange.fr.epg.xml')
)
expect(content('tests/__data__/output/guides/zw/dstv.com.epg.xml')).toBe(
content('tests/__data__/expected/guides/zw/dstv.com.epg.xml')
)
})
it('can create guides.log', () => {
expect(content('tests/__data__/output/logs/guides/update.log')).toBe(
content('tests/__data__/expected/logs/guides/update.log')
)
})
function content(filepath) {
const data = fs.readFileSync(path.resolve(filepath), {
encoding: 'utf8'
})
return JSON.stringify(data)
}

View File

@ -1,40 +0,0 @@
const fs = require('fs')
const path = require('path')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const { execSync } = require('child_process')
dayjs.extend(utc)
beforeEach(() => {
fs.rmdirSync('tests/__data__/temp', { recursive: true })
fs.rmdirSync('tests/__data__/output', { recursive: true })
fs.mkdirSync('tests/__data__/output')
fs.mkdirSync('tests/__data__/temp/database', { recursive: true })
fs.copyFileSync('tests/__data__/input/database/queue.db', 'tests/__data__/temp/database/queue.db')
execSync(
'DB_DIR=tests/__data__/temp/database LOGS_DIR=tests/__data__/output/logs node scripts/commands/load-cluster.js --cluster-id=1 --timeout=10000',
{ encoding: 'utf8' }
)
})
it('can load cluster', () => {
let output = content('tests/__data__/output/logs/load-cluster/cluster_1.log')
let expected = content('tests/__data__/expected/logs/load-cluster/cluster_1.log')
expect(output).toEqual(expected)
})
function content(filepath) {
const data = fs.readFileSync(path.resolve(filepath), {
encoding: 'utf8'
})
return data
.split('\n')
.filter(l => l)
.map(l => {
return JSON.parse(l)
})
}

View File

@ -1,25 +1,19 @@
const fs = require('fs')
const path = require('path')
const { execSync } = require('child_process')
const fs = require('fs-extra')
const path = require('path')
beforeEach(() => {
fs.rmdirSync('tests/__data__/output', { recursive: true })
fs.mkdirSync('tests/__data__/output')
fs.mkdirSync('tests/__data__/output/database', { recursive: true })
fs.copyFileSync(
'tests/__data__/input/database/queue.db',
'tests/__data__/output/database/queue.db'
)
fs.emptyDirSync('tests/__data__/output')
fs.copyFileSync('tests/__data__/input/database/queue.db', 'tests/__data__/output/queue.db')
const stdout = execSync(
'DB_DIR=tests/__data__/output/database LOGS_DIR=tests/__data__/input/logs node scripts/commands/save-results.js',
'DB_DIR=tests/__data__/output LOGS_DIR=tests/__data__/input/logs npm run programs:save',
{ encoding: 'utf8' }
)
})
it('can save programs to database', () => {
let output = content('tests/__data__/output/database/programs.db')
let output = content('tests/__data__/output/programs.db')
let expected = content('tests/__data__/expected/database/programs.db')
output = output.map(i => {
@ -35,10 +29,9 @@ it('can save programs to database', () => {
})
it('can update queue', () => {
const output = content('tests/__data__/output/database/queue.db')
const expected = content('tests/__data__/expected/database/queue-with-errors.db')
expect(output).toEqual(expected)
expect(content('tests/__data__/output/queue.db')).toEqual(
content('tests/__data__/expected/database/queue-with-errors.db')
)
})
function content(filepath) {

View File

@ -1,13 +1,12 @@
const fs = require('fs')
const path = require('path')
const { execSync } = require('child_process')
const fs = require('fs-extra')
const path = require('path')
beforeEach(() => {
fs.rmdirSync('tests/__data__/output', { recursive: true })
fs.mkdirSync('tests/__data__/output')
fs.emptyDirSync('tests/__data__/output')
const stdout = execSync(
'DB_DIR=tests/__data__/output/database LOGS_DIR=tests/__data__/output/logs CHANNELS_PATH=tests/__data__/input/sites/*.channels.xml node scripts/commands/create-queue.js --max-clusters=1 --days=2',
'DB_DIR=tests/__data__/output/database LOGS_DIR=tests/__data__/output/logs CHANNELS_PATH=tests/__data__/input/sites/*.channels.xml npm run queue:create -- --max-clusters=1 --days=2',
{ encoding: 'utf8' }
)
})
@ -35,13 +34,6 @@ it('can create queue', () => {
)
})
it('can log errors', () => {
let output = content('tests/__data__/output/logs/errors/ca/example.com.log')
let expected = content('tests/__data__/expected/logs/errors/ca/example.com.log')
expect(output).toEqual(expected)
})
function content(filepath) {
const data = fs.readFileSync(path.resolve(filepath), {
encoding: 'utf8'

View File

@ -1,22 +1,20 @@
const fs = require('fs')
const path = require('path')
const { execSync } = require('child_process')
const fs = require('fs-extra')
const path = require('path')
beforeEach(() => {
fs.rmdirSync('tests/__data__/output', { recursive: true })
fs.mkdirSync('tests/__data__/output')
fs.emptyDirSync('tests/__data__/output')
const stdout = execSync(
'CHANNELS_PATH=tests/__data__/input/sites/*.channels.xml DATA_DIR=tests/__data__/input/data node scripts/commands/update-readme.js --config=tests/__data__/input/_readme.json',
'CHANNELS_PATH=tests/__data__/input/sites/*.channels.xml DATA_DIR=tests/__data__/input/data npm run readme:update -- --config=tests/__data__/input/readme.json',
{ encoding: 'utf8' }
)
})
it('can update readme.md', () => {
const output = content('tests/__data__/output/readme.md')
const expected = content('tests/__data__/expected/readme.md')
expect(output).toBe(expected)
expect(content('tests/__data__/output/readme.md')).toBe(
content('tests/__data__/expected/_readme.md')
)
})
function content(filepath) {

View File

@ -1,67 +0,0 @@
const fs = require('fs')
const path = require('path')
const { execSync } = require('child_process')
beforeEach(() => {
fs.rmdirSync('tests/__data__/output', { recursive: true })
fs.mkdirSync('tests/__data__/output')
fs.mkdirSync('tests/__data__/temp/database', { recursive: true })
fs.copyFileSync('tests/__data__/input/database/queue.db', 'tests/__data__/temp/database/queue.db')
fs.copyFileSync(
'tests/__data__/input/database/programs.db',
'tests/__data__/temp/database/programs.db'
)
const stdout = execSync(
'DB_DIR=tests/__data__/temp/database DATA_DIR=tests/__data__/input/data PUBLIC_DIR=tests/__data__/output LOGS_DIR=tests/__data__/output/logs node scripts/commands/update-guides.js',
{ encoding: 'utf8' }
)
})
afterEach(() => {
fs.rmdirSync('tests/__data__/temp', { recursive: true })
})
it('can generate /guides', () => {
const output1 = content('tests/__data__/output/guides/fr/chaines-tv.orange.fr.epg.xml')
const expected1 = content('tests/__data__/expected/guides/fr/chaines-tv.orange.fr.epg.xml')
expect(output1).toBe(expected1)
const output2 = content('tests/__data__/output/guides/zw/dstv.com.epg.xml')
const expected2 = content('tests/__data__/expected/guides/zw/dstv.com.epg.xml')
expect(output2).toBe(expected2)
})
it('can create guides.log', () => {
const output = content('tests/__data__/output/logs/guides.log')
const expected = content('tests/__data__/expected/logs/guides.log')
expect(output).toBe(expected)
})
it('can log errors', () => {
const output1 = content('tests/__data__/output/logs/errors/ru/yandex.ru.log')
const expected1 = content('tests/__data__/expected/logs/errors/ru/yandex.ru.log')
expect(output1).toBe(expected1)
const output2 = content('tests/__data__/output/logs/errors/us/directv.com.log')
const expected2 = content('tests/__data__/expected/logs/errors/us/directv.com.log')
expect(output2).toBe(expected2)
const output3 = content('tests/__data__/output/logs/errors/ge/magticom.ge.log')
const expected3 = content('tests/__data__/expected/logs/errors/ge/magticom.ge.log')
expect(output3).toBe(expected3)
})
function content(filepath) {
const data = fs.readFileSync(path.resolve(filepath), {
encoding: 'utf8'
})
return JSON.stringify(data)
}