Skip to content
Snippets Groups Projects
Commit ba674809 authored by Eyvind Nikolai Holt's avatar Eyvind Nikolai Holt
Browse files

Til o3

parents
No related branches found
No related tags found
1 merge request!1Til o3
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptSettings">
<option name="languageLevel" value="FLOW" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_10" default="false" project-jdk-name="10" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/Database-Test.iml" filepath="$PROJECT_DIR$/Database-Test.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
\ No newline at end of file
# Eksempel med Node/Jest/MySQL og GitLabCI
Dette er et prosjekt som implementerer en REST-service med et DAO-objekt og tester dette med Node/JEST.
Prosjektet bruker GitLab CI med et Docker-image for Node og en service for MySQL.
Testen bruker MySQL-servicen slik at testen har en annen database enn REST-tjenesten.
\ No newline at end of file
module.exports = class Calculator {
constructor() {}
calculate(expression) {
let pos = expression.indexOf("+");
if (pos >= 0) {
return (
this.calculate(expression.substr(0, pos)) +
this.calculate(expression.substr(pos + 1))
);
} else {
pos = expression.indexOf("-");
if (pos >= 0) {
return (
this.calculate(expression.substr(0, pos)) -
this.calculate(expression.substr(pos + 1))
);
} else {
// Remove ALL whitespaces
expression = expression.replace(/\s+/g, "");
if (expression === "") {
return 0;
}
let num = Number(expression);
if (!Number.isInteger(num)) {
console.log("'" + expression + "' is not an integer");
throw new Error("'" + expression + "' is not an integer");
} else {
return num;
}
}
}
return 0;
}
};
const Calculator = require("./calculator");
let calc = new Calculator();
beforeEach(() => {
console.log("calculator.test: beforeEach");
});
afterEach(() => {
console.log("calculator.test: afterEach");
});
beforeAll(() => {
console.log("calculator.test: beforeAll");
});
afterAll(() => {
console.log("calculator.test: afterAll");
});
test("test plus and minus with any number of arguments", () => {
expect(calc.calculate("")).toBe(0);
expect(calc.calculate("2")).toBe(2);
expect(calc.calculate("2+2")).toBe(4);
expect(calc.calculate("2+4+3-3+5")).toBe(11);
});
test("test that whitespace is allowed", () => {
expect(calc.calculate(" \t\n\r2 +\n3")).toBe(5);
});
test("test that only digits and plus and minus and whitespace is allowed", () => {
let illegal = ["1.2", "1,2", "1/2", "1*2", "1 plus 2"];
for (i in illegal) {
expect(() => calc.calculate(illegal[i])).toThrow();
}
});
DROP TABLE IF EXISTS person;
CREATE TABLE person (
id int(11) NOT NULL AUTO_INCREMENT,
navn varchar(256) NOT NULL,
alder int(3) DEFAULT NULL,
adresse varchar(256) NOT NULL,
bilde_base64 longtext,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO person (id, navn, alder, adresse) VALUES
(1, 'Hei Sveisen', 21, 'Gata 1'),
(2, 'Hei Heisen', 22, 'Gata 2');
module.exports = class Dao {
constructor(pool) {
// Dependency Injection
this.pool = pool;
}
query(sql, params, callback) {
this.pool.getConnection((err, connection) => {
console.log("dao: connected to database");
if (err) {
console.log("dao: error connecting");
callback(500, { error: "feil ved ved oppkobling" });
} else {
console.log("dao: running sql: " + sql);
connection.query(sql, params, (err, rows) => {
connection.release();
if (err) {
console.log(err);
callback(500, { error: "error querying" });
} else {
console.log("dao: returning rows");
callback(200, rows);
}
});
}
});
}
};
beforeEach(() => {
console.log("dum.test: beforeEach");
});
afterEach(() => {
console.log("dum.test: afterEach");
});
beforeAll(() => {
console.log("dum.test: beforeAll");
});
afterAll(() => {
console.log("dum.test: afterAll");
});
test("test at 1 er 1", () => {
console.log("dum.test: test 1");
expect(1).toBe(1);
});
test("test at 2 er 2", () => {
console.log("dum.test: test 2");
expect(2).toBe(2);
});
test("test alle expects", () => {
// Kjør kode
// før vi verifiserer resultatet
expect(2 + 2).toBe(4);
expect(2 + 2).toEqual(4);
expect(1 + 1).not.toBe(0);
expect("data").toEqual("data");
expect(true).toBeTruthy();
expect(false).not.toBeTruthy();
expect("1").toBeDefined();
expect("1").not.toBeUndefined();
expect(2).toBeLessThan(5);
expect("Christoph").toMatch(/stop/); // Regular expression
});
someCode = () => {
throw Error("Feil");
};
test("test exception", () => {
expect(someCode).toThrow();
});
const Dao = require("./dao.js");
module.exports = class PersonDao extends Dao {
getAll(callback) {
super.query("select navn, alder, adresse from person", [], callback);
}
getOne(id, callback) {
super.query(
"select navn, alder, adresse from person where id=?",
[id],
callback
);
}
createOne(json, callback) {
var val = [json.navn, json.adresse, json.alder];
super.query(
"insert into person (navn,adresse,alder) values (?,?,?)",
val,
callback
);
}
updateOne(json, callback) {
var val = [json.navn, json.adresse, json.alder, json.id];
super.query(
"update person set navn = ?, adresse = ?, alder = ? where id=?",
val,
callback
);
}
deleteOne(id, callback) {
super.query(
"delete from person where id=?",
[id],
callback
);
}
};
var mysql = require("mysql");
const PersonDao = require("./persondao.js");
const runsqlfile = require("./runsqlfile.js");
// GitLab CI Pool
var pool = mysql.createPool({
connectionLimit: 1,
host: "mysql.stud.iie.ntnu.no",
user: "eyvindnh",
password: "baqveHFo",
database: "eyvindnh",
debug: false,
multipleStatements: true
});
let personDao = new PersonDao(pool);
beforeAll(done => {
runsqlfile("dao/create_tables.sql", pool, () => {
runsqlfile("dao/create_testdata.sql", pool, done);
});
});
afterAll(() => {
pool.end();
});
test("get one person from db", done => {
function callback(status, data) {
console.log(
"Test callback: status=" + status + ", data=" + JSON.stringify(data)
);
expect(data.length).toBe(1);
expect(data[0].navn).toBe("Hei Sveisen");
done();
}
personDao.getOne(1, callback);
});
test("get unknown person from db", done => {
function callback(status, data) {
console.log(
"Test callback: status=" + status + ", data=" + JSON.stringify(data)
);
expect(data.length).toBe(0);
done();
}
personDao.getOne(0, callback);
});
test("add person to db", done => {
function callback(status, data) {
console.log(
"Test callback: status=" + status + ", data=" + JSON.stringify(data)
);
expect(data.affectedRows).toBeGreaterThanOrEqual(1);
done();
}
personDao.createOne(
{ navn: "Nils Nilsen", alder: 34, adresse: "Gata 3" },
callback
);
});
test("update person in db", done => {
function callback(status, data) {
console.log(
"Test callback: status=" + status + ", data=" + JSON.stringify(data)
);
function callback2(status, data) {
console.log(
"Test callback: status=" + status + ", data=" + JSON.stringify(data)
);
expect(data.length).toBe(1);
expect(data[0].navn).toBe("Tale Leif");
done();
}
personDao.getOne(2, callback2);
}
personDao.updateOne(
{ navn: "Tale Leif", alder: 57, adresse: "Veien 5", id: 2 },
callback
);
});
test("delete person in db", done => {
function callback(status, data) {
console.log(
"Test callback: status=" + status + ", data.length=" + data.length
);
expect(data.affectedRows).toBeLessThanOrEqual(1);
done();
}
personDao.deleteOne(1, callback);
});
test("get all persons from db", done => {
function callback(status, data) {
console.log(
"Test callback: status=" + status + ", data.length=" + data.length
);
expect(data.length).toBeGreaterThanOrEqual(2);
done();
}
personDao.getAll(callback);
});
var mysql = require("mysql");
var fs = require("fs");
module.exports = function run(filename, pool, done) {
console.log("runsqlfile: reading file " + filename);
let sql = fs.readFileSync(filename, "utf8");
pool.getConnection((err, connection) => {
if (err) {
console.log("runsqlfile: error connecting");
done();
} else {
console.log("runsqlfile: connected");
connection.query(sql, (err, rows) => {
connection.release();
if (err) {
console.log(err);
done();
} else {
console.log("runsqlfile: run ok");
done();
}
});
}
});
};
function sum(a, b) {
return a + b;
}
module.exports = sum;
\ No newline at end of file
const sum = require("./sum");
beforeEach(() => {
console.log("sum.test: beforeEach");
});
afterEach(() => {
console.log("sum.test: afterEach");
});
beforeAll(() => {
console.log("sum.test: beforeAll");
});
afterAll(() => {
console.log("sum.test: afterAll");
});
test("adds 1 + 2 to equal 3", () => {
console.log("Running simple test");
expect(sum(1, 2)).toBe(3);
});
This diff is collapsed.
{
"name": "myPackage",
"jest": {
"verbose": true,
"collectCoverage": true,
"coverageReporters": [
"json",
"html"
]
},
"version": "0.0.1",
"dependencies": {
"body-parser": "^1.18.3",
"express": "^4.16.3",
"fs": "0.0.1-security",
"jest": "^23.6.0",
"mysql": "^2.16.0"
},
"scripts": {
"test": "jest"
}
}
var express = require("express");
var mysql = require("mysql");
var bodyParser = require("body-parser");
var app = express();
var apiRoutes = express.Router();
app.use(bodyParser.json()); // for å tolke JSON
const PersonDao = require("./dao/persondao.js");
var pool = mysql.createPool({
connectionLimit: 2,
host: "mysql.stud.iie.ntnu.no",
user: "eyvindnh",
password: "baqveHFo",
database: "eyvindnh",
debug: false
});
let personDao = new PersonDao(pool);
app.get("/person", (req, res) => {
console.log("/person: fikk request fra klient");
personDao.getAll((status, data) => {
res.status(status);
res.json(data);
});
});
app.get("/person/:personId", (req, res) => {
console.log("/person/:personId: fikk request fra klient");
personDao.getOne(req.params.personId, (status, data) => {
res.status(status);
res.json(data);
});
});
app.post("/person", (req, res) => {
console.log("Fikk POST-request fra klienten");
personDao.createOne(req.body, (status, data) => {
res.status(status);
res.json(data);
});
});
app.put("/person/:personId", (req, res) => {
console.log("/person/:personId fikk PUT-request fra klienten");
var bodyString = JSON.stringify(req.body);
bodyString = bodyString.substring(1,bodyString.length-1);
var bodyJson = JSON.parse('{"id": ' + req.params.personId + "," + bodyString + "}");
personDao.updateOne(bodyJson, (status, data) => {
res.status(status);
res.json(data);
});
});
app.delete("/person/:personId", (req, res) => {
console.log("/person/:personId fikk PUT-request fra klienten");
personDao.deleteOne(req.params.personId, (status, data) => {
res.status(status);
res.json(data);
});
});
var server = app.listen(8080);
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment