diff --git a/.gitignore b/.gitignore index c929f1a..f89f94b 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,4 @@ app/ .env node_modules/ npm-debug.log -coverage/ \ No newline at end of file +coverage/ diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 0000000..8ab3485 --- /dev/null +++ b/.jshintrc @@ -0,0 +1,3 @@ +{ + "esversion": 6 +} \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index e1c23a8..19bd3a9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,8 @@ cache: script: - npm start & - npm test +after_success: +- npm run test-with-coverage --token services: - http-server diff --git a/README.md b/README.md index 5f9f5ce..23c5dca 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,13 @@ -# Send-IT -[![Build Status](https://travis-ci.com/ipaullly/sendIT.svg?branch=ch-test-user-interactions-163458249)](https://travis-ci.com/ipaullly/sendIT) +# Send-IT +[![Build Status](https://travis-ci.com/ipaullly/sendIT.svg?branch=ch-test-user-interactions-163458249)](https://travis-ci.com/ipaullly/sendIT) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/d5026cb302e349d7b08580df620e7ecd)](https://www.codacy.com/app/ipaullly/sendIT?utm_source=github.com&utm_medium=referral&utm_content=ipaullly/sendIT&utm_campaign=Badge_Grade) +The project was done while participating in the Andela Developer Challenge simulated sprint of the application bootcamp. This is an app that allows users to create accounts and make delivery orders. The front-end was built using vanilla javaScript and consumed endpoints built with python/flask. - +The app is live on the github-pages [link](https://ipaullly.github.io/sendIT/index.html) for this repo. + ## Installation Clone the repository to your local machine ``` @@ -31,19 +33,18 @@ npm start ## Testing Tests run using **jest** and **puppeteer**. run the following command within the project folder to see the test coverage -> npm test +``` +npm test +``` +Alternatively view the [Travis-CI](https://travis-ci.com/ipaullly/sendIT) build report to view coverage. ## App features -- [ ] Users can create an account and log in. -- [ ] Users can create a parcel delivery order. -- [ ] Users can change the destination of a parcel delivery order. -- [ ] Users can cancel parcel delivery order. -- [ ] Users can see the details of a delivery order. -- [ ] Admin can change the **status** and **Current-location** of a parcel delivery order. - -## User Interface -The interface is available at -> [Welcome Page](https://ipaullly.github.io/sendIT/index.html) + - [ ] Users can create an account and log in. + - [ ] Users can create a parcel delivery order. + - [ ] Users can change the destination of a parcel delivery order. + - [ ] Users can cancel parcel delivery order. + - [ ] Users can see the details of a delivery order. + - [ ] Admin can change the **status** and **Current-location** of a parcel delivery order. ## Built Using 1.HTML diff --git a/about.html b/about.html index 9b42377..2649b14 100644 --- a/about.html +++ b/about.html @@ -54,8 +54,8 @@

Behold our presence on social platforms

- \ No newline at end of file + diff --git a/build/main.bundle.js b/build/main.bundle.js deleted file mode 100644 index 051e6fd..0000000 --- a/build/main.bundle.js +++ /dev/null @@ -1,20 +0,0 @@ -'use strict'; - -document.getElementById('signupbutton').addEventListener('click', signUp); - -function signUp() { - var email = document.getElementById('signemail').nodeValue; - var password = document.getElementById('signpassword').nodeValue; - - fetch('https://sendit-versiontwo.herokuapp.com/auth/v2/signup', { - method: 'POST', - headers: { - 'Content-type': 'application/json' - }, - body: JSON.stringify({ email: email, password: password }) - }).then(function (res) { - return res.json(); - }).then(function (data) { - return console.log(data); - }); -} diff --git a/config.json b/config.json index b6088ac..bc6f2fe 100644 --- a/config.json +++ b/config.json @@ -1,11 +1,7 @@ { - "testMatch": ["/tests/unit/*.js"], - "setupFiles": ["/tests/setup.js"], - "transform": {".*": "/node_modules/babel-jest"}, - "moduleFileExtensions": ["js"], "collectCoverageFrom": [ - "src/*.js", - "!src/main.js" + "js/*.{js,jsx}", + "!**/node_modules/**", + "!**/vendor/**" ] - } - \ No newline at end of file +} \ No newline at end of file diff --git a/css/style.css b/css/style.css index 593640d..d08083e 100644 --- a/css/style.css +++ b/css/style.css @@ -114,6 +114,7 @@ header a:hover{ /* squares */ #squares{ margin-top: 20px; + padding-bottom: 6rem; } #squares .box{ @@ -228,4 +229,4 @@ span.assord { display: block; float: none; } -} \ No newline at end of file +} diff --git a/index.html b/index.html index 8608223..599fc0e 100644 --- a/index.html +++ b/index.html @@ -27,7 +27,7 @@

Send-IT

Welcome to Send-IT

-

Conviniently place an order with the relevant details. We strive to ensure that your package arrives to the destination with haste.

+

Conveniently place an order with the relevant details. We strive to ensure that your package arrives to the destination with haste.

@@ -52,8 +52,8 @@

Sign up in under a minute

-

Send-IT, Copyright © 2019

+

Send-IT, Copyright © 2020

- \ No newline at end of file + diff --git a/js/main.js b/js/main.js index 5c57651..7cd50c4 100644 --- a/js/main.js +++ b/js/main.js @@ -1,13 +1,13 @@ -const registerButton = document.getElementById('signUpButton'); -const loginButton = document.getElementById('logInButton'); -const createOrderButton = document.getElementById('createParcel'); -const userOrderButton = document.getElementById('userOrders'); -const singleParcelIdButton = document.getElementById('singleordersearch'); -const updateDestinationButton = document.getElementById('updateorderdestination'); -const cancelOrderButton = document.getElementById('cancelorderbut'); -const allOrdersButton = document.getElementById('allordersbut'); -const updateLocationButton = document.getElementById('updatelocationbut'); -const changeStatusButton = document.getElementById('changestatusbut'); +const registerButton = document.getElementById("signUpButton"); +const loginButton = document.getElementById("logInButton"); +const createOrderButton = document.getElementById("createParcel"); +const userOrderButton = document.getElementById("userOrders"); +const singleParcelIdButton = document.getElementById("singleordersearch"); +const updateDestinationButton = document.getElementById("updateorderdestination"); +const cancelOrderButton = document.getElementById("cancelorderbut"); +const allOrdersButton = document.getElementById("allordersbut"); +const updateLocationButton = document.getElementById("updatelocationbut"); +const changeStatusButton = document.getElementById("changestatusbut"); function decodeJwt (token) { let base64Url = token.split('.')[1]; @@ -16,36 +16,36 @@ function decodeJwt (token) { } function loginResponse(){ - let response = sessionStorage.getItem( 'loginResponse' ); + let response = sessionStorage.getItem( "loginResponse" ); let output = `

${response}

`; - return document.getElementById('redirectedLogIn').innerHTML = output; + return document.getElementById("redirectedLogIn").innerHTML = output; } function signUp(){ let output; - fetch('https://sendit-versiontwo.herokuapp.com/auth/v2/signup', { - mode: 'cors', - method: 'POST', + fetch("https://sendit-versiontwo.herokuapp.com/auth/v2/signup", { + mode: "cors", + method: "POST", headers: { Accept: "application/json", "Content-Type": "application/json; charset=UTF-8" }, body: JSON.stringify({ - email: document.getElementById('signEmail').value, - password: document.getElementById('signPassword').value + email: document.getElementById("signEmail").value, + password: document.getElementById("signPassword").value }) }) .then((res) => { if (res.ok){ return res.json().then((data) => { output = `

${data.message}

`; - return document.getElementById('signUpResponse').innerHTML = output; + return document.getElementById("signUpResponse").innerHTML = output; }); } if (res.status == 400){ return res.json().then((data) => { output = `

${data.message}

`; - return document.getElementById('signUpResponse').innerHTML = output; + return document.getElementById("signUpResponse").innerHTML = output; }); } }); @@ -53,30 +53,29 @@ function signUp(){ function logIn(){ let output; - fetch('https://sendit-versiontwo.herokuapp.com/auth/v2/login', { - mode: 'cors', - method: 'POST', + fetch("https://sendit-versiontwo.herokuapp.com/auth/v2/login", { + mode: "cors", + method: "POST", headers: { Accept: "application/json", "Content-Type": "application/json; charset=UTF-8" }, body: JSON.stringify({ - email: document.getElementById('logInEmail').value, - password: document.getElementById('logInPass').value + email: document.getElementById("logInEmail").value, + password: document.getElementById("logInPass").value }) }) .then((res) => { if (res.ok){ return res.json().then((myJson) => { - sessionStorage.setItem( 'token', myJson.data ); - sessionStorage.setItem( 'loginResponse', myJson.message ); + sessionStorage.setItem( "token", myJson.data ); + sessionStorage.setItem( "loginResponse", myJson.message ); - let token = sessionStorage.getItem( 'token' ).replace("'", ""); + let token = sessionStorage.getItem( "token" ).replace("'", ""); token = token.substr(0, token.length-1); let decodedToken = decodeJwt(token); decodedTokenId = Object.values(decodedToken)[2]; - console.log(decodedTokenId); - if (decodedTokenId == 1){ + if (decodedTokenId === 1){ redirect: window.location.assign("./orders_display_admin.html"); }else{ redirect: window.location.assign("./orders_display_users.html"); @@ -86,13 +85,13 @@ function logIn(){ if (res.status == 400){ return res.json().then((myJson) => { output = `

${myJson.message}

`; - return document.getElementById('logInResponse').innerHTML = output; + return document.getElementById("logInResponse").innerHTML = output; }); } if (res.status == 401){ return res.json().then((myJson) => { output = `

${myJson.message}

`; - return document.getElementById('logInResponse').innerHTML = output; + return document.getElementById("logInResponse").innerHTML = output; }); } }); @@ -100,11 +99,11 @@ function logIn(){ function createParcel(){ let output; - let token = sessionStorage.getItem( 'token' ).replace("'", ""); + let token = sessionStorage.getItem( "token" ).replace("'", ""); token = token.substr(0, token.length-1); - fetch('https://sendit-versiontwo.herokuapp.com/api/v2/parcels', { - mode: 'cors', - method: 'POST', + fetch("https://sendit-versiontwo.herokuapp.com/api/v2/parcels", { + mode: "cors", + method: "POST", headers: { Accept: "application/json", "Access-Control-Allow-Origin": null, @@ -112,37 +111,37 @@ function createParcel(){ "Authorization": "Bearer " + token }, body: JSON.stringify({ - item: document.getElementById('parcelName').value, - pickup: document.getElementById('parcelPickUp').value, - dest: document.getElementById('parcelDestination').value, - pricing: document.getElementById('parcelPrice').value, + item: document.getElementById("parcelName").value, + pickup: document.getElementById("parcelPickUp").value, + dest: document.getElementById("parcelDestination").value, + pricing: document.getElementById("parcelPrice").value, }) }) .then((res) => { if (res.ok){ return res.json().then((myJson) => { let output = `

${myJson.message}

`; - return document.getElementById('redirectedLogIn').innerHTML = output; + return document.getElementById("redirectedLogIn").innerHTML = output; }) } if (res.status == 400){ return res.json().then((myJson) => { - output = `

${myJson.message}

`; - return document.getElementById('redirectedLogIn').innerHTML = output; + output = `

${myJson.message}

`; + return document.getElementById("redirectedLogIn").innerHTML = output; }) } }); } -let orderList = ''; +let orderList = ""; function retrieveUserOrders(){ - let token = sessionStorage.getItem( 'token' ).replace("'", ""); + let token = sessionStorage.getItem( "token" ).replace("'", ""); token = token.substr(0, token.length-1); let decodedToken = decodeJwt(token); decodedTokenId = Object.values(decodedToken)[2]; - fetch('https://sendit-versiontwo.herokuapp.com/api/v2/users/'+decodedTokenId+'/parcels', { - mode: 'cors', - method: 'GET', + fetch("https://sendit-versiontwo.herokuapp.com/api/v2/users/"+decodedTokenId+"/parcels", { + mode: "cors", + method: "GET", headers: { Accept: "application/json", "Access-Control-Allow-Origin": null, @@ -167,16 +166,15 @@ function retrieveUserOrders(){ `; }); let message = `

${myJson.message}

`; - return document.getElementById('redirectedLogIn').innerHTML = message, - document.getElementById('singleUserOrders').innerHTML = output, orderList; - - }) + return document.getElementById("redirectedLogIn").innerHTML = message, + document.getElementById("singleUserOrders").innerHTML = output, orderList; + }); } if (res.status == 400){ return res.json().then((myJson) => { output = `

${myJson.message}

`; - return document.getElementById('redirectedLogIn').innerHTML = output; - }) + return document.getElementById("redirectedLogIn").innerHTML = output; + }); } }); @@ -192,11 +190,11 @@ function hasNumber(myString) { function singleParcelSearch(){ let output; - let orderId = document.getElementById('parcelorderid').value; + let orderId = document.getElementById("parcelorderid").value; if (hasNumber(orderId)) { - fetch('https://sendit-versiontwo.herokuapp.com/api/v2/parcels/'+orderId+'', { - mode: 'cors', - method: 'GET', + fetch("https://sendit-versiontwo.herokuapp.com/api/v2/parcels/"+orderId+"", { + mode: "cors", + method: "GET", headers: { Accept: "application/json", "Access-Control-Allow-Origin": null, @@ -207,10 +205,9 @@ function singleParcelSearch(){ if (res.ok){ return res.json().then((myJson) => { orderList = myJson.order; - output += `
  • -

    ${orderList.item_name}

    +

    ${orderList.item_name}

    Present Location: ${orderList.current_location}

    Destination: ${orderList.destination}

    Order Id: ${orderList.order_id}

    @@ -218,37 +215,37 @@ function singleParcelSearch(){
  • `; let message = `

    ${myJson.message}

    `; - return document.getElementById('redirectedorderpage').innerHTML = message, - document.getElementById('singleorderinformation').innerHTML = output; + return document.getElementById("redirectedorderpage").innerHTML = message, + document.getElementById("singleorderinformation").innerHTML = output; }); } if (res.status == 400){ return res.json().then((myJson) => { output = `

    ${myJson.message}

    `; - return document.getElementById('redirectedorderpage').innerHTML = output; + return document.getElementById("redirectedorderpage").innerHTML = output; }); } }); } else { output = `

    Order Id can only be numeric

    `; - return document.getElementById('redirectedorderpage').innerHTML = output; + return document.getElementById("redirectedorderpage").innerHTML = output; } } function updateParcelDestination (){ let output; - let orderId = document.getElementById('parcelorderid').value; - let updateDestination = document.getElementById('parcelupdatedestination').value; + let orderId = document.getElementById("parcelorderid").value; + let updateDestination = document.getElementById("parcelupdatedestination").value; if (hasNumber(updateDestination)){ output = `

    Order destination can only be a string

    `; - return document.getElementById('redirectedorderpage').innerHTML = output; + return document.getElementById("redirectedorderpage").innerHTML = output; } else{ - let token = sessionStorage.getItem( 'token' ).replace("'", ""); + let token = sessionStorage.getItem( "token" ).replace("'", ""); token = token.substr(0, token.length-1); - fetch('https://sendit-versiontwo.herokuapp.com/api/v2/parcels/'+orderId+'/destination', { - mode: 'cors', - method: 'PUT', + fetch("https://sendit-versiontwo.herokuapp.com/api/v2/parcels/"+orderId+"/destination", { + mode: "cors", + method: "PUT", headers: { Accept: "application/json", "Access-Control-Allow-Origin": null, @@ -263,20 +260,19 @@ function updateParcelDestination (){ .then((res) => { if (res.ok){ return res.json().then((myJson) => { - let newDestination = myJson.data; - + let newDestination = myJson.data; output += `

    Destination: ${newDestination.updated_destination}

    `; - let message = `

    ${myJson.message}

    `; - return document.getElementById('redirectedorderpage').innerHTML = message, - document.getElementById('generateupdatedestination').innerHTML = output; + let message = `

    ${myJson.message}

    `; + return document.getElementById("redirectedorderpage").innerHTML = message, + document.getElementById("generateupdatedestination").innerHTML = output; }); } if (res.status == 400){ return res.json().then((myJson) => { output = `

    ${myJson.message}

    `; - return document.getElementById('redirectedorderpage').innerHTML = output; + return document.getElementById("redirectedorderpage").innerHTML = output; }); } }); @@ -285,12 +281,12 @@ function updateParcelDestination (){ function cancelOrder(){ let output; - let orderId = document.getElementById('parcelorderid').value; - let token = sessionStorage.getItem( 'token' ).replace("'", ""); + let orderId = document.getElementById("parcelorderid").value; + let token = sessionStorage.getItem( "token" ).replace("'", ""); token = token.substr(0, token.length-1); - fetch('https://sendit-versiontwo.herokuapp.com/api/v2/parcels/'+orderId+'/cancel', { - mode: 'cors', - method: 'PUT', + fetch("https://sendit-versiontwo.herokuapp.com/api/v2/parcels/"+orderId+"/cancel", { + mode: "cors", + method: "PUT", headers: { Accept: "application/json", "Access-Control-Allow-Origin": null, @@ -304,24 +300,24 @@ function cancelOrder(){ output += `

    Status: cancelled

    `; - let message = `

    ${myJson.message}

    `; - return document.getElementById('redirectedorderpage').innerHTML = message, - document.getElementById('generatestatus').innerHTML = output; + let message = `

    ${myJson.message}

    `; + return document.getElementById("redirectedorderpage").innerHTML = message, + document.getElementById("generatestatus").innerHTML = output; }); } if (res.status == 400){ return res.json().then((myJson) => { output = `

    ${myJson.message}

    `; - return document.getElementById('redirectedorderpage').innerHTML = output; + return document.getElementById("redirectedorderpage").innerHTML = output; }); } }); } function retrieveAllOrders(){ let output; - fetch('https://sendit-versiontwo.herokuapp.com/api/v2/parcels', { - mode: 'cors', - method: 'GET', + fetch("https://sendit-versiontwo.herokuapp.com/api/v2/parcels", { + mode: "cors", + method: "GET", headers: { Accept: "application/json", "Access-Control-Allow-Origin": null, @@ -334,7 +330,7 @@ function retrieveAllOrders(){ orderList = myJson.data; orderList.forEach((order) => { output += ` -
  • +
  • ${order.item_name}

    Present Location: ${order.current_location}

    Destination: ${order.destination}

    @@ -344,14 +340,14 @@ function retrieveAllOrders(){ `; }); let message = `

    ${myJson.message}

    `; - return document.getElementById('redirectedLogIn').innerHTML = message, - document.getElementById('alldeliveryorders').innerHTML = output; + return document.getElementById("redirectedLogIn").innerHTML = message, + document.getElementById("alldeliveryorders").innerHTML = output; }); } if (res.status == 400){ return res.json().then((myJson) => { output = `

    ${myJson.message}

    `; - return document.getElementById('redirectedLogIn').innerHTML = output; + return document.getElementById("redirectedLogIn").innerHTML = output; }); } }); @@ -359,18 +355,18 @@ function retrieveAllOrders(){ function presentLocation(){ let output; - let orderId = document.getElementById('deliveryorderid').value; - let presentDestination = document.getElementById('parcelpresentlocation').value; + let orderId = document.getElementById("deliveryorderid").value; + let presentDestination = document.getElementById("parcelpresentlocation").value; if (hasNumber(presentDestination)){ output = `

    Order destination can only be a string

    `; - return document.getElementById('redirectedLogIn').innerHTML = output; + return document.getElementById("redirectedLogIn").innerHTML = output; } else{ - let token = sessionStorage.getItem( 'token' ).replace("'", ""); + let token = sessionStorage.getItem( "token" ).replace("'", ""); token = token.substr(0, token.length-1); - fetch('https://sendit-versiontwo.herokuapp.com/api/v2/parcels/'+orderId+'/presentLocation', { - mode: 'cors', - method: 'PUT', + fetch("https://sendit-versiontwo.herokuapp.com/api/v2/parcels/"+orderId+"/presentLocation", { + mode: "cors", + method: "PUT", headers: { Accept: "application/json", "Access-Control-Allow-Origin": null, @@ -390,8 +386,8 @@ function presentLocation(){ output = `

    Destination: ${newDestination}

    `; - let message = `

    ${myJson.message}

    `; - return document.getElementById('redirectedLogIn').innerHTML = message; + let message = `

    ${myJson.message}

    `; + return document.getElementById("redirectedLogIn").innerHTML = message; //document.getElementById('generatepresentdestination').innerHTML = output; }); @@ -399,7 +395,7 @@ function presentLocation(){ if (res.status == 400){ return res.json().then((myJson) => { output = `

    ${myJson.message}

    `; - return document.getElementById('redirectedLogIn').innerHTML = output; + return document.getElementById("redirectedLogIn").innerHTML = output; }); } }); @@ -407,18 +403,18 @@ function presentLocation(){ } function changeStatus(){ let output; - let orderId = document.getElementById('deliveryorderid').value; - let changeStatus = document.getElementById('changeparcelstatus').value; + let orderId = document.getElementById("deliveryorderid").value; + let changeStatus = document.getElementById("changeparcelstatus").value; if (hasNumber(changeStatus)){ output = `

    status can only be a string

    `; - return document.getElementById('redirectedLogIn').innerHTML = output; + return document.getElementById("redirectedLogIn").innerHTML = output; } else{ - let token = sessionStorage.getItem( 'token' ).replace("'", ""); + let token = sessionStorage.getItem( "token" ).replace("'", ""); token = token.substr(0, token.length-1); - fetch('https://sendit-versiontwo.herokuapp.com/api/v2/parcels/'+orderId+'/status', { - mode: 'cors', - method: 'PUT', + fetch("https://sendit-versiontwo.herokuapp.com/api/v2/parcels/"+orderId+"/status", { + mode: "cors", + method: "PUT", headers: { Accept: "application/json", "Access-Control-Allow-Origin": null, @@ -428,52 +424,50 @@ function changeStatus(){ body: JSON.stringify({ status: changeStatus }) - }) .then((res) => { if (res.ok){ return res.json().then((myJson) => { - let message = `

    ${myJson.message}

    `; - return document.getElementById('redirectedLogIn').innerHTML = message; - + let message = `

    ${myJson.message}

    `; + return document.getElementById("redirectedLogIn").innerHTML = message; }); } if (res.status == 400){ return res.json().then((myJson) => { output = `

    ${myJson.message}

    `; - return document.getElementById('redirectedLogIn').innerHTML = output; + return document.getElementById("redirectedLogIn").innerHTML = output; }); } }); } } if (registerButton){ - registerButton.addEventListener('click', signUp); + registerButton.addEventListener("click", signUp); } if (loginButton){ - loginButton.addEventListener('click', logIn); + loginButton.addEventListener("click", logIn); } if (createOrderButton){ - createOrderButton.addEventListener('click', createParcel); + createOrderButton.addEventListener("click", createParcel); } if (userOrderButton){ - userOrderButton.addEventListener('click', retrieveUserOrders); + userOrderButton.addEventListener("click", retrieveUserOrders); } if (singleParcelIdButton){ - singleParcelIdButton.addEventListener('click', singleParcelSearch); + singleParcelIdButton.addEventListener("click", singleParcelSearch); } if (updateDestinationButton){ - updateDestinationButton.addEventListener('click', updateParcelDestination); + updateDestinationButton.addEventListener("click", updateParcelDestination); } if (cancelOrderButton){ - cancelOrderButton.addEventListener('click', cancelOrder); + cancelOrderButton.addEventListener("click", cancelOrder); } if (allOrdersButton){ - allOrdersButton.addEventListener('click', retrieveAllOrders); + allOrdersButton.addEventListener("click", retrieveAllOrders); } if (updateLocationButton){ - updateLocationButton.addEventListener('click', presentLocation); + updateLocationButton.addEventListener("click", presentLocation); } if (changeStatusButton){ - changeStatusButton.addEventListener('click', changeStatus); + changeStatusButton.addEventListener("click", changeStatus); } \ No newline at end of file diff --git a/login.html b/login.html index 68523f5..6716043 100644 --- a/login.html +++ b/login.html @@ -56,8 +56,8 @@

    Login

    -

    Send-IT, Copyright © 2019

    +

    Send-IT, Copyright © 2020

    - \ No newline at end of file + diff --git a/order_display_page.html b/order_display_page.html index f4b18a3..1bf59f7 100644 --- a/order_display_page.html +++ b/order_display_page.html @@ -28,17 +28,17 @@

    SingleOrderdetails

    @@ -48,7 +48,7 @@

    Order

    • -

      Enter Order ID and Click 'Search' to display information on single order.

      +

      Enter Order ID and Click 'Search' to display information on single order.

      Parcel Name

      Order id: Parcel ID

      Sent from: Pickup Location

      @@ -62,8 +62,8 @@

      Parcel Name

      -

      Send-IT, Copyright © 2019

      +

      Send-IT, Copyright © 2020

      - \ No newline at end of file + diff --git a/orders_display_admin.html b/orders_display_admin.html index e874eb3..4487e07 100644 --- a/orders_display_admin.html +++ b/orders_display_admin.html @@ -28,20 +28,20 @@

      AdminOrders List

      @@ -77,8 +77,8 @@

      Orders

      -

      Send-IT, Copyright © 2019

      +

      Send-IT, Copyright © 2020

      - \ No newline at end of file + diff --git a/package.json b/package.json index 4acf731..02f3a30 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "scripts": { "babel": "babel --presets es2015 js/main.js -o build/main.bundle.js", "start": "http-server", - "test": "jest" + "test": "jest", + "test-with-coverage": "jest --config config.json --coverage && cat ./coverage/lcov.info | codacy-coverage" }, "repository": { "type": "git", @@ -29,5 +30,11 @@ "http-server": "^0.11.1", "jest": "^23.6.0", "puppeteer": "^1.11.0" + }, + "dependencies": { + "codacy-coverage": "^3.4.0" + }, + "directories": { + "test": "test" } } diff --git a/register_page.html b/register_page.html index 2a5a014..a0157bb 100644 --- a/register_page.html +++ b/register_page.html @@ -59,8 +59,8 @@

      REGISTER TO SEND-IT

      -

      Send-IT, Copyright © 2019

      +

      Send-IT, Copyright © 2020

      - \ No newline at end of file + diff --git a/test/index.spec.js b/test/index.spec.js index dd1c766..35ca889 100644 --- a/test/index.spec.js +++ b/test/index.spec.js @@ -1,6 +1,6 @@ import puppeteer from "puppeteer"; -const localUrlBase = 'http://127.0.0.1:8080'; +const localUrlBase = "http://127.0.0.1:8080"; const routes = { public: { register: `${localUrlBase}/register_page`, @@ -14,31 +14,28 @@ const routes = { adminPage: `${localUrlBase}/orders_display_admin` } }; - const user = { - email: 'paul@hotmail.com', - emailFail: 'paulhotmail.com', - password: 'Tykenyke', - passwordFail: 'tykenyke' + email: "paul@hotmail.com", + emailFail: "paulhotmail.com", + password: "Tykenyke", + passwordFail: "tykenyke" }; const admin = { - email: 'Davidtroy@sendIT.org', - password: 'Tykenyke' + email: "Davidtroy@sendIT.org", + password: "Tykenyke" }; const parcel = { - name: 'Twenty Heifer Skins', - pickup: 'Kisumu', - dest: 'Turkwell', - price: '6000' -} + name: "Twenty Heifer Skins", + pickup: "Kisumu", + dest: "Turkwell", + price: "6000" +}; const dummyParcel = { - name: ' ', - pickup: ' ', - dest: ' ', - price: ' ' -} - - + name: " ", + pickup: " ", + dest: " ", + price: " " +}; let browser; let page; @@ -47,117 +44,183 @@ beforeAll(async () => { page = await browser.newPage(); }); -describe('Registration', () => { - test('generation of response', async () => { - await page.goto(routes.public.register) - await page.waitForSelector('[data-testid="registerForm"]') - await page.click('[data-testid="emailInput"]') - await page.type('[data-testid="emailInput"]', user.email) - await page.click('[data-testid="passwordInput"]') - await page.type('[data-testid="passwordInput"]', user.password) - await page.click('[data-testid="registerSubmitButton"]') - await page.waitForSelector('[data-testid="responseBox"]') - }); - test('duplicate email response message', async () => { - await page.type('[data-testid="emailInput"]', user.emailFail) - await page.click('[data-testid="passwordInput"]') - await page.type('[data-testid="passwordInput"]', user.passwordFail) - await page.click('[data-testid="registerSubmitButton"]') - await page.waitForSelector('[data-testid="responseBox"]') - const duplicateEmail = await page.$eval('[data-testid="responseBox"]', el => el.textContent) - expect(duplicateEmail).toEqual("User with the email already exists") - }); - test('wrong email format message', async () => { - await page.goto(routes.public.register) - await page.waitForSelector('[data-testid="registerForm"]') - await page.click('[data-testid="emailInput"]') - await page.type('[data-testid="emailInput"]', user.emailFail) - await page.click('[data-testid="passwordInput"]') - await page.type('[data-testid="passwordInput"]', user.password) - await page.click('[data-testid="registerSubmitButton"]') - await page.waitForSelector('[data-testid="responseBox"]') - const wrongEmailFormat = await page.$eval('[data-testid="responseBox"]', el => el.textContent) - expect(wrongEmailFormat).toEqual("Invalid email format") +describe("Registration", () => { + test("generation of response", async () => { + await page.goto(routes.public.register); + await page.waitForSelector('[data-testid="registerForm"]'); + await page.click('[data-testid="emailInput"]'); + await page.type('[data-testid="emailInput"]', user.email); + await page.click('[data-testid="passwordInput"]'); + await page.type('[data-testid="passwordInput"]', user.password); + await page.click('[data-testid="registerSubmitButton"]'); + await page.waitForSelector('[data-testid="responseBox"]'); + }); + test("duplicate email response message", async () => { + await page.type('[data-testid="emailInput"]', user.emailFail); + await page.click('[data-testid="passwordInput"]'); + await page.type('[data-testid="passwordInput"]', user.passwordFail); + await page.click('[data-testid="registerSubmitButton"]'); + await page.waitForSelector('[data-testid="responseBox"]'); + const duplicateEmail = await page.$eval('[data-testid="responseBox"]', el => el.textContent); + expect(duplicateEmail).toEqual("User with the email already exists"); + }); + test("wrong email format message", async () => { + await page.goto(routes.public.register); + await page.waitForSelector('[data-testid="registerForm"]'); + await page.click('[data-testid="emailInput"]'); + await page.type('[data-testid="emailInput"]', user.emailFail); + await page.click('[data-testid="passwordInput"]'); + await page.type('[data-testid="passwordInput"]', user.password); + await page.click('[data-testid="registerSubmitButton"]'); + await page.waitForSelector('[data-testid="responseBox"]'); + const wrongEmailFormat = await page.$eval('[data-testid="responseBox"]', el => el.textContent); + expect(wrongEmailFormat).toEqual("Invalid email format"); }); }); -describe('Login', () => { - test('throws error message for invalid email format', async () => { - await page.goto(routes.public.login) - await page.waitForSelector('[data-testid="logInForm"]') - await page.click('[data-testid="logInEmailInput"]') - await page.type('[data-testid="logInEmailInput"]', user.emailFail) - await page.click('[data-testid="logInPasswordInput"]') - await page.type('[data-testid="logInPasswordInput"]', user.password) - await page.click('[data-testid="loginSubmitButton"]') - await page.waitForSelector('[data-testid="logInResponseBox"]') - const errorMessage = await page.$eval('[data-testid="logInResponseBox"]', el => el.textContent) - expect(errorMessage).toEqual("Invalid email. please check the format") +describe("Login", () => { + test("throws error message for invalid email format", async () => { + await page.goto(routes.public.login); + await page.waitForSelector('[data-testid="logInForm"]'); + await page.click('[data-testid="logInEmailInput"]'); + await page.type('[data-testid="logInEmailInput"]', user.emailFail); + await page.click('[data-testid="logInPasswordInput"]'); + await page.type('[data-testid="logInPasswordInput"]', user.password); + await page.click('[data-testid="loginSubmitButton"]'); + await page.waitForSelector('[data-testid="logInResponseBox"]'); + const errorMessage = await page.$eval('[data-testid="logInResponseBox"]', el => el.textContent); + expect(errorMessage).toEqual("Invalid email. please check the format"); }); - test('throws error message for wrong login credentials', async () => { - await page.goto(routes.public.login) - await page.waitForSelector('[data-testid="logInForm"]') - await page.click('[data-testid="logInEmailInput"]') - await page.type('[data-testid="logInEmailInput"]', user.email) - await page.click('[data-testid="logInPasswordInput"]') - await page.type('[data-testid="logInPasswordInput"]', ' ') - await page.click('[data-testid="loginSubmitButton"]') - await page.waitForSelector('[data-testid="logInResponseBox"]') - const errorMessage = await page.$eval('[data-testid="logInResponseBox"]', el => el.textContent) - expect(errorMessage).toEqual("incorrect login credentials. please enter details again") + test("throws error message for wrong login credentials", async () => { + await page.goto(routes.public.login); + await page.waitForSelector('[data-testid="logInForm"]'); + await page.click('[data-testid="logInEmailInput"]'); + await page.type('[data-testid="logInEmailInput"]', user.email); + await page.click('[data-testid="logInPasswordInput"]'); + await page.type('[data-testid="logInPasswordInput"]', " "); + await page.click('[data-testid="loginSubmitButton"]'); + await page.waitForSelector('[data-testid="logInResponseBox"]'); + const errorMessage = await page.$eval('[data-testid="logInResponseBox"]', el => el.textContent); + expect(errorMessage).toEqual("incorrect login credentials. please enter details again"); }); - test('successful login triggers a redirect to user account', async () => { - await page.goto(routes.public.login) - await page.waitForSelector('[data-testid="logInForm"]') - await page.click('[data-testid="logInEmailInput"]') - await page.type('[data-testid="logInEmailInput"]', user.email) - await page.click('[data-testid="logInPasswordInput"]') - await page.type('[data-testid="logInPasswordInput"]', user.password) - await page.click('[data-testid="loginSubmitButton"]') - await page.waitForNavigation({waitUntil: "networkidle2"}) - await page.waitForSelector('[data-testid="logInRedirectResponse"]') - const duplicateEmail = await page.$eval('[data-testid="logInRedirectResponse"]', el => el.textContent) - expect(duplicateEmail).toEqual("Successfully logged in") + test("successful login triggers a redirect to user account", async () => { + await page.goto(routes.public.login); + await page.waitForSelector('[data-testid="logInForm"]'); + await page.click('[data-testid="logInEmailInput"]'); + await page.type('[data-testid="logInEmailInput"]', user.email); + await page.click('[data-testid="logInPasswordInput"]'); + await page.type('[data-testid="logInPasswordInput"]', user.password); + await page.click('[data-testid="loginSubmitButton"]'); + await page.waitForNavigation({waitUntil: "networkidle2"}); + await page.waitForSelector('[data-testid="logInRedirectResponse"]'); + const duplicateEmail = await page.$eval('[data-testid="logInRedirectResponse"]', el => el.textContent); + expect(duplicateEmail).toEqual("Successfully logged in"); }); - test('successful login triggers a redirect to admin account', async () => { - await page.goto(routes.public.login) - await page.waitForSelector('[data-testid="logInForm"]') - await page.click('[data-testid="logInEmailInput"]') - await page.type('[data-testid="logInEmailInput"]', admin.email) - await page.click('[data-testid="logInPasswordInput"]') - await page.type('[data-testid="logInPasswordInput"]', admin.password) - await page.click('[data-testid="loginSubmitButton"]') - await page.waitForNavigation({waitUntil: "networkidle2"}) - await page.waitForSelector('[data-testid="allOrdersAdmin"]') - const duplicateEmail = await page.$eval('[data-testid="allOrdersAdmin"]', el => el.textContent) - expect(duplicateEmail).toEqual("View all Orders") + test("successful login triggers a redirect to admin account", async () => { + await page.goto(routes.public.login); + await page.waitForSelector('[data-testid="logInForm"]'); + await page.click('[data-testid="logInEmailInput"]'); + await page.type('[data-testid="logInEmailInput"]', admin.email); + await page.click('[data-testid="logInPasswordInput"]'); + await page.type('[data-testid="logInPasswordInput"]', admin.password); + await page.click('[data-testid="loginSubmitButton"]'); + await page.waitForNavigation({waitUntil: "networkidle2"}); + await page.waitForSelector('[data-testid="allOrdersAdmin"]'); + const duplicateEmail = await page.$eval('[data-testid="allOrdersAdmin"]', el => el.textContent); + expect(duplicateEmail).toEqual("View all Orders"); }); }); -describe('User dashboard', () => { - - test('assert user can view all orders they make', async () => { - await page.goto(routes.public.login) - await page.waitForSelector('[data-testid="logInForm"]') - await page.click('[data-testid="logInEmailInput"]') - await page.type('[data-testid="logInEmailInput"]', user.email) - await page.click('[data-testid="logInPasswordInput"]') - await page.type('[data-testid="logInPasswordInput"]', user.password) - await page.click('[data-testid="loginSubmitButton"]') - await page.waitForNavigation({waitUntil: "networkidle2"}) - await page.waitForSelector('[data-testid="viewUserOrderButton"]') - await page.click('[data-testid="viewUserOrderButton"]') - await page.waitForSelector('[data-testid="generatedUserOrders"]') +describe("User dashboard", () => { + test("assert user can view all orders they make", async () => { + await page.goto(routes.public.login); + await page.waitForSelector('[data-testid="logInForm"]'); + await page.click('[data-testid="logInEmailInput"]'); + await page.type('[data-testid="logInEmailInput"]', user.email); + await page.click('[data-testid="logInPasswordInput"]'); + await page.type('[data-testid="logInPasswordInput"]', user.password); + await page.click('[data-testid="loginSubmitButton"]'); + await page.waitForNavigation({waitUntil: "networkidle2"}); + await page.waitForSelector('[data-testid="viewUserOrderButton"]'); + await page.click('[data-testid="viewUserOrderButton"]'); + await page.waitForSelector('[data-testid="generatedUserOrders"]'); }); - - test('assert user can redirect to single order info page', async () => { - await page.waitForSelector('[data-testid="generatedUserOrders"]') - await page.click('[data-testid="generatedUserOrders"]') - await page.waitForNavigation({waitUntil: "networkidle2"}) - await page.waitForSelector('[data-testid="singleOrderPage"]') + test("assert user can submit delivery order fields", async () => { + await page.waitForSelector('[data-testid="parcelCreationForm"]'); + await page.click('[data-testid="orderNameInput"]'); + await page.type('[data-testid="orderNameInput"]', dummyParcel.name); + await page.click('[data-testid="orderPickUpInput"]'); + await page.type('[data-testid="orderPickUpInput"]', parcel.pickup); + await page.click('[data-testid="orderDestInput"]'); + await page.type('[data-testid="orderDestInput"]', parcel.dest); + await page.click('[data-testid="orderPriceInput"]'); + await page.type('[data-testid="orderPriceInput"]', parcel.price); + await page.click('[data-testid="createParcelSubmitButton"]'); + await page.waitForSelector('[data-testid="createOrderFailResponse"]'); }); - + test("assert user can redirect to single order info page", async () => { + await page.waitForSelector('[data-testid="generatedUserOrders"]'); + await page.click('[data-testid="generatedUserOrders"]'); + await page.waitForNavigation({waitUntil: "networkidle2"}); + await page.waitForSelector('[data-testid="singleOrderPage"]'); + }); + test("assert user can retrieve an order by id", async () => { + await page.waitForSelector('[data-testid="singleOrderForm"]'); + await page.click('[data-testid="orderIdInput"]'); + await page.type('[data-testid="orderIdInput"]', "3"); + await page.click('[data-testid="viewOrderInfo"]'); + await page.waitForSelector('[data-testid="returnedOrder"]'); + const orderHeading = await page.$eval('[data-testid="returnedOrder"]', el => el.textContent); + expect(orderHeading).toEqual("Three Harry Potter Books"); + }); + test("assert user can update order destination", async () => { + await page.waitForSelector('[data-testid="singleOrderForm"]'); + await page.click('[data-testid="updateOrderDestination"]'); + await page.type('[data-testid="updateOrderDestination"]', "Nakuru"); + await page.click('[data-testid="submitNewDestination"]'); + await page.waitForSelector('[data-testid="updatedDestination"]'); + const updatedOrderDestination = await page.$eval('[data-testid="updatedDestination"]', el => el.textContent); + expect(updatedOrderDestination).toEqual("New destination updated"); + }); + test("assert user can cancel order", async () => { + await page.waitForSelector('[data-testid="singleOrderForm"]'); + await page.click('[data-testid="cancelOrder"]'); + await page.waitForSelector('[data-testid="cancelResponse"]'); + const cancelOrderResponse = await page.$eval('[data-testid="cancelResponse"]', el => el.textContent); + expect(cancelOrderResponse).toEqual("order is cancelled"); + }); +}); +describe("Admin dashboard", () => { + test("assert admin can view all orders made by all users", async () => { + await page.goto(routes.public.login); + await page.waitForSelector('[data-testid="logInForm"]'); + await page.click('[data-testid="logInEmailInput"]'); + await page.type('[data-testid="logInEmailInput"]', admin.email); + await page.click('[data-testid="logInPasswordInput"]'); + await page.type('[data-testid="logInPasswordInput"]', admin.password); + await page.click('[data-testid="loginSubmitButton"]'); + await page.waitForNavigation({waitUntil: "networkidle2"}); + await page.waitForSelector('[data-testid="allOrdersAdmin"]'); + await page.click('[data-testid="allOrdersAdmin"]'); + await page.waitForSelector('[data-testid="generatedAllOrders"]'); + }); + test("assert admin can update the current location of a parcel", async () => { + await page.waitForSelector('[data-testid="updateLocationForm"]'); + await page.click('[data-testid="parcelIdInput"]'); + await page.type('[data-testid="parcelIdInput"]', "1"); + await page.click('[data-testid="parcelLocationInput"]'); + await page.type('[data-testid="parcelLocationInput"]', "Homabay"); + await page.click('[data-testid="updateLocationButton"]'); + await page.waitForSelector('[data-testid="updateLocationResponse"]'); + }); + test("assert admin can update status of a parcel", async () => { + await page.waitForSelector('[data-testid="updateOrderStatus"]'); + await page.click('[data-testid="updateOrderStatus"]'); + await page.type('[data-testid="updateOrderStatus"]', "Arrived"); + await page.click('[data-testid="orderStatusButton"]'); + await page.waitForSelector('[data-testid="orderStatusResponse"]'); + }); }); /*