test LocalStorage implementation

This commit is contained in:
Ivan Socolsky 2017-08-11 10:43:37 -03:00
parent 13586f60f8
commit e4a234f81c
No known key found for this signature in database
GPG Key ID: FAECE6A05FAA4F56
6 changed files with 81 additions and 60 deletions

View File

@ -14,12 +14,12 @@
"extract": "ngx-translate-extract --input ./src --output ./src/assets/i18n/app.pot --clean --sort --format pot"
},
"dependencies": {
"@angular/common": "4.1.3",
"@angular/core": "4.1.3",
"@angular/forms": "4.1.3",
"@angular/http": "4.1.3",
"@angular/platform-browser": "4.1.3",
"@angular/platform-browser-dynamic": "4.1.3",
"@angular/common": "4.2.3",
"@angular/core": "4.2.3",
"@angular/forms": "4.2.3",
"@angular/http": "4.2.3",
"@angular/platform-browser": "4.2.3",
"@angular/platform-browser-dynamic": "4.2.3",
"@angular/tsc-wrapped": "^4.3.2",
"@biesbjerg/ngx-translate-po-http-loader": "^1.0.1",
"@ionic-native/core": "3.12.1",
@ -38,9 +38,9 @@
"zone.js": "0.8.12"
},
"devDependencies": {
"@angular/cli": "^1.2.5",
"@angular/compiler": "^4.3.1",
"@angular/compiler-cli": "^4.3.1",
"@angular/cli": "^1.2.7",
"@angular/compiler": "4.2.3",
"@angular/compiler-cli": "4.2.3",
"@ionic/app-scripts": "2.0.2",
"@ionic/cli-plugin-cordova": "1.5.0",
"@ionic/cli-plugin-ionic-angular": "1.4.0",
@ -50,7 +50,7 @@
"@types/node": "^8.0.19",
"codecov": "^2.2.0",
"@biesbjerg/ngx-translate-extract": "^2.3.2",
"ionic": "3.6.0",
"ionic": "3.7.0",
"pre-commit": "^1.2.2",
"jasmine-core": "^2.6.4",
"jasmine-spec-reporter": "^4.1.1",

View File

@ -2,7 +2,7 @@ import { NgModule, ErrorHandler } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
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 { 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 { 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 { PlatformProvider } from '../providers/platform/platform';
export function createTranslateLoader(http: Http) {
return new TranslatePoHttpLoader(http, './assets/i18n/', '.po');
return new TranslatePoHttpLoader(http, './assets/i18n/', '.po');
}
@NgModule({
@ -70,7 +70,7 @@ export function createTranslateLoader(http: Http) {
SplashScreen,
{ provide: ErrorHandler, useClass: IonicErrorHandler },
WalletProvider,
PersistenceProvider,
{ provide: PersistenceProvider, useFactory: persistenceProviderFactory, deps: [PlatformProvider, Logger], multi: true },
AppProvider,
PlatformProvider
]

View File

@ -2,15 +2,19 @@ import { TestBed, inject } from '@angular/core/testing';
import { PersistenceProvider } from './persistence';
import { IStorage, ISTORAGE, KeyAlreadyExistsError } from './storage/istorage';
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', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
PersistenceProvider,
{ provide: ISTORAGE, useClass: RamStorage },
{ provide: Logger },
{ provide: Logger, useValue: new Logger(LoggerLevel.DEBUG) },
{ provide: PlatformProvider },
{ provide: ISTORAGE, useClass: RamStorage, deps: [PlatformProvider, Logger] },
]
});
});
@ -22,20 +26,25 @@ describe('Storage Service', () => {
}));
it('should correctly perform a profile roundtrip', () => {
let p = { name: 'My profile' };
service.storeNewProfile(p).then(() => {
service.getProfile().then((profile) => {
service.storeNewProfile(p)
.catch((err) => expect(err).toBeNull)
.then(() => {
return service.getProfile();
})
.then((profile) => {
expect(typeof profile).toEqual('object');
expect(profile.name).toEqual('My profile');
});
});
});
it('should fail to create a profile when one already exists', () => {
let p = { name: 'My profile' };
service.storeNewProfile(p).then(() => {
service.storeNewProfile(p).catch((err) => {
service.storeNewProfile(p)
.then(() => {
return service.storeNewProfile(p);
}).catch((err) => {
expect(err.message).toEqual('Key already exists');
});
});
});
});
});
});

View File

@ -1,9 +1,13 @@
import { Injectable } from '@angular/core';
import { InjectionToken, Inject } from '@angular/core';
import { IStorage, ISTORAGE } from './storage/istorage';
import { Logger } from '@nsalaun/ng-logger';
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 = {
ADDRESS_BOOK: network => 'addressbook-' + network,
AGREE_DISCLAIMER: 'agreeDisclaimer',
@ -33,10 +37,15 @@ const Keys = {
TX_HISTORY: walletId => 'txsHistory-' + walletId,
};
export let persistenceProviderFactory = (platform: PlatformProvider, log: Logger) => {
let storage = new RamStorage(platform, log);
return new PersistenceProvider(storage, log);
};
@Injectable()
export class PersistenceProvider {
constructor( @Inject(ISTORAGE) public storage: IStorage, private log: Logger) {
}
};
storeNewProfile(profile): Promise<void> {
return this.storage.create(Keys.PROFILE, profile);
@ -305,11 +314,8 @@ export class PersistenceProvider {
removeAllWalletData(walletId: string): Promise<void> {
return this.clearLastAddress(walletId)
.then(() => {
return this.removeTxHistory(walletId);
}).then(() => {
return this.clearBackupFlag(walletId);
});
.then(() => { return this.removeTxHistory(walletId); })
.then(() => { return this.clearBackupFlag(walletId); });
};
setAmazonGiftCards(network: string, gcs: any): Promise<void> {
@ -394,12 +400,13 @@ export class PersistenceProvider {
// token: card token
// ]
setBitpayDebitCards(network: string, email: string, cards: any): Promise<void> {
return this.getBitpayAccounts(network).then(allAccounts => {
allAccounts = allAccounts || {};
if (!allAccounts[email]) throw new Error('Cannot set cards for unknown account ' + email);
allAccounts[email].cards = cards;
return this.storage.set(Keys.BITPAY_ACCOUNTS_V2(network), allAccounts);
});
return this.getBitpayAccounts(network)
.then(allAccounts => {
allAccounts = allAccounts || {};
if (!allAccounts[email]) throw new Error('Cannot set cards for unknown account ' + email);
allAccounts[email].cards = cards;
return this.storage.set(Keys.BITPAY_ACCOUNTS_V2(network), allAccounts);
});
};
// cards: [
@ -410,32 +417,34 @@ export class PersistenceProvider {
// email: account email
// ]
getBitpayDebitCards(network: string): Promise<any[]> {
return this.getBitpayAccounts(network).then(allAccounts => {
let allCards = [];
_.each(allAccounts, (account, email) => {
if (account.cards) {
// Add account's email to each card
var cards = _.clone(account.cards);
_.each(cards, function (x) {
x.email = email;
});
return this.getBitpayAccounts(network)
.then(allAccounts => {
let allCards = [];
_.each(allAccounts, (account, email) => {
if (account.cards) {
// Add account's email to each card
var cards = _.clone(account.cards);
_.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> {
return this.getBitpayAccounts(network).then(allAccounts => {
_.each(allAccounts, function (account) {
account.cards = _.reject(account.cards, {
eid: cardEid
return this.getBitpayAccounts(network)
.then(allAccounts => {
return _.each(allAccounts, function (account) {
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);
});
};
}

View File

@ -28,7 +28,7 @@ export class LocalStorage implements IStorage {
}
set(k: string, v: any): Promise<void> {
return new Promise((resolve) => {
return Promise.resolve().then(() => {
if (_.isObject(v)) {
v = JSON.stringify(v);
}
@ -37,7 +37,6 @@ export class LocalStorage implements IStorage {
}
this.ls.setItem(k, v);
resolve();
});
}

View File

@ -1,13 +1,17 @@
import { IStorage, KeyAlreadyExistsError } from './istorage';
import { PlatformProvider } from '../../platform/platform';
import { Logger } from '@nsalaun/ng-logger';
export class RamStorage implements IStorage {
hash = {};
constructor(private platform: PlatformProvider, private log: Logger) { }
get(k: string): Promise<any> {
return Promise.resolve(this.hash[k]);
};
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> {
return Promise.resolve().then(() => { delete this.hash[k]; });