browser-test.ts 3.55 KB
import PouchDB from 'pouchdb';
import {FileReplicator} from '../src/file-replicator';
import {ServiceLocator, ENV_UNKNOWN} from '../src/service-locator';
import {TestFileHandler} from './file-handler/test-file-handler';

ServiceLocator.addFileHandler(ENV_UNKNOWN, new TestFileHandler());

declare var emit:any;

const dbUrl = 'http://admin:admin@localhost:5984/pouch_test_db';

const testDocs = [
    { 'type' : 'asset', 'source' : 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/292px-FullMoon2010.jpg' } ,
    { 'type' : 'asset', 'source' : 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/2b/Jupiter_and_its_shrunken_Great_Red_Spot.jpg/260px-Jupiter_and_its_shrunken_Great_Red_Spot.jpg' } ,
    { 'type' : 'asset', 'source' : 'https://upload.wikimedia.org/wikipedia/commons/c/c7/Saturn_during_Equinox.jpg' }
];

describe("Integration tests with couchdb", () => {

    let index = 1;
    let remoteDb = new PouchDB(dbUrl);
    let localDb;

    beforeAll((done) => {                
        ServiceLocator.getFileReplicator().retryTimeout = 100;
        remoteDb.bulkDocs(testDocs).then(() => {
            done();
        });
    });

    beforeEach(() => {        
        localDb = new PouchDB('testdb-' + index);
        index++;

        localDb.put({
            _id : "_design/index_type",
            views : {
                type : {
                    map : function(doc) {
                        if (doc.type) { emit(doc.type); }
                    }.toString()
                }
            }
        });   

    });

    it("Should successfully download several files", (done) => {
        TestFileHandler.setErrorRate(0);
        let replicator = ServiceLocator.getFileReplicator();
        let index = 0;

        replicator.clear();

        replicator
            .on('file-complete', () => {
                index++;
            })
            .once('complete', () => {
                expect(index).toEqual(3);
                done();   
            });

        localDb.replicate.from(dbUrl)
            .once('complete', () => {

                localDb.query('index_type/type',{
                    include_docs : true,
                    key : replicator.itemValue
                }).then((res) => { 
                    let docs = [];                      
                    for (let r of res.rows) {
                        docs.push(r.doc);
                    }

                    replicator.pushChanges(docs);
                    replicator.start();
                });             
            });
    });

    it("Should trigger errors, but successfully download with retries", (done) => {
        TestFileHandler.setErrorRate(0.8);      
        let replicator = ServiceLocator.getFileReplicator();
        let errors = 0;

        replicator.clear();

        replicator
            .on('file-error', () => {
                errors++;
            })
            .once('complete', () => {
                expect(errors).toBeGreaterThanOrEqual(1);
                done();   
            });

        localDb.replicate.from(dbUrl)
            .once('complete', () => {

                localDb.query('index_type/type',{
                    include_docs : true,
                    key : replicator.itemValue
                }).then((res) => { 
                    let docs = [];                      
                    for (let r of res.rows) {
                        docs.push(r.doc);
                    }

                    replicator.pushChanges(docs);
                    replicator.start();
                });             
            });

    });

});