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.
		
		
		
		
		
			
		
			
				
	
	
		
			155 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			155 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			TypeScript
		
	
| import { expect } from 'chai';
 | |
| import Sinon from 'sinon';
 | |
| import { displayNameIsValid } from '../../../../components/registration/utils';
 | |
| import { getSwarmPollingInstance } from '../../../../session/apis/snode_api';
 | |
| import { PubKey } from '../../../../session/types';
 | |
| import {
 | |
|   generateMnemonic,
 | |
|   registerSingleDevice,
 | |
|   signInByLinkingDevice,
 | |
| } from '../../../../util/accountManager';
 | |
| import { TestUtils } from '../../../test-utils';
 | |
| import { stubWindow } from '../../../test-utils/utils';
 | |
| 
 | |
| describe('Onboarding', () => {
 | |
|   const polledDisplayName = 'Hello World';
 | |
| 
 | |
|   beforeEach(() => {
 | |
|     TestUtils.stubWindowLog();
 | |
|     TestUtils.stubWindowWhisper();
 | |
|     TestUtils.stubStorage();
 | |
|     TestUtils.stubI18n();
 | |
|     TestUtils.stubData('createOrUpdateItem').resolves();
 | |
|     TestUtils.stubData('removeItemById').resolves();
 | |
|     stubWindow('setOpengroupPruning', () => {});
 | |
|     Sinon.stub(getSwarmPollingInstance(), 'pollOnceForOurDisplayName').resolves(polledDisplayName);
 | |
|   });
 | |
| 
 | |
|   afterEach(() => {
 | |
|     Sinon.restore();
 | |
|   });
 | |
| 
 | |
|   describe('displayNameIsValid', () => {
 | |
|     it('should throw an error if the display name is undefined', async () => {
 | |
|       try {
 | |
|         displayNameIsValid(undefined);
 | |
|       } catch (error) {
 | |
|         error.should.be.an.instanceOf(Error);
 | |
|         error.message.should.equal(window.i18n('displayNameEmpty'));
 | |
|       }
 | |
|     });
 | |
|     it('should throw an error if the display name is empty after trimming', async () => {
 | |
|       try {
 | |
|         displayNameIsValid('    ');
 | |
|       } catch (error) {
 | |
|         error.should.be.an.instanceOf(Error);
 | |
|         error.message.should.equal(window.i18n('displayNameEmpty'));
 | |
|       }
 | |
|     });
 | |
|     it('if the display name is valid it should be returned', async () => {
 | |
|       try {
 | |
|         const displayName = 'Hello World';
 | |
|         const validDisplayName = displayNameIsValid(displayName);
 | |
|         expect(validDisplayName, `should equal ${displayName}`).to.equal(displayName);
 | |
|       } catch (error) {
 | |
|         error.should.not.be.an.instanceOf(Error);
 | |
|         error.message.should.not.equal(window.i18n('displayNameEmpty'));
 | |
|       }
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   describe('registerSingleDevice', () => {
 | |
|     it('should return a valid pubkey/account id given a valid recovery password and display name', async () => {
 | |
|       const recoveryPassword = await generateMnemonic();
 | |
|       const validDisplayName = 'Hello World';
 | |
|       let accountId = null;
 | |
| 
 | |
|       await registerSingleDevice(
 | |
|         recoveryPassword,
 | |
|         'english',
 | |
|         validDisplayName,
 | |
|         async (pubkey: string) => {
 | |
|           accountId = pubkey;
 | |
|         }
 | |
|       );
 | |
| 
 | |
|       expect(accountId, 'should not be null').to.not.be.null;
 | |
|       expect(accountId, 'should be a string').to.be.a('string');
 | |
|       expect(PubKey.validate(accountId!), 'should be a valid pubkey').to.equal(true);
 | |
|     });
 | |
|     it('should throw an error if the recovery password is empty', async () => {
 | |
|       try {
 | |
|         const recoveryPassword = '';
 | |
|         const validDisplayName = 'Hello World';
 | |
| 
 | |
|         await registerSingleDevice(recoveryPassword, 'english', validDisplayName, async () => {});
 | |
|       } catch (error) {
 | |
|         error.should.be.an.instanceOf(Error);
 | |
|         error.message.should.equal(
 | |
|           'Session always needs a mnemonic. Either generated or given by the user'
 | |
|         );
 | |
|       }
 | |
|     });
 | |
|     it('should throw an error if the mnemonicLanguage is empty', async () => {
 | |
|       try {
 | |
|         const recoveryPassword = await generateMnemonic();
 | |
|         const validDisplayName = 'Hello World';
 | |
| 
 | |
|         await registerSingleDevice(recoveryPassword, '', validDisplayName, async () => {});
 | |
|       } catch (error) {
 | |
|         error.should.be.an.instanceOf(Error);
 | |
|         error.message.should.equal('We always need a mnemonicLanguage');
 | |
|       }
 | |
|     });
 | |
|     it('should throw an error if the display name is empty', async () => {
 | |
|       try {
 | |
|         const recoveryPassword = await generateMnemonic();
 | |
|         const validDisplayName = '';
 | |
| 
 | |
|         await registerSingleDevice(recoveryPassword, 'english', validDisplayName, async () => {});
 | |
|       } catch (error) {
 | |
|         error.should.be.an.instanceOf(Error);
 | |
|         error.message.should.equal('We always need a displayName');
 | |
|       }
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   describe('signInByLinkingDevice', () => {
 | |
|     const abortController = new AbortController();
 | |
| 
 | |
|     it('should return a valid pubkey/account id and display name given a valid recovery password', async () => {
 | |
|       const recoveryPassword = await generateMnemonic();
 | |
|       const { displayName, pubKeyString } = await signInByLinkingDevice(
 | |
|         recoveryPassword,
 | |
|         'english',
 | |
|         abortController.signal
 | |
|       );
 | |
|       expect(pubKeyString, 'should not be null').to.not.be.null;
 | |
|       expect(pubKeyString, 'should be a string').to.be.a('string');
 | |
|       expect(PubKey.validate(pubKeyString!), 'should be a valid pubkey').to.equal(true);
 | |
|       expect(displayName, 'should not be null').to.not.be.null;
 | |
|       expect(displayName, 'should be a string').to.be.a('string');
 | |
|       expect(displayName, `should equal ${polledDisplayName}`).to.equal(polledDisplayName);
 | |
|     });
 | |
|     it('should throw an error if the recovery password is empty', async () => {
 | |
|       try {
 | |
|         await signInByLinkingDevice('', 'english', abortController.signal);
 | |
|       } catch (error) {
 | |
|         error.should.be.an.instanceOf(Error);
 | |
|         error.message.should.equal(
 | |
|           'Session always needs a mnemonic. Either generated or given by the user'
 | |
|         );
 | |
|       }
 | |
|     });
 | |
|     it('should throw an error if the mnemonicLanguage is empty', async () => {
 | |
|       try {
 | |
|         const recoveryPassword = await generateMnemonic();
 | |
|         await signInByLinkingDevice(recoveryPassword, '', abortController.signal);
 | |
|       } catch (error) {
 | |
|         error.should.be.an.instanceOf(Error);
 | |
|         error.message.should.equal('We always need a mnemonicLanguage');
 | |
|       }
 | |
|     });
 | |
|   });
 | |
| });
 |