mirror of https://github.com/BTCPrivate/copay.git
test LocalStorage implementation
This commit is contained in:
parent
13586f60f8
commit
e4a234f81c
20
package.json
20
package.json
|
@ -14,12 +14,12 @@
|
||||||
"extract": "ngx-translate-extract --input ./src --output ./src/assets/i18n/app.pot --clean --sort --format pot"
|
"extract": "ngx-translate-extract --input ./src --output ./src/assets/i18n/app.pot --clean --sort --format pot"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@angular/common": "4.1.3",
|
"@angular/common": "4.2.3",
|
||||||
"@angular/core": "4.1.3",
|
"@angular/core": "4.2.3",
|
||||||
"@angular/forms": "4.1.3",
|
"@angular/forms": "4.2.3",
|
||||||
"@angular/http": "4.1.3",
|
"@angular/http": "4.2.3",
|
||||||
"@angular/platform-browser": "4.1.3",
|
"@angular/platform-browser": "4.2.3",
|
||||||
"@angular/platform-browser-dynamic": "4.1.3",
|
"@angular/platform-browser-dynamic": "4.2.3",
|
||||||
"@angular/tsc-wrapped": "^4.3.2",
|
"@angular/tsc-wrapped": "^4.3.2",
|
||||||
"@biesbjerg/ngx-translate-po-http-loader": "^1.0.1",
|
"@biesbjerg/ngx-translate-po-http-loader": "^1.0.1",
|
||||||
"@ionic-native/core": "3.12.1",
|
"@ionic-native/core": "3.12.1",
|
||||||
|
@ -38,9 +38,9 @@
|
||||||
"zone.js": "0.8.12"
|
"zone.js": "0.8.12"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@angular/cli": "^1.2.5",
|
"@angular/cli": "^1.2.7",
|
||||||
"@angular/compiler": "^4.3.1",
|
"@angular/compiler": "4.2.3",
|
||||||
"@angular/compiler-cli": "^4.3.1",
|
"@angular/compiler-cli": "4.2.3",
|
||||||
"@ionic/app-scripts": "2.0.2",
|
"@ionic/app-scripts": "2.0.2",
|
||||||
"@ionic/cli-plugin-cordova": "1.5.0",
|
"@ionic/cli-plugin-cordova": "1.5.0",
|
||||||
"@ionic/cli-plugin-ionic-angular": "1.4.0",
|
"@ionic/cli-plugin-ionic-angular": "1.4.0",
|
||||||
|
@ -50,7 +50,7 @@
|
||||||
"@types/node": "^8.0.19",
|
"@types/node": "^8.0.19",
|
||||||
"codecov": "^2.2.0",
|
"codecov": "^2.2.0",
|
||||||
"@biesbjerg/ngx-translate-extract": "^2.3.2",
|
"@biesbjerg/ngx-translate-extract": "^2.3.2",
|
||||||
"ionic": "3.6.0",
|
"ionic": "3.7.0",
|
||||||
"pre-commit": "^1.2.2",
|
"pre-commit": "^1.2.2",
|
||||||
"jasmine-core": "^2.6.4",
|
"jasmine-core": "^2.6.4",
|
||||||
"jasmine-spec-reporter": "^4.1.1",
|
"jasmine-spec-reporter": "^4.1.1",
|
||||||
|
|
|
@ -2,7 +2,7 @@ import { NgModule, ErrorHandler } from '@angular/core';
|
||||||
import { BrowserModule } from '@angular/platform-browser';
|
import { BrowserModule } from '@angular/platform-browser';
|
||||||
import { HttpModule, Http } from '@angular/http';
|
import { HttpModule, Http } from '@angular/http';
|
||||||
|
|
||||||
import { NgLoggerModule, Level } from '@nsalaun/ng-logger';
|
import { NgLoggerModule, Logger, Level } from '@nsalaun/ng-logger';
|
||||||
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
|
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
|
||||||
import { TranslatePoHttpLoader } from '@biesbjerg/ngx-translate-po-http-loader';
|
import { TranslatePoHttpLoader } from '@biesbjerg/ngx-translate-po-http-loader';
|
||||||
|
|
||||||
|
@ -22,12 +22,12 @@ import { StatusBar } from '@ionic-native/status-bar';
|
||||||
import { SplashScreen } from '@ionic-native/splash-screen';
|
import { SplashScreen } from '@ionic-native/splash-screen';
|
||||||
|
|
||||||
import { WalletProvider } from '../providers/wallet/wallet';
|
import { WalletProvider } from '../providers/wallet/wallet';
|
||||||
import { PersistenceProvider } from '../providers/persistence/persistence';
|
import { PersistenceProvider, persistenceProviderFactory } from '../providers/persistence/persistence';
|
||||||
import { AppProvider } from '../providers/app/app';
|
import { AppProvider } from '../providers/app/app';
|
||||||
import { PlatformProvider } from '../providers/platform/platform';
|
import { PlatformProvider } from '../providers/platform/platform';
|
||||||
|
|
||||||
export function createTranslateLoader(http: Http) {
|
export function createTranslateLoader(http: Http) {
|
||||||
return new TranslatePoHttpLoader(http, './assets/i18n/', '.po');
|
return new TranslatePoHttpLoader(http, './assets/i18n/', '.po');
|
||||||
}
|
}
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
|
@ -70,7 +70,7 @@ export function createTranslateLoader(http: Http) {
|
||||||
SplashScreen,
|
SplashScreen,
|
||||||
{ provide: ErrorHandler, useClass: IonicErrorHandler },
|
{ provide: ErrorHandler, useClass: IonicErrorHandler },
|
||||||
WalletProvider,
|
WalletProvider,
|
||||||
PersistenceProvider,
|
{ provide: PersistenceProvider, useFactory: persistenceProviderFactory, deps: [PlatformProvider, Logger], multi: true },
|
||||||
AppProvider,
|
AppProvider,
|
||||||
PlatformProvider
|
PlatformProvider
|
||||||
]
|
]
|
||||||
|
|
|
@ -2,15 +2,19 @@ import { TestBed, inject } from '@angular/core/testing';
|
||||||
import { PersistenceProvider } from './persistence';
|
import { PersistenceProvider } from './persistence';
|
||||||
import { IStorage, ISTORAGE, KeyAlreadyExistsError } from './storage/istorage';
|
import { IStorage, ISTORAGE, KeyAlreadyExistsError } from './storage/istorage';
|
||||||
import { RamStorage } from './storage/ram-storage';
|
import { RamStorage } from './storage/ram-storage';
|
||||||
import { Logger } from '@nsalaun/ng-logger';
|
import { LocalStorage } from './storage/local-storage';
|
||||||
|
import { Logger, Level as LoggerLevel } from '@nsalaun/ng-logger';
|
||||||
|
import { PlatformProvider } from '../platform/platform';
|
||||||
|
import { Platform } from 'ionic-angular';
|
||||||
|
|
||||||
describe('Storage Service', () => {
|
describe('Storage Service', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
TestBed.configureTestingModule({
|
TestBed.configureTestingModule({
|
||||||
providers: [
|
providers: [
|
||||||
PersistenceProvider,
|
PersistenceProvider,
|
||||||
{ provide: ISTORAGE, useClass: RamStorage },
|
{ provide: Logger, useValue: new Logger(LoggerLevel.DEBUG) },
|
||||||
{ provide: Logger },
|
{ provide: PlatformProvider },
|
||||||
|
{ provide: ISTORAGE, useClass: RamStorage, deps: [PlatformProvider, Logger] },
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -22,20 +26,25 @@ describe('Storage Service', () => {
|
||||||
}));
|
}));
|
||||||
it('should correctly perform a profile roundtrip', () => {
|
it('should correctly perform a profile roundtrip', () => {
|
||||||
let p = { name: 'My profile' };
|
let p = { name: 'My profile' };
|
||||||
service.storeNewProfile(p).then(() => {
|
service.storeNewProfile(p)
|
||||||
service.getProfile().then((profile) => {
|
.catch((err) => expect(err).toBeNull)
|
||||||
|
.then(() => {
|
||||||
|
return service.getProfile();
|
||||||
|
})
|
||||||
|
.then((profile) => {
|
||||||
expect(typeof profile).toEqual('object');
|
expect(typeof profile).toEqual('object');
|
||||||
expect(profile.name).toEqual('My profile');
|
expect(profile.name).toEqual('My profile');
|
||||||
});
|
});
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should fail to create a profile when one already exists', () => {
|
it('should fail to create a profile when one already exists', () => {
|
||||||
let p = { name: 'My profile' };
|
let p = { name: 'My profile' };
|
||||||
service.storeNewProfile(p).then(() => {
|
service.storeNewProfile(p)
|
||||||
service.storeNewProfile(p).catch((err) => {
|
.then(() => {
|
||||||
|
return service.storeNewProfile(p);
|
||||||
|
}).catch((err) => {
|
||||||
expect(err.message).toEqual('Key already exists');
|
expect(err.message).toEqual('Key already exists');
|
||||||
});
|
});
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
|
@ -1,9 +1,13 @@
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { InjectionToken, Inject } from '@angular/core';
|
import { InjectionToken, Inject } from '@angular/core';
|
||||||
import { IStorage, ISTORAGE } from './storage/istorage';
|
|
||||||
import { Logger } from '@nsalaun/ng-logger';
|
import { Logger } from '@nsalaun/ng-logger';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
|
|
||||||
|
import { IStorage, ISTORAGE } from './storage/istorage';
|
||||||
|
import { PlatformProvider } from '../platform/platform';
|
||||||
|
import { LocalStorage } from './storage/local-storage';
|
||||||
|
import { RamStorage } from './storage/ram-storage';
|
||||||
|
|
||||||
const Keys = {
|
const Keys = {
|
||||||
ADDRESS_BOOK: network => 'addressbook-' + network,
|
ADDRESS_BOOK: network => 'addressbook-' + network,
|
||||||
AGREE_DISCLAIMER: 'agreeDisclaimer',
|
AGREE_DISCLAIMER: 'agreeDisclaimer',
|
||||||
|
@ -33,10 +37,15 @@ const Keys = {
|
||||||
TX_HISTORY: walletId => 'txsHistory-' + walletId,
|
TX_HISTORY: walletId => 'txsHistory-' + walletId,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export let persistenceProviderFactory = (platform: PlatformProvider, log: Logger) => {
|
||||||
|
let storage = new RamStorage(platform, log);
|
||||||
|
return new PersistenceProvider(storage, log);
|
||||||
|
};
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class PersistenceProvider {
|
export class PersistenceProvider {
|
||||||
constructor( @Inject(ISTORAGE) public storage: IStorage, private log: Logger) {
|
constructor( @Inject(ISTORAGE) public storage: IStorage, private log: Logger) {
|
||||||
}
|
};
|
||||||
|
|
||||||
storeNewProfile(profile): Promise<void> {
|
storeNewProfile(profile): Promise<void> {
|
||||||
return this.storage.create(Keys.PROFILE, profile);
|
return this.storage.create(Keys.PROFILE, profile);
|
||||||
|
@ -305,11 +314,8 @@ export class PersistenceProvider {
|
||||||
|
|
||||||
removeAllWalletData(walletId: string): Promise<void> {
|
removeAllWalletData(walletId: string): Promise<void> {
|
||||||
return this.clearLastAddress(walletId)
|
return this.clearLastAddress(walletId)
|
||||||
.then(() => {
|
.then(() => { return this.removeTxHistory(walletId); })
|
||||||
return this.removeTxHistory(walletId);
|
.then(() => { return this.clearBackupFlag(walletId); });
|
||||||
}).then(() => {
|
|
||||||
return this.clearBackupFlag(walletId);
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
setAmazonGiftCards(network: string, gcs: any): Promise<void> {
|
setAmazonGiftCards(network: string, gcs: any): Promise<void> {
|
||||||
|
@ -394,12 +400,13 @@ export class PersistenceProvider {
|
||||||
// token: card token
|
// token: card token
|
||||||
// ]
|
// ]
|
||||||
setBitpayDebitCards(network: string, email: string, cards: any): Promise<void> {
|
setBitpayDebitCards(network: string, email: string, cards: any): Promise<void> {
|
||||||
return this.getBitpayAccounts(network).then(allAccounts => {
|
return this.getBitpayAccounts(network)
|
||||||
allAccounts = allAccounts || {};
|
.then(allAccounts => {
|
||||||
if (!allAccounts[email]) throw new Error('Cannot set cards for unknown account ' + email);
|
allAccounts = allAccounts || {};
|
||||||
allAccounts[email].cards = cards;
|
if (!allAccounts[email]) throw new Error('Cannot set cards for unknown account ' + email);
|
||||||
return this.storage.set(Keys.BITPAY_ACCOUNTS_V2(network), allAccounts);
|
allAccounts[email].cards = cards;
|
||||||
});
|
return this.storage.set(Keys.BITPAY_ACCOUNTS_V2(network), allAccounts);
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// cards: [
|
// cards: [
|
||||||
|
@ -410,32 +417,34 @@ export class PersistenceProvider {
|
||||||
// email: account email
|
// email: account email
|
||||||
// ]
|
// ]
|
||||||
getBitpayDebitCards(network: string): Promise<any[]> {
|
getBitpayDebitCards(network: string): Promise<any[]> {
|
||||||
return this.getBitpayAccounts(network).then(allAccounts => {
|
return this.getBitpayAccounts(network)
|
||||||
let allCards = [];
|
.then(allAccounts => {
|
||||||
_.each(allAccounts, (account, email) => {
|
let allCards = [];
|
||||||
if (account.cards) {
|
_.each(allAccounts, (account, email) => {
|
||||||
// Add account's email to each card
|
if (account.cards) {
|
||||||
var cards = _.clone(account.cards);
|
// Add account's email to each card
|
||||||
_.each(cards, function (x) {
|
var cards = _.clone(account.cards);
|
||||||
x.email = email;
|
_.each(cards, function (x) {
|
||||||
});
|
x.email = email;
|
||||||
|
});
|
||||||
|
|
||||||
allCards = allCards.concat(cards);
|
allCards = allCards.concat(cards);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
return allCards;
|
||||||
});
|
});
|
||||||
return allCards;
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
removeBitpayDebitCard(network: string, cardEid: string): Promise<void> {
|
removeBitpayDebitCard(network: string, cardEid: string): Promise<void> {
|
||||||
return this.getBitpayAccounts(network).then(allAccounts => {
|
return this.getBitpayAccounts(network)
|
||||||
_.each(allAccounts, function (account) {
|
.then(allAccounts => {
|
||||||
account.cards = _.reject(account.cards, {
|
return _.each(allAccounts, function (account) {
|
||||||
eid: cardEid
|
account.cards = _.reject(account.cards, {
|
||||||
|
eid: cardEid
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
}).then(allAccounts => {
|
||||||
|
return this.storage.set(Keys.BITPAY_ACCOUNTS_V2(network), allAccounts);
|
||||||
});
|
});
|
||||||
|
|
||||||
return this.storage.set(Keys.BITPAY_ACCOUNTS_V2(network), allAccounts);
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,7 @@ export class LocalStorage implements IStorage {
|
||||||
}
|
}
|
||||||
|
|
||||||
set(k: string, v: any): Promise<void> {
|
set(k: string, v: any): Promise<void> {
|
||||||
return new Promise((resolve) => {
|
return Promise.resolve().then(() => {
|
||||||
if (_.isObject(v)) {
|
if (_.isObject(v)) {
|
||||||
v = JSON.stringify(v);
|
v = JSON.stringify(v);
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,6 @@ export class LocalStorage implements IStorage {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.ls.setItem(k, v);
|
this.ls.setItem(k, v);
|
||||||
resolve();
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,17 @@
|
||||||
import { IStorage, KeyAlreadyExistsError } from './istorage';
|
import { IStorage, KeyAlreadyExistsError } from './istorage';
|
||||||
|
import { PlatformProvider } from '../../platform/platform';
|
||||||
|
import { Logger } from '@nsalaun/ng-logger';
|
||||||
|
|
||||||
export class RamStorage implements IStorage {
|
export class RamStorage implements IStorage {
|
||||||
hash = {};
|
hash = {};
|
||||||
|
|
||||||
|
constructor(private platform: PlatformProvider, private log: Logger) { }
|
||||||
|
|
||||||
get(k: string): Promise<any> {
|
get(k: string): Promise<any> {
|
||||||
return Promise.resolve(this.hash[k]);
|
return Promise.resolve(this.hash[k]);
|
||||||
};
|
};
|
||||||
set(k: string, v: any): Promise<void> {
|
set(k: string, v: any): Promise<void> {
|
||||||
return Promise.resolve().then(() => this.hash[k] = v);
|
return Promise.resolve().then(() => { this.hash[k] = v });
|
||||||
};
|
};
|
||||||
remove(k: string): Promise<void> {
|
remove(k: string): Promise<void> {
|
||||||
return Promise.resolve().then(() => { delete this.hash[k]; });
|
return Promise.resolve().then(() => { delete this.hash[k]; });
|
||||||
|
|
Loading…
Reference in New Issue