import * as assert from 'assert';
import * as pgp from 'openpgp';

import { Dispatcher } from '../src/dispatch';
import { User } from '../src/assets/user';
import { PGPSigner, KeyStore } from '../src/auth';
import { SubConsumer } from '../src/transport';

import { MockStore, MockPubSub, MockConsumer, MockKeyStore } from './mock';

async function createKeyStore() {
	const opts = {
		userIds: [
			{
				name: 'John Marston',
				email: 'red@dead.com',
			},
		],
		numBits: 2048,
		passphrase: 'foo',
	};
	const pkgen = await pgp.generateKey(opts);
	const pka = pkgen.privateKeyArmored;
	const pks = await pgp.key.readArmored(pka);
	await pks.keys[0].decrypt('foo');
	return new MockKeyStore(pks.keys[0], []);
}

describe('fullchain', async () => {
	it('dispatch_and_publish_user', async () => {
		const g = await createKeyStore();
		const n = new PGPSigner(g);
		const u = new User('u1', {});
		u.setSigner(n);
		u.setName('Nico', 'Bellic');
		const s = new MockStore('fooStore');
		const c = new MockConsumer();
		const p = new MockPubSub('fooPubSub', c);
		const d = new Dispatcher(s, p);
		u.onwrap = (e) => {
			d.add(u.id, e);
			d.sync(0);
			assert.equal(p.pubs.length, 1);
		};
		u.sign();
	});
});