Skip to content

Commit 585b42c

Browse files
author
fernandocode
committed
Adicionado teste para veririfcar se a instancia da aplicação só retorna após o fim da execução do migration.
1 parent 472bb30 commit 585b42c

File tree

8 files changed

+183
-9
lines changed

8 files changed

+183
-9
lines changed

projects/ionic-database-builder/src/lib/defaults/database-settings-factory-default.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { Injector, Injectable } from '@angular/core';
33
import { DatabaseSettingsModel } from '../model/database-settings-model';
44
import { DatabaseSettingsFactoryContract } from '../utils';
55

6-
@Injectable()
76
export class DatabaseSettingsFactoryDefault extends DatabaseSettingsFactoryContract {
87

98
private _model: DatabaseSettingsModel;

projects/ionic-database-builder/src/lib/services/database-migration-contract.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,15 @@ import { Version } from '../model/version-model';
55

66
export abstract class DatabaseMigrationContract {
77

8+
public onStart() {
9+
}
10+
11+
public onFinish() {
12+
}
13+
14+
public onProgress() {
15+
}
16+
817
public abstract to(
918
version: Version,
1019
database: DatabaseObject,

projects/ionic-database-builder/src/lib/services/database-migration.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ export class DatabaseMigration extends DatabaseMigrationBase implements Database
4848

4949
let observablesNested: Array<Observable<any>> = [];
5050
if (this._databaseMigrationContract) {
51+
this._databaseMigrationContract.onStart();
5152
const toObservables = this._databaseMigrationContract.to(
5253
version,
5354
database,
@@ -63,13 +64,18 @@ export class DatabaseMigration extends DatabaseMigrationBase implements Database
6364
observablesNested.push(this.reset(database));
6465
}
6566

67+
if (observablesNested.length > 0) {
68+
this._databaseMigrationContract.onProgress();
69+
}
6670
this.callNested(observablesNested, 0)
6771
.subscribe((result: boolean) => {
6872
observer.next(result);
6973
observer.complete();
7074
}, (error: any) => {
7175
observer.error(error);
7276
observer.complete();
77+
}, () => {
78+
this._databaseMigrationContract.onFinish();
7379
});
7480
});
7581
}

src/app/app.component.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,4 @@
11
import { Component } from '@angular/core';
2-
import { Uf } from './database/models/uf';
3-
import { Regiao } from './database/models/regiao';
4-
import { SubRegiao } from './database/models/sub-regiao';
5-
import { Cidade } from './database/models/cidade';
6-
import { Classificacao } from './database/models/classificacao';
7-
import { Cliente } from './database/models/cliente';
82
import { Database } from 'ionic-database-builder';
93

104
@Component({

src/app/database/provider/database-migration-service.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ export class DatabaseMigrationService extends DatabaseMigrationContract {
1515
const observablesNested: Observable<any>[] = [];
1616

1717
if (!(window as any)._resetCalled) {
18-
resettable.reset(database);
18+
// resettable.reset(database).subscribe(sub => {}, err => console.error(err));
19+
observablesNested.push(resettable.reset(database));
20+
console.log('start resetable');
1921
(window as any)._resetCalled = true;
2022
}
2123

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import { GetMapper, DatabaseObject } from 'database-builder';
2+
import { Injectable, EventEmitter } from '@angular/core';
3+
import { Observable } from 'rxjs';
4+
import { DatabaseMigrationContract, DatabaseResettableContract, Version } from 'ionic-database-builder';
5+
6+
export enum MigrationStatus {
7+
Started,
8+
Finished
9+
}
10+
11+
@Injectable()
12+
export class MigrationFlowService {
13+
14+
public $statusEvent: EventEmitter<MigrationStatus> = new EventEmitter();
15+
16+
private _status: MigrationStatus;
17+
18+
public get status(): MigrationStatus {
19+
return this._status;
20+
}
21+
22+
public set status(v: MigrationStatus) {
23+
// console.log(`update status: ${v === MigrationStatus.Started ? 'Started' : 'Finished'}`);
24+
this._status = v;
25+
this.$statusEvent.emit(v);
26+
}
27+
28+
}
29+
30+
@Injectable()
31+
export class DatabaseMigrationTestService extends DatabaseMigrationContract {
32+
33+
constructor(private flow: MigrationFlowService) {
34+
super();
35+
}
36+
37+
public onStart() {
38+
this.flow.status = MigrationStatus.Started;
39+
}
40+
41+
public onFinish() {
42+
this.flow.status = MigrationStatus.Finished;
43+
}
44+
45+
public to(
46+
version: Version,
47+
database: DatabaseObject,
48+
mappers: GetMapper,
49+
resettable: DatabaseResettableContract
50+
): Observable<any>[] {
51+
const observablesNested: Observable<any>[] = [];
52+
53+
if (!(window as any)._resetCalled) {
54+
observablesNested.push(resettable.reset(database));
55+
console.log('start resetable');
56+
(window as any)._resetCalled = true;
57+
}
58+
59+
return observablesNested;
60+
}
61+
}

src/app/migration-test.spec.ts

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import { Cidade } from './database/models/cidade';
2+
import { TestBed, async } from '@angular/core/testing';
3+
import { AppComponent } from './app.component';
4+
import { DatabaseSettingsFactory } from './database/factory/database-settings-factory';
5+
import { DatabaseMigrationService } from './database/provider/database-migration-service';
6+
import { TableMapper } from './database/mapper/table-mapper';
7+
import { IonicDatabaseBuilderModule, Database, WebSqlDatabaseService } from 'ionic-database-builder';
8+
import { Uf } from './database/models/uf';
9+
import { Regiao } from './database/models/regiao';
10+
import { SubRegiao } from './database/models/sub-regiao';
11+
import { Classificacao } from './database/models/classificacao';
12+
import { Cliente } from './database/models/cliente';
13+
import { PlatformLoadDefault } from 'projects/ionic-database-builder/src/lib/utils/platform-load-default';
14+
import { MigrationFlowService, DatabaseMigrationTestService, MigrationStatus } from './database/provider/database-migration-test-service';
15+
16+
describe('Migration test', () => {
17+
beforeEach(async(() => {
18+
TestBed.configureTestingModule({
19+
declarations: [
20+
AppComponent
21+
],
22+
imports: [
23+
IonicDatabaseBuilderModule.forRoot(
24+
DatabaseSettingsFactory,
25+
WebSqlDatabaseService,
26+
DatabaseMigrationTestService,
27+
PlatformLoadDefault,
28+
false,
29+
true,
30+
)
31+
],
32+
providers: [
33+
TableMapper,
34+
MigrationFlowService
35+
],
36+
});
37+
}));
38+
39+
const clienteToSave = {
40+
codeImport: 1,
41+
razaoSocial: void 0,
42+
apelido: 'Apelido',
43+
cidade: {
44+
codeImport: 2,
45+
nome: 'Cidade',
46+
uf: {
47+
codeImport: 'SC',
48+
nome: 'Santa Catarina'
49+
} as Uf,
50+
subRegiao: {
51+
codeImport: 4,
52+
nome: 'Sub Região',
53+
regiao: {
54+
codeImport: 5,
55+
nome: 'Região'
56+
} as Regiao
57+
} as SubRegiao,
58+
} as Cidade,
59+
classificacao: {
60+
codeImport: 3,
61+
descricao: 'Top'
62+
} as Classificacao,
63+
desativo: false
64+
} as Cliente;
65+
66+
it('Test mapper insert T', async () => {
67+
const migrationFlow: MigrationFlowService = TestBed.get(MigrationFlowService);
68+
69+
let wasStarted: boolean = false;
70+
migrationFlow.$statusEvent.subscribe((status: MigrationStatus) => {
71+
if (!wasStarted && status === MigrationStatus.Started) {
72+
wasStarted = true;
73+
}
74+
// console.log(`update status: ${status === MigrationStatus.Started ? 'Started' : 'Finished'}`);
75+
});
76+
77+
const database: Database = TestBed.get(Database);
78+
79+
expect(migrationFlow.status).toBeUndefined();
80+
const crud = await database.crud().toPromise();
81+
expect(migrationFlow.status).toEqual(MigrationStatus.Finished);
82+
expect(wasStarted).toEqual(true);
83+
84+
await crud.delete(Cliente).execute().toPromise();
85+
86+
const insert = crud.insert(Cliente, { modelToSave: clienteToSave });
87+
const result = insert.compile();
88+
expect(result[0].params.toString()).toEqual([
89+
clienteToSave.codeImport, clienteToSave.razaoSocial, clienteToSave.apelido,
90+
clienteToSave.desativo, clienteToSave.cidade.codeImport, clienteToSave.classificacao.codeImport
91+
].toString());
92+
expect(result[0].query).toEqual('INSERT INTO Cliente (codeImport, razaoSocial, apelido, desativo, cidade_codeImport, classificacao_codeImport) VALUES (?, ?, ?, ?, ?, ?)');
93+
94+
const insertResult = await insert.execute().toPromise();
95+
expect(insertResult[0].insertId).toBeGreaterThan(0);
96+
97+
const queryResultNull = await crud.query(Cliente)
98+
.where(where => where.isNull(x => x.razaoSocial))
99+
.toList().toPromise();
100+
101+
expect(queryResultNull.length).toEqual(1);
102+
});
103+
});

src/test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ getTestBed().initTestEnvironment(
1515
platformBrowserDynamicTesting()
1616
);
1717
// Then we find all the tests.
18-
// const context = require.context('./', true, /managed-transaction\.spec\.ts$/);
18+
// const context = require.context('./', true, /migration-test\.spec\.ts$/);
1919
const context = require.context('./', true, /\.spec\.ts$/);
2020
// And load the modules.
2121
context.keys().map(context);

0 commit comments

Comments
 (0)