Browse Source

Add tests and initial github workflow

pull/217/head
Ben Letchford 5 years ago
parent
commit
dc35c056af
  1. 20
      .github/workflows/test.yml
  2. 12
      package.json
  3. 193
      src/client/specs/download.spec.ts
  4. 754
      yarn.lock

20
.github/workflows/test.yml

@ -0,0 +1,20 @@
---
on: [push, pull_request]
name: Run tests
jobs:
build_and_test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v1
- name: Setup env
uses: actions/setup-node@v1
with:
node-version: 12
- run: yarn
name: Install dependencies
- run: yarn build
name: Compile Typescript
- run: yarn test
name: Run tests

12
package.json

@ -23,7 +23,8 @@
"dev": "NODE_ENV=development concurrently --kill-others --success first \"babel-node node_modules/.bin/webpack --watch\" \"nodemon .\"",
"lint": "eslint --ext .ts,.js .",
"prepublishOnly": "NODE_ENV=production yarn build",
"start": "node ."
"start": "node .",
"test": "mocha -r babel-register-ts src/**/*.spec.ts"
},
"husky": {
"hooks": {
@ -79,14 +80,18 @@
"@babel/preset-env": "^7.5.5",
"@babel/preset-typescript": "^7.3.3",
"@babel/register": "^7.5.5",
"@types/chai": "^4.2.5",
"@types/compression": "^1.0.1",
"@types/express": "^4.17.1",
"@types/fs-extra": "^8.0.0",
"@types/helmet": "^0.0.44",
"@types/jsdom": "^12.2.4",
"@types/lodash": "^4.14.138",
"@types/mocha": "^5.2.7",
"@types/morgan": "^1.7.37",
"@types/node": "^12.7.3",
"@types/serve-favicon": "^2.2.31",
"@types/sinon": "^7.5.1",
"@types/socket.io": "^2.1.2",
"@types/socket.io-client": "^1.4.32",
"@types/webpack-env": "^1.14.0",
@ -96,6 +101,8 @@
"all-contributors-cli": "^6.9.3",
"babel-loader": "^8.0.6",
"babel-plugin-lodash": "^3.3.4",
"babel-register-ts": "^7.0.0",
"chai": "^4.2.0",
"concurrently": "^4.1.2",
"css-loader": "^3.2.0",
"eslint": "6.1.0",
@ -106,12 +113,15 @@
"file-loader": "^4.2.0",
"git-authors-cli": "^1.0.18",
"husky": "^3.0.9",
"jsdom": "^15.2.1",
"lint-staged": "~9.2.5",
"mini-css-extract-plugin": "^0.8.0",
"mocha": "^6.2.2",
"node-sass": "^4.12.0",
"nodemon": "^1.19.2",
"prettier": "^1.18.2",
"sass-loader": "^8.0.0",
"sinon": "^7.5.0",
"style-loader": "^1.0.0",
"typescript": "~3.6.2",
"webpack": "^4.39.3",

193
src/client/specs/download.spec.ts

@ -0,0 +1,193 @@
import { expect } from 'chai';
import 'mocha';
import * as sinon from 'sinon';
import { JSDOM } from 'jsdom';
import { FileDownloader } from '../download';
const { window } = new JSDOM(`...`);
describe('FileDownloader', () => {
const FILE_BEGIN = 'BEGIN';
const FILE_END = 'END';
let fileDownloader: any;
beforeEach(() => {
fileDownloader = new FileDownloader(() => { }, FILE_BEGIN, FILE_END);
});
afterEach(() => {
sinon.restore();
});
it('should return data before file markers', () => {
const onCompleteFileStub = sinon.stub(fileDownloader, 'onCompleteFile');
expect(
fileDownloader.buffer(`DATA AT THE LEFT${FILE_BEGIN}FILE${FILE_END}`)
).to.equal('DATA AT THE LEFT');
expect(onCompleteFileStub.calledOnce).to.be.true;
expect(onCompleteFileStub.getCall(0).args[0]).to.equal('FILE');
});
it('should return data after file markers', () => {
const onCompleteFileStub = sinon.stub(fileDownloader, 'onCompleteFile');
expect(
fileDownloader.buffer(`${FILE_BEGIN}FILE${FILE_END}DATA AT THE RIGHT`)
).to.equal('DATA AT THE RIGHT');
expect(onCompleteFileStub.calledOnce).to.be.true;
expect(onCompleteFileStub.getCall(0).args[0]).to.equal('FILE');
});
it('should return data before and after file markers', () => {
const onCompleteFileStub = sinon.stub(fileDownloader, 'onCompleteFile');
expect(
fileDownloader.buffer(
`DATA AT THE LEFT${FILE_BEGIN}FILE${FILE_END}DATA AT THE RIGHT`
)
).to.equal('DATA AT THE LEFTDATA AT THE RIGHT');
expect(onCompleteFileStub.calledOnce).to.be.true;
expect(onCompleteFileStub.getCall(0).args[0]).to.equal('FILE');
});
it('should return data before a beginning marker found', () => {
const onCompleteFileStub = sinon.stub(fileDownloader, 'onCompleteFile');
expect(fileDownloader.buffer(`DATA AT THE LEFT${FILE_BEGIN}FILE`)).to.equal(
'DATA AT THE LEFT'
);
});
it('should return data after an ending marker found', () => {
const onCompleteFileStub = sinon.stub(fileDownloader, 'onCompleteFile');
expect(fileDownloader.buffer(`${FILE_BEGIN}FI`)).to.equal('');
expect(fileDownloader.buffer(`LE${FILE_END}DATA AT THE RIGHT`)).to.equal(
'DATA AT THE RIGHT'
);
expect(onCompleteFileStub.calledOnce).to.be.true;
expect(onCompleteFileStub.getCall(0).args[0]).to.equal('FILE');
});
it('should buffer across incomplete file begin marker sequence on two calls', () => {
fileDownloader = new FileDownloader(() => { }, 'BEGIN', 'END');
const onCompleteFileStub = sinon.stub(fileDownloader, 'onCompleteFile');
expect(fileDownloader.buffer('BEG')).to.equal('');
expect(fileDownloader.buffer('INFILEEND')).to.equal('');
expect(onCompleteFileStub.calledOnce).to.be.true;
expect(onCompleteFileStub.getCall(0).args[0]).to.equal('FILE');
});
it('should buffer across incomplete file begin marker sequence on n calls', () => {
fileDownloader = new FileDownloader(() => { }, 'BEGIN', 'END');
const onCompleteFileStub = sinon.stub(fileDownloader, 'onCompleteFile');
expect(fileDownloader.buffer('B')).to.equal('');
expect(fileDownloader.buffer('E')).to.equal('');
expect(fileDownloader.buffer('G')).to.equal('');
expect(fileDownloader.buffer('I')).to.equal('');
expect(fileDownloader.buffer('NFILE' + 'END')).to.equal('');
expect(onCompleteFileStub.calledOnce).to.be.true;
expect(onCompleteFileStub.getCall(0).args[0]).to.equal('FILE');
});
it('should buffer across incomplete file begin marker sequence with data on the left and right on multiple calls', () => {
fileDownloader = new FileDownloader(() => { }, 'BEGIN', 'END');
const onCompleteFileStub = sinon.stub(fileDownloader, 'onCompleteFile');
expect(fileDownloader.buffer('DATA AT THE LEFT' + 'B')).to.equal(
'DATA AT THE LEFT'
);
expect(fileDownloader.buffer('E')).to.equal('');
expect(fileDownloader.buffer('G')).to.equal('');
expect(fileDownloader.buffer('I')).to.equal('');
expect(fileDownloader.buffer('NFILE' + 'ENDDATA AT THE RIGHT')).to.equal(
'DATA AT THE RIGHT'
);
expect(onCompleteFileStub.calledOnce).to.be.true;
expect(onCompleteFileStub.getCall(0).args[0]).to.equal('FILE');
});
it('should buffer across incomplete file begin marker sequence then handle false positive', () => {
fileDownloader = new FileDownloader(() => { }, 'BEGIN', 'END');
const onCompleteFileStub = sinon.stub(fileDownloader, 'onCompleteFile');
expect(fileDownloader.buffer('DATA AT THE LEFT' + 'B')).to.equal(
'DATA AT THE LEFT'
);
expect(fileDownloader.buffer('E')).to.equal('');
expect(fileDownloader.buffer('G')).to.equal('');
// This isn't part of the file_begin marker and should trigger the partial
// file begin marker to be returned with the normal data
expect(fileDownloader.buffer('ZDATA AT THE RIGHT')).to.equal(
'BEGZDATA AT THE RIGHT'
);
expect(onCompleteFileStub.called).to.be.false;
});
it('should buffer across incomplete file end marker sequence on two calls', () => {
fileDownloader = new FileDownloader(() => { }, 'BEGIN', 'END');
const mockFilePart1 = 'DATA AT THE LEFTBEGINFILEE';
const mockFilePart2 = 'NDDATA AT THE RIGHT';
const onCompleteFileStub = sinon.stub(fileDownloader, 'onCompleteFile');
expect(fileDownloader.buffer(mockFilePart1)).to.equal('DATA AT THE LEFT');
expect(fileDownloader.buffer(mockFilePart2)).to.equal('DATA AT THE RIGHT');
expect(onCompleteFileStub.calledOnce).to.be.true;
expect(onCompleteFileStub.getCall(0).args[0]).to.equal('FILE');
});
it('should buffer across incomplete file end and file begin marker sequence with data on the left and right on multiple calls', () => {
fileDownloader = new FileDownloader(() => { }, 'BEGIN', 'END');
const onCompleteFileStub = sinon.stub(fileDownloader, 'onCompleteFile');
expect(fileDownloader.buffer('DATA AT THE LEFT' + 'BE')).to.equal(
'DATA AT THE LEFT'
);
expect(fileDownloader.buffer('G')).to.equal('');
expect(fileDownloader.buffer('I')).to.equal('');
expect(fileDownloader.buffer('NFILEE')).to.equal('');
expect(fileDownloader.buffer('N')).to.equal('');
expect(fileDownloader.buffer('DDATA AT THE RIGHT')).to.equal(
'DATA AT THE RIGHT'
);
expect(onCompleteFileStub.calledOnce).to.be.true;
expect(onCompleteFileStub.getCall(0).args[0]).to.equal('FILE');
});
it('should be able to handle multiple files', () => {
fileDownloader = new FileDownloader(() => { }, 'BEGIN', 'END');
const onCompleteFileStub = sinon.stub(fileDownloader, 'onCompleteFile');
expect(
fileDownloader.buffer(
'DATA AT THE LEFT' + 'BEGIN' + 'FILE1' + 'END' + 'SECOND DATA' + 'BEGIN'
)
).to.equal('DATA AT THE LEFT' + 'SECOND DATA');
expect(onCompleteFileStub.calledOnce).to.be.true;
expect(onCompleteFileStub.getCall(0).args[0]).to.equal('FILE1');
expect(fileDownloader.buffer('FILE2')).to.equal('');
expect(fileDownloader.buffer('E')).to.equal('');
expect(fileDownloader.buffer('NDRIGHT')).to.equal('RIGHT');
expect(onCompleteFileStub.calledTwice).to.be.true;
expect(onCompleteFileStub.getCall(1).args[0]).to.equal('FILE2');
});
it('should be able to handle multiple files with an ending marker', () => {
fileDownloader = new FileDownloader(() => { }, 'BEGIN', 'END');
const onCompleteFileStub = sinon.stub(fileDownloader, 'onCompleteFile');
expect(
fileDownloader.buffer('DATA AT THE LEFT' + 'BEGIN' + 'FILE1' + 'EN')
).to.equal('DATA AT THE LEFT');
expect(onCompleteFileStub.calledOnce).to.be.false;
expect(
fileDownloader.buffer('D' + 'SECOND DATA' + 'BEGIN' + 'FILE2' + 'EN')
).to.equal('SECOND DATA');
expect(onCompleteFileStub.calledOnce).to.be.true;
expect(onCompleteFileStub.getCall(0).args[0]).to.equal('FILE1');
expect(fileDownloader.buffer('D')).to.equal('');
expect(onCompleteFileStub.calledTwice).to.be.true;
expect(onCompleteFileStub.getCall(1).args[0]).to.equal('FILE2');
});
});

754
yarn.lock

File diff suppressed because it is too large
Loading…
Cancel
Save