4 changed files with 825 additions and 154 deletions
@ -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 |
@ -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'); |
|||
}); |
|||
}); |
File diff suppressed because it is too large
Loading…
Reference in new issue