Skip to content

Commit 3f45b4d

Browse files
authored
Merge pull request mvs-org#123 from mvs-org/dev
Continuous integration
2 parents 234c0e0 + f7ddffe commit 3f45b4d

File tree

10 files changed

+163
-90
lines changed

10 files changed

+163
-90
lines changed

.travis.yml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
sudo: required
2+
addons:
3+
addons:
4+
chrome: stable
5+
apt:
6+
packages:
7+
- chromium-chromedriver
8+
language: node_js
9+
node_js:
10+
- 8
11+
cache:
12+
directories:
13+
- node_modules
14+
before_script:
15+
- export DISPLAY=:99.0
16+
- export PATH=$PATH:/usr/lib/chromium-browser/
17+
- ./node_modules/ionic/bin/ionic serve --no-open &
18+
- sleep 30
19+
install:
20+
- npm install
21+
- npm run e2e-update
22+
script:
23+
- npm run e2e
24+

e2e/app.e2e-spec.ts

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
11
import { Page } from './app.po';
22

33
describe('App', () => {
4-
let page: Page;
4+
let page: Page;
55

6-
beforeEach(() => {
7-
page = new Page();
8-
});
9-
10-
describe('open wallet', () => {
116
beforeEach(() => {
12-
page.navigateTo('/');
7+
page = new Page();
138
});
149

15-
it('should have an open wallet button', () => {
16-
page.hasOpenWalletButton().then(res => {
17-
expect(res).toEqual(true);
18-
});
19-
});
20-
it('should have a title saying Login', () => {
21-
page.getTitle().then(title => {
22-
expect(title).toEqual('MyETPWallet.com');
23-
});
24-
});
25-
})
10+
describe('open wallet', () => {
11+
beforeEach(() => {
12+
page.navigateTo('/');
13+
});
14+
15+
it('should have an open wallet button', () => {
16+
page.hasId("open-wallet-button").then(res => {
17+
expect(res).toEqual(true);
18+
});
19+
});
20+
it('should have a title saying Login', () => {
21+
page.getTitle().then(title => {
22+
expect(title).toEqual('Metaverse Lightwallet');
23+
});
24+
});
25+
})
2626
});

e2e/app.po.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,18 @@ import { browser, element, by } from 'protractor';
22

33
export class Page {
44

5-
navigateTo(destination) {
6-
return browser.get(destination);
7-
}
5+
navigateTo(destination) {
6+
return browser.get(destination);
7+
}
8+
9+
getTitle() {
10+
return browser.getTitle();
11+
}
812

9-
getTitle() {
10-
return browser.getTitle();
11-
}
13+
getElementById = (id) => element(by.id(id))
1214

13-
hasOpenWalletButton(){
14-
return browser.isElementPresent(element(by.id("close-wallet-button")))
15+
hasId(id) {
16+
return browser.isElementPresent(this.getElementById(id))
1517
}
16-
18+
1719
}

e2e/create-wallet.e2e-spec.ts

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,41 @@
11
import { Page } from './app.po';
22

33
describe('Wallet creation', () => {
4-
let page: Page;
54

6-
beforeEach(() => {
7-
page = new Page();
8-
});
5+
let page: Page;
96

10-
describe('open wallet', () => {
117
beforeEach(() => {
12-
page.navigateTo('/');
8+
page = new Page();
139
});
1410

15-
it('should have an open wallet button', () => {
16-
page.hasOpenWalletButton().then(res => {
17-
expect(res).toEqual(true);
18-
});
19-
});
20-
it('should have a title saying Login', () => {
21-
page.getTitle().then(title => {
22-
expect(title).toEqual('MyETPWallet.com');
23-
});
24-
});
25-
})
11+
describe('Load login page', () => {
12+
beforeEach(() => {
13+
page.navigateTo('/');
14+
});
15+
16+
it('Login should have an create wallet button', () => {
17+
page.hasId("create-wallet-button").then(res => {
18+
expect(res).toEqual(true);
19+
});
20+
});
21+
it('Login should have correct title', () => {
22+
page.getTitle().then(title => {
23+
expect(title).toEqual('Metaverse Lightwallet');
24+
});
25+
});
26+
})
27+
28+
describe('Gerneate new wallet', () => {
29+
beforeEach(() => {
30+
page.navigateTo('/');
31+
page.getElementById("create-wallet-button").click()
32+
});
33+
34+
it('Page should have backup words', () => {
35+
page.hasId("backup-words").then(res => {
36+
expect(res).toEqual(true);
37+
});
38+
});
39+
})
40+
2641
});

src/app/app.component.spec.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import { ErrorHandler, NgModule } from '@angular/core';
55
import { WalletServiceProvider } from '../providers/wallet-service/wallet-service';
66
import { MvsServiceProvider } from '../providers/mvs-service/mvs-service';
77
import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular';
8+
import { SplashScreen } from '@ionic-native/splash-screen';
9+
import { StatusBar } from '@ionic-native/status-bar';
10+
import { Keyboard } from '@ionic-native/keyboard';
811

912

1013
import { BrowserModule } from '@angular/platform-browser';
@@ -20,20 +23,20 @@ export function HttpLoaderFactory(http: Http) {
2023
return new TranslateHttpLoader(http, '/assets/i18n/', '.json');
2124
}
2225

23-
describe('MyApp Component', () => {
26+
describe('MyETPWallet Component', () => {
2427
let fixture;
2528
let component;
2629

2730
beforeEach(async(() => {
2831
TestBed.configureTestingModule({
29-
declarations: [MyApp],
32+
declarations: [MyETPWallet],
3033
imports: [
31-
IonicModule.forRoot(MyApp),
34+
IonicModule.forRoot(MyETPWallet),
3235
BrowserModule,
3336
QRCodeModule,
3437
HttpModule,
3538
ClipboardModule,
36-
IonicModule.forRoot(MyApp),
39+
IonicModule.forRoot(MyETPWallet),
3740
TranslateModule.forRoot({
3841
loader: {
3942
provide: TranslateLoader,
@@ -50,6 +53,9 @@ describe('MyApp Component', () => {
5053
AppGlobals,
5154
{ provide: ErrorHandler, useClass: IonicErrorHandler },
5255
MvsServiceProvider,
56+
Keyboard,
57+
StatusBar,
58+
SplashScreen,
5359
WalletServiceProvider
5460
]
5561
})
@@ -58,19 +64,13 @@ describe('MyApp Component', () => {
5864

5965

6066
beforeEach(() => {
61-
fixture = TestBed.createComponent(MyApp);
67+
fixture = TestBed.createComponent(MyETPWallet);
6268
component = fixture.componentInstance;
6369
});
6470

6571

6672
it('should be created', () => {
67-
expect(component instanceof MyApp).toBe(true);
68-
});
69-
70-
it('should have two pages', () => {
71-
setTimeout(()=>{
72-
expect(component.pages.length).toBe(true)
73-
},1000)
73+
expect(component instanceof MyETPWallet).toBe(true);
7474
});
7575

7676
});

src/pages/generate-key/generate-key.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ <h1>{{'YOUR_MNEMONIC_WORDS'|translate}}</h1>
1919
<ion-row class="card-content">
2020
<ion-col center text-center>
2121
<h1 class="center">
22-
<div>{{wallet.mnemonic}}</div>
22+
<div id="backup-words">{{wallet.mnemonic}}</div>
2323
</h1>
2424
</ion-col>
2525
</ion-row>

src/pages/login/login.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ <h1 style="text-align: center;" *ngIf="globals.network=='testnet'">Testnet</h1>
2020
<div style="text-align: center;">{{version()}}</div>
2121
</div>
2222
<ion-row class="browser-button">
23-
<button ion-button class="large-btn" block full icon-left (click)="GenerateKeyPage();">
23+
<button ion-button class="large-btn" block full icon-left (click)="GenerateKeyPage();" id="create-wallet-button">
2424
<ion-icon name="add"></ion-icon>
2525
{{"CREATE_NEW_WALLET_BUTTON"|translate}}
2626
</button>
2727
</ion-row>
2828
<ion-row *ngIf="!platform.is('mobile')" class="browser-button">
29-
<button ion-button class="large-btn" block full icon-left (click)="ImportMnemonicPage();">
29+
<button ion-button class="large-btn" block full icon-left (click)="ImportMnemonicPage();" id="create-wallet-frombackup-button">
3030
<ion-icon name="download"></ion-icon>
3131
{{"CREATE_FROM_BACKUP_WORDS"|translate}}
3232
</button>

src/providers/wallet-service/wallet-service.spec.ts

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { async, TestBed } from '@angular/core/testing';
2-
2+
import { AppGlobals } from '../../app/app.global';
33
import { WalletServiceProvider } from './wallet-service';
4+
import { CryptoServiceProvider } from '../crypto-service/crypto-service';
45
import { IonicStorageModule } from '@ionic/storage';
56
import { Storage } from '@ionic/storage';
67

@@ -12,14 +13,32 @@ describe('Wallet Provider', () => {
1213
new Storage({
1314
name: '__myetpwallet',
1415
driverOrder: ['indexeddb', 'localstorage']
15-
}), undefined, undefined)
16+
}), new AppGlobals(), new CryptoServiceProvider())
17+
});
18+
19+
it('Generate Wallet', (done)=> {
20+
let passphrase = 'passphrase123'
21+
let wallet = null;
22+
return walletservice.createWallet()
23+
.then(result=>{
24+
expect(result !=undefined && result.mnemonic!==undefined).toBe(true)
25+
done()
26+
})
1627
});
1728

18-
it('Storage', (done)=> {
19-
walletservice.setA()
20-
.then(function(){ console.log(1); return walletservice.getA()})
21-
.then(function(result){
22-
expect(result).toBe(1)
29+
it('Store and retrieve Wallet', (done)=> {
30+
let passphrase = 'passphrase123'
31+
let wallet = null;
32+
return walletservice.createWallet()
33+
.then(result=>{
34+
expect(result !=undefined && result.mnemonic!==undefined).toBe(true)
35+
wallet=result;
36+
return walletservice.encryptWalletFromMnemonic(wallet.mnemonic, passphrase)
37+
})
38+
.then(wallet=>walletservice.setWallet(wallet))
39+
.then(wallet=>walletservice.getMnemonic(passphrase))
40+
.then((mnemonic)=>{
41+
expect(mnemonic).toBe(wallet.mnemonic)
2342
done()
2443
})
2544
});

src/providers/wallet-service/wallet-service.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,16 @@ export class WalletServiceProvider {
1717
.then((seed) => this.crypto.encrypt(seed.toString('hex'), passphrase))
1818
}
1919

20+
encryptWalletFromMnemonic(mnemonic, passphrase){
21+
return this.crypto.encrypt(mnemonic, passphrase)
22+
.then((res) => this.dataToKeystoreJson(res))
23+
}
24+
25+
dataToKeystoreJson(mnemonic) {
26+
let tmp = { version: this.globals.version, algo: this.globals.algo, index: this.globals.index, mnemonic: mnemonic };
27+
return tmp;
28+
}
29+
2030
getMstIcons() {
2131
return ['ETP', 'MVS.ZGC', 'MVS.ZDC', 'CSD.CSD', 'PARCELX.GPX', 'PARCELX.TEST', 'SDG', 'META', 'MVS.HUG'];
2232
}

test-config/protractor.conf.js

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,31 @@
55
var SpecReporter = require('jasmine-spec-reporter').SpecReporter;
66

77
exports.config = {
8-
allScriptsTimeout: 11000,
9-
specs: [
10-
'../e2e/**/*.e2e-spec.ts'
11-
],
12-
capabilities: {
13-
'browserName': 'chrome'
14-
},
15-
directConnect: true,
16-
baseUrl: 'http://localhost:8100/',
17-
framework: 'jasmine',
18-
jasmineNodeOpts: {
19-
showColors: true,
20-
defaultTimeoutInterval: 30000,
21-
print: function() {}
22-
},
23-
useAllAngular2AppRoots: true,
24-
beforeLaunch: function() {
25-
require('ts-node').register({
26-
project: 'e2e'
27-
});
28-
},
29-
onPrepare: function() {
30-
jasmine.getEnv().addReporter(new SpecReporter());
31-
}
8+
allScriptsTimeout: 11000,
9+
specs: [
10+
'../e2e/**/*.e2e-spec.ts'
11+
],
12+
capabilities: {
13+
'browserName': 'chrome',
14+
chromeOptions: {
15+
args: ['--headless', '--disable-gpu', '--window-size=800,600', '--no-sandbox']
16+
}
17+
},
18+
directConnect: true,
19+
baseUrl: 'http://localhost:8100/',
20+
framework: 'jasmine',
21+
jasmineNodeOpts: {
22+
showColors: true,
23+
defaultTimeoutInterval: 30000,
24+
print: function() {}
25+
},
26+
useAllAngular2AppRoots: true,
27+
beforeLaunch: function() {
28+
require('ts-node').register({
29+
project: 'e2e'
30+
});
31+
},
32+
onPrepare: function() {
33+
jasmine.getEnv().addReporter(new SpecReporter());
34+
}
3235
};

0 commit comments

Comments
 (0)