SaenkoJr/backend-project-lvl3

View on GitHub
__tests__/page-loader.test.js

Summary

Maintainability
A
1 hr
Test Coverage
import os from 'os';
import { promises as fs } from 'fs';
import path from 'path';
import nock from 'nock';

import pageLoader from '../src';

nock.disableNetConnect();

let tmpdir;

const url = new URL('http://www.webpage.com/somepage/');
const expectedHtmlFileName = 'www-webpage-com-somepage.html';
const expectedResourcesDir = 'www-webpage-com-somepage_files';
const expectedResources = [
  'assets-index.js',
  'assets-webpage.css',
  'images-mounts.jpg',
];

const getFixturePath = (name) => path.join(__dirname, '..', '__fixtures__', name);

beforeEach(async () => {
  tmpdir = await fs.mkdtemp(path.join(os.tmpdir(), 'page-loader-'));
});

afterEach(() => {
  nock.cleanAll();
});

describe('Page loader', () => {
  test('Download site with all resources', async () => {
    nock(url.origin)
      .log(console.log)
      .get(url.pathname)
      .replyWithFile(200, getFixturePath('index.html'))
      .get('/images/mounts.jpg')
      .delay(800)
      .replyWithFile(200, getFixturePath(path.join('images', 'mounts.jpg')))
      .get('/assets/webpage.css')
      .delay(700)
      .replyWithFile(200, getFixturePath(path.join('assets', 'webpage.css')))
      .get('/assets/index.js')
      .delay(1000)
      .replyWithFile(200, getFixturePath(path.join('assets', 'index.js')));

    const expected = await fs.readFile(getFixturePath('expected.html'), 'utf-8');

    await pageLoader(url.toString(), tmpdir);

    const processedHtml = await fs.readFile(path.resolve(tmpdir, expectedHtmlFileName), 'utf-8');
    const processedFiles = await fs.readdir(path.resolve(tmpdir, expectedResourcesDir));

    expect(processedHtml).toEqual(expected.trim());
    expect(processedFiles).toEqual(expectedResources);
  });

  test('Page not found', async () => {
    nock(url.origin)
      .log(console.log)
      .get('/non-exist')
      .reply(404);

    const nonexistentPage = new URL('non-exist', url.origin);

    await expect(pageLoader(nonexistentPage.toString(), tmpdir))
      .rejects
      .toThrow('Request failed with status code 404');
  });

  test('Directory dosen`t exist', async () => {
    nock(url.origin)
      .log(console.log)
      .get(url.pathname)
      .replyWithFile(200, getFixturePath('index.html'));

    await expect(pageLoader(url.toString(), './non-exist'))
      .rejects
      .toThrow(`ENOENT: no such file or directory, open 'non-exist/${expectedHtmlFileName}'`);
  });
});