mirror of
https://github.com/comatory/fb2iCal
synced 2025-02-26 08:27:40 +01:00
Server now downloads the HTML file via new endpoint but the parsing logic now happens in the browser. The reason for this is to have a way same code for both environments. If the JavaScript is disabled, it's still possible to call the previous endpoint and download the file from the server.
125 lines
3.0 KiB
JavaScript
125 lines
3.0 KiB
JavaScript
const chai = require('chai')
|
|
const { expect } = chai
|
|
const chaiSinon = require('chai-sinon')
|
|
|
|
chai.use(chaiSinon)
|
|
|
|
const MockLogger = require('../../mocks/logger.mock')
|
|
const {
|
|
mockCrawl,
|
|
setMockCrawlResult,
|
|
setMockCrawlErrorResult,
|
|
clearMockCrawlResult,
|
|
} = require('../../mocks/crawler.mock')
|
|
|
|
const { retrieveICS } = require('../../lib/services/ics-retriever')
|
|
|
|
jest.mock('../../lib/services/crawler', () => mockCrawl)
|
|
|
|
describe(retrieveICS, () => {
|
|
let logger
|
|
|
|
beforeEach(() => {
|
|
logger = new MockLogger()
|
|
clearMockCrawlResult()
|
|
})
|
|
|
|
it('should use create ICS contents', async () => {
|
|
const html = `
|
|
<html>
|
|
<head>
|
|
<script type="application/ld+json">{"name":"Test Event"}</script>
|
|
</head>
|
|
</html>
|
|
`
|
|
|
|
setMockCrawlResult(html)
|
|
|
|
const icsContent = await retrieveICS('https://facebook.com/events/123', { logger })
|
|
|
|
expect(icsContent).to.be.ok
|
|
})
|
|
|
|
|
|
it('should use create ICS contents based on LDJSON', async () => {
|
|
const html = `
|
|
<html>
|
|
<head>
|
|
<script type="application/ld+json">{"name":"Test Event","location":{"name":"Location X"}}</script>
|
|
</head>
|
|
</html>
|
|
`
|
|
|
|
setMockCrawlResult(html)
|
|
|
|
const icsContent = await retrieveICS('https://facebook.com/events/123', { logger })
|
|
|
|
expect(icsContent).to.include('SUMMARY:Test Event')
|
|
expect(icsContent).to.include('LOCATION:Location X')
|
|
})
|
|
|
|
|
|
it('should use create ICS contents based on DOM', async () => {
|
|
const html = `
|
|
<html>
|
|
<head>
|
|
<title>Test</title>
|
|
</head>
|
|
<body>
|
|
<div id="event_summary">
|
|
<div class="test_eventNode1"></div>
|
|
<div class="test_eventNode2"><div class="test_timeNode"></div><div class="test_locationNode"><table><tr><td><span></span><span>123 Main St.\nAcmeTown</span><span>Main area</span></td></tr></table></div></div>
|
|
</div>
|
|
</body>
|
|
</html>
|
|
`
|
|
|
|
setMockCrawlResult(html)
|
|
|
|
const icsContent = await retrieveICS('https://facebook.com/events/123', { logger })
|
|
|
|
expect(icsContent).to.include('LOCATION:123 Main St. AcmeTown, Main area')
|
|
})
|
|
|
|
|
|
it('should throw parser error if no event data is found', async (callback) => {
|
|
const html = `
|
|
<html>
|
|
<head>
|
|
</head>
|
|
<body>
|
|
</body>
|
|
</html>
|
|
`
|
|
|
|
setMockCrawlResult(html)
|
|
|
|
try {
|
|
const eventData = await retrieveICS('https://facebook.com/events/132', { logger })
|
|
} catch (err) {
|
|
expect(err.toString()).to.include('Unable to parse event data.')
|
|
expect(err.statusCode).to.equal(422)
|
|
callback()
|
|
}
|
|
})
|
|
|
|
|
|
it('should contain normalized URL when using DOM parser', async () => {
|
|
const html = `
|
|
<html>
|
|
<head>
|
|
<title>Test</title>
|
|
</head>
|
|
<body>
|
|
</body>
|
|
</html>
|
|
`
|
|
|
|
setMockCrawlResult(html)
|
|
|
|
const icsContent = await retrieveICS('123', { logger })
|
|
expect(icsContent).to.include('URL:https://mobile.facebook.com/events/123')
|
|
|
|
})
|
|
})
|