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.
		
		
		
		
		
			
		
			
				
	
	
		
			346 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			346 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			TypeScript
		
	
| import { expect } from 'chai';
 | |
| import Sinon from 'sinon';
 | |
| import {
 | |
|   getHasSeenHF190,
 | |
|   getHasSeenHF191,
 | |
|   handleHardforkResult,
 | |
|   resetHardForkCachedValues,
 | |
| } from '../../../../session/apis/snode_api/hfHandling';
 | |
| import { TestUtils } from '../../../test-utils';
 | |
| 
 | |
| describe('hardfork handling', () => {
 | |
|   describe('getHasSeenHF190', () => {
 | |
|     afterEach(() => {
 | |
|       Sinon.restore();
 | |
|       resetHardForkCachedValues();
 | |
|     });
 | |
| 
 | |
|     it('fetches from db if undefined, and write to db false if db value is undefined', async () => {
 | |
|       const getItemById = TestUtils.stubData('getItemById').resolves(undefined);
 | |
|       const createItem = TestUtils.stubData('createOrUpdateItem').resolves();
 | |
| 
 | |
|       const ret = await getHasSeenHF190();
 | |
|       expect(ret).to.be.eq(false, 'getHasSeenHF190 should return false');
 | |
| 
 | |
|       expect(getItemById.calledOnce).to.be.eq(true, 'getItemById should have been called');
 | |
|       expect(createItem.calledOnce).to.be.eq(true, 'createItem should have been called');
 | |
|       expect(createItem.args[0][0]).to.be.deep.eq(
 | |
|         { id: 'hasSeenHardfork190', value: false },
 | |
|         'createItem should have been to set hasSeenHardfork190 to false in the db'
 | |
|       );
 | |
|     });
 | |
| 
 | |
|     it('fetches from db if undefined, and does not write to db if db value is not undefined', async () => {
 | |
|       const getItemById = TestUtils.stubData('getItemById').resolves({
 | |
|         id: 'getHasSeenHF190',
 | |
|         value: false,
 | |
|       });
 | |
|       const createItem = TestUtils.stubData('createOrUpdateItem').resolves();
 | |
| 
 | |
|       const ret = await getHasSeenHF190();
 | |
|       expect(ret).to.be.eq(false, 'getHasSeenHF190 should return false');
 | |
| 
 | |
|       expect(getItemById.calledOnce).to.be.eq(true, 'getItemById should have been called');
 | |
|       expect(createItem.notCalled).to.be.eq(true, 'createItem should not have been called');
 | |
|     });
 | |
| 
 | |
|     it('fetches from db if undefined, and does not write to db if db value is not undefined - 2', async () => {
 | |
|       const getItemById = TestUtils.stubData('getItemById').resolves({
 | |
|         id: 'getHasSeenHF190',
 | |
|         value: true,
 | |
|       });
 | |
|       const createItem = TestUtils.stubData('createOrUpdateItem').resolves();
 | |
| 
 | |
|       const ret = await getHasSeenHF190();
 | |
|       expect(ret).to.be.eq(true, 'getHasSeenHF190 should return false');
 | |
| 
 | |
|       expect(getItemById.calledOnce).to.be.eq(true, 'getItemById should have been called');
 | |
|       expect(createItem.notCalled).to.be.eq(true, 'createItem should not have been called');
 | |
|     });
 | |
| 
 | |
|     it('fetches from db only the value is not cached already', async () => {
 | |
|       const getItemById = TestUtils.stubData('getItemById').resolves({
 | |
|         id: 'getHasSeenHF190',
 | |
|         value: true,
 | |
|       });
 | |
|       const createItem = TestUtils.stubData('createOrUpdateItem').resolves();
 | |
| 
 | |
|       const ret = await getHasSeenHF190();
 | |
|       const ret2 = await getHasSeenHF190();
 | |
|       expect(ret).to.be.eq(true, 'getHasSeenHF190 should return false');
 | |
|       expect(ret2).to.be.eq(true, 'getHasSeenHF190 should return false - 2');
 | |
| 
 | |
|       expect(getItemById.calledOnce).to.be.eq(true, 'getItemById should have been called');
 | |
|       expect(createItem.notCalled).to.be.eq(true, 'createItem should not have been called');
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   describe('getHasSeenHF191', () => {
 | |
|     afterEach(() => {
 | |
|       Sinon.restore();
 | |
|       resetHardForkCachedValues();
 | |
|     });
 | |
| 
 | |
|     it('fetches from db if undefined, and write to db false if db value is undefined', async () => {
 | |
|       const getItemById = TestUtils.stubData('getItemById').resolves(undefined);
 | |
|       const createItem = TestUtils.stubData('createOrUpdateItem').resolves();
 | |
| 
 | |
|       const ret = await getHasSeenHF191();
 | |
|       expect(ret).to.be.eq(false, 'getHasSeenHF191 should return false');
 | |
| 
 | |
|       expect(getItemById.calledOnce).to.be.eq(true, 'getItemById should have been called');
 | |
|       expect(createItem.calledOnce).to.be.eq(true, 'createItem should have been called');
 | |
|       expect(createItem.args[0][0]).to.be.deep.eq(
 | |
|         { id: 'hasSeenHardfork191', value: false },
 | |
|         'createItem should have been to set hasSeenHardfork191 to false in the db'
 | |
|       );
 | |
|     });
 | |
| 
 | |
|     it('fetches from db if undefined, and does not write to db if db value is not undefined', async () => {
 | |
|       const getItemById = TestUtils.stubData('getItemById').resolves({
 | |
|         id: 'getHasSeenHF191',
 | |
|         value: false,
 | |
|       });
 | |
|       const createItem = TestUtils.stubData('createOrUpdateItem').resolves();
 | |
| 
 | |
|       const ret = await getHasSeenHF191();
 | |
|       expect(ret).to.be.eq(false, 'getHasSeenHF191 should return false');
 | |
| 
 | |
|       expect(getItemById.calledOnce).to.be.eq(true, 'getItemById should have been called');
 | |
|       expect(createItem.notCalled).to.be.eq(true, 'createItem should not have been called');
 | |
|     });
 | |
| 
 | |
|     it('fetches from db if undefined, and does not write to db if db value is not undefined - 2', async () => {
 | |
|       const getItemById = TestUtils.stubData('getItemById').resolves({
 | |
|         id: 'getHasSeenHF191',
 | |
|         value: true,
 | |
|       });
 | |
|       const createItem = TestUtils.stubData('createOrUpdateItem').resolves();
 | |
| 
 | |
|       const ret = await getHasSeenHF191();
 | |
|       expect(ret).to.be.eq(true, 'getHasSeenHF191 should return false');
 | |
| 
 | |
|       expect(getItemById.calledOnce).to.be.eq(true, 'getItemById should have been called');
 | |
|       expect(createItem.notCalled).to.be.eq(true, 'createItem should not have been called');
 | |
|     });
 | |
| 
 | |
|     it('fetches from db only the value is not cached already', async () => {
 | |
|       const getItemById = TestUtils.stubData('getItemById').resolves({
 | |
|         id: 'getHasSeenHF191',
 | |
|         value: true,
 | |
|       });
 | |
|       const createItem = TestUtils.stubData('createOrUpdateItem').resolves();
 | |
| 
 | |
|       const ret = await getHasSeenHF191();
 | |
|       const ret2 = await getHasSeenHF191();
 | |
|       expect(ret).to.be.eq(true, 'getHasSeenHF191 should return false');
 | |
|       expect(ret2).to.be.eq(true, 'getHasSeenHF191 should return false - 2');
 | |
| 
 | |
|       expect(getItemById.calledOnce).to.be.eq(true, 'getItemById should have been called');
 | |
|       expect(createItem.notCalled).to.be.eq(true, 'createItem should not have been called');
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   describe('handleHardforkResult', () => {
 | |
|     afterEach(() => {
 | |
|       Sinon.restore();
 | |
|       resetHardForkCachedValues();
 | |
|     });
 | |
| 
 | |
|     it('does not fail if null is given as json', async () => {
 | |
|       const getItemById = TestUtils.stubData('getItemById').resolves(undefined);
 | |
|       const createItem = TestUtils.stubData('createOrUpdateItem').resolves();
 | |
| 
 | |
|       await handleHardforkResult(null as any);
 | |
|       expect(getItemById.calledTwice).to.be.eq(true, 'getItemById should have been calledTwice');
 | |
|       expect(createItem.calledTwice).to.be.eq(true, 'createItem should have been calledTwice');
 | |
|       expect(createItem.args[0][0]).to.be.deep.eq(
 | |
|         { id: 'hasSeenHardfork190', value: false },
 | |
|         'createItem should have been to set hasSeenHardfork190 to false in the db'
 | |
|       );
 | |
|       expect(createItem.args[1][0]).to.be.deep.eq(
 | |
|         { id: 'hasSeenHardfork191', value: false },
 | |
|         'createItem should have been to set hasSeenHardfork191 to false in the db'
 | |
|       );
 | |
|     });
 | |
| 
 | |
|     it('does not fail on empty json object', async () => {
 | |
|       const getItemById = TestUtils.stubData('getItemById').resolves(undefined);
 | |
|       const createItem = TestUtils.stubData('createOrUpdateItem').resolves();
 | |
| 
 | |
|       await handleHardforkResult({});
 | |
|       expect(getItemById.calledTwice).to.be.eq(true, 'getItemById should have been calledTwice');
 | |
|       expect(createItem.calledTwice).to.be.eq(true, 'createItem should have been calledTwice');
 | |
|       expect(createItem.args[0][0]).to.be.deep.eq(
 | |
|         { id: 'hasSeenHardfork190', value: false },
 | |
|         'createItem should have been to set hasSeenHardfork190 to false in the db'
 | |
|       );
 | |
|       expect(createItem.args[1][0]).to.be.deep.eq(
 | |
|         { id: 'hasSeenHardfork191', value: false },
 | |
|         'createItem should have been to set hasSeenHardfork191 to false in the db'
 | |
|       );
 | |
|     });
 | |
| 
 | |
|     it('does not fail with invalid array length of 3', async () => {
 | |
|       const getItemById = TestUtils.stubData('getItemById').resolves(undefined);
 | |
|       const createItem = TestUtils.stubData('createOrUpdateItem').resolves();
 | |
| 
 | |
|       await handleHardforkResult({ hf: [1, 2, 3] });
 | |
|       expect(getItemById.calledTwice).to.be.eq(true, 'getItemById should have been calledTwice');
 | |
|       expect(createItem.calledTwice).to.be.eq(true, 'createItem should have been calledTwice');
 | |
|       expect(createItem.args[0][0]).to.be.deep.eq(
 | |
|         { id: 'hasSeenHardfork190', value: false },
 | |
|         'createItem should have been to set hasSeenHardfork190 to false in the db'
 | |
|       );
 | |
|       expect(createItem.args[1][0]).to.be.deep.eq(
 | |
|         { id: 'hasSeenHardfork191', value: false },
 | |
|         'createItem should have been to set hasSeenHardfork191 to false in the db'
 | |
|       );
 | |
|     });
 | |
| 
 | |
|     it('does not fail with invalid array length of 3', async () => {
 | |
|       const getItemById = TestUtils.stubData('getItemById').resolves(undefined);
 | |
|       const createItem = TestUtils.stubData('createOrUpdateItem').resolves();
 | |
| 
 | |
|       await handleHardforkResult({ hf: [1, 2, 3] });
 | |
|       expect(getItemById.calledTwice).to.be.eq(true, 'getItemById should have been calledTwice');
 | |
|       expect(createItem.calledTwice).to.be.eq(true, 'createItem should have been calledTwice');
 | |
|       expect(createItem.args[0][0]).to.be.deep.eq(
 | |
|         { id: 'hasSeenHardfork190', value: false },
 | |
|         'createItem should have been to set hasSeenHardfork190 to false in the db'
 | |
|       );
 | |
|       expect(createItem.args[1][0]).to.be.deep.eq(
 | |
|         { id: 'hasSeenHardfork191', value: false },
 | |
|         'createItem should have been to set hasSeenHardfork191 to false in the db'
 | |
|       );
 | |
|     });
 | |
| 
 | |
|     it('does not fail with invalid array length of but not numbers', async () => {
 | |
|       const getItemById = TestUtils.stubData('getItemById').resolves(undefined);
 | |
|       const createItem = TestUtils.stubData('createOrUpdateItem').resolves();
 | |
| 
 | |
|       await handleHardforkResult({ hf: ['1', 2] });
 | |
|       expect(getItemById.calledTwice).to.be.eq(true, 'getItemById should have been calledTwice');
 | |
|       expect(createItem.calledTwice).to.be.eq(true, 'createItem should have been calledTwice');
 | |
|       expect(createItem.args[0][0]).to.be.deep.eq(
 | |
|         { id: 'hasSeenHardfork190', value: false },
 | |
|         'createItem should have been to set hasSeenHardfork190 to false in the db'
 | |
|       );
 | |
|       expect(createItem.args[1][0]).to.be.deep.eq(
 | |
|         { id: 'hasSeenHardfork191', value: false },
 | |
|         'createItem should have been to set hasSeenHardfork191 to false in the db'
 | |
|       );
 | |
|     });
 | |
| 
 | |
|     it('does not fail with invalid array length of 1 ', async () => {
 | |
|       const getItemById = TestUtils.stubData('getItemById').resolves(undefined);
 | |
|       const createItem = TestUtils.stubData('createOrUpdateItem').resolves();
 | |
| 
 | |
|       await handleHardforkResult({ hf: [1] });
 | |
|       expect(getItemById.calledTwice).to.be.eq(true, 'getItemById should have been calledTwice');
 | |
|       expect(createItem.calledTwice).to.be.eq(true, 'createItem should have been calledTwice');
 | |
|       expect(createItem.args[0][0]).to.be.deep.eq(
 | |
|         { id: 'hasSeenHardfork190', value: false },
 | |
|         'createItem should have been to set hasSeenHardfork190 to false in the db'
 | |
|       );
 | |
|       expect(createItem.args[1][0]).to.be.deep.eq(
 | |
|         { id: 'hasSeenHardfork191', value: false },
 | |
|         'createItem should have been to set hasSeenHardfork191 to false in the db'
 | |
|       );
 | |
|     });
 | |
| 
 | |
|     it('does not write new data if hf major is <= 18 ', async () => {
 | |
|       const getItemById = TestUtils.stubData('getItemById').resolves(undefined);
 | |
|       const createItem = TestUtils.stubData('createOrUpdateItem').resolves();
 | |
| 
 | |
|       await handleHardforkResult({ hf: [18, 9] });
 | |
|       expect(getItemById.calledTwice).to.be.eq(true, 'getItemById should have been calledTwice');
 | |
|       expect(createItem.calledTwice).to.be.eq(true, 'createItem should have been calledTwice');
 | |
|       expect(createItem.args[0][0]).to.be.deep.eq(
 | |
|         { id: 'hasSeenHardfork190', value: false },
 | |
|         'createItem should have been to set hasSeenHardfork190 to false in the db'
 | |
|       );
 | |
|       expect(createItem.args[1][0]).to.be.deep.eq(
 | |
|         { id: 'hasSeenHardfork191', value: false },
 | |
|         'createItem should have been to set hasSeenHardfork191 to false in the db'
 | |
|       );
 | |
|     });
 | |
| 
 | |
|     it('does write new data if hf major is === 19 and minor === 0  ', async () => {
 | |
|       const getItemById = TestUtils.stubData('getItemById').resolves(undefined);
 | |
|       const createItem = TestUtils.stubData('createOrUpdateItem').resolves();
 | |
| 
 | |
|       await handleHardforkResult({ hf: [19, 0] });
 | |
|       expect(getItemById.calledTwice).to.be.eq(true, 'getItemById should have been calledTwice');
 | |
|       expect(createItem.calledThrice).to.be.eq(true, 'createItem should have been calledThrice');
 | |
|       expect(createItem.args[0][0]).to.be.deep.eq(
 | |
|         { id: 'hasSeenHardfork190', value: false },
 | |
|         'createItem should have been to set hasSeenHardfork190 to false in the db'
 | |
|       );
 | |
|       expect(createItem.args[1][0]).to.be.deep.eq(
 | |
|         { id: 'hasSeenHardfork191', value: false },
 | |
|         'createItem should have been to set hasSeenHardfork191 to false in the db'
 | |
|       );
 | |
| 
 | |
|       expect(createItem.args[2][0]).to.be.deep.eq(
 | |
|         { id: 'hasSeenHardfork190', value: true },
 | |
|         'createItem should have been to set hasSeenHardfork191 to true in the db'
 | |
|       );
 | |
| 
 | |
|       getItemById.resetHistory();
 | |
|       createItem.resetHistory();
 | |
|       expect(await getHasSeenHF190()).to.be.eq(true, 'getHasSeenHF190 should have been true');
 | |
|       expect(getItemById.notCalled).to.be.eq(true, 'getItemById should not have been called more');
 | |
|       expect(createItem.notCalled).to.be.eq(true, 'createItem should not have been called more');
 | |
|     });
 | |
| 
 | |
|     it('does write new data if hf major is === 19 and minor === 1 ', async () => {
 | |
|       const getItemById = TestUtils.stubData('getItemById').resolves(undefined);
 | |
|       const createItem = TestUtils.stubData('createOrUpdateItem').resolves();
 | |
| 
 | |
|       await handleHardforkResult({ hf: [19, 1] });
 | |
|       expect(getItemById.calledTwice).to.be.eq(true, 'getItemById should have been calledTwice');
 | |
|       expect(createItem.callCount).to.be.eq(4, 'createItem should have been 4');
 | |
|       expect(createItem.args[0][0]).to.be.deep.eq(
 | |
|         { id: 'hasSeenHardfork190', value: false },
 | |
|         'createItem should have been to set hasSeenHardfork190 to false in the db'
 | |
|       );
 | |
|       expect(createItem.args[1][0]).to.be.deep.eq(
 | |
|         { id: 'hasSeenHardfork191', value: false },
 | |
|         'createItem should have been to set hasSeenHardfork191 to false in the db'
 | |
|       );
 | |
| 
 | |
|       expect(createItem.args[2][0]).to.be.deep.eq(
 | |
|         { id: 'hasSeenHardfork190', value: true },
 | |
|         'createItem should have been to set hasSeenHardfork190 to true in the db'
 | |
|       );
 | |
|       expect(createItem.args[3][0]).to.be.deep.eq(
 | |
|         { id: 'hasSeenHardfork191', value: true },
 | |
|         'createItem should have been to set hasSeenHardfork191 to true in the db'
 | |
|       );
 | |
|       getItemById.resetHistory();
 | |
|       createItem.resetHistory();
 | |
|       expect(await getHasSeenHF190()).to.be.eq(true, 'getHasSeenHF190 should have been true');
 | |
|       expect(await getHasSeenHF191()).to.be.eq(true, 'getHasSeenHF191 should have been true');
 | |
|       expect(getItemById.notCalled).to.be.eq(true, 'getItemById should not have been called more');
 | |
|       expect(createItem.notCalled).to.be.eq(true, 'createItem should not have been called more');
 | |
|     });
 | |
| 
 | |
|     it('does not write new data if hf major is === 19 and minor === 1 but it is already known we have seen both forks ', async () => {
 | |
|       const getItemById = TestUtils.stubData('getItemById').resolves({ id: '', value: true });
 | |
|       const createItem = TestUtils.stubData('createOrUpdateItem').resolves();
 | |
| 
 | |
|       await handleHardforkResult({ hf: [19, 1] });
 | |
|       expect(getItemById.calledTwice).to.be.eq(true, 'getItemById should have been calledTwice');
 | |
|       expect(createItem.callCount).to.be.eq(0, 'createItem should have been 0');
 | |
| 
 | |
|       getItemById.resetHistory();
 | |
|       createItem.resetHistory();
 | |
|       expect(await getHasSeenHF190()).to.be.eq(true, 'getHasSeenHF190 should have been true');
 | |
|       expect(await getHasSeenHF191()).to.be.eq(true, 'getHasSeenHF191 should have been true');
 | |
|       expect(getItemById.notCalled).to.be.eq(true, 'getItemById should not have been called more');
 | |
|       expect(createItem.notCalled).to.be.eq(true, 'createItem should not have been called more');
 | |
|     });
 | |
|   });
 | |
| });
 |