diff --git a/cypress.config.js b/cypress.config.js new file mode 100644 index 00000000..2b8d1f57 --- /dev/null +++ b/cypress.config.js @@ -0,0 +1,34 @@ +const { defineConfig } = require("cypress"); + +require('dotenv').config() + +module.exports = defineConfig({ + fixturesFolder: "tests/e2e/fixtures", + screenshotsFolder: "tests/e2e/screenshots", + videosFolder: "tests/e2e/videos", + + e2e: { + // We've imported your old cypress plugins here. + // You may want to clean this up later by importing these. + setupNodeEvents(on, config) { + config.env = { + ...process.env, + } + return config + }, + specPattern(on, config) { + return require("./tests/e2e/plugins/index.js")(on, config); + }, + specPattern: "tests/e2e/specs/**/*.cy.{js,jsx,ts,tsx}", + supportFile: "tests/e2e/support/index.js", + hosts: { "*.localhost": "127.0.0.1" }, + baseUrl: 'http://dev.localhost:8080', + }, + + component: { + devServer: { + framework: "vue-cli", + bundler: "webpack", + }, + }, +}); diff --git a/cypress.json b/cypress.json deleted file mode 100644 index 470c7201..00000000 --- a/cypress.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "pluginsFile": "tests/e2e/plugins/index.js" -} diff --git a/package.json b/package.json index 489028f7..2fac2c9a 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,8 @@ "@vue/test-utils": "^1.0.3", "babel-eslint": "^10.1.0", "chai": "^4.2.0", + "cypress": "^10.11.0", + "cypress-file-upload": "^5.0.8", "eslint": "^7.3.1", "eslint-plugin-import": "^2.21.2", "eslint-plugin-node": "^11.1.0", diff --git a/tests/e2e/fixtures/DEV - KPI Template Export - abc.xlsx b/tests/e2e/fixtures/DEV - KPI Template Export - abc.xlsx new file mode 100644 index 00000000..5e196bf6 Binary files /dev/null and b/tests/e2e/fixtures/DEV - KPI Template Export - abc.xlsx differ diff --git a/tests/e2e/fixtures/example.pdf b/tests/e2e/fixtures/example.pdf new file mode 100644 index 00000000..6fa1633b Binary files /dev/null and b/tests/e2e/fixtures/example.pdf differ diff --git a/tests/e2e/fixtures/invoice.pdf b/tests/e2e/fixtures/invoice.pdf new file mode 100644 index 00000000..a30fbaa1 Binary files /dev/null and b/tests/e2e/fixtures/invoice.pdf differ diff --git a/tests/e2e/specs/human-resource/employee/departement.cy.js b/tests/e2e/specs/human-resource/employee/departement.cy.js new file mode 100644 index 00000000..a2c943e4 --- /dev/null +++ b/tests/e2e/specs/human-resource/employee/departement.cy.js @@ -0,0 +1,732 @@ +import { + generateText, + changeRole, + createUserNoRole, + createDepartementApi, +} from "../functions"; + +const randomString = generateText(7); +const name = randomString; +const url = "/human-resource/employee-group"; +const api = Cypress.env("VUE_APP_API_ENDPOINT"); +const apiUrl = api + "/human-resource/employee/groups"; +const getList = apiUrl + "**"; +const getDetail = apiUrl + "/*"; +const timeOut = { timeout: 300000 }; + +describe("HRIS Departemen - Create", () => { + beforeEach(() => { + cy.hideXHR(); + }); + + it("test have access create", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("DEPARTMENT").click(); + + cy.intercept("GET", getList).as("getDepartement"); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + // table list departement + cy.waitVisible("table"); + cy.get("table").contains("th", "Name").should("be.visible"); + + // button add and form input departemen + cy.waitVisible(".input-group-prepend"); + cy.get(".input-group-prepend").click(); + cy.get(".sweet-modal h2", timeOut).should("contain", "ADD DEPARTMENT"); + cy.get('.sweet-modal [for="name"]').should("contain", "NAME"); + cy.get('.sweet-modal input[id="name"]').should("be.visible"); + + // input and save departement + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.intercept("POST", getList).as("createDepartement"); + cy.get('.sweet-modal input[id="name"]', timeOut).type(name); + cy.get(".sweet-modal button").contains("SAVE").click(); + cy.wait("@createDepartement", timeOut) + .its("response.statusCode") + .should("equal", 201); + + cy.get("div.vue-notification", timeOut) + .should("have.class", "success") + .and("contain", "create success"); + + // find name + cy.waitVisible("table"); + cy.get("table").contains("th", "Name").should("be.visible"); + + cy.wait(3000); + cy.waitVisible("#search-text"); + cy.get("#search-text").type(name); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // detail name + cy.intercept("GET", getDetail).as("getDetailDepartement"); + cy.wait(2000); + cy.waitVisible("table"); + cy.get("table a").contains(name).click(); + cy.wait("@getDetailDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + }); + + it("create data if data table < 10", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getDepartement"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.get('.pagination [class="page-item"]').then(($pagination) => { + if ($pagination.length <= 3) { + createDepartementApi(); + } + }); + }); + + it("test user no role - list 10 of data", () => { + // login + cy.then(function () { + if (this.userName) { + cy.login(this.userName, this.userName + this.userName); + } else { + createUserNoRole(); + } + }); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getDepartement"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("tbody th").should("have.length", 10); + }); + + it("test user no role - pagination", () => { + // login + cy.then(function () { + if (this.userName) { + cy.login(this.userName, this.userName + this.userName); + } else { + createUserNoRole(); + } + }); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getDepartement"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get('.pagination [class="page-item"]').last().click(); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + }); + + it("test user no role - see number", () => { + // login + cy.then(function () { + if (this.userName) { + cy.login(this.userName, this.userName + this.userName); + } else { + createUserNoRole(); + } + }); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getDepartement"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("tbody th") + .first() + .invoke("text") + .should("match", /^[0-9]*$/); + }); + + it("test user no role - not show button add", () => { + // login + cy.then(function () { + if (this.userName) { + cy.login(this.userName, this.userName + this.userName); + } else { + createUserNoRole(); + } + }); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getDepartement"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get(".input-group-prepend").should("not.exist"); + }); + + it("test user has role - empty input and save", () => { + // login + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getDepartement"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.waitVisible(".input-group-prepend"); + cy.get(".input-group-prepend").click(); + + // fill input and save + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.get('.sweet-modal input[id="name"]', timeOut).type(name); + cy.get(".sweet-modal button").contains("SAVE").click(); + + // Error save + cy.get("div.vue-notification", timeOut) + .should("have.class", "danger") + .and("contain", "The name field is required"); + }); + + it("test user has role - input more than 255 and save", () => { + // login + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getDepartement"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.waitVisible(".input-group-prepend"); + cy.get(".input-group-prepend").click(); + + // fill input and save + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.get('.sweet-modal input[id="name"]', timeOut).type(generateText(256)); + cy.get(".sweet-modal button").contains("SAVE").click(); + + // Error save + cy.get("div.vue-notification", timeOut) + .should("have.class", "danger") + .and("contain", "The name may not be greater than 255 characters"); + }); +}); + +describe("HRIS Departemen - Read", () => { + beforeEach(() => { + cy.hideXHR(); + }); + + it("test have access read", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("DEPARTMENT").click(); + + cy.intercept("GET", getList).as("getDepartement"); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + // table list departement + cy.waitVisible("table"); + cy.get("table").contains("th", "Name").should("be.visible"); + }); + + it("test have access read - pagination, (detail) button:create,edit,delete", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("DEPARTMENT").click(); + + cy.intercept("GET", getList).as("getDepartement"); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + // list pagination + cy.waitVisible(".pagination"); + + // find name + cy.wait(3000); + cy.waitVisible("#search-text"); + cy.get("#search-text").type(name); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // see detail name + cy.intercept("GET", getDetail).as("getDetailDepartement"); + cy.wait(2000); + cy.waitVisible("table"); + cy.get("table a").contains(name).click(); + cy.wait("@getDetailDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.get('[type="button"]').should("contain", "CREATE"); + cy.get('[type="button"]').should("contain", "EDIT"); + cy.get('[type="button"]').should("contain", "DELETE"); + }); + + it("test have access read - list 10 of data", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getDepartement"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("tbody th").should("have.length", 10); + }); + + it("test have access read - detail, name column", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("DEPARTMENT").click(); + + cy.intercept("GET", getList).as("getDepartement"); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // find name + cy.wait(3000); + cy.waitVisible("#search-text"); + cy.get("#search-text").type(name); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // see detail name + cy.intercept("GET", getDetail).as("getDetailDepartement"); + cy.wait(2000); + cy.waitVisible("table"); + cy.get("table a").contains(name).click(); + cy.wait("@getDetailDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + // name column + cy.get('.block-content input[name="name"]').should("be.visible"); + }); + + it("test have access read - pagination", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getDepartement"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get('.pagination [class="page-item"]').last().click(); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.waitVisible(".input-group-prepend"); // button create + cy.waitVisible("#search-text"); // search + cy.waitVisible(".pagination"); // pagination + }); +}); + +describe("HRIS Departemen - Edit", () => { + beforeEach(() => { + cy.hideXHR(); + }); + + it("test have access edit", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("DEPARTMENT").click(); + + cy.intercept("GET", getList).as("getDepartement"); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + // table list departement + cy.waitVisible("table"); + cy.get("table").contains("th", "Name").should("be.visible"); + }); + + it("test have access edit - detail, name column", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("DEPARTMENT").click(); + + cy.intercept("GET", getList).as("getDepartement"); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // find name + cy.wait(3000); + cy.waitVisible("#search-text"); + cy.get("#search-text").type(name); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // see detail name + cy.intercept("GET", getDetail).as("getDetailDepartement"); + cy.wait(2000); + cy.waitVisible("table"); + cy.get("table a").contains(name).click(); + cy.wait("@getDetailDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.get("input#name", timeOut).should("have.value", randomString); + cy.get('[type="button"]').contains("EDIT").click(); + + cy.waitVisible(".sweet-title"); + cy.get(".sweet-title").should("contain", "EDIT DEPARTMENT"); + + cy.wait("@getDetailDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible(".sweet-content-content button").last().should("be.visible"); // button update + cy.waitVisible(".sweet-modal .sweet-action-close"); // button close + + cy.wait(2000); + cy.get('.sweet-content-content input[name="name"]') + .last() + .clear() + .type(randomString + " - edit"); + + cy.wait(1500); + cy.intercept("PATCH", getDetail).as("updateDepartement"); + cy.get(".sweet-content-content button").last().click(); + + cy.wait("@updateDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + cy.get("div.vue-notification", timeOut) + .should("have.class", "success") + .and("contain", "update success"); + }); + + it("test have access edit - empty input and save", () => { + // login + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getDepartement"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.waitVisible(".input-group-prepend"); + cy.get(".input-group-prepend").click(); + + // clear input and save + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.get('.sweet-modal input[id="name"]', timeOut).clear(); + cy.get(".sweet-modal button").contains("SAVE").click(); + + // Error save + cy.get("div.vue-notification", timeOut) + .should("have.class", "danger") + .and("contain", "The name field is required"); + + // fill same input and save + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.get('.sweet-modal input[id="name"]', timeOut).type(name); + cy.get(".sweet-modal button").contains("SAVE").click(); + + // Error save + cy.get("div.vue-notification", timeOut) + .should("have.class", "danger") + .and("contain", "Please edit with a different name"); + }); + + it("test user has role - input more than 255 and save", () => { + // login + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getDepartement"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.waitVisible(".input-group-prepend"); + cy.get(".input-group-prepend").click(); + + // fill input and save + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.get('.sweet-modal input[id="name"]', timeOut).type(generateText(256)); + cy.get(".sweet-modal button").contains("SAVE").click(); + + // Error save + cy.get("div.vue-notification", timeOut) + .should("have.class", "danger") + .and("contain", "The name may not be greater than 255 characters"); + }); +}); + +describe("HRIS Departemen - Delete", () => { + beforeEach(() => { + cy.hideXHR(); + }); + + it("test have access delete", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getDepartement"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getDepartement").its("response.statusCode").should("equal", 200); + + // table list departement + cy.waitVisible("table"); + cy.get("table").contains("th", "Name").should("be.visible"); + + cy.waitVisible("#search-text"); + cy.get("#search-text").type(randomString); + cy.wait("@getDepartement").its("response.statusCode").should("equal", 200); + + cy.wait(2000); + cy.waitVisible("table"); + cy.get("table a") + .contains(randomString + " - edit") + .click(); + + cy.get("input#name", timeOut).should( + "have.value", + randomString + " - edit" + ); + cy.get(".block-content").contains("DELETE").click(); + + cy.intercept("DELETE", getDetail).as("deleteDepartemen"); + + cy.waitVisible(".swal2-container"); + cy.get(".swal2-container button").contains("Confirm").click(); + + cy.wait("@deleteDepartemen", timeOut) + .its("response.statusCode") + .should("equal", 204); + + cy.wait(1500); + cy.url().should("contain", url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getDepartement").its("response.statusCode").should("equal", 200); + + cy.waitVisible("table"); + cy.get("table").contains("th", "Name").should("be.visible"); + }); + + it("test delete no role - see number", () => { + // login + cy.then(function () { + if (this.userName) { + cy.login(this.userName, this.userName + this.userName); + } else { + createUserNoRole(); + } + changeRole(this.userId, this.superAdminRoleId) + }); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getDepartement"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("tbody th") + .first() + .invoke("text") + .should("match", /^[0-9]*$/); + }); +}); diff --git a/tests/e2e/specs/human-resource/employee/employee.cy.js b/tests/e2e/specs/human-resource/employee/employee.cy.js new file mode 100644 index 00000000..f07e275b --- /dev/null +++ b/tests/e2e/specs/human-resource/employee/employee.cy.js @@ -0,0 +1,948 @@ +import { + generateText, + changeRole, + createUserNoRole, +} from "../functions"; + +const name = generateText(7); +const personalId = generateText(7); +const email = generateText(7) + "@mail.com"; +const address = generateText(7); +const phone = generateNumber(11); +const code = generateNumber(4); +const jobTitle = generateText(6); +const note = generateText(15); +const url = "/human-resource/employee"; +const apiUrl = + Cypress.env("VUE_APP_API_ENDPOINT") + "/human-resource/employee/employees"; +const getList = apiUrl + "**"; +const getDetail = apiUrl + "/*"; +const timeOut = { timeout: 300000 }; + +describe("HRIS Employee - Create", () => { + beforeEach(() => { + cy.hideXHR(); + }); + + it("test have access create", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.intercept("GET", getList).as("getEmployee"); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + // table list employee + cy.waitVisible("table"); + cy.get("table").contains("th", "Name").should("be.visible"); + + // button add and form input employee + cy.waitVisible(".input-group-prepend"); + + cy.get(".input-group-prepend").click(); + cy.get(".sweet-modal h2", timeOut).should("contain", "EMPLOYEE INFORMATION"); + + cy.get(".sweet-title", timeOut).should("contain", "EMPLOYEE INFORMATION"); + cy.get(".sweet-content-content input#name", timeOut).should("be.visible"); + cy.get(".sweet-content-content input#personal-identity", timeOut).should("be.visible"); + cy.get(".sweet-content-content input#email", timeOut).should("be.visible"); + cy.get(".sweet-content-content input#address", timeOut).should("be.visible"); + cy.get(".sweet-content-content input#phone", timeOut).should("be.visible"); + cy.get(".sweet-content-content #birth-date input", timeOut).should("be.visible"); + cy.get(".sweet-content-content mx-datepicker-sidebar button", timeOut).should("be.visible"); + cy.get(".sweet-content-content input#birth-place", timeOut).should("be.visible"); + cy.get(".sweet-content-content #gender button", timeOut).should("be.visible"); + cy.get(".sweet-content-content #marital-status button", timeOut).should("be.visible"); + cy.get(".sweet-content-content #religion button", timeOut).should("be.visible"); + cy.get(".sweet-content-content #employee-group button", timeOut).should("be.visible"); + cy.get(".sweet-content-content input#code", timeOut).should("be.visible"); + cy.get(".sweet-content-content input#job-title", timeOut).should("be.visible"); + cy.get(".sweet-content-content #job-location button", timeOut).should("be.visible"); + cy.get(".sweet-content-content #join-date input", timeOut).should("be.visible"); + cy.get(".sweet-content-content #status button", timeOut).should("be.visible"); + cy.get(".sweet-content-content input#company_email", timeOut).should("be.visible"); + cy.get(".sweet-content-content button", timeOut).should("contain", "Contract Period"); + cy.get(".sweet-content-content button", timeOut).should("contain", "Employee Assessor"); + + // address input + cy.wait(3000) + cy.get(".sweet-content-content input#address", timeOut) + .parents('.form-group.row') + .find('i') + .click() + + cy.get(".sweet-content-content input#address", timeOut).should("have.length", 2); + + cy.get(".sweet-content-content input#address", timeOut) + .first() + .parents('.form-group.row') + .find('i') + .click() + + // social media + cy.wait(3000); + cy.get(".sweet-content-content button") + .contains("Social Media") + .click(); + cy.wait(1000); + cy.get(".sweet-modal").each(($el) => { + if ($el.find(".sweet-title > h2").text() == "ADD SOCIAL MEDIA") { + cy.wait(1000); + cy.get('#social-media-type').click(); + cy.get(".v-dropdown-container.v-dropdown-no-border").each(($elm) => { + if ($elm.css("display") != "none") { + cy.wrap($elm).find("li").should("contain", "Facebook"); + cy.wrap($elm).find("li").should("contain", "Twitter"); + cy.wrap($elm).find("li").should("contain", "Instagram"); + } + }); + $el.find('.sweet-action-close').click() + } + }); + + // input and save employee + cy.wait(1000); + cy.get(".sweet-content-content input#name").type(data.name); + cy.wait(1000); + cy.get(".sweet-content-content input#personal-identity").type( + data.personalId + ); + cy.wait(1000); + cy.get(".sweet-content-content input#email").type(data.email); + cy.wait(1000); + cy.get(".sweet-content-content input#address") + .first() + .type(data.address); + cy.wait(1000); + cy.get(".sweet-content-content input#phone").type(data.phone); + + cy.wait(1000); + cy.get(".sweet-content-content #birth-date input").click(); + cy.wait(1000); + cy.get(".mx-datepicker-sidebar button").contains("Last Year").click(); + + cy.wait(1000); + cy.get(".sweet-content-content input#birth-place").type(data.address); + + cy.wait(1000); + cy.get(".sweet-content-content #gender button").click(); + cy.get(".v-dropdown-container.v-dropdown-no-border").each(($el) => { + if ($el.css("display") != "none") { + cy.wrap($el).find("li").first().click(); + } + }); + + cy.wait(1000); + cy.get(".sweet-content-content #marital-status button").click(); + cy.get(".v-dropdown-container.v-dropdown-no-border").each(($el) => { + if ($el.css("display") != "none") { + cy.wrap($el).find("li").first().click(); + } + }); + + cy.wait(1000); + cy.get(".sweet-content-content #religion button").click(); + cy.get(".v-dropdown-container.v-dropdown-no-border").each(($el) => { + if ($el.css("display") != "none") { + cy.wrap($el).find("li").first().click(); + } + }); + + cy.wait(1000); + cy.get(".sweet-content-content #employee-group button").click(); + cy.get(".v-dropdown-container.v-dropdown-no-border").each(($el) => { + if ($el.css("display") != "none") { + cy.wrap($el).find("li").first().click(); + } + }); + + cy.wait(1000); + cy.get(".sweet-content-content input#code").type(data.code); + cy.wait(1000); + cy.get(".sweet-content-content input#job-title").type(data.jobTitle); + + cy.wait(1000); + cy.get(".sweet-content-content #job-location button").click(); + cy.get(".v-dropdown-container.v-dropdown-no-border").each(($el) => { + if ($el.css("display") != "none") { + cy.wrap($el).find("li").first().click(); + } + }); + + cy.wait(1000); + cy.get(".sweet-content-content #join-date input").click(); + cy.wait(1000); + cy.get(".mx-datepicker-sidebar button").contains("Today").click(); + + cy.wait(1000); + cy.get(".sweet-content-content #status button").click(); + cy.get(".v-dropdown-container.v-dropdown-no-border").each(($el) => { + if ($el.css("display") != "none") { + cy.wrap($el).find("li").first().click(); + } + }); + + cy.wait(1000); + cy.get(".sweet-content-content input#company_email").type(data.email); + + cy.wait(1000); + cy.get(".sweet-content-content button") + .contains("Contract Period") + .click(); + cy.wait(1000); + cy.get(".sweet-modal").each(($el) => { + if ($el.find(".sweet-title > h2").text() == "ADD CONTRACT") { + cy.wait(1000); + cy.wrap($el) + .find(".sweet-content .form-group") + .eq(0) + .find("input") + .click(); + cy.wait(1000); + cy.get(".mx-datepicker-sidebar button") + .contains("Last Year") + .click(); + + cy.wait(1000); + cy.wrap($el) + .find(".sweet-content .form-group") + .eq(1) + .find("input") + .click(); + cy.wait(1000); + cy.get(".mx-datepicker-sidebar button").contains("Today").click(); + + cy.wait(1000); + cy.wrap($el) + .find(".sweet-content .form-group") + .eq(2) + .find("input") + .type(data.note); + + cy.wait(1000); + cy.wrap($el) + .find(".sweet-content-content > .pull-right > button") + .last() + .click(); + } + }); + + cy.wait(1000); + cy.get(".sweet-content-content button") + .contains("Employee Assessor") + .click(); + cy.wait(1000); + cy.get(".sweet-modal").each(($el) => { + if ($el.find(".sweet-title > h2").text() == "ADD SCORER") { + cy.wait(1000); + cy.wrap($el).find(".sweet-content .list-group a").first().click(); + } + }); + + cy.wait(1000); + cy.get(".sweet-content-content #user-account button").click(); + cy.get(".v-dropdown-container.v-dropdown-no-border").each(($el) => { + if ($el.css("display") != "none") { + cy.wrap($el).find("li").first().click(); + } + }); + + cy.wait(1000); + cy.get(".sweet-modal-overlay").each(($el) => { + if ($el.css("display") != "none") { + cy.wrap($el) + .find(".sweet-content-content > .pull-right > button") + .click(); + } + }); + + cy.wait(3000); + + cy.get("div.vue-notification", timeOut) + .should("have.class", "success") + .and("contain", "create success"); + + cy.wait(1500); + cy.url().should("contain", urlEmployee); + cy.wait("@getEmployee").its("response.statusCode").should("equal", 200); + + // find name + cy.waitVisible("table"); + cy.get("table").contains("th", "Name").should("be.visible"); + + cy.wait(3000); + cy.waitVisible("#search-text"); + cy.get("#search-text").type(name); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // detail name + cy.intercept("GET", getDetail).as("getDetailEmployee"); + cy.wait(2000); + cy.waitVisible("table"); + cy.get("table a").contains(name).click(); + cy.wait("@getDetailEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + }); + + it("test user no role - pagination", () => { + // login + cy.then(function () { + if (this.userName) { + cy.login(this.userName, this.userName + this.userName); + } else { + createUserNoRole(); + } + }); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmployee"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get('.pagination [class="page-item"]').last().click(); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + }); + + it("test user no role - see number", () => { + // login + cy.then(function () { + if (this.userName) { + cy.login(this.userName, this.userName + this.userName); + } else { + createUserNoRole(); + } + }); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmployee"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("tbody th") + .first() + .invoke("text") + .should("match", /^[0-9]*$/); + }); + + it("test user no role - not show button add", () => { + // login + cy.then(function () { + if (this.userName) { + cy.login(this.userName, this.userName + this.userName); + } else { + createUserNoRole(); + } + }); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmployee"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get(".input-group-prepend").should("not.exist"); + }); + + it("test user has role - empty input and save", () => { + // login + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmployee"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.waitVisible(".input-group-prepend"); + cy.get(".input-group-prepend").click(); + + // fill input and save + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.get(".sweet-modal button").contains("SAVE").click(); + + // Error save + cy.get("div.vue-notification", timeOut) + .should("have.class", "danger") + .and("contain", "The name field is required"); + }); + + it("test user has role - duplicate name", () => { + // login + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmployee"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.waitVisible(".input-group-prepend"); + cy.get(".input-group-prepend").click(); + + // fill input and save + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.get('.sweet-modal input#name', timeOut).type(name); + cy.get(".sweet-modal button").contains("SAVE").click(); + + // Error save + cy.get("div.vue-notification", timeOut) + .should("have.class", "danger") + .and("contain", "Integrity constraint violation: 1062 Duplicate entry"); + }); + + it("test user has role - input more than 255 and save", () => { + // login + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmployee"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.waitVisible(".input-group-prepend"); + cy.get(".input-group-prepend").click(); + + // fill input and save + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.get('.sweet-modal input#name', timeOut).type(generateText(256)); + cy.get(".sweet-modal button").contains("SAVE").click(); + + // Error save + cy.get("div.vue-notification", timeOut) + .should("have.class", "danger") + .and("contain", "The name may not be greater than 255 characters"); + }); +}); + +describe("HRIS Employee - Read", () => { + beforeEach(() => { + cy.hideXHR(); + }); + + it("test have access read", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.intercept("GET", getList).as("getEmployee"); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + // table list employee + cy.waitVisible("table"); + cy.get("table").contains("th", "Name").should("be.visible"); + }); + + it("test have access read - pagination, (detail) button:create,edit,delete", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.intercept("GET", getList).as("getEmployee"); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + // list pagination + cy.waitVisible(".pagination"); + + // find name + cy.wait(3000); + cy.waitVisible("#search-text"); + cy.get("#search-text").type(name); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // see detail name + cy.intercept("GET", getDetail).as("getDetailEmployee"); + cy.wait(2000); + cy.waitVisible("table"); + cy.get("table a").contains(name).click(); + cy.wait("@getDetailEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.get('[type="button"]').should("contain", "CREATE"); + cy.get('[type="button"]').should("contain", "EDIT"); + cy.get('[type="button"]').should("contain", "DELETE"); + }); + + it("test have access read - detail, name column", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.intercept("GET", getList).as("getEmployee"); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // find name + cy.wait(3000); + cy.waitVisible("#search-text"); + cy.get("#search-text").type(name); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // see detail name + cy.intercept("GET", getDetail).as("getDetailEmployee"); + cy.wait(2000); + cy.waitVisible("table"); + cy.get("table a").contains(name).click(); + cy.wait("@getDetailEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + // name column + cy.get('.block-content input[name="name"]').should("be.visible"); + }); + + it("test have access read - archive", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmployee"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + + // find name + cy.wait(3000); + cy.waitVisible("#search-text"); + cy.get("#search-text").type(name); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get(".css-checkbox").last().click() + cy.get('button').contains('ARCHIVE').click() + + cy.wait(2000); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.get("#search-text").type(name); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + cy.get("table").contains("th", "Name").should("not.exist"); + }); + + it("test have access read - active ", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmployee"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get('a').contains('ADVANCE FILTER').click() + cy.get('.select-link').click() + cy.get(".sweet-modal-overlay").each(($el) => { + if ($el.css("display") != "none") { + cy.wrap($el) + .find("a") + .contains('ARCHIVED') + .click(); + } + }); + + cy.wait(2000); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + // find name + cy.wait(3000); + cy.waitVisible("#search-text"); + cy.get("#search-text").type(name); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get(".css-checkbox").last().click() + cy.get('button').contains('ACTIVATE').click() + + cy.wait(2000); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get('a').contains('ADVANCE FILTER').click() + cy.get('.select-link').click() + cy.get(".sweet-modal-overlay").each(($el) => { + if ($el.css("display") != "none") { + cy.wrap($el) + .find("a") + .contains('ARCHIVED') + .click(); + } + }); + + cy.wait(2000); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.get("#search-text").type(name); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + cy.get("table").contains("th", "Name").should("not.exist"); + }); +}); + +describe("HRIS Employee - Edit", () => { + beforeEach(() => { + cy.hideXHR(); + }); + + it("test have access edit", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.intercept("GET", getList).as("getEmployee"); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + // table list employee + cy.waitVisible("table"); + cy.get("table").contains("th", "Name").should("be.visible"); + }); + + it("test have access edit - detail, name column", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.intercept("GET", getList).as("getEmployee"); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // find name + cy.wait(3000); + cy.waitVisible("#search-text"); + cy.get("#search-text").type(name); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // see detail name + cy.intercept("GET", getDetail).as("getDetailEmployee"); + cy.wait(2000); + cy.waitVisible("table"); + cy.get("table a").contains(name).click(); + cy.wait("@getDetailEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.get("input#name", timeOut).should("have.value", name); + cy.get('[type="button"]').contains("EDIT").click(); + + cy.waitVisible(".sweet-title"); + cy.get(".sweet-title").should("contain", "EDIT DEPARTMENT"); + + cy.wait("@getDetailEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible(".sweet-content-content button").last().should("be.visible"); // button update + cy.waitVisible(".sweet-modal .sweet-action-close"); // button close + + cy.wait(2000); + cy.get('.sweet-content-content input[name="name"]') + .last() + .clear() + .type(name + " - edit"); + + cy.wait(1500); + cy.intercept("PATCH", getDetail).as("updateEmployee"); + cy.get(".sweet-content-content button").last().click(); + + cy.wait("@updateEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + cy.get("div.vue-notification", timeOut) + .should("have.class", "success") + .and("contain", "update success"); + }); + + it("test have access edit - empty input and save", () => { + // login + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmployee"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.waitVisible(".input-group-prepend"); + cy.get(".input-group-prepend").click(); + + // clear input and save + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.get('.sweet-modal input#name', timeOut).clear(); + cy.get(".sweet-modal button").contains("SAVE").click(); + + // Error save + cy.get("div.vue-notification", timeOut) + .should("have.class", "danger") + .and("contain", "The name field is required"); + + // fill same input and save + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.get('.sweet-modal input#name', timeOut).type(name + " - edit"); + cy.get(".sweet-modal button").contains("SAVE").click(); + + // Error save + cy.get("div.vue-notification", timeOut) + .should("have.class", "danger") + .and("contain", "Please edit with a different name"); + }); + + it("test user has role - input more than 255 and save", () => { + // login + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmployee"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmployee", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.waitVisible(".input-group-prepend"); + cy.get(".input-group-prepend").click(); + + // fill input and save + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.get('.sweet-modal input#name', timeOut).type(generateText(256)); + cy.get(".sweet-modal button").contains("SAVE").click(); + + // Error save + cy.get("div.vue-notification", timeOut) + .should("have.class", "danger") + .and("contain", "The name may not be greater than 255 characters"); + }); +}); + +describe("HRIS Employee - Delete", () => { + beforeEach(() => { + cy.hideXHR(); + }); + + it("test have access delete", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmployee"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmployee").its("response.statusCode").should("equal", 200); + + // table list employee + cy.waitVisible("table"); + cy.get("table").contains("th", "Name").should("be.visible"); + + cy.waitVisible("#search-text"); + cy.get("#search-text").type(name); + cy.wait("@getEmployee").its("response.statusCode").should("equal", 200); + + cy.wait(2000); + cy.waitVisible("table"); + cy.get("table a") + .contains(name + " - edit") + .click(); + + cy.get("input#name", timeOut).should("have.value", name + " - edit"); + cy.get(".block-content").contains("DELETE").click(); + + cy.intercept("DELETE", getDetail).as("deleteDepartemen"); + + cy.waitVisible(".swal2-container"); + cy.get(".swal2-container button").contains("Confirm").click(); + + cy.wait("@deleteDepartemen", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.wait(1500); + cy.url().should("contain", url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmployee").its("response.statusCode").should("equal", 200); + + cy.waitVisible("table"); + cy.get("table").contains("th", "Name").should("be.visible"); + }); +}); diff --git a/tests/e2e/specs/human-resource/employee/employmentContract.cy.js b/tests/e2e/specs/human-resource/employee/employmentContract.cy.js new file mode 100644 index 00000000..e65e8043 --- /dev/null +++ b/tests/e2e/specs/human-resource/employee/employmentContract.cy.js @@ -0,0 +1,732 @@ +import { + generateText, + changeRole, + createUserNoRole, + createEmploymentContractApi, +} from "../functions"; + +const randomString = generateText(7); +const name = randomString; +const url = "/human-resource/employee-status"; +const api = Cypress.env("VUE_APP_API_ENDPOINT"); +const apiUrl = api + "/human-resource/employee/statuses"; +const getList = apiUrl + "**"; +const getDetail = apiUrl + "/*"; +const timeOut = { timeout: 300000 }; + +describe("HRIS Employeement Contract - Create", () => { + beforeEach(() => { + cy.hideXHR(); + }); + + it("test have access create", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYMENT CONTRACT").click(); + + cy.intercept("GET", getList).as("getEmploymentContract"); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + // table list departement + cy.waitVisible("table"); + cy.get("table").contains("th", "Name").should("be.visible"); + + // button add and form input departemen + cy.waitVisible(".input-group-prepend"); + cy.get(".input-group-prepend").click(); + cy.get(".sweet-modal h2", timeOut).should("contain", "ADD DEPARTMENT"); + cy.get('.sweet-modal [for="name"]').should("contain", "NAME"); + cy.get('.sweet-modal input[id="name"]').should("be.visible"); + + // input and save departement + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.intercept("POST", getList).as("createEmploymentContract"); + cy.get('.sweet-modal input[id="name"]', timeOut).type(name); + cy.get(".sweet-modal button").contains("SAVE").click(); + cy.wait("@createEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 201); + + cy.get("div.vue-notification", timeOut) + .should("have.class", "success") + .and("contain", "create success"); + + // find name + cy.waitVisible("table"); + cy.get("table").contains("th", "Name").should("be.visible"); + + cy.wait(3000); + cy.waitVisible("#search-text"); + cy.get("#search-text").type(name); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // detail name + cy.intercept("GET", getDetail).as("getDetailEmploymentContract"); + cy.wait(2000); + cy.waitVisible("table"); + cy.get("table a").contains(name).click(); + cy.wait("@getDetailEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + }); + + it("create data if data table < 10", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmploymentContract"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.get('.pagination [class="page-item"]').then(($pagination) => { + if ($pagination.length <= 3) { + createEmploymentContractApi(); + } + }); + }); + + it("test user no role - list 10 of data", () => { + // login + cy.then(function () { + if (this.userName) { + cy.login(this.userName, this.userName + this.userName); + } else { + createUserNoRole(); + } + }); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmploymentContract"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("tbody th").should("have.length", 10); + }); + + it("test user no role - pagination", () => { + // login + cy.then(function () { + if (this.userName) { + cy.login(this.userName, this.userName + this.userName); + } else { + createUserNoRole(); + } + }); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmploymentContract"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get('.pagination [class="page-item"]').last().click(); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + }); + + it("test user no role - see number", () => { + // login + cy.then(function () { + if (this.userName) { + cy.login(this.userName, this.userName + this.userName); + } else { + createUserNoRole(); + } + }); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmploymentContract"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("tbody th") + .first() + .invoke("text") + .should("match", /^[0-9]*$/); + }); + + it("test user no role - not show button add", () => { + // login + cy.then(function () { + if (this.userName) { + cy.login(this.userName, this.userName + this.userName); + } else { + createUserNoRole(); + } + }); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmploymentContract"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get(".input-group-prepend").should("not.exist"); + }); + + it("test user has role - empty input and save", () => { + // login + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmploymentContract"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.waitVisible(".input-group-prepend"); + cy.get(".input-group-prepend").click(); + + // fill input and save + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.get('.sweet-modal input[id="name"]', timeOut).type(name); + cy.get(".sweet-modal button").contains("SAVE").click(); + + // Error save + cy.get("div.vue-notification", timeOut) + .should("have.class", "danger") + .and("contain", "The name field is required"); + }); + + it("test user has role - input more than 255 and save", () => { + // login + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmploymentContract"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.waitVisible(".input-group-prepend"); + cy.get(".input-group-prepend").click(); + + // fill input and save + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.get('.sweet-modal input[id="name"]', timeOut).type(generateText(256)); + cy.get(".sweet-modal button").contains("SAVE").click(); + + // Error save + cy.get("div.vue-notification", timeOut) + .should("have.class", "danger") + .and("contain", "The name may not be greater than 255 characters"); + }); +}); + +describe("HRIS Employeement Contract - Read", () => { + beforeEach(() => { + cy.hideXHR(); + }); + + it("test have access read", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYMENT CONTRACT").click(); + + cy.intercept("GET", getList).as("getEmploymentContract"); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + // table list departement + cy.waitVisible("table"); + cy.get("table").contains("th", "Name").should("be.visible"); + }); + + it("test have access read - pagination, (detail) button:create,edit,delete", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYMENT CONTRACT").click(); + + cy.intercept("GET", getList).as("getEmploymentContract"); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + // list pagination + cy.waitVisible(".pagination"); + + // find name + cy.wait(3000); + cy.waitVisible("#search-text"); + cy.get("#search-text").type(name); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // see detail name + cy.intercept("GET", getDetail).as("getDetailEmploymentContract"); + cy.wait(2000); + cy.waitVisible("table"); + cy.get("table a").contains(name).click(); + cy.wait("@getDetailEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.get('[type="button"]').should("contain", "CREATE"); + cy.get('[type="button"]').should("contain", "EDIT"); + cy.get('[type="button"]').should("contain", "DELETE"); + }); + + it("test have access read - list 10 of data", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmploymentContract"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("tbody th").should("have.length", 10); + }); + + it("test have access read - detail, name column", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYMENT CONTRACT").click(); + + cy.intercept("GET", getList).as("getEmploymentContract"); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // find name + cy.wait(3000); + cy.waitVisible("#search-text"); + cy.get("#search-text").type(name); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // see detail name + cy.intercept("GET", getDetail).as("getDetailEmploymentContract"); + cy.wait(2000); + cy.waitVisible("table"); + cy.get("table a").contains(name).click(); + cy.wait("@getDetailEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + // name column + cy.get('.block-content input[name="name"]').should("be.visible"); + }); + + it("test have access read - pagination", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmploymentContract"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get('.pagination [class="page-item"]').last().click(); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.waitVisible(".input-group-prepend"); // button create + cy.waitVisible("#search-text"); // search + cy.waitVisible(".pagination"); // pagination + }); +}); + +describe("HRIS Employeement Contract - Edit", () => { + beforeEach(() => { + cy.hideXHR(); + }); + + it("test have access edit", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYMENT CONTRACT").click(); + + cy.intercept("GET", getList).as("getEmploymentContract"); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + // table list departement + cy.waitVisible("table"); + cy.get("table").contains("th", "Name").should("be.visible"); + }); + + it("test have access edit - detail, name column", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYMENT CONTRACT").click(); + + cy.intercept("GET", getList).as("getEmploymentContract"); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // find name + cy.wait(3000); + cy.waitVisible("#search-text"); + cy.get("#search-text").type(name); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // see detail name + cy.intercept("GET", getDetail).as("getDetailEmploymentContract"); + cy.wait(2000); + cy.waitVisible("table"); + cy.get("table a").contains(name).click(); + cy.wait("@getDetailEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.get("input#name", timeOut).should("have.value", randomString); + cy.get('[type="button"]').contains("EDIT").click(); + + cy.waitVisible(".sweet-title"); + cy.get(".sweet-title").should("contain", "EDIT DEPARTMENT"); + + cy.wait("@getDetailEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible(".sweet-content-content button").last().should("be.visible"); // button update + cy.waitVisible(".sweet-modal .sweet-action-close"); // button close + + cy.wait(2000); + cy.get('.sweet-content-content input[name="name"]') + .last() + .clear() + .type(randomString + " - edit"); + + cy.wait(1500); + cy.intercept("PATCH", getDetail).as("updateDepartement"); + cy.get(".sweet-content-content button").last().click(); + + cy.wait("@updateDepartement", timeOut) + .its("response.statusCode") + .should("equal", 200); + cy.get("div.vue-notification", timeOut) + .should("have.class", "success") + .and("contain", "update success"); + }); + + it("test have access edit - empty input and save", () => { + // login + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmploymentContract"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.waitVisible(".input-group-prepend"); + cy.get(".input-group-prepend").click(); + + // clear input and save + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.get('.sweet-modal input[id="name"]', timeOut).clear(); + cy.get(".sweet-modal button").contains("SAVE").click(); + + // Error save + cy.get("div.vue-notification", timeOut) + .should("have.class", "danger") + .and("contain", "The name field is required"); + + // fill same input and save + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.get('.sweet-modal input[id="name"]', timeOut).type(name); + cy.get(".sweet-modal button").contains("SAVE").click(); + + // Error save + cy.get("div.vue-notification", timeOut) + .should("have.class", "danger") + .and("contain", "Please edit with a different name"); + }); + + it("test user has role - input more than 255 and save", () => { + // login + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmploymentContract"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.waitVisible(".input-group-prepend"); + cy.get(".input-group-prepend").click(); + + // fill input and save + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.get('.sweet-modal input[id="name"]', timeOut).type(generateText(256)); + cy.get(".sweet-modal button").contains("SAVE").click(); + + // Error save + cy.get("div.vue-notification", timeOut) + .should("have.class", "danger") + .and("contain", "The name may not be greater than 255 characters"); + }); +}); + +describe("HRIS Employeement Contract - Delete", () => { + beforeEach(() => { + cy.hideXHR(); + }); + + it("test have access delete", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmploymentContract"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmploymentContract").its("response.statusCode").should("equal", 200); + + // table list departement + cy.waitVisible("table"); + cy.get("table").contains("th", "Name").should("be.visible"); + + cy.waitVisible("#search-text"); + cy.get("#search-text").type(randomString); + cy.wait("@getEmploymentContract").its("response.statusCode").should("equal", 200); + + cy.wait(2000); + cy.waitVisible("table"); + cy.get("table a") + .contains(randomString + " - edit") + .click(); + + cy.get("input#name", timeOut).should( + "have.value", + randomString + " - edit" + ); + cy.get(".block-content").contains("DELETE").click(); + + cy.intercept("DELETE", getDetail).as("deleteDepartemen"); + + cy.waitVisible(".swal2-container"); + cy.get(".swal2-container button").contains("Confirm").click(); + + cy.wait("@deleteDepartemen", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.wait(1500); + cy.url().should("contain", url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmploymentContract").its("response.statusCode").should("equal", 200); + + cy.waitVisible("table"); + cy.get("table").contains("th", "Name").should("be.visible"); + }); + + it("test delete no role - see number", () => { + // login + cy.then(function () { + if (this.userName) { + cy.login(this.userName, this.userName + this.userName); + } else { + createUserNoRole(); + } + changeRole(this.userId, this.superAdminRoleId); + }); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getEmploymentContract"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmploymentContract", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("tbody th") + .first() + .invoke("text") + .should("match", /^[0-9]*$/); + }); +}); diff --git a/tests/e2e/specs/human-resource/employee/jobLocation.cy.js b/tests/e2e/specs/human-resource/employee/jobLocation.cy.js new file mode 100644 index 00000000..e187293b --- /dev/null +++ b/tests/e2e/specs/human-resource/employee/jobLocation.cy.js @@ -0,0 +1,736 @@ +import { + generateText, + changeRole, + createUserNoRole, + createJobLocationApi, +} from "../functions"; + +const randomString = generateText(7); +const name = randomString; +const url = "/human-resource/job-location"; +const apiUrl = + Cypress.env("VUE_APP_API_ENDPOINT") + + "/human-resource/employee/job-locations"; +const getList = apiUrl + "**"; +const getDetail = apiUrl + "/*"; +const timeOut = { timeout: 300000 }; + +describe("HRIS - Job Location - Create", () => { + beforeEach(() => { + cy.hideXHR(); + }); + + it("test have access create", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("JOB LOCATION").click(); + + cy.intercept("GET", getList).as("getJobLocation"); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + // table list job location + cy.waitVisible("table"); + cy.get("table").contains("th", "name").should("be.visible"); + cy.get("table").contains("th", "area value").should("be.visible"); + cy.get("table").contains("th", "kpi multiplier").should("be.visible"); + + // button add and form input job location + cy.waitVisible(".input-group-prepend"); + cy.get(".input-group-prepend").click(); + cy.get(".sweet-modal h2", timeOut).should("contain", "ADD JOB LOCATION"); + cy.get(".sweet-content-content input").eq(0).type(name); + cy.get(".sweet-content-content input").eq(1).type("123"); + cy.get(".sweet-content-content input").eq(2).type("123"); + + // input and save job location + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.intercept("POST", getList).as("createJobLocation"); + cy.get('.sweet-modal input[id="name"]', timeOut).type(name); + cy.get(".sweet-modal button").contains("SAVE").click(); + cy.wait("@createJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 201); + + cy.get("div.vue-notification", timeOut) + .should("have.class", "success") + .and("contain", "create success"); + + // find name + cy.waitVisible("table"); + cy.get("table").contains("th", "Name").should("be.visible"); + + cy.wait(3000); + cy.waitVisible("#search-text"); + cy.get("#search-text").type(name); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // detail name + cy.intercept("GET", getDetail).as("getDetailJobLocation"); + cy.wait(2000); + cy.waitVisible("table"); + cy.get("table a").contains(name).click(); + cy.wait("@getDetailJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + }); + + it("create data if data table < 10", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getJobLocation"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.get('.pagination [class="page-item"]').then(($pagination) => { + if ($pagination.length <= 3) { + createJobLocationApi(); + } + }); + }); + + it("test user no role - list 10 of data", () => { + // login + cy.then(function () { + if (this.userName) { + cy.login(this.userName, this.userName + this.userName); + } else { + createUserNoRole(); + } + }); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getJobLocation"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("tbody th").should("have.length", 10); + }); + + it("test user no role - pagination", () => { + // login + cy.then(function () { + if (this.userName) { + cy.login(this.userName, this.userName + this.userName); + } else { + createUserNoRole(); + } + }); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getJobLocation"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get('.pagination [class="page-item"]').last().click(); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + }); + + it("test user no role - see number", () => { + // login + cy.then(function () { + if (this.userName) { + cy.login(this.userName, this.userName + this.userName); + } else { + createUserNoRole(); + } + }); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getJobLocation"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("tbody th") + .first() + .invoke("text") + .should("match", /^[0-9]*$/); + }); + + it("test user no role - not show button add", () => { + // login + cy.then(function () { + if (this.userName) { + cy.login(this.userName, this.userName + this.userName); + } else { + createUserNoRole(); + } + }); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getJobLocation"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get(".input-group-prepend").should("not.exist"); + }); + + it("test user has role - empty input and save", () => { + // login + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getJobLocation"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.waitVisible(".input-group-prepend"); + cy.get(".input-group-prepend").click(); + + // fill input and save + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.get('.sweet-modal input[id="name"]', timeOut).type(name); + cy.get(".sweet-modal button").contains("SAVE").click(); + + // Error save + cy.get("div.vue-notification", timeOut) + .should("have.class", "danger") + .and("contain", "The name field is required"); + }); + + it("test user has role - input more than 255 and save", () => { + // login + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getJobLocation"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.waitVisible(".input-group-prepend"); + cy.get(".input-group-prepend").click(); + + // fill input and save + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.get('.sweet-modal input[id="name"]', timeOut).type(generateText(256)); + cy.get(".sweet-modal button").contains("SAVE").click(); + + // Error save + cy.get("div.vue-notification", timeOut) + .should("have.class", "danger") + .and("contain", "The name may not be greater than 255 characters"); + }); +}); + +describe("HRIS - Job Location - Read", () => { + beforeEach(() => { + cy.hideXHR(); + }); + + it("test have access read", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("JOB LOCATION").click(); + + cy.intercept("GET", getList).as("getJobLocation"); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + // table list job location + cy.waitVisible("table"); + cy.get("table").contains("th", "Name").should("be.visible"); + }); + + it("test have access read - pagination, (detail) button:create,edit,delete", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("JOB LOCATION").click(); + + cy.intercept("GET", getList).as("getJobLocation"); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + // list pagination + cy.waitVisible(".pagination"); + + // find name + cy.wait(3000); + cy.waitVisible("#search-text"); + cy.get("#search-text").type(name); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // see detail name + cy.intercept("GET", getDetail).as("getDetailJobLocation"); + cy.wait(2000); + cy.waitVisible("table"); + cy.get("table a").contains(name).click(); + cy.wait("@getDetailJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.get('[type="button"]').should("contain", "CREATE"); + cy.get('[type="button"]').should("contain", "EDIT"); + cy.get('[type="button"]').should("contain", "DELETE"); + }); + + it("test have access read - list 10 of data", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getJobLocation"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("tbody th").should("have.length", 10); + }); + + it("test have access read - detail, name column", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("JOB LOCATION").click(); + + cy.intercept("GET", getList).as("getJobLocation"); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // find name + cy.wait(3000); + cy.waitVisible("#search-text"); + cy.get("#search-text").type(name); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // see detail name + cy.intercept("GET", getDetail).as("getDetailJobLocation"); + cy.wait(2000); + cy.waitVisible("table"); + cy.get("table a").contains(name).click(); + cy.wait("@getDetailJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + // name column + cy.get('.block-content input[name="name"]').should("be.visible"); + }); + + it("test have access read - pagination", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getJobLocation"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get('.pagination [class="page-item"]').last().click(); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.waitVisible(".input-group-prepend"); // button create + cy.waitVisible("#search-text"); // search + cy.waitVisible(".pagination"); // pagination + }); +}); + +describe("HRIS - Job Location - Edit", () => { + beforeEach(() => { + cy.hideXHR(); + }); + + it("test have access edit", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("JOB LOCATION").click(); + + cy.intercept("GET", getList).as("getJobLocation"); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + // table list job location + cy.waitVisible("table"); + cy.get("table").contains("th", "Name").should("be.visible"); + }); + + it("test have access edit - detail, name column", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.visit("/"); + cy.waitToken(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("EMPLOYEE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("JOB LOCATION").click(); + + cy.intercept("GET", getList).as("getJobLocation"); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // find name + cy.wait(3000); + cy.waitVisible("#search-text"); + cy.get("#search-text").type(name); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + + // see detail name + cy.intercept("GET", getDetail).as("getDetailJobLocation"); + cy.wait(2000); + cy.waitVisible("table"); + cy.get("table a").contains(name).click(); + cy.wait("@getDetailJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.get("input#name", timeOut).should("have.value", randomString); + cy.get('[type="button"]').contains("EDIT").click(); + + cy.waitVisible(".sweet-title"); + cy.get(".sweet-title").should("contain", "EDIT JOB LOCATION"); + + cy.wait("@getDetailJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible(".sweet-content-content button").last().should("be.visible"); // button update + cy.waitVisible(".sweet-modal .sweet-action-close"); // button close + + cy.wait(2000); + cy.get('.sweet-content-content input[name="name"]') + .last() + .clear() + .type(randomString + " - edit"); + + cy.wait(1500); + cy.intercept("PATCH", getDetail).as("updateJobLocation"); + cy.get(".sweet-content-content button").last().click(); + + cy.wait("@updateJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + cy.get("div.vue-notification", timeOut) + .should("have.class", "success") + .and("contain", "update success"); + }); + + it("test have access edit - empty input and save", () => { + // login + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getJobLocation"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.waitVisible(".input-group-prepend"); + cy.get(".input-group-prepend").click(); + + // clear input and save + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.get('.sweet-modal input[id="name"]', timeOut).clear(); + cy.get(".sweet-modal button").contains("SAVE").click(); + + // Error save + cy.get("div.vue-notification", timeOut) + .should("have.class", "danger") + .and("contain", "The name field is required"); + + // fill same input and save + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.get('.sweet-modal input[id="name"]', timeOut).type(name); + cy.get(".sweet-modal button").contains("SAVE").click(); + + // Error save + cy.get("div.vue-notification", timeOut) + .should("have.class", "danger") + .and("contain", "Please edit with a different name"); + }); + + it("test user has role - input more than 255 and save", () => { + // login + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getJobLocation"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.waitVisible(".input-group-prepend"); + cy.get(".input-group-prepend").click(); + + // fill input and save + cy.get(".sweet-modal").contains("button", "SAVE").should("be.visible"); + cy.get('.sweet-modal input[id="name"]', timeOut).type(generateText(256)); + cy.get(".sweet-modal button").contains("SAVE").click(); + + // Error save + cy.get("div.vue-notification", timeOut) + .should("have.class", "danger") + .and("contain", "The name may not be greater than 255 characters"); + }); +}); + +describe("HRIS - Job Location - Delete", () => { + beforeEach(() => { + cy.hideXHR(); + }); + + it("test have access delete", () => { + cy.login("admin", "admin"); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getJobLocation"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getJobLocation").its("response.statusCode").should("equal", 200); + + // table list job location + cy.waitVisible("table"); + cy.get("table").contains("th", "Name").should("be.visible"); + + cy.waitVisible("#search-text"); + cy.get("#search-text").type(randomString); + cy.wait("@getJobLocation").its("response.statusCode").should("equal", 200); + + cy.wait(2000); + cy.waitVisible("table"); + cy.get("table a") + .contains(randomString + " - edit") + .click(); + + cy.get("input#name", timeOut).should( + "have.value", + randomString + " - edit" + ); + cy.get(".block-content").contains("DELETE").click(); + + cy.intercept("DELETE", getDetail).as("deleteDepartemen"); + + cy.waitVisible(".swal2-container"); + cy.get(".swal2-container button").contains("Confirm").click(); + + cy.wait("@deleteDepartemen", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.wait(1500); + cy.url().should("contain", url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getJobLocation").its("response.statusCode").should("equal", 200); + + cy.waitVisible("table"); + cy.get("table").contains("th", "Name").should("be.visible"); + }); + + it("test delete no role - see number", () => { + // login + cy.then(function () { + if (this.userName) { + cy.login(this.userName, this.userName + this.userName); + } else { + createUserNoRole(); + } + changeRole(this.userId, this.superAdminRoleId); + }); + + cy.interceptToken(); + cy.intercept("GET", getList).as("getJobLocation"); + + cy.visit(url); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getJobLocation", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("tbody th") + .first() + .invoke("text") + .should("match", /^[0-9]*$/); + }); +}); diff --git a/tests/e2e/specs/human-resource/functions.js b/tests/e2e/specs/human-resource/functions.js new file mode 100644 index 00000000..80f93d78 --- /dev/null +++ b/tests/e2e/specs/human-resource/functions.js @@ -0,0 +1,549 @@ +import { get } from "lodash"; + +const apiUrl = Cypress.env("VUE_APP_API_ENDPOINT"); +const timeOut = { timeout: 500000 }; + +export function generateText(length) { + var result = ""; + var characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + var charactersLength = characters.length; + for (var i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; +} + +export function generateNumber(length) { + var result = ""; + var characters = "0123456789"; + var charactersLength = characters.length; + for (var i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return parseInt(result); +} + +export function getCookieValue(name) { + let document = cy.state("document"); + return document.cookie + .split("; ") + .find((row) => row.startsWith(name + "=")) + ?.split("=")[1]; +} + +export function apiRequest( + method = "GET", + path = "", + params = {}, + alias = "request" +) { + cy.request({ + method: method, + url: apiUrl + "/" + path, + body: params, + headers: { + Accept: "application/json", + Authorization: "Bearer " + getCookieValue("TAT"), + Tenant: "dev", + }, + }).then((response) => { + cy.wrap(response).as(alias); + }); +} + +export function createUserNoRole() { + let name = generateText(7); + + let params = { + first_name: name, + last_name: name, + username: name, + email: name + "@mail.com", + password: name + name, + }; + + apiRequest("POST", "register", params, "createUser"); + cy.get("@createUser").then((req) => { + expect(req.status).to.eq(201); + }); + + apiRequest("GET", "project/projects", {}, "get_code"); + cy.get("@get_code").then((req) => { + expect(req.status).to.eq(200); + }); + + cy.login(params.username, params.password); + + cy.get("@get_code").then((getCode) => { + let code = getCode.body.data[0].invitation_code; + apiRequest( + "POST", + "project/request-join", + { invitation_code: code }, + "requestJoin" + ); + }); + + cy.get("@requestJoin", timeOut).then((res) => { + apiRequest( + "PATCH", + "project/request-join/" + res.body.data.id, + {}, + "approveJoin" + ); + }); + + cy.get("@approveJoin", timeOut).then((res) => { + cy.wrap(res.body.data.user_id).as("userId"); + cy.wrap(res.body.data.user_name).as("userName"); + + apiRequest("GET", "master/roles/", {}, "getAllRoles"); + }); + + cy.get("@getAllRoles", timeOut).then((res) => { + res.body.data.forEach((roles) => { + if (roles.name == "super admin") { + cy.wrap(roles.id).as("superAdminRoleId"); + } else if (roles.name == "no role") { + cy.wrap(roles.id).as("noRoleId"); + } + }); + }); + + cy.get("@noRoleId").then((id) => { + if (!id) { + apiRequest("POST", "master/roles", { name: "no role" }, "createNoRole"); + + cy.get("@createNoRole", timeOut).then((res) => { + cy.wrap(res.body.data.id).as("noRoleId"); + }); + } + }); + + cy.then(function () { + changeRole(this.userId, this.noRoleId) + }); +} + +export function changeRole(userId, roleId) { + cy.then(function () { + apiRequest( + "PATCH", + "master/user-roles/" + userId, + { role_id: roleId }, + "setNoRole" + ); + }); +} + +export function createDepartementApi(name = null, z = 10) { + const apiDept = "human-resource/employee/groups"; + + for (let i = 0; i < z; i++) { + if (name == null) { + name = generateText(4) + } + + apiRequest("POST", apiDept, { name: name }, "createDepartemen"); + + cy.get("@createDepartemen", timeOut).then((res) => { + cy.wrap(res.body.data.id).as("departemen" + i); + }); + } +} + +export function createJobLocationApi(name = null, z = 10) { + const apiDept = "human-resource/employee/statuses"; + + for (let i = 0; i < z; i++) { + if (name == null) { + name = generateText(4) + } + + let payload = { + name: name, + multiplier_kpi: 123, + base_salary: 123 + } + + apiRequest("POST", apiDept, payload, "createEmploymentContract"); + + cy.get("@createEmploymentContract", timeOut).then((res) => { + cy.wrap(res.body.data.id).as("employee_contract_" + i); + }); + } +} + +export function createEmploymentContractApi(name = null, z = 10) { + const apiDept = "human-resource/employee/groups"; + + for (let i = 0; i < z; i++) { + if (name == null) { + name = generateText(4) + } + + apiRequest("POST", apiDept, { name: name }, "createDepartemen"); + + cy.get("@createDepartemen", timeOut).then((res) => { + cy.wrap(res.body.data.id).as("departemen" + i); + }); + } +} + +export function createEmployee(data) { + const apiEmployee = apiUrl + "/human-resource/employee/employees**"; + const urlEmployee = "/human-resource/employee"; + + cy.interceptToken(); + cy.intercept("GET", apiEmployee).as("getEmployee"); + + cy.visit(urlEmployee); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getEmployee").its("response.statusCode").should("equal", 200); + + cy.waitVisible("#search-text"); + cy.get("#search-text").type(data.name); + cy.wait("@getEmployee").its("response.statusCode").should("equal", 200); + + let exists = false; + cy.waitVisible("table"); + cy.get("table tr") + .each(($tr) => { + if ($tr.find("td").length) { + exists = true; + } + }) + .then(() => { + if (!exists) { + cy.get(".input-group-prepend").click(); + + cy.get(".sweet-title", timeOut).should( + "contain", + "EMPLOYEE INFORMATION" + ); + cy.wait(1000); + cy.get(".sweet-content-content input#name").type(data.name); + cy.wait(1000); + cy.get(".sweet-content-content input#personal-identity").type( + data.personalId + ); + cy.wait(1000); + cy.get(".sweet-content-content input#email").type(data.email); + cy.wait(1000); + cy.get(".sweet-content-content input#address") + .first() + .type(data.address); + cy.wait(1000); + cy.get(".sweet-content-content input#phone").type(data.phone); + + cy.wait(1000); + cy.get(".sweet-content-content #birth-date input").click(); + cy.wait(1000); + cy.get(".mx-datepicker-sidebar button").contains("Last Year").click(); + + cy.wait(1000); + cy.get(".sweet-content-content input#birth-place").type(data.address); + + cy.wait(1000); + cy.get(".sweet-content-content #gender button").click(); + cy.get(".v-dropdown-container.v-dropdown-no-border").each(($el) => { + if ($el.css("display") != "none") { + cy.wrap($el).find("li").first().click(); + } + }); + + cy.wait(1000); + cy.get(".sweet-content-content #marital-status button").click(); + cy.get(".v-dropdown-container.v-dropdown-no-border").each(($el) => { + if ($el.css("display") != "none") { + cy.wrap($el).find("li").first().click(); + } + }); + + cy.wait(1000); + cy.get(".sweet-content-content #religion button").click(); + cy.get(".v-dropdown-container.v-dropdown-no-border").each(($el) => { + if ($el.css("display") != "none") { + cy.wrap($el).find("li").first().click(); + } + }); + + cy.wait(1000); + cy.get(".sweet-content-content #employee-group button").click(); + cy.get(".v-dropdown-container.v-dropdown-no-border").each(($el) => { + if ($el.css("display") != "none") { + cy.wrap($el).find("li").first().click(); + } + }); + + cy.wait(1000); + cy.get(".sweet-content-content input#code").type(data.code); + cy.wait(1000); + cy.get(".sweet-content-content input#job-title").type(data.jobTitle); + + cy.wait(1000); + cy.get(".sweet-content-content #job-location button").click(); + cy.get(".v-dropdown-container.v-dropdown-no-border").each(($el) => { + if ($el.css("display") != "none") { + cy.wrap($el).find("li").first().click(); + } + }); + + cy.wait(1000); + cy.get(".sweet-content-content #join-date input").click(); + cy.wait(1000); + cy.get(".mx-datepicker-sidebar button").contains("Today").click(); + + cy.wait(1000); + cy.get(".sweet-content-content #status button").click(); + cy.get(".v-dropdown-container.v-dropdown-no-border").each(($el) => { + if ($el.css("display") != "none") { + cy.wrap($el).find("li").first().click(); + } + }); + + cy.wait(1000); + cy.get(".sweet-content-content input#company_email").type(data.email); + + cy.wait(1000); + cy.get(".sweet-content-content button") + .contains("Contract Period") + .click(); + cy.wait(1000); + cy.get(".sweet-modal").each(($el) => { + if ($el.find(".sweet-title > h2").text() == "ADD CONTRACT") { + cy.wait(1000); + cy.wrap($el) + .find(".sweet-content .form-group") + .eq(0) + .find("input") + .click(); + cy.wait(1000); + cy.get(".mx-datepicker-sidebar button") + .contains("Last Year") + .click(); + + cy.wait(1000); + cy.wrap($el) + .find(".sweet-content .form-group") + .eq(1) + .find("input") + .click(); + cy.wait(1000); + cy.get(".mx-datepicker-sidebar button").contains("Today").click(); + + cy.wait(1000); + cy.wrap($el) + .find(".sweet-content .form-group") + .eq(2) + .find("input") + .type(data.note); + + cy.wait(1000); + cy.wrap($el) + .find(".sweet-content-content > .pull-right > button") + .last() + .click(); + } + }); + + cy.wait(1000); + cy.get(".sweet-content-content button") + .contains("Employee Assessor") + .click(); + cy.wait(1000); + cy.get(".sweet-modal").each(($el) => { + if ($el.find(".sweet-title > h2").text() == "ADD SCORER") { + cy.wait(1000); + cy.wrap($el).find(".sweet-content .list-group a").first().click(); + } + }); + + cy.wait(1000); + cy.get(".sweet-content-content #user-account button").click(); + cy.get(".v-dropdown-container.v-dropdown-no-border").each(($el) => { + if ($el.css("display") != "none") { + cy.wrap($el).find("li").first().click(); + } + }); + + cy.wait(1000); + cy.get(".sweet-modal-overlay").each(($el) => { + if ($el.css("display") != "none") { + cy.wrap($el) + .find(".sweet-content-content > .pull-right > button") + .click(); + } + }); + + cy.wait(3000); + + cy.get("div.vue-notification", timeOut) + .should("have.class", "success") + .and("contain", "create success"); + + cy.wait(1500); + cy.url().should("contain", urlEmployee); + cy.wait("@getEmployee").its("response.statusCode").should("equal", 200); + } + }); + + cy.waitVisible("table"); + cy.get("table td").should("contain", data.name); +} + +export function createKpiTemplate(name, group = false, indicator = false) { + const apiTemplate = apiUrl + "/human-resource/kpi/template**"; + const urlTemplate = "/human-resource/kpi-template"; + + cy.interceptToken(); + cy.intercept("GET", apiTemplate).as("getTemplate"); + + cy.visit(urlTemplate); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getTemplate", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("#search-text"); + cy.get("#search-text").type(name); + cy.wait("@getTemplate", timeOut) + .its("response.statusCode") + .should("equal", 200); + + let exists = false; + cy.waitVisible("table"); + cy.get("table tr") + .each(($tr) => { + if ($tr.find("td").length) { + exists = true; + } + }) + .then(() => { + if (!exists) { + cy.get(".nav-item > a").should("contain", "ADD"); + cy.get(".nav-item > a").contains("ADD").click(); + + cy.intercept("POST", apiTemplate).as("createKpiTemplate"); + + cy.waitVisible("#create"); + cy.get("#create input#name").type(name); + cy.get("#create [type=submit]").click(); + + cy.wait("@createKpiTemplate", timeOut) + .its("response.statusCode") + .should("equal", 201); + cy.get("div.vue-notification", timeOut) + .should("have.class", "success") + .and("contain", "Create success"); + cy.wait("@getTemplate", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + if (group && indicator) { + editKpiTemplate(name, group, indicator); + } + } else { + cy.waitVisible("table"); + cy.get("table td").should("contain", name); + } + }); +} + +export function editKpiTemplate(name, group, indicator) { + const urlTemplate = "/human-resource/kpi-template"; + const apiTemplate = apiUrl + "/human-resource/kpi/template"; + const getList = apiTemplate + "s**"; + const getDetail = apiTemplate + "s/*"; + + cy.interceptToken(); + cy.intercept("GET", getList).as("getKpiTemplate"); + + cy.visit(urlTemplate); + + cy.waitToken(); + cy.wait(2000); + cy.wait("@getKpiTemplate", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.waitVisible("#search-text"); + cy.get("#search-text").clear().type(name); + cy.wait("@getKpiTemplate", timeOut) + .its("response.statusCode") + .should("equal", 200); + + cy.intercept("GET", getDetail).as("getDetailKpiTemplate"); + + cy.waitVisible("table"); + cy.get("table td").contains(name).click(); + + cy.log("Create group"); + + cy.wait("@getDetailKpiTemplate", timeOut) + .its("response.statusCode") + .should("equal", 200); + cy.waitVisible("table"); + cy.get("table td").should("contain", "NO"); + cy.get("table td").should("contain", "KEY PERFORMANCE INDICATOR"); + cy.get("table td").should("contain", "WEIGHT"); + cy.get("table td button").should("contain", "GROUP"); + cy.wait(1500); + cy.get("table td button").contains("GROUP").click(); + + cy.intercept("POST", apiTemplate + "-groups").as("createKpiTemplateGroups"); + + cy.waitVisible("#group"); + cy.get("#group .block-header").should("contain", "KPI TEMPLATE GROUP"); + cy.get("#group input").type(group); + cy.wait(2000); + cy.get("#group [type=submit]").click(); + + cy.wait("@createKpiTemplateGroups", timeOut) + .its("response.statusCode") + .should("equal", 201); + + cy.get("#group .block-content tr td", timeOut).should("contain", group); + cy.wait(2000); + cy.get("#group .modal-footer [type=button]").click(); + + cy.wait(2000); + cy.log("create indicator"); + + cy.wait(1500); + cy.get("table td button").contains("INDICATOR").click(); + + cy.intercept("POST", apiTemplate + "-indicators").as( + "createKpiTemplateIndicators" + ); + + cy.waitVisible("#indicator"); + cy.get("#indicator .block-header").should( + "contain", + "KPI TEMPLATE INDICATOR" + ); + cy.get("#indicator input#name").type(indicator); + cy.wait(500); + cy.get("#indicator input#weight").type(100); + cy.wait(500); + cy.get("#indicator input#target").type(80); + cy.wait(500); + cy.get("#indicator [type=submit]").click(); + + cy.wait("@createKpiTemplateIndicators", timeOut) + .its("response.statusCode") + .should("equal", 201); + + cy.get("#indicator .block-content tr td", timeOut).should( + "contain", + indicator + ); + cy.wait(2000); + cy.get("#indicator .modal-footer [type=button]").click(); +} diff --git a/tests/e2e/specs/human-resource/kpi/assessment.cy.js b/tests/e2e/specs/human-resource/kpi/assessment.cy.js new file mode 100644 index 00000000..37e2136b --- /dev/null +++ b/tests/e2e/specs/human-resource/kpi/assessment.cy.js @@ -0,0 +1,160 @@ +import * as hrFunctions from '../functions' + +const { should } = require("chai") +const url = '/human-resource/kpi/kpi-assessment' +const apiUrl = Cypress.env('VUE_APP_API_ENDPOINT') +const apiEmployee = apiUrl + '/human-resource/employee/employees' +const listEmployee = apiEmployee + '**' +const getEmployee = apiEmployee + '/*' +const apiAssignAssessment = getEmployee + '*/**' +const apiTemplate = apiUrl + '/human-resource/kpi/templates**' +const timeOut = { timeout : 300000 } + +const fileName = 'example.pdf' + +const departmentName = 'Departemen Name' +const jobLocation = 'Surabaya' +const employmentContract = 'Kontrak 1' +const employeeName = 'John Doe' +const kpiTemplateName = 'Template 1' +const kpiTemplateGroup = 'Template Group 1' +const kpiTemplateIndicator = 'Template Indicator 1' + +describe('KPI Assessement - Index', () => { + beforeEach(() => { + cy.hideXHR() + cy.login('admin', 'admin') + }) + + it('Create Departemen', () => { + hrFunctions.createDepartementApi(departmentName, 1) + }) + + it('Create Job location', () => { + hrFunctions.createJobLocationApi(jobLocation, 1) + }) + + it('Create Employment Contract', () => { + hrFunctions.createEmploymentContract(employmentContract, 1) + }) + + it('Create Employment', () => { + hrFunctions.createEmployee({ + name: employeeName, + personalId: 'A001', + email: 'john.doe@mail.com', + address: 'Lorem Ipsum', + phone: '08123456789', + code: '121314', + jobTitle: 'HR', + note: 'call my name JD' + }) + }) + + it('Create and Edit KPI Template', () => { + hrFunctions.createKpiTemplate(kpiTemplateName, kpiTemplateGroup, kpiTemplateIndicator) + }) + + it('Index KPI Assessement', () => { + cy.interceptToken() + cy.visit('/') + cy.waitToken() + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("KPI").click(); + + cy.intercept('GET', listEmployee).as('getEmployee') + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("KPI ASSESSMENT").click(); + + cy.wait('@getEmployee', timeOut).its('response.statusCode').should('equal', 200) + cy.url().should('contain', url) + + cy.waitVisible('table'); + cy.get('table th').should('contain', 'name') + cy.get('table th').should('contain', 'job title') + cy.get('table th').should('contain', 'department') + cy.get('table th').should('contain', 'action') + + cy.waitVisible('#search-text'); + cy.get('#search-text').type(employeeName) + cy.wait('@getEmployee').its('response.statusCode').should('equal', 200) + + cy.get('table td').should('contain', employeeName) + }) + + it('Create KPI Assessement', () => { + cy.interceptToken() + cy.intercept('GET', listEmployee).as('getEmployee') + + cy.visit(url) + + cy.waitToken() + cy.wait(2000) + cy.wait('@getEmployee', timeOut).its('response.statusCode').should('equal', 200) + + cy.waitVisible('#search-text'); + cy.get('#search-text').type(employeeName) + cy.wait('@getEmployee', timeOut).its('response.statusCode').should('equal', 200) + + cy.intercept('GET', getEmployee).as('getDetailEmployee') + cy.waitVisible('table'); + cy.get('table td').contains(employeeName).parents('tr').find('a').first().click() + + cy.wait('@getDetailEmployee', timeOut).its('response.statusCode').should('equal', 200) + + cy.intercept('GET', apiTemplate).as('getTemplate') + + cy.waitVisible('#assign-assessment-modal') + cy.get('#assign-assessment-modal .block-title').should('contain', 'ASSIGN KPI TEMPLATE') + cy.get('#assign-assessment-modal #search-text').type(kpiTemplateName) + + cy.wait('@getTemplate', timeOut).its('response.statusCode').should('equal', 200) + cy.waitVisible('#assign-assessment-modal .list-group') + cy.get('#assign-assessment-modal .list-group a:first-child').click() + + cy.intercept('POST', apiAssignAssessment).as('assignAssessment') + + cy.wait(1000) + cy.get('#assign-assessment-modal [type=submit]').click() + + cy.wait('@assignAssessment', timeOut).its('response.statusCode').should('equal', 200) + + cy.get('form.row > .col-sm-12').find('h3', timeOut).shoul('contain', 'ASSESSMENT') + cy.get('form.row > .col-sm-12 div.col-form-label', timeOut).first().shoul('contain', employeeName) + cy.get('form.row > .col-sm-12 div.col-form-label', timeOut).eq(1).shoul('contain', kpiTemplateName) + + cy.get('form.row > .col-sm-12 .table-responsive tbody tr:first-child td:first-child').should('contain', kpiTemplateGroup) + cy.get('form.row > .col-sm-12 .table-responsive tbody tr:nth-child(2) td:nth-child(2)').should('contain', kpiTemplateIndicator) + + cy.get('form.row > .col-sm-12 .table-responsive tbody tr:nth-child(2) td:nth-child(5) a:first-child').click() + cy.waitVisible('#assign-notes') + cy.get('#assign-comment h3').should('contain','NOTES ASSESSMENT') + cy.get('#assign-notes textarea').type('note assessment') + cy.get('#assign-notes button[type=submit]').click() + cy.get('form.row > .col-sm-12 .table-responsive tbody tr:nth-child(2) td:nth-child(5) a:nth-child(2)', timeOut).should('be.visible') + + cy.get('form.row > .col-sm-12 input[type=file]').attachFile(fileName) + cy.get('form.row > .col-sm-12 input[type=file]').parent().find('label').contains(fileName) + + cy.get('form.row > .col-sm-12 .table-responsive tbody tr:nth-child(2) td:last-child a:first-child').click() + cy.waitVisible('#assign-comment') + cy.get('#assign-comment h3').should('contain','COMMENT ASSESSMENT') + cy.get('#assign-comment textarea').type('comment assessment') + cy.get('#assign-comment button[type=submit]').click() + + cy.get('.block-content-inner > div:last-child button').contains('SAVE').click() + + cy.get('#main-container .content .block nav .active', timeOut).should('contain', 'HISTORY ASSESSMENT') + + cy.get('.table-responsive table thead tr td:nth-child(2)').should('contain', 'kpi template') + cy.get('.table-responsive table tbody tr:first-child td:nth-child(2)').should('contain', kpiTemplateName) + }) +}) \ No newline at end of file diff --git a/tests/e2e/specs/human-resource/kpi/template.cy.js b/tests/e2e/specs/human-resource/kpi/template.cy.js new file mode 100644 index 00000000..5ef2e948 --- /dev/null +++ b/tests/e2e/specs/human-resource/kpi/template.cy.js @@ -0,0 +1,288 @@ +import { generateText, createKpiTemplate, editKpiTemplate } from '../functions' + +const { should } = require("chai") +const templateName = generateText(7) +const templateGroup = generateText(7) +const templateIndicator = generateText(7) +const url = '/human-resource/kpi-template' +const apiUrl = Cypress.env('VUE_APP_API_ENDPOINT') + '/human-resource/kpi/template' +const getList = apiUrl + 's**' +const getDetail = apiUrl + 's/*' +const timeOut = { timeout : 300000 } + +describe('HR - KPI Template', () => { + beforeEach(() => { + cy.hideXHR() + cy.login('admin', 'admin') + }) + + it('Index KPI Template', () => { + cy.interceptToken() + cy.visit('/') + cy.waitToken() + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("MAIN MENU").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("HUMAN RESOURCE").click(); + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("KPI").click(); + + cy.intercept('GET', getList).as('getKpiTemplate') + + cy.waitVisible("#main-container > .content"); + cy.get('#main-container a[href*="/"]').contains("KPI TEMPLATE").click(); + + cy.wait('@getKpiTemplate', timeOut).its('response.statusCode').should('equal', 200) + + cy.waitVisible('table'); + cy.get('table th').should('contain', 'Kpi Category') + cy.get('table th').should('contain', 'Total Weight') + + cy.get('.nav-item > a').should('contain', 'ADD') + cy.get('.nav-item > a').should('contain', 'IMPORT') + }) + + it('Create KPI Template', () => { + createKpiTemplate(templateName) + }) + + it('Edit KPI Template', () => { + editKpiTemplate(templateName, templateGroup, templateIndicator) + }) + + it('Duplicate KPI Template', () => { + cy.interceptToken() + cy.intercept('GET', getList).as('getKpiTemplate') + + cy.visit(url) + + cy.waitToken() + cy.wait(2000) + cy.wait('@getKpiTemplate', timeOut).its('response.statusCode').should('equal', 200) + + cy.waitVisible('table'); + cy.get('table th').should('contain', 'Kpi Category') + cy.get('table th').should('contain', 'Total Weight') + + cy.get('.nav-item > a').should('contain', 'ADD') + cy.get('.nav-item > a').should('contain', 'IMPORT') + + cy.waitVisible('#search-text'); + cy.get('#search-text').clear().type(templateName) + cy.wait('@getKpiTemplate', timeOut).its('response.statusCode').should('equal', 200) + + cy.intercept('POST', getDetail).as('duplicate') + + cy.waitVisible('table'); + cy.get('table td').contains(templateName).parents('tr').find('button').contains('DUPLICATE').click() + cy.wait('@duplicate', timeOut).its('response.statusCode').should('equal', 201) + cy.wait('@getKpiTemplate', timeOut).its('response.statusCode').should('equal', 200) + + cy.waitVisible('#search-text'); + cy.get('#search-text').clear().type(templateName + ' (duplicate)') + cy.wait('@getKpiTemplate', timeOut).its('response.statusCode').should('equal', 200) + + cy.waitVisible('table'); + cy.get('table td').should('contain', templateName + ' (duplicate)') + }) + + it('Rename KPI Template', () => { + cy.interceptToken() + cy.intercept('GET', getList).as('getKpiTemplate') + + cy.visit(url) + + cy.waitToken() + cy.wait(2000) + cy.wait('@getKpiTemplate', timeOut).its('response.statusCode').should('equal', 200) + + cy.waitVisible('table'); + cy.get('table th').should('contain', 'Kpi Category') + cy.get('table th').should('contain', 'Total Weight') + + cy.get('.nav-item > a').should('contain', 'ADD') + cy.get('.nav-item > a').should('contain', 'IMPORT') + + cy.waitVisible('#search-text'); + cy.get('#search-text').clear().type(templateName + ' (duplicate)') + cy.wait('@getKpiTemplate', timeOut).its('response.statusCode').should('equal', 200) + + cy.intercept('PATCH', getDetail).as('updateName') + + cy.waitVisible('table'); + cy.get('table td').contains(templateName + ' (duplicate)').parents('tr').find('a').contains('RENAME').click() + + cy.get('#edit input#name', timeOut).should('have.value', templateName + ' (duplicate)').clear().type(templateName + ' (renamed)') + cy.wait(1500) + cy.get('#edit [type=submit]').click() + + cy.wait('@updateName', timeOut).its('response.statusCode').should('equal', 200) + cy.wait('@getKpiTemplate', timeOut).its('response.statusCode').should('equal', 200) + + cy.waitVisible('#search-text'); + cy.get('#search-text').clear().type(templateName + ' (renamed)') + cy.wait('@getKpiTemplate', timeOut).its('response.statusCode').should('equal', 200) + + cy.waitVisible('table'); + + cy.get('table td').should('contain', templateName + ' (renamed)') + }) + + it('Export KPI Template', () => { + cy.interceptToken() + cy.intercept('GET', getList).as('getKpiTemplate') + + cy.visit(url) + + cy.waitToken() + cy.wait(2000) + cy.wait('@getKpiTemplate', timeOut).its('response.statusCode').should('equal', 200) + + cy.waitVisible('table'); + cy.get('table th').should('contain', 'Kpi Category') + cy.get('table th').should('contain', 'Total Weight') + + cy.get('.nav-item > a').should('contain', 'ADD') + cy.get('.nav-item > a').should('contain', 'IMPORT') + + cy.waitVisible('#search-text'); + cy.get('#search-text').clear().type(templateName + ' (renamed)') + cy.wait('@getKpiTemplate', timeOut).its('response.statusCode').should('equal', 200) + + cy.intercept('POST', getDetail).as('export') + + const stub = cy.stub().as('open') + cy.on('window:before:load', (win) => { + cy.stub(win, 'open').callsFake(stub) + }) + + cy.waitVisible('table'); + cy.get('table td').contains(templateName + ' (renamed)').parents('tr').find('button').contains('EXPORT').click() + + cy.get('@open', timeOut).should('have.been.calledOnce') + + cy.wait('@export', timeOut).its('response.body.data.url') + .should('match', /download/).end() + }) + + it('Archive and filter', () => { + cy.interceptToken() + cy.intercept('GET', getList).as('getKpiTemplate') + + cy.visit(url) + + cy.waitToken() + cy.wait(2000) + cy.wait('@getKpiTemplate', timeOut).its('response.statusCode').should('equal', 200) + + cy.waitVisible('table'); + cy.get('table th').should('contain', 'Kpi Category') + cy.get('table th').should('contain', 'Total Weight') + + cy.waitVisible('#search-text'); + cy.get('#search-text').clear().type(templateName + ' (renamed)') + cy.wait('@getKpiTemplate', timeOut).its('response.statusCode').should('equal', 200) + + cy.waitVisible('table'); + cy.get('table td') + .contains(templateName + ' (renamed)') + .parents('tr') + .find('td:nth-child(2) input#subscibe') + .click({force: true}) + + cy.intercept('PATCH', getDetail).as('archive') + + cy.get('div.fadeIn button', timeOut).contains('ARCHIVE').click() + + cy.wait('@archive', timeOut).its('response.statusCode').should('equal', 200) + cy.wait('@getKpiTemplate', timeOut).its('response.statusCode').should('equal', 200) + + cy.log('filter archive') + + cy.waitVisible('table'); + cy.get('table th').should('contain', 'Kpi Category') + cy.get('table th').should('contain', 'Total Weight') + + cy.wait(1500) + cy.get('.block-content a').contains('ADVANCE FILTER').click() + + cy.wait(1500) + cy.get('.fadeIn span').contains('SELECT').click() + + cy.wait(1500) + cy.get('.sweet-modal h2').should('contain', 'SELECT') + cy.get('.sweet-modal .sweet-content a').contains('ARCHIVED').click() + cy.wait('@getKpiTemplate', timeOut).its('response.statusCode').should('equal', 200) + + cy.waitVisible('table'); + cy.get('table td').should('contain', templateName + ' (renamed)') + }) + + it('Impor\'t KPI Template', () => { + const fileName = 'DEV - KPI Template Export - abc.xlsx' + + cy.interceptToken() + cy.intercept('GET', getList).as('getKpiTemplate') + + cy.visit(url) + + cy.waitToken() + cy.wait(2000) + cy.wait('@getKpiTemplate', timeOut).its('response.statusCode').should('equal', 200) + + cy.waitVisible('table'); + cy.get('table th').should('contain', 'Kpi Category') + cy.get('table th').should('contain', 'Total Weight') + + cy.intercept('POST', apiUrl + 's/import/check').as('importTemplate') + + cy.get('.nav-item > a').should('contain', 'IMPORT') + cy.get('.nav-item > a').contains('IMPORT').parent().find('[id="file"]').attachFile(fileName) + + cy.fixture(fileName, 'binary') + .then(Cypress.Blob.binaryStringToBlob) + .then(fileContent => { + cy.get('.nav-item > a').contains('IMPORT').parent().find('[id="file"]') + .attachFile({ fileContent, fileName, mimeType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', encoding:'utf8' }) + }) + + cy.wait('@importTemplate', timeOut).its('response.statusCode').should('equal', 200) + cy.wait('@getKpiTemplate', timeOut).its('response.statusCode').should('equal', 200) + + cy.waitVisible('#search-text'); + cy.get('#search-text').clear().type('abc') + cy.wait('@getKpiTemplate', timeOut).its('response.statusCode').should('equal', 200) + + cy.waitVisible('table'); + cy.get('table td').should('contain', 'abc') + }) + + it('Remove KPI Template', () => { + cy.interceptToken() + cy.intercept('GET', getList).as('getKpiTemplate') + + cy.visit(url) + + cy.waitToken() + cy.wait(2000) + cy.wait('@getKpiTemplate', timeOut).its('response.statusCode').should('equal', 200) + + cy.waitVisible('table'); + cy.get('table th').should('contain', 'Kpi Category') + cy.get('table th').should('contain', 'Total Weight') + + cy.waitVisible('#search-text'); + cy.get('#search-text').clear().type('abc') + cy.wait('@getKpiTemplate', timeOut).its('response.statusCode').should('equal', 200) + + cy.intercept('DELETE', getDetail).as('delete') + + cy.waitVisible('table'); + cy.get('table td').contains('abc').parents('tr').find('button').contains('REMOVE').click() + cy.wait('@delete', timeOut).its('response.statusCode').should('equal', 200) + cy.wait('@getKpiTemplate', timeOut).its('response.statusCode').should('equal', 200) + }) +}) \ No newline at end of file diff --git a/tests/e2e/specs/index.cy.js b/tests/e2e/specs/index.cy.js new file mode 100644 index 00000000..13ed35e7 --- /dev/null +++ b/tests/e2e/specs/index.cy.js @@ -0,0 +1,30 @@ +describe('Login Test', () => { + const url = '/' + + beforeEach(() => { + cy.hideXHR() + }) + + it('Visits the login page', () => { + cy.visit(url) + cy.url().should('contain', '/auth/signin') + cy.get('h1').should('contain', 'Welcome to Point.RED') + }) + + it('Try to login', () => { + cy.intercept('POST', '**/api/v1/auth/login**').as('getLogin') + cy.intercept('GET', '**/api/v1/reward/tokens**').as('getToken') + cy.intercept('POST', '**/api/v1/auth/fetch**').as('authFetch') + + cy.get('#username').type('admin') + cy.get('#password').type('admin') + cy.get('button').click() + + cy.wait('@getLogin').its('response.statusCode').should('equal', 200) + cy.wait('@getToken').its('response.statusCode').should('equal', 200) + cy.wait('@authFetch').its('response.statusCode').should('equal', 200) + + cy.url().should('contain', url) + cy.get('p').should('contain', 'MAIN MENU') + }) +}) diff --git a/tests/e2e/specs/test.js b/tests/e2e/specs/test.js deleted file mode 100644 index 41ad94a0..00000000 --- a/tests/e2e/specs/test.js +++ /dev/null @@ -1,8 +0,0 @@ -// https://docs.cypress.io/api/introduction/api.html - -describe('My First Test', () => { - it('Visits the app root url', () => { - cy.visit('/') - cy.contains('h1', 'Welcome to Your Vue.js App') - }) -}) diff --git a/tests/e2e/support/commands.js b/tests/e2e/support/commands.js index c1f5a772..b265d6a6 100644 --- a/tests/e2e/support/commands.js +++ b/tests/e2e/support/commands.js @@ -23,3 +23,57 @@ // // -- This is will overwrite an existing command -- // Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) + +const apiUrl = Cypress.env('VUE_APP_API_ENDPOINT') + +// -- This is will hide request some xhr -- +Cypress.Commands.add('hideXHR', () => { + Cypress.on("log:added", ev => { + if (["xhr", "other", "new url"].includes(ev.displayName)) { + const el = Array.from( + window.top.document.querySelectorAll(".command-wrapper") + ).slice(-1)[0] + if (el) { + el.parentElement.style.display = "none" + } + } + }) +}) + +Cypress.Commands.add('login', (username, password) => { + cy.request({ + method: 'POST', + url: apiUrl + '/auth/login', + body: { + username: username, + password: password + } + }).then(({ body }) => { + cy.setCookie('TED', 'Undefined') + cy.setCookie('TTT', 'Bearer') + cy.setCookie('TAT', body.data.access_token) + cy.setCookie('TID', body.data.token_id) + }) +}) + +Cypress.Commands.add('interceptToken', () => { + cy.intercept('GET', apiUrl + '/reward/tokens**').as('getToken') + cy.intercept('POST', apiUrl + '/auth/fetch**').as('authFetch') +}) + +Cypress.Commands.add('waitToken', () => { + const timeOut = { timeout: 300000 } + + cy.wait('@getToken', timeOut).its('response.statusCode').should('equal', 200) + cy.wait('@authFetch', timeOut).its('response.statusCode').should('equal', 200) +}) + +Cypress.Commands.add('waitVisible', (target, idx) => { + const timeOut = { timeout: 300000 } + if (idx) { + cy.get(target).eq(idx, timeOut).should('be.visible'); + } else { + cy.get(target, timeOut).should('be.visible'); + } + cy.wait(2000) +}) diff --git a/tests/e2e/support/index.js b/tests/e2e/support/index.js index d68db96d..220e2cb2 100644 --- a/tests/e2e/support/index.js +++ b/tests/e2e/support/index.js @@ -15,6 +15,6 @@ // Import commands.js using ES2015 syntax: import './commands' - +import 'cypress-file-upload' // Alternatively you can use CommonJS syntax: // require('./commands') diff --git a/yarn.lock b/yarn.lock index b2661d8d..06c0f1b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -968,6 +968,11 @@ resolved "https://registry.yarnpkg.com/@bugsnag/safe-json-stringify/-/safe-json-stringify-2.1.0.tgz#c7dd30a33bd888c39cd36d45216f7252f307ed36" integrity sha512-tE2cPhAq+WFnA9XrfMfP+u/6L63eH7+PmONMNSXtP6kPt/iUXnwkDsxc1Q6lUP1oM3LsmWBrxn+/93M8JE6fpA== +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + "@cypress/listr-verbose-renderer@0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#a77492f4b11dcc7c446a34b3e28721afd33c642a" @@ -978,7 +983,31 @@ date-fns "^1.27.2" figures "^1.7.0" -"@cypress/xvfb@1.2.4": +"@cypress/request@^2.88.10": + version "2.88.10" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.10.tgz#b66d76b07f860d3a4b8d7a0604d020c662752cce" + integrity sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + http-signature "~1.3.6" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^8.3.2" + +"@cypress/xvfb@1.2.4", "@cypress/xvfb@^1.2.4": version "1.2.4" resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== @@ -1501,6 +1530,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.36.tgz#c0d5f2fe76b47b63e0e0efc3d2049a9970d68794" integrity sha512-V3orv+ggDsWVHP99K3JlwtH20R7J4IhI1Kksgc+64q5VxgfRkQG8Ws3MFm/FZOKDYGy9feGFlZ70/HpCNe9QaA== +"@types/node@^14.14.31": + version "14.18.33" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.33.tgz#8c29a0036771569662e4635790ffa9e057db379b" + integrity sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg== + "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" @@ -1516,11 +1550,28 @@ resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== +"@types/sinonjs__fake-timers@8.1.1": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" + integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== + "@types/sizzle@2.3.2": version "2.3.2" resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.2.tgz#a811b8c18e2babab7d542b3365887ae2e4d9de47" integrity sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg== +"@types/sizzle@^2.3.2": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" + integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== + +"@types/yauzl@^2.9.1": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + dependencies: + "@types/node" "*" + "@vue/babel-helper-vue-jsx-merge-props@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz#31624a7a505fb14da1d58023725a4c5f270e6a81" @@ -2243,7 +2294,7 @@ arch@2.1.1: resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e" integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg== -arch@^2.1.1: +arch@^2.1.1, arch@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== @@ -2506,11 +2557,21 @@ async@^2.6.2: dependencies: lodash "^4.17.14" +async@^3.2.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -2657,7 +2718,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.0.2: +base64-js@^1.0.2, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -2742,6 +2803,11 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" +blob-util@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" + integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== + block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" @@ -2754,7 +2820,7 @@ bluebird@3.5.0: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" integrity sha512-3LE8m8bqjGdoxfvf71yhFNrUcwy3NLy00SAo+b6MfJ8l+Bc2DzQ7mUHwX6pjK2AxfgV+YfsjCeVW3T5HLQTBsQ== -bluebird@^3.1.1, bluebird@^3.5.5: +bluebird@^3.1.1, bluebird@^3.5.5, bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -2984,6 +3050,14 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" +buffer@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + buffers@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" @@ -3112,6 +3186,11 @@ cachedir@1.3.0: dependencies: os-homedir "^1.0.1" +cachedir@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" + integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== + call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -3304,7 +3383,7 @@ check-error@^1.0.2: resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== -check-more-types@2.24.0: +check-more-types@2.24.0, check-more-types@^2.24.0: version "2.24.0" resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== @@ -3363,6 +3442,11 @@ ci-info@^1.5.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== +ci-info@^3.2.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.5.0.tgz#bfac2a29263de4c829d806b1ab478e35091e171f" + integrity sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw== + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -3449,6 +3533,15 @@ cli-spinners@^2.0.0: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== +cli-table3@~0.6.1: + version "0.6.3" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" + integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + cli-truncate@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" @@ -3677,6 +3770,11 @@ commander@^2.18.0, commander@^2.19.0, commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + commander@^6.2.0: version "6.2.1" resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" @@ -4197,6 +4295,59 @@ cyclist@^1.0.1: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A== +cypress-file-upload@^5.0.8: + version "5.0.8" + resolved "https://registry.yarnpkg.com/cypress-file-upload/-/cypress-file-upload-5.0.8.tgz#d8824cbeaab798e44be8009769f9a6c9daa1b4a1" + integrity sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g== + +cypress@^10.11.0: + version "10.11.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-10.11.0.tgz#e9fbdd7638bae3d8fb7619fd75a6330d11ebb4e8" + integrity sha512-lsaE7dprw5DoXM00skni6W5ElVVLGAdRUUdZjX2dYsGjbY/QnpzWZ95Zom1mkGg0hAaO/QVTZoFVS7Jgr/GUPA== + dependencies: + "@cypress/request" "^2.88.10" + "@cypress/xvfb" "^1.2.4" + "@types/node" "^14.14.31" + "@types/sinonjs__fake-timers" "8.1.1" + "@types/sizzle" "^2.3.2" + arch "^2.2.0" + blob-util "^2.0.2" + bluebird "^3.7.2" + buffer "^5.6.0" + cachedir "^2.3.0" + chalk "^4.1.0" + check-more-types "^2.24.0" + cli-cursor "^3.1.0" + cli-table3 "~0.6.1" + commander "^5.1.0" + common-tags "^1.8.0" + dayjs "^1.10.4" + debug "^4.3.2" + enquirer "^2.3.6" + eventemitter2 "6.4.7" + execa "4.1.0" + executable "^4.1.1" + extract-zip "2.0.1" + figures "^3.2.0" + fs-extra "^9.1.0" + getos "^3.2.1" + is-ci "^3.0.0" + is-installed-globally "~0.4.0" + lazy-ass "^1.6.0" + listr2 "^3.8.3" + lodash "^4.17.21" + log-symbols "^4.0.0" + minimist "^1.2.6" + ospath "^1.2.2" + pretty-bytes "^5.6.0" + proxy-from-env "1.0.0" + request-progress "^3.0.0" + semver "^7.3.2" + supports-color "^8.1.1" + tmp "~0.2.1" + untildify "^4.0.0" + yauzl "^2.10.0" + cypress@^3.8.3: version "3.8.3" resolved "https://registry.yarnpkg.com/cypress/-/cypress-3.8.3.tgz#e921f5482f1cbe5814891c878f26e704bbffd8f4" @@ -4275,6 +4426,11 @@ dateformat@^2.0.0: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" integrity sha512-GODcnWq3YGoTnygPfi02ygEiRxqUxpJwuRHjdhJYuxpcZmDq4rjBiXYmbCCzStxo176ixfLT6i4NPwQooRySnw== +dayjs@^1.10.4: + version "1.11.6" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.6.tgz#2e79a226314ec3ec904e3ee1dd5a4f5e5b1c7afb" + integrity sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ== + de-indent@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" @@ -4308,7 +4464,7 @@ debug@^3.1.0, debug@^3.1.1, debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.4: +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -5232,6 +5388,11 @@ eventemitter2@4.1.2: resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-4.1.2.tgz#0e1a8477af821a6ef3995b311bf74c23a5247f15" integrity sha512-erx0niBaTi8B7ywjGAcg8ilGNRl/xs/o4MO2ZMpRlpZ62mYzjGTBlOpxxRIrPQqBs9mbXkEux6aR+Sc5vQ/wUw== +eventemitter2@6.4.7: + version "6.4.7" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" + integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== + eventemitter3@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-2.0.3.tgz#b5e1079b59fb5e1ba2771c0a993be060a58c99ba" @@ -5273,6 +5434,21 @@ execa@0.10.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@4.1.0, execa@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + execa@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" @@ -5315,22 +5491,7 @@ execa@^3.3.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" -execa@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - -executable@4.1.1: +executable@4.1.1, executable@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== @@ -5459,6 +5620,17 @@ extract-zip@1.6.7: mkdirp "0.5.1" yauzl "2.4.1" +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -5575,7 +5747,7 @@ figures@^1.7.0: escape-string-regexp "^1.0.5" object-assign "^4.1.0" -figures@^3.0.0: +figures@^3.0.0, figures@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== @@ -5878,6 +6050,16 @@ fs-extra@^7.0.1: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" @@ -6028,7 +6210,7 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" -get-stream@^5.0.0: +get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== @@ -6055,6 +6237,13 @@ getos@3.1.1: dependencies: async "2.6.1" +getos@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" + integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== + dependencies: + async "^3.2.0" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -6161,6 +6350,13 @@ global-dirs@^0.1.0: dependencies: ini "^1.3.4" +global-dirs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== + dependencies: + ini "2.0.0" + global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -6274,7 +6470,7 @@ good-listener@^1.2.2: dependencies: delegate "^3.1.2" -graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.2: +graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== @@ -6760,6 +6956,15 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +http-signature@~1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" + integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== + dependencies: + assert-plus "^1.0.0" + jsprim "^2.0.2" + sshpk "^1.14.1" + https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" @@ -6789,7 +6994,7 @@ idb@3.0.2: resolved "https://registry.yarnpkg.com/idb/-/idb-3.0.2.tgz#c8e9122d5ddd40f13b60ae665e4862f8b13fa384" integrity sha512-+FLa/0sTXqyux0o6C+i2lOR0VoS60LU/jzUo5xjfY6+7sEEgy4Gz1O7yFBXvjd7N0NyIGWIRg8DcQSLEG+VSPw== -ieee754@^1.1.4: +ieee754@^1.1.13, ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -6917,6 +7122,11 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + ini@^1.3.4: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" @@ -7084,6 +7294,13 @@ is-ci@1.2.1, is-ci@^1.0.10: dependencies: ci-info "^1.5.0" +is-ci@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + is-color-stop@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" @@ -7213,6 +7430,14 @@ is-installed-globally@0.1.0: global-dirs "^0.1.0" is-path-inside "^1.0.0" +is-installed-globally@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + is-negated-glob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" @@ -7283,6 +7508,11 @@ is-path-inside@^2.1.0: dependencies: path-is-inside "^1.0.2" +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -7626,6 +7856,15 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" @@ -7641,6 +7880,16 @@ jsprim@^1.2.2: json-schema "0.4.0" verror "1.10.0" +jsprim@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d" + integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + jszip@^3.9.1: version "3.10.0" resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.0.tgz#faf3db2b4b8515425e34effcdbb086750a346061" @@ -7713,7 +7962,7 @@ launch-editor@^2.2.1, launch-editor@^2.4.0: picocolors "^1.0.0" shell-quote "^1.6.1" -lazy-ass@1.6.0: +lazy-ass@1.6.0, lazy-ass@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== @@ -7836,7 +8085,7 @@ listr-verbose-renderer@^0.4.0: date-fns "^1.27.2" figures "^1.7.0" -listr2@^3.2.2: +listr2@^3.2.2, listr2@^3.8.3: version "3.14.0" resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== @@ -9274,6 +9523,11 @@ osenv@0: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +ospath@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" + integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -10074,7 +10328,7 @@ prepend-http@^1.0.0: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== -pretty-bytes@^5.1.0: +pretty-bytes@^5.1.0, pretty-bytes@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== @@ -10158,6 +10412,11 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +proxy-from-env@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -10589,7 +10848,7 @@ replace-homedir@^1.0.0: is-absolute "^1.0.0" remove-trailing-separator "^1.1.0" -request-progress@3.0.0: +request-progress@3.0.0, request-progress@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" integrity sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4= @@ -10796,7 +11055,7 @@ rimraf@2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3, rimraf@^2.7.1: dependencies: glob "^7.1.3" -rimraf@^3.0.2: +rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -10993,6 +11252,13 @@ semver@^7.2.1, semver@^7.3.5, semver@^7.3.6: dependencies: lru-cache "^6.0.0" +semver@^7.3.2: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -11354,7 +11620,7 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -sshpk@^1.7.0: +sshpk@^1.14.1, sshpk@^1.7.0: version "1.17.0" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== @@ -11691,6 +11957,13 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -11933,6 +12206,13 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" +tmp@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + to-absolute-glob@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" @@ -12277,6 +12557,11 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -12300,6 +12585,11 @@ untildify@3.0.3: resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9" integrity sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA== +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + unzipper@^0.10.11: version "0.10.11" resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.11.tgz#0b4991446472cbdb92ee7403909f26c2419c782e" @@ -13377,7 +13667,7 @@ yargs@^7.1.0: y18n "^3.2.1" yargs-parser "^5.0.1" -yauzl@2.10.0: +yauzl@2.10.0, yauzl@^2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=