From 456eaa1fbc5117caae6d06e47e8502281c4c8317 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Syn=C3=A1=C4=8Dek?= Date: Thu, 16 Jul 2020 16:37:20 +0200 Subject: [PATCH] add specs for ICS retriever --- lib/services/ics-retriever.js | 24 +++---- mocks/crawler.mock.js | 28 ++++++++ test/services/ics-retriever.spec.js | 105 ++++++++++++++++++++++++++++ 3 files changed, 143 insertions(+), 14 deletions(-) create mode 100644 mocks/crawler.mock.js create mode 100644 test/services/ics-retriever.spec.js diff --git a/lib/services/ics-retriever.js b/lib/services/ics-retriever.js index ef12757..22a37f6 100644 --- a/lib/services/ics-retriever.js +++ b/lib/services/ics-retriever.js @@ -5,22 +5,18 @@ const generateICS = require('./ics-generator') const { createParserError, getNormalizedUrl } = require('../utils') const retrieveICS = async (URLparameter, { logger }) => { - try { - const url = getNormalizedUrl(URLparameter) - const html = await crawl(url, { logger }) - const LDJSONEventData = parseUsingLDJSONData(html, { logger }) - const eventData = LDJSONEventData || parseUsingDOM(html, url, { logger }) + const url = getNormalizedUrl(URLparameter) + const html = await crawl(url, { logger }) + const LDJSONEventData = parseUsingLDJSONData(html, { logger }) + const eventData = LDJSONEventData || parseUsingDOM(html, url, { logger }) - if (!eventData) { - throw createParserError() - return - } - - const icsFile = await generateICS(eventData) - return icsFile - } catch (err) { - throw err + if (!eventData) { + throw createParserError() + return } + + const icsContent = await generateICS(eventData) + return icsContent } module.exports = retrieveICS diff --git a/mocks/crawler.mock.js b/mocks/crawler.mock.js new file mode 100644 index 0000000..24fee51 --- /dev/null +++ b/mocks/crawler.mock.js @@ -0,0 +1,28 @@ +let mockCrawlResult = null + +const mockCrawl = (url, { logger }) => { + return mockCrawlResult +} + +const setMockCrawlResult = (result) => { + mockCrawlResult = new Promise((resolve, reject) => { + resolve(result) + }) +} + +const setMockCrawlErrorResult = (error) => { + mockCrawlResult = new Promise((resolve, reject) => { + reject(error) + }) +} + +const clearMockCrawlResult = () => { + mockCrawlResult = null +} + +module.exports = { + mockCrawl, + setMockCrawlResult, + setMockCrawlErrorResult, + clearMockCrawlResult, +} diff --git a/test/services/ics-retriever.spec.js b/test/services/ics-retriever.spec.js new file mode 100644 index 0000000..0c138b7 --- /dev/null +++ b/test/services/ics-retriever.spec.js @@ -0,0 +1,105 @@ +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 = ` + + + + + + ` + + 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 = ` + + + + + + ` + + 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 = ` + + + Test + + +
+
+
123 Main St.\nAcmeTownMain area
+
+ + + ` + + 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 = ` + + + + + + + ` + + 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() + } + }) +})