diff --git a/CHANGELOG.md b/CHANGELOG.md index 32709f64ab7a2ccce68d719c456c9625704fcf74..3cf888f46156182d9bdc5eb181c6580964353e4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## 0.0.10 - 16-04-2019 +### Added +- TestHandler to test form and inputs #18 (Horstmann) +### Changed +- controller form tests to use testHandler #18 (Horstmann) +- controller form to improve code coverage +- dbHandler tests to use testHandler #18 (Horstmann) +- ValidationType to has as arguments an array of strings +- ValidationHandler to receive a string as size instead number as validation arguments +- ValidationHandler to cast size to number +- ValidationHandler tests to use string instead of number as validation arguments ## 0.0.9 - 10-04-2019 ### Added @@ -17,7 +28,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - main.ts to include dbHandler Middleware and remove dummie class ### Added -- Create dbHandler Middleware to be abble to access by routes #15 (Horstmann) +- Create dbHandler Middleware to be able to access by routes #15 (Horstmann) ## 0.0.6 - 01-04-2019 ### Changed - Input class to match with database model (Add id and description) (Horstmann) diff --git a/package.json b/package.json index 023c0a04790c150521585705ec4cb32ff7d417f0..7335b81d7c631251ebe6b943c103631bdfecf1e9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "form-creator-api", - "version": "0.0.9", + "version": "0.0.10", "description": "RESTful API used to manage and answer forms.", "main": "index.js", "scripts": { diff --git a/src/api/controllers/form.spec.ts b/src/api/controllers/form.spec.ts index 7c5bc0763047099473c0ba9f6bc12297aafe4051..3cffe5a76fa6958b57081cc35437af4ace499a86 100644 --- a/src/api/controllers/form.spec.ts +++ b/src/api/controllers/form.spec.ts @@ -22,7 +22,10 @@ import * as request from "supertest"; import { expect } from "chai"; import * as server from "../../main"; - import { InputType, ValidationType } from "../../utils/enumHandler"; + import { EnumHandler,InputType, ValidationType } from "../../utils/enumHandler"; + import { TestHandler } from "../../utils/testHandler"; + import { Form } from "../../core/form"; + import { Input, Validation } from "../../core/input"; describe("API data controller", () => { @@ -57,41 +60,22 @@ .expect(200) .expect((res: any) => { expect(res.body).to.be.an("object"); - expect(res.body.id).to.be.equal(1); - expect(res.body.title).to.be.equal("Form Title 1"); - expect(res.body.description).to.be.equal("Form Description 1"); - expect(res.body.inputs.length).to.be.equal(3); - expect(res.body.inputs[0].id).to.be.equal(1); - expect(res.body.inputs[0].placement).to.be.equal(0); - expect(res.body.inputs[0].description).to.be.equal("Description Question 1 Form 1"); - expect(res.body.inputs[0].question).to.be.equal("Question 1 Form 1"); - expect(res.body.inputs[0].type).to.be.equal(InputType.TEXT); - expect(res.body.inputs[0].validation.length).to.be.equal(0); + const inputs: Input[] = []; + for( let tmpInput of res.body.inputs ){ + let validation: Validation[] = []; + for( let tmpValidation of tmpInput.validation ){ + validation.push({type: tmpValidation.type, arguments: tmpValidation.arguments}) + } + inputs.push( new Input (tmpInput.placement, tmpInput.description, tmpInput.question, tmpInput.type, validation, tmpInput.id)); + } + const form: Form = new Form(res.body.title, res.body.description, inputs, res.body.id); - expect(res.body.inputs[1].id).to.be.equal(3); - expect(res.body.inputs[1].placement).to.be.equal(1); - expect(res.body.inputs[1].description).to.be.equal("Description Question 2 Form 1"); - expect(res.body.inputs[1].question).to.be.equal("Question 2 Form 1"); - expect(res.body.inputs[1].type).to.be.equal(InputType.TEXT); - expect(res.body.inputs[1].validation.length).to.be.equal(2); - expect(res.body.inputs[1].validation[0].type).to.be.equal(ValidationType.MAXCHAR); - expect(res.body.inputs[1].validation[0].arguments.length).to.be.equal(1); - expect(res.body.inputs[1].validation[0].arguments[0]).to.be.equal("10"); - expect(res.body.inputs[1].validation[1].type).to.be.equal(ValidationType.MINCHAR); - expect(res.body.inputs[1].validation[1].arguments.length).to.be.equal(1); - expect(res.body.inputs[1].validation[1].arguments[0]).to.be.equal("2"); + TestHandler.testForm(form, new Form("Form Title 1", "Form Description 1" + ,[ new Input (0, "Description Question 1 Form 1", "Question 1 Form 1", InputType.TEXT, [], 1) + ,new Input (1, "Description Question 2 Form 1", "Question 2 Form 1", InputType.TEXT, [{type: ValidationType.MAXCHAR, arguments: ["10"]}, {type: ValidationType.MINCHAR, arguments: ["2"]}], 3) + ,new Input (2, "Description Question 3 Form 1", "Question 3 Form 1", InputType.TEXT, [{type: ValidationType.REGEX, arguments: ["\\d{5}-\\d{3}"]}, {type: ValidationType.MANDATORY, arguments: []}], 2)] + , 1)); - expect(res.body.inputs[2].id).to.be.equal(2); - expect(res.body.inputs[2].placement).to.be.equal(2); - expect(res.body.inputs[2].description).to.be.equal("Description Question 3 Form 1"); - expect(res.body.inputs[2].question).to.be.equal("Question 3 Form 1"); - expect(res.body.inputs[2].type).to.be.equal(InputType.TEXT); - expect(res.body.inputs[2].validation.length).to.be.equal(2); - expect(res.body.inputs[2].validation[0].type).to.be.equal(ValidationType.REGEX); - expect(res.body.inputs[2].validation[0].arguments.length).to.be.equal(1); - expect(res.body.inputs[2].validation[0].arguments[0]).to.be.equal("\\d{5}-\\d{3}"); - expect(res.body.inputs[2].validation[1].type).to.be.equal(ValidationType.MANDATORY); - expect(res.body.inputs[2].validation[1].arguments.length).to.be.equal(0); }) .end(done); }); diff --git a/src/api/controllers/form.ts b/src/api/controllers/form.ts index 4117dc6c6914b4bf22271cfde571da32ffdaddbf..21f51342e36fdd35dfe2f277741078f86fcd5f4c 100644 --- a/src/api/controllers/form.ts +++ b/src/api/controllers/form.ts @@ -34,9 +34,7 @@ export class FormCtrl { error: err }); return; - } - - if (forms) { + }else{ const mappedForms = forms.map(form => ({ id: form.id, title: form.title, @@ -45,6 +43,7 @@ export class FormCtrl { res.json(mappedForms); return; } + }); } @@ -57,8 +56,7 @@ export class FormCtrl { error: err }); return; - } - if (form) { + }else{ res.json(form); return; } diff --git a/src/core/input.ts b/src/core/input.ts index ec01a8b62aa77ab9de92f5a118060f5859789996..7da8fdc0fe3a558e3e5fc661fadb6313200175eb 100644 --- a/src/core/input.ts +++ b/src/core/input.ts @@ -27,7 +27,7 @@ export interface Validation { /** Enum Validation Type to identify the type of current validation */ type: ValidationType; /** Array of any, to store informations about validadtion */ - arguments: any[]; + arguments: string[]; } /** diff --git a/src/utils/dbHandler.spec.ts b/src/utils/dbHandler.spec.ts index 588589aa38458656f8042399298f1081ac3ab5ff..be064cef6de8b0bc429fc5a8def7e3f2a2d62a60 100644 --- a/src/utils/dbHandler.spec.ts +++ b/src/utils/dbHandler.spec.ts @@ -26,6 +26,7 @@ import { Input, Validation } from "../core/input"; import { configs } from "./config"; import { DbHandler } from "./dbHandler"; import { InputType, ValidationType } from "./enumHandler"; +import { TestHandler } from "./testHandler"; describe("Database Handler", () => { const dbhandler = new DbHandler(configs.poolconfig); @@ -316,41 +317,12 @@ describe("Read and Write on Database", () => { it("should read an existent form", (done) => { dbhandler.readForm(1, (err: Error, form: Form) => { expect(err).to.be.a("null"); - expect(form.id).to.be.equal(1); - expect(form.title).to.be.equal("Form Title 1"); - expect(form.description).to.be.equal("Form Description 1"); - expect(form.inputs.length).to.be.equal(3); - expect(form.inputs[0].id).to.be.equal(1); - expect(form.inputs[0].placement).to.be.equal(0); - expect(form.inputs[0].description).to.be.equal("Description Question 1 Form 1"); - expect(form.inputs[0].question).to.be.equal("Question 1 Form 1"); - expect(form.inputs[0].type).to.be.equal(InputType.TEXT); - expect(form.inputs[0].validation.length).to.be.equal(0); - - expect(form.inputs[1].id).to.be.equal(3); - expect(form.inputs[1].placement).to.be.equal(1); - expect(form.inputs[1].description).to.be.equal("Description Question 2 Form 1"); - expect(form.inputs[1].question).to.be.equal("Question 2 Form 1"); - expect(form.inputs[1].type).to.be.equal(InputType.TEXT); - expect(form.inputs[1].validation.length).to.be.equal(2); - expect(form.inputs[1].validation[0].type).to.be.equal(ValidationType.MAXCHAR); - expect(form.inputs[1].validation[0].arguments.length).to.be.equal(1); - expect(form.inputs[1].validation[0].arguments[0]).to.be.equal("10"); - expect(form.inputs[1].validation[1].type).to.be.equal(ValidationType.MINCHAR); - expect(form.inputs[1].validation[1].arguments.length).to.be.equal(1); - expect(form.inputs[1].validation[1].arguments[0]).to.be.equal("2"); - - expect(form.inputs[2].id).to.be.equal(2); - expect(form.inputs[2].placement).to.be.equal(2); - expect(form.inputs[2].description).to.be.equal("Description Question 3 Form 1"); - expect(form.inputs[2].question).to.be.equal("Question 3 Form 1"); - expect(form.inputs[2].type).to.be.equal(InputType.TEXT); - expect(form.inputs[2].validation.length).to.be.equal(2); - expect(form.inputs[2].validation[0].type).to.be.equal(ValidationType.REGEX); - expect(form.inputs[2].validation[0].arguments.length).to.be.equal(1); - expect(form.inputs[2].validation[0].arguments[0]).to.be.equal("\\d{5}-\\d{3}"); - expect(form.inputs[2].validation[1].type).to.be.equal(ValidationType.MANDATORY); - expect(form.inputs[2].validation[1].arguments.length).to.be.equal(0); + + TestHandler.testForm(form, new Form("Form Title 1", "Form Description 1" + , [ new Input (0, "Description Question 1 Form 1", "Question 1 Form 1", InputType.TEXT, [], 1) + , new Input (1, "Description Question 2 Form 1", "Question 2 Form 1", InputType.TEXT, [{type: ValidationType.MAXCHAR, arguments: ["10"]}, {type: ValidationType.MINCHAR, arguments: ["2"]}], 3) + , new Input (2, "Description Question 3 Form 1", "Question 3 Form 1", InputType.TEXT, [{type: ValidationType.REGEX, arguments: ["\\d{5}-\\d{3}"]}, {type: ValidationType.MANDATORY, arguments: []}], 2)] + , 1)); done(); }); @@ -372,7 +344,7 @@ describe("Read and Write on Database", () => { let input = new Input (1, "Description 1", "Question 1", InputType.TEXT, validation); const inputs: Input[] = []; inputs.push(input); - validation = [{type: ValidationType.MINCHAR, arguments: [5]}]; + validation = [{type: ValidationType.MINCHAR, arguments: ["5"]}]; input = new Input (2, "Description 2", "Question 2", InputType.TEXT, validation); inputs.push(input); diff --git a/src/utils/dbHandler.ts b/src/utils/dbHandler.ts index 9451b852f7e167d1cdb345953f6f90fb92b686d2..7fec6d0e1971e1e9d1c3f6caf494c57d9b2a17af 100644 --- a/src/utils/dbHandler.ts +++ b/src/utils/dbHandler.ts @@ -207,7 +207,7 @@ export class DbHandler { return; } - const sortedInputs: Input[] = this.sortByPlacement(inputs); + const sortedInputs: Input[] = DbHandler.sortByPlacement(inputs); cb(errors, sortedInputs); }); @@ -256,7 +256,7 @@ export class DbHandler { this.executeQuery(query, (error: Error, result?: QueryResult) => { - const sortedResult: any[] = this.sortByPlacement(result.rows); + const sortedResult: any[] = DbHandler.sortByPlacement(result.rows); const argumentArrayTmp = []; for (const innerResult of sortedResult){ argumentArrayTmp.push(innerResult["argument"]); @@ -273,7 +273,7 @@ export class DbHandler { * @param array - Array with objects that have placement field * @returns - A sorted array by placement */ - private sortByPlacement(array: any[]): any[] { + private static sortByPlacement(array: any[]): any[] { const sortedArray: any[] = array.sort((obj1, obj2) => { if (obj1["placement"] > obj2["placement"]) { @@ -434,7 +434,7 @@ export class DbHandler { * @param cb - Callback function. * @param cb.err - Error information when the method fails. */ - private writeValidationArgumentWithInputIdAndPlacement(validationId: number, argument: any, placement: number, cb: (err: Error) => void){ + private writeValidationArgumentWithInputIdAndPlacement(validationId: number, argument: string, placement: number, cb: (err: Error) => void){ const query: string = "INSERT INTO input_validation_argument \ ( id_input_validation, argument, placement )\ VALUES ( \'" + validationId + "\', \'" + diff --git a/src/utils/testHandler.spec.ts b/src/utils/testHandler.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..e70e86c32c425444b514a039a87452919a093d21 --- /dev/null +++ b/src/utils/testHandler.spec.ts @@ -0,0 +1,20 @@ +/* + * form-creator-api. RESTful API to manage and answer forms. + * Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre + * Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR + * + * This file is part of form-creator-api. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ diff --git a/src/utils/testHandler.ts b/src/utils/testHandler.ts new file mode 100644 index 0000000000000000000000000000000000000000..175c3ccfb49ad6f12b39a8f4838416ee0096f694 --- /dev/null +++ b/src/utils/testHandler.ts @@ -0,0 +1,72 @@ +/* + * form-creator-api. RESTful API to manage and answer forms. + * Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre + * Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR + * + * This file is part of form-creator-api. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + + import { expect } from "chai"; + import { Form } from "../core/form"; + import { Input, Validation } from "../core/input"; + import { EnumHandler, InputType, ValidationType } from "./enumHandler"; + + /** + * Enum's handler. Manage parse through the project. + */ + export class TestHandler { + + /** + * Verify if two forms are semantically equal; + * @param form - Form that should be tested + * @param stub - A model form that first param itend to be. + * @returns - True if forms are equal else false + */ + public static testForm(form: Form, stub: Form){ + expect(form.id).to.be.equal(stub.id); + expect(form.title).to.be.equal(stub.title); + expect(form.description).to.be.equal(stub.description); + expect(form.inputs.length).to.be.equal(stub.inputs.length); + for (let i = 0; i < form.inputs.length ; i++){ + TestHandler.testInput(form.inputs[i], stub.inputs[i]); + } + + } + + /** + * Verify if two inputs are semantically equal; + * @param input - Input that should be tested + * @param stub - A model input that first param itend to be. + * @returns - True if inputs are equal else false + */ + public static testInput(input: Input, stub: Input){ + + expect(input.id).to.be.equal(stub.id); + expect(input.placement).to.be.equal(stub.placement); + expect(input.description).to.be.equal(stub.description); + expect(input.question).to.be.equal(stub.question); + expect(input.type).to.be.equal(stub.type); + expect(input.validation.length).to.be.equal(stub.validation.length); + for (let i = 0; i < input.validation.length ; i++){ + expect(input.validation[i].type).to.be.equal(stub.validation[i].type); + expect(input.validation[i].arguments.length).to.be.equal(stub.validation[i].arguments.length); + for (let j = 0; j < input.validation[i].arguments.length ; j++){ + expect(input.validation[i].arguments[j]).to.be.equal(stub.validation[i].arguments[j]); + } + } + } + + } diff --git a/src/utils/validationHandler.spec.ts b/src/utils/validationHandler.spec.ts index 2e0da2d91f86fbcaf3f141366ab578913224faaf..590a3eedcf4d95b4a0f298a476df1fa15304cccd 100644 --- a/src/utils/validationHandler.spec.ts +++ b/src/utils/validationHandler.spec.ts @@ -47,7 +47,7 @@ describe("Validation Handler", () => { }); it("should test when Input has a minimum char number", () => { - const validation: Validation[] = [{type: ValidationType.MINCHAR, arguments: [5]}]; + const validation: Validation[] = [{type: ValidationType.MINCHAR, arguments: ["5"]}]; const input = new Input (1, "Description", "Question", InputType.TEXT, validation); expect(ValidationHandler.validateInput(input, "12345")).to.be.true; @@ -58,7 +58,7 @@ describe("Validation Handler", () => { expect(ValidationHandler.validateInput(input, undefined)).to.be.false; }); it("should test when Input has a maximum char number", () => { - const validation: Validation[] = [{type: ValidationType.MAXCHAR, arguments: [5]}]; + const validation: Validation[] = [{type: ValidationType.MAXCHAR, arguments: ["5"]}]; const input = new Input (1, "Description", "Question", InputType.TEXT, validation); expect(ValidationHandler.validateInput(input, "1234")).to.be.true; diff --git a/src/utils/validationHandler.ts b/src/utils/validationHandler.ts index c62db08ad3f2e5ce27263cd62ae52e7cd4f249ec..e2a9371dc2e882146f0b90d8d57609debab0592a 100644 --- a/src/utils/validationHandler.ts +++ b/src/utils/validationHandler.ts @@ -53,8 +53,8 @@ export class ValidationHandler { * @param size - Minimum size that answer should have. * @returns - true if has at least Size chars, else false. */ - private static validateMinChar(answer: string, size: number): boolean{ - return (answer !== null && answer !== undefined && size <= answer.length); + private static validateMinChar(answer: string, size: string): boolean{ + return (answer !== null && answer !== undefined && parseInt(size, 10) <= answer.length); } /** @@ -63,8 +63,8 @@ export class ValidationHandler { * @param size - Maximum size that answer should have. * @returns - true if has at max Size chars, else false. */ - private static validateMaxChar(answer: string, size: number): boolean{ - return (answer !== null && answer !== undefined && size >= answer.length); + private static validateMaxChar(answer: string, size: string): boolean{ + return (answer !== null && answer !== undefined && parseInt(size, 10) >= answer.length); } /**