You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
4.0 KiB
TypeScript

import * as EteSync from './EteSync';
import * as fetch from 'isomorphic-fetch';
import * as sjcl from 'sjcl';
const testApiBase = 'http://localhost:8000';
import { USER, PASSWORD, keyBase64 } from './TestConstants';
let credentials: EteSync.Credentials;
beforeEach(async () => {
let authenticator = new EteSync.Authenticator(testApiBase);
const authToken = await authenticator.getAuthToken(USER, PASSWORD);
credentials = new EteSync.Credentials(USER, authToken);
await fetch(testApiBase + '/reset/', {
method: 'post',
headers: { 'Authorization': 'Token ' + credentials.authToken },
});
});
it('Simple sync', async () => {
let journalManager = new EteSync.JournalManager(credentials, testApiBase);
let journals = await journalManager.list();
expect(journals.length).toBe(0);
const uid1 = sjcl.codec.hex.fromBits(sjcl.hash.sha256.hash('id1'));
const cryptoManager = new EteSync.CryptoManager(keyBase64, USER);
const info1 = new EteSync.CollectionInfo({uid: uid1, content: 'test', displayName: 'Dislpay 1'});
let journal = new EteSync.Journal();
journal.setInfo(cryptoManager, info1);
await expect(journalManager.create(journal)).resolves.toBeDefined();
// Uid clash
await expect(journalManager.create(journal)).rejects.toBeInstanceOf(EteSync.HTTPError);
journals = await journalManager.list();
expect(journals.length).toBe(1);
expect(journals[0].uid).toBe(journal.uid);
// Update
let info2 = new EteSync.CollectionInfo(info1);
info2.displayName = 'Display 2';
journal.setInfo(cryptoManager, info2);
await expect(journalManager.update(journal)).resolves.toBeDefined();
journals = await journalManager.list();
expect(journals.length).toBe(1);
expect(journals[0].getInfo(cryptoManager).displayName).toBe(info2.displayName);
// Delete
await expect(journalManager.delete(journal)).resolves.toBeDefined();
journals = await journalManager.list();
expect(journals.length).toBe(0);
});
it('Journal Entry sync', async () => {
let journalManager = new EteSync.JournalManager(credentials, testApiBase);
const uid1 = sjcl.codec.hex.fromBits(sjcl.hash.sha256.hash('id1'));
const cryptoManager = new EteSync.CryptoManager(keyBase64, USER);
const info1 = new EteSync.CollectionInfo({uid: uid1, content: 'test', displayName: 'Dislpay 1'});
let journal = new EteSync.Journal();
journal.setInfo(cryptoManager, info1);
await expect(journalManager.create(journal)).resolves.toBeDefined();
let entryManager = new EteSync.EntryManager(credentials, testApiBase, journal.uid);
let entries = await entryManager.list(null);
expect(entries.length).toBe(0);
const syncEntry = new EteSync.SyncEntry({content: 'bla'});
let prevUid = null;
let entry = new EteSync.Entry();
entry.setSyncEntry(cryptoManager, syncEntry, prevUid);
entries = [entry];
await expect(entryManager.create(entries, prevUid)).resolves.toBeDefined();
prevUid = entry.uid;
let entry2 = new EteSync.Entry();
entry2.setSyncEntry(cryptoManager, syncEntry, prevUid);
// Try to push good entries with a bad prevUid
entries = [entry2];
await expect(entryManager.create(entries, null)).rejects.toBeInstanceOf(EteSync.HTTPError);
// Second try with good prevUid
await expect(entryManager.create(entries, prevUid)).resolves.toBeDefined();
prevUid = entry2.uid;
// Check last works:
entries = await entryManager.list(null);
expect(entries.length).toBe(2);
entries = await entryManager.list(entry.uid);
expect(entries.length).toBe(1);
entries = await entryManager.list(entry2.uid);
expect(entries.length).toBe(0);
// Corrupt the journal and verify we get it:
entry2 = new EteSync.Entry();
entry2.setSyncEntry(cryptoManager, syncEntry, 'somebaduid');
entries = [entry2];
await expect(entryManager.create(entries, prevUid)).resolves.toBeDefined();
entries = await entryManager.list(null);
expect(() => {
let prev = null;
for (let ent of entries) {
expect(ent.getSyncEntry(cryptoManager, prev)).toBeDefined();
prev = ent.uid;
}
}).toThrowError();
});