Added README and test
This commit is contained in:
97
README.md
97
README.md
@@ -1 +1,98 @@
|
|||||||
# Naida test
|
# Naida test
|
||||||
|
***Permissions API
|
||||||
|
|
||||||
|
Permissions API implements a set of JSON end-points which allow other parts of a larger application to update and test user access (permissions) over a set of named objects.
|
||||||
|
|
||||||
|
The API deals with:
|
||||||
|
- a set of Named OBJECTS whose access permissions are being controlled,
|
||||||
|
- a set of USERNAMES which might have different types of permissions.
|
||||||
|
- a set of GROUPS that those users may be part of,
|
||||||
|
- a set of PERMISSIONS which specific users or groups of users might have over specific objects.
|
||||||
|
|
||||||
|
*API documentation
|
||||||
|
|
||||||
|
Complete API documentation (created with Postman) can be found on public URL: https://documenter.getpostman.com/view/9085921/SW14TwCX?version=latest
|
||||||
|
|
||||||
|
*Getting Started
|
||||||
|
|
||||||
|
Instructions for running API on your local machine for develoment and testing purposes.
|
||||||
|
|
||||||
|
*Prerequisited
|
||||||
|
|
||||||
|
Pull project folder from GitLab to your local machine: https://gitlab.com/saburly/testovi/naida
|
||||||
|
|
||||||
|
*Setting up database
|
||||||
|
|
||||||
|
Install PostgreSQL from official site if needed: https://www.postgresql.org/download/
|
||||||
|
|
||||||
|
Navigate to project folder. Open terminal and run script for creating a database. Before runing script change user to postgres.
|
||||||
|
|
||||||
|
$sudo su - postgres
|
||||||
|
|
||||||
|
$chmod +x dbscript.sh
|
||||||
|
$sh dbscript.sh
|
||||||
|
|
||||||
|
In file permissions.js change password for user postgres and local host if needed:
|
||||||
|
const db = knex ({
|
||||||
|
client: 'pg',
|
||||||
|
connection: {
|
||||||
|
host : '127.0.0.1',
|
||||||
|
user : 'postgres',
|
||||||
|
password : '0904',
|
||||||
|
database : 'testdb'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
*Installing dependencies
|
||||||
|
|
||||||
|
Check that package.json has listed dependencies:
|
||||||
|
"dependencies": {
|
||||||
|
"body-parser": "^1.19.0",
|
||||||
|
"cors": "^2.8.5",
|
||||||
|
"express": "^4.17.1",
|
||||||
|
"express-validator": "^6.2.0",
|
||||||
|
"knex": "^0.20.0",
|
||||||
|
"pg": "^7.12.1",
|
||||||
|
"chai": "^4.1.2",
|
||||||
|
"chai-http": "4.2.1",
|
||||||
|
"mocha": "^5.2.0",
|
||||||
|
"mochawesome": "^3.0.2",
|
||||||
|
"supertest": "^3.1.0",
|
||||||
|
"tv4": "^1.3.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"nodemon": "^1.19.4"
|
||||||
|
}
|
||||||
|
In terminal navigate to project folder and run:
|
||||||
|
$npm install
|
||||||
|
|
||||||
|
This should install all needed dependencies (node modules).
|
||||||
|
|
||||||
|
*Start project
|
||||||
|
|
||||||
|
To run API on your local machine open terminal, navigate to project folder and run:
|
||||||
|
$npm start
|
||||||
|
|
||||||
|
API is running on default localport 3000, for testing and development purposes.
|
||||||
|
|
||||||
|
*Running the test
|
||||||
|
|
||||||
|
For conducting script test, run in terminal:
|
||||||
|
$npm test
|
||||||
|
|
||||||
|
*Built With
|
||||||
|
|
||||||
|
-Node.js, Express
|
||||||
|
-PostgreSQL
|
||||||
|
-Postman
|
||||||
|
-Mocha
|
||||||
|
|
||||||
|
*Acknowledgments
|
||||||
|
|
||||||
|
Special thanks to authors of these excelent articles and repositories:
|
||||||
|
-https://medium.com/@olotintemitope/how-to-generate-your-api-documentation-in-20-minutes-4e0072f08b94
|
||||||
|
-https://dev.to/nedsoft/a-clean-approach-to-using-express-validator-8go
|
||||||
|
-https://medium.com/@shashiraja/convert-postman-api-tests-to-mocha-10705af6e37a
|
||||||
|
-https://medium.com/@svsh227/write-your-first-test-case-in-your-node-app-using-mocha-5250e614feb3
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
17
dbscript.sh
Normal file
17
dbscript.sh
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
psql -U postgres << END_OF_SCRIPT
|
||||||
|
|
||||||
|
DROP DATABASE testdb; -- drop the DB if exists
|
||||||
|
|
||||||
|
CREATE DATABASE testdb WITH OWNER = postgres;
|
||||||
|
|
||||||
|
\c testdb
|
||||||
|
|
||||||
|
-- Create tables of the DB
|
||||||
|
|
||||||
|
CREATE TABLE objects (id serial PRIMARY KEY, objname varchar (100) UNIQUE NOT NULL);
|
||||||
|
CREATE TABLE users (id serial PRIMARY KEY, username varchar (100) UNIQUE NOT NULL);
|
||||||
|
CREATE TABLE groups (id serial PRIMARY KEY, groupname varchar(100) NOT NULL, username varchar (100));
|
||||||
|
CREATE TABLE permissions (id serial PRIMARY KEY, ownertype varchar(100) NOT NULL, owner varchar(100) NOT NULL, objname varchar (100) NOT NULL, type varchar(100) NOT NULL);
|
||||||
|
|
||||||
|
END_OF_SCRIPT
|
||||||
BIN
mochawesome-report/assets/MaterialIcons-Regular.woff
Normal file
BIN
mochawesome-report/assets/MaterialIcons-Regular.woff
Normal file
Binary file not shown.
BIN
mochawesome-report/assets/MaterialIcons-Regular.woff2
Normal file
BIN
mochawesome-report/assets/MaterialIcons-Regular.woff2
Normal file
Binary file not shown.
2
mochawesome-report/assets/app.css
Normal file
2
mochawesome-report/assets/app.css
Normal file
File diff suppressed because one or more lines are too long
1
mochawesome-report/assets/app.js
Normal file
1
mochawesome-report/assets/app.js
Normal file
File diff suppressed because one or more lines are too long
BIN
mochawesome-report/assets/roboto-light-webfont.woff
Normal file
BIN
mochawesome-report/assets/roboto-light-webfont.woff
Normal file
Binary file not shown.
BIN
mochawesome-report/assets/roboto-light-webfont.woff2
Normal file
BIN
mochawesome-report/assets/roboto-light-webfont.woff2
Normal file
Binary file not shown.
BIN
mochawesome-report/assets/roboto-medium-webfont.woff
Normal file
BIN
mochawesome-report/assets/roboto-medium-webfont.woff
Normal file
Binary file not shown.
BIN
mochawesome-report/assets/roboto-medium-webfont.woff2
Normal file
BIN
mochawesome-report/assets/roboto-medium-webfont.woff2
Normal file
Binary file not shown.
BIN
mochawesome-report/assets/roboto-regular-webfont.woff
Normal file
BIN
mochawesome-report/assets/roboto-regular-webfont.woff
Normal file
Binary file not shown.
BIN
mochawesome-report/assets/roboto-regular-webfont.woff2
Normal file
BIN
mochawesome-report/assets/roboto-regular-webfont.woff2
Normal file
Binary file not shown.
2
mochawesome-report/mochawesome.html
Normal file
2
mochawesome-report/mochawesome.html
Normal file
File diff suppressed because one or more lines are too long
509
mochawesome-report/mochawesome.json
Normal file
509
mochawesome-report/mochawesome.json
Normal file
@@ -0,0 +1,509 @@
|
|||||||
|
{
|
||||||
|
"stats": {
|
||||||
|
"suites": 7,
|
||||||
|
"tests": 12,
|
||||||
|
"passes": 12,
|
||||||
|
"pending": 0,
|
||||||
|
"failures": 0,
|
||||||
|
"start": "2019-11-04T19:07:28.048Z",
|
||||||
|
"end": "2019-11-04T19:07:28.617Z",
|
||||||
|
"duration": 569,
|
||||||
|
"testsRegistered": 12,
|
||||||
|
"passPercent": 100,
|
||||||
|
"pendingPercent": 0,
|
||||||
|
"other": 0,
|
||||||
|
"hasOther": false,
|
||||||
|
"skipped": 0,
|
||||||
|
"hasSkipped": false,
|
||||||
|
"passPercentClass": "success",
|
||||||
|
"pendingPercentClass": "danger"
|
||||||
|
},
|
||||||
|
"suites": {
|
||||||
|
"uuid": "a15f134c-99fd-439c-9da3-1b6d22ee823d",
|
||||||
|
"title": "",
|
||||||
|
"fullFile": "",
|
||||||
|
"file": "",
|
||||||
|
"beforeHooks": [],
|
||||||
|
"afterHooks": [],
|
||||||
|
"tests": [],
|
||||||
|
"suites": [
|
||||||
|
{
|
||||||
|
"uuid": "c2865b3c-162f-40ea-8f05-4036e8ebba8d",
|
||||||
|
"title": "Add user Bob to group administrators",
|
||||||
|
"fullFile": "C:\\Users\\Zeko\\Documents\\ZeroToMastery\\testni_projekat\\permissions_api\\permissions_cloned\\test\\apitest.js",
|
||||||
|
"file": "\\test\\apitest.js",
|
||||||
|
"beforeHooks": [
|
||||||
|
{
|
||||||
|
"title": "\"before all\" hook",
|
||||||
|
"fullTitle": "Add user Bob to group administrators \"before all\" hook",
|
||||||
|
"timedOut": false,
|
||||||
|
"duration": 299,
|
||||||
|
"pass": false,
|
||||||
|
"fail": false,
|
||||||
|
"pending": false,
|
||||||
|
"code": "response = await call_api_add_user(data);\nbody = response.body;",
|
||||||
|
"err": {},
|
||||||
|
"isRoot": false,
|
||||||
|
"uuid": "d8648d71-4102-4330-bbbe-072c86efb0c6",
|
||||||
|
"isHook": true,
|
||||||
|
"skipped": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"afterHooks": [],
|
||||||
|
"tests": [
|
||||||
|
{
|
||||||
|
"title": "Status code is 200",
|
||||||
|
"fullTitle": "Add user Bob to group administrators Status code is 200",
|
||||||
|
"timedOut": false,
|
||||||
|
"duration": 2,
|
||||||
|
"state": "passed",
|
||||||
|
"speed": "fast",
|
||||||
|
"pass": true,
|
||||||
|
"fail": false,
|
||||||
|
"pending": false,
|
||||||
|
"code": "expect(response.status).to.equal(200);",
|
||||||
|
"err": {},
|
||||||
|
"isRoot": false,
|
||||||
|
"uuid": "3dc0e744-4c57-4e65-9fb4-cf89399ceb5a",
|
||||||
|
"isHook": false,
|
||||||
|
"skipped": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Schema is valid",
|
||||||
|
"fullTitle": "Add user Bob to group administrators Schema is valid",
|
||||||
|
"timedOut": false,
|
||||||
|
"duration": 3,
|
||||||
|
"state": "passed",
|
||||||
|
"speed": "fast",
|
||||||
|
"pass": true,
|
||||||
|
"fail": false,
|
||||||
|
"pending": false,
|
||||||
|
"code": "expect(tv4.validate(body, schema1)).to.be.true;",
|
||||||
|
"err": {},
|
||||||
|
"isRoot": false,
|
||||||
|
"uuid": "346cf09b-a0bb-4fc5-a01d-f50e218345cd",
|
||||||
|
"isHook": false,
|
||||||
|
"skipped": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"suites": [],
|
||||||
|
"passes": [
|
||||||
|
"3dc0e744-4c57-4e65-9fb4-cf89399ceb5a",
|
||||||
|
"346cf09b-a0bb-4fc5-a01d-f50e218345cd"
|
||||||
|
],
|
||||||
|
"failures": [],
|
||||||
|
"pending": [],
|
||||||
|
"skipped": [],
|
||||||
|
"duration": 5,
|
||||||
|
"root": false,
|
||||||
|
"rootEmpty": false,
|
||||||
|
"_timeout": 200000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uuid": "0287953e-15f5-4b07-b587-fe5e8cea895f",
|
||||||
|
"title": "Add user alice to group administrators",
|
||||||
|
"fullFile": "C:\\Users\\Zeko\\Documents\\ZeroToMastery\\testni_projekat\\permissions_api\\permissions_cloned\\test\\apitest.js",
|
||||||
|
"file": "\\test\\apitest.js",
|
||||||
|
"beforeHooks": [
|
||||||
|
{
|
||||||
|
"title": "\"before all\" hook",
|
||||||
|
"fullTitle": "Add user alice to group administrators \"before all\" hook",
|
||||||
|
"timedOut": false,
|
||||||
|
"duration": 26,
|
||||||
|
"pass": false,
|
||||||
|
"fail": false,
|
||||||
|
"pending": false,
|
||||||
|
"code": "response = await call_api_add_user(data);\nbody = response.body;",
|
||||||
|
"err": {},
|
||||||
|
"isRoot": false,
|
||||||
|
"uuid": "28d45481-88b1-4263-b93e-c2a21ce1f10b",
|
||||||
|
"isHook": true,
|
||||||
|
"skipped": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"afterHooks": [],
|
||||||
|
"tests": [
|
||||||
|
{
|
||||||
|
"title": "Status code is 200",
|
||||||
|
"fullTitle": "Add user alice to group administrators Status code is 200",
|
||||||
|
"timedOut": false,
|
||||||
|
"duration": 0,
|
||||||
|
"state": "passed",
|
||||||
|
"speed": "fast",
|
||||||
|
"pass": true,
|
||||||
|
"fail": false,
|
||||||
|
"pending": false,
|
||||||
|
"code": "expect(response.status).to.equal(200);",
|
||||||
|
"err": {},
|
||||||
|
"isRoot": false,
|
||||||
|
"uuid": "6c7e04f9-6c64-4cb6-908b-610834dc45f8",
|
||||||
|
"isHook": false,
|
||||||
|
"skipped": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Schema is valid",
|
||||||
|
"fullTitle": "Add user alice to group administrators Schema is valid",
|
||||||
|
"timedOut": false,
|
||||||
|
"duration": 0,
|
||||||
|
"state": "passed",
|
||||||
|
"speed": "fast",
|
||||||
|
"pass": true,
|
||||||
|
"fail": false,
|
||||||
|
"pending": false,
|
||||||
|
"code": "expect(tv4.validate(body, schema1)).to.be.true;",
|
||||||
|
"err": {},
|
||||||
|
"isRoot": false,
|
||||||
|
"uuid": "e59ed3ca-b747-48cb-bcaf-cf6751025460",
|
||||||
|
"isHook": false,
|
||||||
|
"skipped": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"suites": [],
|
||||||
|
"passes": [
|
||||||
|
"6c7e04f9-6c64-4cb6-908b-610834dc45f8",
|
||||||
|
"e59ed3ca-b747-48cb-bcaf-cf6751025460"
|
||||||
|
],
|
||||||
|
"failures": [],
|
||||||
|
"pending": [],
|
||||||
|
"skipped": [],
|
||||||
|
"duration": 0,
|
||||||
|
"root": false,
|
||||||
|
"rootEmpty": false,
|
||||||
|
"_timeout": 200000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uuid": "c6dbf655-3d74-4e8e-ac24-f34e0dffee6c",
|
||||||
|
"title": "Add permission over object message of the day to user dan",
|
||||||
|
"fullFile": "C:\\Users\\Zeko\\Documents\\ZeroToMastery\\testni_projekat\\permissions_api\\permissions_cloned\\test\\apitest.js",
|
||||||
|
"file": "\\test\\apitest.js",
|
||||||
|
"beforeHooks": [
|
||||||
|
{
|
||||||
|
"title": "\"before all\" hook",
|
||||||
|
"fullTitle": "Add permission over object message of the day to user dan \"before all\" hook",
|
||||||
|
"timedOut": false,
|
||||||
|
"duration": 20,
|
||||||
|
"pass": false,
|
||||||
|
"fail": false,
|
||||||
|
"pending": false,
|
||||||
|
"code": "response = await call_api_add_perm(data);\nbody = response.body;",
|
||||||
|
"err": {},
|
||||||
|
"isRoot": false,
|
||||||
|
"uuid": "72dddf72-1afb-47f9-9775-c3f3092f8b70",
|
||||||
|
"isHook": true,
|
||||||
|
"skipped": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"afterHooks": [],
|
||||||
|
"tests": [
|
||||||
|
{
|
||||||
|
"title": "Status code is 200",
|
||||||
|
"fullTitle": "Add permission over object message of the day to user dan Status code is 200",
|
||||||
|
"timedOut": false,
|
||||||
|
"duration": 0,
|
||||||
|
"state": "passed",
|
||||||
|
"speed": "fast",
|
||||||
|
"pass": true,
|
||||||
|
"fail": false,
|
||||||
|
"pending": false,
|
||||||
|
"code": "expect(response.status).to.equal(200);",
|
||||||
|
"err": {},
|
||||||
|
"isRoot": false,
|
||||||
|
"uuid": "4faf445a-18ef-4e4e-adfa-898d5d5e7500",
|
||||||
|
"isHook": false,
|
||||||
|
"skipped": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Schema is valid",
|
||||||
|
"fullTitle": "Add permission over object message of the day to user dan Schema is valid",
|
||||||
|
"timedOut": false,
|
||||||
|
"duration": 0,
|
||||||
|
"state": "passed",
|
||||||
|
"speed": "fast",
|
||||||
|
"pass": true,
|
||||||
|
"fail": false,
|
||||||
|
"pending": false,
|
||||||
|
"code": "expect(tv4.validate(body, schema2)).to.be.true;",
|
||||||
|
"err": {},
|
||||||
|
"isRoot": false,
|
||||||
|
"uuid": "eae67793-bd93-461a-bdb9-71b0e5b4ffbf",
|
||||||
|
"isHook": false,
|
||||||
|
"skipped": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"suites": [],
|
||||||
|
"passes": [
|
||||||
|
"4faf445a-18ef-4e4e-adfa-898d5d5e7500",
|
||||||
|
"eae67793-bd93-461a-bdb9-71b0e5b4ffbf"
|
||||||
|
],
|
||||||
|
"failures": [],
|
||||||
|
"pending": [],
|
||||||
|
"skipped": [],
|
||||||
|
"duration": 0,
|
||||||
|
"root": false,
|
||||||
|
"rootEmpty": false,
|
||||||
|
"_timeout": 200000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uuid": "be99ef0c-e8fb-4438-84bc-ddad91f16446",
|
||||||
|
"title": "Add permission over object message of the day to group administrators",
|
||||||
|
"fullFile": "C:\\Users\\Zeko\\Documents\\ZeroToMastery\\testni_projekat\\permissions_api\\permissions_cloned\\test\\apitest.js",
|
||||||
|
"file": "\\test\\apitest.js",
|
||||||
|
"beforeHooks": [
|
||||||
|
{
|
||||||
|
"title": "\"before all\" hook",
|
||||||
|
"fullTitle": "Add permission over object message of the day to group administrators \"before all\" hook",
|
||||||
|
"timedOut": false,
|
||||||
|
"duration": 43,
|
||||||
|
"pass": false,
|
||||||
|
"fail": false,
|
||||||
|
"pending": false,
|
||||||
|
"code": "response = await call_api_add_perm(data);\nbody = response.body;",
|
||||||
|
"err": {},
|
||||||
|
"isRoot": false,
|
||||||
|
"uuid": "385d482a-01bb-47ba-b11a-350af9203970",
|
||||||
|
"isHook": true,
|
||||||
|
"skipped": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"afterHooks": [],
|
||||||
|
"tests": [
|
||||||
|
{
|
||||||
|
"title": "Status code is 200",
|
||||||
|
"fullTitle": "Add permission over object message of the day to group administrators Status code is 200",
|
||||||
|
"timedOut": false,
|
||||||
|
"duration": 0,
|
||||||
|
"state": "passed",
|
||||||
|
"speed": "fast",
|
||||||
|
"pass": true,
|
||||||
|
"fail": false,
|
||||||
|
"pending": false,
|
||||||
|
"code": "expect(response.status).to.equal(200);",
|
||||||
|
"err": {},
|
||||||
|
"isRoot": false,
|
||||||
|
"uuid": "a79ca20c-34a0-467c-b166-4e8417cc2d6a",
|
||||||
|
"isHook": false,
|
||||||
|
"skipped": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Schema is valid",
|
||||||
|
"fullTitle": "Add permission over object message of the day to group administrators Schema is valid",
|
||||||
|
"timedOut": false,
|
||||||
|
"duration": 0,
|
||||||
|
"state": "passed",
|
||||||
|
"speed": "fast",
|
||||||
|
"pass": true,
|
||||||
|
"fail": false,
|
||||||
|
"pending": false,
|
||||||
|
"code": "expect(tv4.validate(body, schema2)).to.be.true;",
|
||||||
|
"err": {},
|
||||||
|
"isRoot": false,
|
||||||
|
"uuid": "5448fc55-d979-4d5d-8495-593577029ab8",
|
||||||
|
"isHook": false,
|
||||||
|
"skipped": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"suites": [],
|
||||||
|
"passes": [
|
||||||
|
"a79ca20c-34a0-467c-b166-4e8417cc2d6a",
|
||||||
|
"5448fc55-d979-4d5d-8495-593577029ab8"
|
||||||
|
],
|
||||||
|
"failures": [],
|
||||||
|
"pending": [],
|
||||||
|
"skipped": [],
|
||||||
|
"duration": 0,
|
||||||
|
"root": false,
|
||||||
|
"rootEmpty": false,
|
||||||
|
"_timeout": 200000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uuid": "d2dfaa0c-fecc-44d7-8461-e236de2d9218",
|
||||||
|
"title": "Add permission over object message of the day to group administrators",
|
||||||
|
"fullFile": "C:\\Users\\Zeko\\Documents\\ZeroToMastery\\testni_projekat\\permissions_api\\permissions_cloned\\test\\apitest.js",
|
||||||
|
"file": "\\test\\apitest.js",
|
||||||
|
"beforeHooks": [
|
||||||
|
{
|
||||||
|
"title": "\"before all\" hook",
|
||||||
|
"fullTitle": "Add permission over object message of the day to group administrators \"before all\" hook",
|
||||||
|
"timedOut": false,
|
||||||
|
"duration": 22,
|
||||||
|
"pass": false,
|
||||||
|
"fail": false,
|
||||||
|
"pending": false,
|
||||||
|
"code": "response = await call_api_add_perm(data);\nbody = response.body;",
|
||||||
|
"err": {},
|
||||||
|
"isRoot": false,
|
||||||
|
"uuid": "31212122-e409-4dea-947a-74177d5cfee5",
|
||||||
|
"isHook": true,
|
||||||
|
"skipped": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"afterHooks": [],
|
||||||
|
"tests": [
|
||||||
|
{
|
||||||
|
"title": "Status code is 200",
|
||||||
|
"fullTitle": "Add permission over object message of the day to group administrators Status code is 200",
|
||||||
|
"timedOut": false,
|
||||||
|
"duration": 0,
|
||||||
|
"state": "passed",
|
||||||
|
"speed": "fast",
|
||||||
|
"pass": true,
|
||||||
|
"fail": false,
|
||||||
|
"pending": false,
|
||||||
|
"code": "expect(response.status).to.equal(200);",
|
||||||
|
"err": {},
|
||||||
|
"isRoot": false,
|
||||||
|
"uuid": "a329a8e2-75c7-43a0-a538-bb1a6296a725",
|
||||||
|
"isHook": false,
|
||||||
|
"skipped": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Schema is valid",
|
||||||
|
"fullTitle": "Add permission over object message of the day to group administrators Schema is valid",
|
||||||
|
"timedOut": false,
|
||||||
|
"duration": 1,
|
||||||
|
"state": "passed",
|
||||||
|
"speed": "fast",
|
||||||
|
"pass": true,
|
||||||
|
"fail": false,
|
||||||
|
"pending": false,
|
||||||
|
"code": "expect(tv4.validate(body, schema2)).to.be.true;",
|
||||||
|
"err": {},
|
||||||
|
"isRoot": false,
|
||||||
|
"uuid": "7b2c270d-5aa0-423e-b48d-61ca475e1bd4",
|
||||||
|
"isHook": false,
|
||||||
|
"skipped": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"suites": [],
|
||||||
|
"passes": [
|
||||||
|
"a329a8e2-75c7-43a0-a538-bb1a6296a725",
|
||||||
|
"7b2c270d-5aa0-423e-b48d-61ca475e1bd4"
|
||||||
|
],
|
||||||
|
"failures": [],
|
||||||
|
"pending": [],
|
||||||
|
"skipped": [],
|
||||||
|
"duration": 1,
|
||||||
|
"root": false,
|
||||||
|
"rootEmpty": false,
|
||||||
|
"_timeout": 200000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uuid": "005ccfc5-f8f1-4d20-b715-1acbd90c32dc",
|
||||||
|
"title": "Querry what permissions user Alice has over object message of the day.",
|
||||||
|
"fullFile": "C:\\Users\\Zeko\\Documents\\ZeroToMastery\\testni_projekat\\permissions_api\\permissions_cloned\\test\\apitest.js",
|
||||||
|
"file": "\\test\\apitest.js",
|
||||||
|
"beforeHooks": [
|
||||||
|
{
|
||||||
|
"title": "\"before all\" hook",
|
||||||
|
"fullTitle": "Querry what permissions user Alice has over object message of the day. \"before all\" hook",
|
||||||
|
"timedOut": false,
|
||||||
|
"duration": 20,
|
||||||
|
"pass": false,
|
||||||
|
"fail": false,
|
||||||
|
"pending": false,
|
||||||
|
"code": "response = await call_api_query_perm(data);\nbody = response.body;",
|
||||||
|
"err": {},
|
||||||
|
"isRoot": false,
|
||||||
|
"uuid": "b3052841-f131-43cb-b5fc-1dc73f555abf",
|
||||||
|
"isHook": true,
|
||||||
|
"skipped": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"afterHooks": [],
|
||||||
|
"tests": [
|
||||||
|
{
|
||||||
|
"title": "Status code is 200",
|
||||||
|
"fullTitle": "Querry what permissions user Alice has over object message of the day. Status code is 200",
|
||||||
|
"timedOut": false,
|
||||||
|
"duration": 1,
|
||||||
|
"state": "passed",
|
||||||
|
"speed": "fast",
|
||||||
|
"pass": true,
|
||||||
|
"fail": false,
|
||||||
|
"pending": false,
|
||||||
|
"code": "expect(response.status).to.equal(200);",
|
||||||
|
"err": {},
|
||||||
|
"isRoot": false,
|
||||||
|
"uuid": "a3ca2323-803b-451d-9186-dfd4e3dd01ae",
|
||||||
|
"isHook": false,
|
||||||
|
"skipped": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"suites": [],
|
||||||
|
"passes": [
|
||||||
|
"a3ca2323-803b-451d-9186-dfd4e3dd01ae"
|
||||||
|
],
|
||||||
|
"failures": [],
|
||||||
|
"pending": [],
|
||||||
|
"skipped": [],
|
||||||
|
"duration": 1,
|
||||||
|
"root": false,
|
||||||
|
"rootEmpty": false,
|
||||||
|
"_timeout": 200000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uuid": "1adf81ae-f1b7-417b-8af9-4c620360df6e",
|
||||||
|
"title": "Test if user Dan has permission modify over object message of the day.",
|
||||||
|
"fullFile": "C:\\Users\\Zeko\\Documents\\ZeroToMastery\\testni_projekat\\permissions_api\\permissions_cloned\\test\\apitest.js",
|
||||||
|
"file": "\\test\\apitest.js",
|
||||||
|
"beforeHooks": [
|
||||||
|
{
|
||||||
|
"title": "\"before all\" hook",
|
||||||
|
"fullTitle": "Test if user Dan has permission modify over object message of the day. \"before all\" hook",
|
||||||
|
"timedOut": false,
|
||||||
|
"duration": 19,
|
||||||
|
"pass": false,
|
||||||
|
"fail": false,
|
||||||
|
"pending": false,
|
||||||
|
"code": "response = await call_api_test_perm(data);\nbody = response.body;",
|
||||||
|
"err": {},
|
||||||
|
"isRoot": false,
|
||||||
|
"uuid": "9248f191-d251-4d6e-b4b3-90c19bc9d407",
|
||||||
|
"isHook": true,
|
||||||
|
"skipped": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"afterHooks": [],
|
||||||
|
"tests": [
|
||||||
|
{
|
||||||
|
"title": "Status code is 200",
|
||||||
|
"fullTitle": "Test if user Dan has permission modify over object message of the day. Status code is 200",
|
||||||
|
"timedOut": false,
|
||||||
|
"duration": 0,
|
||||||
|
"state": "passed",
|
||||||
|
"speed": "fast",
|
||||||
|
"pass": true,
|
||||||
|
"fail": false,
|
||||||
|
"pending": false,
|
||||||
|
"code": "expect(response.status).to.equal(200);",
|
||||||
|
"err": {},
|
||||||
|
"isRoot": false,
|
||||||
|
"uuid": "591da05c-cf51-48f0-9ddc-d220ddf0eb1b",
|
||||||
|
"isHook": false,
|
||||||
|
"skipped": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"suites": [],
|
||||||
|
"passes": [
|
||||||
|
"591da05c-cf51-48f0-9ddc-d220ddf0eb1b"
|
||||||
|
],
|
||||||
|
"failures": [],
|
||||||
|
"pending": [],
|
||||||
|
"skipped": [],
|
||||||
|
"duration": 0,
|
||||||
|
"root": false,
|
||||||
|
"rootEmpty": false,
|
||||||
|
"_timeout": 200000
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"passes": [],
|
||||||
|
"failures": [],
|
||||||
|
"pending": [],
|
||||||
|
"skipped": [],
|
||||||
|
"duration": 0,
|
||||||
|
"root": true,
|
||||||
|
"rootEmpty": true,
|
||||||
|
"_timeout": 200000
|
||||||
|
},
|
||||||
|
"copyrightYear": 2019
|
||||||
|
}
|
||||||
746
package-lock.json
generated
746
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
13
package.json
13
package.json
@@ -5,8 +5,9 @@
|
|||||||
"main": "permissions.js",
|
"main": "permissions.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "nodemon permissions.js",
|
"start": "nodemon permissions.js",
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"test": "mocha test/apitest.js"
|
||||||
},
|
|
||||||
|
},
|
||||||
"author": "",
|
"author": "",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -15,7 +16,13 @@
|
|||||||
"express": "^4.17.1",
|
"express": "^4.17.1",
|
||||||
"express-validator": "^6.2.0",
|
"express-validator": "^6.2.0",
|
||||||
"knex": "^0.20.0",
|
"knex": "^0.20.0",
|
||||||
"pg": "^7.12.1"
|
"pg": "^7.12.1",
|
||||||
|
"chai": "^4.1.2",
|
||||||
|
"chai-http": "4.2.1",
|
||||||
|
"mocha": "^5.2.0",
|
||||||
|
"mochawesome": "^3.0.2",
|
||||||
|
"supertest": "^3.1.0",
|
||||||
|
"tv4": "^1.3.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"nodemon": "^1.19.4"
|
"nodemon": "^1.19.4"
|
||||||
|
|||||||
@@ -68,3 +68,6 @@ app.post('/querypermiss', (req,res) => {
|
|||||||
app.listen(3000, () => {
|
app.listen(3000, () => {
|
||||||
console.log(`App is running on port 3000`);
|
console.log(`App is running on port 3000`);
|
||||||
})
|
})
|
||||||
|
|
||||||
|
//For testing purpose
|
||||||
|
//module.exports = app;
|
||||||
184
test/apitest.js
Normal file
184
test/apitest.js
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
//TEST - Case from assignement. It is assumed that it is first to be run after database creation.
|
||||||
|
|
||||||
|
//Requirements for testing purpose
|
||||||
|
const supertest = require('supertest');
|
||||||
|
const expect = require('chai').expect;
|
||||||
|
const mocha = require('mocha');
|
||||||
|
const tv4 = require('tv4');
|
||||||
|
|
||||||
|
//Data for testing
|
||||||
|
const test1_data = [
|
||||||
|
{
|
||||||
|
"reqgroup": "administrators",
|
||||||
|
"requser": "Bob"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"reqgroup": "administrators",
|
||||||
|
"requser": "alice"
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const test2_data = [
|
||||||
|
{
|
||||||
|
"reqowner": "dan",
|
||||||
|
"reqownertype": "user",
|
||||||
|
"reqobjname" : "message of the day",
|
||||||
|
"reqtype" : "view"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"reqowner": "administrators",
|
||||||
|
"reqownertype": "group",
|
||||||
|
"reqobjname" : "message of the day",
|
||||||
|
"reqtype" : "view"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"reqowner": "administrators",
|
||||||
|
"reqownertype": "group",
|
||||||
|
"reqobjname" : "message of the day",
|
||||||
|
"reqtype" : "modify"
|
||||||
|
}
|
||||||
|
];
|
||||||
|
const test3_data = [
|
||||||
|
{
|
||||||
|
"requser": "Alice",
|
||||||
|
"reqobject" : "message of the day"
|
||||||
|
}
|
||||||
|
];
|
||||||
|
const test4_data = [
|
||||||
|
{
|
||||||
|
"reqowner": "Dan",
|
||||||
|
"reqobjname": "message of the day",
|
||||||
|
"reqtype": "modify"
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
//Defining server location and endpoints - temporary running locally
|
||||||
|
const baseUrl = supertest("http://localhost:3000");
|
||||||
|
const apiEndAddUser = "/addusertogroup";
|
||||||
|
const apiEndAddPerm ="/addpermission";
|
||||||
|
const apiEndQueryPerm ="/querypermiss";
|
||||||
|
const apiEndTestPerm = "/testuserperm";
|
||||||
|
|
||||||
|
//Defining excpected response schemas
|
||||||
|
var schema1 = {
|
||||||
|
"id": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"groupname": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"username": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var schema2 = {
|
||||||
|
"id": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"ownertype": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"owner": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"objname": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Seting up headers
|
||||||
|
const call_api_add_user = async function (request_body) {
|
||||||
|
return baseUrl.post(apiEndAddUser)
|
||||||
|
.set('Accept', 'application/json')
|
||||||
|
.set('Content-Type', 'application/json')
|
||||||
|
.send(request_body);
|
||||||
|
}
|
||||||
|
const call_api_add_perm = async function (request_body) {
|
||||||
|
return baseUrl.post(apiEndAddPerm)
|
||||||
|
.set('Accept', 'application/json')
|
||||||
|
.set('Content-Type', 'application/json')
|
||||||
|
.send(request_body);
|
||||||
|
}
|
||||||
|
const call_api_query_perm = async function (request_body) {
|
||||||
|
return baseUrl.post(apiEndQueryPerm)
|
||||||
|
.set('Accept', 'application/json')
|
||||||
|
.set('Content-Type', 'application/json')
|
||||||
|
.send(request_body);
|
||||||
|
}
|
||||||
|
const call_api_test_perm = async function (request_body) {
|
||||||
|
return baseUrl.post(apiEndTestPerm)
|
||||||
|
.set('Accept', 'application/json')
|
||||||
|
.set('Content-Type', 'application/json')
|
||||||
|
.send(request_body);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Test 1 - adding user to group
|
||||||
|
test1_data.forEach(async function (data) {
|
||||||
|
describe(`Add user ${data.requser} to group ${data.reqgroup}`, function () {
|
||||||
|
var response;
|
||||||
|
var body;
|
||||||
|
before(async function () {
|
||||||
|
response = await call_api_add_user(data);
|
||||||
|
body = response.body;
|
||||||
|
});
|
||||||
|
//Status code is 200 - succesful
|
||||||
|
it("Status code is 200", function () {
|
||||||
|
expect(response.status).to.equal(200);
|
||||||
|
});
|
||||||
|
//Schema is valid
|
||||||
|
it("Schema is valid", function() {
|
||||||
|
expect(tv4.validate(body, schema1)).to.be.true;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
//Test 2 - adding permission to user or group
|
||||||
|
test2_data.forEach(async function (data) {
|
||||||
|
describe(`Add permission over object ${data.reqobjname} to ${data.reqownertype} ${data.reqowner}`, function () {
|
||||||
|
var response;
|
||||||
|
var body;
|
||||||
|
before(async function () {
|
||||||
|
response = await call_api_add_perm(data);
|
||||||
|
body = response.body;
|
||||||
|
});
|
||||||
|
//Status code is 200 - succesful
|
||||||
|
it("Status code is 200", function () {
|
||||||
|
expect(response.status).to.equal(200);
|
||||||
|
});
|
||||||
|
//Schema is valid
|
||||||
|
it("Schema is valid", function() {
|
||||||
|
expect(tv4.validate(body, schema2)).to.be.true;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
//Test 3 - querying permission of user over object
|
||||||
|
test3_data.forEach(async function (data) {
|
||||||
|
describe(`Querry what permissions user ${data.requser} has over object ${data.reqobject}.`, function () {
|
||||||
|
var response;
|
||||||
|
var body;
|
||||||
|
before(async function () {
|
||||||
|
response = await call_api_query_perm(data);
|
||||||
|
body = response.body;
|
||||||
|
});
|
||||||
|
//Status code is 200 - succesful
|
||||||
|
it("Status code is 200", function () {
|
||||||
|
expect(response.status).to.equal(200);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
//Test 4 - testing particular permission of user over object
|
||||||
|
test4_data.forEach(async function (data) {
|
||||||
|
describe(`Test if user ${data.reqowner} has permission ${data.reqtype} over object ${data.reqobjname}.`, function () {
|
||||||
|
var response;
|
||||||
|
var body;
|
||||||
|
before(async function () {
|
||||||
|
response = await call_api_test_perm(data);
|
||||||
|
body = response.body;
|
||||||
|
});
|
||||||
|
//Status code is 200 - succesful
|
||||||
|
it("Status code is 200", function () {
|
||||||
|
expect(response.status).to.equal(200);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
3
test/mocha.opts
Normal file
3
test/mocha.opts
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
--timeout 200000
|
||||||
|
--recursive
|
||||||
|
--reporter mochawesome
|
||||||
Reference in New Issue
Block a user