Skip to content
Snippets Groups Projects
Commit 1e9df086 authored by Lucas Fernandes de Oliveira's avatar Lucas Fernandes de Oliveira
Browse files

Merge branch 'issue/79' into 'develop'

Issue #79: Fix tests, independent from variable create

See merge request !65
parents fa0142b6 d2ebcd0d
Branches
No related tags found
1 merge request!65Issue #79: Fix tests, independent from variable create
Pipeline #
...@@ -3,7 +3,5 @@ BLENDB_DB_NAME=blendb_fixture ...@@ -3,7 +3,5 @@ BLENDB_DB_NAME=blendb_fixture
BLENDB_DB_PASSWORD= BLENDB_DB_PASSWORD=
BLENDB_DB_HOST=postgres BLENDB_DB_HOST=postgres
BLENDB_DB_PORT=5432 BLENDB_DB_PORT=5432
BLENDB_ST_CREATE=true
BLENDB_ST_INSERT=true
BLENDB_ADAPTER=postgres BLENDB_ADAPTER=postgres
PORT=3000 PORT=3000
...@@ -3,7 +3,5 @@ BLENDB_DB_NAME=blendb-test ...@@ -3,7 +3,5 @@ BLENDB_DB_NAME=blendb-test
BLENDB_DB_PASSWORD=secret BLENDB_DB_PASSWORD=secret
BLENDB_DB_HOST=localhost BLENDB_DB_HOST=localhost
BLENDB_DB_PORT=5432 BLENDB_DB_PORT=5432
BLENDB_ST_CREATE=false
BLENDB_ST_INSERT=false
BLENDB_ADAPTER=postgres BLENDB_ADAPTER=postgres
PORT=3000 PORT=3000
...@@ -40,7 +40,7 @@ describe("postgres adapter", () => { ...@@ -40,7 +40,7 @@ describe("postgres adapter", () => {
config = ConfigParser.parse("config/test.yaml"); config = ConfigParser.parse("config/test.yaml");
if (config.adapter === "postgres") { if (config.adapter === "postgres") {
fixture = new FixPostgres(config.connection); fixture = new FixPostgres(config.connection);
fixture.load(config.loadViews, config.struct.create, (err) => { fixture.load(config.loadViews, (err) => {
if (err) { if (err) {
throw err; throw err;
} }
......
...@@ -39,7 +39,7 @@ describe("API collect controller", () => { ...@@ -39,7 +39,7 @@ describe("API collect controller", () => {
config = ConfigParser.parse("config/test.yaml"); config = ConfigParser.parse("config/test.yaml");
if (config.adapter === "postgres") { if (config.adapter === "postgres") {
fixture = new FixPostgres(config.connection); fixture = new FixPostgres(config.connection);
fixture.LoadSource(config.sources, config.struct.create, (err) => { fixture.loadSource(config.sources, (err) => {
if (err) { if (err) {
throw err; throw err;
} }
......
...@@ -77,15 +77,6 @@ interface BuildView { ...@@ -77,15 +77,6 @@ interface BuildView {
alias: string; alias: string;
} }
/** Information required to conduct fixture loading. */
export interface LoadStruct{
/** True if is required create structures in the database before loading. */
create: boolean;
/** True any fixture is loaded yet. */
insert: boolean;
}
/** Configuration file representation with objects, not strings. */
export interface ParsedConfig { export interface ParsedConfig {
/** What adapter is in use. */ /** What adapter is in use. */
adapter: string; adapter: string;
...@@ -101,9 +92,6 @@ export interface ParsedConfig { ...@@ -101,9 +92,6 @@ export interface ParsedConfig {
enumTypes: EnumType[]; enumTypes: EnumType[];
/** Set of all dimensions available. */ /** Set of all dimensions available. */
dimensions: Dimension[]; dimensions: Dimension[];
/** Fixture loading policy. */
struct: LoadStruct;
/** Fixture data configuration. */
loadViews: LoadView[]; loadViews: LoadView[];
/** SQL views build configuration. */ /** SQL views build configuration. */
buildViews: BuildView[]; buildViews: BuildView[];
...@@ -175,15 +163,6 @@ export class ConfigParser { ...@@ -175,15 +163,6 @@ export class ConfigParser {
host: process.env.BLENDB_DB_HOST, host: process.env.BLENDB_DB_HOST,
port: parseInt(process.env.BLENDB_DB_PORT, 10) port: parseInt(process.env.BLENDB_DB_PORT, 10)
}; };
const strCreate = process.env.BLENDB_ST_CREATE;
const strInsert = process.env.BLENDB_ST_INSERT;
let struct: LoadStruct = {
create: (strCreate) ? strCreate.toLowerCase() === "true" : false,
insert: (strInsert) ? strInsert.toLowerCase() === "true" : false
};
let metricsOpts = config.metrics; let metricsOpts = config.metrics;
let viewsOpts = config.views; let viewsOpts = config.views;
let dimensionsOpts = config.dimensions; let dimensionsOpts = config.dimensions;
...@@ -196,7 +175,6 @@ export class ConfigParser { ...@@ -196,7 +175,6 @@ export class ConfigParser {
metrics: [], metrics: [],
enumTypes: [], enumTypes: [],
dimensions: [], dimensions: [],
struct: struct,
loadViews: [], loadViews: [],
buildViews: [], buildViews: [],
sources: [] sources: []
......
...@@ -52,31 +52,23 @@ export class Fixture { ...@@ -52,31 +52,23 @@ export class Fixture {
this.database = config.database; this.database = config.database;
} }
public load(schemas: LoadView[], create: boolean, cb: (err: Error) => void): void { public load(schemas: LoadView[], cb: (err: Error) => void): void {
let client = new Client(this.config); let client = new Client(this.config);
/* /*
Loading data has 2 steps: Loading data has 2 steps:
1 - Create a table or truncate a existing one. 1 - Create a table or truncate a existing one.
Create or truncate dependes from a parameter in the configure
file, this parameter reaches this function as the create
parameter.
2 - Insert data. 2 - Insert data.
*/ */
let init: string[] = [];
let data: string[] = []; let data: string[] = [];
for (let i = 0; i < schemas.length; ++i) { for (let i = 0; i < schemas.length; ++i) {
let table: TransSet = this.createTransSet(schemas[i].view, schemas[i].data, create); data = data.concat(this.extractDataView(schemas[i].view, schemas[i].data));
init.push(table.init);
data = data.concat(table.data);
} }
client.connect((error) => { client.connect((error) => {
if (error) { if (error) {
cb(error); cb(error);
return; return;
} }
/* /*
Tables must be creates before data could be inserted, so the Tables must be creates before data could be inserted, so the
queries that create and insert are splited in 2 arrays. queries that create and insert are splited in 2 arrays.
...@@ -84,8 +76,16 @@ export class Fixture { ...@@ -84,8 +76,16 @@ export class Fixture {
is used. Inside series each query is executed, using each; is used. Inside series each query is executed, using each;
*/ */
series([(callback: (err: Error) => void) => { series([(callback: (err: Error) => void) => {
each(init, (query, cback) => { each(schemas, (query, cback) => {
return client.query(query, [], (err: Error) => cback(err)); client.query(this.createTransSet(query.view, query.data, true), [], (errCreate: Error) => {
if (errCreate) {
let regex = new RegExp(/relation \".*\" already exists/);
if (regex.test(errCreate.message.toLowerCase())){
return client.query(this.createTransSet(query.view, query.data, false), [], (errTrunc: Error) => cback(errTrunc));
}
}
return cback(errCreate);
});
}, (errQuery: Error) => callback(errQuery)); }, (errQuery: Error) => callback(errQuery));
}, (callback: (err: Error) => void) => { }, (callback: (err: Error) => void) => {
each(data, (query, cback) => { each(data, (query, cback) => {
...@@ -119,61 +119,66 @@ export class Fixture { ...@@ -119,61 +119,66 @@ export class Fixture {
} }
} }
private createTransSet(view: View, filePath: string, create: boolean): TransSet { private extractDataView(view: View, filePath: string): string[]{
let props = []; let name = "view_" + view.id;
let data: string[] = [];
let rows = JSON.parse(fs.readFileSync(filePath, {encoding : "utf8"}));
for (let i = 0; i < rows.length; ++i) {
let values = [];
let keys = [];
for (let key of Object.keys(rows[i])) {
keys.push("\"" + key + "\"");
values.push("'" + rows[i][key] + "'");
}
data.push("INSERT INTO " + name +
"(" + keys.join(", ") + ") " +
"VALUES (" + values.join(", ") + ")");
}
return data;
}
private createTransSet(view: View, filePath: string, create: boolean): string {
let name = "view_" + view.id;
let init: string = "";
let props = [];
for (let i = 0; i < view.metrics.length; ++i) { for (let i = 0; i < view.metrics.length; ++i) {
let met = view.metrics[i]; let met = view.metrics[i];
props.push("\"" + met.name + "\" " + this.typeConvertion(met.dataType)); props.push("\"" + met.name + "\" " + this.typeConvertion(met.dataType));
} }
for (let i = 0; i < view.dimensions.length; ++i) { for (let i = 0; i < view.dimensions.length; ++i) {
let dim = view.dimensions[i]; let dim = view.dimensions[i];
props.push("\"" + dim.name + "\" " + this.typeConvertion(dim.dataType)); props.push("\"" + dim.name + "\" " + this.typeConvertion(dim.dataType));
} }
let name = "view_" + view.id;
let transaction: TransSet = {init: "", data: []};
if (create) { if (create) {
transaction.init = "CREATE TABLE " + name + "(" + props.join(", ") + ")"; init = "CREATE TABLE " + name + "(" + props.join(", ") + ")";
} }
else { else {
transaction.init = "TRUNCATE TABLE " + name; init = "TRUNCATE TABLE " + name;
}
transaction.data = [];
let rows = JSON.parse(fs.readFileSync(filePath, {encoding : "utf8"}));
for (let i = 0; i < rows.length; ++i) {
let values = [];
let keys = [];
for (let key of Object.keys(rows[i])) {
keys.push("\"" + key + "\"");
values.push("'" + rows[i][key] + "'");
} }
transaction.data.push("INSERT INTO " + name + return init;
"(" + keys.join(", ") + ") " +
"VALUES (" + values.join(", ") + ")");
}
return transaction;
} }
public LoadSource(source: Source[], create: boolean , cb: (err: Error) => void): void { public loadSource(source: Source[] , cb: (err: Error) => void): void {
let client = new Client(this.config); let client = new Client(this.config);
let query: string[] = [];
for (let i = 0; i < source.length; i++ ){
query[i] = this.ExtractData(source[i], create);
}
client.connect((error) => { client.connect((error) => {
if (error) { if (error) {
cb(error); cb(error);
return; return;
} }
series([(callback: (err: Error) => void) => { series([(callback: (err: Error) => void) => {
each(query, (insere, cback) => { each(source, (insere, cback) => {
return client.query(insere , [], (err: Error) => cback(err)); client.query ( this.extractData(insere, true), [], (errCreate: Error) => {
if (errCreate) {
let regex = new RegExp(/relation \".*\" already exists/);
if (regex.test(errCreate.message.toLowerCase())){
return client.query ( this.extractData(insere, false), [], (errTrunc: Error) => cback(errTrunc));
}
}
return cback(errCreate);
});
}, (errQuery: Error) => callback(errQuery)); }, (errQuery: Error) => callback(errQuery));
}], (errQuery: Error) => { }], (errQuery: Error) => {
if (errQuery) { if (errQuery) {
...@@ -184,10 +189,10 @@ export class Fixture { ...@@ -184,10 +189,10 @@ export class Fixture {
cb(err); cb(err);
}); });
}); });
});
});
} }
private ExtractData(data: Source , create: boolean): string{ private extractData(data: Source, create: boolean): string{
let name: string; let name: string;
let type: DataType[]; let type: DataType[];
let fields: string[]; let fields: string[];
...@@ -208,6 +213,7 @@ export class Fixture { ...@@ -208,6 +213,7 @@ export class Fixture {
else{ else{
consult = "TRUNCATE TABLE " + name + ";"; consult = "TRUNCATE TABLE " + name + ";";
} }
return consult; return consult;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment